*
lsh
2025-04-28 808d32829a61f6f1de0b989b2c818327d3bf74ef
*
14个文件已修改
2个文件已添加
898 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/StaDesc.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/ToWmsDTO.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/BasCrnpWmsParam.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/BasRgvWmsParam.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/CarryParam.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/WMSAndAGVInterfaceParam.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/TaskWrkMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 378 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/DevpThread.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/DevpSlave.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -8,13 +8,18 @@
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CarryParam;
import com.zy.asrs.entity.param.TaskOverParam;
import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam;
import com.zy.asrs.entity.param.TaskCreateParam;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.BasCrnErrorServiceImpl;
import com.zy.asrs.utils.Utils;
import com.zy.common.web.BaseController;
import com.zy.core.CrnThread;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.properties.SlaveProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -30,6 +35,8 @@
@RequestMapping("/open")
public class OpenController extends BaseController {
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private OpenService openService;
    @Autowired
@@ -57,6 +64,9 @@
    public static final ArrayList<String> APP_KEY_LIST = new ArrayList<String>() {{
        add("ea1f0459efc02a79f046f982767939ae");
    }};
    @Autowired
    private BasCrnErrorServiceImpl basCrnErrorService;
    //agv任务完成
    @PostMapping("/toAgvTaskOver")
    @AppAuth(memo = "agv任务完成接口")
@@ -314,13 +324,16 @@
    //任务下发接口
    @PostMapping("/outboundTaskSend")
//    @PostMapping("/taskCreate")
//    @AppAuth(memo = "任务下发接口")
    @Transactional
    public R outboundTaskSend(@RequestHeader String appkey,
                              @RequestBody List<CarryParam> params,
                              @RequestBody List<CarryParam> params,//中航下发  1:出库,2:移库 3:入库
                              HttpServletRequest request) {
        //auth(appkey, params, request);
        List<WMSAndAGVInterfaceParam> params1 =new ArrayList<>();
        auth(appkey, params, request);
//        List<WMSAndAGVInterfaceParam> params1 =new ArrayList<>();
        for (CarryParam param:params){
            param.updateIoTyoe(param.getIoType());//中航下发  1:出库,2:移库 3:入库   ====转换为====>  1:入库,2:出库,3:移库
            if (Cools.isEmpty(param)){
                return R.error("参数为空!");
@@ -351,7 +364,18 @@
            R r = null;
            if(param.getIoType() == 2){
            if(param.getIoType() == 1){
                //入库任务创建
                StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                        .eq("type_no",1)
                        .eq("crn_no",locMast.getCrnNo())
                        .eq("stn_no",param.getStartPoint()));
                if(Cools.isEmpty(staDesc)){
                    return R.error("入库路劲不存在");
                }
                r = openService.taskCreate(new TaskCreateParam(param,staDesc.getCrnNo()));
            }else if(param.getIoType() == 2){
                //出库任务创建
                StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                        .eq("type_no",2)
@@ -362,6 +386,13 @@
                }
                r = openService.taskCreate(new TaskCreateParam(param,staDesc.getCrnNo()));
            }else if (param.getIoType() == 3){
                LocMast locMast2 = locMastService.selectByLocNo(param.getTargetPoint());
                if(Cools.isEmpty(locMast2)){
                    return R.error("目标库位无法找到");
                }
                if (!locMast2.getCrnNo().equals(locMast.getCrnNo())){
                    return R.error("起始库位与目标库位不再同一巷道");
                }
                //移库任务创建
                r = openService.taskCreate(new TaskCreateParam(param,locMast.getCrnNo()));
            }
@@ -383,9 +414,10 @@
    //任务取消接口
    @PostMapping("/taskCancel")
    public R taskCancel(@RequestHeader String appkey,
                               @RequestBody WMSAndAGVInterfaceParam param,
                               @RequestBody WMSAndAGVInterfaceParam param,//中航下发  1:出库,2:移库 3:入库    1:取消  2 完成
                               HttpServletRequest request) {
        auth(appkey, param, request);
//        param.updateTaskStatus(param.getTaskStatus());
        if (Cools.isEmpty(param)){
            return R.error("参数为空!");
        } else if (Cools.isEmpty(param.getTaskNo())){
@@ -446,10 +478,35 @@
        for (BasDevp basDevp:basDevps){
            list.add(basDevp);
        }
        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
        for (BasCrnp basCrnp:basCrnps){
            list.add(basCrnp);
        List<BasCrnpWmsParam> basCrnpWmsParamList = new ArrayList<>();
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            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;
        }
            BasCrnpWmsParam basCrnpWmsParam = new BasCrnpWmsParam();
            basCrnpWmsParam.sync(basCrnp);
            basCrnpWmsParam.setCrnNoH(crnProtocol.getLaneNo());
            basCrnpWmsParamList.add(basCrnpWmsParam);
            BasCrnError basCrnError = basCrnErrorService.selectById(basCrnp.getCrnErr());
            basCrnpWmsParam.setCrnErrM(basCrnError.getErrName());
            list.add(basCrnpWmsParam);
        }
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
        }
//        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
//        for (BasCrnp basCrnp:basCrnps){
//            list.add(basCrnp);
//        }
        return R.ok(list);
    }
src/main/java/com/zy/asrs/entity/StaDesc.java
@@ -69,14 +69,6 @@
    private Integer crnNo;
    /**
     * 堆垛机号
     */
    @ApiModelProperty(value= "堆垛机号")
    @TableId(value = "LANE_NO", type = IdType.INPUT)
    @TableField("LANE_NO")
    private Integer laneNo;
    /**
     * 堆垛机站点
     */
    @ApiModelProperty(value= "堆垛机站点")
@@ -307,13 +299,5 @@
            return "";
        }
        return basWrkIotype.getIoDesc();
    }
    public Integer getLaneNo() {
        return laneNo;
    }
    public void setLaneNo(Integer laneNo) {
        this.laneNo = laneNo;
    }
}
src/main/java/com/zy/asrs/entity/ToWmsDTO.java
@@ -23,11 +23,18 @@
    private Integer stationCode;
    //库位类型
    private Integer locType;
    private Integer status;//空满版
    public ToWmsDTO(String barcode, Integer stationCode, Integer locType){
//    public ToWmsDTO(String barcode, Integer stationCode, Integer locType){
//        this.barcode = barcode;
//        this.stationCode = stationCode;
//        this.locType = locType;
//    }
    public ToWmsDTO(String barcode, Integer stationCode, Integer status){
        this.barcode = barcode;
        this.stationCode = stationCode;
        this.locType = locType;
        this.status = status;
    }
    public ToWmsDTO(){
src/main/java/com/zy/asrs/entity/param/BasCrnpWmsParam.java
New file
@@ -0,0 +1,128 @@
package com.zy.asrs.entity.param;
import com.zy.common.utils.Synchro;
import lombok.Data;
import java.util.Date;
@Data
public class BasCrnpWmsParam {
    /**
     * 编号
     */
    private Integer crnNo;
    private Integer crnNoH;
    /**
     * 可入
     */
    private String inEnable;
    /**
     * 可出
     */
    private String outEnable;
    /**
     * 状态
     */
    private Integer crnSts;
    /**
     * 工作号
     */
    private Integer wrkNo;
    /**
     * 异常码
     */
    private Long crnErr;
    private String crnErrM;
    /**
     * 源库位
     */
    private String frmLocno;
    /**
     * 源站
     */
    private Integer frmSta;
    /**
     * 目标站
     */
    private Integer toSta;
    /**
     * 目标库位
     */
    private String toLocno;
    /**
     * 创建者
     */
    private Long appeUser;
    /**
     * 创建时间
     */
    private Date appeTime;
    /**
     * 修改人员
     */
    private Long modiUser;
    /**
     * 修改时间
     */
    private Date modiTime;
    private String hpMk;
    private String retrieveMk;
    private String ctlHp;
    private String ctlRest;
    private String empIn;
    private Integer tankQty;
    private Integer tankQty1;
    public BasCrnpWmsParam() {}
    public BasCrnpWmsParam(Integer crnNo, Integer crnNoH, String inEnable, String outEnable, Integer crnSts, Integer wrkNo, Long crnErr, String frmLocno, Integer frmSta, Integer toSta, String toLocno, Long appeUser, Date appeTime, Long modiUser, Date modiTime, String hpMk, String retrieveMk, String ctlHp, String ctlRest, String empIn, Integer tankQty, Integer tankQty1) {
        this.crnNo = crnNo;
        this.crnNoH = crnNoH;
        this.inEnable = inEnable;
        this.outEnable = outEnable;
        this.crnSts = crnSts;
        this.wrkNo = wrkNo;
        this.crnErr = crnErr;
        this.frmLocno = frmLocno;
        this.frmSta = frmSta;
        this.toSta = toSta;
        this.toLocno = toLocno;
        this.appeUser = appeUser;
        this.appeTime = appeTime;
        this.modiUser = modiUser;
        this.modiTime = modiTime;
        this.hpMk = hpMk;
        this.retrieveMk = retrieveMk;
        this.ctlHp = ctlHp;
        this.ctlRest = ctlRest;
        this.empIn = empIn;
        this.tankQty = tankQty;
        this.tankQty1 = tankQty1;
    }
    public void sync(Object source) {
        Synchro.Copy(source, this);
    }
}
src/main/java/com/zy/asrs/entity/param/BasRgvWmsParam.java
New file
@@ -0,0 +1,31 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class BasRgvWmsParam {
    /**
     * 编号
     */
    private Integer steNo;
    /**
     * 状态
     */
    private Integer crnSts;
    /**
     * 工作号
     */
    private Integer wrkNo;
    /**
     * 异常码
     */
    private Long steErr;
    private String steErrM;
    public BasRgvWmsParam() {}
}
src/main/java/com/zy/asrs/entity/param/CarryParam.java
@@ -22,4 +22,20 @@
    //备注
    private String meno;
    public void updateIoTyoe(Integer ioTypeOld){
        switch (ioTypeOld){
            case 1:
                this.ioType = 2;
                break;
            case 2:
                this.ioType = 3;
                break;
            case 3:
                this.ioType = 1;
                break;
            default:
                this.ioType = 3;
        }
    }
}
src/main/java/com/zy/asrs/entity/param/WMSAndAGVInterfaceParam.java
@@ -53,5 +53,16 @@
    private String requestType;         //请求类型:         1=取货;2=放货
    private String wharfCode;           //码头编号
//
//    public void updateTaskStatus(Integer TaskStatusOld){
//        switch (TaskStatusOld){
//            case 1:
//                this.taskStatus = 1;
//                break;
//            case 2:
//                this.taskStatus = 3;
//            default:
//                this.ioType = 0;
//        }
//    }
}
src/main/java/com/zy/asrs/mapper/TaskWrkMapper.java
@@ -34,6 +34,8 @@
    TaskWrk selectCrnNoInWorking(@Param("crnNo") Integer crnNo,@Param("workNo") Integer workNo);
    TaskWrk selectWalkSta(@Param("crnNo") Integer crnNo,@Param("workNo") Integer workNo);
    List<TaskWrk> selectToBeHistoryData();
    int saveToHistory(String taskNo);//将任务转历史日志
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -180,8 +180,10 @@
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading()
                            && staProtocol.isInEnable()
                            && !staProtocol.isEmptyMk() && (workNo == 9991 )
                            && staProtocol.isPakMk()) {
                            && !staProtocol.isEmptyMk() && (workNo == 0 || (workNo>9000 && workNo<10000))
                            && staProtocol.isPakMk()
                            && staProtocol.isPakMkWalk()
                    ) {
                        // 获取条码扫描仪信息
                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                        if (barcodeThread == null) {
@@ -190,13 +192,14 @@
                        String barcode = barcodeThread.getBarcode();
                        if(!Cools.isEmpty(barcode) && !barcode.equals("99999999")) {
                            // 请求wms接口,获取工作号和目标库位
                            ToWmsDTO toWmsDTO = new ToWmsDTO(barcode,staProtocol.getSiteId(),staProtocol.isHigh() ? 2 : 1);
                            ToWmsDTO toWmsDTO = new ToWmsDTO(barcode, staProtocol.getSiteId(), 0);
                            TaskWrk taskWrk1=taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode",barcode));
                            if(!Cools.isEmpty(taskWrk1)){
                                log.info("托盘码:"+barcode+"任务档存在");
                                if (taskWrk1.getIoType()==1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())){
                                    StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                            .eq("crn_no", taskWrk1.getCrnNo()).eq("type_no",1).eq("stn_no",staProtocol.getSiteId()));
                                            .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId()));
                                    if (Cools.isEmpty(staDesc)){
                                        log.info("托盘码:"+barcode+"任务档存在");
                                        return;
@@ -238,11 +241,6 @@
                                staProtocol.setStaNo(inSta.getStaNo());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                    TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
//                                    if (taskWrk != null) {
//                                        taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示
//                                        taskWrkMapper.updateById(taskWrk);
//                                    }
                                continue;
                            }
@@ -257,33 +255,10 @@
                            );
                            log.info("入库请求参数{}" + JSON.toJSONString(toWmsDTO));
                            log.info("入库请求返回参数{}" + JSON.toJSONString(response));
                            if (jsonObject.getInteger("code").equals(200) && !Cools.isEmpty(jsonObject.get("data").toString())) {
                                GetWmsDto getWmsDto = JSON.parseObject(jsonObject.get("data").toString(), GetWmsDto.class);
                            if (jsonObject.getInteger("code").equals(200)) {
                                try{
                                    BasDevp basDevp = basDevpService.selectById(inSta.getStaNo());
                                    if (Cools.isEmpty(basDevp)){
                                        log.error("站点号异常1"+inSta.getStaNo());
                                        throw new CoolException("站点号异常1,未查询到站点信息"+inSta.getStaNo());
                                    }
                                    Integer staNoCrnNo = Utils.StaNoCrnNo(inSta.getStaNo());
                                    if (staNoCrnNo==0){
                                        basDevp.setStaErr(1);
                                        basDevpService.updateById(basDevp);
                                        log.error("站点号异常2"+inSta.getStaNo());
                                        throw new CoolException("站点号异常2,站点号不存在"+inSta.getStaNo());
                                    }else {
                                        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                                                .eq("crn_no", staNoCrnNo.longValue())
                                                .eq("loc_no", getWmsDto.getLocNo()));
                                        if (Cools.isEmpty(locMast)){
                                            basDevp.setStaErr(1);
                                            basDevpService.updateById(basDevp);
                                            log.error("站点号异常3"+inSta.getStaNo());
                                            throw new CoolException("站点号异常3:此巷道不存在目标库位"+inSta.getStaNo());
                                        }
                                    }
                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                                } catch (Exception e){
//                                    log.error("扫码检测程序异常"+inSta.getStaNo()+"异常信息"+e);
                                    // 退回
                                    log.error("扫码检测程序异常"+inSta.getStaNo()+errMsg);
                                    log.error("扫码检测程序异常,异常信息"+e);
@@ -292,67 +267,9 @@
                                    staProtocol.setStaNo(inSta.getStaNo());
                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                    TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
//                                    if (taskWrk != null) {
//                                        taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示
//                                        taskWrkMapper.updateById(taskWrk);
//                                    }
                                    continue;
                                }
                                //查看该库位是否为空库位
                                LocMast locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                                        .eq("loc_sts","O")
                                        .eq("loc_no",getWmsDto.getLocNo()));
                                if(Cools.isEmpty(locMast)){
                                    try{
                                        HashMap<String, Object> headParam1 = new HashMap<>();
                                        headParam1.put("taskNo",getWmsDto.getTaskNo());
                                        headParam1.put("status",6);
                                        headParam1.put("ioType",1);
                                        headParam1.put("barcode",barcode);
                                        String response2;
                                        response2 = new HttpHandler.Builder()
                                                // .setHeaders(headParam)
                                                .setUri(wmsUrl)
                                                .setPath(taskStatusFeedbackPath)
                                                .setJson(JSON.toJSONString(headParam1))
                                                .build()
                                                .doPost();
                                        JSONObject jsonObject1 = JSON.parseObject(response2);
                                        apiLogService.save("wcs派发库位==》不为空《==上报wms"
                                                ,wmsUrl+taskStatusFeedbackPath
                                                ,null
                                                ,"127.0.0.1"
                                                ,JSON.toJSONString(headParam1)
                                                ,response
                                                ,true
                                        );
                                    }catch (Exception e){
                                        log.error("wcs派发库位==》不为空《==上报wms", getWmsDto.getWrkNo());
                                        throw new CoolException("wcs派发入库任务上报wms失败,派发库位==》不为空《==,异常信息:"+e);
                                    }
                                }
                                // 创新一个入库工作档
                                TaskWrk taskWrk = taskWrkService.selectByTaskNo(getWmsDto.getWrkNo());
                                if(Cools.isEmpty(taskWrk)) {
                                    taskWrk = createTask(getWmsDto,barcode);
                                    if (Cools.isEmpty(taskWrk)){
                                        log.error("库位异常,库位号:{}", getWmsDto.getTargetLocationCode());
                                    }else {
                                        taskWrkService.insert(taskWrk);
                                        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                                .eq("crn_no", taskWrk.getCrnNo()).eq("type_no",1).eq("stn_no",staProtocol.getSiteId()));
                                        staProtocol.setWorkNo(taskWrk.getWrkNo());
                                        staProtocol.setStaNo(staDesc.getCrnStn());
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    }
                                }
                            }else {
                                continue;
                            }
                        } else {
                            // 退回
                            log.error("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
@@ -379,6 +296,254 @@
        }
    }
    public void generateStoreWrkFileIsEmptyMk() {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历入库口
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    // 获取入库站信息
                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    Integer workNo = staProtocol.getWorkNo();
                    Integer stano = staProtocol.getStaNo();
                    // 尺寸检测异常
                    boolean back = false;
                    String errMsg = "";
                    if (staProtocol.isFrontErr()) {
                        errMsg = "前超限";
                        back = true;
                    }
                    if (!back && staProtocol.isBackErr()) {
                        errMsg = "后超限";
                        back = true;
                    }
                    if (!back && staProtocol.isHighErr()) {
                        errMsg = "高超限";
                        back = true;
                    }
                    if (!back && staProtocol.isLeftErr()) {
                        errMsg = "左超限";
                        back = true;
                    }
                    if (!back && staProtocol.isRightErr()) {
                        errMsg = "右超限";
                        back = true;
                    }
                    if (!back && staProtocol.isWeightErr()) {
                        errMsg = "超重";
                        back = true;
                    }
                    // 退回
                    if (back) {
                        if (stano == inSta.getBackSta().shortValue()) {
                            continue;
                        }
                        if (workNo == 0 && stano == 0) {
                            continue;
                        }
                        if (!staProtocol.isPakMk()) {
                            continue;
                        }
//                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
                        staProtocol.setWorkNo(workNo);
                        staProtocol.setStaNo(inSta.getStaNo());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
                        if (taskWrk != null) {
                            taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示
                            taskWrk.setModiTime(new Date());
                            taskWrkMapper.updateById(taskWrk);
                        }
                        continue;
                    }
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading()
                            && staProtocol.isInEnable()
                            && staProtocol.isEmptyMk() && (workNo == 0 || (workNo>9000 && workNo<10000))
                            && staProtocol.isPakMk()
                            && staProtocol.isPakMkWalk()
                    ) {
                        // 请求wms接口,获取工作号和目标库位
                        ToWmsDTO toWmsDTO = new ToWmsDTO("", staProtocol.getSiteId(), 1);
                        HashMap<String, Object> headParam = new HashMap<>();
                        headParam.put("Content-Type", "application/json");
                        String response;
                        try {
                            response = new HttpHandler.Builder()
                                    // .setHeaders(headParam)
                                    .setUri(wmsUrl)
                                    .setPath(inboundTaskApplyPath)
                                    .setJson(JSON.toJSONString(toWmsDTO))
                                    .build()
                                    .doPost();
                        } catch (Exception e) {
                            log.error("请求入库调用接口失败");
                            log.error("异常信息打印:" + e);
                            try {
                                BasDevp basDevp = basDevpService.selectById(inSta.getStaNo());
                                if (Cools.isEmpty(basDevp)) {
                                    log.error("站点号异常" + inSta.getStaNo());
                                } else if (basDevp.getStaErr() != 0) {
                                    basDevp.setStaErr(2);
                                    basDevpService.updateById(basDevp);
                                }
                            } catch (Exception e1) {
                                // 退回
                                log.error("扫码检测程序异常" + inSta.getStaNo() + "异常信息" + e1);
                            }
                            staProtocol.setWorkNo(9999);
                            staProtocol.setStaNo(inSta.getStaNo());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            continue;
                        }
                        JSONObject jsonObject = JSON.parseObject(response);
                        apiLogService.save("wms请求入库货位接口"
                                , wmsUrl + inboundTaskApplyPath
                                , null
                                , "127.0.0.1"
                                , JSON.toJSONString(toWmsDTO)
                                , response
                                , true
                        );
                        log.info("入库请求参数{}" + JSON.toJSONString(toWmsDTO));
                        log.info("入库请求返回参数{}" + JSON.toJSONString(response));
                        if (jsonObject.getInteger("code").equals(200)) {
                            try {
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                            } catch (Exception e) {
//                                    log.error("扫码检测程序异常"+inSta.getStaNo()+"异常信息"+e);
                                // 退回
                                log.error("扫码检测程序异常" + inSta.getStaNo() + errMsg);
                                log.error("扫码检测程序异常,异常信息" + e);
                                staProtocol.setWorkNo(9999);
                                staProtocol.setStaNo(inSta.getStaNo());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            }
                        } else {
                            continue;
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("generateStoreWrkFile e", e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    public void generateStoreWrkFileWalk() {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历入库口
                for (DevpSlave.Sta inSta : devp.getInWalkSta()) {
                    // 获取入库站信息
                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    Integer workNo = staProtocol.getWorkNo();
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading()
                            && staProtocol.isInEnable() && (workNo == 0 || (workNo>9000 && workNo<10000))
                            && staProtocol.isPakMkWalk()
                    ) {
                        if (inSta.isBarcodeSign()){
                            // 获取条码扫描仪信息
                            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                            if (barcodeThread == null) {
                                continue;
                            }
                            String barcode = barcodeThread.getBarcode();
                            if (!Cools.isEmpty(barcode) && !barcode.equals("99999999")) {
                                // 请求wms接口,获取工作号和目标库位
                                ToWmsDTO toWmsDTO = new ToWmsDTO(barcode, staProtocol.getSiteId(), 0);
                                TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", barcode));
                                if (!Cools.isEmpty(taskWrk1)) {
                                    log.info("托盘码:" + barcode + "任务档存在");
                                    if (taskWrk1.getIoType() == 1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) {
                                        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                                .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId()));
                                        if (Cools.isEmpty(staDesc)) {
                                            log.info("托盘码:" + barcode + "任务档存在");
                                            return;
                                        } else {
                                            staProtocol.setWorkNo(taskWrk1.getWrkNo());
                                            staProtocol.setStaNo(staDesc.getCrnStn());
                                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                        }
                                    }
                                    return;
                                }
                            } else {
                                TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>());
                                if (!Cools.isEmpty(taskWrk1)) {
                                    if (taskWrk1.getIoType() == 1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) {
                                        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                                .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId()));
                                        if (Cools.isEmpty(staDesc)) {
                                            return;
                                        } else {
                                            staProtocol.setWorkNo(taskWrk1.getWrkNo());
                                            staProtocol.setStaNo(staDesc.getCrnStn());
                                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                        }
                                    }
                                    return;
                                }
                            }
                        } else {
                            TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>());
                            if (!Cools.isEmpty(taskWrk1)) {
                                if (taskWrk1.getIoType() == 1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) {
                                    StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                            .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId()));
                                    if (Cools.isEmpty(staDesc)) {
                                        return;
                                    } else {
                                        staProtocol.setWorkNo(taskWrk1.getWrkNo());
                                        staProtocol.setStaNo(staDesc.getCrnStn());
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    }
                                }
                                return;
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("generateStoreWrkFile e", e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    /**
     * 堆垛机站出库到出库站
     */
@@ -388,7 +553,9 @@
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            if (crnProtocol == null) {
                continue;
            }
            BasCrnp basCrnp = basCrnpService.selectById(crnSlave.getId());
            if (basCrnp == null) {
                log.error("{}号堆垛机尚未在数据库进行维护!", crnSlave.getId());
@@ -404,8 +571,7 @@
            // 遍历堆垛机出库站
            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnSlave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
//                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnSlave.getId()).eq("").eq("crn_stn", crnStn.getStaNo()));
                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
                for (StaDesc staDesc : staDescs){
                    try{
                        // 获取堆垛机出库站信息
@@ -464,7 +630,9 @@
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            if (crnProtocol == null) {
                continue;
            }
            BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
            if (basCrnp == null) {
                log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId());
@@ -515,7 +683,8 @@
     */
    public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol) throws IOException {
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", slave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs) {
                boolean flag = false;
                // 获取堆垛机入库站信息
@@ -601,7 +770,7 @@
                // 命令下发区 --------------------------------------------------------------------------
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                crnCommand.setCrnNo(staDesc.getLaneNo()); // 堆垛机巷道编号
                crnCommand.setCrnNo(crnProtocol.getLaneNo()); // 堆垛机巷道编号
                crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
@@ -667,9 +836,7 @@
            return;
        }
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", slave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
//            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnProtocol.getLaneNo()).eq("crn_stn", crnStn.getStaNo()));
            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.selectPakOut(crnProtocol.getLaneNo(),staDesc.getStnNo().toString());
@@ -822,8 +989,6 @@
                // 命令下发区 --------------------------------------------------------------------------
                // 1.堆垛机开始移动
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
@@ -893,7 +1058,9 @@
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            if (crnProtocol == null) {
                continue;
            }
            if (!crn.getId().equals(crnProtocol.getLaneNo())){
                for (CrnSlave crnOther : slaveProperties.getCrn()) {
@@ -1166,6 +1333,7 @@
        return "无";
    }
    public boolean rgvDetection(RgvSlave slave){
        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
        RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
@@ -1376,6 +1544,7 @@
            }
        }
    }
    //获取起点与终点对象
    public RgvSlave.RgvStn getRgvStnNow(RgvSlave rgvSlave,Integer staNo) {
        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
@@ -1471,7 +1640,6 @@
        }
        return true;
    }
}
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -97,8 +97,9 @@
        if(param.getIoType() == 1){
            taskWrk.setWrkSts(1);
            if (!Cools.isEmpty(param.getTargetPoint())) {
                taskWrk.setTargetPoint(Utils.getWcsLocNo(param.getTargetPoint()));//终点
                taskWrk.setOriginTargetPoint(param.getTargetPoint());
//                taskWrk.setTargetPoint(Utils.getWcsLocNo(param.getTargetPoint()));//终点  转换下
                taskWrk.setTargetPoint(param.getTargetPoint());//终点
                taskWrk.setOriginTargetPoint(param.getStartPoint());
            }
        } else if (param.getIoType() == 2) {
src/main/java/com/zy/core/DevpThread.java
@@ -9,5 +9,6 @@
    Map<Integer, StaProtocol> getStation();
    void setPakMk(Integer siteId, boolean pakMk);
    void setPakMkWalk(Integer siteId, boolean pakMkWalk);
}
src/main/java/com/zy/core/MainProcess.java
@@ -41,6 +41,11 @@
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile(); // 组托
                    mainService.generateStoreWrkFileIsEmptyMk(); // 组托  空托
                    mainService.generateStoreWrkFileWalk(); // 任务下发
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn();
                    // 入出库  ===>>  堆垛机入出库作业下发
src/main/java/com/zy/core/model/DevpSlave.java
@@ -27,6 +27,8 @@
    private List<Sta> pickSta = new ArrayList<>();
    private List<Sta> inWalkSta = new ArrayList<>();
    @Data
    public static class Sta {
@@ -37,6 +39,8 @@
        private Integer scale;
        private Integer backSta;
        private boolean barcodeSign;
    }
}
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -48,6 +48,7 @@
    // 锁定标记
    private boolean pakMk = true;
    private boolean pakMkWalk = true;
    // 入库暂存数
    private Short inQty;
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -191,6 +191,13 @@
                staProtocol.setHigh(status[6]);     // 高库位
                staProtocol.setLow(status[7]);      // 低库位
                if (!staProtocol.isPakMkWalk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                    staProtocol.setPakMkWalk(true);
                }
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
@@ -394,6 +401,17 @@
        }
    }
    /**
     * 设置入库标记
     */
    @Override
    public void setPakMkWalk(Integer siteId, boolean pakMkWalk) {
        StaProtocol staProtocol = station.get(siteId);
        if (null != staProtocol) {
            staProtocol.setPakMkWalk(pakMkWalk);
        }
    }
    @Override
    public void close() {
        siemensS7Net.ConnectClose();
src/main/resources/application-prod.yml
@@ -1,7 +1,125 @@
wcs-slave:
  doubleDeep: false #双深
  doubleLocs: 3,6,7,10,13 #双深库位排号 3,6,7,10,13
  doubleLocs: 3 #双深库位排号
  groupCount: 2 #一个堆垛机负责的货架排数
  devp[0]: #输送线
    ip: 192.168.4.250
    slot: 0
    port: 102
    rack: 102
    id: 1
    # 入库口1
    inSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
#      led: ${wcs-slave.led[0].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
#      led: ${wcs-slave.led[0].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
    # 入库下发口1
    inWalkSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
    # 入库下发口1
    inWalkSta[1]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
    # 入库下发口1
    inWalkSta[2]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
      barcodeSign: true
    # 出库口1
    outSta[0]:
      staNo: 102
      led: ${wcs-slave.led[0].id}
#      led: ${wcs-slave.led[0].id}
  # RGV穿梭车1
  rgv[0]:
    id: 1
    ip: 192.168.4.250
    port: 502
    rack: 0
    slot: 0
    otherId: 2
    carBodyJiaoMing: 100
    carBodyKunPeng: 100
    #RGV源站点
    rgvInSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvInSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
    #RGV目标站点
    rgvOutSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvOutSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
  # RGV穿梭车2
  rgv[1]:
    id: 2
    ip: 192.168.1.1
    port: 502
    rack: 0
    slot: 0
    otherId: 1
    carBodyJiaoMing: 100
    carBodyKunPeng: 100
    #RGV源站点
    rgvInSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvInSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
    #RGV目标站点
    rgvOutSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvOutSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
  barcode[0]: #条码扫描仪1
    port: 51236
    ip: 10.10.10.52
    id: 1
  barcode[1]: #条码扫描仪1
    port: 51236
    ip: 10.10.10.52
    id: 2
  barcode[2]: #条码扫描仪1
    port: 51236
    ip: 10.10.10.52
    id: 3
  crn[0]: #堆垛机1
    ip: 192.168.4.250
    id: 1
@@ -102,73 +220,3 @@
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
  barcode[0]: #条码扫描仪1
    port: 51236
    ip: 10.10.10.52
    id: 1
  devp[0]: #输送线
    ip: 192.168.4.250
    slot: 0
    port: 102
    rack: 102
    id: 1
  # RGV穿梭车1
  rgv[0]:
    id: 1
    ip: 192.168.4.250
    port: 502
    rack: 0
    slot: 0
    otherId: 2
    carBodyJiaoMing: 100
    carBodyKunPeng: 100
    #RGV源站点
    rgvInSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvInSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
    #RGV目标站点
    rgvOutSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvOutSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
  # RGV穿梭车2
  rgv[1]:
    id: 2
    ip: 192.168.1.1
    port: 502
    rack: 0
    slot: 0
    otherId: 1
    carBodyJiaoMing: 100
    carBodyKunPeng: 100
    #RGV源站点
    rgvInSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvInSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
    #RGV目标站点
    rgvOutSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvOutSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false