#
tqs
2022-10-31 c5fb7fe6010aa53345e44ad2d69552bf52d868fd
#
4个文件已修改
301 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1056,6 +1056,172 @@
    }
    /**
     * 库位移转 NEW
     */
    public void locToLoc1(CrnSlave slave, CrnProtocol crnProtocol){
        // 获取工作档信息
        WrkMast wrkMast = wrkMastMapper.selectLocMove(slave.getId());
        if (null == wrkMast) {
            return;
        }
        // 获取源库位信息
        LocMast sourceLoc = locMastService.selectById(wrkMast.getSourceLocNo());
        if (null == sourceLoc) {
            log.error("工作档库位移转失败,原因:检索源库位失败!工作号={},源库位={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
            return;
        }
        // 源库位  库位状态判断
        if (!sourceLoc.getLocSts().equals("R")) {
            return;
        }
        // 获取目标库位信息
        LocMast loc = locMastService.selectById(wrkMast.getLocNo());
        if (null == loc || !loc.getLocSts().equals("S")) {
            log.error("工作档库位移转失败,原因:检索目标库位失败!工作号={},源库位={}", wrkMast.getWrkNo(), wrkMast.getLocNo());
            return;
        }
        // 获取堆垛机信息 并 判断是否可入出
        BasCrnp basCrnp = basCrnpService.selectById(slave.getId());
        if (!basCrnp.getInEnable().equals("Y") && !basCrnp.getOutEnable().equals("Y")) {
            return;
        }
        // 堆垛机控制过滤
        if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
            return;
        }
        // 已经存在吊车执行任务时,则过滤
        if (wrkMastMapper.selectWorking(slave.getId()) != null) {
            return;
        }
        // 置顶任务
        wrkMast.setIoPri((double) 9999);
        wrkMastMapper.updateById(wrkMast);
        // 源库位 ===>> 最外层库位
        if (locMastService.isOutMost(wrkMast.getSourceLocNo())) {
            // 目标库位 ===>> 最外层库位
            if (locMastService.isOutMost(wrkMast.getLocNo())) {
                // 命令下发区 --------------------------------------------------------------------------
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                crnCommand.setSourcePosX(sourceLoc.getRow1().shortValue());     // 源库位排
                crnCommand.setSourcePosY(sourceLoc.getBay1().shortValue());     // 源库位列
                crnCommand.setSourcePosZ(sourceLoc.getLev1().shortValue());     // 源库位层
                crnCommand.setDestinationPosX(loc.getRow1().shortValue());     // 目标库位排
                crnCommand.setDestinationPosY(loc.getBay1().shortValue());     // 目标库位列
                crnCommand.setDestinationPosZ(loc.getLev1().shortValue());     // 目标库位层
                if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                } else {
                    // 修改工作档状态 11.生成出库ID => 16.吊车出库中
                    Date now = new Date();
                    wrkMast.setWrkSts(16L);
                    wrkMast.setCrnStrTime(now);
                    wrkMast.setModiTime(now);
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        log.error("【库位移转】 修改工作档状态 11.生成出库ID => 16.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                    }
                }
            }
            // 不是最外层库位,需要使用穿梭车搬运后,再堆垛机移库
        } else {
            // 当前组库位是否有穿梭车
            Integer steNo = this.hasCarOfIdle(wrkMast.getSourceLocNo());
            // 有小车
            if (steNo != null) {
                if (wrkMast.getWrkSts() == 11L && wrkMast.getSteNo() == null) {
                    // 给穿梭车下发命令 让其将货物挪至堆垛机搬运点
                    SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo);
                    SteProtocol steProtocol = steThread.getSteProtocol();
                    if (steProtocol == null) { return; }
                    if (steProtocol.isIdle()) {
                        // 命令下发区 --------------------------------------------------------------------------
                        SteCommand steCommand = new SteCommand();
                        steCommand.setSteNo(steNo); // 穿梭车编号
                        steCommand.setTaskNo(wrkMast.getWrkNo()); // 工作号
                        steCommand.setTaskMode(SteTaskModeType.findOutByLoc(wrkMast.getSourceLocNo())); // 任务模式:  去近点 等待堆垛机叉取
                        steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue());
                        steCommand.setBay(steProtocol.getBay());
                        steCommand.setLev(steProtocol.getLev());
                        if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) {
                            log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand));
                        } else {
                            // 修改工作档状态 11.生成出库ID => 14.小车搬出库
                            Date now = new Date();
                            wrkMast.setWrkSts(14L);
                            wrkMast.setSteNo(steNo);
                            wrkMast.setCrnStrTime(now);
                            wrkMast.setModiTime(now);
                            if (wrkMastMapper.updateById(wrkMast) == 0) {
                                log.error("修改工作档状态 11.生成出库ID => 14.小车搬出库 失败!!,工作号={}", wrkMast.getWrkNo());
                            }
                        }
                    }
                }
                if (wrkMast.getWrkSts() == 15L) {
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        return;
                    }
                    // 堆垛机出库 命令下发区 --------------------------------------------------------------------------
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX(Utils.getGroupRow(sourceLoc.getRow1()).shortValue());     // 源库位排
                    crnCommand.setSourcePosY(sourceLoc.getBay1().shortValue());     // 源库位列
                    crnCommand.setSourcePosZ(sourceLoc.getLev1().shortValue());     // 源库位层
                    crnCommand.setDestinationPosX(loc.getRow1().shortValue());     // 目标库位排
                    crnCommand.setDestinationPosY(loc.getBay1().shortValue());     // 目标库位列
                    crnCommand.setDestinationPosZ(loc.getLev1().shortValue());     // 目标库位层
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                        log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 15.等待吊车 => 16.吊车出库中
                        Date now = new Date();
                        wrkMast.setWrkSts(16L);
                        wrkMast.setCrnStrTime(now);
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            log.error("修改工作档状态 15.等待吊车 => 16.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                        }
                        return;
                    }
                }
                // 没有小车
            } else {
                if (wrkMast.getWrkSts() == 11L && wrkMast.getSteNo() == null) {
                    // 寻找最近的小车
                    SteThread steThread = queryIdleCar(wrkMast);
                    if (steThread != null) {
                        if (null == wrkMastMapper.selectPakout(slave.getId(), steNo)) {
                            // 让小车等待搬运待续
                            this.letCarBeReady(wrkMast, steThread.getSlave().getId(), wrkMast.getSourceLocNo());
                        }
                    }
                }
                // 堆垛机搬运小车
                if (wrkMast.getWrkSts() == 12L) {
                    this.carMoveIn(wrkMast, wrkMast.getSteNo(), crnProtocol);
                }
            }
        }
    }
    /**
     * 库位移转
     */
    public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol){
@@ -1127,9 +1293,10 @@
                    wrkMast.setCrnStrTime(now);
                    wrkMast.setModiTime(now);
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        log.error("【库位移转】 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                        log.error("【库位移转】 修改工作档状态 11.生成出库ID => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                    }
                }
            } else {
                Integer steNo = this.hasCarOfIdle(wrkMast.getLocNo());
                // 有小车
@@ -1863,13 +2030,16 @@
                } else {
                    if (wrkMast.getWrkSts() == 16) {
                        Date now = new Date();
//                        if (locMastService.isOutMost(wrkMast.getLocNo())) {
//                            // 16.吊车出库中 ==> 9.入库完成
//                            wrkMast.setWrkSts(9L);
//                            wrkMast.setCrnEndTime(now);
//                        } else {
//                            // 16.吊车出库中 ==> 9.入库完成
//                            wrkMast.setWrkSts(9L);
//                        }
                        if (locMastService.isOutMost(wrkMast.getLocNo())) {
                            // 16.吊车出库中 ==> 9.入库完成
                            wrkMast.setWrkSts(9L);
                            wrkMast.setCrnEndTime(now);
                        } else {
                            // 16.吊车出库中 ==> 9.入库完成
                            wrkMast.setWrkSts(9L);
                            wrkMast.setWrkSts(17L);
                        }
                        wrkMast.setModiTime(now);
                        // 修改成功后复位堆垛机
src/main/java/com/zy/asrs/utils/Utils.java
@@ -222,6 +222,100 @@
        return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2);
    }
    /**
     * 获取 深库位对应的浅库位组
     */
    public static String getShallowLocs(String deepLoc){
        String locs="";
        int row = getRow(deepLoc);
        switch (row){
            case 1:
                locs += zerofill(String.valueOf(row+2),2) + deepLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
                break;
            case 2:
                locs += zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
                break;
            case 5:
            case 20:
                locs += zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
                break;
            case 6:
            case 14:
            case 21:
                locs += zerofill(String.valueOf(row-2),2) + deepLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
                break;
            case 7:
                locs += zerofill(String.valueOf(row-3),2) + deepLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row-2),2) + deepLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
                break;
            case 8:
            case 15:
                locs += zerofill(String.valueOf(row+3),2) + deepLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row+2),2) + deepLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
                break;
            case 9:
            case 16:
                locs += zerofill(String.valueOf(row+2),2) + deepLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
                break;
            case 10:
            case 17:
                locs += zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
                break;
            case 13:
                locs += zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
                break;
        }
        return locs;
    }
    /**
     * 获取 浅库位对应的深库位组
     */
    public static String getDeepLocs(String shallowLoc){
        String locs="";
        int row = getRow(shallowLoc);
        switch (row){
            case 2:
            case 9:
            case 16:
                locs += zerofill(String.valueOf(row-1),2) + shallowLoc.substring(2);
                break;
            case 3:
            case 10:
            case 17:
                locs += zerofill(String.valueOf(row-1),2) + shallowLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row-2),2) + shallowLoc.substring(2);
                break;
            case 4:
                locs += zerofill(String.valueOf(row+1),2) + shallowLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row+2),2) + shallowLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row+3),2) + shallowLoc.substring(2);
                break;
            case 5:
            case 12:
            case 19:
                locs += zerofill(String.valueOf(row+1),2) + shallowLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row+2),2) + shallowLoc.substring(2);
                break;
            case 6:
            case 13:
            case 20:
                locs += zerofill(String.valueOf(row+1),2) + shallowLoc.substring(2);
                break;
            case 11:
            case 18:
                locs += zerofill(String.valueOf(row-1),2) + shallowLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row-2),2) + shallowLoc.substring(2);
                locs += "," + zerofill(String.valueOf(row-3),2) + shallowLoc.substring(2);
                break;
        }
        return locs;
    }
    /**
     * 当检索到双深库位的浅库位时,如果深库位无货,则放入对应的深库位
@@ -246,6 +340,22 @@
    }
    public static void main(String[] args) {
        String shallowLocs = getShallowLocs("2100203");
        String deepLocs = getDeepLocs("2100203");
        System.out.println("shallowLocs ==>> " + shallowLocs);
        System.out.println("deepLocs ==>> " + deepLocs);
        String[] shallowArr = null, deepArr = null;
        if (shallowLocs.indexOf(',') >= 0) {
            shallowArr = shallowLocs.split(",");
        }
        if (deepLocs.indexOf(',') >= 0) {
            deepArr = deepLocs.split(",");
        }
        for(String str : deepArr){
            System.out.println(str);
        }
        SlaveProperties slaveProperties = new SlaveProperties();
        slaveProperties.setDoubleDeep(true);
        List<Integer> list = new ArrayList<>();
src/main/resources/application.yml
@@ -8,8 +8,8 @@
    name: @pom.build.finalName@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://10.10.10.100:1433;databasename=bfasrs
#    url: jdbc:sqlserver://localhost:1433;databasename=bfasrs
#    url: jdbc:sqlserver://10.10.10.100:1433;databasename=bfasrs
    url: jdbc:sqlserver://192.168.4.15:1433;databasename=bfasrs
    username: sa
    #    password: Zoneyung@zy56$
    password: sa@123
src/main/resources/mapper/WrkMastMapper.xml
@@ -58,7 +58,6 @@
        <result column="log_err_time" property="logErrTime" />
        <result column="log_err_memo" property="logErrMemo" />
        <result column="barcode" property="barcode" />
        <result column="Pdc_type" property="PdcType" />
        <result column="ctn_no" property="ctnNo" />
        <result column="full_plt" property="fullPlt" />
@@ -122,7 +121,7 @@
    </select>
    <select id="selectLocMove" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_sts in (3,6,11,12,15) and io_type=11 and crn_no=#{crnNo} order by io_time,wrk_no
        select top 1 * from dbo.asr_wrk_mast where wrk_sts in (3,6,11,12,15) and io_type=11 and crn_no=#{crnNo} order by io_pri desc,io_time,wrk_no
    </select>
    <select id="selectLocMoving" resultMap="BaseResultMap">