chen.llin
2 天以前 35c26fb50cc90b85a8cf924f7b47e3ab412cabb5
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -380,65 +380,88 @@
    public synchronized void crnStnToOutStn(Integer mark) {
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            // 遍历堆垛机出库站
            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                // 获取堆垛机出库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) {
                    // 查询工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(staProtocol.getSiteId());
                    if (wrkMast == null) {
                        continue;
                    }
                    // 判断工作档条件
                    if (wrkMast.getIoType() < 100 || wrkMast.getStaNo() == null || wrkMast.getSourceStaNo() == null) {
                        continue;
                    }
                    // 判断吊车是否实际已完成,且电脑状态在move中,以备电脑进行更新工作档
                    CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo());
                    CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                    if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) {
                        // 移动中
                        continue;
                    }
                    //  判断堆垛机状态等待确认
                    if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue())
                            && crnProtocol.statusType == CrnStatusType.WAITING
                            && crnProtocol.forkPosType == CrnForkPosType.HOME) {
                        // 命令下发区.更新工作档状态为14 下发站点信息--------------------------------------------------------------------------
                        staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                        wrkMast.setWrkSts(14L);
                        staProtocol.setWorkNo(wrkMast.getWrkNo());
                        if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) {
                            continue;
                        }
                        wrkMast.setCrnEndTime(new Date());
                        if (wrkMastMapper.updateById(wrkMast) != 0) {
                            // 复位堆垛机
                            News.info("出库任务完成下发堆垛机复位,任务号:{}",wrkMast.getWrkNo());
                            crnThread.setResetFlag(true);
                        } else {
                            News.error(""+mark+" - 1"+" - 更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo());
                        }
                    }else {
                        News.errorNoLog(""+mark+" - 6"+" - 堆垛机信息不符合入库条件!!!"
                                +" 堆垛机状态:"+crnProtocol.modeType+"==自动AUTO:" + CrnModeType.AUTO
                                +"、堆垛机任务号:"+crnProtocol.getTaskNo()+"==工作档任务号:" + wrkMast.getWrkNo().shortValue()
                                +"、状态枚举:"+crnProtocol.statusType+"==WAITING:10 //任务完成等待WCS确认):" + CrnStatusType.WAITING
                                +"、货叉位置:"+crnProtocol.forkPosType+"==HOME:0  // 货叉原位:" + CrnForkPosType.HOME);
                    }
                }
            try {
                // 每台堆垛机的所有出库站处理在同一个事务中执行,快速提交释放锁
                processCrnStnToOutStnForCrn(crnSlave, mark);
            } catch (Exception e) {
                News.error(""+mark+" - crnStnToOutStn"+" - 处理堆垛机{}时发生异常", crnSlave.getId(), e);
                // 继续处理下一台堆垛机,不中断整个流程
            }
        }
    }
    /**
     * 处理单台堆垛机的所有出库站操作(使用独立事务,快速提交释放锁)
     * 注意:必须是public方法,Spring AOP才能代理事务
     */
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public void processCrnStnToOutStnForCrn(CrnSlave crnSlave, Integer mark) {
        // 遍历堆垛机出库站
        for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
            processCrnStnToOutStn(crnStn, mark);
        }
    }
    /**
     * 处理单个堆垛机出库站的出库操作(无事务,事务由上层方法管理)
     */
    private void processCrnStnToOutStn(CrnSlave.CrnStn crnStn, Integer mark) {
        // 获取堆垛机出库站信息
        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
        StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
        if (staProtocol == null) {
            return;
        } else {
            staProtocol = staProtocol.clone();
        }
        if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) {
            // 查询工作档
            WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(staProtocol.getSiteId());
            if (wrkMast == null) {
                return;
            }
            // 判断工作档条件
            if (wrkMast.getIoType() < 100 || wrkMast.getStaNo() == null || wrkMast.getSourceStaNo() == null) {
                return;
            }
            // 判断吊车是否实际已完成,且电脑状态在move中,以备电脑进行更新工作档
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) {
                // 移动中
                return;
            }
            //  判断堆垛机状态等待确认
            if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue())
                    && crnProtocol.statusType == CrnStatusType.WAITING
                    && crnProtocol.forkPosType == CrnForkPosType.HOME) {
                // 命令下发区.更新工作档状态为14 下发站点信息--------------------------------------------------------------------------
                staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                wrkMast.setWrkSts(14L);
                staProtocol.setWorkNo(wrkMast.getWrkNo());
                if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) {
                    return;
                }
                wrkMast.setCrnEndTime(new Date());
                if (wrkMastMapper.updateById(wrkMast) != 0) {
                    // 复位堆垛机
                    News.info("出库任务完成下发堆垛机复位,任务号:{}",wrkMast.getWrkNo());
                    crnThread.setResetFlag(true);
                } else {
                    News.error(""+mark+" - 1"+" - 更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo());
                    throw new CoolException("更新工作档的工作状态为14失败");
                }
            }else {
                News.errorNoLog(""+mark+" - 6"+" - 堆垛机信息不符合入库条件!!!"
                        +" 堆垛机状态:"+crnProtocol.modeType+"==自动AUTO:" + CrnModeType.AUTO
                        +"、堆垛机任务号:"+crnProtocol.getTaskNo()+"==工作档任务号:" + wrkMast.getWrkNo().shortValue()
                        +"、状态枚举:"+crnProtocol.statusType+"==WAITING:10 //任务完成等待WCS确认):" + CrnStatusType.WAITING
                        +"、货叉位置:"+crnProtocol.forkPosType+"==HOME:0  // 货叉原位:" + CrnForkPosType.HOME);
            }
        }
    }
@@ -459,7 +482,7 @@
            }
        } catch (Exception e) {
            News.error(""+mark+" - crnIoExecute"+" - 执行堆垛机入出库作业下发时发生异常", e);
            }
        }
    }
    /**
@@ -713,15 +736,15 @@
                    outStationAvailable =
                            //自动
                            staProtocol.isAutoing()
                            //!有物
                            && !staProtocol.isLoading()
                            //能出
                            && staDetl.getCanouting() != null
                            && staDetl.getCanouting().equals("Y")
                            //工作号
                            && staProtocol.getWorkNo() == 0
                            //可出
                            && staProtocol.isOutEnable();
                                    //!有物
                                    && !staProtocol.isLoading()
                                    //能出
                                    && staDetl.getCanouting() != null
                                    && staDetl.getCanouting().equals("Y")
                                    //工作号
                                    && staProtocol.getWorkNo() == 0
                                    //可出
                                    && staProtocol.isOutEnable();
                }
                // 出库站可用时继续执行
                if (outStationAvailable) {