#
zhou zhou
19 小时以前 fca6edde8c69a755f1e06dd392ed224bd95a426c
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -505,43 +505,26 @@
    /**
     * 入出库  ===>>  堆垛机入出库作业下发
     * 注意:使用 REQUIRES_NEW 让每个堆垛机的处理在独立事务中执行,避免长时间持有锁导致死锁
     */
    public synchronized void crnIoExecute(Integer mark) {
        try {
            for (CrnSlave crn : slaveProperties.getCrn()) {
                try {
                    // 每个堆垛机的处理在独立事务中执行,快速提交释放锁
                    mainService.processCrnIo(crn, mark);
                } catch (Exception e) {
                    News.error(""+mark+" - crnIoExecute"+" - 处理堆垛机{}时发生异常", crn.getId(), e);
                    // 继续处理下一个堆垛机,不中断整个流程
                }
            }
        } catch (Exception e) {
            News.error(""+mark+" - crnIoExecute"+" - 执行堆垛机入出库作业下发时发生异常", e);
        }
    }
    /**
     * 处理单个堆垛机的入出库作业(使用独立事务,快速提交释放锁)
     */
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public void processCrnIo(CrnSlave crn, Integer mark) {
        for (CrnSlave crn : slaveProperties.getCrn()) {
        // 获取堆垛机信息
        CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
        if (crnThread == null) {
            return;
        }
        CrnProtocol crnProtocol = crnThread.getCrnProtocol();
        if (crnProtocol == null) {
            return;
                continue;
        }
        BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
        if (basCrnp == null) {
            News.error(""+mark+" - 1"+" - {}号堆垛机尚未在数据库进行维护!", crn.getId());
            return;
                continue;
        }
//            //堆垛机回原点任务中
//            if(crnThread.isBackHpFlag()){
//                continue;
//            }
        // 只有当堆垛机空闲 并且 无任务时才继续执行
        if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
@@ -573,6 +556,10 @@
        // 库位移转
        //mark - 3 - ....
        this.locToLoc(crn, crnProtocol,mark);
//            this.crnRebackHp(crnProtocol, crnThread);
        }
//        News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成");
    }
    /**
@@ -827,19 +814,10 @@
                                wrkMast.setUpdMk("Y");
                                wrkMastMapper.updateById(wrkMast);
                                // 生成工作档,将浅库位移转到新的库位中
                                try {
                                    moveLocForDeepLoc(slave, shallowLoc,mark);
                                    News.warnNoLog("{}任务已生成浅库位移转任务,浅库位号:{},继续处理下一个任务", wrkMast.getWrkNo(), shallowLocNo);
                                    continue; // 已生成移库任务,继续处理下一个任务
                                } catch (Exception e) {
                                    News.error("{}任务生成浅库位移转任务失败,浅库位号:{}", wrkMast.getWrkNo(), shallowLocNo, e);
                                    continue; // 生成失败,继续处理下一个任务
                                }
                            } else {
                                // 已存在移库任务,等待移库完成
                                News.warnNoLog("{}任务出库等待中,浅库位已有移库任务,浅库位号:{},移库任务号:{}", wrkMast.getWrkNo(), shallowLocNo, waitWrkMast.getWrkNo());
                                continue; // 继续处理下一个任务,不阻塞当前循环
                            }
                            News.error("{}任务出库失败,浅库位堵塞!浅库位号:{}", wrkMast.getWrkNo(), shallowLocNo);
                            break;
                        } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) {
                            News.warnNoLog(""+mark+" - 2"+" - 10"+" - // Q、S  库位状态={}",shallowLoc.getLocSts());
                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
@@ -1586,15 +1564,7 @@
        }
    }
    /**
     * 因双深库位阻塞,对浅库位进行移转(立即执行版)
     * tip:同步
     */
    /**
     * 因双深库位阻塞,对浅库位进行移转(立即执行版)
     * tip:同步
     */
    private synchronized void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc, Integer mark) {
    private synchronized boolean moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc,Integer mark) {
        try {
            News.warnNoLog("" + mark + "moveLocForDeepLoc" + " - 0" + " - 开始执行:因双深库位阻塞,对浅库位进行移转(立即执行版)");
@@ -1641,19 +1611,8 @@
            if (null == loc) {
                News.error("" + mark + "moveLocForDeepLoc" + " - 1" + " - 双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo());
//                throw new CoolException("双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo());
                return false;
            }else {
                mainService.createMoveWrkMast(crn, shallowLoc, loc);
            }
        } catch (Exception e) {
            News.error("" + mark + "moveLocForDeepLoc" + " - 8" + " - 双深库位阻塞,对浅库位进行移转失败", e);
        }
    }
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    public synchronized void createMoveWrkMast(CrnSlave crn, LocMast shallowLoc, LocMast loc) {
        // 获取工作号
        int workNo = commonService.getWorkNo(0);
        // 保存工作档
@@ -1676,7 +1635,7 @@
        wrkMast.setModiTime(new Date());
        int res = wrkMastMapper.insert(wrkMast);
        if (res == 0) {
            News.errorNoLog(""  + "moveLocForDeepLoc" + " - 2" + " - 保存工作档失败");
                    News.errorNoLog(""+mark+"moveLocForDeepLoc"+" - 2"+" - 保存工作档失败");
            throw new CoolException("保存工作档失败");
        }
        // 工作档明细保存
@@ -1691,7 +1650,7 @@
                wrkDetl.setAppeTime(new Date());
                wrkDetl.setModiTime(new Date());
                if (!wrkDetlService.insert(wrkDetl)) {
                    News.errorNoLog(""  + "moveLocForDeepLoc" + " - 3" + " - 保存工作档明细失败");
                            News.errorNoLog(""+mark+"moveLocForDeepLoc"+" - 3"+" - 保存工作档明细失败");
                    throw new CoolException("保存工作档明细失败");
                }
            }
@@ -1701,11 +1660,11 @@
            shallowLoc.setLocSts("R"); // R.出库预约
            shallowLoc.setModiTime(new Date());
            if (!locMastService.updateById(shallowLoc)) {
                News.errorNoLog(""  + "moveLocForDeepLoc" + " - 4" + " - 更新源库位状态失败");
                        News.errorNoLog(""+mark+"moveLocForDeepLoc"+" - 4"+" - 更新源库位状态失败");
                throw new CoolException("更新源库位状态失败");
            }
        } else {
            News.errorNoLog(""  + "moveLocForDeepLoc" + " - 5" + " - 源库位出库失败");
                    News.errorNoLog(""+mark+"moveLocForDeepLoc"+" - 5"+" - 源库位出库失败");
            throw new CoolException("源库位出库失败");
        }
        // 修改目标库位状态
@@ -1713,15 +1672,23 @@
            loc.setLocSts("S"); // S.入库预约
            loc.setModiTime(new Date());
            if (!locMastService.updateById(loc)) {
                News.errorNoLog(""  + "moveLocForDeepLoc" + " - 6" + " - 更新目标库位状态失败");
                        News.errorNoLog(""+mark+"moveLocForDeepLoc"+" - 6"+" - 更新目标库位状态失败");
                throw new CoolException("更新目标库位状态失败");
            }
        } else {
            News.errorNoLog(""  + "moveLocForDeepLoc" + " - 7" + " - 移转失败");
                    News.errorNoLog(""+mark+"moveLocForDeepLoc"+" - 7"+" - 移转失败");
            throw new CoolException("移转失败");
        }
    }
        } catch (Exception e) {
            News.error(""+mark+"moveLocForDeepLoc"+" - 8"+" - 双深库位阻塞,对浅库位进行移转失败", e);
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return true;
    }
    /**
     * 并板,拣料,盘点出库,状态为14.已出库未确认,更新ctnNo为Y
     * @param mark 标识