#
luxiaotao1123
2022-03-10 0dd9c5341345f296f0456d9e044ae489707e23da
#
6个文件已修改
135 ■■■■ 已修改文件
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/CrnProtocol.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/MelsecCrnThread.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -27,11 +27,13 @@
    // 入库第二步,当托盘物料在堆垛机入库站时时查询
//    @Select("select top 1 * from dbo.asr_wrk_mast where wrk_sts=2 and crn_no=#{crnNo} and wrk_no=#{workNo} and (io_type=1 or io_type=10 or io_type=53 or io_type=54 or io_type=57) order by io_pri desc,io_time,wrk_no ASC")
    WrkMast selectPakInStep2(@Param("crnNo")Integer crnNo, @Param("workNo")Integer workNo, @Param("staNo")Integer staNo);
    WrkMast selectPakInStep23456(@Param("crnNo")Integer crnNo, @Param("workNo")Integer workNo, @Param("staNo")Integer staNo);
    // 入库第三步,当堆垛机把货放入库位时
//    @Select("select top 1 from dbo.asr_wrk_mast where wrk_no=#{workNo}")
    WrkMast selectPakInStep3(@Param("workNo")Integer workNo);
    WrkMast selectPakInStep7(@Param("workNo")Integer workNo);
    WrkMast selectPakInStep56(@Param("workNo")Integer workNo);
    // 拣料再入库时,站点有物且需求时查询
//    @Select("select top 1 * from asr_wrk_mast where wrk_no=#{workNo} and wrk_sts=14 and (io_type=103 or io_type=107 or io_type=104)")
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -519,7 +519,7 @@
    /**
     * 入库  ===>>  堆垛机站到库位
     */
    public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol){
    public boolean crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol){
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            boolean flag = false;
            // 获取堆垛机入库站信息
@@ -543,8 +543,8 @@
            if (!flag) {
                continue;
            }
            // 获取工作状态为2(设备上走)的入库工作档
            WrkMast wrkMast = wrkMastMapper.selectPakInStep2(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo());
            // 获取工作状态为 2,3,4,5,6 的入库工作档
            WrkMast wrkMast = wrkMastMapper.selectPakInStep23456(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo());
            if(null == wrkMast) {
//                log.error("查询无待入库数据--wrk_sts=2, 工作号={}", staProtocol.getWorkNo());
                continue;
@@ -560,10 +560,6 @@
                continue;
            }
            // 堆垛机控制过滤
            if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                continue;
            }
            // todo:小车迁入出
            // 目标库位 ===>> 最外层库位
            if (locMastService.isOutMost(wrkMast.getLocNo())) {
@@ -577,7 +573,7 @@
                    }
                    // 小车搬走
                    if (wrkMast.getWrkSts() == 3L) {
                        this.carMoveOut(wrkMast, steNo);
                        this.carMoveOut(wrkMast, steNo, crnProtocol);
                    }
                // 没有小车
                } else {
@@ -597,35 +593,35 @@
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                        log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 2.设备上走 => 7.吊车入库中
                        // 修改工作档状态  7.吊车入库中
                        Date now = new Date();
                        wrkMast.setWrkSts(7L);
                        wrkMast.setCrnStrTime(now);
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                            log.error("修改工作档状态 {} => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkSts$(), wrkMast.getWrkNo());
                        }
                        return true;
                    }
                }
            // 目标库位 ===>> 非最外层库位
            } else {
                // 判断小车是否在当前组库位,如果是则堆垛机将货物放置小车上,如果不是,则直接堆垛机搬移小车至当前组的最外层库位
                Integer steNo = this.hasCarOfIdle(wrkMast.getLocNo());
            }
//            this.carMoveIn(wrkMast);
            // 已经存在吊车执行任务时,则过滤
            if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                return;
                continue;
            }
        }
        return false;
    }
    /**
@@ -725,15 +721,41 @@
    /**
     * 入库  ===>>  堆垛机搬出小车
     */
    public void carMoveOut(WrkMast wrkMast, Integer steNo) {
    public void carMoveOut(WrkMast wrkMast, Integer steNo, CrnProtocol crnProtocol) {
        // 获取穿梭车信息
        SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo);
        SteProtocol steProtocol = steThread.getSteProtocol();
        if (steProtocol == null) { return; }
        // 穿梭车空闲
        if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) {
            // 堆垛机空闲
            if (crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() == 0) {
                // 堆垛机命令下发区 --------------------------------------------------------------------------
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号
                crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排
                crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列
                crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层
                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 {
                    // 修改工作档状态 3.小车待搬 => 5.迁出小车
                    Date now = new Date();
                    wrkMast.setWrkSts(5L);
                    wrkMast.setCrnStrTime(now);
                    wrkMast.setModiTime(now);
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        log.error("修改工作档状态 3.小车待搬 => 5.迁出小车 失败!!,工作号={}", wrkMast.getWrkNo());
                    }
                }
            }
        }
    }
@@ -915,6 +937,43 @@
    }
    /**
     * 堆垛机针对于小车迁移工作的完成
     */
    @Async
    public void carMoveFinished() {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            //  状态:等待确认 并且  任务完成位 = 1
            if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                // 获取入库待确认工作档
                WrkMast wrkMast = wrkMastMapper.selectPakInStep56(crnProtocol.getTaskNo().intValue());
                if (wrkMast == null) {
                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                    continue;
                }
                // 入库 + 库位转移  ==> 4.入库完成
                if ((wrkMast.getWrkSts() == 5 || wrkMast.getWrkSts() == 6) || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)){
                    wrkMast.setWrkSts(9L);
                } else  {
                    continue;
                }
                Date now = new Date();
                wrkMast.setCrnEndTime(now);
                wrkMast.setModiTime(now);
                // 修改成功后复位堆垛机
                if (wrkMastMapper.updateById(wrkMast) > 0) {
                    // 堆垛机复位
                    crnThread.setResetFlag(true);
                }
            }
        }
    }
    /**
     * 执行对工作档的完成操作
     */
    @Async
@@ -927,14 +986,14 @@
            //  状态:等待确认 并且  任务完成位 = 1
            if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                // 获取入库待确认工作档
                WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue());
                WrkMast wrkMast = wrkMastMapper.selectPakInStep7(crnProtocol.getTaskNo().intValue());
                if (wrkMast == null) {
                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                    continue;
                }
                // 入库 + 库位转移  ==> 4.入库完成
                if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)){
                    wrkMast.setWrkSts(4L);
                // 入库 + 库位转移  ==> 9.入库完成
                if (wrkMast.getWrkSts() == 7 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)){
                    wrkMast.setWrkSts(9L);
                } else  {
                    continue;
                }
src/main/java/com/zy/core/MainProcess.java
@@ -51,8 +51,8 @@
                    mainService.crnStnToOutStn();
                    // 入出库  ===>>  堆垛机入出库作业下发
                    mainService.crnIoExecute();
                    // 入出库增强 ===>> 堆垛机命令下发后,异步修改工作档状态
//                    mainService.crnIoWrkMast();
                    // 堆垛机针对于小车迁移工作的完成
                    mainService.carMoveFinished();
                    // 入库  ===>> 执行对工作档的完成操作
                    mainService.storeFinished();
                    // 堆垛机异常信息记录
src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -14,6 +14,11 @@
public class CrnProtocol {
    /**
     * 堆垛机号
     */
    private Integer crnNo;
    /**
     * 1 = 手动模式
     * 2 = 自动模式
     * 3 = 电脑模式
src/main/java/com/zy/core/thread/MelsecCrnThread.java
@@ -24,7 +24,6 @@
import com.zy.core.model.protocol.CrnProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.MessageFormat;
import java.util.Date;
@@ -110,6 +109,7 @@
        if (null == crnProtocol) {
            crnProtocol = new CrnProtocol();
        }
        crnProtocol.setCrnNo(slave.getId());
        crnProtocol.setMode((short) -1);
//        crnProtocol.setTaskNo((short)0);
        crnProtocol.setStatus((short)-1);
@@ -162,6 +162,7 @@
                if (null == crnProtocol) {
                    crnProtocol = new CrnProtocol();
                }
                crnProtocol.setCrnNo(slave.getId());
                crnProtocol.setMode(melsecMcNet.getByteTransform().TransInt16(result.Content, 0));
                crnProtocol.setTaskNo(melsecMcNet.getByteTransform().TransInt16(result.Content, 2));
                crnProtocol.setStatus(melsecMcNet.getByteTransform().TransInt16(result.Content, 4));
src/main/resources/mapper/WrkMastMapper.xml
@@ -87,12 +87,16 @@
        select top 1 * from asr_wrk_mast where source_sta_no=#{sourceStaNo} and wrk_sts=1 and (io_type=1 or io_type=10) order by io_pri desc,io_time,wrk_no ASC
    </select>
    <select id="selectPakInStep2" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_sts=2 and crn_no=#{crnNo} and wrk_no=#{workNo} and sta_no=#{staNo} and (io_type=1 or io_type=10 or io_type=53 or io_type=54 or io_type=57) order by io_pri desc,io_time,wrk_no ASC
    <select id="selectPakInStep23456" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_sts in (2,3,4,5,6) and crn_no=#{crnNo} and wrk_no=#{workNo} and sta_no=#{staNo} and (io_type=1 or io_type=10 or io_type=53 or io_type=54 or io_type=57) order by io_pri desc,io_time,wrk_no ASC
    </select>
    <select id="selectPakInStep3" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_no=#{workNo}
    <select id="selectPakInStep56" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_no=#{workNo} and wrk_sts in (5,6)
    </select>
    <select id="selectPakInStep7" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_no=#{workNo} and wrk_sts = 7
    </select>
    <select id="selectPickStep" resultMap="BaseResultMap">