|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
|---|
|  |  |  | import com.zy.acs.common.utils.RedisSupport; | 
|---|
|  |  |  | import com.zy.acs.framework.common.Cools; | 
|---|
|  |  |  | import com.zy.acs.framework.common.R; | 
|---|
|  |  |  | import com.zy.acs.manager.manager.entity.*; | 
|---|
|  |  |  | import com.zy.acs.manager.manager.enums.StatusType; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.annotation.PostConstruct; | 
|---|
|  |  |  | import javax.annotation.PreDestroy; | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.Collections; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.Map; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | import java.util.concurrent.*; | 
|---|
|  |  |  | import java.util.stream.Collectors; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * Created by vincent on 11/9/2024 | 
|---|
|  |  |  | 
|---|
|  |  |  | private final RedisSupport redis = RedisSupport.defaultRedisSupport; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private ScheduledExecutorService scheduler = null; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private List<String> CODE_DATA_CACHE = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private AgvService agvService; | 
|---|
|  |  |  | 
|---|
|  |  |  | .eq(Travel::getState, TravelStateType.RUNNING.toString()))) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //        if (taskService.count(new LambdaQueryWrapper<Task>() | 
|---|
|  |  |  | //                .eq(Task::getAgvId, agvId) | 
|---|
|  |  |  | //                .in(Task::getTaskSts, TaskStsType.ASSIGN.val(), TaskStsType.PROGRESS.val()) | 
|---|
|  |  |  | //                ) > 0) { | 
|---|
|  |  |  | //            return; | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | if (!agvService.judgeEnable(agvId)) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | AgvDetail agvDetail = agvDetailService.selectMajorByAgvId(agvId); | 
|---|
|  |  |  | Code destinationCode = this.getDestinationCode(agvNo, agvDetail); | 
|---|
|  |  |  | if (null == destinationCode) { | 
|---|
|  |  |  | String destinationCodeData = this.getDestinationCode(agvNo, agvDetail); | 
|---|
|  |  |  | if (Cools.isEmpty(destinationCodeData)) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (mainLockWrapService.buildMinorTask(agvId, TaskTypeType.MOVE, destinationCode.getData(), null)) { | 
|---|
|  |  |  | if (mainLockWrapService.buildMinorTask(agvId, TaskTypeType.MOVE, destinationCodeData, null)) { | 
|---|
|  |  |  | log.info(agvNo + "开始走行演示..."); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * 评估HandlerController没有调用buildMajorTask,手动创建task的可行性 | 
|---|
|  |  |  | * agv地图图标变化 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public Code getDestinationCode(String agvNo, AgvDetail agvDetail) { | 
|---|
|  |  |  | Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class); | 
|---|
|  |  |  | public String getDestinationCode(String agvNo, AgvDetail agvDetail) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Code startCode = codeService.getCacheById(agvDetail.getRecentCode()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<String> notInCodeList = new ArrayList<>(); | 
|---|
|  |  |  | notInCodeList.add("00000301"); | 
|---|
|  |  |  | notInCodeList.add("00000302"); | 
|---|
|  |  |  | notInCodeList.add("00000303"); | 
|---|
|  |  |  | notInCodeList.add("00000351"); | 
|---|
|  |  |  | notInCodeList.add("00000353"); | 
|---|
|  |  |  | notInCodeList.add("00000401"); | 
|---|
|  |  |  | notInCodeList.add("00000402"); | 
|---|
|  |  |  | Set<String> notInCodeSet = new HashSet<>(); | 
|---|
|  |  |  | notInCodeSet.add("00000301"); | 
|---|
|  |  |  | notInCodeSet.add("00000302"); | 
|---|
|  |  |  | notInCodeSet.add("00000303"); | 
|---|
|  |  |  | notInCodeSet.add("00000351"); | 
|---|
|  |  |  | notInCodeSet.add("00000353"); | 
|---|
|  |  |  | notInCodeSet.add("00000401"); | 
|---|
|  |  |  | notInCodeSet.add("00000402"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | notInCodeList.add("00000311"); | 
|---|
|  |  |  | notInCodeList.add("00000312"); | 
|---|
|  |  |  | notInCodeList.add("00000313"); | 
|---|
|  |  |  | notInCodeList.add("00000361"); | 
|---|
|  |  |  | notInCodeList.add("00000363"); | 
|---|
|  |  |  | notInCodeList.add("00000411"); | 
|---|
|  |  |  | notInCodeList.add("00000412"); | 
|---|
|  |  |  | notInCodeSet.add("00000311"); | 
|---|
|  |  |  | notInCodeSet.add("00000312"); | 
|---|
|  |  |  | notInCodeSet.add("00000313"); | 
|---|
|  |  |  | notInCodeSet.add("00000361"); | 
|---|
|  |  |  | notInCodeSet.add("00000363"); | 
|---|
|  |  |  | notInCodeSet.add("00000411"); | 
|---|
|  |  |  | notInCodeSet.add("00000412"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | notInCodeList.add("00000046"); | 
|---|
|  |  |  | notInCodeList.add("00000047"); | 
|---|
|  |  |  | List<Code> list = codeService.list(new LambdaQueryWrapper<Code>().notIn(Code::getData, notInCodeList)); | 
|---|
|  |  |  | notInCodeSet.add("00000046"); | 
|---|
|  |  |  | notInCodeSet.add("00000047"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Collections.shuffle(list); | 
|---|
|  |  |  | Collections.shuffle(CODE_DATA_CACHE); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (Code endCode : list) { | 
|---|
|  |  |  | for (String endCodeData : CODE_DATA_CACHE) { | 
|---|
|  |  |  | if (notInCodeSet.contains(endCodeData)) { continue; } | 
|---|
|  |  |  | Code endCode = codeService.getCacheByData(endCodeData); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // valid lane | 
|---|
|  |  |  | if (!allocateService.validCapacityOfLane(agvNo, endCode)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | 
|---|
|  |  |  | // valid path length | 
|---|
|  |  |  | List<String> pathList = mapService.validFeasibility(startCode, endCode); | 
|---|
|  |  |  | if (pathList.size() >= 5) { | 
|---|
|  |  |  | return endCode; | 
|---|
|  |  |  | return endCodeData; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return list.stream().findFirst().orElse(null); | 
|---|
|  |  |  | return CODE_DATA_CACHE.stream().findFirst().orElse(null); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // --------------------------------------------------------------------------- | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | if (count > 0) { | 
|---|
|  |  |  | this.scheduler = Executors.newScheduledThreadPool(count); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Code> codeList = codeService.list(new LambdaQueryWrapper<Code>().eq(Code::getStatus, StatusType.ENABLE.val)); | 
|---|
|  |  |  | this.CODE_DATA_CACHE = codeList.stream().map(Code::getData).distinct().collect(Collectors.toList()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @PreDestroy | 
|---|