From 09ca73620da2b11310df08cb7a500493ea4782da Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期二, 28 四月 2026 15:37:38 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/HkOrderStateClosureService.java |   56 +++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/HkOrderStateClosureService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/HkOrderStateClosureService.java
index 1db7090..308e41e 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/HkOrderStateClosureService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/HkOrderStateClosureService.java
@@ -3,9 +3,12 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.acs.common.hk.state.HkState;
 import com.zy.acs.common.hk.state.HkStateActionState;
+import com.zy.acs.common.hk.state.HkStateBatteryState;
+import com.zy.acs.common.hk.action.type.HkActionType;
 import com.zy.acs.common.hk.state.type.HkActionStatusType;
 import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.framework.common.Cools;
+import com.zy.acs.manager.core.domain.TaskPosDto;
 import com.zy.acs.manager.manager.entity.Action;
 import com.zy.acs.manager.manager.entity.Segment;
 import com.zy.acs.manager.manager.enums.ActionStsType;
@@ -49,11 +52,15 @@
 
         syncFinishedActions(state);
 
-        if (!isOrderCompleted(state)) {
+        List<Segment> segmentList = segmentService.list(new LambdaQueryWrapper<Segment>()
+                .eq(Segment::getGroupId, state.getOrderId())
+                .orderByAsc(Segment::getSerial));
+
+        if (!isOrderCompleted(state, segmentList)) {
             return;
         }
 
-        settleCompletedOrder(state);
+        settleCompletedOrder(state, segmentList);
     }
 
     private void syncFinishedActions(HkState state) {
@@ -94,7 +101,11 @@
         }
     }
 
-    private boolean isOrderCompleted(HkState state) {
+    private boolean isOrderCompleted(HkState state, List<Segment> segmentList) {
+        if (isChargeOrder(segmentList) && isChargeTaskCompleted(state)) {
+            return true;
+        }
+
         if (!Cools.isEmpty(state.getNodeStates()) || !Cools.isEmpty(state.getEdgeStates())) {
             return false;
         }
@@ -121,16 +132,13 @@
         return true;
     }
 
-    private void settleCompletedOrder(HkState state) {
+    private void settleCompletedOrder(HkState state, List<Segment> segmentList) {
         String orderId = state.getOrderId();
         String completeKey = buildCompleteKey(state);
         if (redis.getObject(HK_ORDER_COMPLETE_FLAG, completeKey) != null) {
             return;
         }
 
-        List<Segment> segmentList = segmentService.list(new LambdaQueryWrapper<Segment>()
-                .eq(Segment::getGroupId, orderId)
-                .orderByAsc(Segment::getSerial));
         if (Cools.isEmpty(segmentList)) {
             log.warn("hk state order completed but no segment found, agvNo={}, orderId={}, orderUpdateId={}",
                     state.getSerialNumber(), orderId, state.getOrderUpdateId());
@@ -172,6 +180,40 @@
         return lastNodeSequenceId >= expectedLastNodeSequenceId;
     }
 
+    private boolean isChargeOrder(List<Segment> segmentList) {
+        if (Cools.isEmpty(segmentList)) {
+            return false;
+        }
+        return segmentList.stream()
+                .map(Segment::getPosType)
+                .map(TaskPosDto::queryPosType)
+                .anyMatch(TaskPosDto.PosType.TO_CHARGE::equals);
+    }
+
+    private boolean isChargeTaskCompleted(HkState state) {
+        HkStateBatteryState batteryState = state.getBatteryState();
+        if (batteryState != null && Boolean.TRUE.equals(batteryState.getCharging())) {
+            return true;
+        }
+
+        if (Cools.isEmpty(state.getActionStates())) {
+            return false;
+        }
+
+        for (HkStateActionState actionState : state.getActionStates()) {
+            if (actionState == null || Cools.isEmpty(actionState.getActionType())) {
+                continue;
+            }
+            if (!HkActionType.START_CHARGING.getCode().equalsIgnoreCase(actionState.getActionType())) {
+                continue;
+            }
+            if (actionState.getActionStatus() == HkActionStatusType.FINISHED) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private Long parseActionId(String hkActionId) {
         if (Cools.isEmpty(hkActionId) || hkActionId.length() < 2) {
             return null;

--
Gitblit v1.9.1