| | |
| | | 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.Agv; |
| | | 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; |
| | |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | |
| | | @Slf4j |
| | | @Component |
| | |
| | | @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; |
| | | |
| | | 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); |
| | | |
| | | // 最多 ? 组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; |
| | | } |
| | |
| | | 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()); |
| | |
| | | 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); |
| | | |
| | |
| | | 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; |