From 9f19c2ea1a1d4e94460eb2d881b7cf8cc10e66df Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期四, 14 十一月 2024 10:42:10 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TaskService.java          |    2 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java             |   46 ++--------
 zy-acs-framework/src/main/java/com/zy/acs/framework/common/Cools.java                     |    4 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TaskServiceImpl.java |    2 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java           |   44 +++++++++-
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java         |  117 ++++++-----------------------
 6 files changed, 76 insertions(+), 139 deletions(-)

diff --git a/zy-acs-framework/src/main/java/com/zy/acs/framework/common/Cools.java b/zy-acs-framework/src/main/java/com/zy/acs/framework/common/Cools.java
index 88f0a28..a00775d 100644
--- a/zy-acs-framework/src/main/java/com/zy/acs/framework/common/Cools.java
+++ b/zy-acs-framework/src/main/java/com/zy/acs/framework/common/Cools.java
@@ -299,6 +299,8 @@
 
     }
 
+    private final static char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+
     public static String md5(String string){
         try{
             MessageDigest md5 = MessageDigest.getInstance("MD5");
@@ -315,8 +317,6 @@
             throw new RuntimeException("md5鍔犲瘑澶辫触,str=".concat(string));
         }
     }
-
-    private static char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
 
     public static Map<String, Object> translate(Object obj){
         Class<?> cls = obj.getClass();
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
index f63a66e..744917b 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
@@ -3,7 +3,6 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.acs.framework.common.Cools;
 import com.zy.acs.manager.common.utils.CommonUtil;
-import com.zy.acs.manager.common.utils.LocUtils;
 import com.zy.acs.manager.core.domain.Lane;
 import com.zy.acs.manager.manager.entity.*;
 import com.zy.acs.manager.manager.enums.StatusType;
@@ -103,7 +102,8 @@
         List<String> availableAgvNosByOriLane = new ArrayList<>(availableAgvNos);
         if (null != originLane) {
             List<String> agvNosByOriLane = findAgvNosByLane(originLane);    // the agv list that had tasks in this lane
-            if (!Cools.isEmpty(agvNosByOriLane) && agvNosByOriLane.size() >= maxAgvCountInLane) {
+            // if full lane
+            if (agvNosByOriLane.size() >= maxAgvCountInLane) {
 
                 availableAgvNosByOriLane = Cools.getIntersection(agvNosByOriLane, availableAgvNos);
             }
@@ -116,7 +116,7 @@
         List<String> availableAgvNosByDestLane = new ArrayList<>(availableAgvNos);
         if (null != destinationLane) {
             List<String> agvNosByDestLane = findAgvNosByLane(destinationLane);
-            if (!Cools.isEmpty(agvNosByDestLane) && agvNosByDestLane.size() >= maxAgvCountInLane) {
+            if (agvNosByDestLane.size() >= maxAgvCountInLane) {
 
                 availableAgvNosByDestLane = Cools.getIntersection(agvNosByDestLane, availableAgvNos);
             }
@@ -132,7 +132,6 @@
             log.warn("No available agv to assign the task destination[{}]", task.getSeqNum());
             return null;
         }
-
         List<String> actualAvailableAgvNos = Cools.getIntersection(availableAgvNosByOriLane, availableAgvNosByDestLane);
         if (Cools.isEmpty(actualAvailableAgvNos)) {
             log.warn("No available agv to assign the task[{}]", task.getSeqNum());
@@ -158,17 +157,18 @@
         return agvService.selectByUuid(actualAvailableAgvNos.stream().findFirst().orElse(null));
     }
 
-    private List<String> findAgvNosByLane(Lane lane) {
+    public List<String> findAgvNosByLane(Lane lane) {
         if (null == lane) {
-            return null;
+            return new ArrayList<>();
         }
         List<Task> taskList = taskService.findRunningTasksByLaneHash(lane.getHashCode());
         if (Cools.isEmpty(taskList)) {
-            return null;
+            return new ArrayList<>();
         }
-        return taskList.stream().map(task -> {
-            return agvService.getById(task.getAgvId()).getUuid();
-        }).distinct().collect(Collectors.toList());
+        return taskList.stream()
+                .map(task -> agvService.getById(task.getAgvId()).getUuid())
+                .distinct()
+                .collect(Collectors.toList());
     }
 
     private List<String> validBackpackLimit(List<String> agvNoList) {
@@ -178,8 +178,8 @@
         return agvNoList.stream().filter(agvNo -> {
             Agv agv = agvService.selectByUuid(agvNo);
             AgvModel agvModel = agvModelService.getById(agv.getAgvModel());
-            List<Task> runningTasks = taskService.findRunningTasksByAgv(agv.getId());
-            return runningTasks.size() < agvModel.getBackpack();
+            List<Task> transportTasks = taskService.findTransportTasksByAgv(agv.getId());
+            return transportTasks.size() < agvModel.getBackpack();
         }).collect(Collectors.toList());
     }
 
@@ -189,9 +189,9 @@
         Agv agv = agvService.selectByUuid(agvNo);
 
         // backpack
-        List<Task> runningTasks = taskService.findRunningTasksByAgv(agv.getId());
-        if (!Cools.isEmpty(runningTasks)) {
-            weight = weight + runningTasks.size() * 100000;
+        List<Task> transportTasks = taskService.findTransportTasksByAgv(agv.getId());
+        if (!Cools.isEmpty(transportTasks)) {
+            weight = weight + transportTasks.size() * 100000;
         }
 
         // distance
@@ -231,89 +231,20 @@
         return -weight;
     }
 
-    public synchronized Agv execute(Task task, Map<String, List<Long>> taskAllot, List<Long> taskIds) {
-        String oriLocNo = task.getOriLoc$();
-        int oriLocRow = LocUtils.getRow(oriLocNo);
-        String destLocNo = task.getDestLoc$();
-        int destLocRow = LocUtils.getRow(destLocNo);
+    public Boolean validCapacityOfLane(Agv agv, Code code) {
+        Lane lane = laneService.search(code.getData());
+        if (null != lane) {
+            Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class);
 
-        Agv hit = null;
-
-        List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val));
-        Collections.shuffle(agvList);
-        for (Agv agv : agvList) {
-            AgvModel agvModel = agvModelService.getById(agv.getAgvModel());
-            int allotTaskCount = 0;
-            List<Long> allotTaskIds = taskAllot.get(agv.getUuid());
-            if (!Cools.isEmpty(allotTaskIds)) {
-                allotTaskCount = allotTaskIds.size();
+            List<String> agvNosByLane = this.findAgvNosByLane(lane);
+            agvNosByLane.remove(agv.getUuid());
+            if (agvNosByLane.size() >= maxAgvCountInLane) {
+                return false;
             }
-            if (allotTaskCount >= agvModel.getBackpack()) {
-                continue;
-            }
-            if (taskService.count(new LambdaQueryWrapper<Task>()
-                    .eq(Task::getAgvId, agv.getId())
-                    .notIn(Task::getId, taskIds)
-                    .and(i -> {
-                        i.eq(Task::getTaskSts, TaskStsType.WAITING.val())   // 宸茬粡鏈墂aiting浠诲姟鐨勮溅涓嶈兘鍐嶅垎閰�
-                                .or().eq(Task::getTaskSts, TaskStsType.ASSIGN.val())
-                                .or().eq(Task::getTaskSts, TaskStsType.PROGRESS.val());
-                    })) > 0) {
-                log.info(agv.getUuid() + "鍙稟GV涓嶅彲鐢紝宸茬粡瀛樺湪杩涜涓殑浠诲姟...");
-                continue;
-            }
-            if (!agvService.judgeEnable(agv.getId(), true)) {
-                log.info(agv.getUuid() + "鍙稟GV涓嶅彲鐢紝" + task.getSeqNum() + "浠诲姟鏃犳硶璁$畻...");
-                continue;
-            }
-
-            hit = agv;
-            break;
         }
 
-        return hit;
+        return true;
     }
 
-    public synchronized Agv execute1(Task task, Map<String, List<Long>> taskAllot, List<Long> taskIds) {
-        String oriLocNo = task.getOriLoc$();
-        int oriLocRow = LocUtils.getRow(oriLocNo);
-        String destLocNo = task.getDestLoc$();
-        int destLocRow = LocUtils.getRow(destLocNo);
-
-        Agv agv = null;
-        if (oriLocRow <= 2 && destLocRow <= 2) {
-            agv = agvService.selectByUuid(String.valueOf(1));
-        }
-        if (oriLocRow > 2 && destLocRow > 2) {
-            agv = agvService.selectByUuid(String.valueOf(2));
-        }
-        assert agv != null;
-        AgvModel agvModel = agvModelService.getById(agv.getAgvModel());
-        int allotTaskCount = 0;
-        List<Long> allotTaskIds = taskAllot.get(agv.getUuid());
-        if (!Cools.isEmpty(allotTaskIds)) {
-            allotTaskCount = allotTaskIds.size();
-        }
-        if (allotTaskCount >= agvModel.getBackpack()) {
-            return null;
-        }
-        if (taskService.count(new LambdaQueryWrapper<Task>()
-                .eq(Task::getAgvId, agv.getId())
-                .notIn(Task::getId, taskIds)
-                .and(i -> {
-                    i.eq(Task::getTaskSts, TaskStsType.WAITING.val())   // 宸茬粡鏈墂aiting浠诲姟鐨勮溅涓嶈兘鍐嶅垎閰�
-                            .or().eq(Task::getTaskSts, TaskStsType.ASSIGN.val())
-                            .or().eq(Task::getTaskSts, TaskStsType.PROGRESS.val());
-                })) > 0) {
-            log.info(agv.getUuid() + "鍙稟GV涓嶅彲鐢紝宸茬粡瀛樺湪杩涜涓殑浠诲姟...");
-            return null;
-        }
-        if (!agvService.judgeEnable(agv.getId(), true)) {
-            log.info(agv.getUuid() + "鍙稟GV涓嶅彲鐢紝" + task.getSeqNum() + "浠诲姟鏃犳硶璁$畻...");
-            return null;
-        }
-
-        return agv;
-    }
 
 }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
index c5b0a72..4fcedee 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -15,7 +15,6 @@
 import com.zy.acs.common.enums.AgvCompleteType;
 import com.zy.acs.common.enums.AgvDirectionType;
 import com.zy.acs.common.enums.AgvSpeedType;
-import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.common.utils.Utils;
 import com.zy.acs.framework.common.Cools;
 import com.zy.acs.framework.common.SnowflakeIdWorker;
@@ -25,6 +24,7 @@
 import com.zy.acs.manager.common.exception.BusinessException;
 import com.zy.acs.manager.common.utils.CommonUtil;
 import com.zy.acs.manager.core.domain.AgvBackpackDto;
+import com.zy.acs.manager.core.domain.Lane;
 import com.zy.acs.manager.core.domain.TaskPosDto;
 import com.zy.acs.manager.core.service.astart.MapDataDispatcher;
 import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam;
@@ -41,7 +41,6 @@
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.util.*;
-import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
 /**
@@ -50,10 +49,6 @@
 @Slf4j
 @Component("mainService")
 public class MainService {
-
-    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
-    private static final int LOCK_TIMEOUT = 5;
-    private final ReentrantLock lock = new ReentrantLock(Boolean.TRUE);
 
     @Autowired
     private BusService busService;
@@ -97,6 +92,8 @@
     private TrafficService trafficService;
     @Autowired
     private AgvModelService agvModelService;
+    @Autowired
+    private LaneService laneService;
 
 
     @SuppressWarnings("all")
@@ -235,35 +232,6 @@
                     throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update");
                 }
             }
-
-
-            // ------------------------------------------
-
-
-//
-//            Map<String, List<Long>> taskAllot = new HashMap<>();
-//            for (Task task : taskList) {
-//                Agv agv = missionAssignService.execute(task, taskAllot, taskIds);
-//                if (null == agv) {
-//                    log.warn("Task[{}] has an issue锛� because it failed to checkout agv which is idle...", task.getSeqNum());
-//                    continue;
-//                }
-//
-//
-//                task.setAgvId(agv.getId());
-//                task.setTaskSts(TaskStsType.WAITING.val());
-//                task.setIoTime(now);
-//                task.setUpdateTime(now);
-//                if (!taskService.updateById(task)) {
-//                    throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update");
-//                }
-//
-//                if (taskAllot.containsKey(agv.getUuid())) {
-//                    taskAllot.get(agv.getUuid()).add(task.getId());
-//                } else {
-//                    taskAllot.put(agv.getUuid(), Utils.singletonList(task.getId()));
-//                }
-//            }
         } catch (Exception e) {
             log.error("mainService.infuseAgvForTask", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -560,6 +528,9 @@
             if (null == endCode) {
                 return false;
             }
+            if (!allocateService.validCapacityOfLane(agv, endCode)) {
+                throw new BusinessException("the lane with code:" + endCode.getData() + " is full of AGV[" + agv.getUuid() + "]!!!");
+            }
 
             Task task = new Task();
             task.setAgvId(agv.getId());
@@ -568,6 +539,11 @@
             task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
             task.setOriCode(agvDetail.getCode());
             task.setDestCode(endCode.getId());
+            // lane
+            Lane destLane = laneService.search(endCode.getData());
+            if (null != destLane) {
+                task.setDestLaneHash(destLane.getHashCode());
+            }
             task.setPriority(taskType.equals(TaskTypeType.TO_CHARGE)?2:1);
             task.setTaskSts(TaskStsType.ASSIGN.val());
             task.setTaskType(taskType.val());
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java
index f663212..2dc8122 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java
@@ -14,6 +14,7 @@
 import com.zy.acs.manager.manager.service.AgvService;
 import com.zy.acs.manager.manager.service.CodeService;
 import com.zy.acs.manager.manager.service.TaskService;
+import com.zy.acs.manager.system.service.ConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -47,14 +48,18 @@
     private AgvDetailService agvDetailService;
     @Autowired
     private TaskService taskService;
-//    @Autowired
-//    private MainService mainService;
     @Autowired
     private MainLockWrapService mainLockWrapService;
     @Autowired
     private CodeService codeService;
     @Autowired
     private MapService mapService;
+    @Autowired
+    private LaneService laneService;
+    @Autowired
+    private AllocateService allocateService;
+    @Autowired
+    private ConfigService configService;
 
     private void executePatrolLogic(String agvNo) {
         this.patrolOfMove(agvNo);
@@ -75,30 +80,55 @@
         if (!agvService.judgeEnable(agv.getId())) {
             return;
         }
-        Code randomCode = this.getRandomCode(agvDetail);
-        if (null == randomCode) {
+        Code destinationCode = this.getDestinationCode(agv, agvDetail);
+        if (null == destinationCode) {
             return;
         }
-        if (mainLockWrapService.buildMinorTask(agv, agvDetail, TaskTypeType.MOVE, randomCode.getData())) {
+        if (mainLockWrapService.buildMinorTask(agv, agvDetail, TaskTypeType.MOVE, destinationCode.getData())) {
             log.info(agv.getUuid() + "寮�濮嬭蛋琛屾紨绀�...");
         }
     }
 
-    public Code getRandomCode(AgvDetail agvDetail) {
+    /**
+     * buildMinorTask 娌℃湁璁剧疆lane锛宭ane鍙渶瑕佸叧娉ㄨ捣濮嬬偣锛堣蛋琛屽彧闇�瑕佸叧娉ㄧ粓鐐癸級
+     * 4涓湴鏂硅皟鐢ㄤ簡buildMinorTask锛屽湪浠�涔堟椂鍊欍�佸摢閲岃缃畉ask鐨刲ane
+     * (
+         * HandlerController, 鎵嬪姩  锛堟墜鍔ㄦ槸鍚﹂渶瑕佸垽鏂璴ane锛�
+         * MaintainScheduler, 鑷姩  锛堜竴鑸笉闇�瑕佽�冭檻 lane锛�
+         * PatrolService,     鑷姩  锛堥渶瑕侀澶勭悊 lane锛� 鉁�
+         * TrafficService,    鑷姩  锛堝鍧�鏃跺凡缁忓鐞嗚繃 lane锛� 鉁�
+     * )
+     * 璇勪及HandlerController娌℃湁璋冪敤buildMajorTask锛屾墜鍔ㄥ垱寤簍ask鐨勫彲琛屾��
+     * patrolOfMove娌℃湁鍒ゆ柇lane鐨勫閲�
+     * 鎶㈠崰寰呮満浣�
+     * agv鍦板浘鍥炬爣鍙樺寲
+     */
+    public Code getDestinationCode(Agv agv, AgvDetail agvDetail) {
+        Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class);
+
         Code startCode = codeService.getById(agvDetail.getRecentCode());
+
         List<String> notInCodeList = new ArrayList<>();
         notInCodeList.add("00000151");
         List<Code> list = codeService.list(new LambdaQueryWrapper<Code>().notIn(Code::getData, notInCodeList));
+
         Collections.shuffle(list);
+
         for (Code endCode : list) {
+            // valid lane
+            if (!allocateService.validCapacityOfLane(agv, endCode)) {
+                continue;
+            }
+
+            // valid path length
             List<String> pathList = mapService.validFeasibility(startCode, endCode);
             if (pathList.size() >= 5) {
                 return endCode;
             }
         }
+
         return list.stream().findFirst().orElse(null);
     }
-
 
 
     // ---------------------------------------------------------------------------
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TaskService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TaskService.java
index 9e86c4f..d6a86d7 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TaskService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TaskService.java
@@ -32,7 +32,7 @@
 
     List<Task> findRunningTasksByLaneHash(String laneHash);
 
-    List<Task> findRunningTasksByAgv(Long agvId);
+    List<Task> findTransportTasksByAgv(Long agvId);
 
     Task findLatestTask(Long agvId, TaskStsType taskSts);
 
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TaskServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TaskServiceImpl.java
index f3a3e71..8c4da30 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TaskServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TaskServiceImpl.java
@@ -176,7 +176,7 @@
     }
 
     @Override
-    public List<Task> findRunningTasksByAgv(Long agvId) {
+    public List<Task> findTransportTasksByAgv(Long agvId) {
         if (null == agvId) {
             return new ArrayList<>();
         }

--
Gitblit v1.9.1