From ff86e3738197b49ed20910501e1fe3f356e2a6e0 Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期五, 08 五月 2026 11:51:05 +0800
Subject: [PATCH] 重发优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java    |    7 ++-
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java |   38 +++++++++++++++++--
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/RcsTvCallbackService.java         |   35 +++++++++++++++++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/WmsRcsController.java          |   14 ++++++-
 4 files changed, 86 insertions(+), 8 deletions(-)

diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/WmsRcsController.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/WmsRcsController.java
index eace48f..2b32a84 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/WmsRcsController.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/WmsRcsController.java
@@ -12,6 +12,7 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.vincent.rsf.httpaudit.support.HttpAuditSupport;
+import com.vincent.rsf.openApi.service.RcsTvCallbackService;
 import com.vincent.rsf.openApi.service.WmsRcsService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -36,7 +37,7 @@
 @RequestMapping("/rcs")
 public class WmsRcsController {
 
-    private static final String API_AGV_ERROR = "RCS-AGV寮傚父涓婃姤锛堜粎鎺ユ敹锛�";
+    private static final String API_AGV_ERROR = "RCS-AGV寮傚父涓婃姤锛堝啓鐢佃鎶ヨ锛�";
     private static final String API_PUB_TASK = "璋冨害浠诲姟涓嬪彂";
     private static final String API_CANCEL_TASK = "鍙栨秷璋冨害浠诲姟";
     private static final String API_CALLBACK_EVENT = "鐘舵�佷笂鎶ュ洖璋�";
@@ -48,11 +49,14 @@
     @Autowired
     private WmsRcsService wmsRcsService;
 
+    @Autowired
+    private RcsTvCallbackService rcsTvCallbackService;
+
     @Resource
     private ObjectMapper objectMapper;
 
     /**
-     * RCS AGV 寮傚父涓婃姤锛氬師鏍锋帴鏀惰姹備綋锛屾墦鏃ュ織锛沨ttp-audit 闇�閰嶇疆 URI 鐧藉悕鍗曡 version/db
+     * RCS AGV 寮傚父涓婃姤锛氭墦鏃ュ織锛涜В鏋� JSON 鍚� SET tvManualErrorMsg锛堣鐩栵級锛沨ttp-audit 瑙� version/db
      */
     @ApiOperation(API_AGV_ERROR)
     @PostMapping("/api/open/agvError")
@@ -65,6 +69,12 @@
                 charset.name(),
                 body.getBytes(charset).length,
                 formatBodyForLog(body));
+        try {
+            JsonNode node = objectMapper.readTree(body);
+            rcsTvCallbackService.publishAgvErrorToTv(node);
+        } catch (Exception e) {
+            log.warn("AGV 寮傚父鏈啓 Redis锛歜ody 闈� JSON", e);
+        }
         return CommonResponse.ok();
     }
 
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/RcsTvCallbackService.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/RcsTvCallbackService.java
index 1abbb22..e515c6e 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/RcsTvCallbackService.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/RcsTvCallbackService.java
@@ -10,6 +10,9 @@
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -80,6 +83,38 @@
         return rcsOk(value);
     }
 
+    /** AGV 寮傚父鏁存鍐欏叆 tvManualErrorMsg锛屽悗娆¤鐩栧墠娆� */
+    public void publishAgvErrorToTv(JsonNode body) {
+        if (body == null || !body.isObject()) {
+            return;
+        }
+        String agvId = text(body.get("agvId"));
+        String faultName = text(body.get("faultName"));
+        String faultNo = text(body.get("faultNo"));
+        if ("undefined".equalsIgnoreCase(faultName)) {
+            faultName = "";
+        }
+        String prefix = StringUtils.hasText(agvId) ? ("銆怉GV" + agvId + "銆�") : "銆怉GV銆�";
+        String desc = StringUtils.hasText(faultName) ? faultName : "寮傚父";
+        StringBuilder sb = new StringBuilder(prefix).append(desc);
+        if (StringUtils.hasText(faultNo)) {
+            sb.append(" ").append(faultNo);
+        }
+        JsonNode tsNode = body.get("timestamp");
+        if (tsNode != null && tsNode.isNumber()) {
+            long ts = tsNode.asLong();
+            if (ts > 0) {
+                sb.append(" ")
+                        .append(Instant.ofEpochMilli(ts)
+                                .atZone(ZoneId.systemDefault())
+                                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            }
+        }
+        String value = sb.toString();
+        tvMonitorStringRedisTemplate.opsForValue().set(TvMonitorRedisKeys.TV_MANUAL_ERROR_MSG, value);
+        log.info("AGV 鎶ヨ宸插啓鍏� Redis tvManualErrorMsg agvId={}", agvId);
+    }
+
     private static JsonNode resolveErrorArray(JsonNode body) {
         if (body == null || body.isNull()) {
             return null;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
index 3f175aa..a11a932 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
@@ -154,10 +154,9 @@
                     }
                     List<TaskItem> items = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
                     for (TaskItem ti : items) {
-                        if (ti.getQty() == null || ti.getQty().compareTo(0.0) <= 0) {
-                            ti.setQty(ti.getAnfme() != null ? ti.getAnfme() : 0.0);
-                        }
-                        taskService.enqueueCloudWmsOutNotifyLogEarly(task, ti, QuantityUtils.toScaledBigDecimal(ti.getQty()));
+                        double cloudOutQty = resolvePickQtyForCloudWmsOut(ti);
+                        ti.setQty(cloudOutQty);
+                        taskService.enqueueCloudWmsOutNotifyLogEarly(task, ti, QuantityUtils.toScaledBigDecimal(cloudOutQty));
                         ti.setUpdateBy(loginUserId);
                         ti.setUpdateTime(new Date());
                         taskItemService.updateById(ti);
@@ -672,6 +671,37 @@
         return R.ok();
     }
 
+    /** 浜戜粨 9.1 鍑哄簱鏁伴噺锛氬凡鎷� qty锛涘惁鍒� workQty銆佽 anfme锛涗笉瓒呰繃閫氱煡鍗曡 anfme锛堥伩鍏嶈鐢ㄦ墭鐩樺簱瀛橈級 */
+    private double resolvePickQtyForCloudWmsOut(TaskItem ti) {
+        WkOrderItem oi = ti.getOrderItemId() != null ? asnOrderItemService.getById(ti.getOrderItemId()) : null;
+        double outQty;
+        if (ti.getQty() != null && QuantityUtils.isPositive(ti.getQty())) {
+            outQty = ti.getQty();
+        } else {
+            outQty = pickQtyFromOrderItemForCloud(oi);
+            if (!QuantityUtils.isPositive(outQty)) {
+                outQty = ti.getAnfme() != null ? ti.getAnfme() : 0.0;
+            }
+        }
+        if (oi != null && oi.getAnfme() != null && QuantityUtils.isPositive(oi.getAnfme())
+                && QuantityUtils.compare(outQty, oi.getAnfme()) > 0) {
+            outQty = oi.getAnfme();
+        }
+        return outQty;
+    }
+
+    private static double pickQtyFromOrderItemForCloud(WkOrderItem oi) {
+        if (oi == null) {
+            return 0.0;
+        }
+        if (oi.getWorkQty() != null && QuantityUtils.isPositive(oi.getWorkQty())) {
+            return oi.getWorkQty();
+        }
+        if (oi.getAnfme() != null && QuantityUtils.isPositive(oi.getAnfme())) {
+            return oi.getAnfme();
+        }
+        return 0.0;
+    }
 
     /**
      * 娉㈡鎷h揣锛氫换鍔℃槑缁嗕笌璁㈠崟琛屽搴旓紙orderItemId 浼樺厛锛屽惁鍒欒鍐呯爜 platItemId锛夛紝閬垮厤鍚屽崟鍚屾枡澶氳鍙懡涓竴鏉�
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index 48b828f..36f9df2 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -994,8 +994,11 @@
         if (!taskService.updateById(task)) {
             throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
         }
-        // 9.1 鍏�/鍑哄簱缁撴灉涓婃姤锛氭嫞鏂欏啀鍏ュ簱/鐩樼偣鍐嶅叆搴撳畬鎴愬悗閫氱煡浜戜粨锛堜笌瀹氭椂浠诲姟闂幆涓�鑷达級
-        reportInOutResultToCloud(task, loc, taskItems, null, true);
+        // 鐩樼偣鍐嶅叆搴撲笂鎶ヤ簯浠撳叆搴撳畬鎴愶紱鎷f枡鍐嶅叆搴撹烦杩囷紙鍏ュ簱渚� qty 鍙� anfme 涓烘墭鐩樹綑閲忥紱浜戜粨鍑哄簱瀹炲彂鍦ㄥ嚭搴撳畬鎴愪晶锛�
+        // reportInOutResultToCloud(task, loc, taskItems, null, true);
+        if (!TaskType.TASK_TYPE_PICK_IN.type.equals(task.getTaskType())) {
+            reportInOutResultToCloud(task, loc, taskItems, null, true);
+        }
     }
 
     /**

--
Gitblit v1.9.1