自动化立体仓库 - WCS系统
#
lsh
2024-02-17 2f264c1b46174f861d10cd81b8b0eec1e4157db4
#
3个文件已添加
5个文件已修改
1280 ■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/WrkMastCrn.java 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastCrnMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 589 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/CrnSlave.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/DevpSlave.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 328 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastCrnMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastCrn.java
New file
@@ -0,0 +1,293 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.asrs.service.*;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
@Data
@TableName("asr_wrk_mast_crn")
public class WrkMastCrn implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 工作号
     */
    @ApiModelProperty(value= "工作号")
    @TableId(value = "wrk_no", type = IdType.INPUT)
    @TableField("wrk_no")
    private Long wrkNo;
    /**
     * 工作状态
     */
    @ApiModelProperty(value= "工作状态")
    @TableField("wrk_sts")
    private Long wrkSts;
    /**
     * 入出库类型
     */
    @ApiModelProperty(value= "入出库类型")
    @TableField("io_type")
    private Integer ioType;
    /**
     * 堆垛机
     */
    @ApiModelProperty(value= "堆垛机")
    @TableField("crn_no")
    private Integer crnNo;
    /**
     * 目标库位
     */
    @ApiModelProperty(value= "目标库位")
    @TableField("loc_no")
    private String locNo;
    /**
     * 目标站
     */
    @ApiModelProperty(value= "目标站")
    @TableField("sta_no")
    private Integer staNo;
    /**
     * 源站
     */
    @ApiModelProperty(value= "源站")
    @TableField("source_sta_no")
    private Integer sourceStaNo;
    /**
     * 源库位
     */
    @ApiModelProperty(value= "源库位")
    @TableField("source_loc_no")
    private String sourceLocNo;
    @ApiModelProperty(value= "")
    @TableField("loc_sts")
    private String locSts;
    /**
     * 工作时间
     */
    @ApiModelProperty(value= "工作时间")
    @TableField("io_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date ioTime;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("modi_user")
    private String modiUser;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("modi_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date modiTime;
    /**
     * 工作号1
     */
    @ApiModelProperty(value= "工作号1")
    @TableField("wrk_no_one")
    private Long wrkNoOne;
    /**
     * 工作号2
     */
    @ApiModelProperty(value= "工作号2")
    @TableField("wrk_no_two")
    private Long wrkNoTwo;
    /**
     * 目标库位1
     */
    @ApiModelProperty(value= "目标库位1")
    @TableField("loc_no_one")
    private String locNoOne;
    /**
     * 目标库位2
     */
    @ApiModelProperty(value= "目标库位2")
    @TableField("loc_no_two")
    private String locNoTwo;
    /**
     * 目标站1
     */
    @ApiModelProperty(value= "目标站1")
    @TableField("sta_no_one")
    private Integer staNoOne;
    /**
     * 目标站2
     */
    @ApiModelProperty(value= "目标站2")
    @TableField("sta_no_two")
    private Integer staNoTwo;
    /**
     * 源站1
     */
    @ApiModelProperty(value= "源站1")
    @TableField("source_sta_no_one")
    private Integer sourceStaNoOne;
    /**
     * 源站2
     */
    @ApiModelProperty(value= "源站2")
    @TableField("source_sta_no_two")
    private Integer sourceStaNoTwo;
    /**
     * 源库位1
     */
    @ApiModelProperty(value= "源库位1")
    @TableField("source_loc_no_one")
    private String sourceLocNoOne;
    /**
     * 源库位2
     */
    @ApiModelProperty(value= "源库位2")
    @TableField("source_loc_no_two")
    private String sourceLocNoTwo;
    public WrkMastCrn() {}
    public WrkMastCrn(Long wrkNo, Long wrkSts, Integer ioType, Integer crnNo, String locNo, Integer staNo, Integer sourceStaNo, String sourceLocNo, String locSts, Date ioTime, String modiUser, Date modiTime, Long wrkNoOne, Long wrkNoTwo, String locNoOne, String locNoTwo, Integer staNoOne, Integer staNoTwo, Integer sourceStaNoOne, Integer sourceStaNoTwo, String sourceLocNoOne, String sourceLocNoTwo) {
        this.wrkNo = wrkNo;
        this.wrkSts = wrkSts;
        this.ioType = ioType;
        this.crnNo = crnNo;
        this.locNo = locNo;
        this.staNo = staNo;
        this.sourceStaNo = sourceStaNo;
        this.sourceLocNo = sourceLocNo;
        this.locSts = locSts;
        this.ioTime = ioTime;
        this.modiUser = modiUser;
        this.modiTime = modiTime;
        this.wrkNoOne = wrkNoOne;
        this.wrkNoTwo = wrkNoTwo;
        this.locNoOne = locNoOne;
        this.locNoTwo = locNoTwo;
        this.staNoOne = staNoOne;
        this.staNoTwo = staNoTwo;
        this.sourceStaNoOne = sourceStaNoOne;
        this.sourceStaNoTwo = sourceStaNoTwo;
        this.sourceLocNoOne = sourceLocNoOne;
        this.sourceLocNoTwo = sourceLocNoTwo;
    }
//    WrkMastCrn wrkMastCrn = new WrkMastCrn(
//            null,    // 工作号[非空]
//            null,    // 工作状态
//            null,    // 入出库类型
//            null,    // 堆垛机
//            null,    // 目标库位
//            null,    // 目标站
//            null,    // 源站
//            null,    // 源库位
//            null,    //
//            null,    // 工作时间
//            null,    // 修改人员
//            null,    // 修改时间
//            null,    // 工作号1
//            null,    // 工作号2
//            null,    // 目标库位1
//            null,    // 目标库位2
//            null,    // 目标站1
//            null,    // 目标站2
//            null,    // 源站1
//            null,    // 源站2
//            null,    // 源库位1
//            null    // 源库位2
//    );
    public String getCrnNo$(){
        BasCrnpService service = SpringUtils.getBean(BasCrnpService.class);
        BasCrnp basCrnp = service.selectById(this.crnNo);
        if (!Cools.isEmpty(basCrnp)){
            return String.valueOf(basCrnp.getCrnNo());
        }
        return null;
    }
    public String getLocNo$(){
        LocMastService service = SpringUtils.getBean(LocMastService.class);
        LocMast locMast = service.selectById(this.locNo);
        if (!Cools.isEmpty(locMast)){
            return String.valueOf(locMast.getLocNo());
        }
        return null;
    }
    public String getStaNo$(){
        BasDevpService service = SpringUtils.getBean(BasDevpService.class);
        BasDevp basDevp = service.selectById(this.staNo);
        if (!Cools.isEmpty(basDevp)){
            return String.valueOf(basDevp.getDevNo());
        }
        return null;
    }
    public String getSourceStaNo$(){
        BasDevpService service = SpringUtils.getBean(BasDevpService.class);
        BasDevp basDevp = service.selectById(this.sourceStaNo);
        if (!Cools.isEmpty(basDevp)){
            return String.valueOf(basDevp.getDevNo());
        }
        return null;
    }
    public String getSourceLocNo$(){
        LocMastService service = SpringUtils.getBean(LocMastService.class);
        LocMast locMast = service.selectById(this.sourceLocNo);
        if (!Cools.isEmpty(locMast)){
            return String.valueOf(locMast.getLocNo());
        }
        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);
    }
}
src/main/java/com/zy/asrs/mapper/WrkMastCrnMapper.java
New file
@@ -0,0 +1,15 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.WrkMastCrn;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface WrkMastCrnMapper extends BaseMapper<WrkMastCrn> {
    WrkMastCrn selectWrkNoOneAndTwo(@Param("wrkNo")Integer wrkNo);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -101,6 +101,8 @@
    private BasRgvMapMapper basRgvMapMapper;
    @Autowired
    private RgvOneSignMapper rgvOneSignMapper;
    @Autowired
    private WrkMastCrnMapper wrkMastCrnMapper;
    @Value("${wms.url}")
    private String wmsUrl;
@@ -259,6 +261,175 @@
                            }
                        } else {
                            log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
            }
        }
    }
    /**
     * 组托
     * 入库站,根据条码扫描生成入库工作档,工作状态 2
     */
    public synchronized void generateStoreWrkFileSingle() {
        // 根据输送线plc遍历
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历入库口
            for (DevpSlave.Sta inSta : devp.getInSingleSta()) {
                // 获取条码扫描仪信息
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                if (barcodeThread == null) {
                    continue;
                }
                String barcode = barcodeThread.getBarcode();
                if (!Cools.isEmpty(barcode)) {
//                    log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                    if ("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
                        continue;
                    }
                } else {
                    continue;
                }
                // 获取入库站信息
//                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 尺寸检测异常
                boolean back = false;
                String errMsg = "异常:";
                if (staProtocol.isFrontErr()) {
                    errMsg = errMsg+"前超限;";
                    back = true;
                }
                if (staProtocol.isBackErr()) {
                    errMsg = errMsg+"后超限";
                    back = true;
                }
                if (staProtocol.isHighErr()) {
                    errMsg = errMsg+"高超限";
                    back = true;
                }
                if (staProtocol.isLeftErr()) {
                    errMsg = errMsg+"左超限";
                    back = true;
                }
                if (staProtocol.isRightErr()) {
                    errMsg = errMsg+"右超限";
                    back = true;
                }
                if (staProtocol.isWeightErr()) {
                    errMsg = errMsg+"超重";
                    back = true;
                }
                if (staProtocol.isBarcodeErr()) {
                    errMsg = errMsg+"扫码失败";
                    back = true;
                }
                // 退回
                if (back) {
                    // led 异常显示
                    LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                    if (ledThread != null) {
                        MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(5, errMsg));
                    }
                    continue;
                }
                // 入出库模式判断
//                if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; }
//                if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) {
//                    continue;
//                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk()
                        && staProtocol.getWorkNo() == 0
                        && staProtocol.isPakMk()) {// && !Cools.isEmpty(barcode)) {
//                    if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode)) {
//                        log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
//                        //条码为空或者不符合,退库到172站点
//                        staProtocol.setWorkNo((short)32222);
//                        staProtocol.setStaNo((short)172);
//                        devpThread.setPakMk(staProtocol.getSiteId(), false);
//                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                        if (!result) {
//                            throw new CoolException("更新plc站点信息失败");
//                        }
//                        continue;
//                    }
                    // 判断重复工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode);
                    if (wrkMast != null) {
                        log.error("工作档中已存在该站状态为( 2.设备上走 )的数据,工作号={}", wrkMast.getWrkNo());
                        continue;
                    }
//                    // 获取入库通知档
//                    List<WaitPakin> waitPakins = waitPakinMapper.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", barcode).eq("io_status", "N"));
//                    if (waitPakins.isEmpty()) {
//                        log.error("无此入库条码数据。条码号={}", barcode);
//                        continue;
//                    }
                    try {
                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                        SearchLocParam param = new SearchLocParam();
                        param.setBarcode(barcode);
                        param.setIoType(1);
                        param.setSourceStaNo(inSta.getStaNo());
                        param.setLocType1(locTypeDto.getLocType1());
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/pair/station/single/loc/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                            barcodeThread.setBarcode("");
                            staProtocol.setWorkNo(dto.getWorkNo());
                            if(Cools.isEmpty(dto.getRgvNo()) || dto.getRgvNo() <= 0) {
                                staProtocol.setStaNo(dto.getStaNo());
                            } else {//如果存在RGV编号,说明需要RGV接驳,先下发任务到RGV源站
                                staProtocol.setStaNo(dto.getRgvSstaNo());
                            }
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            if (!result) {
                                throw new CoolException("更新plc站点信息失败");
                            }
                        } else {
                            log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/pair/station/single/loc/v1", JSON.toJSONString(param), response);
                        }
                    } catch (Exception e) {
@@ -972,20 +1143,44 @@
                    // 如果最近一次是入库模式
                    if (crnProtocol.getLastIo().equals("I")) {
                        if (basCrnp.getInEnable().equals("Y")) {
                            this.crnStnToLoc1(crn, crnProtocol); //  入库
                            switch (crn.getId()){
                                case 1:
                                case 2:
                                    this.crnStnToLoc1Single(crn, crnProtocol); //  入库
                                default:
                                    this.crnStnToLoc1(crn, crnProtocol); //  入库
                            }
                            crnProtocol.setLastIo("O");
                        } else if (basCrnp.getOutEnable().equals("Y")) {
                            this.locToCrnStn1(crn, crnProtocol); //  出库
                            switch (crn.getId()){
                                case 1:
                                case 2:
                                    this.locToCrnStn1Single(crn, crnProtocol); //  出库
                                default:
                                    this.locToCrnStn1(crn, crnProtocol); //  出库
                            }
                            crnProtocol.setLastIo("I");
                        }
                    }
                    // 如果最近一次是出库模式
                    else if (crnProtocol.getLastIo().equals("O")) {
                        if (basCrnp.getOutEnable().equals("Y")) {
                            this.locToCrnStn1(crn, crnProtocol); //  出库
                            switch (crn.getId()){
                                case 1:
                                case 2:
                                    this.locToCrnStn1Single(crn, crnProtocol); //  出库
                                default:
                                    this.locToCrnStn1(crn, crnProtocol); //  出库
                            }
                            crnProtocol.setLastIo("I");
                        } else if (basCrnp.getInEnable().equals("Y")) {
                            this.crnStnToLoc1(crn, crnProtocol); //  入库
                            switch (crn.getId()){
                                case 1:
                                case 2:
                                    this.crnStnToLoc1Single(crn, crnProtocol); //  入库
                                default:
                                    this.crnStnToLoc1(crn, crnProtocol); //  入库
                            }
                            crnProtocol.setLastIo("O");
                        }
                    }
@@ -1386,6 +1581,140 @@
    }
    /**
     * 入库  ===>>  堆垛机站到库位
     * 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("入库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.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());
                }
            }
        }
    }
    /**
     * 出库  ===>>  库位到堆垛机站
     * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库
     */
@@ -1528,6 +1857,160 @@
     * 2022-12-03 TQS修改,先遍历查询工作档所有站点出库任务LIST,根据工作档任务排序优先级高于 根据堆垛机入库站点排序
     */
    public synchronized void locToCrnStn1(CrnSlave slave, CrnProtocol crnProtocol) {
        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 (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                    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.LOC_MOVE); // 任务模式:  库位移转
                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(2, 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;
                }
            }
        }
    }
    /**
     * 出库  ===>>  库位到堆垛机站
     * 2022-12-03 TQS修改,先遍历查询工作档所有站点出库任务LIST,根据工作档任务排序优先级高于 根据堆垛机入库站点排序
     */
    public synchronized void locToCrnStn1Single(CrnSlave slave, CrnProtocol crnProtocol) {
        List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep12(slave.getId());
        for (WrkMast wrkMast : wrkMasts) {
            if (wrkMast == null) {
@@ -1903,6 +2386,47 @@
                if (crnProtocol.getTaskNo() == 32222) {
                    // 堆垛机复位
                    crnThread.setResetFlag(true);
                } else if (crnProtocol.getCrnNo()<3) {
                    // 获取入库待确认工作档
                    WrkMastCrn wrkMastCrn = wrkMastCrnMapper.selectWrkNoOneAndTwo(crnProtocol.getTaskNo().intValue());
                    if (wrkMastCrn == null) {
                        log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                        continue;
                    }
                    // 获取入库待确认工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue());
                    if (wrkMast == null) {
                        log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                        continue;
                    }
                    // 获取入库待确认工作档
                    WrkMast wrkMastOther = wrkMastMapper.selectPakInStep3(wrkMastCrn.getWrkNoTwo().intValue());
                    if (wrkMastOther == null) {
                        log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                        continue;
                    }
                    // 入库 + 库位转移  ==> 4.入库完成
                    if (wrkMastCrn.getWrkSts() == 3 || (wrkMastCrn.getWrkSts() == 12 && wrkMastCrn.getIoType() == 11)) {
                        wrkMastCrn.setWrkSts(4L);
                    } else {
                        continue;
                    }
                    Date now = new Date();
                    wrkMastCrn.setModiTime(now);
                    wrkMast.setCrnEndTime(now);
                    wrkMast.setWrkSts(4L);
                    wrkMast.setModiTime(now);
                    wrkMastOther.setCrnEndTime(now);
                    wrkMastOther.setWrkSts(4L);
                    wrkMastOther.setModiTime(now);
                    // 修改成功后复位堆垛机
                    if (wrkMastCrnMapper.updateById(wrkMastCrn) > 0 && wrkMastMapper.updateById(wrkMast) > 0 && wrkMastMapper.updateById(wrkMastOther) > 0 ) {
                        // 堆垛机复位
                        crnThread.setResetFlag(true);
                    }
                } else {
                    // 获取入库待确认工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue());
@@ -2241,6 +2765,63 @@
    }
    /**
     * 空栈板初始化入库,叉车入库站放货
     */
    public synchronized void storeEmptyPltSingle() {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历空板入库口
            for (DevpSlave.Sta emptyInSta : devp.getEmptyInSingleSta()) {
                // 获取空板入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 站点条件判断
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk() && ((staProtocol.getWorkNo() > 32222 && staProtocol.getWorkNo() <= 63333) || staProtocol.getWorkNo()==0)  && staProtocol.isPakMk()) {
                    try {
                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                        SearchLocParam param = new SearchLocParam();
                        param.setIoType(10);
                        param.setSourceStaNo(emptyInSta.getStaNo());
                        param.setLocType1(locTypeDto.getLocType1());
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/pair/station/single/loc/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            // 更新站点信息 且 下发plc命令
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(dto.getStaNo());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            if (!result) {
                                throw new CoolException("更新plc站点信息失败");
                            }
                        } else {
                            log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/pair/station/single/loc/v1", JSON.toJSONString(param), response);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
            }
        }
    }
    /**
     * 入库  ===>> 空栈板初始化入库,1楼叠盘机叠盘
     */
    public synchronized void storeEmptyPlt2() {
src/main/java/com/zy/core/MainProcess.java
@@ -55,15 +55,16 @@
//                    mainService.ioConvert();
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile(); // 组托
                    mainService.generateStoreWrkFileSingle(); // 组托  双工位单伸   小料箱
                    // 入库  ===>> 码垛位获取空板条码信息
                    mainService.generateStoreWrkFileFull2LouM(); // 组托
//                    mainService.generateStoreWrkFileFull2LouM(); // 组托
                    mainService.generateStoreWrkFile0(); // WMS入库
                    // 拣料、并板、盘点再入库
                    mainService.stnToCrnStnPick();
//                    mainService.stnToCrnStnPick();
                    // 拣料、并板、盘点再入库拆盘区   1楼拆垛位置
                    mainService.stnToCrnStnPick2();
//                    mainService.stnToCrnStnPick2();
                    // 2楼212呼叫空板
                    mainService.stnToCrnStnPick3Auto(i);
//                    mainService.stnToCrnStnPick3Auto(i);
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn();
                    // 入出库  ===>>  堆垛机入出库作业下发
@@ -98,8 +99,10 @@
//                    // 异常信息记录
//                    mainService.recErr();
//                    // 入库  ===>> 空栈板初始化入库,叉车入库站放货  2楼
                    // 入库  ===>> 空栈板初始化入库
//                    mainService.storeEmptyPlt();
                    // 入库  ===>> 空栈板初始化入库
                    mainService.storeEmptyPltSingle();
//                    // 入库  ===>> 空栈板初始化入库,1楼叠盘机空板入库
//                    mainService.storeEmptyPlt3();
//                    // 入库  ===>> 空栈板初始化入库,1楼叠盘机叠盘
src/main/java/com/zy/core/model/CrnSlave.java
@@ -37,6 +37,9 @@
        // 堆垛机站点编号
        private Integer staNo;
        // 堆垛机站点编号
        private Integer staNoOther;
        // 排
        private Integer row;
src/main/java/com/zy/core/model/DevpSlave.java
@@ -22,9 +22,12 @@
    private List<Sta> inSta = new ArrayList<>();
    private List<Sta> driveSta = new ArrayList<>();
    private List<Sta> inWmsSta = new ArrayList<>();
    private List<Sta> inSingleSta = new ArrayList<>();
    private List<Sta> singleSta = new ArrayList<>();
    private List<Sta> emptyInSta = new ArrayList<>();
    private List<Sta> emptyInSta2 = new ArrayList<>();
    private List<Sta> emptyInSingleSta = new ArrayList<>();
    private List<Sta> outSta = new ArrayList<>();
src/main/resources/application.yml
@@ -59,31 +59,19 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 3
      staNo: 153
      staNoOther: 152
      row: 4
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 201
      row: 3
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      row: 2
      staNoOther: 101
      row: 1
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 200
      row: 2
      bay: 1
      lev: 2
  # 堆垛机2
  crn[1]:
    id: 2
@@ -97,178 +85,23 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 105
      row: 7
      staNo: 145
      staNoOther: 144
      row: 8
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 203
      row: 7
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 103
      row: 6
      staNo: 148
      staNoOther: 149
      row: 5
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 202
      row: 6
      bay: 1
      lev: 1
  # 堆垛机3
  crn[2]:
    id: 3
    ip: 192.168.18.29
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 11
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 205
      row: 11
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 10
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 204
      row: 10
      bay: 1
      lev: 2
  # 堆垛机4
  crn[3]:
    id: 4
    ip: 192.168.18.37
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 111
      row: 15
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 207
      row: 15
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 109
      row: 14
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 206
      row: 14
      bay: 1
      lev: 2
  # 堆垛机5
  crn[4]:
    id: 5
    ip: 192.168.18.45
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 114
      row: 19
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 209
      row: 19
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 112
      row: 18
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 208
      row: 18
      bay: 1
      lev: 2
  # RGV穿梭车1
  rgv[0]:
    id: 1
    ip: 192.168.18.77
    port: 502
    rack: 0
    slot: 0
    #RGV入库源站点
    rgvInSStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
    rgvInSStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
    #RGV出库源站点
    rgvOutSStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 110
    rgvOutSStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 112
    #RGV目标站点
    rgvDestStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
    rgvDestStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 103
  # RGV穿梭车2
  rgv[1]:
    id: 2
    ip: 192.168.18.79
    port: 502
    rack: 0
    slot: 0
@@ -301,119 +134,18 @@
    port: 102
    rack: 0
    slot: 0
    # WMS入库口1
    inWmsSta[0]:
    # 小料箱 双工位单伸 入库口1
    singleSta[0]:
      staNo: 153
    # 小料箱 双工位单伸 入库口1
    singleSta[1]:
      staNo: 145
    # 空板入库口1
    emptyInSta[0]:
      staNo: 122
    # 拆垛叠盘口1
    emptyInSta2[0]:
      staNo: 118
    # 拆垛叠盘口2
    emptyInSta2[1]:
      staNo: 119
    # 拆垛叠盘口3
    emptyInSta2[2]:
      staNo: 120
    # 拆垛叠盘口4
    emptyInSta2[3]:
      staNo: 121
    # 出库口1
    outSta[0]:
      staNo: 122
    # 拣料入库口1
    pickSta2[0]:
      staNo: 118
    # 拣料入库口1
    pickSta2[1]:
      staNo: 119
    # 拣料入库口1
    pickSta2[2]:
      staNo: 120
    # 拣料入库口1
    pickSta2[3]:
      staNo: 121
    # 拣料入库口1
    pickSta[0]:
      staNo: 122
    # Rgv出库口1
    outRgvSta[0]:
      staNo: 102
    # Rgv出库口1
    outRgvSta[1]:
      staNo: 105
    # Rgv出库口1
    outRgvSta[2]:
      staNo: 108
    # Rgv出库口1
    outRgvSta[3]:
      staNo: 111
    # Rgv出库口1
    outRgvSta[4]:
      staNo: 114
    # Rgv出库口1
    outRgvSta[5]:
      staNo: 117
    # Rgv入库口1
    inRgvSta[0]:
      staNo: 118
    # Rgv入库口1
    inRgvSta[1]:
      staNo: 119
    # Rgv入库口1
    inRgvSta[2]:
      staNo: 120
    # Rgv入库口1
    inRgvSta[3]:
      staNo: 121
    # Rgv入库口1
    inRgvSta[4]:
      staNo: 122
    # Rgv入库口1
    inRgvSta[5]:
      staNo: 123
  # 输送线
  devp[1]:
    id: 2
    ip: 192.168.18.81
    port: 102
    rack: 0
    slot: 0
    # 入库口1
    inSta[0]:
      staNo: 217
      barcode: ${wcs-slave.barcode[0].id}
      led: ${wcs-slave.led[2].id}
    # 入库口1
    inSta[1]:
      staNo: 221
      barcode: ${wcs-slave.barcode[1].id}
      led: ${wcs-slave.led[1].id}
    # WMS入库口1
    inWmsSta[0]:
      staNo: 212
    # 空板入库口1
    emptyInSta[0]:
      staNo: 212
    # 出库口1
    outSta[0]:
      staNo: 212
    # 出库口1
    outSta[1]:
      staNo: 213
    # 拣料入库口1
    pickSta[0]:
      staNo: 212
    # 2楼码垛位置
    driveSta[0]:
      staNo: 215
      barcode: ${wcs-slave.barcode[3].id}
    # 2楼码垛位置
    driveSta[1]:
      staNo: 219
      barcode: ${wcs-slave.barcode[4].id}
    # 小料箱 双工位单伸 入库口1
    inSingleSta[0]:
      staNo: 174
    # 小料箱 双工位单伸 空板入库口1
    emptyInSingleSta[0]:
      staNo: 104
  # 条码扫描仪
  barcode[0]:
@@ -446,18 +178,4 @@
    ip: 192.168.18.5
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 144
  # LED2
  led[1]:
    id: 2
    ip: 192.168.18.6
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 221
  # LED3
  led[2]:
    id: 3
    ip: 192.168.18.7
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 217
    staArr: 144
src/main/resources/mapper/WrkMastCrnMapper.xml
New file
@@ -0,0 +1,36 @@
<?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.WrkMastCrnMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMastCrn">
        <result column="wrk_no" property="wrkNo" />
        <result column="wrk_sts" property="wrkSts" />
        <result column="io_type" property="ioType" />
        <result column="crn_no" property="crnNo" />
        <result column="loc_no" property="locNo" />
        <result column="sta_no" property="staNo" />
        <result column="source_sta_no" property="sourceStaNo" />
        <result column="source_loc_no" property="sourceLocNo" />
        <result column="loc_sts" property="locSts" />
        <result column="io_time" property="ioTime" />
        <result column="modi_user" property="modiUser" />
        <result column="modi_time" property="modiTime" />
        <result column="wrk_no_one" property="wrkNoOne" />
        <result column="wrk_no_two" property="wrkNoTwo" />
        <result column="loc_no_one" property="locNoOne" />
        <result column="loc_no_two" property="locNoTwo" />
        <result column="sta_no_one" property="staNoOne" />
        <result column="sta_no_two" property="staNoTwo" />
        <result column="source_sta_no_one" property="sourceStaNoOne" />
        <result column="source_sta_no_two" property="sourceStaNoTwo" />
        <result column="source_loc_no_one" property="sourceLocNoOne" />
        <result column="source_loc_no_two" property="sourceLocNoTwo" />
    </resultMap>
    <select id="selectWrkNoOneAndTwo" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast_crn where wrk_no=#{wrkNo}
    </select>
</mapper>