package com.zy.asrs.task.handler; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; 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.*; @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; @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 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(); String batch = orderDetl.getBatch(); String csocode = orderDetl.getThreeCode(); String isocode = orderDetl.getDeadTime(); Double orderAnfme = orderDetl.getAnfme(); //List locNosSearch = locDetlService.selectLocNo(matnr); Set locNosSearch = locDetlService.selectLocNo(matnr, batch, csocode, isocode); //重新排序 并且检测该库位是否含没有料箱码的物料,如有有则不允许出库 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(); } } if(orderAnfme <= 0){ orderDetl.setQty(orderDetl.getAnfme() - orderAnfme); orderDetlService.updateById(orderDetl); break; } } } 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("保存工作档明细失败"); } }); } }