fix(sync): 修复用户同步到 websopy 的数据格式及完整性问题

- 修正同步数据中的 tenant 字段名称为 tenant_id 以匹配 websopy 数据库字段
- 增加 tenantId 值的日志输出便于调试和校验
- 在 wx 官方控制器同步用户时先从数据库重新加载用户数据,保证同步数据完整性
- 若重新加载失败则回退使用当前用户对象进行同步
- 优化用户角色保存后同步操作的可靠性和准确性
This commit is contained in:
2026-04-07 01:38:11 +08:00
parent 03c94624d0
commit 3c89cbce40

View File

@@ -27,6 +27,22 @@ import java.util.Map;
@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<String, String> headers = new HashMap<>();