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