From 55f9c93b292feca5148fdbbf391b159578e70bd9 Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期五, 16 一月 2026 08:11:11 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java |  107 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 105 insertions(+), 2 deletions(-)

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 d41b4f1..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
@@ -1,21 +1,124 @@
 package com.zy.acs.manager.core.service;
 
+import com.zy.acs.manager.core.domain.TaskPosDto;
+import com.zy.acs.manager.manager.entity.Code;
 import com.zy.acs.manager.manager.entity.Segment;
-import com.zy.acs.manager.manager.service.SegmentService;
+import com.zy.acs.manager.manager.entity.Sta;
+import com.zy.acs.manager.manager.enums.StaTypeType;
+import com.zy.acs.manager.manager.service.*;
 import lombok.extern.slf4j.Slf4j;
 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
+//    add roller_waiting int(1) default 0 null comment '婊氱瓛绾跨瓑寰�' after end_time;
+/**
+ * alter table man_sta
+ *     add capacity int null comment '妲戒綅鏁�' after angle;
+ *
+ * alter table man_sta
+ *     add occ_cnt int null comment '鍗犵敤鏁�' after capacity;
+ *
+ * alter table man_sta
+ *     add rsv_in_cnt int null comment '棰勭害鏀捐揣閲�' after occ_cnt;
+ *
+ * alter table man_sta
+ *     add rsv_out_cnt int null comment '棰勭害鍙栬揣閲�' after rsv_in_cnt;
+ */
 @Slf4j
 @Service
 public class TransferStationHandler {
 
+    private static final long LOAD_DELAY_MS  = 15000L; // load ( inbound ) delay timeout
+    private static final long PLACE_DELAY_MS  = 15000L; // place ( outbound ) delay timeout
+
     @Autowired
     private SegmentService segmentService;
+    @Autowired
+    private AgvService agvService;
+    @Autowired
+    private AgvDetailService agvDetailService;
+    @Autowired
+    private CodeService codeService;
+    @Autowired
+    private StaService staService;
 
-    public boolean isSegDelayAtSta(Segment segment) {
+    /**
+     * 鍙栬揣锛堝叆搴擄級锛氬湪鍙栧畬绗竴涓揣鐨勬椂鍊欙紝鎷呭績婊氱瓛杈撻�佺嚎浼氭湁涓嬩竴涓揣鐗╋紝鎵�浠ュ缓璁瓵GV鍦ㄥ師鍦扮瓑寰呬竴娈垫椂闂�
+     * 鏀捐揣锛堝嚭搴擄級锛氬彲鑳芥鏃禔GV涓婇潰鍏朵粬鑳岀瘬鐨勬枡绠变篃鏄嚭搴撳埌杩欎釜婊氱瓛杈撻�佺嚎锛屾墍浠ョ瓑杈撻�佺嚎鎶婄涓�涓枡绠辫繍璧颁箣鍚庯紝鍐嶆斁绗簩涓�
+     * 瑕佸仛 ready-for-next
+     */
+    public boolean hasDelayAtSta(Segment currSeg) {
+        if (currSeg == null) {
+            throw new NullPointerException("segment is null in hasDelayAtSta.");
+        }
+        // 鍒ゆ柇AGV鏄惁鍦ㄦ粴鍔ㄨ緭閫佺嚎鍓�
+        Code currentCode = agvDetailService.getCurrentCode(currSeg.getAgvId());
+        if (null == currentCode) {
+            return false;
+        }
+        Sta rollerSta = staService.selectByCode(currentCode.getId(), StaTypeType.ROLLER);
+        if (null == rollerSta) {
+            return false;
+        }
+        // 濡傛灉涓虹涓�涓猻egment锛堟病鏈塸revious segment锛夛紝鍒欎笉闇�瑕佺瓑寰�
+        Segment preSeg = segmentService.getPreviousStepOfFinish(currSeg.getTravelId(), currSeg.getSerial());
+        if (preSeg == null || null == preSeg.getEndTime()) {
+            return false;
+        }
 
+        TaskPosDto.PosType currPosType = TaskPosDto.PosType.of(currSeg.getPosType());
+        TaskPosDto.PosType prePosType = TaskPosDto.PosType.of(preSeg.getPosType());
+        if (prePosType == null || currPosType == null) {
+            return false;
+        }
+        long preEndTime = preSeg.getEndTime().getTime();
+        long now = System.currentTimeMillis();
+        Long agvId = currSeg.getAgvId();
 
+        // inbound
+        if (prePosType.equals(TaskPosDto.PosType.ORI_STA)) {
+
+            // 鑳岀瘬鏈弧鎵嶇瓑
+            Integer backpack = agvService.getBackpack(agvId);
+            List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId);
+            if (usedBackpacks.size() >= backpack) {
+                return false;
+            }
+
+            // sign waiting
+            if (currSeg.getRollerWaiting() == 0) {
+                currSeg.setRollerWaiting(1);
+                segmentService.updateById(currSeg);
+            }
+
+            // timeout
+            return (now - preEndTime) < LOAD_DELAY_MS;
+        }
+
+        // outbound
+        if (prePosType == TaskPosDto.PosType.DEST_STA) {
+
+            // 杩炵画鍚屽彛鎵嶇瓑
+            if (currPosType != TaskPosDto.PosType.DEST_STA) {
+                return false;
+            }
+            if (!Objects.equals(preSeg.getEndNode(), currSeg.getEndNode())) {
+                return false;
+            }
+
+            // sign waiting
+            if (currSeg.getRollerWaiting() == 0) {
+                currSeg.setRollerWaiting(1);
+                segmentService.updateById(currSeg);
+            }
+
+            // timeout
+            return (now - preEndTime) < PLACE_DELAY_MS;
+        }
 
         return false;
     }

--
Gitblit v1.9.1