|  |  |  | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | import java.util.stream.Collectors; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Service | 
|---|
|  |  |  | public class AutoReplenishmentHandler extends AbstractHandler<String> { | 
|---|
|  |  |  | 
|---|
|  |  |  | private LocDetlService locDetlService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private LocMastService locMastService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private AgvLocMastService agvLocMastService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private CommonService commonService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | 
|---|
|  |  |  | public ReturnT<String> create(Mat mat, double anfme) { | 
|---|
|  |  |  | //创建一个新的自动补货单据 | 
|---|
|  |  |  | Order order = createOrder(); | 
|---|
|  |  |  | orderService.insert(order); | 
|---|
|  |  |  | OrderDetl orderDetl = createOrderDetl(order); | 
|---|
|  |  |  | orderDetl.setMatnr(mat.getMatnr()); | 
|---|
|  |  |  | orderDetl.setMaktx(mat.getMaktx()); | 
|---|
|  |  |  | 
|---|
|  |  |  | orderDetl.setAnfme(anfme); | 
|---|
|  |  |  | orderDetl.setQty(0.0); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | orderService.insert(order); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | orderDetlService.insert(orderDetl); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return SUCCESS; | 
|---|
|  |  |  | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Set<String> locNos = pakoutLoc(order); | 
|---|
|  |  |  | for (String locNo : locNos){ | 
|---|
|  |  |  | for (String locNo : locNos) { | 
|---|
|  |  |  | LocMast locMast = locMastService.selectByLoc(locNo); | 
|---|
|  |  |  | if(!"F".equals(locMast.getLocSts())){ | 
|---|
|  |  |  | if (!"F".equals(locMast.getLocSts())) { | 
|---|
|  |  |  | throw new CoolException("库位状态已变更"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //生成工作档 | 
|---|
|  |  |  | WrkMast wrkMast = createWrkMast(locNo,locMast.getBarcode(),now); | 
|---|
|  |  |  | WrkMast wrkMast = createWrkMast(locNo, locMast.getBarcode(), now); | 
|---|
|  |  |  | //生成工作档明细 | 
|---|
|  |  |  | List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo); | 
|---|
|  |  |  | createWrkDetl(locDetls, wrkMast,order.getOrderNo(),now); | 
|---|
|  |  |  | createWrkDetl(locDetls, wrkMast, order.getOrderNo(), now); | 
|---|
|  |  |  | //修改库位状态 | 
|---|
|  |  |  | locMast.setLocSts("R"); | 
|---|
|  |  |  | locMastService.updateByLocNo(locMast); | 
|---|
|  |  |  | 
|---|
|  |  |  | return SUCCESS; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Order createOrder(){ | 
|---|
|  |  |  | private Order createOrder() { | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | return new Order( | 
|---|
|  |  |  | String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空] | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private OrderDetl createOrderDetl(Order order){ | 
|---|
|  |  |  | private OrderDetl createOrderDetl(Order order) { | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | OrderDetl orderDetl = new OrderDetl(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | return orderDetl; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Set<String> pakoutLoc(Order order){ | 
|---|
|  |  |  | private Set<String> pakoutLoc(Order order) { | 
|---|
|  |  |  | //需要出库的库位 | 
|---|
|  |  |  | Set<String> locNos = new HashSet<>(); | 
|---|
|  |  |  | //根据订单生成四项库出库工作档 | 
|---|
|  |  |  | List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo())); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for(OrderDetl orderDetl : orderDetlList){ | 
|---|
|  |  |  | if(orderDetl.getAnfme() - orderDetl.getQty() <= 0){ | 
|---|
|  |  |  | for (OrderDetl orderDetl : orderDetlList) { | 
|---|
|  |  |  | if (orderDetl.getAnfme() - orderDetl.getQty() <= 0) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | //List<String> locNosSearch = locDetlService.selectLocNo(matnr); | 
|---|
|  |  |  | Set<String> 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<LocDetl>().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<String> resort = resort(locNosSearch); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for(String locNo : resort){ | 
|---|
|  |  |  | for (String locNo : resort) { | 
|---|
|  |  |  | List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo); | 
|---|
|  |  |  | locNos.add(locNo); | 
|---|
|  |  |  | for (LocDetl locDetl :locDetls){ | 
|---|
|  |  |  | if(matnr.equals(locDetl.getMatnr())){ | 
|---|
|  |  |  | for (LocDetl locDetl : locDetls) { | 
|---|
|  |  |  | if (matnr.equals(locDetl.getMatnr())) { | 
|---|
|  |  |  | orderAnfme -= locDetl.getAnfme(); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | OrderDetl odNew = createOrderDetl(order); | 
|---|
|  |  |  | odNew.setMatnr(locDetl.getMatnr()); | 
|---|
|  |  |  | odNew.setMaktx(locDetl.getMaktx()); | 
|---|
|  |  |  | 
|---|
|  |  |  | orderDetlService.insert(odNew); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(orderAnfme <= 0){ | 
|---|
|  |  |  | if (orderAnfme <= 0) { | 
|---|
|  |  |  | orderDetl.setQty(orderDetl.getAnfme() - orderAnfme); | 
|---|
|  |  |  | orderDetlService.updateById(orderDetl); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(orderAnfme > 0){ | 
|---|
|  |  |  | if (orderAnfme > 0) { | 
|---|
|  |  |  | orderDetl.setAnfme(orderDetl.getAnfme() - orderAnfme); | 
|---|
|  |  |  | orderDetl.setQty(orderDetl.getAnfme()); | 
|---|
|  |  |  | orderDetlService.updateById(orderDetl); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //根据深浅库位进行重新排序 | 
|---|
|  |  |  | private Set<String> resort(Set<String> locNos){ | 
|---|
|  |  |  | private Set<String> resort(Set<String> locNos) { | 
|---|
|  |  |  | Set<String> locNosResort = new LinkedHashSet<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for(String locNoSearch : locNos){ | 
|---|
|  |  |  | for (String locNoSearch : locNos) { | 
|---|
|  |  |  | LocMast locMast = locMastService.selectById(locNoSearch); | 
|---|
|  |  |  | if(!"F".equals(locMast.getLocSts())){ | 
|---|
|  |  |  | if (!"F".equals(locMast.getLocSts())) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNoSearch); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(Cools.isEmpty(groupOuterLoc)){ | 
|---|
|  |  |  | if (Cools.isEmpty(groupOuterLoc)) { | 
|---|
|  |  |  | locNosResort.add(locNoSearch); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | groupOuterLoc.add(locNoSearch); | 
|---|
|  |  |  | //如果是深库位,则先找外侧的库位 | 
|---|
|  |  |  | for (String locNoOut : groupOuterLoc){ | 
|---|
|  |  |  | for (String locNoOut : groupOuterLoc) { | 
|---|
|  |  |  | LocMast locMastOuter = locMastService.selectById(locNoOut); | 
|---|
|  |  |  | //外侧如果是拣料,则内测不允许出 | 
|---|
|  |  |  | if("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())){ | 
|---|
|  |  |  | if ("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(!"F".equals(locMastOuter.getLocSts())){ | 
|---|
|  |  |  | if (!"F".equals(locMastOuter.getLocSts())) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | locNosResort.add(locNoOut); | 
|---|
|  |  |  | 
|---|
|  |  |  | return locNosResort; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private WrkMast createWrkMast(String locNo,String barCode,Date now){ | 
|---|
|  |  |  | private WrkMast createWrkMast(String locNo, String barCode, Date now) { | 
|---|
|  |  |  | int ioType = 101; | 
|---|
|  |  |  | int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); | 
|---|
|  |  |  | WrkMast wrkMast = new WrkMast(); | 
|---|
|  |  |  | 
|---|
|  |  |  | wrkMast.setAppeTime(now); | 
|---|
|  |  |  | //wrkMast.setModiUser(userId); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer pltType = null; | 
|---|
|  |  |  | if (!Cools.isEmpty(locNo) && Cools.isEmpty(pltType)) { | 
|---|
|  |  |  | AgvLocMast agvLocMast = agvLocMastService.selectById(locNo); | 
|---|
|  |  |  | if (agvLocMast != null) { | 
|---|
|  |  |  | pltType = agvLocMast.getPltType(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | wrkMast.setPltType(pltType); | 
|---|
|  |  |  | //补货标识 | 
|---|
|  |  |  | wrkMast.setMk("Y"); | 
|---|
|  |  |  | if (!wrkMastService.insert(wrkMast)) { | 
|---|
|  |  |  | throw new CoolException("保存工作档失败,出库库位号:"+locNo); | 
|---|
|  |  |  | throw new CoolException("保存工作档失败,出库库位号:" + locNo); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return wrkMast; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void createWrkDetl(List<LocDetl> locDetls, WrkMast wrkMast,String orderNo, Date now){ | 
|---|
|  |  |  | private void createWrkDetl(List<LocDetl> locDetls, WrkMast wrkMast, String orderNo, Date now) { | 
|---|
|  |  |  | locDetls.forEach(locDetl -> { | 
|---|
|  |  |  | WrkDetl wrkDetl = new WrkDetl(); | 
|---|
|  |  |  | BeanUtils.copyProperties(locDetl,wrkDetl); | 
|---|
|  |  |  | BeanUtils.copyProperties(locDetl, wrkDetl); | 
|---|
|  |  |  | wrkDetl.setZpallet(wrkMast.getBarcode()); | 
|---|
|  |  |  | wrkDetl.setIoTime(now); | 
|---|
|  |  |  | wrkDetl.setWrkNo(wrkMast.getWrkNo()); | 
|---|