自动化立体仓库 - WMS系统
lty
3 天以前 419c6a9b87b37be567a581d6a80d7e3f505d84e9
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -43,6 +43,19 @@
    // 库位排号分配默认类别
    private static final int DEFAULT_ROW_NO_TYPE = 1;
    // 堆垛机映射一楼的入库出库站点
    private static final Map<Integer,List<Integer>> crnMapNo;
    static {
        crnMapNo = new HashMap<>();
        crnMapNo.put(1,new ArrayList<Integer>(){{add(3001);add(3002);}});
        crnMapNo.put(2,new ArrayList<Integer>(){{add(3004);add(3003);}});
        crnMapNo.put(3,new ArrayList<Integer>(){{add(3005);add(3006);}});
        crnMapNo.put(4,new ArrayList<Integer>(){{add(3007);add(3008);}});
        crnMapNo.put(5,new ArrayList<Integer>(){{add(3010);add(3009);}});
        crnMapNo.put(6,new ArrayList<Integer>(){{add(3011);add(3012);}});
    }
    @Autowired
    private MatService matService;
    @Autowired
@@ -170,11 +183,22 @@
        // 获取库位明细
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
            LocDetl one = new LocDetl();
//            if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
                LocDetl one = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",paramLocDetl.getLocNo())
                one = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",paramLocDetl.getLocNo())
                        .eq("brand",paramLocDetl.getBrand()).eq("model",paramLocDetl.getModel()));
//                        selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount(), param.getOrderNo()));
            if(paramLocDetl.getMatnr().equals("空箱")){
                one= locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",paramLocDetl.getLocNo()));
            }
                if (null != one && !paramLocDetl.getMatnr().equals("空箱")) {
                    if(!"合格".equals(one.getThreeCode())) {
                        throw new CoolException(one.getModel() + "卷不合格:" + one.getThreeCode() );
                    }
                    locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount(), param.getOrderNo()));
                }else{
                    locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount(), param.getOrderNo()));
                }
//            }
        }
        if (!locDetlDtos.isEmpty()) {
@@ -367,7 +391,16 @@
            for (LocDetlDto detlDto : dto.getLocDetlDtos()) {
                if (detlDto.getCount()==null || detlDto.getCount() <= 0.0D) {continue;}
                WrkDetl wrkDetl = new WrkDetl();
                List<OrderDetl> orderDetl = orderDetlService.selectByBrand(detlDto.getLocDetl().getBrand());
                wrkDetl.sync(detlDto.getLocDetl());
                for (OrderDetl orderDetlDto : orderDetl) {
                    if(orderDetlDto.getSupp() != null){
                        wrkDetl.setSupp(orderDetlDto.getSupp());
                    }
                    if(orderDetlDto.getMemo() != null){
                        wrkDetl.setMemo(orderDetlDto.getMemo());
                    }
                }
                wrkDetl.setOrderNo(detlDto.getOrderNo()); // 手动出库不需要带出库存中的单据编号
                wrkDetl.setWrkNo(workNo);
                wrkDetl.setIoTime(now);
@@ -727,10 +760,9 @@
        // 获取库位明细
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
            if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount(),param.getOrderNo()));
            }
            LocDetl one = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",paramLocDetl.getLocNo())
                    .eq("brand",paramLocDetl.getBrand()).eq("model",paramLocDetl.getModel()));
            if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount(), param.getOrderNo()));
        }
        if (!locDetlDtos.isEmpty()) {
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo()));
@@ -831,22 +863,105 @@
    @Override
    @Transactional
    public void autoLocMove(String orderNo,String sourceLocNo, String locNo, Long userId) {
        LocMast sourceLoc = locMastService.selectById(sourceLocNo);
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", sourceLocNo));
        if (Cools.isEmpty(sourceLoc)){
            throw new CoolException("未找到库位");
        }
        LocMast loc = locMastService.selectById(locNo);
        if (Cools.isEmpty(loc)){
            throw new CoolException("未找到库位");
        }
        Date now = new Date();
        // 获取工作号
        int workNo = commonService.getWorkNo(WorkNoType.PICK.type);
        // 保存工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
        wrkMast.setIoType(12); // 入出库状态: 11.库格移载
        wrkMast.setIoPri(10D);
        wrkMast.setCrnNo(sourceLoc.getCrnNo());
        wrkMast.setSourceLocNo(sourceLocNo); // 源库位
        wrkMast.setLocNo(locNo); // 目标库位
        wrkMast.setSourceStaNo(crnMapNo.get(sourceLoc.getCrnNo()).get(1)); // 出库源站点
        wrkMast.setStaNo(crnMapNo.get(loc.getCrnNo()).get(0)); // 入库目标站点
        wrkMast.setFullPlt(Cools.isEmpty(locDetls)?"N":"Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk(sourceLoc.getLocSts().equals("D")?"Y":"N"); // 空板
        wrkMast.setBarcode(sourceLoc.getBarcode()); // 托盘码
        wrkMast.setLinkMis("N");
        wrkMast.setAppeUser(userId);
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
        }
        // 工作档明细保存
        for (LocDetl locDetl : locDetls) {
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(locDetl);
            wrkDetl.setOrderNo(orderNo);
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setIoTime(now);
            wrkDetl.setAnfme(locDetl.getAnfme());
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(userId);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
        }
        // 修改源库位状态
        if (sourceLoc.getLocSts().equals("D") || sourceLoc.getLocSts().equals("F")) {
            sourceLoc.setLocSts("R"); // R.出库预约
            sourceLoc.setModiUser(userId);
            sourceLoc.setModiTime(now);
            if (!locMastService.updateById(sourceLoc)){
                throw new CoolException("更新源库位状态失败");
            }
        } else {
            throw new CoolException("源库位出库失败,状态:"+sourceLoc.getLocSts$());
        }
        // 修改目标库位状态
        if (loc.getLocSts().equals("O")) {
            loc.setLocSts("S"); // S.入库预约
            loc.setModiTime(now);
            loc.setModiUser(userId);
            if (!locMastService.updateById(loc)) {
                throw new CoolException("更新目标库位状态失败");
            }
        } else {
            throw new CoolException("移转失败,目标库位状态:"+loc.getLocSts$());
        }
    }
    @Override
    @Transactional
    public void completeWrkMast(String workNo, Long userId) {
        WrkMast wrkMast = wrkMastService.selectById(workNo);
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException(workNo+"工作档不存在");
        }
        if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 14) {
        if (wrkMast.getWrkSts() == 5 || wrkMast.getWrkSts() == 14 || wrkMast.getWrkSts() == 15) {
            throw new CoolException("当前工作档已完成");
        }
        // 入库 + 库位转移
        if (wrkMast.getWrkSts() < 4 || (wrkMast.getWrkSts() > 10 && wrkMast.getIoType()==11)) {
        if (wrkMast.getIoType() < 60) {
            wrkMast.setWrkSts(4L);
        // 出库
        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getIoType()!=202) {
        } else if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 103 && wrkMast.getIoType() != 107 && wrkMast.getIoType() != 109) {
            wrkMast.setWrkSts(14L);
        }else if (wrkMast.getIoType()==202){
            wrkMast.setWrkSts(57L);
        }else{
            throw new CoolException("当前工作类型或状态无法完成");
        }
        Date now = new Date();
        wrkMast.setCrnStrTime(DateUtils.calculate(now, 1L, TimeUnit.SECONDS, true));
@@ -993,7 +1108,7 @@
        String locNo = ""; // 待修改目标库位
        String locSts = ""; // 待修改目标库位状态
        // 入库取消(修改目标库位)
        if (wrkMast.getWrkSts() < 4) {
        if (wrkMast.getWrkSts() == 1) {
            locNo = wrkMast.getLocNo();
            locSts = "O";
@@ -1010,7 +1125,7 @@
                locMastService.updateById(locMast);
            }
        // 出库取消(修改源库位)
        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 14 && wrkMast.getIoType()!=202) {
        } else if (wrkMast.getWrkSts() == 11) {
            locNo = wrkMast.getSourceLocNo();
            // 出库 ===>> F.在库
            if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 110) {
@@ -1019,7 +1134,7 @@
            } else if (wrkMast.getIoType() == 110) {
                locSts = "D";
            // 库位转移 ===>> D.空桶/空栈板
            } else if (wrkMast.getIoType() == 11) {
            } else if (wrkMast.getIoType() == 11 || wrkMast.getIoType() == 12) {
                locSts = wrkMast.getFullPlt().equalsIgnoreCase("N")?"D":"F";
                // 库位转移:目标库位
                LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
@@ -1031,8 +1146,7 @@
                locMast.setModiUser(userId);
                locMastService.updateById(locMast);
            }
        } else if (wrkMast.getIoType()==202 || wrkMast.getIoType()==212){
        } else {
        }else {
            throw new CoolException("当前工作状态无法取消");
        }
@@ -1052,6 +1166,38 @@
            }
        }
        // 取消跨巷道移库任务时,回滚在执行的任务
        if (wrkMast.getIoType() == 12) {
            List<Order> orderList = orderMapper.selectList(new EntityWrapper<Order>().eq("doc_type", 24).lt("settle", 3));
            if (orderList.size() == 1) {
                Order order = orderList.get(0);
                // 回滚单据明细的移库状态
                List<OrderDetl> orderDetlList1 = orderDetlMapper.selectList(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo()).eq("specs", wrkMast.getSourceLocNo()));
                for (OrderDetl orderDetl:orderDetlList1) {
                    if (orderDetl.getBeBatch() != null) {
                        orderDetl.setModel("");
                    }
                    orderDetl.setUpdateTime(now);
                    orderDetl.setDanger(0);
                    orderDetlMapper.updateById(orderDetl);
                }
                // 回滚单据状态,有大于0的订单明细则是作业中,没有则更新为待处理
                Integer count = orderDetlMapper.selectCount(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo()).gt("danger", 0));
                if (count == 0) {
                    order.setSettle(1L);
                    orderMapper.updateById(order);
                }
            } else {
                log.error("回滚移库单据异常,无源库位数据:{}",wrkMast.getSourceLocNo());
            }
        }
//        // 取消空闲理货任务时,回滚成未理货
//        if (wrkMast.getIoType() == 109) {
//            // 更新库存明细为理货中
//            locDetlMapper.updateLhStsByLocNo(wrkMast.getSourceLocNo(),0);
//        }
        //取消出库工作档时,查询单据管理表,回滚作业中数量
        if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107) {
            List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());