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