1
zhangchao
2024-10-24 a62131e24ab38d0446127dec6e3f6fa48d95caba
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -224,29 +224,39 @@
                    }
                    // 判断重复工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode);
                    //过滤判断,防止拣料再入库货物,经过入库站再入库时,被退回到退库站
                    WrkMast wrkMast1 = wrkMastMapper.selectPakInStepBarcode(barcode);
                    if (wrkMast1 != null) {
                        if (wrkMast1.getIoType() == 103 || wrkMast1.getIoType() == 107 || wrkMast1.getIoType() == 104) {
                    WrkMast wrkMast = wrkMastMapper.selectPakInStepBarcode(barcode);
                    if (wrkMast != null && wrkMast.getWrkSts() == 2) {
                        int wrkNo1 = basDevpService.count(new QueryWrapper<BasDevp>().eq("wrk_no", wrkMast.getWrkNo()));
                        if (wrkNo1 != 0) {
                            News.error(barcode + "条码已存在状态为( 2.设备上走 )的数据,请查看WCS输送线界面,工作号={}", wrkMast.getWrkNo());
                            if (ledThread != null) {
                                News.error(":扫码失败,请重试");
                                MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, barcode + "条码已存在状态为( 2.设备上走 )的任务,工作号=" + wrkMast.getWrkNo()));
                            }
                            continue;
                        }
                    }
                    if (wrkMast != null) {
                        News.error("" + mark + " - 4" + " - 工作档中已存在该站状态为( 2.设备上走 )的数据,工作号={}", wrkMast.getWrkNo());
                        staProtocol.setWorkNo((short) 9999);
                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
                        barcodeThread.setBarcode("");
                        staProtocol.setWorkNo(Short.parseShort(wrkMast.getWrkNo() + ""));
                        staProtocol.setStaNo(Short.parseShort(wrkMast.getStaNo() + ""));
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        log.info("输送线下发(存在设备上走的工作档,直接下发!)):" + wrkMast.getWrkNo() + "," + wrkMast.getStaNo());
                        ledThread.errorReset();
                        log.info("组托请求后LED错误清除");
                        if (!result) {
                            throw new CoolException("更新plc站点信息失败");
                            News.error(":更新plc站点信息失败");
                            log.error("输送线下发(存在设备上走的工作档,直接下发!)==>更新plc站点信息失败");
//                            throw new CoolException("更新plc站点信息失败");
                            continue;
                        }
                        // led 异常显示
                        if (ledThread != null) {
                            String errorMsg = "工作档已存在该条码号===>>" + barcode;
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(5, errorMsg));
                        }
                    }
                    WrkMast checkPick = wrkMastMapper.selectOne(new QueryWrapper<WrkMast>()
                            .eq("barcode", barcode)
                            .in("io_type", 107, 103, 57));
                    if (!Cools.isEmpty(checkPick)) {
                        continue;
                    }
@@ -489,10 +499,16 @@
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()) {
                    News.warnNoLog("" + mark + " - 0" + " - 开始执行");
                    WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode);
//                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo().intValue());
                    // WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo().intValue());
                    if (wrkMast == null) {
                        // 无拣料数据
                        continue;
                        WrkMast wrkMast1 = wrkMastMapper.selectPakInStepBarcode(barcode);
                        if (!(wrkMast1 != null && wrkMast1.getWrkSts() == 2 && wrkMast1.getIoType() == 53)) {
                            // 无拣料数据
                            continue;
                        } else {
                            wrkMast1.setIoType(103);
                            wrkMast = wrkMast1;
                        }
                    }
                    if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107) || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) {
                        continue;
@@ -508,12 +524,13 @@
//                        log.error("{}号任务数据异常!", wrkMast.getWrkNo());
//                    }
                    // 获取目标站
                    Wrapper<StaDesc> wrapper = new QueryWrapper<StaDesc>().eq("type_no", wrkMast.getIoType() - 50).eq("stn_no", pickSta.getStaNo()) // 作业站点 = 拣料出库的目标站
                            .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号
                    StaDesc staDesc = staDescService.getOne(wrapper);
                    if (Cools.isEmpty(staDesc)) {
                        News.error("" + mark + " - 2" + " - 入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo());
                        staProtocol.setWorkNo((short) 9989);
                        staProtocol.setWorkNo((short) 9999);
                        staProtocol.setStaNo((short) (pickSta.getStaNo().shortValue() - (short) 1));
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -646,7 +663,7 @@
                                crnThread.setResetFlag(true);
                            } else if (statusTypeTwo == CrnStatusType.WAITING_TWO) {
                                crnThread.setResetFlagTwo(true);
                            } else {
                            } else if (statusTypeTwo == CrnStatusType.WAITING_All) {
                                crnThread.setResetFlag(true);
                                crnThread.setResetFlagTwo(true);
                            }
@@ -862,7 +879,7 @@
                        wrkMast.setIoPri(14D);
                        wrkMastMapper.updateById(wrkMast);
                        // 生成工作档,将浅库位移转到新的库位中
                        moveLocForDeepLoc(slave, shallowLoc, mark);
                        moveLocForDeepLoc(slave, shallowLoc, mark,wrkMast.getTenant());
                        // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行)
//                        moveLocForDeepLocPakin(slave, shallowLoc, wrkMast);
                    }
@@ -1031,7 +1048,7 @@
                                wrkMast.setUpdMk("Y");
                                wrkMastMapper.updateById(wrkMast);
                                // 生成工作档,将浅库位移转到新的库位中
                                moveLocForDeepLoc(slave, shallowLoc, mark);
                                moveLocForDeepLoc(slave, shallowLoc, mark,wrkMast.getTenant());
                            }
                            News.error("{}任务出库失败,浅库位堵塞!浅库位号:{}", wrkMast.getWrkNo(), shallowLocNo);
                            continue;
@@ -1272,6 +1289,7 @@
        crnCommand.setAckFinish((short) 0);  // 任务完成确认位
        if (workMode == 2) {
            //CrnTaskModeType该枚举类无效,只有1代表工位,2代表工位2,3双工位
            crnCommand.setTaskMode(CrnTaskModeType.PAKOUT);
            crnCommand.setSourcePosXTwo(sourceSta.getRow1().shortValue());     // 源库位排
            crnCommand.setSourcePosYTwo(sourceSta.getBay1().shortValue());     // 源库位列
            crnCommand.setSourcePosZTwo(sourceSta.getLev1().shortValue());     // 源库位层
@@ -1329,8 +1347,38 @@
            //  状态:等待确认 并且  任务完成位 = 1
            if (wait && crnProtocol.getTaskNo() != 0) {
                News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作");
                if (crnProtocol.getTaskNo() == 9999) {
//                if (crnProtocol.getTaskNo() == 9999) {
//                    // 堆垛机复位
//                    if (statusType == CrnStatusType.WAITING_ONE) {
//                        crnThread.setResetFlag(true);
//                    } else if (statusTypeTwo == CrnStatusType.WAITING_TWO) {
//                        crnThread.setResetFlagTwo(true);
//                    } else {
//                        crnThread.setResetFlag(true);
//                        crnThread.setResetFlagTwo(true);
//                    }
//                } else {
                // 获取入库待确认工作档
                WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue());
                if (wrkMast == null) {
                    News.error("" + mark + " - 1" + " - 堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                    continue;
                }
                // 入库 + 库位转移  ==> 4.入库完成
                if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)) {
                    wrkMast.setWrkSts(4L);
                } else {
                    //TODO
                    News.info("状态不对,状态={},工作号={}", wrkMast.getWrkSts(), crnProtocol.getTaskNo());
                    continue;
                }
                Date now = new Date();
                wrkMast.setCrnEndTime(now);
                wrkMast.setModiTime(now);
                // 修改成功后复位堆垛机
                if (wrkMastMapper.updateById(wrkMast) > 0) {
                    // 堆垛机复位
                    News.info("" + mark + " - 2" + " - 修改成功后复位堆垛机 : 堆垛机号={}", crnThread.getCrnProtocol().getCrnNo());
                    if (statusType == CrnStatusType.WAITING_ONE) {
                        crnThread.setResetFlag(true);
                    } else if (statusTypeTwo == CrnStatusType.WAITING_TWO) {
@@ -1340,39 +1388,11 @@
                        crnThread.setResetFlagTwo(true);
                    }
                } else {
                    // 获取入库待确认工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue());
                    if (wrkMast == null) {
                        News.error("" + mark + " - 1" + " - 堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                        continue;
                    }
                    // 入库 + 库位转移  ==> 4.入库完成
                    if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)) {
                        wrkMast.setWrkSts(4L);
                    } else {
                        continue;
                    }
                    Date now = new Date();
                    wrkMast.setCrnEndTime(now);
                    wrkMast.setModiTime(now);
                    // 修改成功后复位堆垛机
                    if (wrkMastMapper.updateById(wrkMast) > 0) {
                        // 堆垛机复位
                        News.info("" + mark + " - 2" + " - 修改成功后复位堆垛机 : 堆垛机号={}", crnThread.getCrnProtocol().getCrnNo());
                        if (statusType == CrnStatusType.WAITING_ONE) {
                            crnThread.setResetFlag(true);
                        } else if (statusTypeTwo == CrnStatusType.WAITING_TWO) {
                            crnThread.setResetFlagTwo(true);
                        } else {
                            crnThread.setResetFlag(true);
                            crnThread.setResetFlagTwo(true);
                        }
                    } else {
                        News.error("" + mark + " - 2" + " - 修改成功后复位堆垛机 失败!!,堆垛机号={}", crnThread.getCrnProtocol().getCrnNo());
                    }
                    News.error("" + mark + " - 2" + " - 修改成功后复位堆垛机 失败!!,堆垛机号={}", crnThread.getCrnProtocol().getCrnNo());
                }
            }
            //}
        }
        News.infoNoLog("" + mark + " - 0" + " - 对工作档的完成操作执行完成");
    }
@@ -1563,9 +1583,9 @@
                    if (!staProtocol.isLoading()) {
                        continue;
                    }
                    if (!staProtocol.isPakMk()) {
                        continue;
                    }
//                    if (!staProtocol.isPakMk()) {
//                        continue;
//                    }
                    staProtocol.setWorkNo((short) 9999);
                    News.info("{}入库回退:{},任务号:{}", emptyInSta.getStaNo(), errMsg, (short) 9999);
                    staProtocol.setStaNo(emptyInSta.getBackSta().shortValue());
@@ -1910,7 +1930,7 @@
     * 因双深库位阻塞,对浅库位进行移转(立即执行版)
     * tip:同步
     */
    private synchronized void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc, Integer mark) {
    private synchronized void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc, Integer mark,Long tenant) {
        try {
            News.warnNoLog("" + mark + "moveLocForDeepLoc" + " - 0" + " - 开始执行:因双深库位阻塞,对浅库位进行移转(立即执行版)");
@@ -2002,6 +2022,7 @@
            wrkMast.setLinkMis("N");
            wrkMast.setAppeTime(new Date());
            wrkMast.setModiTime(new Date());
            wrkMast.setTenant(tenant);
            int res = wrkMastMapper.insert(wrkMast);
            if (res == 0) {
                News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 2" + " - 保存工作档失败");
@@ -2018,6 +2039,7 @@
                    VersionUtils.setWrkDetl(wrkDetl, locDetl); // 版本控制
                    wrkDetl.setAppeTime(new Date());
                    wrkDetl.setModiTime(new Date());
                    wrkDetl.setTenant(tenant);
                    if (!wrkDetlService.save(wrkDetl)) {
                        News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 3" + " - 保存工作档明细失败");
                        throw new CoolException("保存工作档明细失败");