dubin
9 天以前 c0fc45a7cd97c2ded531b85575e6f26ff269db1b
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -140,8 +140,9 @@
                // 尺寸检测异常
                boolean back = false;
                String errMsg = "";
                boolean fail = false;
                // 检测是否有出库任务 如果有出库任务 入库就停止
                List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no",1).in("wrk_sts", 11, 12));
                List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", 12).in("io_type",101,103,104,107,110));
                // 检测104站(堆垛机出库站 入库站)是否有物 如果有物没有工作号 入库停止 如果有物工作号是出库 入库停止 如果有物工作号是入库 可以入库 如果有物工作号不存在 入库停止
                StaProtocol staProtocol104 = devpThread.getStation().get(104);
                if (staProtocol104 == null){
@@ -149,9 +150,25 @@
                    continue;
                }
                //104站有物 有工作号 判断这个任务的类型
                WrkMast wrkMast1 = new WrkMast();
                WrkMast wrkMast1 = null;
                if (staProtocol104.isLoading() && staProtocol104.getWorkNo() != 0){
                    wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", staProtocol104.getWorkNo()));
                }
                if (wrkMast1 != null){
                    if (wrkMast1.getIoType() > 100){
                        fail = true;
                    }
                }
                // 检测102站是否有物  有物继续向下执行
                if (!staProtocol.isLoading()){
                    continue;
                }
                // 如果工作号不是 9999 (入库任务) 不向下执行
                if (staProtocol.getWorkNo() != 9999){
                    continue;
                }
                if (staProtocol.isFrontErr()) {
@@ -187,20 +204,20 @@
                    errMsg = "托盘码格式有误--->" + barcode;
                    back = true;
                }
                if (!back && (!barcode.startsWith("5") &&  !barcode.startsWith("6") &&  !barcode.startsWith("7") && !barcode.startsWith("8"))) {
                if (!back && (!barcode.startsWith("5") && !barcode.startsWith("6") &&  !barcode.startsWith("7") && !barcode.startsWith("8"))) {
                    errMsg = "托盘码格式有误--->" + barcode;
                    back = true;
                }
                if (!back && !wrkMastList.isEmpty()) {
                    errMsg = "有出库任务,入库停止";
                    errMsg = "堆垛机有出库任务,入库停止";
                    back = true;
                }if (!back && staProtocol104.isLoading() && staProtocol104.getWorkNo() == 0 && (barcode.startsWith("6") || barcode.startsWith("5"))){
                    errMsg = "104站有物但是无工作号,请检查";
                    back = true;
                }if (!back && (!Cools.isEmpty(wrkMast1) && wrkMast1.getIoType() > 100)){
                    errMsg = "有出库任务,入库停止";
                }if (!back && ((wrkMast1 != null && fail))){
                    errMsg = "1号堆垛机有出库任务,入库停止";
                    back = true;
                }if (!back && (staProtocol104.isLoading() && Cools.isEmpty(wrkMast1)) && (barcode.startsWith("5") || barcode.startsWith("6"))){
                }if (!back && (staProtocol104.isLoading() && wrkMast1 == null) && (barcode.startsWith("5") || barcode.startsWith("6"))){
                    errMsg = "104站有物但是对应的工作号无工作档,请检查";
                    back = true;
                }
@@ -259,7 +276,7 @@
                    }
                    WrkMast checkPick = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                            .eq("barcode", barcode)
                            .in("io_type", 107, 103, 57));
                            .in("io_type", 107, 103, 104));
                    if (!Cools.isEmpty(checkPick)) {
                        continue;
                    }
@@ -267,12 +284,12 @@
                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                        SearchLocParam param = new SearchLocParam();
                        locTypeDto.setLocType1((short) 1);
                        locTypeDto.setLocType1(staProtocol.toSqlModel().getLocType1());
                        param.setBarcode(barcode);
                        param.setIoType(1);
                        param.setSourceStaNo(inSta.getStaNo());
                        param.setLocType1(locTypeDto.getLocType1()); // 高低
                        param.setWeight(staProtocol.getWeight());
                        param.setWeight(staProtocol.getWeight()); // 重量
                        String response = new HttpHandler.Builder()
                                .setTimeout(30,TimeUnit.SECONDS)
                                .setUri(wmsUrl)
@@ -420,8 +437,16 @@
//                    News.error("站点信息未获得");
                    continue;
                }
                // 检测102站是否有物 有物继续向下执行
                if (!staProtocol.isLoading()){
                    continue;
                }
                // 如果工作号不是 9999 (入库任务) 不向下执行
                if (staProtocol.getWorkNo() != 9999){
                    continue;
                }
                // 检测是否有出库任务 如果有出库任务 入库就停止
                List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", 1).in("wrk_sts", 11, 12));
                List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", 12).in("io_type",101,103,104,107,110));
                // 检测104站(堆垛机出库站 入库站)是否有物 如果有物没有工作号 入库停止 如果有物工作号是出库 入库停止 如果有物工作号是入库 可以入库 如果有物工作号不存在 入库停止
                StaProtocol staProtocol104 = devpThread.getStation().get(104);
                if (staProtocol104 == null){
@@ -429,13 +454,21 @@
                    continue;
                }
                //104站有物 有工作号 判断这个任务的类型
                WrkMast wrkMast1 = new WrkMast();
                WrkMast wrkMast1 = null;
                if (staProtocol104.isLoading() && staProtocol104.getWorkNo() != 0){
                    wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", staProtocol104.getWorkNo()));
                }
                // 尺寸检测异常
                boolean back = false;
                boolean fail = false;
                String errMsg = "";
                if (wrkMast1 != null){
                    if (wrkMast1.getIoType() > 100){
                        fail = true;
                    }
                }
                if (staProtocol.isFrontErr()) {
                    errMsg = "前超限";
                    back = true;
@@ -474,13 +507,13 @@
                    back = true;
                }
                if (!back && !wrkMastList.isEmpty()) {
                    errMsg = "有出库任务,入库停止";
                    errMsg = "堆垛机有出库任务,入库停止";
                    back = true;
                }if (!back && staProtocol104.isLoading() && staProtocol104.getWorkNo() == 0 && (barcode.startsWith("6") || barcode.startsWith("5"))){
                    errMsg = "104站有物但是无工作号,请检查";
                    back = true;
                }if (!back && (!Cools.isEmpty(wrkMast1) && wrkMast1.getIoType() > 100)){
                    errMsg = "有出库任务,入库停止";
                }if (!back && (wrkMast1 != null && fail)){
                    errMsg = "1号堆垛机有出库任务,入库停止";
                    back = true;
                }if (!back && (staProtocol104.isLoading() && Cools.isEmpty(wrkMast1)) && (barcode.startsWith("5") || barcode.startsWith("6"))){
                    errMsg = "104站有物但是对应的工作号无工作档,请检查";
@@ -511,27 +544,6 @@
                    }
                    continue;
                }
//                if(staProtocol.getSiteId() < 400){
//                    if (!Cools.isEmpty(barcode)) {
//                        News.infoNoLog("" + mark + " - 1" + " - {}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode);
//                        if ("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
//                            continue;
//                        }
//                    } else {
//                        continue;
//                    }
//
//
//                    if (!Cools.isEmpty(barcode)) {
//                    News.info(""+mark+" - 1"+" - {}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode);
//                        if ("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
//                            continue;
//                        }
//                    } else {
//                        continue;
//                    }
//
//                }
                if (staProtocol == null) {
@@ -818,6 +830,34 @@
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                //判断是不是2号堆垛机的106出库站
                if (staProtocol.getSiteId() == 106 && staProtocol.isLoading()){
                    CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, 2);
                    CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                    if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) {
                        // 移动中
                        continue;
                    }
                    if (crnProtocol.modeType == CrnModeType.AUTO
                            && crnProtocol.statusType == CrnStatusType.WAITING
                            && crnProtocol.forkPosType == CrnForkPosType.HOME){
                        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", crnProtocol.getTaskNo()).eq("wrk_sts",12));
                        if (wrkMast == null){
                            News.errorNoLog("2号堆垛机等待确认的工作档不存在");
                            continue;
                        }
                        wrkMast.setWrkSts(14L);
                        wrkMast.setCrnEndTime(new Date());
                        if (wrkMastMapper.updateById(wrkMast) != 0) {
                            // 复位堆垛机
                            log.error("出库任务完成下发堆垛机复位,{}", wrkMast.getWrkNo());
                            crnThread.setResetFlag(true);
                        } else {
                            News.error("" + mark + " - 1" + " - 更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo());
                        }
                        break;
                    }
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) {
                    // 查询工作档
@@ -1191,6 +1231,7 @@
            crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
            crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 源库位排
            crnCommand.setSourcePosY(crnStn.getBay().shortValue());     // 源库位列
//            crnCommand.setSourcePosY((short)(wrkMast.getBarcode().startsWith("7")? 0:1));     // 源库位列
            crnCommand.setSourcePosZ(crnStn.getLev().shortValue());     // 源库位层
            crnCommand.setDestinationPosX((short) (locMast.getRow1() + slave.getOffset()));     // 目标库位排
            crnCommand.setDestinationPosY((short) (locMast.getBay1() + slave.getOffset()));     // 目标库位列
@@ -1235,6 +1276,9 @@
            // 获取工作状态为11(生成出库ID)的出库工作档
//            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo());
            List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo());
            if (wrkMasts.isEmpty()) {
                wrkMasts = wrkMastMapper.selectPakOutStep11To2(slave.getId(), 103);
            }
            for (WrkMast wrkMast : wrkMasts) {
                 if (wrkMast == null) {
                    continue;
@@ -1252,12 +1296,28 @@
                }
                // 获取堆垛机出库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                StaProtocol staProtocol = devpThread.getStation().get(wrkMast.getSourceStaNo());
                if (staProtocol == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol);
                    break;
                } else {
                    staProtocol = staProtocol.clone();
                }
                //工作档目标站为101 且 101有物  目标站为101 且工作档状态为12 15 14 停止给堆垛机下全板出库以外的任务
                if (wrkMast.getStaNo() == 101){
                    List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("sta_no", 101).in("wrk_sts", 12, 14, 15));
                    StaProtocol staProtocol101 = devpThread.getStation().get(101);
                    StaProtocol staProtocol102 = devpThread.getStation().get(102);
                    StaProtocol staProtocol103 = devpThread.getStation().get(103);
                    if (staProtocol101 == null) {
                        News.infoNoLog("" + mark + " - 2" + " - 3" + " - 工作档目标站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol);
                        break;
                    } else {
                        staProtocol101 = staProtocol101.clone();
                    }
                    if (staProtocol101.isLoading() || !Cools.isEmpty(wrkMastList) || staProtocol101.getWorkNo() != 0 || staProtocol102.isLoading() || staProtocol102.getWorkNo() != 0 || staProtocol103.isLoading() || staProtocol103.getWorkNo() != 0){
                        break;
                    }
                }
//                StaProtocol staProtocol1 = staProtocol.getSiteId()==101?devpThread.getStation().get(crnStn.getStaNo() + 1):devpThread.getStation().get(crnStn.getStaNo() - 1);
//                StaProtocol staProtocol1 = devpThread.getStation().get(crnStn.getStaNo() - 1);
@@ -1386,17 +1446,32 @@
                    // 1.堆垛机开始移动
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
//                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX((short) (sourceSta.getRow1() + slave.getOffset()));     // 源库位排
                    crnCommand.setSourcePosY((short) (sourceSta.getBay1() + slave.getOffset()));     // 源库位列
                    crnCommand.setSourcePosZ((short) (sourceSta.getLev1() + slave.getOffset()));     // 源库位层
                    crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排
                    crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列
                    crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层
                    crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    if (wrkMast.getCrnNo() == 2){
                        crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                        crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
//                      crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                        crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                        crnCommand.setSourcePosX((short) (sourceSta.getRow1() + slave.getOffset()));     // 源库位排
                        crnCommand.setSourcePosY((short) (sourceSta.getBay1() + slave.getOffset()));     // 源库位列
                        crnCommand.setSourcePosZ((short) (sourceSta.getLev1() + slave.getOffset()));     // 源库位层
                        crnCommand.setDestinationPosX(wrkMast.getIoType() == 101? crnStn.getRow().shortValue() : 3);     // 目标库位排
//                        crnCommand.setDestinationPosY((short)(Utils.getLev(wrkMast.getSourceLocNo()) <= 2? 0 : 1));     // 目标库位列
                        crnCommand.setDestinationPosY((short)1);     // 目标库位列
                        crnCommand.setDestinationPosZ((short)1);     // 目标库位层
                        crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    }else {
                        crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                        crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
//                      crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                        crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                        crnCommand.setSourcePosX((short) (sourceSta.getRow1() + slave.getOffset()));     // 源库位排
                        crnCommand.setSourcePosY((short) (sourceSta.getBay1() + slave.getOffset()));     // 源库位列
                        crnCommand.setSourcePosZ((short) (sourceSta.getLev1() + slave.getOffset()));     // 源库位层
                        crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排
                        crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列
                        crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层
                        crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    }
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                        News.error("" + mark + " - 2" + " - 13" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
@@ -1816,12 +1891,16 @@
                if (!staProtocol.isLoading()) {
                    continue;
                }
                // 如果工作号不是 9998 (入库任务) 不向下执行
                if (staProtocol.getWorkNo() != 9998){
                    continue;
                }
                // 尺寸检测异常
                boolean back = false;
                String errMsg = "";
                // 检测是否有出库任务 如果有出库任务 入库就停止
                List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no",1).in("wrk_sts", 11, 12));
                List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type",101,103,104,107,110).in("wrk_sts", 12));
                // 检测104站(堆垛机出库站 入库站)是否有物 如果有物没有工作号 入库停止 如果有物工作号是出库 入库停止 如果有物工作号是入库 可以入库 如果有物工作号不存在 入库停止
                StaProtocol staProtocol104 = devpThread.getStation().get(104);
                if (staProtocol104 == null){
@@ -1829,7 +1908,7 @@
                    continue;
                }
                //104站有物 有工作号 判断这个任务的类型
                WrkMast wrkMast1 = new WrkMast();
                WrkMast wrkMast1 = null;
                if (staProtocol104.isLoading() && staProtocol104.getWorkNo() != 0){
                    wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", staProtocol104.getWorkNo()));
                }
@@ -1843,15 +1922,15 @@
                    back = true;
                }
                if (!back && !wrkMastList.isEmpty()) {
                    errMsg = "有出库任务,入库停止";
                    errMsg = "堆垛机有出库任务,入库停止";
                    back = true;
                }if (!back && staProtocol104.isLoading() && staProtocol104.getWorkNo() == 0 && (barcode.startsWith("5") || barcode.startsWith("6"))){ // 104虽然有物没有工作号 但是如果102的货物要进的是2号堆垛机 不能阻拦 (1号堆垛机条码 5xxx 6xxx   2号堆垛机 7xxx 8xxx)
                    errMsg = "104站有物但是无工作号,请检查";
                    back = true;
                }if (!back && (!Cools.isEmpty(wrkMast1) && wrkMast1.getIoType() > 100)){
                    errMsg = "有出库任务,入库停止";
                }if (!back && (wrkMast1 != null && wrkMast1.getIoType() > 100)){
                    errMsg = "1号堆垛机有出库任务,入库停止";
                    back = true;
                }if (!back && (staProtocol104.isLoading() && Cools.isEmpty(wrkMast1)) && (barcode.startsWith("5") || barcode.startsWith("6"))){ // 同上
                }if (!back && (staProtocol104.isLoading() && wrkMast1 == null) && (barcode.startsWith("5") || barcode.startsWith("6"))){ // 同上
                    errMsg = "104站有物但是对应的工作号无工作档,请检查";
                    back = true;
                }
@@ -1872,7 +1951,7 @@
                    staProtocol.setStaNo(emptyInSta.getBackSta().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    log.error("输送线下发(正在执行出库任务 空板入库暂停):" + wrkNo + "," + emptyInSta.getBackSta());
                    log.error("输送线下发:" + wrkNo + "," + emptyInSta.getBackSta());
                    break;//托盘退回不生成工作档
                }
                // 站点条件判断
@@ -1881,14 +1960,14 @@
                        && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk()
                        && staProtocol.isPakMk()
                        && (staProtocol.getWorkNo() != 0 && staProtocol.getWorkNo() > 9700)
                        && staProtocol.getWorkNo() == 9998
                ) {
                    News.warnNoLog("" + mark + " - 0" + " - 开始执行:空栈板初始化入库,叉车入库站放货");
                    try {
                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                        SearchLocParam param = new SearchLocParam();
                        locTypeDto.setLocType1((short) 1);
                        locTypeDto.setLocType1(staProtocol.toSqlModel().getLocType1());
                        param.setIoType(10);
                        param.setSourceStaNo(emptyInSta.getStaNo());
                        param.setLocType1(locTypeDto.getLocType1());
@@ -1971,8 +2050,7 @@
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
            // 命令集合
            List<LedCommand> commands = new ArrayList<>();
            // 工作档集合
            List<WrkMast> wrkMasts = new ArrayList<>();
            List<Integer> workNoList = new ArrayList<>();
            for (Integer staNo : led.getStaArr()) {
                // 获取叉车站点
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
@@ -1981,32 +2059,42 @@
                } else {
                    staProtocol = staProtocol.clone();
                }
                Integer wrkNo = null;
                Integer ioType = null;
                Integer targetStaNo = null;
                String sourceLocNo = null;
                String locNo = null;
                String barcode = null;
                // 获取条码扫描仪信息
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, staNo);
                // 获取工作档数据
                WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
                if (null == wrkMast) {
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",staProtocol.getWorkNo()));
                if (wrkMast == null && barcodeThread != null) {
                    wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode",barcodeThread.getBarcode()));
                }
                if (wrkMast == null){
                    continue;
                }
                wrkMasts.add(wrkMast);
                wrkNo = wrkMast.getWrkNo();
                ioType = wrkMast.getIoType();
                sourceLocNo = wrkMast.getSourceLocNo();
                locNo = wrkMast.getLocNo();
                targetStaNo = wrkMast.getStaNo();
                barcode = wrkMast.getBarcode();
                News.warnNoLog("" + mark + " - 0" + " - 开始执行:出库  ===>> 工作档信息写入led显示器");
                workNoList.add(wrkNo);
                // 组装命令
                LedCommand ledCommand = new LedCommand();
                ledCommand.setWorkNo(wrkMast.getWrkNo());
                ledCommand.setIoType(wrkMast.getIoType());
                ledCommand.setWorkNo(wrkNo);
                ledCommand.setIoType(ioType);
                // 出库模式
                switch (wrkMast.getIoType()) {
                switch (ioType) {
                    case 1:
                        ledCommand.setTitle("全板入库");
                        break;
                    case 10:
                        ledCommand.setTitle("空板入库");
                        break;
                    case 53:
                        ledCommand.setTitle("拣料再入库");
                        break;
                    case 54:
                        ledCommand.setTitle("并板再入库");
                        break;
                    case 57:
                        ledCommand.setTitle("盘点再入库");
                        break;
                    case 101:
                        ledCommand.setTitle("全板出库");
@@ -2024,60 +2112,130 @@
                        ledCommand.setTitle("空板出库");
                        ledCommand.setEmptyMk(true);
                        break;
                    case 53:
                        ledCommand.setTitle("拣料入库");
                        break;
                    case 57:
                        ledCommand.setTitle("盘点入库");
                        break;
                    case 54:
                        ledCommand.setTitle("并板入库");
                        break;
                    default:
                        News.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType());
                        News.error("" + mark + " - 1" + " - 任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkNo, ioType);
                        break;
                }
                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
                ledCommand.setStaNo(wrkMast.getStaNo());
                ledCommand.setBarcode(wrkMast.getBarcode());
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo());
                ledCommand.setSourceLocNo(sourceLocNo);
                ledCommand.setLocNo(locNo);
                ledCommand.setStaNo(targetStaNo);
                ledCommand.setBarcode(barcode);
                    wrkDetls.forEach(wrkDetl -> {
                        Double total = 0.0;
                        EntityWrapper<LocDetl> wrapper = new EntityWrapper<>();
                        LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr()));
                        if (Cools.isEmpty(locDetl)) {
                            total = wrkDetl.getAnfme();
                        } else {
                            total = locDetl.getAnfme();
                // 修改开始:处理多个wrkDetl,不合并
                if (ioType != 110 && ioType != 10) {
                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkNo);
                    if (!wrkDetls.isEmpty()) {
                        // 获取库存信息
                        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
                                .eq("loc_no", wrkMast.getSourceLocNo()));
                        double totalAnfme = 0D;
                        double totalWeight = 0D;
                        for (LocDetl locDetl : locDetls) {
                            totalAnfme += locDetl.getAnfme();
//                        totalWeight += locDetl.getWeight();
                        }
                        if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1 || wrkMast.getIoType() == 53 || wrkMast.getIoType() == 57||wrkMast.getIoType() == 54) {
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getOrderNo(),wrkDetl.getOutOrderNo(),wrkDetl.getUnit(),wrkDetl.getWeight(),wrkDetl.getSupp(),wrkDetl.getLength() ,wrkDetl.getTemp1(), wrkDetl.getProType(),wrkDetl.getAnfme(),wrkDetl.getTemp2(), total));
                        // 为每个WrkDetl创建独立的MatDto
                        for (WrkDetl wrkDetl : wrkDetls) {
                            // 注意:这里使用每个wrkDetl的原始数据,不合并
                            ledCommand.getMatDtos().add(new MatDto(
                                    wrkDetl.getMatnr()
                                    , wrkDetl.getMaktx()
                                    , wrkDetl.getAnfme()  // 使用单个物料的数量,不累加
                                    , wrkDetl.getWeight() // 使用单个物料的重量,不累加
                                    , totalAnfme          // 库存总数(这个是正常的)
                                    , totalWeight         // 库存总重量(这个是正常的)
                                    , wrkDetl.getSpecs()
                                    , wrkDetl.getSku()
                                    , wrkDetl.getZpallet()
                                    , wrkDetl.getModel()
                                    , wrkDetl.getSupp()
                                    , wrkDetl.getBarcode()
                                    , wrkDetl.getOrderNo()
                                    , wrkDetl.getBatch()
//                                , wrkDetl.getCstateid$()
                            ));
                        }
                        if (wrkMast.getIoType() == 103 ) {
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getOrderNo(),wrkDetl.getOutOrderNo(),wrkDetl.getUnit(),wrkDetl.getWeight(),wrkDetl.getSupp(),wrkDetl.getLength() ,wrkDetl.getTemp1(), wrkDetl.getProType(),wrkDetl.getAnfme(),wrkDetl.getTemp2(), total));
                        }
                        if (wrkMast.getIoType() == 107||wrkMast.getIoType()==104) {
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getOrderNo(),wrkDetl.getOutOrderNo(),wrkDetl.getUnit(),wrkDetl.getWeight(),wrkDetl.getSupp(),wrkDetl.getLength() ,wrkDetl.getTemp1(), wrkDetl.getProType(),wrkDetl.getAnfme(),wrkDetl.getTemp2(), total));
                        }
                    });
                    } else {
//                        List<WrkDetlLog> wrkDetlLogs = wrkDetlLogService.selectTodayByWrkNo(wrkNo);
//                        if (!wrkDetlLogs.isEmpty()) {
//                            // 获取库存信息
//                            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
//                                    .eq("loc_no", sourceLocNo));
//                            double totalAnfme = 0D;
//                            double totalWeight = 0D;
//                            for (LocDetl locDetl : locDetls) {
//                                totalAnfme += locDetl.getAnfme();
//                                totalWeight += locDetl.getWeight();
//                            }
//
//                            // 为每个WrkDetlLog创建独立的MatDto
//                            for (WrkDetlLog wrkDetlLog : wrkDetlLogs) {
//                                // 注意:这里使用每个wrkDetlLog的原始数据,不合并
//                                ledCommand.getMatDtos().add(new MatDto(
//                                        wrkDetlLog.getMatnr()
//                                        , wrkDetlLog.getMaktx()
//                                        , wrkDetlLog.getAnfme()  // 使用单个物料的数量,不累加
//                                        , wrkDetlLog.getWeight() // 使用单个物料的重量,不累加
//                                        , totalAnfme              // 库存总数
//                                        , totalWeight             // 库存总重量
//                                        , wrkDetlLog.getSpecs()
//                                        , wrkDetlLog.getSku()
//                                        , wrkDetlLog.getZpallet()
//                                        , wrkDetlLog.getModel()
//                                        , wrkDetlLog.getSupp()
//                                        , wrkDetlLog.getKpCstmrName()
//                                        , wrkDetlLog.getOrderNo()
//                                        , wrkDetlLog.getBatch()
////                                    , wrkDetlLog.getCstateid$()
//                                ));
//                            }
//                        }
                    }
                }
                // 修改结束
                commands.add(ledCommand);
            }
            Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet());
            Set<Integer> workNos = new HashSet<>(workNoList);
            // 获取LED线程
            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
            // 相同工作号集合则过滤
            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
                continue;
            }
            // 命令下发 -------------------------------------------------------------------------------
            if (!commands.isEmpty()) {
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) {
                    News.error("{}号LED显示内容命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    News.error("{}号LED命令下发失败--->出库!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    continue;
                } else {
                    ledThread.setLedMk(false);
                }
            }
            try {
                // 修改主档led标记
                for (WrkMast wrkMast : wrkMasts) {
                    wrkMast.setOveMk("Y");
                    wrkMast.setModiTime(new Date());
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        throw new CoolException("更新工作档失败");
                for (Integer wrkNo : workNoList) {
                    WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkNo));
                    if (wrkMast != null) {
                        wrkMast.setOveMk("Y");
                        wrkMast.setModiTime(new Date());
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            News.errorNoLog("" + mark + " - 4" + " - 更新工作档失败");
                            throw new CoolException("更新工作档失败");
                        }
                    }
                }
@@ -2090,6 +2248,7 @@
            }
        }
        News.infoNoLog("" + mark + " - 0" + " - 出库  ===>> 工作档信息写入led显示器执行完成");
    }
    /**
@@ -2353,8 +2512,13 @@
                    }
                    LocMast sourceLoc = locMastService.queryDemoSourceLoc(crn.getId());
                    LocMast loc = locMastService.queryDemoLoc(crn.getId(),sourceLoc.getLocType2().toString());
                    if (null == sourceLoc || null == loc) {
                    LocMast loc = locMastService.queryDemoLoc(crn.getId());
                    if (null == sourceLoc) {
                        continue;
                    }
                    if (null == loc) {
                        log.error("库位已全部标记");
                        continue;
                    }
@@ -2413,6 +2577,7 @@
                    if (loc.getLocSts().equals("O")) {
                        loc.setLocSts("S"); // S.入库预约
                        loc.setModiTime(new Date());
                        loc.setLocType2((short) 1); // 标记
                        if (!locMastService.updateById(loc)) {
                            throw new CoolException("更新目标库位状态失败");
                        }
@@ -3365,7 +3530,10 @@
            }
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                if (crnProtocol.getBay()==0 && crnProtocol.getLevel() == 1) {
                if (crnProtocol.getBay()==1 && crnProtocol.getLevel() == 1 && crnProtocol.getCrnNo() == 1) {
                    continue;
                }
                if (crnProtocol.getCrnNo() == 2 && crnProtocol.getLevel() == 1 && (crnProtocol.getBay() == 0 || crnProtocol.getBay() == 1)){
                    continue;
                }
                Page<BasCrnOpt> basCrnOptPage = crnOptService.selectPage(new Page<>(1, 1), new EntityWrapper<BasCrnOpt>().eq("crn_no", crn.getId()).orderBy("send_time", false));
@@ -3410,7 +3578,7 @@
//                    crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式:  堆垛机移动
                    crnCommand.setTaskMode(CrnTaskModeType.X_MOVE);//余姚锐麒回原点任务模式:  站位转移
                    crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 源库位排
                    crnCommand.setSourcePosY((short) 0);     // 源库位列
                    crnCommand.setSourcePosY((short) 1);     // 源库位列
                    crnCommand.setSourcePosZ((short) 1);     // 源库位层
                    crnCommand.setDestinationPosX((short) 0);     // 目标库位排
                    crnCommand.setDestinationPosY((short) 0);     // 目标库位列