lsh
2024-06-05 012c7432e6a18aac67c0888309aa42d0fa4a862a
#双工位拆分
3个文件已修改
15个文件已添加
1321 ■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/BasJarMast.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasJarMastStatus.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastSplitTwin.java 276 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasJarMastMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasJarMastStatusMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastSplitTwinMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasJarMastService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasJarMastStatusService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastSplitTwinService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasJarMastServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasJarMastStatusServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 615 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastSplitTwinServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeBuilder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnTaskModeType.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasJarMastMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasJarMastStatusMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastSplitTwinMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasJarMast.java
New file
@@ -0,0 +1,211 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasJarMastStatusService;
import com.zy.asrs.entity.BasJarMastStatus;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("asr_bas_jar_mast")
public class BasJarMast implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    private Long id;
    /**
     * 工作号
     */
    @ApiModelProperty(value= "工作号")
    @TableId(value = "wrk_no", type = IdType.INPUT)
    @TableField("wrk_no")
    private Long wrkNo;
    /**
     * 入库源站点
     */
    @ApiModelProperty(value= "入库源站点")
    @TableField("enter_sta_no")
    private Integer enterStaNo;
    /**
     * 入库目标站点
     */
    @ApiModelProperty(value= "入库目标站点")
    @TableField("out_sta_no")
    private Integer outStaNo;
    /**
     * 入硫化罐站点
     */
    @ApiModelProperty(value= "入硫化罐站点")
    @TableField("jar_enter_sta_no")
    private Integer jarEnterStaNo;
    /**
     * 出硫化罐站点
     */
    @ApiModelProperty(value= "出硫化罐站点")
    @TableField("jar_out_sta_no")
    private Integer jarOutStaNo;
    /**
     * 硫化罐ID
     */
    @ApiModelProperty(value= "硫化罐ID")
    @TableField("jar_id")
    private Integer jarId;
    /**
     * 区域
     */
    @ApiModelProperty(value= "区域")
    @TableField("jar_regin")
    private Integer jarRegin;
    /**
     * 工作状态
     */
    @ApiModelProperty(value= "工作状态")
    private Integer status;
    /**
     * 入罐小车
     */
    @ApiModelProperty(value= "入罐小车")
    @TableField("enter_ste_no")
    private Integer enterSteNo;
    /**
     * 出罐小车
     */
    @ApiModelProperty(value= "出罐小车")
    @TableField("out_ste_id")
    private Integer outSteId;
    /**
     * 入罐RGV
     */
    @ApiModelProperty(value= "入罐RGV")
    @TableField("enter_rgv_id")
    private Integer enterRgvId;
    /**
     * 出罐RGV
     */
    @ApiModelProperty(value= "出罐RGV")
    @TableField("out_rgv_id")
    private Integer outRgvId;
    /**
     * 入库时间
     */
    @ApiModelProperty(value= "入库时间")
    @TableField("io_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date ioTime;
    /**
     * 创建时间
     */
    @ApiModelProperty(value= "创建时间")
    @TableField("modi_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date modiTime;
    /**
     * 更新时间
     */
    @ApiModelProperty(value= "更新时间")
    @TableField("appe_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date appeTime;
    public BasJarMast() {}
    public BasJarMast(Long wrkNo,Integer enterStaNo,Integer outStaNo,Integer jarEnterStaNo,Integer jarOutStaNo,Integer jarId,Integer jarRegin,Integer status,Integer enterSteNo,Integer outSteId,Integer enterRgvId,Integer outRgvId,Date ioTime,Date modiTime,Date appeTime) {
        this.wrkNo = wrkNo;
        this.enterStaNo = enterStaNo;
        this.outStaNo = outStaNo;
        this.jarEnterStaNo = jarEnterStaNo;
        this.jarOutStaNo = jarOutStaNo;
        this.jarId = jarId;
        this.jarRegin = jarRegin;
        this.status = status;
        this.enterSteNo = enterSteNo;
        this.outSteId = outSteId;
        this.enterRgvId = enterRgvId;
        this.outRgvId = outRgvId;
        this.ioTime = ioTime;
        this.modiTime = modiTime;
        this.appeTime = appeTime;
    }
//    BasJarMast basJarMast = new BasJarMast(
//            null,    // 工作号[非空]
//            null,    // 入库源站点[非空]
//            null,    // 入库目标站点[非空]
//            null,    // 入硫化罐站点[非空]
//            null,    // 出硫化罐站点[非空]
//            null,    // 硫化罐ID[非空]
//            null,    // 区域[非空]
//            null,    // 工作状态[非空]
//            null,    // 入罐小车[非空]
//            null,    // 出罐小车[非空]
//            null,    // 入罐RGV[非空]
//            null,    // 出罐RGV[非空]
//            null,    // 入库时间
//            null,    // 创建时间
//            null    // 更新时间
//    );
    public String getStatus$(){
        BasJarMastStatusService service = SpringUtils.getBean(BasJarMastStatusService.class);
        BasJarMastStatus basJarMastStatus = service.selectById(this.status);
        if (!Cools.isEmpty(basJarMastStatus)){
            return String.valueOf(basJarMastStatus.getId());
        }
        return null;
    }
    public String getIoTime$(){
        if (Cools.isEmpty(this.ioTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.ioTime);
    }
    public String getModiTime$(){
        if (Cools.isEmpty(this.modiTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
    }
    public String getAppeTime$(){
        if (Cools.isEmpty(this.appeTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
    }
}
src/main/java/com/zy/asrs/entity/BasJarMastStatus.java
New file
@@ -0,0 +1,49 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("asr_bas_jar_mast_status")
public class BasJarMastStatus implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    private Long id;
    /**
     * 任务号
     */
    @ApiModelProperty(value= "任务号")
    @TableField("box_specs")
    private String boxSpecs;
    /**
     * 堆垛机
     */
    @ApiModelProperty(value= "堆垛机")
    @TableField("box_type")
    private String boxType;
    public BasJarMastStatus() {}
    public BasJarMastStatus(String boxSpecs,String boxType) {
        this.boxSpecs = boxSpecs;
        this.boxType = boxType;
    }
//    BasJarMastStatus basJarMastStatus = new BasJarMastStatus(
//            null,    // 任务号[非空]
//            null    // 堆垛机
//    );
}
src/main/java/com/zy/asrs/entity/WrkMastSplitTwin.java
New file
@@ -0,0 +1,276 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("asr_wrk_mast_split_twin")
public class WrkMastSplitTwin implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 工作号
     */
    @ApiModelProperty(value= "工作号")
    @TableField("wrk_no")
    private Long wrkNo;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 工位
     */
    @ApiModelProperty(value= "工位")
    private Integer type;
    /**
     * 工作状态 0: 初始  1: 等待取货完成  2: 取货完成待作业  3: 等待放货完成  4: 完成
     */
    @ApiModelProperty(value= "工作状态 0: 初始  1: 等待取货完成  2: 取货完成待作业  3: 等待放货完成  4: 完成  ")
    @TableField("wrk_sts")
    private Integer wrkSts;
    /**
     * 行号
     */
    @ApiModelProperty(value= "行号")
    @TableField("line_number")
    private Integer lineNumber;
    /**
     * 工作类型 0: 未知  1: 取  2: 放  3: 取放  4: 完成
     */
    @ApiModelProperty(value= "工作类型 0: 未知  1: 取  2: 放  3: 取放  4: 完成  ")
    @TableField("wrk_type")
    private Integer wrkType;
    /**
     * 标记时间
     */
    @ApiModelProperty(value= "标记时间")
    @TableField("bign_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date bignTime;
    /**
     * 堆垛机号
     */
    @ApiModelProperty(value= "堆垛机号")
    @TableField("crn_no")
    private Integer crnNo;
    /**
     * 起点
     */
    @ApiModelProperty(value= "起点")
    @TableField("wrk_start")
    private String wrkStart;
    /**
     * 终点
     */
    @ApiModelProperty(value= "终点")
    @TableField("wrk_end")
    private String wrkEnd;
    /**
     * 起点排
     */
    @ApiModelProperty(value= "起点排")
    @TableField("start_row")
    private Integer startRow;
    /**
     * 起点列
     */
    @ApiModelProperty(value= "起点列")
    @TableField("start_bay")
    private Integer startBay;
    /**
     * 起点层
     */
    @ApiModelProperty(value= "起点层")
    @TableField("start_lev")
    private Integer startLev;
    /**
     * 终点排
     */
    @ApiModelProperty(value= "终点排")
    @TableField("end_row")
    private Integer endRow;
    /**
     * 终点列
     */
    @ApiModelProperty(value= "终点列")
    @TableField("end_bay")
    private Integer endBay;
    /**
     * 终点层
     */
    @ApiModelProperty(value= "终点层")
    @TableField("end_lev")
    private Integer endLev;
    /**
     * 任务类型 0: 未知  1: 入库  2: 出库
     */
    @ApiModelProperty(value= "任务类型 0: 未知  1: 入库  2: 出库  ")
    @TableField("io_type")
    private Integer ioType;
    public WrkMastSplitTwin() {}
    public WrkMastSplitTwin(Long wrkNo,Date createTime,Date updateTime,Integer type,Integer wrkSts,Integer lineNumber,Integer wrkType,Date bignTime,Integer crnNo,String wrkStart,String wrkEnd,Integer startRow,Integer startBay,Integer startLev,Integer endRow,Integer endBay,Integer endLev,Integer ioType) {
        this.wrkNo = wrkNo;
        this.createTime = createTime;
        this.updateTime = updateTime;
        this.type = type;
        this.wrkSts = wrkSts;
        this.lineNumber = lineNumber;
        this.wrkType = wrkType;
        this.bignTime = bignTime;
        this.crnNo = crnNo;
        this.wrkStart = wrkStart;
        this.wrkEnd = wrkEnd;
        this.startRow = startRow;
        this.startBay = startBay;
        this.startLev = startLev;
        this.endRow = endRow;
        this.endBay = endBay;
        this.endLev = endLev;
        this.ioType = ioType;
    }
//    WrkMastSplitTwin wrkMastSplitTwin = new WrkMastSplitTwin(
//            null,    // 工作号[非空]
//            null,    // 添加时间
//            null,    // 修改时间
//            null,    // 工位[非空]
//            null,    // 工作状态[非空]
//            null,    // 行号[非空]
//            null,    // 工作类型[非空]
//            null,    // 标记时间
//            null,    // 堆垛机号[非空]
//            null,    // 起点[非空]
//            null,    // 终点[非空]
//            null,    // 起点排[非空]
//            null,    // 起点列[非空]
//            null,    // 起点层[非空]
//            null,    // 终点排[非空]
//            null,    // 终点列[非空]
//            null,    // 终点层[非空]
//            null    // 任务类型[非空]
//    );
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
    public String getWrkSts$(){
        if (null == this.wrkSts){ return null; }
        switch (this.wrkSts){
            case 0:
                return "初始";
            case 1:
                return "等待取货完成";
            case 2:
                return "取货完成待作业";
            case 3:
                return "等待放货完成";
            case 4:
                return "完成";
            default:
                return String.valueOf(this.wrkSts);
        }
    }
    public String getWrkType$(){
        if (null == this.wrkType){ return null; }
        switch (this.wrkType){
            case 0:
                return "未知";
            case 1:
                return "取";
            case 2:
                return "放";
            case 3:
                return "取放";
            case 4:
                return "完成";
            default:
                return String.valueOf(this.wrkType);
        }
    }
    public String getBignTime$(){
        if (Cools.isEmpty(this.bignTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.bignTime);
    }
    public String getIoType$(){
        if (null == this.ioType){ return null; }
        switch (this.ioType){
            case 0:
                return "未知";
            case 1:
                return "入库";
            case 2:
                return "出库";
            default:
                return String.valueOf(this.ioType);
        }
    }
}
src/main/java/com/zy/asrs/mapper/BasJarMastMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.BasJarMast;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasJarMastMapper extends BaseMapper<BasJarMast> {
}
src/main/java/com/zy/asrs/mapper/BasJarMastStatusMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.BasJarMastStatus;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasJarMastStatusMapper extends BaseMapper<BasJarMastStatus> {
}
src/main/java/com/zy/asrs/mapper/WrkMastSplitTwinMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.WrkMastSplitTwin;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface WrkMastSplitTwinMapper extends BaseMapper<WrkMastSplitTwin> {
}
src/main/java/com/zy/asrs/service/BasJarMastService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.BasJarMast;
import com.baomidou.mybatisplus.service.IService;
public interface BasJarMastService extends IService<BasJarMast> {
}
src/main/java/com/zy/asrs/service/BasJarMastStatusService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.BasJarMastStatus;
import com.baomidou.mybatisplus.service.IService;
public interface BasJarMastStatusService extends IService<BasJarMastStatus> {
}
src/main/java/com/zy/asrs/service/WrkMastSplitTwinService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.WrkMastSplitTwin;
import com.baomidou.mybatisplus.service.IService;
public interface WrkMastSplitTwinService extends IService<WrkMastSplitTwin> {
}
src/main/java/com/zy/asrs/service/impl/BasJarMastServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.BasJarMastMapper;
import com.zy.asrs.entity.BasJarMast;
import com.zy.asrs.service.BasJarMastService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("basJarMastService")
public class BasJarMastServiceImpl extends ServiceImpl<BasJarMastMapper, BasJarMast> implements BasJarMastService {
}
src/main/java/com/zy/asrs/service/impl/BasJarMastStatusServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.BasJarMastStatusMapper;
import com.zy.asrs.entity.BasJarMastStatus;
import com.zy.asrs.service.BasJarMastStatusService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("basJarMastStatusService")
public class BasJarMastStatusServiceImpl extends ServiceImpl<BasJarMastStatusMapper, BasJarMastStatus> implements BasJarMastStatusService {
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1550,8 +1550,18 @@
                            && crnProtocol.getTaskNo() == 0
                            && crnProtocol.getLoaded() == 0
                            && crnProtocol.getForkPos() == 0) {
                        sign[0] = 1;
                        sign[1] = 1;
//                        sign[0] = 1;
//                        sign[1] = 1;
                        /*
                        * 任务拆分特殊处理
                        * */
                        if (crnProtocol.getStatusTypeTwo() == CrnStatusType.IDLE
                                && crnProtocol.getTaskNoTwo() == 0
                                && crnProtocol.getLoadedTwo() == 0
                                && crnProtocol.getForkPosTwo() == 0){
                            sign[0] = 1;
                            sign[1] = 1;
                        }
                    }else if (crnProtocol.getStatusTypeTwo() == CrnStatusType.IDLE
                            && crnProtocol.getTaskNoTwo() == 0
                            && crnProtocol.getLoadedTwo() == 0
@@ -1561,7 +1571,7 @@
                    }
                }
                if (sign[0]==1){
                if (sign[0]==1 && sign[1] == 1){
                    // 如果最近一次是入库模式
                    if (crnProtocol.getLastIo().equals("I")) {
                        if (basCrnp.getInEnable().equals("Y")) {
@@ -1569,7 +1579,7 @@
                                case 3:
                                case 4:
                                case 5:
                                    this.crnStnToLoc1(crn, crnProtocol, sign[1]); //  入库
                                    this.crnStnToLoc1Big(crn, crnProtocol, sign[1]); //  入库
                                    break;
                                default:
                                    continue;
@@ -1580,7 +1590,7 @@
                                case 3:
                                case 4:
                                case 5:
                                    this.locToCrnStn1(crn, crnProtocol, sign[1]); //  出库
                                    this.locToCrnStn1Big(crn, crnProtocol, sign[1]); //  出库
                                    break;
                                default:
                                    continue;
@@ -1595,7 +1605,7 @@
                                case 3:
                                case 4:
                                case 5:
                                    this.locToCrnStn1(crn, crnProtocol, sign[1]); //  出库
                                    this.locToCrnStn1Big(crn, crnProtocol, sign[1]); //  出库
                                    break;
                                default:
                                    continue;
@@ -1606,7 +1616,7 @@
                                case 3:
                                case 4:
                                case 5:
                                    this.crnStnToLoc1(crn, crnProtocol, sign[1]); //  入库
                                    this.crnStnToLoc1Big(crn, crnProtocol, sign[1]); //  入库
                                    break;
                                default:
                                    continue;
@@ -1881,7 +1891,287 @@
    /**
     * 入库  ===>>  堆垛机站到库位
     * 2022-12-03 TQS修改,先遍历查询同台堆垛机工作档所有站点入库任务LIST,根据工作档任务排序优先级高于 根据堆垛机入库站点排序
     * 2024-06-05
     */
    public synchronized void crnStnToLoc1Big(CrnSlave slave, CrnProtocol crnProtocol, Integer crnStation) {
        List<WrkMast> wrkMasts = wrkMastMapper.selectPakInStep12(slave.getId());
        for(WrkMast wrkMast : wrkMasts){
            if (wrkMast == null) {
                continue;
            }
            CrnSlave.CrnStn crnStn = null;
            for (CrnSlave.CrnStn crnStn1 : slave.getCrnInStn()){
                if(crnStn1.getStaNo().equals(wrkMast.getStaNo())){
                    crnStn = crnStn1;
                    break;
                }
            }
            if(Cools.isEmpty(crnStn)){
                continue;
            }
            boolean flag = false;
            // 获取堆垛机入库站信息
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
            if (staDetl == null) {
                log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                continue;
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
                    && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                flag = true;
            }
            if (!flag) {
                continue;
            }
            // 获取库位信息
            LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
            if (locMast == null) {
                log.error("查询库存无数据--库位号{}", wrkMast.getLocNo());
                continue;
            }
            if (!locMast.getLocSts().equals("S") && !locMast.getLocSts().equals("Q")) {
                log.error("入库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), locMast.getLocSts());
                continue;
            }
            //工位
            if (crnStation == 1){
                // 堆垛机控制过滤
                if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                    break;
                }
                // 堆垛机控制过滤
                if (!crnProtocol.getStatusTypeTwo().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNoTwo() != 0) {
                    break;
                }
            }else if(crnStation == 2){
                // 堆垛机控制过滤
                if (!crnProtocol.getStatusTypeTwo().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNoTwo() != 0) {
                    break;
                }
            }else {
                break;
            }
            // 已经存在吊车执行任务时,则过滤
            if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                continue;
            }
            // 双深库位且浅库位有货,则需先对浅库位进行库位移转
            if (Utils.isDeepLoc(slaveProperties, wrkMast.getLocNo())) {
                String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getLocNo());
                LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                    WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                    if (null == waitWrkMast) {
                        log.error("{}库位异常,未检索到相应工作档!", shallowLocNo);
                    } else {
                        waitWrkMast.setIoPri(15D);
                        waitWrkMast.setModiTime(new Date());
                        if (wrkMastMapper.updateById(waitWrkMast) == 0) {
                            log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
                        }
                        continue;
                    }
                } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                    // 此标记避免多次执行移库任务
                    if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) {
                        wrkMast.setUpdMk("Y");
                        wrkMast.setIoPri(14D);
                        wrkMastMapper.updateById(wrkMast);
                        // 生成工作档,将浅库位移转到新的库位中
                        moveLocForDeepLoc(slave, shallowLoc);
                        // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行)
//                        moveLocForDeepLocPakin(slave, shallowLoc, wrkMast);
                    }
                    continue;
                } else if (shallowLoc.getLocSts().equals("Q")) {
                    WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
                    if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) {
                        continue;
                    }
                }
            }
            // 命令下发区 --------------------------------------------------------------------------
            CrnCommand crnCommand = new CrnCommand();
            crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
            crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
            crnCommand.setAckFinish((short) 0);  // 任务完成确认位
            crnCommand.setTaskMode(CrnTaskModeType.SEPARATE_TAKE); // 任务模式:  单取货
            crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 源库位排
            crnCommand.setSourcePosY(crnStn.getBay().shortValue());     // 源库位列
            crnCommand.setSourcePosZ(crnStn.getLev().shortValue());     // 源库位层
            crnCommand.setDestinationPosX(locMast.getRow1().shortValue());     // 目标库位排
            crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列
            crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层
            if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(crnStation==1? 2:5, crnCommand))) {
                log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
            } else {
                // 修改工作档状态 2.设备上走 => 3.吊车入库中
                Date now = new Date();
                wrkMast.setWrkSts(3L);
                wrkMast.setCrnStrTime(now);
                wrkMast.setModiTime(now);
                if (wrkMastMapper.updateById(wrkMast) == 0) {
                    log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                }
            }
        }
    }
    /**
     * 入库  ===>>  堆垛机站到库位
     * 2024-01-15 煜星小料箱
     */
    public synchronized void crnStnToLoc1Single(CrnSlave slave, CrnProtocol crnProtocol) {
        List<WrkMast> wrkMasts = wrkMastMapper.selectPakInStep12(slave.getId());
        for(WrkMast wrkMast : wrkMasts){
            if (wrkMast == null) {
                continue;
            }
            CrnSlave.CrnStn crnStn = null;
            for (CrnSlave.CrnStn crnStn1 : slave.getCrnInStn()){
                if(crnStn1.getStaNo().equals(wrkMast.getStaNo())){
                    crnStn = crnStn1;
                    break;
                }
            }
            if(Cools.isEmpty(crnStn)){
                continue;
            }
            boolean flag = false;
            boolean flagOther = false;
            // 获取堆垛机入库站信息
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            StaProtocol staProtocolOther = devpThread.getStation().get(crnStn.getStaNoOther());
            if (staProtocolOther == null) {
                continue;
            } else {
                staProtocolOther = staProtocolOther.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
            if (staDetl == null) {
                log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                continue;
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
                    && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                flag = true;
            }
            // 查询站点详细信息
            BasDevp staDetlOther = basDevpService.selectById(crnStn.getStaNoOther());
            if (staDetlOther == null) {
                log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNoOther());
                continue;
            }
            if (staProtocolOther.isAutoing() && staProtocolOther.isLoading() && staProtocolOther.getWorkNo() > 0 && staProtocolOther.isInEnable()
                    && staDetlOther.getCanining() != null && staDetlOther.getCanining().equals("Y")) {
                flagOther = true;
            }
            if (!flag || !flagOther) {
                continue;
            }
            //查询堆垛机任务
            WrkMastCrn wrkMastCrn = wrkMastCrnMapper.selectWrkNoOneAndTwo(wrkMast.getWrkNo());
            if (Cools.isEmpty(wrkMastCrn)){
                continue;
            }
            WrkMast wrkMastOther = wrkMastMapper.selectPakInStep3(wrkMastCrn.getWrkNoTwo().intValue());
            // 获取库位信息
            LocMast locMast = locMastService.selectById(Utils.getRow(wrkMastCrn.getLocNo())%4>2? wrkMastCrn.getLocNoTwo():wrkMastCrn.getLocNoOne());
            if (locMast == null) {
                log.error("查询库存无数据--库位号{}", wrkMastCrn.getLocNo());
                continue;
            }
            if (!locMast.getLocSts().equals("S") && !locMast.getLocSts().equals("Q")) {
                log.error("入库操作库位状态不符合--状态, 库位号={},库位状态={}", locMast.getLocNo(), locMast.getLocSts());
                continue;
            }
            // 堆垛机控制过滤
            if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                continue;
            }
            // 已经存在吊车执行任务时,则过滤
            if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                continue;
            }
            // 命令下发区 --------------------------------------------------------------------------
            CrnCommand crnCommand = new CrnCommand();
            crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
            crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
            crnCommand.setAckFinish((short) 0);  // 任务完成确认位
            crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
            crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 源库位排
            crnCommand.setSourcePosY(crnStn.getBay().shortValue());     // 源库位列
            crnCommand.setSourcePosZ(crnStn.getLev().shortValue());     // 源库位层
            crnCommand.setDestinationPosX(locMast.getRow1().shortValue());     // 目标库位排
            crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列
            crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层
            if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
            } else {
                // 修改工作档状态 2.设备上走 => 3.吊车入库中
                Date now = new Date();
                wrkMast.setWrkSts(3L);
                wrkMast.setCrnStrTime(now);
                wrkMast.setModiTime(now);
                if (wrkMastMapper.updateById(wrkMast) == 0) {
                    log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                }
                // 修改工作档状态 2.设备上走 => 3.吊车入库中
                wrkMastOther.setWrkSts(3L);
                wrkMastOther.setCrnStrTime(now);
                wrkMastOther.setModiTime(now);
                if (wrkMastMapper.updateById(wrkMastOther) == 0) {
                    log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMastOther.getWrkNo());
                }
                wrkMastCrn.setWrkSts(3L);
                wrkMastCrn.setModiTime(now);
                if (wrkMastCrnMapper.updateById(wrkMastCrn) == 0) {
                    log.error("修改堆垛机工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMastCrn.getWrkNo());
                }
            }
        }
    }
    /**
     * 入库  ===>>  堆垛机站到库位
     * 2024-01-15 优化双工位
     */
    public synchronized void crnStnToLoc1(CrnSlave slave, CrnProtocol crnProtocol, Integer crnStation) {
        List<WrkMast> wrkMasts = wrkMastMapper.selectPakInStep12(slave.getId());
@@ -2019,140 +2309,6 @@
                }
            }
        }
    }
    /**
     * 入库  ===>>  堆垛机站到库位
     * 2022-12-03 TQS修改,先遍历查询同台堆垛机工作档所有站点入库任务LIST,根据工作档任务排序优先级高于 根据堆垛机入库站点排序
     */
    public synchronized void crnStnToLoc1Single(CrnSlave slave, CrnProtocol crnProtocol) {
        List<WrkMast> wrkMasts = wrkMastMapper.selectPakInStep12(slave.getId());
        for(WrkMast wrkMast : wrkMasts){
            if (wrkMast == null) {
                continue;
            }
            CrnSlave.CrnStn crnStn = null;
            for (CrnSlave.CrnStn crnStn1 : slave.getCrnInStn()){
                if(crnStn1.getStaNo().equals(wrkMast.getStaNo())){
                    crnStn = crnStn1;
                    break;
                }
            }
            if(Cools.isEmpty(crnStn)){
                continue;
            }
            boolean flag = false;
            boolean flagOther = false;
            // 获取堆垛机入库站信息
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            StaProtocol staProtocolOther = devpThread.getStation().get(crnStn.getStaNoOther());
            if (staProtocolOther == null) {
                continue;
            } else {
                staProtocolOther = staProtocolOther.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
            if (staDetl == null) {
                log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                continue;
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
                    && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                flag = true;
            }
            // 查询站点详细信息
            BasDevp staDetlOther = basDevpService.selectById(crnStn.getStaNoOther());
            if (staDetlOther == null) {
                log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNoOther());
                continue;
            }
            if (staProtocolOther.isAutoing() && staProtocolOther.isLoading() && staProtocolOther.getWorkNo() > 0 && staProtocolOther.isInEnable()
                    && staDetlOther.getCanining() != null && staDetlOther.getCanining().equals("Y")) {
                flagOther = true;
            }
            if (!flag || !flagOther) {
                continue;
            }
            //查询堆垛机任务
            WrkMastCrn wrkMastCrn = wrkMastCrnMapper.selectWrkNoOneAndTwo(wrkMast.getWrkNo());
            if (Cools.isEmpty(wrkMastCrn)){
                continue;
            }
            WrkMast wrkMastOther = wrkMastMapper.selectPakInStep3(wrkMastCrn.getWrkNoTwo().intValue());
            // 获取库位信息
            LocMast locMast = locMastService.selectById(Utils.getRow(wrkMastCrn.getLocNo())%4>2? wrkMastCrn.getLocNoTwo():wrkMastCrn.getLocNoOne());
            if (locMast == null) {
                log.error("查询库存无数据--库位号{}", wrkMastCrn.getLocNo());
                continue;
            }
            if (!locMast.getLocSts().equals("S") && !locMast.getLocSts().equals("Q")) {
                log.error("入库操作库位状态不符合--状态, 库位号={},库位状态={}", locMast.getLocNo(), locMast.getLocSts());
                continue;
            }
            // 堆垛机控制过滤
            if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                continue;
            }
            // 已经存在吊车执行任务时,则过滤
            if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                continue;
            }
            // 命令下发区 --------------------------------------------------------------------------
            CrnCommand crnCommand = new CrnCommand();
            crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
            crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
            crnCommand.setAckFinish((short) 0);  // 任务完成确认位
            crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
            crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 源库位排
            crnCommand.setSourcePosY(crnStn.getBay().shortValue());     // 源库位列
            crnCommand.setSourcePosZ(crnStn.getLev().shortValue());     // 源库位层
            crnCommand.setDestinationPosX(locMast.getRow1().shortValue());     // 目标库位排
            crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列
            crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层
            if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
            } else {
                // 修改工作档状态 2.设备上走 => 3.吊车入库中
                Date now = new Date();
                wrkMast.setWrkSts(3L);
                wrkMast.setCrnStrTime(now);
                wrkMast.setModiTime(now);
                if (wrkMastMapper.updateById(wrkMast) == 0) {
                    log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                }
                // 修改工作档状态 2.设备上走 => 3.吊车入库中
                wrkMastOther.setWrkSts(3L);
                wrkMastOther.setCrnStrTime(now);
                wrkMastOther.setModiTime(now);
                if (wrkMastMapper.updateById(wrkMastOther) == 0) {
                    log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMastOther.getWrkNo());
                }
                wrkMastCrn.setWrkSts(3L);
                wrkMastCrn.setModiTime(now);
                if (wrkMastCrnMapper.updateById(wrkMastCrn) == 0) {
                    log.error("修改堆垛机工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMastCrn.getWrkNo());
                }
            }
        }
    }
    /**
@@ -2295,7 +2451,7 @@
    /**
     * 出库  ===>>  库位到堆垛机站
     * 2022-12-03 TQS修改,先遍历查询工作档所有站点出库任务LIST,根据工作档任务排序优先级高于 根据堆垛机入库站点排序
     * 2024-01-15 优化双工位
     */
    public synchronized void locToCrnStn1(CrnSlave slave, CrnProtocol crnProtocol, Integer crnStation) {
        List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep12(slave.getId());
@@ -2461,7 +2617,7 @@
    /**
     * 出库  ===>>  库位到堆垛机站
     * 2022-12-03 TQS修改,先遍历查询工作档所有站点出库任务LIST,根据工作档任务排序优先级高于 根据堆垛机入库站点排序
     * 2024-01-15 煜星小料箱
     */
    public synchronized void locToCrnStn1Single(CrnSlave slave, CrnProtocol crnProtocol) {
        List<WrkMastCrn> wrkMastCrnList = wrkMastCrnMapper.selectList(new EntityWrapper<WrkMastCrn>()
@@ -2596,6 +2752,177 @@
    }
    /**
     * 出库  ===>>  库位到堆垛机站
     * 2024-06-05  煜星大料箱
     */
    public synchronized void locToCrnStn1Big(CrnSlave slave, CrnProtocol crnProtocol, Integer crnStation) {
        List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep12(slave.getId());
        for (WrkMast wrkMast : wrkMasts) {
            if (wrkMast == null) {
                continue;
            }
            CrnSlave.CrnStn crnStn = null;
            for (CrnSlave.CrnStn crnStn1 : slave.getCrnOutStn()){
                if(crnStn1.getStaNo().equals(wrkMast.getSourceStaNo())){
                    crnStn = crnStn1;
                    break;
                }
            }
            if(Cools.isEmpty(crnStn)){
                continue;
            }
            // 工作档状态判断
            if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null) {
                log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType());
                continue;
            }
            //退库模式跳过118、119出库任务
            if (wrkMast.getStaNo()==118 || wrkMast.getStaNo()==119){
                RgvOneSign rgvOneSign = rgvOneSignMapper.selectOneSign();
                if (Cools.isEmpty(rgvOneSign) || rgvOneSign.getRgvOneSign()==1){
                    continue;
                }
            }
            // 获取源库位信息
            LocMast sourceSta = locMastService.selectById(wrkMast.getSourceLocNo());
            if (!sourceSta.getLocSts().equals("R") && !sourceSta.getLocSts().equals("P")) {
                log.error("出库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), sourceSta.getLocSts());
                continue;
            }
            // 获取堆垛机出库站信息
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
            if (staProtocol == null) {
                break;
//                    continue;
            } else {
                staProtocol = staProtocol.clone();
            }
//            // 入出库模式判断
//            if (devpThread.ioMode != IoModeType.PAKOUT_MODE) { continue; }
            if (wrkMast.getStaNo() == 204 && devpThread.ioModeOf2F != IoModeType.PAKOUT_MODE) {
                continue;
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
            if (staDetl == null) {
                log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                break;
//                    continue;
            }
            // 判断堆垛机出库站状态
            if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
                    && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                // 命令下发区 --------------------------------------------------------------------------
                //工位
                if (crnStation == 1){
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusTypeTwo().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNoTwo() != 0) {
//                        continue;
                        break;
                    }
                }else if(crnStation == 2){
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusTypeTwo().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNoTwo() != 0) {
//                        continue;
                        break;
                    }
                }else {
                    break;
                }
                // 双深库位且浅库位有货,则需先对浅库位进行库位移转
                if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) {
                    String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo());
                    LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                    // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                    if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                        WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                        if (null == waitWrkMast) {
                            log.error("{}库位异常,未检索到相应工作档!", shallowLocNo);
                        } else {
                            if (waitWrkMast.getWrkSts() == 11) {
                                waitWrkMast.setIoPri(15D);
                                waitWrkMast.setModiTime(new Date());
                                if (wrkMastMapper.updateById(waitWrkMast) == 0) {
                                    log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
                                }
                                continue;
                            } else {
                            }
                        }
                    } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
//                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                        //2022-08-16 modify,不根据updmk标记移库任务(容易被取消导致堵塞),查询工作档是否存在任务
                        WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
                        // 此标记避免多次执行移库任务
//                            if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())
//                                || Cools.isEmpty(waitWrkMast)) {
                        if (Cools.isEmpty(waitWrkMast)) {
                            wrkMast.setUpdMk("Y");
                            wrkMastMapper.updateById(wrkMast);
                            // 生成工作档,将浅库位移转到新的库位中
                            moveLocForDeepLoc(slave, shallowLoc);
                        }
                        log.error("{}任务出库失败,浅库位堵塞!浅库位号:{}", wrkMast.getWrkNo(), shallowLocNo);
                        continue;
                    } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) {
                        WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
                        if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) {
                            continue;
                        }
                    }
                }
                // 已经存在吊车执行任务时,则过滤
                if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                    break;
//                        return;
                }
                // 1.堆垛机开始移动
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.SEPARATE_TAKE); // 任务模式:  单取货
                crnCommand.setSourcePosX(sourceSta.getRow1().shortValue());     // 源库位排
                crnCommand.setSourcePosY(sourceSta.getBay1().shortValue());     // 源库位列
                crnCommand.setSourcePosZ(sourceSta.getLev1().shortValue());     // 源库位层
                crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排
                crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列
                crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层
                if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(crnStation==1? 2:5, crnCommand))) {
                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                } else {
                    // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                    Date now = new Date();
                    wrkMast.setWrkSts(12L);
                    wrkMast.setCrnStrTime(now);
                    wrkMast.setModiTime(now);
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                    }
                    break;
                }
            }
        }
    }
    /**
     * 查找工作状态为2(设备上走),且RGV入库接驳站符合的的入库工作档,提取出最多2笔
     * @param slave
     * @return
src/main/java/com/zy/asrs/service/impl/WrkMastSplitTwinServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.WrkMastSplitTwinMapper;
import com.zy.asrs.entity.WrkMastSplitTwin;
import com.zy.asrs.service.WrkMastSplitTwinService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("wrkMastSplitTwinService")
public class WrkMastSplitTwinServiceImpl extends ServiceImpl<WrkMastSplitTwinMapper, WrkMastSplitTwin> implements WrkMastSplitTwinService {
}
src/main/java/com/zy/common/CodeBuilder.java
@@ -17,10 +17,10 @@
//        generator.table="sys_host";
        // sqlserver
        generator.sqlOsType = SqlOsType.SQL_SERVER;
        generator.url="10.10.10.254:1433;databasename=ahyxasrs";
        generator.url="192.168.4.15:1433;databasename=ahyxasrs";
        generator.username="sa";
        generator.password="sa@123";
        generator.table="asr_bas_jar";
        generator.table="asr_bas_jar_mast";
        generator.packagePath="com.zy.asrs";
        generator.controller = false;
src/main/java/com/zy/core/enums/CrnTaskModeType.java
@@ -12,6 +12,8 @@
    GO_ORIGIN(7),    // 回原点
    BACK_ORIGIN(8),      // 回反原点
    CLEAR(9),       // 清错
    SEPARATE_TAKE(11),       // 单取货
    SEPARATE_PUT(12),       // 单放货
    ;
    public Integer id;
src/main/resources/mapper/BasJarMastMapper.xml
New file
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.BasJarMastMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasJarMast">
        <id column="id" property="id" />
        <result column="wrk_no" property="wrkNo" />
        <result column="enter_sta_no" property="enterStaNo" />
        <result column="out_sta_no" property="outStaNo" />
        <result column="jar_enter_sta_no" property="jarEnterStaNo" />
        <result column="jar_out_sta_no" property="jarOutStaNo" />
        <result column="jar_id" property="jarId" />
        <result column="jar_regin" property="jarRegin" />
        <result column="status" property="status" />
        <result column="enter_ste_no" property="enterSteNo" />
        <result column="out_ste_id" property="outSteId" />
        <result column="enter_rgv_id" property="enterRgvId" />
        <result column="out_rgv_id" property="outRgvId" />
        <result column="io_time" property="ioTime" />
        <result column="modi_time" property="modiTime" />
        <result column="appe_time" property="appeTime" />
    </resultMap>
</mapper>
src/main/resources/mapper/BasJarMastStatusMapper.xml
New file
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.BasJarMastStatusMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasJarMastStatus">
        <id column="id" property="id" />
        <result column="box_specs" property="boxSpecs" />
        <result column="box_type" property="boxType" />
    </resultMap>
</mapper>
src/main/resources/mapper/WrkMastSplitTwinMapper.xml
New file
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.WrkMastSplitTwinMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMastSplitTwin">
        <id column="id" property="id" />
        <result column="wrk_no" property="wrkNo" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="type" property="type" />
        <result column="wrk_sts" property="wrkSts" />
        <result column="line_number" property="lineNumber" />
        <result column="wrk_type" property="wrkType" />
        <result column="bign_time" property="bignTime" />
        <result column="crn_no" property="crnNo" />
        <result column="wrk_start" property="wrkStart" />
        <result column="wrk_end" property="wrkEnd" />
        <result column="start_row" property="startRow" />
        <result column="start_bay" property="startBay" />
        <result column="start_lev" property="startLev" />
        <result column="end_row" property="endRow" />
        <result column="end_bay" property="endBay" />
        <result column="end_lev" property="endLev" />
        <result column="io_type" property="ioType" />
    </resultMap>
</mapper>