lty
3 天以前 09f634c766e8daeeb687d48fd645f225afc3c082
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -50,7 +50,9 @@
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -554,168 +556,203 @@
//
//    }
    // 静态线程安全Set,用于存储正在调用接口的工位号
    private static final Set<Integer> callingStations = ConcurrentHashMap.newKeySet();
    public synchronized void generateStoreWrkFile(Integer mark) {
        String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
        final Set<String> INVALID_BARCODES = new HashSet<>(Arrays.asList("NG", "NoRead", "00000000"));
        for (DevpSlave devp : slaveProperties.getDevp()) {
            for (DevpSlave.Sta inSta : devp.getInSta()) {
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                StaProtocol staProtocolIn = devpThread.getStation().get(inSta.getStaNo() - 1);
                // 【判断工位是否正在调用接口,跳过正在调用的】
                int staNo = inSta.getStaNo();
                if (!callingStations.add(staNo)) {
                    // 如果已存在调用中,跳过
                    log.info("工位{}接口调用中,跳过本次", staNo);
                    continue;
                }
                if (staProtocolIn == null || barcodeThread == null) continue;
                staProtocolIn = staProtocolIn.clone();
                String barcode = barcodeThread.getBarcode();
                try {
                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                    LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                // 如果前工位有货 + 扫码器有条码
                if (staProtocolIn.getStamp() == 1 && barcode != null && !barcode.isEmpty()) {
                    if (wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                            .eq("barcode", barcode)
                            .in("io_type", 107, 103, 57)) != null) {
                        continue;
                    }
                    StaProtocol staProtocol = devpThread.getStation().get(staNo);
                    StaProtocol staProtocolIn = devpThread.getStation().get(staNo - 1);
                    try {
                        SearchLocParam param = new SearchLocParam();
                        param.setBarcode(barcode);
                        param.setIoType(1);
                        param.setSourceStaNo(inSta.getStaNo());
                        param.setLocType1((short) 1);
                        param.setWeight(staProtocolIn.getWeight());
                    if (staProtocolIn == null || barcodeThread == null) continue;
                    staProtocolIn = staProtocolIn.clone();
                    String barcode = barcodeThread.getBarcode();
                        String response = new HttpHandler.Builder()
                                .setTimeout(30, TimeUnit.SECONDS)
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/loc/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        JSONObject json = JSON.parseObject(response);
                        if (json.getInteger("code").equals(200)) {
                            StartupDto dto = json.getObject("data", StartupDto.class);
                            barcodeThread.setBarcode("");
                            staProtocolIn.setWorkNo(dto.getWorkNo());
                            devpThread.setPakMk(staProtocolIn.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocolIn));
                            ledThread.errorReset();
                            log.error("工作号下发2:" + dto.getWorkNo() + "," + dto.getStaNo());
                            if (!result) {
                                News.error(methodName + ":更新plc站点信息失败");
                                throw new CoolException("更新plc站点信息失败");
                            }
                    // 如果前工位有货 + 扫码器有条码
                    if (staProtocolIn.getStamp() == 1 && !barcode.equals("00000000") && !barcode.isEmpty()) {
                        log.info("生成信号时间: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
                        if (wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                                .eq("barcode", barcode)
                                .in("io_type", 107, 103, 57)) != null) {
                            continue;
                        }
                    } catch (Exception e) {
                        log.error("组托任务异常:", e);
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                    continue;
                }
                        try {
                // 尺寸/重量/扫码异常检测
                if (staProtocol == null) continue;
                staProtocol = staProtocol.clone();
                boolean back = false;
                String errMsg = "";
                if (staProtocol.isFrontErr()) { errMsg = "前超限"; back = true; }
                else if (staProtocol.isBackErr()) { errMsg = "后超限"; back = true; }
                else if (staProtocol.isHighErr()) { errMsg = "高超限"; back = true; }
                else if (staProtocol.isLeftErr()) { errMsg = "左超限"; back = true; }
                else if (staProtocol.isRightErr()) { errMsg = "右超限"; back = true; }
                else if (staProtocol.getWeight() > 1000) { errMsg = "超重或未读取"; back = true; }
                else if (staProtocol.isBarcodeErr()) { errMsg = "扫码失败"; back = true; }
                            SearchLocParam param = new SearchLocParam();
                            param.setBarcode(barcode);
                            param.setIoType(1);
                            param.setSourceStaNo(staNo);
                            param.setLocType1((short) 1);
                            param.setWeight(staProtocol.getWeight());
                // 尺寸异常回退
                if (back) {
                    log.info("errmsg: " + errMsg);
                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                            String response = new HttpHandler.Builder()
                                    .setTimeout(30, TimeUnit.SECONDS)
                                    .setUri(wmsUrl)
                                    .setPath("/rpc/pakin/loc/v1")
                                    .setJson(JSON.toJSONString(param))
                                    .build()
                                    .doPost();
                    if (!staProtocol.isLoading() || !staProtocol.isPakMk()) continue;
                    staProtocol.setWorkNo(wrkNo++);
                    staProtocol.setStaNo(inSta.getBackSta().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    log.error("输送线下发1:" + wrkNo + "," + inSta.getBackSta());
                    continue;
                }
                            JSONObject json = JSON.parseObject(response);
                            if (json.getInteger("code").equals(200)) {
                                StartupDto dto = json.getObject("data", StartupDto.class);
                                barcodeThread.setBarcode("");
                                staProtocolIn.setWorkNo(dto.getWorkNo());
                                devpThread.setPakMk(staProtocolIn.getSiteId(), false);
                                boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocolIn));
                                log.info("生成任务时间: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
                // 入库条件满足,开始请求入库地址
                if (staProtocol.isAutoing() && staProtocol.isLoading()
                        && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && staProtocol.isPakMk()) {
                                ledThread.errorReset();
                                log.error("工作号下发2:" + dto.getWorkNo() + "," + dto.getStaNo());
                    if (Cools.isEmpty(barcode) || INVALID_BARCODES.contains(barcode)) {
                        News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                        staProtocol.setWorkNo(wrkNo++);
                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        log.error("输送线下发1:{} , {}", wrkNo, inSta.getBackSta());
                        continue;
                    }
                    if (wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode) != null ||
                            wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                                    .eq("barcode", barcode)
                                    .in("io_type", 107, 103, 57)) != null) {
                        News.error(barcode + "条码已存在状态为(2.设备上走)的数据,请查看WCS输送线界面");
                        continue;
                    }
                    try {
                        SearchLocParam param = new SearchLocParam();
                        param.setBarcode(barcode);
                        param.setIoType(1);
                        param.setSourceStaNo(inSta.getStaNo());
                        param.setLocType1((short) 1);
                        param.setWeight(staProtocol.getWeight());
                        String response = new HttpHandler.Builder()
                                .setTimeout(30, TimeUnit.SECONDS)
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/loc/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        JSONObject json = JSON.parseObject(response);
                        if (json.getInteger("code").equals(200)) {
                            StartupDto dto = json.getObject("data", StartupDto.class);
                            barcodeThread.setBarcode("");
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            ledThread.errorReset();
                            log.error("输送线下发2:" + dto.getWorkNo() + "," + dto.getStaNo());
                            if (!result) {
                                News.error(methodName + ":更新plc站点信息失败");
                                throw new CoolException("更新plc站点信息失败");
                            }
                        } else {
                            String msg = json.getString("msg");
                            if (!"工作档已存在".equals(msg)) {
                                staProtocol.setWorkNo(wrkNo++);
                                staProtocol.setStaNo(inSta.getBackSta().shortValue());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                log.error("输送线下发2:" + staProtocol.getWorkNo() + "," + staProtocol.getStaNo());
                                if (!Cools.isEmpty(msg)) {
                                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, msg));
                                if (!result) {
                                    News.error(methodName + ":更新plc站点信息失败");
                                    throw new CoolException("更新plc站点信息失败");
                                }
                            } else {
                                String msg = json.getString("msg");
                                if (!"工作档已存在".equals(msg) && staProtocol.getWorkNo()<9999) {
                                    staProtocol.setWorkNo(wrkNo++);
                                    staProtocol.setStaNo(inSta.getBackSta().shortValue());
                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    log.error("输送线下发2:" + staProtocol.getWorkNo() + "," + staProtocol.getStaNo());
                                    if (!Cools.isEmpty(msg)) {
                                        MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, msg));
                                    }
                                }
                            }
                        } catch (Exception e) {
                            log.error("组托任务异常:", e);
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        }
                    } catch (Exception e) {
                        log.error("组托任务异常:", e);
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        continue;
                    } else {
                        // 尺寸/重量/扫码异常检测
                        if (staProtocol == null) continue;
                        staProtocol = staProtocol.clone();
                        boolean back = false;
                        String errMsg = "";
                        if (staProtocol.isFrontErr()) { errMsg = "前超限"; back = true; }
                        else if (staProtocol.isBackErr()) { errMsg = "后超限"; back = true; }
                        else if (staProtocol.isHighErr()) { errMsg = "高超限"; back = true; }
                        else if (staProtocol.isLeftErr()) { errMsg = "左超限"; back = true; }
                        else if (staProtocol.isRightErr()) { errMsg = "右超限"; back = true; }
                        else if (staProtocol.getWeight() > 1000) { errMsg = "超重或未读取"; back = true; }
                        else if (staProtocol.isBarcodeErr()) { errMsg = "扫码失败"; back = true; }
                        // 尺寸异常回退
                        if (back && staProtocol.getWorkNo() <9999) {
//                            log.info("errmsg: " + errMsg);
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                            if (!staProtocol.isLoading() || !staProtocol.isPakMk()) continue;
                            staProtocol.setWorkNo(wrkNo++);
                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("输送线下发1:" + wrkNo + "," + inSta.getBackSta());
                            continue;
                        }
//                        // 入库条件满足,开始请求入库地址
//                        if (staProtocol.isAutoing() && staProtocol.isLoading()
//                                && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && staProtocol.isPakMk()) {
//
//                            if (Cools.isEmpty(barcode) || INVALID_BARCODES.contains(barcode)) {
//                                News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
//                                staProtocol.setWorkNo(wrkNo++);
//                                staProtocol.setStaNo(inSta.getBackSta().shortValue());
//                                devpThread.setPakMk(staProtocol.getSiteId(), false);
//                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                log.error("输送线下发1:{} , {}", wrkNo, inSta.getBackSta());
//                                continue;
//                            }
//
//                            if (wrkMastMapper.selectPakInStep1(staNo, barcode) != null ||
//                                    wrkMastService.selectOne(new EntityWrapper<WrkMast>()
//                                            .eq("barcode", barcode)
//                                            .in("io_type", 107, 103, 57)) != null) {
//                                News.error(barcode + "条码已存在状态为(2.设备上走)的数据,请查看WCS输送线界面");
//                                continue;
//                            }
//
//                            try {
//                                SearchLocParam param = new SearchLocParam();
//                                param.setBarcode(barcode);
//                                param.setIoType(1);
//                                param.setSourceStaNo(staNo);
//                                param.setLocType1((short) 1);
//                                param.setWeight(staProtocol.getWeight());
//
//                                String response = new HttpHandler.Builder()
//                                        .setTimeout(30, TimeUnit.SECONDS)
//                                        .setUri(wmsUrl)
//                                        .setPath("/rpc/pakin/loc/v1")
//                                        .setJson(JSON.toJSONString(param))
//                                        .build()
//                                        .doPost();
//
//                                JSONObject json = JSON.parseObject(response);
//                                if (json.getInteger("code").equals(200)) {
//                                    StartupDto dto = json.getObject("data", StartupDto.class);
//                                    barcodeThread.setBarcode("");
//                                    staProtocol.setWorkNo(dto.getWorkNo());
//                                    staProtocol.setStaNo(dto.getStaNo().shortValue());
//                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
//                                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                    ledThread.errorReset();
//                                    log.error("输送线下发2:" + dto.getWorkNo() + "," + dto.getStaNo());
//
//                                    if (!result) {
//                                        News.error(methodName + ":更新plc站点信息失败");
//                                        throw new CoolException("更新plc站点信息失败");
//                                    }
//                                } else {
//                                    String msg = json.getString("msg");
//                                    if (!"工作档已存在".equals(msg)) {
//                                        staProtocol.setWorkNo(wrkNo++);
//                                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
//                                        devpThread.setPakMk(staProtocol.getSiteId(), false);
//                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                        log.error("输送线下发2:" + staProtocol.getWorkNo() + "," + staProtocol.getStaNo());
//                                        if (!Cools.isEmpty(msg)) {
//                                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, msg));
//                                        }
//                                    }
//                                }
//                            } catch (Exception e) {
//                                log.error("组托任务异常:", e);
//                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//                            }
//                        }
                    }
                } finally {
                    // 【无论接口调用是否成功,最后都释放调用标记】
                    callingStations.remove(staNo);
                    log.debug("工位{}接口调用完成,释放调用标记", staNo);
                }
            }
        }
@@ -1307,7 +1344,7 @@
                if (crnProtocol.getLastIo().equals("I")) {
                    if (basCrnp.getInEnable().equals("Y")) {
                        //mark - 1 - ....
                        this.crnStnToLoc(crn, crnProtocol, mark); //  入库
                        this.crnStnToLoc(crn, crnProtocol, mark, crnThread); //  入库
                        crnProtocol.setLastIo("O");
                    } else if (basCrnp.getOutEnable().equals("Y")) {
                        //mark - 2 - ....
@@ -1321,7 +1358,7 @@
                        this.locToCrnStn(crn, crnProtocol, mark); //  出库
                        crnProtocol.setLastIo("I");
                    } else if (basCrnp.getInEnable().equals("Y")) {
                        this.crnStnToLoc(crn, crnProtocol, mark); //  入库
                        this.crnStnToLoc(crn, crnProtocol, mark, crnThread); //  入库
                        crnProtocol.setLastIo("O");
                    }
                }
@@ -1341,7 +1378,7 @@
    public synchronized void crnRebackHp(CrnProtocol crnProtocol, CrnThread crnThread,String staNo) {
        if(staNo == null){
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                if (crnProtocol.getBay() == 121) {
                if (crnProtocol.getBay() == 121 || crnProtocol.getBay() == 1) {
                    return;
                }
                int x=1;
@@ -1397,7 +1434,7 @@
            int z = staNoInt / 100; // 层
            if ((staNoInt >= 121 && staNoInt <= 126) || (staNoInt >= 221 && staNoInt <= 230) || (staNoInt >= 411 && staNoInt <= 414)) {
            if ((staNoInt >= 121 && staNoInt <= 126) || (staNoInt >= 221 && staNoInt <= 231) || (staNoInt >= 411 && staNoInt <= 414)) {
                y = 121;
            }
@@ -1442,7 +1479,7 @@
    /**
     * 入库  ===>>  堆垛机站到库位
     */
    public synchronized void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol, Integer mark) {
    public synchronized void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol, Integer mark,CrnThread crnThread) {
        News.warnNoLog("" + mark + " - 1" + " - 0" + " - 堆垛机入出库作业下发:执行入库");
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            boolean flag = false;
@@ -1461,11 +1498,23 @@
                News.error("" + mark + " - 1" + " - 2" + " - 入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                continue;
            }
//            if(staProtocol.getWorkNo() == 9998){
//                continue;
            WrkMast wrkMast1 = wrkMastMapper.selectPakInOne(slave.getId());
            if(wrkMast1 != null){
                crnRebackHp(crnProtocol,crnThread,wrkMast1.getStaNo().toString());
            }
//            if(staProtocol.getSiteId() == 225){
//                News.info("入库站点信息{}",staProtocol);
//            staProtocol.isLoading() &&
//            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
            if(staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9998){
                log.info("读取到工作号时间: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
            }
//             && staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9998
            if (staProtocol.isAutoing() && staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9998
                    && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                log.info("任务满足下发时间: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
                flag = true;
            }
            if (!flag) {
@@ -1476,8 +1525,10 @@
                continue;
            }
            // 获取工作状态为2(设备上走)的入库工作档
            WrkMast wrkMast = wrkMastMapper.selectPakInStep2(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo());
            WrkMast wrkMast = wrkMastMapper.selectPakInStep2(slave.getId(), staProtocol.getWorkNo(), crnStn.getStaNo());
//            wrkMast = wrkMast1;
            if (null == wrkMast) {
                log.info("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts=2, 工作号={}", staProtocol.getWorkNo());
                News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts=2, 工作号={}", staProtocol.getWorkNo());
//                log.error("查询无待入库数据--wrk_sts=2, 工作号={}", staProtocol.getWorkNo());
                continue;
@@ -1504,48 +1555,6 @@
                continue;
            }
//            // 双深库位且浅库位有货,则需先对浅库位进行库位移转
//            if (Utils.isDeepLoc(slaveProperties, wrkMast.getLocNo())) {
//                News.warnNoLog("" + mark + " - 1" + " - 8" + " - 双深库位且浅库位有货,则需先对浅库位进行库位移转 : 开始执行 任务号={}", wrkMast.getWrkNo());
//                String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getLocNo());
//                LocMast shallowLoc = locMastService.selectById(shallowLocNo);
//                // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
//                if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
//                    News.warnNoLog("" + mark + " - 1" + " - 9" + " - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}", shallowLoc.getLocSts());
//                    WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
//                    if (null == waitWrkMast) {
//                        News.error("" + mark + " - 1" + " - 10" + " - {}库位异常,未检索到相应工作档!", shallowLocNo);
//                    } else {
//                        waitWrkMast.setIoPri(15D);
//                        waitWrkMast.setModiTime(new Date());
//                        if (wrkMastMapper.updateById(waitWrkMast) == 0) {
//                            News.error("" + mark + " - 1" + " - 11" + " - 调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
//                        }
//                        continue;
//                    }
//
//                } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
//                    News.warnNoLog("" + mark + " - 1" + " - 12" + " - // F、D  库位状态={}", shallowLoc.getLocSts());
//                    // 此标记避免多次执行移库任务
//                    if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) {
//                        wrkMast.setUpdMk("Y");
//                        wrkMast.setIoPri(14D);
//                        wrkMastMapper.updateById(wrkMast);
//                        // 生成工作档,将浅库位移转到新的库位中
//                        moveLocForDeepLoc(slave, shallowLoc, mark);
//                        // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行)
////                        moveLocForDeepLocPakin(slave, shallowLoc, wrkMast);
//                    }
//                    continue;
//                } else if (shallowLoc.getLocSts().equals("Q")) {
//                    News.warnNoLog("" + mark + " - 1" + " - 13" + " - // Q  库位状态={}", shallowLoc.getLocSts());
//                    WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
//                    if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) {
//                        News.infoNoLog("" + mark + " - 1" + " - 14" + " - // F、D  工作状态(判断条件为==4)={}", waitWrkMast.getWrkSts());
//                        continue;
//                    }
//                }
//            }
            News.warnNoLog("" + mark + " - 1" + " - 15" + " - 命令下发 : 工作号={},源排={},源列={},源层={},目标排={},目标列={},目标层={}", wrkMast.getWrkNo().shortValue()
                    , crnStn.getRow().shortValue(), crnStn.getBay().shortValue(), crnStn.getLev().shortValue()
                    , locMast.getRow1().shortValue(), locMast.getBay1().shortValue(), locMast.getLev1().shortValue());
@@ -1563,21 +1572,12 @@
            crnCommand.setDestinationPosY((short) (locMast.getBay1() + slave.getOffset()));     // 目标库位列
            crnCommand.setDestinationPosZ((short) (locMast.getLev1() + slave.getOffset()));     // 目标库位层
//            crnCommand.setTraySize(locMast.getLocType1() == 2);
            log.info("堆垛机任务下发时间: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
            if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                News.error("" + mark + " - 1" + " - 16" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
            } else {
//                long startTime = System.currentTimeMillis();
//                while ((System.currentTimeMillis() - startTime) < COMMAND_TIMEOUT) {
//
//                    if (true) {
//                        break;
//                    }
//
//                    try{
//                        Thread.sleep(500);
//                    }catch(Exception ignore){}
//                }
                // 修改工作档状态 2.设备上走 => 3.吊车入库中
                Date now = new Date();