自动化立体仓库 - WMS系统
whycq
2024-05-27 1efaa37727a8d70a6bc0b0f70532649c16bfab35
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -79,7 +79,7 @@
        agvBasDevpList.forEach(agvBasDevp -> {
            if(Cools.isEmpty(agvBasDevp.getBarcode())){
                throw new CoolException("选中的站点中含有未绑定托盘的站点,请重新选择");
                throw new CoolException("选中的站点中含有未绑定货架的站点,请重新选择");
            }
            if(!"F".equals(agvBasDevp.getLocSts())){
@@ -89,7 +89,7 @@
            List<AgvWaitPakin> agvWaitPakinList = agvWaitPakinService.selectList(new EntityWrapper<AgvWaitPakin>().eq("supp_code", agvBasDevp.getBarcode()));
            //检索库位,选择合适的库位
            AgvLocMast agvLocMast = agvCommonService.getLocNo(agvBasDevp.getLocType1());
            AgvLocMast agvLocMast = agvCommonService.getLocNo(agvBasDevp.getLocType1(),agvBasDevp.getFloor());
            //生成工作档
            AgvWrkMast wrkMast = createWrkMast(1,201L,agvBasDevp.getDevNo(),agvLocMast.getLocNo(),agvBasDevp.getBarcode(),now,userId, agvBasDevp.getLocType2());
            //标记是否为输送线入库
@@ -134,7 +134,7 @@
            //判断是否全板出库
            int ioType = isPakOut(sourceLocNo,taskDto) ?  101 : 103;
            //生成工作档
            AgvWrkMast wrkMast = createWrkMast(ioType,wrkSts,sourceLocNo,targetLocNo,containerCode,now,userId,0);
            AgvWrkMast wrkMast = createWrkMast(ioType,wrkSts,sourceLocNo,targetLocNo,containerCode,now,userId,Short.valueOf(containerCode.substring(0,2)));
            //生成工作档明细
            taskDto.getLocDtos().forEach(locDto -> {
                if (!BaseController.isJSON(locDto.getOrderNo())) {
@@ -316,38 +316,49 @@
    入库
     */
    @Transactional
    public String emptyPlateIn(String station,String containerCode,Short containerType, Long userId) {
    public String emptyPlateIn(String station,String containerCode,Short containerType, Long userId, boolean emptyAutoIn) {
        Date now = new Date();
        // 源站点状态检测
        //AgvBasDevp agvBasDevp = agvBasDevpService.selectByDevNo(station);
        Short locType = 0;
        AgvBasDevp agvBasDevp = agvBasDevpService.selectById(station);
        if (Cools.isEmpty(agvBasDevp)) {
            throw new CoolException("暂无"+ station + "站点");
        }
        if (containerType == 40) {
            locType = 5;
        } else if (containerType == 21 && agvBasDevp.getFloor() == 3) {
            locType = 4;
        } else if (containerType == 20 && agvBasDevp.getFloor() == 3) {
            locType = 2;
        } else {
            locType = agvBasDevp.getLocType1();
        }
        //初始定义为空板入库类型
        int ioType = 10;
//        if(Cools.isEmpty(agvBasDevp.getBarcode())){
//            agvBasDevp.setBarcode(containerCode);
//        }
        if(!Cools.eq(agvBasDevp.getBarcode(),containerCode) && !agvBasDevp.getLocSts().equals("O")){
            throw new CoolException("当前工作位状态为" + agvBasDevp.getLocSts()+",无法进行空板入库");
        if(!Cools.eq(agvBasDevp.getBarcode(),containerCode) && !agvBasDevp.getLocSts().equals("O") && !emptyAutoIn){
            throw new CoolException("当前工作位状态为" + agvBasDevp.getLocSts()+",无法进行入库");
        }
        //查询工作档
        AgvWrkMast agvWrkMast = agvWrkMastService.selectByContainerCode(containerCode);
        if(!Cools.isEmpty(agvWrkMast)){
            throw new CoolException("当前容器已有入库任务,无法进行入库");
        if(!Cools.isEmpty(agvWrkMast) && !emptyAutoIn){
            throw new CoolException("当前货架已有入库任务,无法进行入库");
        }
        //检索库位,选择合适的库位
        AgvLocMast agvLocMast = agvLocMast = agvCommonService.getLocNo(agvBasDevp.getLocType1());
        AgvLocMast agvLocMast = agvCommonService.getLocNo(locType,agvBasDevp.getFloor());
        //查询入库通知档
        List<AgvWaitPakin> agvWaitPakinList = agvWaitPakinService.selectByContainerCode(containerCode);
        if(!Cools.isEmpty(agvWaitPakinList)){
            String devNo = agvBasDevp.getDevNo();
            String locNo = agvLocMast.getLocNo();
            //生成工作档
            AgvWrkMast wrkMast = createWrkMast(1,201L,agvBasDevp.getDevNo(),agvLocMast.getLocNo(),containerCode,now,userId, agvBasDevp.getLocType2());
            AgvWrkMast wrkMast = createWrkMast(1,201L,devNo,locNo,containerCode,now,userId, containerType);
            //生成工作档明细
            agvWaitPakinList.forEach(wp -> {
                createWrkDetlReWrite(wp.getMatnr(),wrkMast.getWrkNo(),wp.getOrderNo(),wp.getBatch(),wp.getAnfme(),wp.getSuppCode(),now,userId,wp.getThreeCode(),wp.getDeadTime());
@@ -355,12 +366,12 @@
            //修改入库通知档状态
            agvWaitPakinService.updateIoStatus(containerCode,"Y");
            //更新源站点状态
            updateAgvBasDevp(agvBasDevp,"R");
            updateAgvBasDevp(agvBasDevp,"R",containerType);
        }else {
            // 生成工作档 10.空板入库
            createWrkMast(10,201L,agvBasDevp.getDevNo(),agvLocMast.getLocNo(),containerCode,now,userId,containerType);
            //更新源站点状态
            updateAgvBasDevp(agvBasDevp,"R",containerType);
            updateAgvBasDevp(agvBasDevp,"R",containerType,containerCode);
        }
        //更新目标库位状态和信息
@@ -381,10 +392,16 @@
            throw new CoolException("当前工作位状态为" + agvBasDevp.getLocSts()+",无法进行空板出库");
        }
        //寻找相应类型的空托盘
        AgvLocMast agvLocMast = agvLocMastService.selectEmptyZpallet(containerType);
        //寻找相应类型的空货架
        AgvLocMast agvLocMast = agvLocMastService.selectEmptyZpallet(containerType,agvBasDevp.getFloor());
        if(containerType == 0){
            //空板自动出库,根据站点类型选择
            agvLocMastService.selectEmptyZpalletByLocType1(agvBasDevp.getLocType1());
        }
        if (Cools.isEmpty(agvLocMast)) {
            throw new CoolException("暂无当前出库站点类型的空托盘!");
            throw new CoolException("暂无当前出库站点类型的空货架!");
        }
        //生成工作档
        createWrkMast(110,21L,agvLocMast.getLocNo(),agvBasDevp.getDevNo(),agvLocMast.getBarcode(),now,userId,containerType);
@@ -393,7 +410,7 @@
        updateAgvLocMast(agvLocMast,"R");
        //修改站点状态
        updateAgvBasDevp(agvBasDevp,"S");
        updateAgvBasDevp(agvBasDevp,"S",(short)containerType,agvLocMast.getBarcode());
    }
@@ -489,6 +506,7 @@
            locDetl.setModiTime(now);
            locDetl.setAppeUser(userId);
            locDetl.setAppeTime(now);
            locDetl.setOrderNo(adjust.getOrderNo());
            locDetl.setThreeCode(adjust.getThreeCode());
            locDetl.setDeadTime(adjust.getDeadTime());
            locDetl.setSuppCode(adjust.getSuppCode());
@@ -539,16 +557,20 @@
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException(workNo+"工作档不存在");
        }
        if(!wrkMast.getLocNo().contains("@") || !wrkMast.getSourceLocNo().contains("@")){
            throw new CoolException("目标库位或者源库位暂未分配,无法取消");
        }
//        if(!wrkMast.getLocNo().contains("@") || !wrkMast.getSourceLocNo().contains("@")){
//            throw new CoolException("目标库位或者源库位暂未分配,无法取消");
//        }
        //修改AGV工作档的工作状态为205.工作完成
        agvWrkMastService.updateWrkStsByWrkNo(wrkMast.getWrkNo(),205);
        //出库任务 101.出库 || 103.拣料出库 || 107.盘点出库
        if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107){
        if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107 || wrkMast.getIoType() == 111){
            //修改出库站点状态
            agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getLocNo(),"F",wrkMast.getBarcode(),wrkMast.getWhsType().shortValue());
        }
        if(wrkMast.getIoType() == 1 || wrkMast.getIoType() == 53 ){
            //修改出库站点状态
            agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getSourceLocNo(),"O","",wrkMast.getWhsType().shortValue());
        }
        //出库任务 110.空板出库
        if(wrkMast.getIoType() == 110){
@@ -558,7 +580,7 @@
    }
    @Transactional
    public void cancelWrkMast(String workNo, Long userId) {
    public void cancelWrkMast(String workNo, Long userId,Integer type) {
        AgvWrkMast wrkMast = agvWrkMastService.selectById(workNo);
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException(workNo+"工作档不存在");
@@ -569,7 +591,7 @@
        }
        //入库取消
        if(wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10){
        if(wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10 || wrkMast.getIoType() == 58){
            //源站点
            String devNo = wrkMast.getSourceLocNo();
            //目标库位
@@ -577,43 +599,81 @@
            agvLocMastService.updateLocStsByLocNo(locNo,"O","",null);
            agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"F",wrkMast.getBarcode(),wrkMast.getWhsType().shortValue());
            // 移库取消
        } else if( wrkMast.getIoType() == 11 || wrkMast.getIoType() == 12) {
            //源库位
            String locNo = wrkMast.getSourceLocNo();
            // 目标库位
            String targetLocNo = wrkMast.getLocNo();
            agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode(),(short)getContainerTypeByloc(locNo));
            agvLocMastService.updateLocStsByLocNo(targetLocNo,"O","",null);
            // 自动调拨出库取消
        } else if(wrkMast.getIoType() == 108 || wrkMast.getIoType() == 111) {
            // 源库位
            String locNo = wrkMast.getSourceLocNo();
            // 目标库位
            String targetLocNo = wrkMast.getLocNo();
            agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode(),(short)getContainerTypeByloc(locNo),"",(short)0);
            if (wrkMast.getIoType() == 108) {
                if (wrkMast.getWrkSts() != 22) {
                    agvLocMastService.updateLocStsByLocNo(targetLocNo,"O","",null);
                }
            } else {
                if (wrkMast.getWrkSts() != 22) {
                    agvBasDevpService.updateLocStsAndBarcodeByDevNo(targetLocNo,"O","",wrkMast.getWhsType().shortValue());
                }
            }
            List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", locNo));
            // 更新订单
            for (AgvLocDetl agvLocDetl : agvLocDetls) {
                OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("order_no", "DB" + agvLocDetl.getOrderNo()).eq("matnr", agvLocDetl.getMatnr()).eq("three_code",agvLocDetl.getThreeCode()));
                orderDetl.setQty(orderDetl.getQty() - agvLocDetl.getAnfme());
                if (!orderDetlService.update(orderDetl,new EntityWrapper<OrderDetl>().eq("order_no","DB" + agvLocDetl.getOrderNo()).eq("matnr", agvLocDetl.getMatnr()).eq("three_code",agvLocDetl.getThreeCode()))){
                    throw new CoolException("修改订单明细失败,请联系管理员"+agvLocDetl.getOrderNo()+agvLocDetl.getMatnr());
                }
            }
            //出库取消
        }else {
        } else {
            //源库位
            String locNo = wrkMast.getSourceLocNo();
            //目标站点
            String devNo = wrkMast.getLocNo();
            agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode(),(short)getContainerTypeByloc(locNo));
            if(devNo.contains("@")){
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"O","",null);
            if (wrkMast.getIoType() == 110 || wrkMast.getIoType() == 109) {
                agvLocMastService.updateLocStsByLocNo(locNo,"D",wrkMast.getBarcode(),(short)getContainerTypeByloc(locNo));
            } else {
                agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode(),(short)getContainerTypeByloc(locNo));
            }
            agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"O","",null);
        }
        if(wrkMast.getIoType() != 1 && wrkMast.getIoType() != 10){
            //订单回滚
            //List<AgvWrkDetl> agvWrkDetlList = agvWrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
            List<AgvWrkDetl> agvWrkDetlList1 = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
            agvWrkDetlList1.forEach(agvWrkDetl -> {
        //订单回滚
        //List<AgvWrkDetl> agvWrkDetlList = agvWrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
        List<AgvWrkDetl> agvWrkDetlList1 = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
        agvWrkDetlList1.forEach(agvWrkDetl -> {
                if(!Cools.isEmpty(agvWrkDetl.getOrderNo())){
                    String orderNo = agvWrkDetl.getOrderNo();
                    if(orderNo.contains("{")){
                        JSONArray orderArray = JSON.parseArray(orderNo);
                        for (Object o : orderArray){
                            JSONObject jsonobject = (JSONObject) o;
                            OrderDetl orderDetl = orderDetlService.selectByOrderNoAndMatnr(jsonobject.get("orderNo").toString(),agvWrkDetl.getMatnr(),agvWrkDetl.getThreeCode(),agvWrkDetl.getDeadTime());
                            orderDetl.setQty(orderDetl.getQty() - agvWrkDetl.getAnfme());
                            orderDetlService.updateById(orderDetl);
                        }
            if(!Cools.isEmpty(agvWrkDetl.getOrderNo())){
                String orderNo = agvWrkDetl.getOrderNo();
                if(orderNo.contains("{")){
                    JSONArray orderArray = JSON.parseArray(orderNo);
                    for (Object o : orderArray){
                        JSONObject jsonobject = (JSONObject) o;
                        OrderDetl orderDetl = orderDetlService.selectByOrderNoAndMatnr(jsonobject.get("orderNo").toString(),agvWrkDetl.getMatnr(),agvWrkDetl.getThreeCode(),agvWrkDetl.getDeadTime());
                    }else {
                        OrderDetl orderDetl = orderDetlService.selectByOrderNoAndMatnr(agvWrkDetl.getOrderNo(),agvWrkDetl.getMatnr(),agvWrkDetl.getThreeCode(),agvWrkDetl.getDeadTime());
                        orderDetl.setQty(orderDetl.getQty() - agvWrkDetl.getAnfme());
                        orderDetlService.updateById(orderDetl);
                    }
                }else {
                    OrderDetl orderDetl = orderDetlService.selectByOrderNoAndMatnr(agvWrkDetl.getOrderNo(),agvWrkDetl.getMatnr(),agvWrkDetl.getThreeCode(),agvWrkDetl.getDeadTime());
                    orderDetl.setQty(orderDetl.getQty() - agvWrkDetl.getAnfme());
                    orderDetlService.updateById(orderDetl);
                }
            }
        });
            });
        }
        //保存工作档以及明细
        agvWrkMastLogService.save(wrkMast);
@@ -623,6 +683,11 @@
        if(!agvWrkMastService.deleteByWrkNo(wrkMast.getWrkNo()) || !agvWrkDetlService.deleteByWrkNo(wrkMast.getWrkNo())){
            throw new CoolException("删除失败,请联系管理员");
        }
        if (type == 2) {
            //调用agv取消任务接口
            agvWrkMastService.callCancelTask(wrkMast.getWrkNo());
        }
    }
@@ -635,7 +700,7 @@
    }
    /*
    更新目标库位信息和库位托盘类型
    更新目标库位信息和库位货架类型
     */
    private void updateAgvLocMast(AgvLocMast locMast, String locSts, short type){
        locMast.setLocSts(locSts);
@@ -654,12 +719,21 @@
    }
    /*
    更新源站点信息和库位托盘类型
    更新源站点信息和库位货架类型
     */
    private void updateAgvBasDevp(AgvBasDevp agvBasDevp, String locSts, Short continerType){
        if(!Cools.isEmpty(agvBasDevp)){
            agvBasDevp.setLocSts(locSts);
            agvBasDevp.setLocType2(continerType);
            agvBasDevpService.updateById(agvBasDevp);
        }
    }
    private void updateAgvBasDevp(AgvBasDevp agvBasDevp, String locSts, Short continerType, String containerCode){
        if(!Cools.isEmpty(agvBasDevp)){
            agvBasDevp.setLocSts(locSts);
            agvBasDevp.setLocType2(continerType);
            agvBasDevp.setBarcode(containerCode);
            agvBasDevpService.updateById(agvBasDevp);
        }
    }
@@ -679,7 +753,7 @@
        wrkDetl.setIoTime(now);
        wrkDetl.setBatch(batch);
        wrkDetl.setAnfme(anfme); // 数量
        wrkDetl.setSuppCode(zpallet); // 托盘条码
        wrkDetl.setSuppCode(zpallet); // 货架条码
        wrkDetl.setAppeUser(userId);
        wrkDetl.setAppeTime(now);
        wrkDetl.setModiUser(userId);
@@ -710,7 +784,7 @@
            wrkDetl.setIoTime(now);
            wrkDetl.setBatch(agvWaitPakin.getBatch());
            wrkDetl.setAnfme(agvWaitPakin.getAnfme()); // 数量
            wrkDetl.setZpallet(agvWaitPakin.getZpallet()); // 托盘条码
            wrkDetl.setZpallet(agvWaitPakin.getZpallet()); // 货架条码
            wrkDetl.setAppeUser(userId);
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiUser(userId);
@@ -737,9 +811,9 @@
        wrkMast.setSourceLocNo(sourceLocNo);
        //目标站点
        wrkMast.setLocNo(locNo);
        //容器编码
        //货架编码
        wrkMast.setBarcode(barcode);
        //容器类型
        //货架类型
        wrkMast.setWhsType(containerType);
        wrkMast.setAppeUser(userId);