fix(sync): 修复用户同步到 websopy 的数据格式及完整性问题
- 修正同步数据中的 tenant 字段名称为 tenant_id 以匹配 websopy 数据库字段 - 增加 tenantId 值的日志输出便于调试和校验 - 在 wx 官方控制器同步用户时先从数据库重新加载用户数据,保证同步数据完整性 - 若重新加载失败则回退使用当前用户对象进行同步 - 优化用户角色保存后同步操作的可靠性和准确性
This commit is contained in:
@@ -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<>();
|
||||
|
||||
Reference in New Issue
Block a user