#
LSH
2023-07-13 424151075e67ae827313d454433b3a7df6b98ab5
#
11个文件已修改
230 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/BasCrnp.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/CrnThread.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnTaskModeType.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/crn.html 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasCrnp.java
@@ -44,6 +44,13 @@
    private String outEnable;
    /**
     * 回原点
     */
    @ApiModelProperty(value= "回原点")
    @TableField("move_origin")
    private String moveOrigin;
    /**
     * 状态
     */
    @ApiModelProperty(value= "状态")
@@ -150,9 +157,10 @@
    public BasCrnp() {}
    public BasCrnp(String inEnable,String outEnable,Integer crnSts,Integer wrkNo,Long crnErr,String frmLocno,Integer frmSta,Integer toSta,String toLocno,Long appeUser,Date appeTime,Long modiUser,Date modiTime,String hpMk,String retrieveMk,String ctlHp,String ctlRest,String empIn,Integer tankQty,Integer tankQty1) {
    public BasCrnp(String inEnable,String outEnable,String moveOrigin,Integer crnSts,Integer wrkNo,Long crnErr,String frmLocno,Integer frmSta,Integer toSta,String toLocno,Long appeUser,Date appeTime,Long modiUser,Date modiTime,String hpMk,String retrieveMk,String ctlHp,String ctlRest,String empIn,Integer tankQty,Integer tankQty1) {
        this.inEnable = inEnable;
        this.outEnable = outEnable;
        this.moveOrigin = moveOrigin;
        this.crnSts = crnSts;
        this.wrkNo = wrkNo;
        this.crnErr = crnErr;
@@ -220,6 +228,12 @@
        this.outEnable = outEnable;
    }
    public String getMoveOrigin() { return moveOrigin; }
    public void setMoveOrigin(String moveOrigin) {
        this.moveOrigin = moveOrigin;
    }
    public Integer getCrnSts() {
        return crnSts;
    }
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -108,5 +108,9 @@
    WrkMast selectPakoutEmpty(@Param("staNo")Integer outSite);
    WrkMast wrkCrnMoveOutXY(@Param("crnNo")Integer crnNo);
    WrkMast wrkCrnMoveOutXYing(@Param("crnNo")Integer crnNo);
    WrkMast wrkCrnMoveOutXYingOther(@Param("crnNo")Integer crnNo);
}
src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -15,4 +15,6 @@
    int getOutToStn182(Integer devpNo);
    WrkMast wrkCrnMoveOutXY(Integer crnNo);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -87,6 +87,8 @@
    private BasErrLogService basErrLogService;
    @Autowired
    private BasCrnErrorMapper basCrnErrorMapper;
    @Autowired
    private WrkMastService wrkMastService;
    @Value("${wms.url}")
    private String wmsUrl;
@@ -600,21 +602,21 @@
                if (crnProtocol.getLastIo().equals("I")) {
                    if (basCrnp.getInEnable().equals("Y")) {
                        //mark - 1 - ....
                        this.crnStnToLoc(crn, crnProtocol,mark); //  入库
                        this.crnStnToLoc(crn, crnThread,mark); //  入库
                        crnProtocol.setLastIo("O");
                    } else if (basCrnp.getOutEnable().equals("Y")) {
                        //mark - 2 - ....
                        this.locToCrnStn(crn, crnProtocol,mark); //  出库
                        this.locToCrnStn(crn, crnThread,mark); //  出库
                        crnProtocol.setLastIo("I");
                    }
                }
                // 如果最近一次是出库模式
                else if (crnProtocol.getLastIo().equals("O")) {
                    if (basCrnp.getOutEnable().equals("Y")) {
                        this.locToCrnStn(crn, crnProtocol,mark); //  出库
                        this.locToCrnStn(crn, crnThread,mark); //  出库
                        crnProtocol.setLastIo("I");
                    } else if (basCrnp.getInEnable().equals("Y")) {
                        this.crnStnToLoc(crn, crnProtocol,mark); //  入库
                        this.crnStnToLoc(crn, crnThread,mark); //  入库
                        crnProtocol.setLastIo("O");
                    }
                }
@@ -622,10 +624,101 @@
            // 库位移转
            //mark - 3 - ....
            this.locToLoc(crn, crnProtocol,mark);
            if (!Cools.isEmpty(basCrnp.getMoveOrigin()) && basCrnp.getMoveOrigin().equals("Y")){
                if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                        && crnThread.isCmdFlag()) {
                    this.crnMoveIntXY(crn, crnProtocol, crnThread);
                    this.crnMoveOutXY(crn, crnProtocol, crnThread);
                }
            }
//            this.crnRebackHp(crnProtocol, crnThread);
        }
        News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成");
    }
    /**
     * 堆垛机xy移动
     */
    public synchronized void crnMoveIntXY(CrnSlave crn,CrnProtocol crnProtocol, CrnThread crnThread) {
        // 只有当堆垛机空闲 并且 无任务时才继续执行
        if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                && !crnProtocol.getBay().equals((short)1) && crnThread.isCmdFlag()) {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().ne("io_type", 1).and().ne("wrk_sts", 40L).and().ne("io_type",10));
            if (Cools.isEmpty(wrkMasts) || wrkMasts.size()==0){
                // 堆垛机入库 命令下发区 --------------------------------------------------------------------------
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(crn.getId()); // 堆垛机编号
                crnCommand.setTaskNo((short)9999); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式:  回原点
                crnCommand.setSourcePosX((short)1);     // 源库位排
                crnCommand.setSourcePosY((short)1);     // 源库位列
                crnCommand.setSourcePosZ((short)1);     // 源库位层
                crnCommand.setDestinationPosX((short)1);     // 目标库位排
                crnCommand.setDestinationPosY((short)1);     // 目标库位列
                crnCommand.setDestinationPosZ((short)1);     // 目标库位层
                if (!MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, crnCommand))) {
                    News.error("堆垛机命令下发失败,堆垛机号={},任务数据={} ,任务类型:回原点", crnProtocol.getCrnNo(), JSON.toJSON(crnCommand));
                } else {
                    crnThread.setCmdFlag(false);
                }
            }
        }
    }
    /**
     * 堆垛机xy移动
     */
    public synchronized void crnMoveOutXY(CrnSlave crn,CrnProtocol crnProtocol, CrnThread crnThread) {
        // 只有当堆垛机空闲 并且 无任务时才继续执行
        if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                && crnThread.isCmdFlag()) {
            List<WrkMast> wrkMastsM = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 1).and().ne("wrk_sts", 20L));
            List<WrkMast> wrkMastsK = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 10).and().ne("wrk_sts", 20L));
            if ((Cools.isEmpty(wrkMastsM) || wrkMastsM.size()==0) && (Cools.isEmpty(wrkMastsK) || wrkMastsK.size()==0)){
                WrkMast wrkMast = wrkMastService.wrkCrnMoveOutXY(crnProtocol.getCrnNo());
                if (Cools.isEmpty(wrkMast)){
                    return;
                }
                short locRow = 1;
                short locBay = 1;
                short locLev = 1;
                if (wrkMast.getIoType().equals(111)) {
                    //库位移转-入库,获取工作档目标库位的排列层
                    String locNo = wrkMast.getLocNo();
                    locBay = (short) Utils.getBay(locNo);
                    locLev = (short) Utils.getLev(locNo);
                }else if ( wrkMast.getIoType().equals(101)  || wrkMast.getIoType().equals(110)  || wrkMast.getIoType().equals(11)){
                    //出库,获取工作档源库位的排列层
                    String sourceLocNo = wrkMast.getSourceLocNo();
                    locBay = (short) Utils.getBay(sourceLocNo);
                    locLev = (short) Utils.getLev(sourceLocNo);
                }
                if (crnProtocol.getBay().equals(locBay)){
                    return;
                }
                // 堆垛机入库 命令下发区 --------------------------------------------------------------------------
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(crn.getId()); // 堆垛机编号
                crnCommand.setTaskNo((short)9999); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.XY_MOVE); // 任务模式:  站位转移
                crnCommand.setSourcePosX(locRow);     // 源库位排
                crnCommand.setSourcePosY(locBay);     // 源库位列
                crnCommand.setSourcePosZ(locLev);     // 源库位层
                crnCommand.setDestinationPosX(locRow);     // 目标库位排
                crnCommand.setDestinationPosY(locBay);     // 目标库位列
                crnCommand.setDestinationPosZ(locLev);     // 目标库位层
                if (!MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, crnCommand))) {
                    News.error("堆垛机命令下发失败,堆垛机号={},任务数据={} ,任务类型:回原点", crnProtocol.getCrnNo(), JSON.toJSON(crnCommand));
                    return;//continue
                } else {
                    crnThread.setCmdFlag(false);
                }
            }
        }
    }
    /**
@@ -687,7 +780,12 @@
    /**
     * 入库  ===>>  堆垛机站到库位
     */
    public synchronized void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) {
    public synchronized void crnStnToLoc(CrnSlave slave, CrnThread crnThread,Integer mark) {
        CrnProtocol crnProtocol = crnThread.getCrnProtocol();
        if (crnProtocol == null) { return; }
        // 只有当堆垛机空闲 并且 无任务时才继续执行
        if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                && crnThread.isCmdFlag()) {
        News.warnNoLog(""+mark+" - 1"+" - 0"+" - 堆垛机入出库作业下发:执行入库");
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            boolean flag = false;
@@ -833,12 +931,18 @@
        }
        News.infoNoLog(""+mark+" - 1"+" - 0"+" - 堆垛机入出库作业下发 : 入库执行完毕");
    }
    }
    /**
     * 出库  ===>>  库位到堆垛机站
     * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库
     */
    public synchronized void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) {
    public synchronized void locToCrnStn(CrnSlave slave, CrnThread crnThread,Integer mark) {
        CrnProtocol crnProtocol = crnThread.getCrnProtocol();
        if (crnProtocol == null) { return; }
        // 只有当堆垛机空闲 并且 无任务时才继续执行
        if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                && crnThread.isCmdFlag()) {
        News.warnNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发:执行出库");
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            // 获取工作状态为11(生成出库ID)的出库工作档
@@ -984,6 +1088,7 @@
        }
        News.infoNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发 : 出库执行完毕");
    }
    }
//    /**
//     * 出库  ===>>  库位到堆垛机站
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.WrkMastService;
@@ -31,4 +32,16 @@
    public int getOutToStn182(Integer devpNo) {
        return selectCount(new EntityWrapper<WrkMast>().eq("sta_no", devpNo).in("wrk_sts",11,12));
    }
    @Override
    public WrkMast wrkCrnMoveOutXY(Integer crnNo) {
        WrkMast wrkMast = this.baseMapper.wrkCrnMoveOutXYing(crnNo);
        if (!Cools.isEmpty(wrkMast)){
            return wrkMast;
        }
        WrkMast wrkMast1 = this.baseMapper.wrkCrnMoveOutXYingOther(crnNo);
        if (!Cools.isEmpty(wrkMast1)){
            return null;
        }
        return  this.baseMapper.wrkCrnMoveOutXY(crnNo);
    }
}
src/main/java/com/zy/asrs/utils/Utils.java
@@ -149,6 +149,26 @@
    }
    /**
     * 通过库位号获取 列
     */
    public static int getBay(String locNo) {
        if (!Cools.isEmpty(locNo)) {
            return Integer.parseInt(locNo.substring(2, 5));
        }
        throw new RuntimeException("库位解析异常");
    }
    /**
     * 通过库位号获取 层
     */
    public static int getLev(String locNo) {
        if (!Cools.isEmpty(locNo)) {
            return Integer.parseInt(locNo.substring(5, 7));
        }
        throw new RuntimeException("库位解析异常");
    }
    /**
     * 当检索到双深库位的浅库位时,如果深库位无货,则放入对应的深库位
     */
    public static void toDeepIfEmptyByShallow(String shallowLoc) {
src/main/java/com/zy/core/CrnThread.java
@@ -14,4 +14,16 @@
     * 堆垛机是否在回原点运动中标记
     */
    boolean isBackHpFlag();
    /**
     * 设置堆垛机是否允许下发命令标记
     * @param flag
     */
    void setCmdFlag(boolean flag);
    /**
     * 堆垛机当前是否允许下发命令标记
     * @return
     */
    boolean isCmdFlag();
}
src/main/java/com/zy/core/enums/CrnTaskModeType.java
@@ -6,11 +6,11 @@
    PAKIN(1),    // 入库
    PAKOUT(2),    // 出库
    LOC_MOVE(3),    // 库位移转
    X_MOVE(4),    // 站位移转
    Y_MOVE(5),    // 站位移转
    XY_MOVE(6),    // 站位移转
    GO_ORIGIN(7),    // 回原点
    BACK_ORIGIN(8),      // 回反原点
    X_MOVE(6),    // 站位移转
    Y_MOVE(7),    // 站位移转
    XY_MOVE(8),    // 站位移转
    GO_ORIGIN(4),    // 回原点
    BACK_ORIGIN(5),      // 回反原点
    CLEAR(9),       // 清错
    ;
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -41,6 +41,15 @@
    private boolean resetFlag = false;
    /**
     * 20230711 Add,判断是否允许下发堆垛机任务的命令标记,默认为true
     * 为了防止时间差导致的WCS连续下发多笔任务,WCS下发任务后,主线程轮询时还未读到堆垛机非空闲、有任务状态时,可能会重复下发
     * 主线程下发堆垛机任务的同时,cmdFlag置为false,当堆垛机处于等待确认状态并且resetFlag为true时,才复位cmdFlag为true
     * 所有堆垛机任务下发前,先判断cmdFlag为true后才能下发
     * 改动前,是通过判断工作档是否存在堆垛机执行中工作状态判断的,如果不生成工作档,或者是有充电、移车等任务漏判断了也会存在问题
     */
    private boolean cmdFlag = true;
    /**
     * 堆垛机是否在回原点运动中标记
     */
    private boolean backHpFlag = false;
src/main/resources/mapper/WrkMastMapper.xml
@@ -185,4 +185,28 @@
    <select id="selectPakoutEmpty" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where  io_type = 110 and sta_no = #{staNo} order by io_time,wrk_no
    </select>
    <select id="wrkCrnMoveOutXY" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where
        wrk_sts in (21)
        and io_type>100 and io_type != 111 and ste_no is not null
        and crn_no = #{crnNo}
        order by io_pri desc,io_time,wrk_no asc
    </select>
    <select id="wrkCrnMoveOutXYing" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where
        wrk_sts in (26)
        and io_type>100 and io_type != 111 and ste_no is not null
        and crn_no = #{crnNo}
        order by io_pri desc,io_time,wrk_no asc
    </select>
    <select id="wrkCrnMoveOutXYingOther" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where
        wrk_sts in (22,23,24,25,27,28)
        and io_type>100 and io_type != 111
        and crn_no = #{crnNo}
        order by io_pri desc,io_time,wrk_no asc
    </select>
</mapper>
src/main/webapp/views/crn.html
@@ -100,6 +100,7 @@
                        <th>走行在定位</th>
                        <th>故障代码</th>
                        <th>故障描述</th>
                        <th>任务允许下发标记</th>
                    </tr>
                    </thead>
                    <tbody>
@@ -320,6 +321,7 @@
                        setVal(tr.children("td").eq(8), table[i-1].walkPos);
                        setVal(tr.children("td").eq(9), table[i-1].warnCode);
                        setVal(tr.children("td").eq(10), table[i-1].alarm);
                        setVal(tr.children("td").eq(11), table[i-1].cmdFlag);
                    }
                } else if (res.code === 403){
                    window.location.href = baseUrl+"/login";
@@ -527,6 +529,7 @@
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "     </tr>\n";
        }
        $('#crn-state-table tbody').after(html);