#
luxiaotao1123
2022-12-06 b3d960252636140962bf9bbdf053d3b1d3255020
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -39,7 +39,6 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -537,7 +536,6 @@
    /**
     * 堆垛机站出库到出库站
     */
    @Async
    public void crnStnToOutStn() {
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            // 遍历堆垛机出库站
@@ -777,8 +775,9 @@
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            log.error("修改工作档状态 {} => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkSts$(), wrkMast.getWrkNo());
                        } else {
                            return true;
                        }
                        return true;
                    }
                }
            } else {
@@ -793,11 +792,13 @@
                            // 没有其他任务
                            if (null == wrkMastMapper.selectPakin(slave.getId(), steNo)) {
                                this.letCarBeReady(wrkMast, steNo, wrkMast.getLocNo());
                                return true;
                            }
                        }
                        // 小车搬走
                        if (wrkMast.getWrkSts() == 3L) {
                            this.carMoveOut(wrkMast, steNo, crnProtocol);
                            return true;
                        }
                        // 没有小车
                    } else {
@@ -834,8 +835,9 @@
                                wrkMast.setModiTime(now);
                                if (wrkMastMapper.updateById(wrkMast) == 0) {
                                    log.error("修改工作档状态 {} => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkSts$(), wrkMast.getWrkNo());
                                } else {
                                    return true;
                                }
                                return true;
                            }
                        }
@@ -852,6 +854,8 @@
                            // 没有其他任务
                            if (null == wrkMastMapper.selectPakin(slave.getId(), steNo)) {
                                this.letCarBeWaiting(wrkMast, steNo, wrkMast.getLocNo());
                            } else {
                                return true;
                            }
                        }
                        // 堆垛机将货放至小车上 3.小车待搬(小车不用搬运,已经在当前组库位) / 6.小车待入  ===>> 7.吊车入库中
@@ -888,8 +892,9 @@
                                    wrkMast.setModiTime(now);
                                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                                        log.error("修改工作档状态 3.小车待搬/6.小车待入 => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                                    } else {
                                        return true;
                                    }
                                    return true;
                                }
                            }
                        }
@@ -903,12 +908,14 @@
                                if (null == wrkMastMapper.selectPakin(slave.getId(), steNo)) {
                                    // 让小车等待搬运待续
                                    this.letCarBeReady(wrkMast, steThread.getSlave().getId(), wrkMast.getLocNo());
                                    return true;
                                }
                            }
                        }
                        // 堆垛机搬运小车
                        if (wrkMast.getWrkSts() == 3L) {
                            this.carMoveIn(wrkMast, wrkMast.getSteNo(), crnProtocol);
                            return true;
                        }
                    }
                }
@@ -921,7 +928,7 @@
    /**
     * 出库  ===>>  库位到堆垛机站
     */
    public boolean locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){
    public synchronized boolean locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            // 获取工作状态为11(生成出库ID)的出库工作档
            WrkMast wrkMast = wrkMastMapper.selectPakOutStep111215(slave.getId(), crnStn.getStaNo());
@@ -939,6 +946,16 @@
                log.error("出库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), sourceSta.getLocSts());
                continue;
            }
            // 判断是否有同库位组的出库任务,如果有,则暂停
            List<String> outsideLoc = Utils.getGroupOutsideLoc(wrkMast.getSourceLocNo());
            if (!Cools.isEmpty(outsideLoc)) {
                if (!Cools.isEmpty(wrkMastMapper.selectWorkingOfPakOutBySource(outsideLoc))) {
//                    log.warn("{}工作档出库失败,原因:外层库位{}正在执行出库任务!", wrkMast.getWrkNo(), JSON.toJSONString(outsideLoc));
                    continue;
                }
            }
            // 获取堆垛机出库站信息
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
@@ -970,7 +987,7 @@
                }
                // 置顶任务
                wrkMast.setIoPri((double) 9999);
                wrkMast.setIoPri((double) 9998);
                wrkMastMapper.updateById(wrkMast);
                // 判断是否为穿梭库
@@ -987,7 +1004,7 @@
                                log.error("{}库位异常,未检索到相应工作档!", shallowLocNo);
                            } else {
                                if(waitWrkMast.getWrkSts() == 11) {
                                    waitWrkMast.setIoPri(20D);
                                    waitWrkMast.setIoPri(wrkMast.getIoPri() + 1);
                                    waitWrkMast.setModiTime(new Date());
                                    if (wrkMastMapper.updateById(waitWrkMast) == 0) {
                                        log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
@@ -1035,8 +1052,9 @@
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            log.error("修改工作档状态 11.生成出库ID => 16.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                        } else {
                            return true;
                        }
                        break;
                    }
                } else {
@@ -1070,8 +1088,9 @@
                            wrkMast.setModiTime(now);
                            if (wrkMastMapper.updateById(wrkMast) == 0) {
                                log.error("修改工作档状态 11.生成出库ID => 16.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                            } else {
                                return true;
                            }
                            return true;
                        }
                    // 不是最外层库位,需要使用穿梭车搬运后,再堆垛机出库
                    } else {
@@ -1106,8 +1125,13 @@
                                        wrkMast.setSteNo(steNo);
                                        wrkMast.setCrnStrTime(now);
                                        wrkMast.setModiTime(now);
                                        LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
                                        Integer outCrnNo = locMastService.getOutCrnNo(locMast);
                                        wrkMast.setCrnNo(outCrnNo);
                                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                                            log.error("修改工作档状态 11.生成出库ID => 14.小车搬出库 失败!!,工作号={}", wrkMast.getWrkNo());
                                        } else {
                                            return true;
                                        }
                                    }
                                }
@@ -1140,8 +1164,9 @@
                                    wrkMast.setModiTime(now);
                                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                                        log.error("修改工作档状态 15.等待吊车 => 16.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                                    } else {
                                        return true;
                                    }
                                    return true;
                                }
                            }
@@ -1155,12 +1180,14 @@
                                    if (null == wrkMastMapper.selectPakout(slave.getId(), steNo)) {
                                        // 让小车等待搬运待续
                                        this.letCarBeReady(wrkMast, steThread.getSlave().getId(), wrkMast.getSourceLocNo());
                                        return true;
                                    }
                                }
                            }
                            // 堆垛机搬运小车
                            if (wrkMast.getWrkSts() == 12L) {
                                this.carMoveIn(wrkMast, wrkMast.getSteNo(), crnProtocol);
                                return true;
                            }
                        }
                    }
@@ -1327,7 +1354,14 @@
            SteProtocol steProtocol = steThread.getSteProtocol();
            if (steProtocol == null) { continue; }
            if (!steProtocol.isIdle()) { continue; }
            if (steProtocol.getRow() == 1) { continue; }
            String locNo = wrkMast.getWrkSts() < 10 ? wrkMast.getLocNo() : wrkMast.getSourceLocNo();
            // 如果在同一个库位组
            if (Utils.getGroupRow(locNo, true).equals(Utils.getGroupRow(steProtocol.getRow().intValue(), true))
                    && steProtocol.getBay().intValue() == Utils.getBay(locNo)
                    && steProtocol.getLev().intValue() == Utils.getLev(locNo)) {
                return steThread;
            }
            LocMast locMast = locMastService.selectById(locNo);
            int lev = locMast.getLev1();
            int bay = locMast.getBay1();
@@ -1610,7 +1644,6 @@
    /**
     * 执行对工作档的完成操作
     */
    @Async
    @Transactional
    public void storeFinished() {
        for (CrnSlave crn : slaveProperties.getCrn()) {
@@ -1853,6 +1886,9 @@
                            Date now = new Date();
                            wrkMast.setCrnEndTime(now);
                            wrkMast.setModiTime(now);
                            LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
                            Integer outCrnNo = locMastService.getOutCrnNo(locMast);
                            wrkMast.setCrnNo(outCrnNo);
                            // 修改成功后复位堆垛机
                            if (wrkMastMapper.updateById(wrkMast) > 0) {
                                // 堆垛机复位
@@ -2273,7 +2309,6 @@
    /**
     * 空栈板初始化入库,叉车入库站放货
     */
    @Async
    public void storeEmptyPlt(){
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历空板入库口
@@ -2362,7 +2397,6 @@
    /**
     * 出库  ===>> 工作档信息写入led显示器
     */
    @Async
    public void ledExecute() {
        for (LedSlave led : slaveProperties.getLed()) {
            // 获取输送线plc线程
@@ -2463,7 +2497,6 @@
    /**
     * 其他  ===>> LED显示器复位,显示默认信息
     */
    @Async
    public void ledReset() {
        for (LedSlave led : slaveProperties.getLed()) {
            // 获取输送线plc线程
@@ -2534,7 +2567,7 @@
                            SteChargeType first = SteChargeType.FIRST;
                            locNo = first.locNo;
                            if (basSteService.hasCarOfLocNo(locNo) == null
                                && wrkChargeService.selectWorkingOfCharge(first.ssbm) != null) {
                                && wrkChargeService.selectWorkingOfCharge(first.ssbm) == null) {
                                steCharge = first;
                                break;
                            }
@@ -2543,7 +2576,7 @@
                            SteChargeType second = SteChargeType.SECOND;
                            locNo = second.locNo;
                            if (basSteService.hasCarOfLocNo(locNo) == null
                                && wrkChargeService.selectWorkingOfCharge(second.ssbm) != null) {
                                && wrkChargeService.selectWorkingOfCharge(second.ssbm) == null) {
                                steCharge = second;
                                break;
                            }
@@ -2552,7 +2585,7 @@
                            SteChargeType third = SteChargeType.THIRD;
                            locNo = third.locNo;
                            if (basSteService.hasCarOfLocNo(locNo) == null
                                && wrkChargeService.selectWorkingOfCharge(third.ssbm) != null) {
                                && wrkChargeService.selectWorkingOfCharge(third.ssbm) == null) {
                                steCharge = third;
                                break;
                            }
@@ -2578,6 +2611,40 @@
                    if (!wrkChargeService.insert(wrkCharge)) {
                        log.error("保存{}号穿梭车充电任务失败!!!", ste.getId());
                        continue;
                    }
                    // 小车处于通道
                    List<String> channel = slaveProperties.getChannel();
                    for (String channelLocNo : channel) {
                        if (steProtocol.getRow().intValue() == Utils.getRow(channelLocNo)
                                && steProtocol.getBay().intValue() == Utils.getBay(channelLocNo)
                                && steProtocol.getLev().intValue() == Utils.getLev(channelLocNo)) {
                            Integer otherSte = existOtherSte(channelLocNo, wrkCharge.getSteNo());
                            if (null != otherSte) {
                                log.warn("{}号小车充电阻断,原因:通道存在{}号穿梭车!", wrkCharge.getSteNo(), otherSte);
                            } else {
                                // 命令下发区 --------------------------------------------------------------------------
                                SteCommand steCommand = new SteCommand();
                                steCommand.setSteNo(wrkCharge.getSteNo()); // 穿梭车编号
                                steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号
                                steCommand.setTaskMode(SteTaskModeType.GO_ORIGIN);  // 去右端
                                steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue(), false).shortValue());
                                steCommand.setBay(steProtocol.getBay());
                                steCommand.setLev(steProtocol.getLev());
                                if (!MessageQueue.offer(SlaveType.Ste, wrkCharge.getSteNo(), new Task(2, steCommand))) {
                                    log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", wrkCharge.getSteNo(), JSON.toJSON(steCommand));
                                } else {
                                    // 修改工作档状态 21.准备充电 ===> 25.小车走行
                                    wrkCharge.setWrkSts(25L);
                                    Date now = new Date();
                                    wrkCharge.setModiTime(now);
                                    if (!wrkChargeService.updateById(wrkCharge)) {
                                        log.error("修改充电任务状态 21.准备充电 ===> 25.小车走行 失败!!,工作号={}", wrkCharge.getWrkNo());
                                    }
                                }
                            }
                        }
                    }
                    // 处于充电库位组
@@ -2638,6 +2705,11 @@
            // 22.小车待搬
            if (wrkCharge.getWrkSts() == 22) {
                // 入出库任务优先
                if (null != wrkMastMapper.selectWorkingByCrn(wrkCharge.getCrnNo())) {
                    return;
                }
                // 搬小车至小车走向通道
                List<String> channel = slaveProperties.getChannel();
@@ -2714,6 +2786,11 @@
            } else if (wrkCharge.getWrkSts() == 26) {
                // 固定堆垛机
                int crnNo = 1;
                // 入出库任务优先
                if (null != wrkMastMapper.selectWorkingByCrn(crnNo)) {
                    return;
                }
                // 充电位
                LocMast chargeLoc = locMastService.selectById(wrkCharge.getLocNo());
@@ -2788,22 +2865,31 @@
                if (Cools.isEmpty(steProtocol, basSte)) {
                    continue;
                }
                // 1号充电桩
                if (value.equals(SteChargeType.FIRST) && devpThread.charge0) {
                if (steProtocol.getCharge() < 99) {
                    continue;
                }
                // 2号充电桩
                if (value.equals(SteChargeType.SECOND) && devpThread.charge1) {
                if (steProtocol.getMode() == 0) {
                    continue;
                }
                // 3号充电桩
                if (value.equals(SteChargeType.THIRD) && devpThread.charge2) {
                if (!steProtocol.getStatusType().equals(SteStatusType.IDLE)) {
                    continue;
                }
                // 小车是否处于充电状态
                if (steProtocol.getChargeStatus() == 1) {
                    continue;
                }
//                // 1号充电桩
//                if (value.equals(SteChargeType.FIRST) && devpThread.charge0) {
//                    continue;
//                }
//                // 2号充电桩
//                if (value.equals(SteChargeType.SECOND) && devpThread.charge1) {
//                    continue;
//                }
//                // 3号充电桩
//                if (value.equals(SteChargeType.THIRD) && devpThread.charge2) {
//                    continue;
//                }
//                // 小车是否处于充电状态
//                if (steProtocol.getChargeStatus() == 1) {
//                    continue;
//                }
                // case 1 : 自动充电开   馈电      ×
                // case 2 : 自动充电开   满电      ✔
                // case 3 : 自动充电关   馈电      ✔
@@ -2860,6 +2946,10 @@
                } else {
                    // 固定堆垛机
                    int crnNo = 1;
                    if (null != wrkMastMapper.selectWorkingByCrn(crnNo)) {
                        return;
                    }
                    LocMast channelLoc = locMastService.selectById(channelLocNo);
                    CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnNo);
@@ -2873,7 +2963,7 @@
                        crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号
                        crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                        crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转
                        crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());     // 源库位排
                        crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排
                        crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列
                        crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层
                        crnCommand.setDestinationPosX(Utils.getGroupRow(channelLoc.getLocNo(), false).shortValue());     // 目标库位排
@@ -2924,6 +3014,10 @@
                }
            }
        } else if (wrkCharge.getWrkSts() == 45L) {
            if (null != wrkMastMapper.selectWorkingByCrn(wrkCharge.getCrnNo())) {
                return;
            }
            LocMast idleLoc = locMastService.selectById(basSte.getIdleLoc());
            Integer otherSte = existOtherSte(idleLoc.getLocNo(), wrkCharge.getSteNo());