From 3c89cbce400c2114b692edbd572e64cc37e48c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Tue, 7 Apr 2026 01:38:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(sync):=20=E4=BF=AE=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=90=8C=E6=AD=A5=E5=88=B0=20websopy=20=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=A0=BC=E5=BC=8F=E5=8F=8A=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修正同步数据中的 tenant 字段名称为 tenant_id 以匹配 websopy 数据库字段 - 增加 tenantId 值的日志输出便于调试和校验 - 在 wx 官方控制器同步用户时先从数据库重新加载用户数据,保证同步数据完整性 - 若重新加载失败则回退使用当前用户对象进行同步 - 优化用户角色保存后同步操作的可靠性和准确性 --- .../system/service/UserSyncService.java | 53 +++++++++++++------ 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/gxwebsoft/common/system/service/UserSyncService.java b/src/main/java/com/gxwebsoft/common/system/service/UserSyncService.java index 4c42d5b..d6cdbca 100644 --- a/src/main/java/com/gxwebsoft/common/system/service/UserSyncService.java +++ b/src/main/java/com/gxwebsoft/common/system/service/UserSyncService.java @@ -26,6 +26,22 @@ import java.util.Map; @Slf4j @Service public class UserSyncService { + + /** + * 转义JSON字符串中的特殊字符 + */ + private String escapeJson(String str) { + if (str == null) { + return ""; + } + return str.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\b", "\\b") + .replace("\f", "\\f") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t"); + } @Resource private ConfigProperties configProperties; @@ -55,29 +71,32 @@ public class UserSyncService { } try { - // 构建请求体 - JSONObject userCache = new JSONObject(); - userCache.put("userId", user.getUserId()); - userCache.put("username", user.getUsername()); - userCache.put("nickname", user.getNickname()); - userCache.put("avatar", user.getAvatar()); - userCache.put("phone", user.getPhone()); - userCache.put("status", user.getStatus()); - userCache.put("updateTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - // tenantId 可能为 null,但在 websopy 端是必填字段,至少传 0 - // 注意:websopy 端数据库字段是 tenant_id(下划线),不是 tenantId(驼峰) + // 构建请求体 - 使用手动JSON构建确保字段正确 Integer tenantIdValue = user.getTenantId() != null ? user.getTenantId() : 0; - userCache.put("tenant_id", tenantIdValue); - + + // 构建JSON字符串,确保tenant_id字段存在且不为null + StringBuilder jsonBuilder = new StringBuilder(); + jsonBuilder.append("{"); + jsonBuilder.append("\"userId\":").append(user.getUserId()).append(","); + jsonBuilder.append("\"username\":\"").append(escapeJson(user.getUsername())).append("\","); + jsonBuilder.append("\"nickname\":\"").append(escapeJson(user.getNickname())).append("\","); + jsonBuilder.append("\"avatar\":\"").append(escapeJson(user.getAvatar())).append("\","); + jsonBuilder.append("\"phone\":\"").append(escapeJson(user.getPhone())).append("\","); + jsonBuilder.append("\"status\":").append(user.getStatus()).append(","); + jsonBuilder.append("\"updateTime\":\"").append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))).append("\","); + jsonBuilder.append("\"tenantId\":").append(tenantIdValue).append(","); // 驼峰格式 + jsonBuilder.append("\"tenant_id\":").append(tenantIdValue); // 下划线格式 + jsonBuilder.append("}"); + String url = websopyBaseUrl + "/api/app/user-sync/single"; - String body = userCache.toJSONString(); + String body = jsonBuilder.toString(); log.info("同步用户到 websopy: userId={}, username={}, nickname={}, phone={}, tenantId={}, url={}", user.getUserId(), user.getUsername(), user.getNickname(), user.getPhone(), user.getTenantId(), url); - log.debug("同步用户请求体: {}", body); + log.info("同步用户请求体JSON: {}", body); // 改为info级别以便查看 // 额外日志:tenantId 值检查 - log.debug("tenantId检查 - 原始值: {}, 转换后值: {}, 请求体中tenant_id字段: {}", - user.getTenantId(), tenantIdValue, userCache.get("tenant_id")); + log.debug("tenantId检查 - 原始值: {}, 转换后值: {}", + user.getTenantId(), tenantIdValue); // 发送 HTTP POST 请求 Map headers = new HashMap<>();