From 4d15e6b553c448e2e07527e9c06aa4b5f9b099cf Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期五, 11 九月 2026 16:51:18 +0800
Subject: [PATCH] update

---
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/service/VisitorRegisterSyncService.java |  115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 110 insertions(+), 5 deletions(-)

diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/service/VisitorRegisterSyncService.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/service/VisitorRegisterSyncService.java
index 51f0e3a..807f463 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/service/VisitorRegisterSyncService.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/service/VisitorRegisterSyncService.java
@@ -19,6 +19,7 @@
 import java.time.format.DateTimeFormatter;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
@@ -32,8 +33,12 @@
     @Value("${visitor.sync.url:}")
     private String syncUrl;
 
-    @Value("${visitor.sync.enabled:}")
+    @Value("${visitor.sync.enabled:false}")
     private Boolean syncEnabled;
+
+    /** 中台访客状态更新地址;未配置时由登记地址自动推导。 */
+    @Value("${visitor.sync.status-url:}")
+    private String statusUrl;
 
     private final ObjectMapper objectMapper = new ObjectMapper();
 
@@ -48,7 +53,7 @@
      */
     public AjaxResult syncVisitorRegister(SysVisitorRecord record) {
         // 检查同步开关
-        if (!syncEnabled) {
+        if (!Boolean.TRUE.equals(syncEnabled)) {
             log.info("访客登记同步已关闭,跳过同步");
             return AjaxResult.success("同步功能未开启");
         }
@@ -80,8 +85,15 @@
             boolean success = jsonNode.has("success") && jsonNode.get("success").asBoolean();
 
             if (success) {
-                String remoteId = jsonNode.has("data") && jsonNode.get("data").has("id")
-                        ? jsonNode.get("data").get("id").asText() : null;
+                JsonNode dataNode = jsonNode.get("data");
+                String remoteId = null;
+                if (dataNode != null) {
+                    if (dataNode.isObject() && dataNode.has("id")) {
+                        remoteId = dataNode.get("id").asText();
+                    } else if (dataNode.isValueNode()) {
+                        remoteId = dataNode.asText();
+                    }
+                }
                 log.info("访客登记同步成功,远程ID:{}", remoteId);
                 return AjaxResult.success(remoteId);
             } else {
@@ -93,6 +105,70 @@
         } catch (Exception e) {
             log.error("访客登记同步异常", e);
             return AjaxResult.error("同步异常:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 将本地签离状态同步到事件中心。
+     *
+     * <p>状态同步采用尽力而为策略:中台不可用时保留本地签离结果,避免访客机因网络问题无法完成签离。</p>
+     */
+    public AjaxResult syncVisitorStatus(SysVisitorRecord record) {
+        if (!Boolean.TRUE.equals(syncEnabled)) {
+            return AjaxResult.success("访客状态同步已关闭");
+        }
+        if (record == null || StringUtils.isBlank(record.getMiddlePlatformId())) {
+            log.warn("访客状态同步跳过:缺少中台访客登记记录ID,本地recordId={}",
+                    record == null ? null : record.getRecordId());
+            return AjaxResult.warn("缺少中台访客登记记录ID");
+        }
+
+        String middleStatus = toMiddleStatus(record.getStatus());
+        if (middleStatus == null) {
+            log.info("访客状态 {} 无需同步到中台,middlePlatformId={}",
+                    record.getStatus(), record.getMiddlePlatformId());
+            return AjaxResult.success("当前状态无需同步");
+        }
+
+        String targetUrl = resolveStatusUrl();
+        if (StringUtils.isBlank(targetUrl)) {
+            log.warn("访客状态同步跳过:未配置中台状态更新地址");
+            return AjaxResult.warn("中台状态更新地址未配置");
+        }
+
+        try {
+            Map<String, Object> requestBody = new LinkedHashMap<>();
+            requestBody.put("id", record.getMiddlePlatformId());
+            requestBody.put("status", middleStatus);
+            if (record.getSignTime() != null) {
+                requestBody.put("signOutTime", formatTime(record.getSignTime()));
+            }
+
+            String jsonBody = objectMapper.writeValueAsString(requestBody);
+            log.info("同步访客状态到中台:middlePlatformId={}, status={}, signOutTime={}",
+                    record.getMiddlePlatformId(), middleStatus, requestBody.get("signOutTime"));
+
+            HttpResponse response = HttpRequest.post(targetUrl)
+                    .header("Content-Type", ContentType.JSON.getValue())
+                    .body(jsonBody)
+                    .timeout(30000)
+                    .execute();
+            String responseBody = response.body();
+            JsonNode jsonNode = objectMapper.readTree(responseBody);
+            boolean success = jsonNode.has("success") && jsonNode.get("success").asBoolean();
+            if (success) {
+                return AjaxResult.success("访客状态同步成功");
+            }
+
+            String errorMessage = jsonNode.has("description")
+                    ? jsonNode.get("description").asText() : "中台访客状态更新失败";
+            log.error("中台访客状态更新失败,middlePlatformId={}, status={}, message={}",
+                    record.getMiddlePlatformId(), middleStatus, errorMessage);
+            return AjaxResult.error(errorMessage);
+        } catch (Exception e) {
+            log.error("中台访客状态同步异常,middlePlatformId={}, status={}",
+                    record.getMiddlePlatformId(), middleStatus, e);
+            return AjaxResult.error("中台状态同步异常:" + e.getMessage());
         }
     }
 
@@ -133,6 +209,35 @@
          params.put("pic", record.getFaceImageUrl());
 
         return params;
+    }
+
+    /** 根据登记接口地址推导同一事件中心下的状态更新接口。 */
+    private String resolveStatusUrl() {
+        if (StringUtils.isNotBlank(statusUrl)) {
+            return statusUrl.trim();
+        }
+        if (StringUtils.isBlank(syncUrl)) {
+            return null;
+        }
+        String registerPath = "/visitor-register";
+        if (syncUrl.contains(registerPath)) {
+            return syncUrl.replace(registerPath, "/visitor-status-update");
+        }
+        return null;
+    }
+
+    /** 将本地状态转换为事件中心字典值。 */
+    private String toMiddleStatus(String status) {
+        if ("SIGNED_OUT".equals(status)) {
+            return "6";
+        }
+        if ("OVERDUE_AUTO_SIGNED_OUT".equals(status)) {
+            return "5";
+        }
+        if ("PENDING_CONFIRM".equals(status)) {
+            return "7";
+        }
+        return null;
     }
 
     /**
@@ -188,4 +293,4 @@
         String registerNo = record.getRegisterNo();
         return String.format("vms:visitor:%s:%s", dateStr, registerNo);
     }
-}
\ No newline at end of file
+}

--
Gitblit v1.7.1