From ebd2f4397a92c6a5096de1b86d59154363344720 Mon Sep 17 00:00:00 2001 From: vincentlu <t1341870251@gmail.com> Date: 星期二, 13 五月 2025 08:48:15 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java | 209 +++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 181 insertions(+), 28 deletions(-) diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java index 9749974..15f7cbf 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/AutoRunScheduler.java @@ -1,21 +1,20 @@ package com.zy.acs.manager.core.scheduler; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zy.acs.common.constant.RedisConstant; +import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.framework.common.Cools; import com.zy.acs.framework.common.SnowflakeIdWorker; import com.zy.acs.manager.common.domain.TaskDto; import com.zy.acs.manager.core.constant.AgvGroupConstant; import com.zy.acs.manager.core.constant.LocGroupConstant; +import com.zy.acs.manager.core.constant.StaGroupConstant; import com.zy.acs.manager.core.service.MainLockWrapService; import com.zy.acs.manager.core.service.MainService; import com.zy.acs.manager.core.service.TrafficService; import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam; -import com.zy.acs.manager.manager.entity.AgvModel; -import com.zy.acs.manager.manager.entity.Bus; -import com.zy.acs.manager.manager.entity.Loc; -import com.zy.acs.manager.manager.enums.AgvModelType; -import com.zy.acs.manager.manager.enums.BusStsType; -import com.zy.acs.manager.manager.enums.LocStsType; +import com.zy.acs.manager.manager.entity.*; +import com.zy.acs.manager.manager.enums.*; import com.zy.acs.manager.manager.service.*; import com.zy.acs.manager.system.service.ConfigService; import lombok.extern.slf4j.Slf4j; @@ -23,12 +22,13 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import java.util.Collections; -import java.util.List; +import java.util.*; @Slf4j @Component public class AutoRunScheduler { + + private final RedisSupport redis = RedisSupport.defaultRedisSupport; @Autowired private AgvService agvService; @@ -51,36 +51,168 @@ @Autowired private LocService locService; @Autowired + private StaService staService; + @Autowired private AgvModelService agvModelService; @Autowired private SnowflakeIdWorker snowflakeIdWorker; - // @Scheduled(fixedRate = 500) // 鍥哄畾棰戠巼鎵ц锛屼笉鍚屾 @Scheduled(fixedDelay = 1000) // 鍥哄畾棰戠巼鎵ц锛屽悓姝� // @Scheduled(cron = "0/1 * * * * ? ") - private void autoLocToLoc() { + private void execute() { if (!configService.getVal("TaskAssignMode", Boolean.class)) { return; } - this.runLocToLoc(LocGroupConstant.FAR_LEFT_LOC_ROW_LIST, AgvGroupConstant.FIRST_AGV_GROUP); - this.runLocToLoc(LocGroupConstant.LEFT_LOC_ROW_LIST, AgvGroupConstant.SECOND_AGV_GROUP); - this.runLocToLoc(LocGroupConstant.MIDDLE_LOC_ROW_LIST, AgvGroupConstant.THIRD_AGV_GROUP); - this.runLocToLoc(LocGroupConstant.RIGHT_LOC_ROW_LIST, AgvGroupConstant.FOURTH_AGV_GROUP); - this.runLocToLoc(LocGroupConstant.FAR_RIGHT_LOC_ROW_LIST, AgvGroupConstant.FIFTH_AGV_GROUP); + String autoRunAreas = configService.getVal("autoRunAreas", String.class); + if (Cools.isEmpty(autoRunAreas)) { return; } + for (char c : autoRunAreas.toCharArray()) { + switch (c) { + case '1': + this.autoRun(LocGroupConstant.FAR_RIGHT_LOC_ROW_LIST, StaGroupConstant.FAR_RIGHT_STA_ROW_LIST, AgvGroupConstant.FIFTH_AGV_GROUP); + break; + case '2': + this.autoRun(LocGroupConstant.RIGHT_LOC_ROW_LIST, StaGroupConstant.RIGHT_STA_ROW_LIST, AgvGroupConstant.FOURTH_AGV_GROUP); + break; + case '3': + this.autoRun(LocGroupConstant.MIDDLE_LOC_ROW_LIST, StaGroupConstant.MIDDLE_STA_ROW_LIST, AgvGroupConstant.THIRD_AGV_GROUP); + break; + case '4': + this.autoRun(LocGroupConstant.LEFT_LOC_ROW_LIST, StaGroupConstant.LEFT_STA_ROW_LIST, AgvGroupConstant.SECOND_AGV_GROUP); + break; + case '5': + this.autoRun(LocGroupConstant.FAR_LEFT_LOC_ROW_LIST, StaGroupConstant.FAR_LEFT_STA_ROW_LIST, AgvGroupConstant.FIRST_AGV_GROUP); + break; + default: + break; + } + } } - private void runLocToLoc(List<Integer> locGroupList, List<String> agvGroupList) { + private void autoRun(List<Integer> locGroupList, List<String> staGroupList, List<String> agvGroupList) { + int availableAgvCount = this.getAvailableAgvCount(agvGroupList); + if (0 == availableAgvCount) { return; } + + List<String> staPreNos = getStaPrefixes(staGroupList); + String staTaskMemo = "DEMO_STA_" + String.join("-", staPreNos); + + // 鍏ュ簱 + this.runStaToLoc(locGroupList, staGroupList, staTaskMemo); + // 鍑哄簱 + this.runLocToSta(locGroupList, staGroupList, staTaskMemo); + + // 绉诲簱 + this.runLocToLoc(locGroupList, agvGroupList, staTaskMemo); + } + + // 鍏ュ簱 + private void runStaToLoc(List<Integer> locGroupList, List<String> staGroupList, String memo) { Integer startRow = Collections.min(locGroupList); Integer endRow = Collections.max(locGroupList); - String memo = "DEMO_" + startRow + "-" + endRow; - int agvCount = agvGroupList.size(); + AgvModel agvModel = agvModelService.getOne(new LambdaQueryWrapper<AgvModel>().eq(AgvModel::getType, AgvModelType.CTU_BOX_TRANSPORT_AGV.toString())); + if (null == agvModel) { + return; + } + + // STOCK + LambdaQueryWrapper<Sta> stockWrapper = new LambdaQueryWrapper<Sta>() + .eq(Sta::getStaSts, StaStsType.STOCK.val()) + .eq(Sta::getStatus, StatusType.ENABLE.val) + .in(Sta::getStaNo, staGroupList); + List<Sta> stockList = staService.list(stockWrapper); + if (Cools.isEmpty(stockList)) { return; } + Collections.shuffle(stockList); + + // IDLE + LambdaQueryWrapper<Loc> idleWrapper = new LambdaQueryWrapper<Loc>().eq(Loc::getLocSts, LocStsType.IDLE.val()); + if (null != startRow) { idleWrapper.ge(Loc::getRow, startRow); } + if (null != endRow) { idleWrapper.le(Loc::getRow, endRow); } + List<Loc> idleList = locService.list(idleWrapper); + if (Cools.isEmpty(idleList)) { return; } + Collections.shuffle(idleList); + + OpenBusSubmitParam param = new OpenBusSubmitParam(); + param.setBatch(String.valueOf(snowflakeIdWorker.nextId()).substring(13, 19)); + for (int i = 0; i < Math.min(agvModel.getBackpack(), Math.min(stockList.size(), idleList.size())) ; i++) { + Sta stockSta = stockList.get(i); + Loc idleLoc = idleList.get(i); + + TaskDto taskDto = new TaskDto(); + taskDto.setOriSta(stockSta.getStaNo()); + taskDto.setDestLoc(idleLoc.getLocNo()); + taskDto.setPriority(100); + taskDto.setSeqNum(String.valueOf(snowflakeIdWorker.nextId()).substring(15, 19)); + + param.getTaskList().add(taskDto); + } + + mainService.generateBusAndTask(param, memo); + } + + // 鍑哄簱 + private void runLocToSta(List<Integer> locGroupList, List<String> staGroupList, String memo) { + Integer startRow = Collections.min(locGroupList); + Integer endRow = Collections.max(locGroupList); + + AgvModel agvModel = agvModelService.getOne(new LambdaQueryWrapper<AgvModel>().eq(AgvModel::getType, AgvModelType.CTU_BOX_TRANSPORT_AGV.toString())); + if (null == agvModel) { + return; + } + int maxCapacity = agvModel.getBackpack(); + + // STA IDLE + LambdaQueryWrapper<Sta> idleWrapper = new LambdaQueryWrapper<Sta>() + .eq(Sta::getStaSts, StaStsType.IDLE.val()) + .eq(Sta::getStatus, StatusType.ENABLE.val) + .in(Sta::getStaNo, staGroupList); + List<Sta> idleList = staService.list(idleWrapper); + if (Cools.isEmpty(idleList)) { + return; + } + Collections.shuffle(idleList); + + // LOC STOCK + LambdaQueryWrapper<Loc> stockWrapper = new LambdaQueryWrapper<Loc>().eq(Loc::getLocSts, LocStsType.STOCK.val()); + if (null != startRow) { stockWrapper.ge(Loc::getRow, startRow); } + if (null != endRow) { stockWrapper.le(Loc::getRow, endRow); } + List<Loc> stockList = locService.list(stockWrapper); + if (Cools.isEmpty(stockList)) { + return; + } + Collections.shuffle(stockList); + + OpenBusSubmitParam param = new OpenBusSubmitParam(); + param.setBatch(String.valueOf(snowflakeIdWorker.nextId()).substring(13, 19)); + for (int i = 0; i < Math.min(maxCapacity, Math.min(idleList.size(), stockList.size())); i++) { + Loc stockLoc = stockList.get(i); + Sta idleSta = idleList.get(i); + + TaskDto taskDto = new TaskDto(); + taskDto.setOriLoc(stockLoc.getLocNo()); + taskDto.setDestSta(idleSta.getStaNo()); + taskDto.setPriority(100); + taskDto.setSeqNum(String.valueOf(snowflakeIdWorker.nextId()).substring(15, 19)); + + param.getTaskList().add(taskDto); + } + + mainService.generateBusAndTask(param, memo); + } + + // 绉诲簱 + private void runLocToLoc(List<Integer> locGroupList, List<String> agvGroupList, String staTaskMemo) { + Integer startRow = Collections.min(locGroupList); + Integer endRow = Collections.max(locGroupList); + + String memo = "DEMO_LOC_" + startRow + "-" + endRow; + + int availableAgvCount = this.getAvailableAgvCount(agvGroupList); // 鏈�澶� ? 缁刡us杩愯 - if (agvCount <= busService.count(new LambdaQueryWrapper<Bus>() + if (availableAgvCount <= busService.count(new LambdaQueryWrapper<Bus>() .in(Bus::getBusSts, BusStsType.RECEIVE.val(), BusStsType.PROGRESS.val()) - .eq(Bus::getMemo, memo) + .in(Bus::getMemo, memo, staTaskMemo) )) { return; } @@ -100,10 +232,6 @@ return; } Collections.shuffle(stockList); - if (stockList.size() > maxCapacity) { - stockList = stockList.subList(0, maxCapacity); - } - int numOfStockLocList = stockList.size(); // IDLE LambdaQueryWrapper<Loc> idleWrapper = new LambdaQueryWrapper<Loc>().eq(Loc::getLocSts, LocStsType.IDLE.val()); @@ -114,13 +242,10 @@ return; } Collections.shuffle(idleList); - if (idleList.size() > numOfStockLocList) { - idleList = idleList.subList(0, numOfStockLocList); - } OpenBusSubmitParam param = new OpenBusSubmitParam(); param.setBatch(String.valueOf(snowflakeIdWorker.nextId()).substring(13, 19)); - for (int i = 0; i < numOfStockLocList; i++) { + for (int i = 0; i < Math.min(maxCapacity, Math.min(stockList.size(), idleList.size())); i++) { Loc stockLoc = stockList.get(i); Loc idleLoc = idleList.get(i); @@ -135,5 +260,33 @@ mainService.generateBusAndTask(param, memo); } + public static List<String> getStaPrefixes(List<String> staGroupList) { + Set<String> rowSet = new HashSet<>(); + for (String s : staGroupList) { + rowSet.add(s.split("-")[0]); + } + List<String> result = new ArrayList<>(rowSet); + result.sort(Comparator.comparingInt(Integer::parseInt)); + return result; + } + + private int getAvailableAgvCount(List<String> agvNos) { + int res = 0; + if (Cools.isEmpty(agvNos)) { + return res; + } + for (String agvNo : agvNos) { + if (null == redis.getObject(RedisConstant.AGV_ONLINE_FLAG, agvNo)) { + continue; + } + Agv agv = agvService.selectByUuid(agvNo); + if (!agv.getStatusBool()) { + continue; + } + res++; + } + + return res; + } } -- Gitblit v1.9.1