zyh
2 天以前 e98d4b1133ed058bfe1e6af75be9975aebfc32d8
最后可运行版本
2个文件已添加
17个文件已修改
1127 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/SiteController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/AgvTask.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BindOrUnbindParam.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/MesReturn.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/RcsTaskContinue.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/TransParent.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WaitPakin.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/enums/RcsRetMethodEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/RcsService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java 711 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/MatDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/HikUtils.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/logback-spring.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -2,6 +2,7 @@
import com.core.common.R;
import com.zy.asrs.domain.param.ToOutStaParam;
import com.zy.asrs.entity.BindOrUnbindParam;
import com.zy.asrs.entity.RcsReporterTask;
import com.zy.asrs.entity.RcsReturn;
import com.zy.asrs.service.RcsService;
@@ -68,6 +69,14 @@
//        log.info("AGV放货完成,给站点写9991工作号,下发任务:{},站点:{},agv任务号:{}", result, task.getStaNo(), task.getTaskNo());
    }
    /**
     * 滑块检测区域站点是否还有空站点
     * @param param 需要站点号和绑定
     * @return
     */
    @PostMapping("/api/robot/reporter/carrier/BindOrUnbind")
    public R BindOrUnbind(@RequestBody BindOrUnbindParam param){
        return rcsService.bindOrUnbind(param);
    }
}
src/main/java/com/zy/asrs/controller/SiteController.java
@@ -80,8 +80,8 @@
            vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 入库标记
            vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N");     // 空板信号
            vo.setStaNo(staProtocol.getStaNo());                // 目标站
//            vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高");     //高低库位
            vo.setLocType1(staProtocol.isHigh() ? "高" : "低");
            vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高");     //高低库位
//            vo.setLocType1(staProtocol.isHigh() ? "高" : "低");
            vo.setEmptyOutType(staProtocol.isEmptyOutType() ? "Y" : "N");
        }
        return R.ok().add(list);
src/main/java/com/zy/asrs/entity/AgvTask.java
@@ -343,7 +343,12 @@
    @ApiModelProperty(value= "外部任务编号")
    @TableField("task_no")
    private String taskNo;
    /**
     * 是否是pda发的
     */
    @ApiModelProperty(value= "是否是PDA发的任务")
    @TableField("is_PDA")
    private String isPda;
    public AgvTask() {}
    public String getYmd$(){
src/main/java/com/zy/asrs/entity/BindOrUnbindParam.java
New file
@@ -0,0 +1,9 @@
package com.zy.asrs.entity;
import lombok.Data;
@Data
public class BindOrUnbindParam {
    private String carrierCode="666666";
    private String siteCode;
}
src/main/java/com/zy/asrs/entity/MesReturn.java
New file
@@ -0,0 +1,20 @@
package com.zy.asrs.entity;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
// MES接口返回结果
@Data
public class MesReturn {
    // 1:成功;2:失败
    @JsonProperty("Success")
    @JSONField(name = "Success")
    private String Success;
    // 失败消息
    @JsonProperty("Message")
    @JSONField(name = "Message")
    private String Message;
}
src/main/java/com/zy/asrs/entity/RcsTaskContinue.java
@@ -17,4 +17,6 @@
    // 与 triggerType 对应的触发编号
    private String triggerCode;
    //agv厂家
    private String agvFactory;
}
src/main/java/com/zy/asrs/entity/TransParent.java
@@ -33,6 +33,9 @@
    @JSONField(name = "TaskType")
    private String TaskType;
    @JsonProperty("AgvFactory")
    @JSONField(name = "AgvFactory")
    private Integer AgvFactory;
    //请求类型
    private String method;
src/main/java/com/zy/asrs/entity/WaitPakin.java
@@ -32,32 +32,9 @@
    /**
     * 仓库号
     */
    @ApiModelProperty(value= "规格")
    private String lgnum;
    /**
     * 仓库号
     */
    @ApiModelProperty(value= "型号")
    private String type;
    /**
     * 仓库号
     */
    @ApiModelProperty(value= "条码")
    private String color;
    /**
     * 仓库号
     */
    @ApiModelProperty(value= "批号")
    private String supplier;
    /**
     * 仓库号
     */
    @ApiModelProperty(value= "单据编号")
    private String warehouse;
    /**
     * 仓库号
@@ -72,22 +49,11 @@
    private Double anfme;
    /**
     * 单位
     */
    @ApiModelProperty(value= "单位")
    private String altme;
    /**
     * 托盘条码
     */
    @ApiModelProperty(value= "托盘条码")
    private String zpallet;
    /**
     * 用户ID
     */
    @ApiModelProperty(value= "客户名称")
    private String bname;
    @ApiModelProperty(value= "库位号")
    @TableField("loc_no")
src/main/java/com/zy/asrs/enums/RcsRetMethodEnum.java
@@ -13,6 +13,7 @@
    APPLY_PUT("applyPut", "放货申请"),
    TASK_END("end", "任务完成"),
    APPLY_IN_OFF_STATION("applyInOffStation", "取货离站请求"),
    APPLY_PICK("applyPick", "取货申请"),
    PICK_COMPLETE("pickComplete", "rcs取货完成,已退出输送线");
src/main/java/com/zy/asrs/service/RcsService.java
@@ -1,10 +1,13 @@
package com.zy.asrs.service;
import com.core.common.R;
import com.zy.asrs.entity.BindOrUnbindParam;
import com.zy.asrs.entity.RcsReporterTask;
import com.zy.asrs.entity.RcsReturn;
public interface RcsService {
    R bindOrUnbind (BindOrUnbindParam param);
    /**
     * 2.2.1任务执行回馈
     *
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.BasCrnErrorMapper;
@@ -95,6 +96,8 @@
    private ConfigService configService;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private RcsService rcsService;
    @Value("${wms.url}")
    private String wmsUrl;
@@ -120,7 +123,7 @@
                }
                // 获取入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                  SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                if (staProtocol == null) {
                    continue;
@@ -264,9 +267,23 @@
                    try {
                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                        // 输出库位类型信息
                        String locTypeStr = locTypeDto.getLocType1() == 1 ? "低库位" : "高库位";
                        log.info("[入库库位分配] 检测到" + locTypeStr + ",开始分配对应库位");
                        SearchLocParam param = new SearchLocParam();
                        param.setBarcode(barcode);
                        param.setIoType(1);
                        WaitPakin waitPakin = new WaitPakin();
                        List<WaitPakin> waitPakinList = waitPakinMapper.selectList(new EntityWrapper<WaitPakin>()
                                .eq("zpallet", param.getBarcode())
                        );
                        if (waitPakinList.isEmpty()) {
                            param.setIoType(10);
                        } else {
                            param.setIoType(1);
                        }
                        param.setSourceStaNo(inSta.getStaNo());
                        param.setLocType1(locTypeDto.getLocType1());
                        String response = new HttpHandler.Builder()
@@ -510,6 +527,10 @@
                        try {
                            LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                            // 输出库位类型信息
                            String locTypeStr = locTypeDto.getLocType1() == 1 ? "低库位" : "高库位";
                            log.info("[入库库位分配] 检测到" + locTypeStr + ",开始分配对应库位");
                            SearchLocParam param = new SearchLocParam();
                            param.setBarcode(wrkMast.getBarcode());
@@ -1109,9 +1130,9 @@
                }
            }
            String ip = "";
            if (wrkMast.getStaNo()==401){
            if (wrkMast.getStaNo() == 401) {
                ip = "172.26.4.231";
            }else if (wrkMast.getStaNo()==402){
            } else if (wrkMast.getStaNo() == 402) {
                ip = "172.26.4.232";
            }else if (wrkMast.getStaNo()==307){
                ip = "172.26.1.231";
@@ -1267,9 +1288,44 @@
                    // 命令下发区 --------------------------------------------------------------------------
                    //判断是否有正在执行中的AGV任务
                    List<AgvTask> agvTasks = agvTaskService.selectList(new EntityWrapper<AgvTask>().eq("wrk_sts", 302).eq("source_sta_no", staProtocol.getSiteId()));
                    List<AgvTask> agvTasks = agvTaskService.selectList(new EntityWrapper<AgvTask>().eq("wrk_sts", 302).eq("sta_no", String.valueOf(staProtocol.getSiteId())));
                    if (agvTasks != null && agvTasks.size() > 0) {
                        continue;
                    }
                    //站点为401或者402时,任务备注为Q时判断该区域中最外侧站点是否能绑定
                    //能绑定说明站点为空,可以继续出库
                    //站点绑定失败则说明区域满了
                    if (staProtocol.getSiteId()==401||staProtocol.getSiteId()==402) {
                        BindOrUnbindParam bindOrUnbindParam = new BindOrUnbindParam();
                        String staNo1="LZP10";
                        String staNo2="LZP11";
                        if (wrkMast.getMemo().equals("Q-L2")){
                            staNo1="LZP15";
                            staNo2="LZP16";
                        }else if (wrkMast.getMemo().equals("Q-L3")){
                            staNo1="LZP20";
                            staNo2="LZP21";
                        }else if (wrkMast.getMemo().equals("Q-L4")){
                            staNo1="LZP26";
                            staNo2="LZP26";
                        }else if (wrkMast.getMemo().equals("Q-L5")){
                            staNo1="LZP30";
                            staNo2="LZP31";
                        }
                        bindOrUnbindParam.setSiteCode(staNo1);
                        R r = rcsService.bindOrUnbind(bindOrUnbindParam);
                        if (r != null && r.get("code").equals(200)) {
                        }else {
                            bindOrUnbindParam.setSiteCode(staNo2);
                            r = rcsService.bindOrUnbind(bindOrUnbindParam);
                            if (r != null && r.get("code").equals(200)) {
                            }else{
                                continue;
                            }
                        }
                    }
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
@@ -1894,6 +1950,10 @@
                    try {
                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                        // 输出库位类型信息
                        String locTypeStr = locTypeDto.getLocType1() == 1 ? "低库位" : "高库位";
                        log.info("[入库库位分配] 检测到" + locTypeStr + ",开始分配对应库位");
                        SearchLocParam param = new SearchLocParam();
                        param.setIoType(10);
                        param.setSourceStaNo(emptyInSta.getStaNo());
@@ -2084,12 +2144,12 @@
                    staProtocol = staProtocol.clone();
                }
                // 获取工作档数据
                WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",staProtocol.getWorkNo()));
//                if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; }
                if (null == wrkMast) {
                    continue;
                }
                News.warnNoLog(""+mark+" - 0"+" - 开始执行:出库  ===>> 工作档信息写入led显示器");
                News.warnNoLog("" + mark + " - 0" + " - 开始执行:出库  ===>> 工作档信息写入led显示器");
                wrkMasts.add(wrkMast);
                // 组装命令
                LedCommand ledCommand = new LedCommand();
@@ -2097,12 +2157,12 @@
                ledCommand.setIoType(wrkMast.getIoType());
                // 出库模式
                switch (wrkMast.getIoType()) {
                    case 1:
                        ledCommand.setTitle("全板入库");
                        break;
                    case 10:
                        ledCommand.setTitle("空板入库");
                        break;
//                    case 1:
//                        ledCommand.setTitle("全板入库");
//                        break;
//                    case 10:
//                        ledCommand.setTitle("空板入库");
//                        break;
                    case 101:
                        ledCommand.setTitle("全板出库");
                        break;
@@ -2119,40 +2179,45 @@
                        ledCommand.setTitle("空板出库");
                        ledCommand.setEmptyMk(true);
                        break;
                    case 53:
                        ledCommand.setTitle("拣料入库");
                        break;
                    case 57:
                        ledCommand.setTitle("盘点入库");
                        break;
                    case 54:
                        ledCommand.setTitle("并板入库");
                        break;
//                    case 53:
//                        ledCommand.setTitle("拣料入库");
//                        break;
//                    case 57:
//                        ledCommand.setTitle("盘点入库");
//                        break;
//                    case 54:
//                        ledCommand.setTitle("并板入库");
//                        break;
                    default:
                        News.error(""+mark+" - 1"+" - 任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType());
                        //News.error("" + mark + " - 1" + " - 任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType());
                        break;
                }
                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
                ledCommand.setLocNo(wrkMast.getLocNo());
                ledCommand.setStaNo(wrkMast.getStaNo());
                ledCommand.setBarcode(wrkMast.getBarcode());
//                ledCommand.setSourceStaNo(wrkMast.getSourceStaNo());
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo());
                    try{
                        if (wrkMast.getIoType()>100){
                            for (WrkDetl wrkDetl : wrkDetls){
                    try {
                        if (wrkMast.getIoType() > 100) {
                            for (WrkDetl wrkDetl : wrkDetls) {
                                LocDetl locDetl = locDetlService.selectMatnrSpecs(wrkDetl.getMatnr(), wrkDetl.getSpecs(), wrkMast.getSourceLocNo());
                                wrkDetl.setWeight(locDetl.getAnfme());
                                if (Cools.isEmpty(locDetl)) {
                                    wrkDetl.setWeight(0.0);
                                }else {
                                    wrkDetl.setWeight(locDetl.getAnfme());
                                }
                            }
                        }else {
                            for (WrkDetl wrkDetl : wrkDetls){
                        } else {
                            for (WrkDetl wrkDetl : wrkDetls) {
                                wrkDetl.setWeight(wrkDetl.getAnfme());
                            }
                        }
                    }catch (Exception e){
                        log.error("工作档案明细输入电视机失败1:异常信息==》"+e);
                    } catch (Exception e) {
                        log.error("工作档案明细输入电视机失败1:异常信息==》" + e);
                    }
                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme(),wrkDetl.getWeight(),wrkDetl.getSpecs(),wrkDetl.getSku())));
                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme(), wrkDetl.getWeight(), wrkDetl.getSpecs(), wrkDetl.getSku(),wrkDetl.getZpallet())));
                }
                commands.add(ledCommand);
            }
@@ -2163,31 +2228,12 @@
            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
                continue;
            }
//             命令下发 -------------------------------------------------------------------------------
//            if (!commands.isEmpty()) {
//                if (led.getId() < 7) {
//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
//                        News.error(""+mark+" - 2"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                        continue;
//                    } else {
//                        ledThread.setLedMk(false);
//                    }
//                } else {
//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) {
//                        News.error(""+mark+" - 3"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                        continue;
//                    } else {
//                        ledThread.setLedMk(false);
//                    }
//                }
//
//            }
            // 命令下发 -------------------------------------------------------------------------------
            if (!commands.isEmpty()) {
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
                    News.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    continue;
                }else {
                } else {
                    ledThread.setLedMk(false);
                }
            }
@@ -2198,7 +2244,7 @@
                    wrkMast.setOveMk("Y");
                    wrkMast.setModiTime(new Date());
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        News.errorNoLog(""+mark+" - 4"+" - 更新工作档失败");
                        News.errorNoLog("" + mark + " - 4" + " - 更新工作档失败");
                        throw new CoolException("更新工作档失败");
                    }
                }
@@ -2212,7 +2258,7 @@
            }
        }
        News.infoNoLog(""+mark+" - 0"+" - 出库  ===>> 工作档信息写入led显示器执行完成");
        News.infoNoLog("" + mark + " - 0" + " - 出库  ===>> 工作档信息写入led显示器执行完成");
    }
    /**
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
@@ -1,9 +1,11 @@
package com.zy.asrs.service.impl;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.entity.*;
import com.zy.asrs.enums.RcsRetMethodEnum;
import com.zy.asrs.service.AgvTaskService;
@@ -33,9 +35,19 @@
@Slf4j
@Service
public class RcsServiceImpl implements RcsService {
    @Value("${mes.url}")
    public String MES_URL;
    // 海康RCS地址
    @Value("${hik.url}")
    private String HIK_URL;
    // 人员入侵系统检查
    @Value("${hik.renyuan}")
    private String HIK_RENYUAN;
    // 不需要发送end的站点
    @Value("${hik.station}")
    private String HIK_STATION;
    @Autowired
    private AgvTaskService taskService;
@@ -65,23 +77,29 @@
        String slotCategory = values.getString("slotCategory");
        String slotCode = values.getString("slotCode");
        EntityWrapper<AgvTask> wrapper = new EntityWrapper<>();
        wrapper.eq("task_no", robotTaskCode);
        // 修改后的逻辑:有"-"则去掉最后一个"-"及后面内容,没有则保持原样
        String taskNo = rcsReporterTask.getRobotTaskCode();
        if (taskNo.contains("-")) {
            taskNo = taskNo.substring(0, taskNo.lastIndexOf("-"));
        }
        wrapper.eq("task_no", taskNo);
        AgvTask task = taskService.selectOne(wrapper);
        if (!Cools.isEmpty(task)) {
            try {
                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                    //放货申请
                    case APPLY_PUT: {
                        Integer sourceStaNo = Integer.valueOf(task.getStaNo());
                        SiemensDevpThread siemensDevpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                        StaProtocol staProtocol = siemensDevpThread.getStation().get(sourceStaNo).clone();
                        //wcs反馈rcs继续执行
                        if (staProtocol != null && !staProtocol.isLoading() && !staProtocol.isEmptyOutType()) {
                                if(task.getTaskType().equals("AGV补空料架")){
                        if (task.getStaNo().equals("401") || task.getStaNo().equals("402") || task.getStaNo().equals("307")) {
                            Integer sourceStaNo = Integer.valueOf(task.getStaNo());
                            SiemensDevpThread siemensDevpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                            StaProtocol staProtocol = siemensDevpThread.getStation().get(sourceStaNo).clone();
                            //wcs反馈rcs继续执行
                            if (staProtocol != null && !staProtocol.isLoading() && !staProtocol.isEmptyOutType()) {
                                if (task.getTaskType().equals("AGV补空料架")) {
                                    RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                                    rcsTaskContinue.setRobotTaskCode(task.getTaskNo()+"-"+(task.getCtnType()-1));
                                    rcsTaskContinue.setRobotTaskCode(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                                    rcsTaskContinue.setTriggerType("TASK");
                                    rcsTaskContinue.setTriggerCode(task.getTaskNo()+"-"+(task.getCtnType()-1));
                                    rcsTaskContinue.setTriggerCode(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                                    String url = HIK_URL + "api/robot/controller/task/extend/continue";
                                    String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
@@ -94,7 +112,7 @@
                                    JSONObject data = new JSONObject();
                                    data.put("robotTaskCode", robotTaskCode);
                                    rcsReturn.setData(data);
                                }else {
                                } else {
                                    //出发PLC站点的扫码器扫码
                                    boolean result = MessageQueue.offer(SlaveType.Devp, 1, new com.zy.core.model.Task(3, staProtocol));
                                    if (result) {
@@ -106,9 +124,10 @@
                                        data.put("robotTaskCode", robotTaskCode);
                                        rcsReturn.setData(data);
                                        RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                                        rcsTaskContinue.setRobotTaskCode(task.getTaskNo()+"-"+(task.getCtnType()-1));
                                        rcsTaskContinue.setAgvFactory("1");
                                        rcsTaskContinue.setRobotTaskCode(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                                        rcsTaskContinue.setTriggerType("TASK");
                                        rcsTaskContinue.setTriggerCode(task.getTaskNo()+"-"+(task.getCtnType()-1));
                                        rcsTaskContinue.setTriggerCode(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                                        String url = HIK_URL + "api/robot/controller/task/extend/continue";
                                        String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
@@ -124,36 +143,38 @@
                                        rcsReturn.setData(data);
                                    }
                                }
                        }
                    }
                    break;
                            }
                        } else {
                            TransParent transParent = new TransParent();
                            transParent.setTaskno(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setTaskname(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setStationId(task.getStaNo());
                            transParent.setAgvFactory(1);
                            transParent.setAgvCode("1");//连接器库
                            //08-1是空托盘转序任务
                            //08-2是物料转序任务
                            if (task.getTaskType().equals("ZX-AGV-08-1")) {
                                transParent.setTransType("08-1");
                            } else if (task.getTaskType().equals("ZX-AGV-08-2")) {
                                transParent.setTransType("08-2");
                            } else if (task.getTaskType().equals("PP-AGV")) {
                                transParent.setTransType("10");
                            } else if (task.getTaskType().equals("ZP-AGV")) {
                                transParent.setTransType("11");
                            }
                            int i = applyInStation(transParent);
                    //放货完成 --》agv已经离开
                    case TASK_END: {
                        Integer sourceStaNo = Integer.valueOf(task.getStaNo());
                        SiemensDevpThread siemensDevpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                        StaProtocol staProtocol = siemensDevpThread.getStation().get(sourceStaNo).clone();
                        Boolean boo=false;
                        Short wrkNo = 9991;
                        //放货完成 --》agv已经离开 --》给PLC站点写9991工作号
                        //补空料架 --》agv已经立库 --》给PLC站点写9995工作号
                        if(task.getTaskType().equals("AGV补空料架") && staProtocol != null && !staProtocol.isLoading() && staProtocol.isEmptyOutType() && staProtocol.getWorkNo() == 0){
                            boo=true;
                            wrkNo = 9995;
                        }else if(!task.getTaskType().equals("AGV补空料架") && staProtocol != null && staProtocol.isLoading() && staProtocol.isEmptyOutType() && staProtocol.getWorkNo() == 0){
                            boo=true;
                        }
                        if (boo) {
                            staProtocol.setWorkNo(wrkNo);//空料架到位信号点
                            staProtocol.setStaNo(Short.valueOf("0"));
                            boolean result = MessageQueue.offer(SlaveType.Devp, 1, new com.zy.core.model.Task(2, staProtocol));
                            log.info("AGV放货完成,给站点写9991工作号,下发任务:{},站点:{},agv任务号:{}", result, task.getStaNo(), task.getTaskNo());
                            if (result) {
                                // 更新任务状态等内部逻辑
                                task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                                task.setModiTime(new Date());
                                taskService.updateById(task);
                                // 返回RCS
                            if (HIK_RENYUAN.contains(task.getStaNo())){
                                // 延迟处理,确保到站完成信号优先处理
                                try {
                                    Thread.sleep(20000); // 睡眠20秒
                                } catch (InterruptedException e)
                                {
                                    Thread.currentThread().interrupt();
                                }
                            }
                            if (i == 1) {
                                rcsReturn.setCode("SUCCESS");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
@@ -167,34 +188,224 @@
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            }
                        }else {
                        }
                    }
                    break;
                    //放货完成 --》agv已经离开
                    case TASK_END: {
                        if (task.getIsPda()!=null && task.getIsPda().equals("Y")){
                            // 更新任务状态等内部逻辑
                            task.setWrkSts(305L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                            task.setModiTime(new Date());
                            taskService.updateById(task);
                            // 返回RCS
                            rcsReturn.setCode("Err_Internal");
                            rcsReturn.setCode("SUCCESS");
                            rcsReturn.setMessage("");
                            JSONObject data = new JSONObject();
                            data.put("robotTaskCode", robotTaskCode);
                            rcsReturn.setData(data);
                        }
                        if (task.getStaNo().equals("Q-E2") || task.getStaNo().equals("Q-E3") || HIK_STATION.contains(task.getStaNo())){
                            // 更新任务状态等内部逻辑
                            task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                            task.setModiTime(new Date());
                            taskService.updateById(task);
                            // 返回RCS
                            rcsReturn.setCode("SUCCESS");
                            rcsReturn.setMessage("");
                            JSONObject data = new JSONObject();
                            data.put("robotTaskCode", robotTaskCode);
                            rcsReturn.setData(data);
                        }
                         else if (task.getStaNo().equals("401") || task.getStaNo().equals("402") || task.getStaNo().equals("307")) {
                            Integer sourceStaNo = Integer.valueOf(task.getStaNo());
                            SiemensDevpThread siemensDevpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                            StaProtocol staProtocol = siemensDevpThread.getStation().get(sourceStaNo).clone();
                            Boolean boo = false;
                            Short wrkNo = 9991;
                            if (task.getStaNo().equals("307")) {
                                wrkNo = 9997;
                            }
                            //放货完成 --》agv已经离开 --》给PLC站点写9991工作号
                            //补空料架 --》agv已经立库 --》给PLC站点写9995工作号
                            if (task.getTaskType().equals("AGV补空料架") && staProtocol != null && !staProtocol.isLoading() && staProtocol.isEmptyOutType() && staProtocol.getWorkNo() == 0) {
                                boo = true;
                                wrkNo = 9998;
                            } else if (!task.getTaskType().equals("AGV补空料架") && staProtocol != null && staProtocol.isLoading() && staProtocol.isEmptyOutType()) {
                                boo = true;
                            }
                            if (boo) {
                                staProtocol.setWorkNo(wrkNo);//空料架到位信号点
                                staProtocol.setStaNo(Short.valueOf("0"));
                                boolean result = MessageQueue.offer(SlaveType.Devp, 1, new com.zy.core.model.Task(2, staProtocol));
                                log.info("AGV放货完成,给站点写9991工作号,下发任务:{},站点:{},agv任务号:{}", result, task.getStaNo(), task.getTaskNo());
                                if (result) {
                                    // 更新任务状态等内部逻辑
                                    task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                                    task.setModiTime(new Date());
                                    taskService.updateById(task);
                                    // 返回RCS
                                    rcsReturn.setCode("SUCCESS");
                                    rcsReturn.setMessage("");
                                    JSONObject data = new JSONObject();
                                    data.put("robotTaskCode", robotTaskCode);
                                    rcsReturn.setData(data);
                                } else {
                                    // 返回RCS
                                    rcsReturn.setCode("Err_Internal");
                                    rcsReturn.setMessage("");
                                    JSONObject data = new JSONObject();
                                    data.put("robotTaskCode", robotTaskCode);
                                    rcsReturn.setData(data);
                                }
                            } else {
                                // 返回RCS
                                rcsReturn.setCode("Err_Internal");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            }
                        } else {
                            TransParent transParent = new TransParent();
                            transParent.setTaskno(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setTaskname(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setStationId(task.getStaNo());
                            transParent.setAgvFactory(1);
                            transParent.setAgvCode("1");//连接器库
                            //08-1是空托盘转序任务
                            //08-2是物料转序任务
                            if (task.getTaskType().equals("ZX-AGV-08-1")) {
                                transParent.setTransType("08-1");
                            } else if (task.getTaskType().equals("ZX-AGV-08-2")) {
                                transParent.setTransType("08-2");
                            } else if (task.getTaskType().equals("PP-AGV")) {
                                transParent.setTransType("10");
                            } else if (task.getTaskType().equals("ZP-AGV")) {
                                transParent.setTransType("11");
                            }
                            //放货离开站点
                            int i = AGVDepartureCompleted(transParent);
                            if (i == 1) {
                                // 更新任务状态等内部逻辑
                                task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                                task.setModiTime(new Date());
                                taskService.updateById(task);
                                rcsReturn.setCode("SUCCESS");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            } else {
                                // 返回RCS
                                rcsReturn.setCode("Err_Internal");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            }
                        }
                    }
                    break;
                    //rcs请求wms取货申请
                    case APPLY_PICK: {
                        Integer sourceStaNo = Integer.valueOf(task.getSourceStaNo());
                        SiemensDevpThread siemensDevpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                        StaProtocol staProtocol = siemensDevpThread.getStation().get(sourceStaNo).clone();
                        //判断站点是否有料架和托盘
                        if (staProtocol != null && (staProtocol.isLoading()||task.getTaskType().equals("AGV空料架回缓存区"))
                                && staProtocol.isEmptyOutType()) {
                            RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                            rcsTaskContinue.setRobotTaskCode(task.getTaskNo()+"-"+(task.getCtnType()-1));
                            rcsTaskContinue.setTriggerType("TASK");
                            rcsTaskContinue.setTriggerCode(task.getTaskNo()+"-"+(task.getCtnType()-1));
                        if (task.getSourceStaNo().equals("401") || task.getSourceStaNo().equals("402") || task.getSourceStaNo().equals("307")) {
                            Integer sourceStaNo = Integer.valueOf(task.getSourceStaNo());
                            SiemensDevpThread siemensDevpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                            StaProtocol staProtocol = siemensDevpThread.getStation().get(sourceStaNo).clone();
                            //判断站点是否有料架和托盘
                            if (staProtocol != null && (staProtocol.isLoading() || task.getTaskType().equals("AGV空料架回缓存区"))
                                    && staProtocol.isEmptyOutType()) {
                                RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                                rcsTaskContinue.setRobotTaskCode(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                                rcsTaskContinue.setTriggerType("TASK");
                                rcsTaskContinue.setTriggerCode(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            String url = HIK_URL + "api/robot/controller/task/extend/continue";
                            String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
                            if (!StringUtils.isEmpty(response) && response.contains("code")) {
                                RcsReturn rcsReturn1 = JSONObject.parseObject(response, RcsReturn.class);
                                if ("200".equals(rcsReturn1.getCode())) {
                                String url = HIK_URL + "api/robot/controller/task/extend/continue";
                                String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
                                if (!StringUtils.isEmpty(response) && response.contains("code")) {
                                    RcsReturn rcsReturn1 = JSONObject.parseObject(response, RcsReturn.class);
                                    if ("SUCCESS".equals(rcsReturn1.getCode())) {
                                        // 返回RCS
                                        rcsReturn.setCode("SUCCESS");
                                        rcsReturn.setMessage("");
                                        JSONObject data = new JSONObject();
                                        data.put("robotTaskCode", robotTaskCode);
                                        rcsReturn.setData(data);
                                    } else {
                                        // 返回RCS
                                        rcsReturn.setCode("Err_Internal");
                                        rcsReturn.setMessage("");
                                        JSONObject data = new JSONObject();
                                        data.put("robotTaskCode", robotTaskCode);
                                        rcsReturn.setData(data);
                                    }
                                }
                            }
                        } else {
                            TransParent transParent = new TransParent();
                            transParent.setTaskno(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setTaskname(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setStationId(task.getSourceStaNo());
                            transParent.setAgvFactory(1);
                            transParent.setAgvCode("1");//连接器库
                            //08-1是空托盘转序任务
                            //08-2是物料转序任务
                            if (task.getTaskType().equals("ZX-AGV-08-1")) {
                                transParent.setTransType("08-1");
                            } else if (task.getTaskType().equals("ZX-AGV-08-2")) {
                                transParent.setTransType("08-2");
                            } else if (task.getTaskType().equals("PP-AGV")) {
                                transParent.setTransType("10");
                            } else if (task.getTaskType().equals("ZP-AGV")) {
                                transParent.setTransType("11");
                            }
                            int i = applyInStation(transParent);
                            if (HIK_RENYUAN.contains(task.getStaNo())){
                                // 延迟处理,确保到站完成信号优先处理
                                try {
                                    Thread.sleep(20000); // 睡眠20秒
                                } catch (InterruptedException e)
                                {
                                    Thread.currentThread().interrupt();
                                }
                            }
                            if (i == 1) {
                                rcsReturn.setCode("SUCCESS");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            } else {
                                // 返回RCS
                                rcsReturn.setCode("Err_Internal");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            }
                        }
                    }
                    break;
                    //rcs取货完成,已退出输送线
                    case PICK_COMPLETE: {
                        if (task.getSourceStaNo().equals("401") || task.getSourceStaNo().equals("402") || task.getSourceStaNo().equals("307")) {
                            Integer sourceStaNo = Integer.valueOf(task.getSourceStaNo());
                            SiemensDevpThread siemensDevpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                            StaProtocol staProtocol = siemensDevpThread.getStation().get(sourceStaNo).clone();
                            //放货完成 --》agv已经离开 --》给PLC站点写9991工作号
                            if (staProtocol != null && !staProtocol.isLoading() && !staProtocol.isEmptyOutType()) {
                                staProtocol.setWorkNo((short) 0);
                                staProtocol.setStaNo((short) 0);
                                boolean result = MessageQueue.offer(SlaveType.Devp, 1, new com.zy.core.model.Task(2, staProtocol));
                                log.info("AGV取货完成,给站点写0工作号,下发任务:{},站点:{},agv任务号:{}", result, task.getStaNo(), task.getTaskNo());
                                if (result) {
                                    // 返回RCS
                                    rcsReturn.setCode("SUCCESS");
                                    rcsReturn.setMessage("");
@@ -210,22 +421,27 @@
                                    rcsReturn.setData(data);
                                }
                            }
                        }
                    }
                    break;
                    //rcs取货完成,已退出输送线
                    case PICK_COMPLETE: {
                        Integer sourceStaNo = Integer.valueOf(task.getSourceStaNo());
                        SiemensDevpThread siemensDevpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                        StaProtocol staProtocol = siemensDevpThread.getStation().get(sourceStaNo).clone();
                        //放货完成 --》agv已经离开 --》给PLC站点写9991工作号
                        if (staProtocol != null && !staProtocol.isLoading() && !staProtocol.isEmptyOutType()) {
                            staProtocol.setWorkNo((short) 0);
                            staProtocol.setStaNo((short) 0);
                            boolean result = MessageQueue.offer(SlaveType.Devp, 1, new com.zy.core.model.Task(2, staProtocol));
                            log.info("AGV取货完成,给站点写0工作号,下发任务:{},站点:{},agv任务号:{}", result, task.getStaNo(), task.getTaskNo());
                            if (result) {
                                // 返回RCS
                        } else {
                            TransParent transParent = new TransParent();
                            transParent.setTaskno(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setTaskname(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setStationId(task.getSourceStaNo());
                            transParent.setAgvFactory(1);
                            transParent.setAgvCode("1");//连接器库
                            //08-1是空托盘转序任务
                            //08-2是物料转序任务
                            if (task.getTaskType().equals("ZX-AGV-08-1")) {
                                transParent.setTransType("08-1");
                            } else if (task.getTaskType().equals("ZX-AGV-08-2")) {
                                transParent.setTransType("08-2");
                            } else if (task.getTaskType().equals("PP-AGV")) {
                                transParent.setTransType("10");
                            } else if (task.getTaskType().equals("ZP-AGV")) {
                                transParent.setTransType("11");
                            }
                            //取货离开站点
                            int i = AGVDepartureCompleted(transParent);
                            if (i == 1) {
                                rcsReturn.setCode("SUCCESS");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
@@ -239,10 +455,205 @@
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            }
                        }
                    }
                    break;
                    //AGV取货离站请求
                    case APPLY_IN_OFF_STATION: {
                        //如果是立库站点直接允许离站
                        if (task.getSourceStaNo().equals("401") || task.getSourceStaNo().equals("402") || task.getSourceStaNo().equals("307")) {
                            RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                            rcsTaskContinue.setRobotTaskCode(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            rcsTaskContinue.setTriggerType("TASK");
                            rcsTaskContinue.setTriggerCode(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            String url = HIK_URL + "api/robot/controller/task/extend/continue";
                            String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
                            if (!StringUtils.isEmpty(response) && response.contains("code")) {
                                RcsReturn rcsReturn1 = JSONObject.parseObject(response, RcsReturn.class);
                                if ("SUCCESS".equals(rcsReturn1.getCode())) {
                                    // 返回RCS
                                    rcsReturn.setCode("SUCCESS");
                                    rcsReturn.setMessage("");
                                    JSONObject data = new JSONObject();
                                    data.put("robotTaskCode", robotTaskCode);
                                    rcsReturn.setData(data);
                                } else {
                                    // 返回RCS
                                    rcsReturn.setCode("Err_Internal");
                                    rcsReturn.setMessage("");
                                    JSONObject data = new JSONObject();
                                    data.put("robotTaskCode", robotTaskCode);
                                    rcsReturn.setData(data);
                                }
                            }
                        } else {
                            // 延迟处理,确保到站完成信号优先处理
                            try {
                                Thread.sleep(5000); // 睡眠5秒
                            } catch (InterruptedException e)
                            {
                                Thread.currentThread().interrupt();
                            }
                            //如果是工位需要像mes请求离站
                            TransParent transParent = new TransParent();
                            transParent.setTaskno(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setTaskname(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setStationId(values.getString("slotName"));
                            transParent.setAgvFactory(1);
                            transParent.setAgvCode("1");//连接器库
                            //08-1是空托盘转序任务
                            //08-2是物料转序任务
                            if (task.getTaskType().equals("ZX-AGV-08-1")) {
                                transParent.setTransType("08-1");
                            } else if (task.getTaskType().equals("ZX-AGV-08-2")) {
                                transParent.setTransType("08-2");
                            } else if (task.getTaskType().equals("PP-AGV")) {
                                transParent.setTransType("10");
                            } else if (task.getTaskType().equals("ZP-AGV")) {
                                transParent.setTransType("11");
                            }
                            int i = applyOutStation(transParent);
                            if (i == 1) {
                                rcsReturn.setCode("SUCCESS");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            } else {
                                // 返回RCS
                                rcsReturn.setCode("Err_Internal");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            }
                        }
                        break;
                    }
                    //AGV放货离站请求
                    case APPLY_OFF_STATION: {
                        //如果是立库站点直接允许离站
                        if (task.getStaNo().equals("401") || task.getStaNo().equals("402") || task.getStaNo().equals("307")) {
                            RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                            rcsTaskContinue.setRobotTaskCode(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            rcsTaskContinue.setTriggerType("TASK");
                            rcsTaskContinue.setTriggerCode(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            String url = HIK_URL + "api/robot/controller/task/extend/continue";
                            String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
                            if (!StringUtils.isEmpty(response) && response.contains("code")) {
                                RcsReturn rcsReturn1 = JSONObject.parseObject(response, RcsReturn.class);
                                if ("SUCCESS".equals(rcsReturn1.getCode())) {
                                    // 返回RCS
                                    rcsReturn.setCode("SUCCESS");
                                    rcsReturn.setMessage("");
                                    JSONObject data = new JSONObject();
                                    data.put("robotTaskCode", robotTaskCode);
                                    rcsReturn.setData(data);
                                } else {
                                    // 返回RCS
                                    rcsReturn.setCode("Err_Internal");
                                    rcsReturn.setMessage("");
                                    JSONObject data = new JSONObject();
                                    data.put("robotTaskCode", robotTaskCode);
                                    rcsReturn.setData(data);
                                }
                            }
                        } else {
                            // 延迟处理,确保到站完成信号优先处理
                            try {
                                Thread.sleep(5000); // 睡眠5秒
                            } catch (InterruptedException e)
                            {
                                Thread.currentThread().interrupt();
                            }
                            //如果是工位需要像mes请求离站
                            TransParent transParent = new TransParent();
                            transParent.setTaskno(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setTaskname(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setStationId(values.getString("slotName"));
                            transParent.setAgvFactory(1);
                            transParent.setAgvCode("1");//连接器库
                            //08-1是空托盘转序任务
                            //08-2是物料转序任务
                            if (task.getTaskType().equals("ZX-AGV-08-1")) {
                                transParent.setTransType("08-1");
                            } else if (task.getTaskType().equals("ZX-AGV-08-2")) {
                                transParent.setTransType("08-2");
                            } else if (task.getTaskType().equals("PP-AGV")) {
                                transParent.setTransType("10");
                            } else if (task.getTaskType().equals("ZP-AGV")) {
                                transParent.setTransType("11");
                            }
                            int i = applyOutStation(transParent);
                            if (i == 1) {
                                rcsReturn.setCode("SUCCESS");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            } else {
                                // 返回RCS
                                rcsReturn.setCode("Err_Internal");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            }
                        }
                        break;
                    }
                    //到站完成
                    case ARRIVE_ON_STATION: {
                        if ( values.getString("slotName").equals("401") || values.getString("slotName").equals("402") || values.getString("slotName").equals("307")) {
                            // 返回RCS
                            rcsReturn.setCode("SUCCESS");
                            rcsReturn.setMessage("");
                            JSONObject data = new JSONObject();
                            data.put("robotTaskCode", robotTaskCode);
                            rcsReturn.setData(data);
                        } else {
                            TransParent transParent = new TransParent();
                            transParent.setTaskno(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setTaskname(task.getTaskNo() + "-" + (task.getCtnType() - 1));
                            transParent.setStationId(values.getString("slotName"));
                            transParent.setAgvFactory(1);
                            transParent.setAgvCode("1");//连接器库
                            //08-1是空托盘转序任务
                            //08-2是物料转序任务
                            if (task.getTaskType().equals("ZX-AGV-08-1")) {
                                transParent.setTransType("08-1");
                            } else if (task.getTaskType().equals("ZX-AGV-08-2")) {
                                transParent.setTransType("08-2");
                            } else if (task.getTaskType().equals("PP-AGV")) {
                                transParent.setTransType("10");
                            } else if (task.getTaskType().equals("ZP-AGV")) {
                                transParent.setTransType("11");
                            }
                            int i = AGVArrivalCompletedFit(transParent);
                            if (i == 1) {
                                rcsReturn.setCode("SUCCESS");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            } else {
                                // 返回RCS
                                rcsReturn.setCode("Err_Internal");
                                rcsReturn.setMessage("");
                                JSONObject data = new JSONObject();
                                data.put("robotTaskCode", robotTaskCode);
                                rcsReturn.setData(data);
                            }
                        }
                        break;
                    }
                    default: {
                    }
@@ -262,6 +673,105 @@
        return rcsReturn;
    }
    /**
     * 到站完成:AGV到达工位里面--》mes到位完成
     *
     * @param apply
     * @return
     */
    public int AGVArrivalCompletedFit(TransParent apply) {
        String url = MES_URL + "AGVArrivalCompletedFit";
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")) {
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
            if ("1".equals(mesReturn.getSuccess())) {
                return 1;
            }
        }
        return 0;
    }
    /**
     * 离站完成:wms->mes
     * AGV离开接驳位后发送离开状态给MES
     *
     * @param apply
     * @return
     */
    public int AGVDepartureCompleted(TransParent apply) {
        String url = MES_URL + "AGVDepartureCompleted";
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")) {
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
            if ("1".equals(mesReturn.getSuccess())) {
                return 1;
            }
        }
        return 0;
    }
    /**
     * 入站请求:转发AGV->入站请求->给MES
     *
     * @param apply
     * @return
     */
    public int applyInStation(TransParent apply) {
        String path = "AGVTransportPalletNotice";
        String url = MES_URL + path;
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")) {
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
            if ("1".equals(mesReturn.getSuccess())) {
                return 1;
            }
        }
        return 0;
    }
    /**
     * 离站请求:转发AGV->离站请求->给MES
     *
     * @param apply
     * @return
     */
    public int applyOutStation(TransParent apply) {
        String url = MES_URL + "AGVDepartureRequest";
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")) {
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
            if ("1".equals(mesReturn.getSuccess())) {
                return 1;
            }
        }
        return 0;
    }
    @Override
    public R bindOrUnbind (BindOrUnbindParam param) {
        //1.先进行绑定
        String url = HIK_URL + "api/robot/controller/carrier/bind";
        String response = sendPost(url, JSONObject.toJSONString(param));
        if (!StringUtils.isEmpty(response) && response.contains("code")) {
            RcsReturn rcsReturn1 = JSONObject.parseObject(response, RcsReturn.class);
            if ("SUCCESS".equals(rcsReturn1.getCode())) {
                //2.绑定成功,对站定进行解绑
                String url1 = HIK_URL + "api/robot/controller/carrier/unbind";
                String response1 = sendPost(url, JSONObject.toJSONString(param));
                return R.ok();
            } else {
                R.error("绑定失败,该区域满了");
            }
        }else {
            return R.error();
        }
        return R.ok();
    }
    /**
     * 向指定 URL 发送POST方法的请求
     *
@@ -322,4 +832,55 @@
        }
        return result.toString();
    }
    public void agvPause(StaProtocol staProtocol){
        if (staProtocol.isHighError()) {
            JSONObject params = new JSONObject();
            if (staProtocol.getSiteId()==402) {
                params.put("zoneCode", "GK402");
                params.put("mapCode", "BB");
                params.put("invoke", "FREEZE");
                System.out.println("402超高报警");
            }else if (staProtocol.getSiteId() == 401){
                params.put("zoneCode", "GK401");
                params.put("mapCode", "BB");
                params.put("invoke", "FREEZE");
                System.out.println("401超高报警");
            }
            String url = HIK_URL + "api/robot/controller/zone/pause";
            try {
                String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(params));
                JSONObject jsonObject = JSON.parseObject(response);
                if (!StringUtils.isEmpty(response) && (jsonObject.getString("code").equals("SUCCESS") || jsonObject.getInteger("code") == 200)) {
                    System.out.println("暂停成功");
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        if (!staProtocol.isHighError()) {
            JSONObject params = new JSONObject();
            if (staProtocol.getSiteId()==402) {
                params.put("zoneCode", "GK402");
                params.put("mapCode", "BB");
                params.put("invoke", "RUN");
            }else if (staProtocol.getSiteId() == 401){
                params.put("zoneCode", "GK401");
                params.put("mapCode", "BB");
                params.put("invoke", "RUN");
                System.out.println("尝试启动401口AGV");
            }
            String url = HIK_URL + "api/robot/controller/zone/pause";
            try {
                String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(params));
                JSONObject jsonObject = JSON.parseObject(response);
                if (!StringUtils.isEmpty(response) && (jsonObject.getString("code").equals("SUCCESS") || jsonObject.getInteger("code") == 200)) {
                    System.out.println("AGV启动成功");
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
}
src/main/java/com/zy/common/model/MatDto.java
@@ -81,4 +81,15 @@
        this.total = total;
        this.sku = sku;
    }
    public MatDto(String matNo, String maktx, Double count,Double total,String specs,String sku,String barcode) {
        this.specs = specs;
        this.matnr = matNo;
        this.maktx = maktx;
        this.maknx = maktx;
        this.count = count;
        this.total = total;
        this.sku = sku;
        this.barcode = barcode;
    }
}
src/main/java/com/zy/common/utils/HikUtils.java
@@ -15,23 +15,45 @@
    public void startPic(String ip, String filename) {
        try {
            if (hikUrl == null || "".equals(hikUrl)) {
                News.error("hikUrl配置为空,无法进行拍摄");
                return;
            }
            if (ip == null || "".equals(ip)) {
                News.error("IP地址为空,无法进行拍摄");
                return;
            }
            if (filename == null || "".equals(filename)) {
                News.error("文件名为空,无法进行拍摄");
                return;
            }
            HashMap<String, Object> data = new HashMap<>();
            data.put("ip", ip);
            data.put("filename", filename);
            String response = new HttpHandler.Builder()
                    .setUri(hikUrl)
                    .setPath("/startPic")
                    .setPath("/capture")
                    .setJson(JSON.toJSONString(data))
                    .build()
                    .doPost();
            if (response == null || "".equals(response)) {
                News.error("请求接口失败,返回值为空");
                return;
            }
            JSONObject jsonObject = JSON.parseObject(response);
            if (jsonObject.getInteger("code").equals(200)) {
                News.error("请求接口成功!!!url:{};request:{};response:{}", hikUrl + "/startPic", JSON.toJSONString(data), response);
            if (jsonObject == null) {
                News.error("解析响应失败,返回值不是有效的JSON");
                return;
            }
            Boolean success = jsonObject.getBoolean("success");
            if (success != null && success) {
                News.error("请求接口成功!!!url:{};request:{};response:{}", hikUrl + "/capture", JSON.toJSONString(data), response);
            } else {
                News.error("请求接口失败!!!url:{};request:{};response:{}", hikUrl + "/startPic", JSON.toJSONString(data), response);
                News.error("请求接口失败!!!url:{};request:{};response:{}", hikUrl + "/capture", JSON.toJSONString(data), response);
            }
        } catch (Exception e) {
            News.error("拍摄失败:{}", e.getMessage());
            e.printStackTrace();
        }
    }
src/main/java/com/zy/core/MainProcess.java
@@ -59,7 +59,7 @@
                    mainService.crnIoExecute(5);
                    // 入出库增强 ===>> 堆垛机命令下发后,异步修改工作档状态
//                    mainService.crnIoWrkMast();
                    // 入库  ===>> 执行对工作档的完成操作
                    // 入出库  ===>> 执行对工作档的完成操作
                    mainService.storeFinished(6);
                    // 堆垛机异常信息记录
                    mainService.recCrnErr(7);
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -93,7 +93,7 @@
        basDevp.setLocType1((short) 0);  // 高低类型{0:未知,1:低库位,2:高库位}
        basDevp.setLocType2((short) 0);  // 宽窄类型{0:未知,1:窄库位,2:宽库位}
        basDevp.setLocType3((short) 0);  // 轻重类型{0:未知,1:轻库位,2:重库位}
        basDevp.setLocType1(high != low && low ? (short) 1 : (short) 2);
        basDevp.setLocType1(high != low ? (low ? (short) 1 : (short) 2) : (short) 0);
        basDevp.setInreq1(emptyOutType?"Y":"N");
        return basDevp;
    }
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -13,6 +13,7 @@
import com.zy.asrs.entity.DeviceDataLog;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.DeviceDataLogService;
import com.zy.asrs.service.impl.RcsServiceImpl;
import com.zy.common.utils.News;
import com.zy.core.DevpThread;
import com.zy.core.cache.MessageQueue;
@@ -25,6 +26,7 @@
import com.zy.core.model.protocol.StaProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.MessageFormat;
import java.util.*;
@@ -236,20 +238,40 @@
            }
        }
        //外形检测
        //外形检测 - 带防抖处理
        Integer[] arr={401,402};
        OperateResultExOne<byte[]> resultErr1 = siemensS7Net.Read("DB101.702.0", (short) (arr.length*6));
        for (int i = 0; i < arr.length; i++) {
            StaProtocol staProtocol1 = station.get(arr[i]);
            if(resultErr1.IsSuccess){
            if(resultErr1.IsSuccess && staProtocol1 != null){
                boolean[] status1 = siemensS7Net.getByteTransform().TransBool(resultErr1.Content, i*6, 1);
                // 【新增】保存旧的超高状态
                boolean oldHighError = staProtocol1.isHighError();
                // 更新所有状态
                staProtocol1.setFrontError(status1[0]);
                staProtocol1.setBackError(status1[1]);
                staProtocol1.setHighError(status1[2]);
                staProtocol1.setHighError(status1[2]);  // 超高状态
                staProtocol1.setLeftError(status1[3]);
                staProtocol1.setRightError(status1[4]);
                staProtocol1.setWeightError(status1[5]);
                staProtocol1.setBarcodeError(status1[6]);
                // 【新增】超高状态变化处理 - 只有变化时才调用
                if (oldHighError != status1[2]) {
                    try {
                        RcsServiceImpl rcsService = SpringUtils.getBean(RcsServiceImpl.class);
                        if (rcsService != null) {
                            rcsService.agvPause(staProtocol1);
                            log.info("超高状态变化 - 站点: {}, 状态: {} -> {}, 已调用AGV控制",
                                    arr[i], oldHighError, status1[2]);
                        }
                    } catch (Exception e) {
                        log.error("调用agvPause失败 - 站点: {}, 错误: {}", arr[i], e.getMessage());
                    }
                }
            }
        }
src/main/resources/application.yml
@@ -8,13 +8,13 @@
    name: @pom.build.finalName@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=jnejc-hkwms
    url: jdbc:sqlserver://172.26.11.80:1433;databasename=jnejc-hkwms
    username: sa
    password: sa@123
  mvc:
    static-path-pattern: /**
zyHikUrl: 10.10.10.200:9091/hik
zyHikUrl: 172.26.4.184:8000
#  redis:
#    host: localhost
#    port: 6379
@@ -38,10 +38,26 @@
wms:
  url: 127.0.0.1:8084/hkwms
#mes对接
mes:
  url: http://192.9.100.173:8088/prod-api/basicmodel/WmsFit/Api/
#  url: http://172.26.160.73:8080/basicmodel/WmsFit/Api/
#  url: http://172.26.160.5:8080/basicmodel/WmsFit/Api/
  #默认接口操作人员id
  defaultUserId: 30
#海康对接
hik:
  switch: false
  url: http://172.26.11.98:80/rcs/rtas/
  station: Z-LVL20,Z-LVL21,Z-LVL22,Z-LVL23,Z-LVL24,Z-LVL25,Z-LVL26,Z-LVL27,Z-LVL28,Z-LVL29,Z-LVL30,Z-LVL31
            Z-LZP1,Z-LZP2,Z-LZP3,Z-LZP4,Z-LZP5,Z-LZP6,Z-LZP7,Z-LZP8,Z-LZP9,Z-LZP10,Z-LZP11,Z-LZP12,Z-LZP13,Z-LZP14,
            Z-LZP15,Z-LZP16,Z-LZP17,Z-LZP18,Z-LZP19,Z-LZP20,Z-LZP21,Z-LZP22,Z-LZP23,Z-LZP24,Z-LZP25,Z-LZP26,Z-LZP27
            Z-LZP28,Z-LZP29,Z-LZP30,Z-LZP31,Z-LZP32,Z-LZP33
  renyuan: Z-LZH25,Z-LZH26,Z-LZH27,Z-LZH28,Z-LZH29,Z-LZH30,Z-LZH31,Z-LZH32,Z-LZH33,Z-LZH34,Z-LZH35,Z-LZH36,Z-LZH37,
            Z-LZH38,Z-LZH39,L-LZH40,L-LZH41,L-LZH42,Z-LZP7,Z-LZP8,Z-LZP9,Z-LZP10,Z-LZP11,Z-LZP12,Z-LZP13,Z-LZP14,
            Z-LZP15,Z-LZP16,Z-LZP17,Z-LZP18,Z-LZP19,Z-LZP20,Z-LZP21,Z-LZP22,Z-LZP23,Z-LZP24,Z-LZP25,Z-LZP26,Z-LZP27
            Z-LZP28,Z-LZP29,Z-LZP30,Z-LZP31
# 下位机配置
wcs-slave:
@@ -50,7 +66,7 @@
  # 双深库位排号
  doubleLocs: 3
  # 左深库位排号
#  doubleLocsLeft: 4,7,11,15,19,23
  #  doubleLocsLeft: 4,7,11,15,19,23
  # 右深库位排号
  doubleLocsRight: 3
  # 左浅库位排号
@@ -73,28 +89,28 @@
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 401
      row: 1
      row: 6
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 402
      row: 1
      row: 6
      bay: 15
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 401
      row: 1
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 402
      row: 1
      row: 6
      bay: 15
      lev: 1
  # 输送线1
@@ -149,24 +165,24 @@
      staNo: 402
      led: ${wcs-slave.led[1].id}
  # 输送线2
#  devp[1]:
#    id: 2
#    ip: 172.17.60.118
#    port: 102
#    rack: 0
#    slot: 0
#    # 入库口1
#    inSta[0]:
#      staNo: 1002
#      barcode: ${wcs-slave.barcode[2].id}
#      backSta: 1001
#      led: ${wcs-slave.led[7].id}
#    # 入库口2
#    inSta[1]:
#      staNo: 1007
#      barcode: ${wcs-slave.barcode[3].id}
#      backSta: 1003
#      led: ${wcs-slave.led[8].id}
  #  devp[1]:
  #    id: 2
  #    ip: 172.17.60.118
  #    port: 102
  #    rack: 0
  #    slot: 0
  #    # 入库口1
  #    inSta[0]:
  #      staNo: 1002
  #      barcode: ${wcs-slave.barcode[2].id}
  #      backSta: 1001
  #      led: ${wcs-slave.led[7].id}
  #    # 入库口2
  #    inSta[1]:
  #      staNo: 1007
  #      barcode: ${wcs-slave.barcode[3].id}
  #      backSta: 1003
  #      led: ${wcs-slave.led[8].id}
  # 条码扫描仪1
  barcode[0]:
    id: 1
@@ -177,27 +193,27 @@
    id: 2
    ip: 10.10.10.121
    port: 51236
#  # 条码扫描仪3
#  barcode[2]:
#    id: 3
#    ip: 10.10.10.121
#    port: 51236
#  # 条码扫描仪4
#  barcode[3]:
#    id: 4
#    ip: 10.10.10.121
#    port: 51236
   # LED1
    #  # 条码扫描仪3
    #  barcode[2]:
    #    id: 3
    #    ip: 10.10.10.121
    #    port: 51236
    #  # 条码扫描仪4
    #  barcode[3]:
    #    id: 4
    #    ip: 10.10.10.121
    #    port: 51236
    # LED1
  led[0]:
    id: 1
    ip: 172.26.4.211
    ip: 172.26.4.163
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 401
  # LED2
  led[1]:
    id: 2
    ip: 172.26.4.212
    ip: 172.26.4.161
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 402
src/main/resources/logback-spring.xml
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志保存路径 -->
    <property name="LOG_PATH" value="D:/hkwcslogs/hk" />
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <property name="CONSOLE_LOG_PATTERN"