From 4dec9b5fe50a366b14910b7f1ae057e5be6e1366 Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期三, 31 十二月 2025 15:52:46 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java                |   70 ++++++++++++++++++++++++++---------
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java     |    5 +-
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/SegmentMapper.java            |    2 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java |    4 +-
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java            |    4 +-
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java          |    2 
 zy-acs-manager/src/main/resources/mapper/manager/SegmentMapper.xml                           |    5 +-
 7 files changed, 64 insertions(+), 28 deletions(-)

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 0bbbe3d..b3f75fe 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
@@ -225,8 +225,8 @@
 
             // has enough backpack space to load
             Integer backpack = agvService.getBackpack(agvId);
-            int countRemainingBackpack = segmentService.countRemainingBackpack(null, agvId);
-            if (countRemainingBackpack >= backpack) {
+            List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(null, agvId);
+            if (usedBackpacks.size() >= backpack) {
                 continue;
             }
 
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 849bdcd..a0b1a83 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
@@ -253,27 +253,45 @@
                         , (task, agvNo, sta) -> {
                             Long agvId = agvService.getAgvId(agvNo);
 
-                            List<Travel> travelList = travelService.list(new LambdaQueryWrapper<Travel>()
-                                    .eq(Travel::getAgvId, agvId)
-                                    .eq(Travel::getState, TravelStateType.RUNNING.toString())
-                                    .orderByDesc(Travel::getCreateTime));
-                            if (Cools.isEmpty(travelList)) {
-                                throw new BusinessException("[Agv: " + agvNo + "]allocate inbound failed to find travel");
-                            }
-                            Travel travel = travelList.get(0);
-
-                            List<Segment> currSegments = segmentService.list(new LambdaQueryWrapper<Segment>()
-                                    .eq(Segment::getAgvId, agvId)
-                                    .eq(Segment::getTravelId, travel.getId())
-                            );
+//                            List<Travel> travelList = travelService.list(new LambdaQueryWrapper<Travel>()
+//                                    .eq(Travel::getAgvId, agvId)
+//                                    .eq(Travel::getState, TravelStateType.RUNNING.toString())
+//                                    .orderByDesc(Travel::getCreateTime));
+//                            if (Cools.isEmpty(travelList)) {
+//                                throw new BusinessException("[Agv: " + agvNo + "]allocate inbound failed to find travel");
+//                            }
+//                            Travel travel = travelList.get(0);
+//
+//                            List<Segment> currSegments = segmentService.list(new LambdaQueryWrapper<Segment>()
+//                                    .eq(Segment::getAgvId, agvId)
+//                                    .eq(Segment::getTravelId, travel.getId())
+//                            );
                             // load segment
                             Segment currSeg = segmentService.getRollerWaiting(agvId, sta.getCode(), TaskPosDto.PosType.ORI_STA);
+                            if (null == currSeg) {
+                                throw new BusinessException("[Agv:" + agvNo + "] allocate inbound failed: no roller waiting segment");
+                            }
+
+                            // get backpack lev
+                            int backpackLev = 0;
+                            int backpack = agvService.getBackpack(agvId);
+                            List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId);
+                            for (int lev = 0; lev < backpack; lev++) {
+                                if (!usedBackpacks.contains(lev)) {
+                                    backpackLev = lev;
+                                    break;
+                                }
+                            }
+                            if (backpackLev == 0) {
+                                throw new BusinessException("[Agv:" + agvNo + "] backpack full, can't allocate inbound");
+                            }
+
+                            // update curr seg
                             currSeg.setState(SegmentStateType.INIT.toString());
                             currSeg.setUpdateTime(now);
                             if (!segmentService.updateById(currSeg)) {
                                 log.error("Segment [{}] failed to update 锛侊紒锛�", currSeg.getGroupId() + " - " + currSeg.getSerial());
                             }
-
 
                             // new oriSta seg
                             Segment loadSeg = new Segment();
@@ -285,22 +303,30 @@
                             loadSeg.setEndNode(sta.getCode());
                             loadSeg.setPosType(TaskPosDto.PosType.ORI_STA.toString());
                             loadSeg.setState(SegmentStateType.WAITING.toString());
+                            loadSeg.setBackpack(backpackLev);
+                            loadSeg.setCreateTime(now);
+                            loadSeg.setUpdateTime(now);
                             if (!segmentService.save(loadSeg)) {
                                 log.error("Segment [{}] failed to save 锛侊紒锛�", loadSeg.getTravelId() + " - " + loadSeg.getSerial());
                             }
 
                             // place segment
                             TaskTypeType taskType = Objects.requireNonNull(TaskTypeType.get(task.getTaskTypeEl()));
-                            TaskPosDto.PosType posType = null;
+                            TaskPosDto.PosType posType;
+                            Code endCode;
                             switch (taskType) {
                                 case STA_TO_LOC:
                                     posType = TaskPosDto.PosType.DEST_LOC;
+                                    Loc destLoc = locService.getById(task.getDestLoc());
+                                    endCode = codeService.getCacheById(destLoc.getCode());
                                     break;
                                 case STA_TO_STA:
                                     posType = TaskPosDto.PosType.DEST_STA;
+                                    Sta destSta = staService.getById(task.getDestSta());
+                                    endCode = codeService.getCacheById(destSta.getCode());
                                     break;
                                 default:
-                                    throw new BusinessException("[Agv: " + agvNo + "]allocate inbound failed to find travel");
+                                    throw new BusinessException("[Agv:" + agvNo + "] allocate inbound only supports STA_TO_LOC/STA_TO_STA");
                             }
 
                             Segment placeSeg = new Segment();
@@ -308,14 +334,18 @@
                             placeSeg.setTravelId(currSeg.getTravelId());
                             placeSeg.setAgvId(agvId);
                             placeSeg.setTaskId(task.getId());
-                            placeSeg.setSerial(currSeg.getSerial() - 1);
-                            placeSeg.setEndNode(sta.getCode());
+                            placeSeg.setSerial();
+                            placeSeg.setEndNode(endCode.getId());
                             placeSeg.setPosType(posType.toString());
                             placeSeg.setState(SegmentStateType.INIT.toString());
+                            loadSeg.setBackpack(backpackLev);
+                            placeSeg.setCreateTime(now);
+                            placeSeg.setUpdateTime(now);
                             if (!segmentService.save(placeSeg)) {
                                 log.error("Segment [{}] failed to save 锛侊紒锛�", placeSeg.getTravelId() + " - " + placeSeg.getSerial());
                             }
 
+                            // update task
                             task.setAgvId(agvId);
                             task.setTaskSts(TaskStsType.ASSIGN.val());
                             task.setIoTime(now);
@@ -548,6 +578,8 @@
             travel.setTaskContent(JSON.toJSONString(list));
             travel.setTaskIds(JSON.toJSONString(taskList.stream().map(Task::getId).collect(Collectors.toList())));
             travel.setState(TravelStateType.RUNNING.toString());
+            travel.setCreateTime(now);
+            travel.setUpdateTime(now);
             if (!travelService.save(travel)) {
                 throw new BusinessException("浠诲姟缁勪繚瀛樺け璐�");
             }
@@ -571,6 +603,8 @@
                     segment.setPosType(taskPosDto.getPosType().toString());
                     segment.setBackpack(backpackType.lev);
                     segment.setState(SegmentStateType.INIT.toString());
+                    segment.setCreateTime(now);
+                    segment.setUpdateTime(now);
                     segmentList.add(segment);
                 }
             }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java
index 5cf49ab..ff1ea3f 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java
@@ -10,6 +10,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Objects;
 
 // man_segment: start_time, end_time, alter table man_segment
@@ -83,8 +84,8 @@
 
             // 鑳岀瘬鏈弧鎵嶇瓑
             Integer backpack = agvService.getBackpack(agvId);
-            int countRemainingBackpack = segmentService.countRemainingBackpack(currSeg.getTravelId(), agvId);
-            if (countRemainingBackpack >= backpack) {
+            List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId);
+            if (usedBackpacks.size() >= backpack) {
                 return false;
             }
 
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/SegmentMapper.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/SegmentMapper.java
index 5c3d29f..b10b7c4 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/SegmentMapper.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/SegmentMapper.java
@@ -10,6 +10,6 @@
 
     List<String> getGroupNo(@Param("state")String state, @Param("agvId")Long agvId, @Param("groupNo")String groupNo);
 
-    int countRemainingBackpack(@Param("travelId") Long travelId, @Param("agvId") Long agvId);
+    List<Integer> selectUsedBackpacks(@Param("travelId") Long travelId, @Param("agvId") Long agvId);
 
 }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java
index a61122c..4e52ac5 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java
@@ -29,7 +29,7 @@
 
     Segment getCurrRunningSeg(Long agvId, Long codeId);
 
-    int countRemainingBackpack(Long travelId, Long agvId);
+    List<Integer> selectUsedBackpacks(Long travelId, Long agvId);
 
     Segment getRollerWaiting(Long agvId, Long codeId, TaskPosDto.PosType posType);
 
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java
index ee330e1..38880af 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java
@@ -165,8 +165,8 @@
     }
 
     @Override
-    public int countRemainingBackpack(Long travelId, Long agvId) {
-        return this.baseMapper.countRemainingBackpack(agvId, travelId);
+    public List<Integer> selectUsedBackpacks(Long travelId, Long agvId) {
+        return this.baseMapper.selectUsedBackpacks(agvId, travelId);
     }
 
     @Override
diff --git a/zy-acs-manager/src/main/resources/mapper/manager/SegmentMapper.xml b/zy-acs-manager/src/main/resources/mapper/manager/SegmentMapper.xml
index 4cba666..fc84b6d 100644
--- a/zy-acs-manager/src/main/resources/mapper/manager/SegmentMapper.xml
+++ b/zy-acs-manager/src/main/resources/mapper/manager/SegmentMapper.xml
@@ -23,9 +23,9 @@
         </where>
     </sql>
 
-    <select id="countRemainingBackpack" resultType="int">
+    <select id="selectUsedBackpacks" resultType="java.lang.Integer">
         SELECT
-            COUNT(DISTINCT backpack)
+        DISTINCT backpack
         FROM man_segment
         WHERE 1=1
         AND agv_id = #{agvId}
@@ -37,6 +37,7 @@
         AND backpack IS NOT NULL
         AND backpack > 0
         AND state != 'FINISH'
+        ORDER BY backpack ASC
     </select>
 
     <select id="getGroupNo" resultType="java.lang.String">

--
Gitblit v1.9.1