package com.zy.asrs.task.handler; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.SnowflakeIdWorker; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.service.*; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.utils.Utils; import com.zy.common.model.enums.WorkNoType; import com.zy.common.service.CommonService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; @Service public class AutoReplenishmentHandler extends AbstractHandler { @Autowired private OrderDetlService orderDetlService; @Autowired private LocDetlService locDetlService; @Autowired private LocMastService locMastService; @Autowired private CommonService commonService; @Autowired private WrkMastService wrkMastService; @Autowired private WrkDetlService wrkDetlService; @Autowired private OrderService orderService; @Autowired private SnowflakeIdWorker snowflakeIdWorker; @Transactional public ReturnT create(Mat mat, double anfme) { //创建一个新的自动补货单据 Order order = createOrder(); orderService.insert(order); OrderDetl orderDetl = createOrderDetl(order); orderDetl.setMatnr(mat.getMatnr()); orderDetl.setMaktx(mat.getMaktx()); orderDetl.setSpecs(mat.getSpecs()); orderDetl.setAnfme(anfme); orderDetl.setQty(0.0); orderDetlService.insert(orderDetl); return SUCCESS; } @Transactional public ReturnT start(Order order) { Date now = new Date(); Set locNos = pakoutLoc(order); for (String locNo : locNos){ LocMast locMast = locMastService.selectByLoc(locNo); if(!"F".equals(locMast.getLocSts())){ throw new CoolException("库位状态已变更"); } //生成工作档 WrkMast wrkMast = createWrkMast(locNo,locMast.getBarcode(),now); //生成工作档明细 List locDetls = locDetlService.selectByLocNo(locNo); createWrkDetl(locDetls, wrkMast,order.getOrderNo(),now); //修改库位状态 locMast.setLocSts("R"); locMastService.updateByLocNo(locMast); } order.setSettle(2L); orderService.updateById(order); return SUCCESS; } private Order createOrder(){ Date now = new Date(); return new Order( String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空] "AUTO" + snowflakeIdWorker.nextId(), // 订单编号 DateUtils.convert(now), // 单据日期 21L, // 单据类型 21.自动补货单 null, // 项目编号 null, // null, // 调拨项目编号 null, // 初始票据号 null, // 票据号 null, // 客户编号 null, // 客户 null, // 联系方式 null, // 操作人员 null, // 合计金额 null, // 优惠率 null, // 优惠金额 null, // 销售或采购费用合计 null, // 实付金额 null, // 付款类型 null, // 业务员 null, // 结算天数 null, // 邮费支付类型 null, // 邮费 null, // 付款时间 null, // 发货时间 null, // 物流名称 null, // 物流单号 1L, // 订单状态 1, // 状态 9999L, // 添加人员 now, // 添加时间 9999L, // 修改人员 now, // 修改时间 null // 备注 ); } private OrderDetl createOrderDetl(Order order){ Date now = new Date(); OrderDetl orderDetl = new OrderDetl(); orderDetl.setOrderId(order.getId()); orderDetl.setOrderNo(order.getOrderNo()); orderDetl.setCreateBy(order.getCreateBy()); orderDetl.setCreateTime(now); orderDetl.setUpdateBy(order.getCreateBy()); orderDetl.setUpdateTime(now); orderDetl.setStatus(1); orderDetl.setQty(0.0D); return orderDetl; } private Set pakoutLoc(Order order){ //需要出库的库位 Set locNos = new HashSet<>(); //根据订单生成四项库出库工作档 List orderDetlList = orderDetlService.selectList(new EntityWrapper().eq("order_no", order.getOrderNo())); for(OrderDetl orderDetl : orderDetlList){ if(orderDetl.getAnfme() - orderDetl.getQty() <= 0){ continue; } String matnr = orderDetl.getMatnr(); double orderAnfme = orderDetl.getAnfme(); //List locNosSearch = locDetlService.selectLocNo(matnr); Set locNosSearch = locDetlService.selectLocNos(matnr); //过滤库位货物为高货物 locNosSearch = locNosSearch.stream().filter(locNo -> { LocMast locMast = locMastService.selectByLoc(locNo); if(locMast.getLocType1() == 3){ return false; }else { //且检测该库位是否含没有货架码的物料,如有有则不允许出库 // LocDetl locDetl = locDetlService.selectOne(new EntityWrapper().eq("loc_no", locNo) // .andNew().eq("supp_code", "").or().isNull("supp_code")); if(Cools.isEmpty(locDetlService.selectByLocWithoutContainer(locNo))){ return true; }else { return false; } } }).collect(Collectors.toSet()); //重新排序 Set resort = resort(locNosSearch); for(String locNo : resort){ List locDetls = locDetlService.selectByLocNo(locNo); locNos.add(locNo); for (LocDetl locDetl :locDetls){ if(matnr.equals(locDetl.getMatnr())){ orderAnfme -= locDetl.getAnfme(); }else { OrderDetl odNew = createOrderDetl(order); odNew.setMatnr(locDetl.getMatnr()); odNew.setMaktx(locDetl.getMaktx()); odNew.setBatch(locDetl.getBatch()); odNew.setThreeCode(locDetl.getThreeCode()); odNew.setDeadTime(locDetl.getDeadTime()); odNew.setSpecs(locDetl.getSpecs()); odNew.setAnfme(0.0); odNew.setQty(locDetl.getAnfme()); orderDetlService.insert(odNew); } } if(orderAnfme <= 0){ orderDetl.setQty(orderDetl.getAnfme() - orderAnfme); orderDetlService.updateById(orderDetl); break; } } if(orderAnfme > 0){ orderDetl.setAnfme(orderDetl.getAnfme() - orderAnfme); orderDetl.setQty(orderDetl.getAnfme()); orderDetlService.updateById(orderDetl); } } return locNos; } //根据深浅库位进行重新排序 private Set resort(Set locNos){ Set locNosResort = new LinkedHashSet<>(); for(String locNoSearch : locNos){ LocMast locMast = locMastService.selectById(locNoSearch); if(!"F".equals(locMast.getLocSts())){ continue; } List groupOuterLoc = Utils.getGroupOuterLoc(locNoSearch); if(Cools.isEmpty(groupOuterLoc)){ locNosResort.add(locNoSearch); }else { groupOuterLoc.add(locNoSearch); //如果是深库位,则先找外侧的库位 for (String locNoOut : groupOuterLoc){ LocMast locMastOuter = locMastService.selectById(locNoOut); //外侧如果是拣料,则内测不允许出 if("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())){ break; } if(!"F".equals(locMastOuter.getLocSts())){ continue; } locNosResort.add(locNoOut); } } } return locNosResort; } private WrkMast createWrkMast(String locNo,String barCode,Date now){ int ioType = 101; int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(21L); // 工作状态:21.生成出库任务 wrkMast.setIoType(ioType); // 入出库状态 wrkMast.setIoPri(300D); // 优先级:13 //wrkMast.setOutMost(outMost?1:0);; //wrkMast.setCrnNo(outMost?outCrnNo:locMast.getCrnNo()); //wrkMast.setSourceStaNo(loc); // 源站 wrkMast.setStaNo(300); // 目标站 wrkMast.setSourceLocNo(locNo); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("N"); wrkMast.setBarcode(barCode); //wrkMast.setAppeUser(userId); // 操作人员数据 wrkMast.setAppeTime(now); //wrkMast.setModiUser(userId); wrkMast.setModiTime(now); //补货标识 wrkMast.setMk("Y"); if (!wrkMastService.insert(wrkMast)) { throw new CoolException("保存工作档失败,出库库位号:"+locNo); } return wrkMast; } private void createWrkDetl(List locDetls, WrkMast wrkMast,String orderNo, Date now){ locDetls.forEach(locDetl -> { WrkDetl wrkDetl = new WrkDetl(); BeanUtils.copyProperties(locDetl,wrkDetl); wrkDetl.setZpallet(wrkMast.getBarcode()); wrkDetl.setIoTime(now); wrkDetl.setWrkNo(wrkMast.getWrkNo()); //wrkDetl.setBatch(locDetl.getBatch()); wrkDetl.setOrderNo(orderNo); //wrkDetl.setAnfme(locDetl.getAnfme()); // 数量 wrkDetl.setAppeTime(now); //wrkDetl.setAppeUser(userId); wrkDetl.setModiTime(now); //wrkDetl.setSuppCode(locDetl.getSuppCode()); //wrkDetl.setModiUser(userId); if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("保存工作档明细失败"); } }); } }