|  |  |  | 
|---|
|  |  |  | 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.stereotype.Service; | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.util.Date; | 
|---|
|  |  |  | import java.util.HashSet; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.Set; | 
|---|
|  |  |  | 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 | 
|---|
|  |  |  | 
|---|
|  |  |  | private WrkDetlService wrkDetlService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private OrderService orderService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private SnowflakeIdWorker snowflakeIdWorker; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Transactional | 
|---|
|  |  |  | 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.setSpecs(mat.getSpecs()); | 
|---|
|  |  |  | orderDetl.setAnfme(anfme); | 
|---|
|  |  |  | orderDetl.setQty(0.0); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | orderDetlService.insert(orderDetl); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return SUCCESS; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Transactional | 
|---|
|  |  |  | public ReturnT<String> start(Order order) { | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | 
|---|
|  |  |  | order.setSettle(2L); | 
|---|
|  |  |  | orderService.updateById(order); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return SUCCESS; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Set<String> pakoutLoc(Order order){ | 
|---|
|  |  |  | 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<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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String matnr = orderDetl.getMatnr(); | 
|---|
|  |  |  | String batch = orderDetl.getBatch(); | 
|---|
|  |  |  | String csocode = orderDetl.getThreeCode(); | 
|---|
|  |  |  | String isocode = orderDetl.getDeadTime(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Double orderAnfme = orderDetl.getAnfme(); | 
|---|
|  |  |  | double orderAnfme = orderDetl.getAnfme(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //List<String> locNosSearch = locDetlService.selectLocNo(matnr); | 
|---|
|  |  |  | Set<String> locNosSearch = locDetlService.selectLocNo(matnr, batch, csocode, isocode); | 
|---|
|  |  |  | Set<String> locNosSearch = locDetlService.selectLocNos(matnr); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for(String locNo : locNosSearch){ | 
|---|
|  |  |  | List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo); | 
|---|
|  |  |  | locNos.add(locNo); | 
|---|
|  |  |  | for (LocDetl locDetl :locDetls){ | 
|---|
|  |  |  | if(matnr.equals(locDetl.getMatnr())){ | 
|---|
|  |  |  | orderAnfme -= locDetl.getAnfme(); | 
|---|
|  |  |  | //过滤库位货物为高货物 | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(orderAnfme <= 0){ | 
|---|
|  |  |  | }).collect(Collectors.toSet()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //重新排序 | 
|---|
|  |  |  | Set<String> resort = resort(locNosSearch); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (String locNo : resort) { | 
|---|
|  |  |  | List<LocDetl> 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //        orderDetlList.forEach(orderDetl -> { | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //            if(orderDetl.getAnfme() - orderDetl.getQty() <= 0){ | 
|---|
|  |  |  | //                cont | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //            String matnr = orderDetl.getMatnr(); | 
|---|
|  |  |  | //            Double orderAnfme = orderDetl.getAnfme(); | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //            List<String> locNosSearch = locDetlService.selectLocNo(matnr); | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //            for(String locNo : locNosSearch){ | 
|---|
|  |  |  | //                List<LocDetl> 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 WrkMast createWrkMast(String locNo,String barCode,Date now){ | 
|---|
|  |  |  | //根据深浅库位进行重新排序 | 
|---|
|  |  |  | private Set<String> resort(Set<String> locNos) { | 
|---|
|  |  |  | Set<String> locNosResort = new LinkedHashSet<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (String locNoSearch : locNos) { | 
|---|
|  |  |  | LocMast locMast = locMastService.selectById(locNoSearch); | 
|---|
|  |  |  | if (!"F".equals(locMast.getLocSts())) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<String> 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.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()); | 
|---|