*
lsh
2025-11-05 1983df9f47c76e3c047f386e82e89c5537f345ac
*
6个文件已修改
452 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/BasCrnpController.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/BasCrnpParam.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 376 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/CrnProtocol.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/deviceOperate/crnOperate.html 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasCrnpController.java
@@ -121,20 +121,35 @@
            if (Cools.isEmpty(basCrnpParam.getLocMastDemoCount()) || basCrnpParam.getLocMastDemoCount()<1){
                return R.error("请输入测试库位数量").add("请输入测试库位数量");
                return R.error("请输入测试在库库位数量").add("请输入测试在库库位数量");
            }
            if (Cools.isEmpty(basCrnpParam.getLocMastDemo())){
                return R.error("请输入测试库位列表").add("请输入测试库位列表");
            if (Cools.isEmpty(basCrnpParam.getLocMastDemoF())){
                return R.error("请输入测试在库库位列表").add("请输入测试在库库位列表");
            } else {
                String[] split = basCrnpParam.getLocMastDemo().split(";");
                String[] split = basCrnpParam.getLocMastDemoF().split(";");
                if (split.length!=basCrnpParam.getLocMastDemoCount()){
                    return R.error("输入测试库位列表数量不匹配").add("输入测试库位列表数量不匹配");
                    return R.error("输入测试在库库位列表数量不匹配").add("输入测试在库库位列表数量不匹配");
                }
                basCrnpParam.setLocMastDemoList(new ArrayList<>(Arrays.asList(split)));
                for (String locNo : basCrnpParam.getLocMastDemoList()){
                basCrnpParam.setLocMastDemoListF(new ArrayList<>(Arrays.asList(split)));
                for (String locNo : basCrnpParam.getLocMastDemoListF()){
                    boolean locNoDetection = CodeDetectionUtil.locNoDetection(locNo);
                    if (!locNoDetection){
                        return R.error("输入测试库位异常").add("输入测试库位异常");
                        return R.error("输入测试在库库位异常").add("输入测试在库库位异常");
                    }
                }
            }
            if (Cools.isEmpty(basCrnpParam.getLocMastDemoE())){
                return R.error("请输入测试空库位列表").add("请输入测试空库位列表");
            } else {
                String[] split = basCrnpParam.getLocMastDemoE().split(";");
                if (split.length!=basCrnpParam.getLocMastDemoCount()){
                    return R.error("输入测试空库位列表数量不匹配").add("输入测试空库位列表数量不匹配");
                }
                basCrnpParam.setLocMastDemoListE(new ArrayList<>(Arrays.asList(split)));
                for (String locNo : basCrnpParam.getLocMastDemoListE()){
                    boolean locNoDetection = CodeDetectionUtil.locNoDetection(locNo);
                    if (!locNoDetection){
                        return R.error("输入测试空库位异常").add("输入测试空库位异常");
                    }
                }
            }
@@ -182,7 +197,12 @@
                }
            }
            crnProtocol.setLocMastDemoCount(basCrnpParam.getLocMastDemoCount());
            crnProtocol.setLocMastDemoList(basCrnpParam.getLocMastDemoList());
            crnProtocol.setLocMastDemoListF(basCrnpParam.getLocMastDemoListF());
            crnProtocol.setLocMastDemoListE(basCrnpParam.getLocMastDemoListE());
            ArrayList<String> locMastDemoList = new ArrayList<>();
            locMastDemoList.addAll(basCrnpParam.getLocMastDemoListF());
            locMastDemoList.addAll(basCrnpParam.getLocMastDemoListF());
            crnProtocol.setLocMastDemoList(locMastDemoList);
            crnProtocol.setStaOutDemo(basCrnpParam.getStaOutDemo());
            crnProtocol.setStaIntDemo(basCrnpParam.getStaIntDemo());
        }
src/main/java/com/zy/asrs/entity/param/BasCrnpParam.java
@@ -94,8 +94,10 @@
    private Integer locMastDemoCount;//测试库位数量
    private String locMastDemo;//测试库位数量
    private ArrayList<String> locMastDemoList;//测试库位列表
    private String locMastDemoF;//测试库位数量
    private String locMastDemoE;//测试库位数量
    private ArrayList<String> locMastDemoListF;//测试库位列表
    private ArrayList<String> locMastDemoListE;//测试库位列表
    private Integer staOutDemo;//测试库位出库站
    private Integer staIntDemo;//测试库位入库站
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2687,7 +2687,7 @@
    /**
     * 堆垛机站出库到出库站
     */
    public boolean crnStnDEMOStop2() {
    public int crnStnDEMOStop2() {
        int signHpMk = 0;
        for (CrnSlave crn : slaveProperties.getCrn()) {
@@ -2707,10 +2707,13 @@
                signHpMk++;
            }
        }
        if (signHpMk == slaveProperties.getCrn().size()){
            return true;
        if (signHpMk == 0){
            return 2;
        }
        return false;
        if (signHpMk == slaveProperties.getCrn().size()){
            return 0;
        }
        return 3;
    }
@@ -2755,61 +2758,33 @@
    /**
     * 演示模式启动
     */
    public boolean crnStnDEMOOpen1() {
        try{
            int selectCount = taskWrkService.selectCount(new EntityWrapper<TaskWrk>());
            if (selectCount>0) {
                return false;
    public int crnStnDEMOOpen1() {
        int sign = 0;
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) {
                continue;
            }
            for (CrnSlave crn : slaveProperties.getCrn()) {
                try{
                    // 获取堆垛机信息
                    CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
                    CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                    if (crnProtocol == null) {
                        continue;
                    }
                    BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
                    if (basCrnp == null) {
                        log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId());
                        continue;
                    }
                    if (Cools.isEmpty(basCrnp.getHpMk()) || !basCrnp.getHpMk().equals("Y")){
                        CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "存在其它堆垛机开启演示模式!");
                        continue;
                    }
//
                    CrnSlave crnSlave = new CrnSlave(crn);
                    if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){
                        CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机巷道号异常!");
                        continue;
                    }
                    if (!crn.getId().equals(crnProtocol.getLaneNo())) {
                        for (CrnSlave crnOther : slaveProperties.getCrn()) {
                            if (crnOther.getId().equals(crnProtocol.getLaneNo())) {
                                crnSlave.updateCrnInStn(crnOther);
                            }
                        }
                    }
                    for (String locNo : crnProtocol.getLocMastDemoList()){
                        LocMast locMast = locMastService.selectByLocNo(locNo);
                        TaskCreateParam taskCreateParam = new TaskCreateParam(crnSlave,locMast);
                        taskCreateParam.setStartPointSta(crnProtocol.getStaIntDemo());
                        taskCreateParam.setTargetPointSta(crnProtocol.getStaOutDemo());
                        openService.taskCreate(taskCreateParam);
                    }
                } catch (Exception e) {
                    CrnErrCache.updateCrnErr(crn.getId(), "演示模式生成任务异常!");
                    continue;
                }
                return true;
            BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
            if (basCrnp == null) {
                log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId());
                continue;
            }
        } catch (Exception e) {
            if (Cools.isEmpty(basCrnp.getHpMk()) || !basCrnp.getHpMk().equals("Y")){
                continue;
            }
            sign++;
        }
        return false;
        if (sign == slaveProperties.getCrn().size()){
            return 2;
        } else if (sign==0){
            return 0;
        } else {
            return 1;
        }
    }
@@ -2830,25 +2805,18 @@
                continue;
            }
            CrnSlave crn = new CrnSlave(crnSlave);
            if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){
                CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机巷道号异常!");
                continue;
            }
            if (!crnSlave.getId().equals(crnProtocol.getLaneNo())) {
                for (CrnSlave crnOther : slaveProperties.getCrn()) {
                    if (crnOther.getId().equals(crnProtocol.getLaneNo())) {
                        crn.updateCrnInStn(crnOther);
                    }
                }
            }
//            try{
//                // 库位移转
//                this.locToLoc(crn, crnProtocol);
//            } catch (Exception e) {
//                log.error("库位移转失败");
//            CrnSlave crn = new CrnSlave(crnSlave);
//            if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){
//                CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机巷道号异常!");
//                continue;
//            }
//
//            if (!crnSlave.getId().equals(crnProtocol.getLaneNo())) {
//                for (CrnSlave crnOther : slaveProperties.getCrn()) {
//                    if (crnOther.getId().equals(crnProtocol.getLaneNo())) {
//                        crn.updateCrnInStn(crnOther);
//                    }
//                }
//            }
            // 只有当堆垛机空闲 并且 无任务时才继续执行
@@ -2857,24 +2825,20 @@
                // 如果最近一次是入库模式
                if (crnProtocol.getLastIo().equals("I")) {
                    if (basCrnp.getInEnable().equals("Y")) {
                        this.crnStnToLocDemo(crn, crnProtocol); //  入库
                        this.crnStnToLocDemo(crnSlave, crnProtocol); //  入库
                        crnProtocol.setLastIo("O");
                    } else if (basCrnp.getOutEnable().equals("Y")) {
                        if (!Cools.isEmpty(basCrnp.getHpMk()) && basCrnp.getHpMk().equals("Y")) {
                            this.locToCrnStnDemo(crn, crnProtocol); //  出库
                        }
                        this.locToCrnStnDemo(crnSlave, crnProtocol); //  出库
                        crnProtocol.setLastIo("I");
                    }
                }
                // 如果最近一次是出库模式
                else if (crnProtocol.getLastIo().equals("O")) {
                    if (basCrnp.getOutEnable().equals("Y")) {
                        if (!Cools.isEmpty(basCrnp.getHpMk()) && basCrnp.getHpMk().equals("Y")) {
                            this.locToCrnStnDemo(crn, crnProtocol); //  出库
                        }
                        this.locToCrnStnDemo(crnSlave, crnProtocol); //  出库
                        crnProtocol.setLastIo("I");
                    } else if (basCrnp.getInEnable().equals("Y")) {
                        this.crnStnToLocDemo(crn, crnProtocol); //  入库
                        this.crnStnToLocDemo(crnSlave, crnProtocol); //  入库
                        crnProtocol.setLastIo("O");
                    }
                }
@@ -2894,12 +2858,10 @@
        }
    }
    /**
     * 入库  ===>>  堆垛机站到库位
     */
    public void crnStnToLocDemo(CrnSlave slave, CrnProtocol crnProtocol) {
    public void crnStnToLocDemo(CrnSlave slave, CrnProtocol crnProtocol) throws IOException {
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
@@ -2919,7 +2881,7 @@
                    log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    continue;
                }
                if (staProtocol.isAutoing() && staProtocol.getWorkNo() > 0
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0
//                        && staProtocol.isInEnable()
                        && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                    flag = true;
@@ -2929,11 +2891,20 @@
                }
                // 获取工作状态为2(设备上走)的入库工作档
                TaskWrk taskWrk = taskWrkMapper.selectPakInDemo(crnProtocol.getLaneNo(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString());
                TaskWrk taskWrk = null;
                for (String locNo : crnProtocol.getLocMastDemoList()) {
                    TaskWrk taskWrk1 = taskWrkService.selectByTaskNo(locNo);
                    if (Cools.isEmpty(taskWrk1)){
                        continue;
                    }
                    if (taskWrk1.getWrkSts() == 2){
                        taskWrk = taskWrk1;
                        break;
                    }
                }
                if (null == taskWrk) {
                    continue;
                }
                // 堆垛机控制过滤
                if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE)) {
                    devpThread.setErrorDev(staProtocol.getSiteId(), "堆垛机非空闲");
@@ -2952,11 +2923,8 @@
                    continue;
                }
//                int workNo = commonService.getWorkNo(WorkNoType.PAKIN.type);//获取入库工作号
//                taskWrk.setWrkNo(workNo);//工作号
                Date now = new Date();
                taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态
//                taskWrk.setAssignTime(now);//派发时间
                taskWrk.setExecuteTime(now);
                taskWrk.setWrkSts(3);//工作状态 3.吊车入库
                taskWrk.setCrnNo(staDesc.getCrnNo());//堆垛机号
@@ -2977,7 +2945,7 @@
                int bay1 = Utils.getBayShort(taskWrk.getTargetPoint()) + 1;
                crnCommand1.setDestinationPosY((short)bay1);     // 目标库位层
                crnCommand1.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位排
                crnCommand1.setCommand((short) 0);
//                crnCommand.setCommand((short) 1);
                if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand1))) {
                    log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand1));
                    devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机命令生成失败");
@@ -2994,11 +2962,8 @@
                        log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo());
                        log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,异常:" + e);
                    }
                }
            }
            // return;
        }
    }
@@ -3007,7 +2972,7 @@
     * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库
     */
    public void locToCrnStnDemo(CrnSlave slave, CrnProtocol crnProtocol) {
        List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOutDemo(crnProtocol.getLaneNo(), null);
        List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(), null);
        if (taskWrksInitial.size() == 0) {
            return;
        }
@@ -3015,13 +2980,13 @@
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs) {
                // 获取工作状态为11(生成出库ID)的出库工作档
                List<TaskWrk> taskWrks = taskWrkMapper.selectPakOutDemo(crnProtocol.getLaneNo(), staDesc.getStnNo().toString());
                List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(), staDesc.getStnNo().toString());
                for (TaskWrk taskWrk : taskWrks) {
                    if (taskWrk == null) {
                        continue;
                    }
                    // 工作档状态判断
                    if (taskWrk.getIoType() != 4 || taskWrk.getTargetPoint() == null || taskWrk.getStartPoint() == null) {
                    if (taskWrk.getIoType() != 2 || taskWrk.getTargetPoint() == null || taskWrk.getStartPoint() == null) {
                        log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getStartPoint(), taskWrk.getIoType());
                        continue;
                    }
@@ -3043,12 +3008,6 @@
                    // 判断堆垛机出库站状态
                    if (staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) {
//                    // 判断堆垛机出库站状态
//                    if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
//                            && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                        // 命令下发区 --------------------------------------------------------------------------
                        // 堆垛机控制过滤
                        if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE)) {
                            devpThread.setErrorDev(staProtocol.getSiteId(), "堆垛机非空闲");
@@ -3105,6 +3064,36 @@
                                log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                                log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,异常:" + e);
                            }
                            try {
                                HashMap<String, Object> headParam = new HashMap<>();
                                headParam.put("taskNo",taskWrk.getTaskNo());
                                headParam.put("taskStatus",taskWrk.getStatusWms());
                                headParam.put("ioType",taskWrk.getIoTypeWms());
                                headParam.put("barCode",taskWrk.getBarcode());
                                headParam.put("reportTime", LocalDateTime.now());
                                headParam.put("weight",taskWrk.getScWeight().doubleValue());
                                String response;
                                response = new HttpHandler.Builder()
                                        // .setHeaders(headParam)
                                        .setUri(wmsUrl)
                                        .setPath(taskStatusFeedbackPath)
                                        .setJson(JSON.toJSONString(headParam))
                                        .build()
                                        .doPost();
                                JSONObject jsonObject = JSON.parseObject(response);
                                apiLogService.save("wcs派发出库任务上报wms"
                                        , wmsUrl + taskStatusFeedbackPath
                                        , null
                                        , "127.0.0.1"
                                        , JSON.toJSONString(headParam)
                                        , response
                                        , true
                                );
                            } catch (Exception e) {
                                log.error("wcs派发出库任务上报wms失败", JSON.toJSONString(taskWrk));
//                                throw new CoolException("wcs派发入库任务上报wms失败");
                            }
                        }
                    } else {
                        CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "-");
@@ -3130,12 +3119,10 @@
        }
    }
    /**
     * 堆垛机站出库到出库站
     */
    public void crnStnToOutStnDemo() {
    public void crnStnToOutStnDemo()  {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
@@ -3179,11 +3166,12 @@
                        }
                        if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
                            // 查询工作档
                            TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorkingDemo(crnProtocol.getLaneNo(), staDesc.getStnNo().toString());
                            TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnProtocol.getLaneNo(), staDesc.getStnNo().toString());
                            if (taskWrk == null) {
                                continue;
                            }
                            log.info("下发输送线任务:taskWrk:" + JSON.toJSONString(taskWrk));
//                            R r = siteController.siteDetlUpdate(Integer.valueOf(taskWrk.getTargetPoint()), taskWrk.getWrkNo().shortValue(), (short) 0, "Y", false, false);
                            staProtocol.setWorkNo(taskWrk.getWrkNo());
                            staProtocol.setStaNo(BarcodeUtils.getStaNo(staProtocol.getSiteId()));
                            boolean offer = false;
@@ -3193,17 +3181,18 @@
                                log.error("下发输送线任务失败:异常:" + e);
                                log.error("下发输送线任务失败:异常:offer:" + offer);
                            }
//                            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(r));
                            if (offer) {
                                log.info("下发输送线任务成功:taskWrk:" + JSON.toJSONString(taskWrk));
                                Date now = new Date();
                                taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);
                                taskWrk.setWrkSts(2);
                                taskWrk.setStatus(TaskStatusType.OVER3.id);
                                taskWrk.setWrkSts(14);
                                taskWrk.setModiTime(now);
                                taskWrk.setCompleteTime(now);
                                taskWrkService.updateById(taskWrk);
                            } else {
                                log.error("下发输送线任务失败:taskWrk:" + JSON.toJSONString(taskWrk));
//                                log.error("下发输送线任务失败:异常信息:"+JSON.toJSONString(r));
                            }
                        }
                    } catch (Exception e) {
@@ -3215,77 +3204,6 @@
        }
    }
    public synchronized void taskStartDemo() {
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            try {
                if (rgvDetection(rgvSlave)) {
                    String taskNoNow = rgvOtherTaskWrk(rgvSlave);
                    List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("PLC_POSITION", true));
                    boolean itSmall = new TrackRangeUtils().IsItSmall(rgvSlave);
                    if (basDevpPositions.isEmpty()) {
                        log.error("获取所有站点信息异常");
                        try{
                            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
                            deviceErrorService.addDeviceError("rgvErr", rgvSlave.getId(), "指令生成:获取所有站点信息异常");
                        } catch (Exception e2){
                        }
                        continue;
                    }
                    List<TaskWrk> taskWrkList = new ArrayList<>();
                    List<Integer> staList = new ArrayList<>();
                    for (RgvSlave.RgvStn inSta : rgvSlave.getRgvInSta()) {
                        TaskWrk taskWrk = deviceDetection(inSta);
                        if (taskWrk != null) {
                            if (taskWrk.getWrkNo().toString().equals(taskNoNow)) continue;
                            taskWrkList.add(taskWrk);
                            staList.add(inSta.getStaNo());
                        }
                    }
                    if (taskWrkList.isEmpty() || staList.isEmpty()) continue;
                    boolean sign = false;
                    if (!sign){
                        //可用区域就近取货
                        //就近排序
                        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvSlave.getId());
                        List<Integer> rangeList = RouteUtils.SortNearby(staList, rgvProtocol.RgvPos, basDevpPositions);
                        //  半边区域内取货任务
                        for (Integer staNoNow : rangeList) {
                            for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
                                if (rgvStn.getStaNo().equals(staNoNow)) {
                                    TaskWrk taskWrk = deviceDetection(rgvStn);
                                    if (taskWrk != null) {
                                        Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint());
                                        for (RgvSlave.RgvStn rgvStnOut : rgvSlave.getRgvOutSta()) {
                                            if (rgvStnOut.getStaNo().equals(outStaNo)) {
                                                sign = taskGenerate(rgvSlave, rgvStn, 0);
                                                break;
                                            }
                                        }
                                    }
                                    break;
                                }
                            }
                            if (sign) {
                                break;
                            }
                        }
                    }
                }
            } catch (Exception e) {
                log.error("任务生成失败===》异常信息:{}", e.getMessage());
                try{
                    DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
                    deviceErrorService.addDeviceError("rgvErr", rgvSlave.getId(), "指令生成失败");
                } catch (Exception e2){
                }
            }
        }
    }
    /**
     * 执行对工作档的完成操作
@@ -3299,13 +3217,6 @@
                if (crnProtocol == null) {
                    continue;
                }
                BasCrnp basCrnp = basCrnpService.selectById(crnSlave.getId());
                if (basCrnp == null) {
                    log.error("{}号堆垛机尚未在数据库进行维护!", crnSlave.getId());
                    continue;
                }
                CrnSlave crn = new CrnSlave(crnSlave);
                if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){
@@ -3324,49 +3235,102 @@
                //  状态:等待确认 并且  任务完成位 = 1
                if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                    //获取入库待确认工作档
                    TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorkingDemo(crnProtocol.getLaneNo(), crnProtocol.getTaskNo().intValue());
                    TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crnProtocol.getLaneNo(), crnProtocol.getTaskNo().intValue());
                    if (Cools.isEmpty(taskWrk) && crnProtocol.getTaskNo() != 999) {
                        log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},巷道号={},工作号={}", crn.getId(), crnProtocol.getLaneNo(), crnProtocol.getTaskNo());
                        continue;
                    }
//                Thread.sleep(300);
                    //确认完成信号
//                    CrnOperatorParam crnOperatorParam = new CrnOperatorParam();
//                    crnOperatorParam.setCrnNo(crn.getId());
                    Date now = new Date();
//                    crnController.crnTaskComplete(crnOperatorParam);
//                    MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, command))
                    crnThread.setResetFlag(true);
                    if (!Cools.isEmpty(taskWrk)) {
                        if (taskWrk.getIoType() == 4 && taskWrk.getWrkSts() == 3) {
                            taskWrk.setWrkSts(11);//入库完成
                            taskWrk.setStatus(TaskStatusType.RECEIVE.id);//接收
                            if (Cools.isEmpty(basCrnp.getHpMk()) || !basCrnp.getHpMk().equals("Y")) {
                                taskWrk.setWrkSts(4);
                                taskWrk.setStatus(TaskStatusType.OVER.id);
                            }
                        if (taskWrk.getIoType() == 1 && taskWrk.getWrkSts() == 3) {
                            taskWrk.setWrkSts(4);//入库完成
                            taskWrk.setStatus(TaskStatusType.OVER.id);//完结
                            //更新库位状态
                            LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
                            locMast.setLocSts("R");//F.在库
                            if (Cools.isEmpty(basCrnp.getHpMk()) || !basCrnp.getHpMk().equals("Y")) {
                                locMast.setLocSts("F");//F.在库
                            }
                            locMast.setLocSts("F");//F.在库
                            locMast.setBarcode(taskWrk.getBarcode());//托盘码
                            locMast.setModiTime(now);
                            locMast.setModiUser(9999L);
                            locMastService.updateById(locMast);
                        } else if (taskWrk.getIoType() == 4 && taskWrk.getWrkSts() == 12) {
                        } else if (taskWrk.getIoType() == 2 && taskWrk.getWrkSts() == 12) {
                            taskWrk.setWrkSts(13);//出库完成
                            taskWrk.setStatus(TaskStatusType.RECEIVE.id);//接收
                            taskWrk.setStatus(TaskStatusType.OVER.id);//完结
                            //更新库位状态
                            LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
                            locMast.setLocSts("S");//O.空库位
                            locMast.setLocSts("O");//O.空库位
                            locMast.setBarcode("");//托盘码
                            locMast.setModiTime(now);
                            locMast.setModiUser(9999L);
                            locMastService.updateById(locMast);
                        } else if (taskWrk.getIoType() == 3 && taskWrk.getWrkSts() == 12) {
                            taskWrk.setWrkSts(4);//入库完成
                            taskWrk.setStatus(TaskStatusType.OVER.id);//完结
                            //更新库位状态
                            LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
                            locMast.setLocSts("F");//F.在库
                            locMast.setBarcode(taskWrk.getBarcode());//托盘码
                            locMast.setModiTime(now);
                            locMast.setModiUser(9999L);
                            locMastService.updateById(locMast);
                            LocMast locMast1 = locMastService.selectByLocNo(taskWrk.getStartPoint());
                            locMast1.setLocSts("O");//O.空库位
                            locMast1.setBarcode("");//托盘码
                            locMast1.setModiTime(now);
                            locMast1.setModiUser(9999L);
                            locMastService.updateById(locMast1);
                        }
                        taskWrk.setModiTime(now);
                        taskWrk.setCompleteTime(now);
                        taskWrkService.updateById(taskWrk);
//                    try {
//                        HashMap<String, Object> headParam = new HashMap<>();
//                        headParam.put("taskNo",taskWrk.getTaskNo());
//                        headParam.put("taskStatus",taskWrk.getStatusWms());
//                        headParam.put("ioType",taskWrk.getIoTypeWms());
//                        headParam.put("barCode",taskWrk.getBarcode());
//                        headParam.put("reportTime", LocalDateTime.now());
//                        headParam.put("weight",taskWrk.getScWeight().doubleValue());
//
//                        String response;
//                        log.error("wcs完结任务上报wms==》", headParam);
//
//                        response = new HttpHandler.Builder()
//                                // .setHeaders(headParam)
//                                .setUri(wmsUrl)
//                                .setPath(taskStatusFeedbackPath)
//                                .setJson(JSON.toJSONString(headParam))
//                                .build()
//                                .doPost();
//                        log.error("wcs完结任务上报wms==》", response);
//
////                        JSONObject jsonObject = JSON.parseObject(response);
////                        log.error("wcs完结任务上报wms==》", jsonObject);
//
//                        apiLogService.save("wcs派发入库任务上报wms"
//                                , wmsUrl + taskStatusFeedbackPath
//                                , null
//                                , "127.0.0.1"
//                                , JSON.toJSONString(headParam)
//                                , response
//                                , true
//                        );
//                    } catch (Exception e) {
//                        log.error("wcs完结任务上报wms失败", taskWrk);
//                        log.error("wcs完结任务上报wms失败,报错信息:", e);
////                        throw new CoolException("wcs派发入库任务上报wms失败");
//                    }
                    }
                }
src/main/java/com/zy/core/MainProcess.java
@@ -122,8 +122,6 @@
                mainService.crnIoExecuteDemo();
                // 入库  ===>> 执行对工作档的完成操作
                mainService.storeFinishedDemo();
                // 任务下发
                mainService.taskStartDemo();
            } catch (Exception e) {
                e.printStackTrace();
            }
@@ -138,23 +136,28 @@
                // 系统演示模式运行状态变化
                if (SystemProperties.WCS_RUNNING_STATUS_DEMO.get()) {
                    if (SystemProperties.WCS_RUNNING_STATUS_DEMO_VALUE == 2) {
                        boolean signHpMk = mainService.crnStnDEMOStop2();
                        if (signHpMk) {
                        int signHpMk = mainService.crnStnDEMOStop2();
                        if (signHpMk != 2) {
                            SystemProperties.WCS_RUNNING_STATUS_DEMO_VALUE = 3;
                        }
                    } else if (SystemProperties.WCS_RUNNING_STATUS_DEMO_VALUE == 3) {
                        boolean signHpMk = mainService.crnStnDEMOStop3();
                        if (signHpMk) {
                        int signHpMk2 = mainService.crnStnDEMOStop2();
                        if (signHpMk && signHpMk2==0) {
                            SystemProperties.WCS_RUNNING_STATUS_DEMO.set(false);
                            SystemProperties.WCS_RUNNING_STATUS_DEMO_VALUE = 0;
                        } else if (!signHpMk && signHpMk2==2) {
                            SystemProperties.WCS_RUNNING_STATUS_DEMO_VALUE = 2;
                        }
                    }
                } else {
                    if (SystemProperties.WCS_RUNNING_STATUS_DEMO_VALUE == 1) {
                        boolean signHpMk = mainService.crnStnDEMOOpen1();
                        if (signHpMk) {
                        int signHpMk = mainService.crnStnDEMOOpen1();
                        if (signHpMk == 2) {
                            SystemProperties.WCS_RUNNING_STATUS_DEMO.set(true);
                            SystemProperties.WCS_RUNNING_STATUS_DEMO_VALUE = 2;
                        } else if (signHpMk == 1) {
                            SystemProperties.WCS_RUNNING_STATUS_DEMO_VALUE = 1;
                        } else {
                            SystemProperties.WCS_RUNNING_STATUS_DEMO_VALUE = 0;
                        }
src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -203,6 +203,8 @@
    public Integer locMastDemoCount;//测试库位数量
    public ArrayList<String> locMastDemoListF;//测试库位列表
    public ArrayList<String> locMastDemoListE;//测试库位列表
    public ArrayList<String> locMastDemoList;//测试库位列表
    public Integer staOutDemo;//测试库位出库站
    public Integer staIntDemo;//测试库位入库站
src/main/webapp/views/deviceOperate/crnOperate.html
@@ -78,8 +78,11 @@
                            <el-form-item label="测试库位数量">
                                <el-input v-model="formParam.locMastDemoCount" placeholder="测试库位数量"></el-input>
                            </el-form-item>
                            <el-form-item label="测试库位">
                                <el-input v-model="formParam.locMastDemo" placeholder="测试库位 分隔符;"></el-input>
                            <el-form-item label="原始出库库位">
                                <el-input v-model="formParam.locMastDemoF" placeholder="原始有物库位"></el-input>
                            </el-form-item>
                            <el-form-item label="原始空库位">
                                <el-input v-model="formParam.locMastDemoE" placeholder="原始有物库位"></el-input>
                            </el-form-item>
                            <el-form-item label="堆垛机放货站点">
                                <el-input v-model="formParam.staOutDemo" placeholder="堆垛机放货站点"></el-input>
@@ -220,7 +223,8 @@
                    sourceLev: 1,
                    staNo: null,
                    locMastDemoCount: 3,
                    locMastDemo: null,
                    locMastDemoF: null,
                    locMastDemoE: null,
                    staOutDemo: null,
                    staIntDemo: null,
                    row: 1,
@@ -352,7 +356,8 @@
                                hpMk: this.hpMkDemo ? "Y" : "N",
                                staOutDemo: this.formParam.staOutDemo,
                                staIntDemo: this.formParam.staIntDemo,
                                locMastDemo: this.formParam.locMastDemo,
                                locMastDemoF: this.formParam.locMastDemoF,
                                locMastDemoE: this.formParam.locMastDemoE,
                                locMastDemoCount: this.formParam.locMastDemoCount,
                                crnNo: this.formParam.crnNo
                            }