自动化立体仓库 - WMS系统
zhangc
2025-01-20 37f55514ad2f02397fd75c7d98cea25e371243c7
添加库位规则查找,优化自动移动逻辑
3个文件已修改
2个文件已添加
187 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/core/ProcesTimeData.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/TimeUtils.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/AgvCommonService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
@@ -11,7 +11,9 @@
import com.zy.asrs.service.AgvBasDevpService;
import com.zy.asrs.service.AgvLocMastService;
import com.zy.asrs.service.AgvWrkMastService;
import com.zy.asrs.task.core.ProcesTimeData;
import com.zy.asrs.task.handler.AutoMoveHandler;
import com.zy.asrs.utils.TimeUtils;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
@@ -66,13 +68,7 @@
     */
    @Scheduled(cron = "0/1 * * * * ? ")
    private synchronized void execute2() {
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 22)
                .andNew().eq("io_type", 108)
                .andNew()
                .eq("crn_no", 2).or().eq("crn_no", 3)
                .orderBy("io_pri", false).orderBy("appe_time", true)
        );
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("wrk_sts", 22).andNew().eq("io_type", 108).andNew().eq("crn_no", 2).or().eq("crn_no", 3).orderBy("io_pri", false).orderBy("appe_time", true));
        if (agvWrkMastList.isEmpty()) {
            return;
        }
@@ -116,12 +112,7 @@
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void execute3() {
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 22)
                .andNew().eq("io_type", 111)
                .orderBy("io_pri", false)
                .orderBy("appe_time", true)
        );
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("wrk_sts", 22).andNew().eq("io_type", 111).orderBy("io_pri", false).orderBy("appe_time", true));
        if (agvWrkMastList.isEmpty()) {
            return;
        }
@@ -137,12 +128,7 @@
    @Scheduled(cron = "0/2 * * * * ? ")
    private void execute4() {
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 22)
                .andNew().eq("io_type", 114)
                .orderBy("io_pri", false)
                .orderBy("appe_time", true)
        );
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("wrk_sts", 22).andNew().eq("io_type", 114).orderBy("io_pri", false).orderBy("appe_time", true));
        if (agvWrkMastList.isEmpty()) {
            return;
        }
@@ -186,11 +172,7 @@
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack3() {
        // 工作档为201 且 入出库类型为109
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 214)
                .eq("loc_no", "")
                .eq("io_type", 113)
                .orderBy("io_pri", false));
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("wrk_sts", 214).eq("loc_no", "").eq("io_type", 113).orderBy("io_pri", false));
        if (agvWrkMastList.isEmpty()) {
            return;
        }
@@ -234,13 +216,9 @@
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack4() {
        // 查询 不为1楼的空货架
        List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
                new EntityWrapper<AgvLocMast>()
                        // TODO 四期
                        .eq("loc_sts", "D")
                        .eq("loc_type1", 3)
                        .ne("floor", 1)
                        .ne("lev1", 1));
        List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(new EntityWrapper<AgvLocMast>()
                // TODO 四期
                .eq("loc_sts", "D").eq("loc_type1", 3).ne("floor", 1).ne("lev1", 1));
        if (agvLocMasts.isEmpty()) {
            return;
        }
@@ -255,16 +233,37 @@
    /**
     // TODO 四期
     * 将二厂的6类型的空货架调拨回吸塑二楼
     */
    // TODO 四期
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBackSiqi() {
        // 查询6类型空货架返回的执行时间点
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "RETURN_6_TIME"));
        if (config != null && !Cools.isEmpty(config.getValue())) {
            boolean flag = false;
            try {
                // 判断是否在执行时间内
                ProcesTimeData procesTimeData = JSONObject.parseObject(config.getValue(), ProcesTimeData.class);
                if (procesTimeData != null && TimeUtils.between(procesTimeData)) {
                    flag = true;
                }
            } catch (Exception e) {
                log.error("6类型空货架返回的执行时间点解析异常:===》异常原因:" + e.getMessage());
                flag = true;
            }
            if (flag) {
                executeLocType6();
            }
        } else {
            executeLocType6();
        }
    }
    private void executeLocType6() {
        // 查询 二厂的的半成品箱壳类型的空货架
        List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
                new EntityWrapper<AgvLocMast>()
                        .eq("loc_sts", "D")
                        .eq("loc_type1", 6)
                        .eq("floor", 2));
        List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(new EntityWrapper<AgvLocMast>().eq("loc_sts", "D").eq("loc_type1", 6).eq("floor", 2));
        if (agvLocMasts.isEmpty()) {
            return;
        }
@@ -276,7 +275,6 @@
            }
        }
    }
    private boolean determineFloorConnection(Integer floor) {
        try {
@@ -304,10 +302,7 @@
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack5() {
        List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>()
                .ne("floor", 1)
                .eq("loc_sts", "F")
                .like("dev_no", "DB"));
        List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>().ne("floor", 1).eq("loc_sts", "F").like("dev_no", "DB"));
        if (agvBasDevps.isEmpty()) {
            return;
        }
@@ -326,10 +321,7 @@
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack6() {
        List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>()
                .eq("floor", 1)
                .eq("loc_sts", "F")
                .like("dev_no", "DB"));
        List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>().eq("floor", 1).eq("loc_sts", "F").like("dev_no", "DB"));
        if (agvBasDevps.isEmpty()) {
            return;
        }
@@ -374,12 +366,7 @@
                    return;
                }
                List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
                        new EntityWrapper<AgvLocMast>()
                                .eq("floor", 1)
                                .eq("lev1", 1)
                                .eq("loc_sts", "F")
                                .eq("loc_type1", 3));
                List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(new EntityWrapper<AgvLocMast>().eq("floor", 1).eq("lev1", 1).eq("loc_sts", "F").eq("loc_type1", 3));
                if (agvLocMasts.isEmpty()) {
                    return;
                }
@@ -393,4 +380,6 @@
            }
        }
    }
}
src/main/java/com/zy/asrs/task/core/ProcesTimeData.java
New file
@@ -0,0 +1,19 @@
package com.zy.asrs.task.core;
import lombok.Data;
import java.io.Serializable;
@Data
public class ProcesTimeData implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer startHour;
    private Integer startMinute;
    private Integer endHour;
    private Integer endMinute;
}
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
@@ -9,6 +9,8 @@
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.service.AgvCommonService;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -34,6 +36,8 @@
    private AgvWrkDetlService agvWrkDetlService;
    @Autowired
    AgvBasDevpService agvBasDevpService;
    @Autowired
    private ConfigService configService;
//    public ReturnT<String> start(AgvLocMast agvLocMast) {
//        // locType 1. 自动, 2. 手动
@@ -490,10 +494,15 @@
            floor = "F2";
        }
        List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("io_type", 109).like("source_loc_no", floor).or().eq("io_type", 113));
        if (agvWrkMasts.size() >= 5) {
            //log.error("暂停回流");
            return FAIL;
            //throw new CoolException("暂停回流");
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "RETURN_6_MAX"));
        if (config == null && !Cools.isEmpty(config.getValue())) {
            if (agvWrkMasts.size() >= Integer.parseInt(config.getValue())) {
                return FAIL;
            }
        } else {
            if (agvWrkMasts.size() >= 5) {
                return FAIL;
            }
        }
        //检索空闲可入接驳位 没有空闲可入接驳位 直接找库位
        AgvBasDevp devpNo = agvCommonService.getDevpNo(6, agvLocMast.getFloor(), "Y", "Y");
@@ -503,12 +512,14 @@
            ioType = 109;
        } else {
            //检索库位,选择合适的库位
            locMast = agvCommonService.getLocNo(6, 1, true, true);
            locMast = agvCommonService.getLocByFloorAndLev1(6, 1, 2);
            locNo = locMast.getLocNo();
            wrkSts = 201L;
            ioType = 109;
        }
        if (locMast == null) {
            throw new CoolException("没有可用的库位");
        }
        //生成工作档
        AgvWrkMast mast = new AgvWrkMast();
        //工作状态
src/main/java/com/zy/asrs/utils/TimeUtils.java
New file
@@ -0,0 +1,29 @@
package com.zy.asrs.utils;
import com.zy.asrs.task.core.ProcesTimeData;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class TimeUtils {
    public static boolean between(ProcesTimeData procesTimeData) {
        if (procesTimeData.getEndHour() == 24) {
            procesTimeData.setEndHour(0);
            procesTimeData.setEndMinute(0);
        }
        LocalDateTime startTime = LocalDateTime.of(LocalDate.now(), LocalTime.of(procesTimeData.getStartHour(), procesTimeData.getStartMinute()));
        LocalDateTime endTime = LocalDateTime.of(LocalDate.now(), LocalTime.of(procesTimeData.getEndHour(), procesTimeData.getEndMinute()));
        if (procesTimeData.getStartHour() > procesTimeData.getEndHour()) {
            endTime = endTime.plusDays(1);
        }
        LocalDateTime currentTime = LocalDateTime.now(); // 获取当前时间
        System.out.println(startTime);
        System.out.println(endTime);
        if (currentTime.isAfter(startTime) && currentTime.isBefore(endTime)) {
            return true;
        }
        return false;
    }
}
src/main/java/com/zy/common/service/AgvCommonService.java
@@ -182,6 +182,29 @@
    }
    /*
  库位规则查找
   */
    public AgvLocMast getLocByFloorAndLev1(int type, int floor, int lev1) {
        try {
            EntityWrapper<AgvLocMast> wrapper = new EntityWrapper<>();
            wrapper.eq("loc_sts", "O").eq("loc_type1", type);
            wrapper.eq("floor", floor).eq("lev1", lev1);
            List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(wrapper);
            for (AgvLocMast agvLocMast : agvLocMasts) {
                AgvLocMast agvLocMast1 = agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("loc_no", agvLocMast.getLocNo()));
                if (agvLocMast1.getLocSts().equals("O")) {
                    return agvLocMast1;
                }
            }
            return null;
        } catch (Exception e) {
            throw new CoolException("搜索库位时,未找到可入库库位。");
        }
    }
    /*
    库位规则查找
     */
    private AgvLocMast getLocByLocCodeRule(AgvWaitPakin agvWaitPakin, int floor) {