自动化立体仓库 - WMS系统
zhangc
2025-01-21 7fba108547c985f3a9e1736b32dc028bad3b63a1
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
@@ -1,20 +1,28 @@
package com.zy.asrs.task;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.AgvLocMast;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.service.AgvBasDevpService;
import com.zy.asrs.service.AgvLocMastService;
import com.zy.asrs.service.AgvWrkMastService;
import com.zy.asrs.task.core.ReturnT;
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@@ -31,24 +39,26 @@
    private AgvWrkMastService agvWrkMastService;
    @Autowired
    private AgvBasDevpService agvBasDevpService;
    @Autowired
    private ConfigService configService;
    // 调拨出库
//    @Scheduled(cron = "0/2 * * * * ? ")
    private void execute(){
        List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
                new EntityWrapper<AgvLocMast>()
                        .isNotNull("loc_type")
                        .ne("loc_type", "")
                        .eq("floor", 1)
                        .eq("loc_sts","F"));
        if (agvLocMasts.isEmpty()) {
            return;
        }
        for (AgvLocMast agvLocMast : agvLocMasts) {
            ReturnT<String> returnT = autoMoveHandler.start(agvLocMast);
        }
    }
//    private void execute(){
//        List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
//                new EntityWrapper<AgvLocMast>()
//                        .isNotNull("loc_type")
//                        .ne("loc_type", "")
//                        .eq("floor", 1)
//                        .eq("loc_sts","F"));
//        if (agvLocMasts.isEmpty()) {
//            return;
//        }
//        for (AgvLocMast agvLocMast : agvLocMasts) {
//            ReturnT<String> returnT = autoMoveHandler.start(agvLocMast);
//        }
//
//    }
    /**
     * 自动调拨任务,从1楼调拨到2楼,3楼
@@ -56,23 +66,18 @@
     * ioType 108.自动调拨
     * crnNo :2目标楼层
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private 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("appe_time",true)
                );
    @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));
        if (agvWrkMastList.isEmpty()) {
            return;
        }
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            try{
            try {
                // TODO 自动回流
                autoMoveHandler.start2(agvWrkMast);
            } catch (Exception e){
                log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
            } catch (Exception e) {
                //log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
            }
        }
@@ -106,20 +111,32 @@
     * ioType 111.手动调拨
     */
    @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("appe_time",true)
        );
    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));
        if (agvWrkMastList.isEmpty()) {
            return;
        }
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            try{
            try {
                autoMoveHandler.start3(agvWrkMast);
            } catch (Exception e){
                log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
            } catch (Exception e) {
                //log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
            }
        }
    }
    @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));
        if (agvWrkMastList.isEmpty()) {
            return;
        }
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            try {
                autoMoveHandler.start4(agvWrkMast);
            } catch (Exception e) {
                log.error("工作号" + agvWrkMast.getWrkNo() + "调拨出库,处理失败:===》异常原因:" + e.getMessage());
            }
        }
@@ -153,20 +170,17 @@
     * ioType 113.空托盘手动回流
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack3(){
    private void autoEmptyBack3() {
        // 工作档为201 且 入出库类型为109
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 214)
                .eq("loc_no","")
                .eq("io_type",113));
        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;
        }
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            try{
            try {
                autoMoveHandler.autoEmptyBack3(agvWrkMast);
            } catch (Exception e){
                log.error("工作号"+agvWrkMast.getWrkNo()+"空板自动回库  接驳点 - 1楼库位,处理失败:===》异常原因:"+e.getMessage());
            } catch (Exception e) {
                log.error("工作号" + agvWrkMast.getWrkNo() + "空板自动回库  接驳点 - 1楼库位,处理失败:===》异常原因:" + e.getMessage());
            }
        }
    }
@@ -200,40 +214,81 @@
     * 2楼或3楼站点可入信号全部没有,代表走电梯自动搬运模式
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack4(){
//        if (determineFloorConnection(2)){
            // 查询 不为1楼的空货架
            List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
                    new EntityWrapper<AgvLocMast>()
                            .ne("floor", 1)
                            .eq("loc_sts","D")
                            .eq("loc_type1",3));
            if (agvLocMasts.isEmpty()) {
                return;
    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));
        if (agvLocMasts.isEmpty()) {
            return;
        }
        for (AgvLocMast agvLocMast : agvLocMasts) {
            try {
                autoMoveHandler.autoEmptyBack4(agvLocMast);
            } catch (Exception e) {
                log.error("库位号" + agvLocMast.getLocNo() + "空板自动回库 库位-接驳点  库位-吸塑车间,处理失败:===》异常原因:" + e.getMessage());
            }
            for (AgvLocMast agvLocMast : agvLocMasts) {
                try{
                    autoMoveHandler.autoEmptyBack4(agvLocMast);
                } catch (Exception e){
                    log.error("库位号"+agvLocMast.getLocNo()+"空板自动回库 库位-接驳点  库位-吸塑车间,处理失败:===》异常原因:"+e.getMessage());
                }
            }
//        }
        }
    }
    private boolean determineFloorConnection(Integer floor){
        try{
    /**
     * 将二厂的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));
        if (agvLocMasts.isEmpty()) {
            return;
        }
        for (AgvLocMast agvLocMast : agvLocMasts) {
            try {
                autoMoveHandler.autoEmptyBackSiqi(agvLocMast);
            } catch (Exception e) {
                log.error("库位号" + agvLocMast.getLocNo() + "空板自动回库 库位-接驳点  库位-吸塑车间,处理失败:===》异常原因:" + e.getMessage());
            }
        }
    }
    private boolean determineFloorConnection(Integer floor) {
        try {
            List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>().eq("floor", floor).like("dev_no", "DB_"));
            if (!agvBasDevps.isEmpty()){
                for (AgvBasDevp agvBasDevp:agvBasDevps){
                    if (agvBasDevp.getInEnable().equals("Y")){
            if (!agvBasDevps.isEmpty()) {
                for (AgvBasDevp agvBasDevp : agvBasDevps) {
                    if (agvBasDevp.getInEnable().equals("Y")) {
                        return false;
                    }
                }
                return true;
            }
        }catch (Exception e){
            log.error("判断当前楼层接驳位是否全部关闭,异常"+e.getMessage());
        } catch (Exception e) {
            log.error("判断当前楼层接驳位是否全部关闭,异常" + e.getMessage());
        }
        return false;
    }
@@ -246,19 +301,16 @@
     *
     */
    @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"));
    private void autoEmptyBack5() {
        List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>().ne("floor", 1).eq("loc_sts", "F").like("dev_no", "DB"));
        if (agvBasDevps.isEmpty()) {
            return;
        }
        for (AgvBasDevp agvBasDevp : agvBasDevps) {
            try{
            try {
                autoMoveHandler.autoEmptyBack5(agvBasDevp);
            } catch (Exception e){
                log.error("站点号"+agvBasDevp.getDevNo()+"站点是否自动 优先选择先到接驳位(接驳位可入) 后选择直接回库,处理失败:===》异常原因:"+e.getMessage());
            } catch (Exception e) {
                log.error("站点号" + agvBasDevp.getDevNo() + "站点是否自动 优先选择先到接驳位(接驳位可入) 后选择直接回库,处理失败:===》异常原因:" + e.getMessage());
            }
        }
    }
@@ -268,20 +320,66 @@
     * 手动: 生成 113 手动回流
     */
    @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"));
    private void autoEmptyBack6() {
        List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>().eq("floor", 1).eq("loc_sts", "F").like("dev_no", "DB"));
        if (agvBasDevps.isEmpty()) {
            return;
        }
        for (AgvBasDevp agvBasDevp : agvBasDevps) {
            try{
            try {
                autoMoveHandler.autoEmptyBack6(agvBasDevp);
            } catch (Exception e){
                log.error("站点号"+agvBasDevp.getDevNo()+"检测1楼接驳点 生成 113 手动回流,处理失败:===》异常原因:"+e.getMessage());
            } catch (Exception e) {
                log.error("站点号" + agvBasDevp.getDevNo() + "检测1楼接驳点 生成 113 手动回流,处理失败:===》异常原因:" + e.getMessage());
            }
        }
    }
    /**
     * 自动移库
     *
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack7() throws ParseException {
        Date now = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String currentDay = sdf.format(now);
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "autoTime"));
        if (Cools.isEmpty(config)) {
        } else {
            if (config.getStatus().intValue() == 0) {
                return;
            }
            JSONObject jsonObject = JSON.parseObject(config.getValue().toString());
            Integer maxTansk = jsonObject.getInteger("maxTansk");
            //Integer startTime = jsonObject.getInteger("startTime");
            String startTime = jsonObject.getString("startTime");
            long time1 = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(currentDay + " " + startTime).getTime();
            long time = now.getTime();
            long time3 = time - time1;
            if (time3 > 0 && time3 < (1000 * 60 * 10)) {
                List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().like("loc_no", "02F1").like("source_loc_no", "F1").eq("io_type", 12));
                if (maxTansk <= agvWrkMasts.size()) {
                    return;
                }
                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;
                }
                for (AgvLocMast agvLocMast : agvLocMasts) {
                    try {
                        autoMoveHandler.autoTransfers(agvLocMast, maxTansk);
                    } catch (Exception e) {
                        log.error("库位号" + agvLocMast.getLocNo() + "定时移库任务 吸塑一楼 --> 吸塑二楼,处理失败:===》异常原因:" + e.getMessage());
                    }
                }
            }
        }
    }
}