From 516198ab53d12253839530614e41388d203378ee Mon Sep 17 00:00:00 2001
From: hewencai <2357300448@qq.com>
Date: Wed, 24 Dec 2025 10:36:00 +0800
Subject: [PATCH] =?UTF-8?q?update=EF=BC=9A=E8=B0=83=E6=95=B4=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E5=90=8C=E6=AD=A5=E7=94=A8=E6=88=B7-=E9=83=A8?=
=?UTF-8?q?=E9=97=A8=EF=BC=8C=E7=94=A8=E6=88=B7-=E5=B2=97=E4=BD=8D?=
=?UTF-8?q?=E5=90=8C=E6=AD=A5=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../core/consumer/DatabusClientConsumer.java | 7 +-
.../handler/dept/DeptSyncServiceImpl.java | 25 ++---
.../handler/post/PostSyncServiceImpl.java | 23 +---
.../user/AdminUserSyncServiceImpl.java | 19 +---
.../userdept/UserDeptSyncServiceImpl.java | 19 +---
.../userpost/UserPostSyncServiceImpl.java | 19 +---
.../plat/module/system/api/dept/DeptApi.java | 6 +
.../plat/module/system/api/dept/PostApi.java | 6 +
.../system/api/dept/dto/DeptSaveReqDTO.java | 15 +++
.../module/system/api/user/AdminUserApi.java | 6 +
.../api/user/dto/AdminUserSaveReqDTO.java | 6 +
.../system/api/userdept/UserDeptApi.java | 6 +
.../system/api/userpost/UserPostApi.java | 6 +
.../DatabusUserDeptProviderApiImpl.java | 6 +-
.../module/system/api/dept/DeptApiImpl.java | 9 ++
.../module/system/api/dept/PostApiImpl.java | 8 +-
.../system/api/user/AdminUserApiImpl.java | 7 ++
.../system/api/userdept/UserDeptApiImpl.java | 88 +++++++++++++++
.../system/api/userpost/UserPostApiImpl.java | 106 ++++++++++++++++++
.../system/dal/mysql/dept/DeptMapper.java | 7 +-
.../system/service/dept/DeptService.java | 11 ++
.../system/service/dept/DeptServiceImpl.java | 37 ++++++
.../system/service/dept/PostService.java | 4 +
.../system/service/dept/PostServiceImpl.java | 21 ++++
.../system/service/user/AdminUserService.java | 4 +
.../service/user/AdminUserServiceImpl.java | 44 ++++++++
.../service/userdept/UserDeptService.java | 3 +
.../service/userdept/UserDeptServiceImpl.java | 20 +++-
28 files changed, 460 insertions(+), 78 deletions(-)
create mode 100644 zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/userdept/UserDeptApiImpl.java
create mode 100644 zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/userpost/UserPostApiImpl.java
diff --git a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/core/consumer/DatabusClientConsumer.java b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/core/consumer/DatabusClientConsumer.java
index 4a7c5cdb..0000776e 100644
--- a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/core/consumer/DatabusClientConsumer.java
+++ b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/core/consumer/DatabusClientConsumer.java
@@ -13,7 +13,7 @@ import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
-
+import com.zt.plat.framework.tenant.core.context.TenantContextHolder;
/**
* DataBus 客户端统一消费者
*
@@ -33,8 +33,8 @@ import org.springframework.stereotype.Component;
@Component
@ConditionalOnProperty(prefix = "zt.databus.sync.client", name = "enabled", havingValue = "true")
@RocketMQMessageListener(
- topic = "${zt.databus.sync.client.mq.topic:databus-sync}-${zt.databus.sync.client.client-code}",
- consumerGroup = "${zt.databus.sync.client.mq.consumer-group:databus-client-consumer}-${zt.databus.sync.client.client-code}"
+ topic = "${zt.databus.sync.client.mq.topic-base:databus-sync}-${zt.databus.sync.client.client-code}",
+ consumerGroup = "${zt.databus.sync.client.mq.consumer-group-prefix:databus-client-consumer}-${zt.databus.sync.client.client-code}"
)
public class DatabusClientConsumer implements RocketMQListener {
@@ -46,6 +46,7 @@ public class DatabusClientConsumer implements RocketMQListener {
log.debug("[DatabusClient] 收到消息, body={}", body);
try {
+ TenantContextHolder.setTenantId(1L);
// 1. 解析消息获取 eventType
DatabusEventType eventType = parseEventType(body);
if (eventType == null) {
diff --git a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/dept/DeptSyncServiceImpl.java b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/dept/DeptSyncServiceImpl.java
index ca760435..00d9913a 100644
--- a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/dept/DeptSyncServiceImpl.java
+++ b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/dept/DeptSyncServiceImpl.java
@@ -69,21 +69,15 @@ public class DeptSyncServiceImpl implements DeptSyncService {
return;
}
DeptSaveReqDTO dto = buildDeptDTO(data);
+
+ // 使用专用同步接口,跳过业务校验,直接 upsert
try {
- // 尝试获取,存在则更新,不存在则创建
- var existing = deptApi.getDept(dto.getId());
- if (existing.isSuccess() && existing.getData() != null) {
- deptApi.updateDept(dto).checkError();
- log.info("[DeptSync] 部门全量同步-更新成功, deptId={}", dto.getId());
- } else {
- deptApi.createDept(dto).checkError();
- log.info("[DeptSync] 部门全量同步-创建成功, deptId={}", dto.getId());
- }
+ deptApi.syncDept(dto).checkError();
+ log.info("[DeptSync] 部门全量同步成功, deptId={}, deptName={}", dto.getId(), dto.getName());
} catch (Exception e) {
- // 获取失败,尝试创建
- log.warn("[DeptSync] 部门获取失败,尝试创建, deptId={}", dto.getId());
- deptApi.createDept(dto).checkError();
- log.info("[DeptSync] 部门全量同步-创建成功, deptId={}", dto.getId());
+ log.error("[DeptSync] 部门全量同步失败, deptId={}, deptName={}, parentId={}, code={}, error={}",
+ dto.getId(), dto.getName(), dto.getParentId(), dto.getCode(), e.getMessage());
+ throw e;
}
}
@@ -93,13 +87,18 @@ public class DeptSyncServiceImpl implements DeptSyncService {
private DeptSaveReqDTO buildDeptDTO(DatabusDeptData data) {
DeptSaveReqDTO dto = new DeptSaveReqDTO();
dto.setId(data.getId());
+ dto.setCode(data.getCode()); // ⚠️ 重要:传递编码,保持一致
dto.setName(data.getName());
+ dto.setShortName(data.getShortName());
dto.setParentId(data.getParentId());
dto.setSort(data.getSort());
dto.setLeaderUserId(data.getLeaderUserId());
dto.setPhone(data.getPhone());
dto.setEmail(data.getEmail());
dto.setStatus(data.getStatus());
+ dto.setIsGroup(data.getIsGroup());
+ dto.setIsCompany(data.getIsCompany());
+ dto.setDeptSource(data.getDeptSource());
return dto;
}
}
diff --git a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/post/PostSyncServiceImpl.java b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/post/PostSyncServiceImpl.java
index 463fdc6e..6ad68f2e 100644
--- a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/post/PostSyncServiceImpl.java
+++ b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/post/PostSyncServiceImpl.java
@@ -68,25 +68,14 @@ public class PostSyncServiceImpl implements PostSyncService {
return;
}
PostSaveReqDTO dto = buildPostDTO(data);
+
try {
- // 尝试获取,存在则更新,不存在则创建
- var existing = postApi.getPost(dto.getId());
- if (existing.isSuccess() && existing.getData() != null) {
- postApi.updatePost(dto).checkError();
- log.info("[PostSync] 岗位全量同步-更新成功, postId={}, postName={}", dto.getId(), dto.getName());
- } else {
- postApi.createPost(dto).checkError();
- log.info("[PostSync] 岗位全量同步-创建成功, postId={}, postName={}", dto.getId(), dto.getName());
- }
+ postApi.syncPost(dto).checkError();
+ log.info("[PostSync] 岗位全量同步成功, postId={}, postName={}", dto.getId(), dto.getName());
} catch (Exception e) {
- // 获取失败,尝试创建
- try {
- postApi.createPost(dto).checkError();
- log.info("[PostSync] 岗位全量同步-创建成功, postId={}, postName={}", dto.getId(), dto.getName());
- } catch (Exception createEx) {
- log.error("[PostSync] 岗位全量同步失败, postId={}, postName={}", dto.getId(), dto.getName(), createEx);
- throw createEx;
- }
+ log.error("[PostSync] 岗位全量同步失败, postId={}, postName={}, code={}, error={}",
+ dto.getId(), dto.getName(), dto.getCode(), e.getMessage());
+ throw e;
}
}
diff --git a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/user/AdminUserSyncServiceImpl.java b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/user/AdminUserSyncServiceImpl.java
index d40cfd51..a0b239df 100644
--- a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/user/AdminUserSyncServiceImpl.java
+++ b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/user/AdminUserSyncServiceImpl.java
@@ -72,21 +72,14 @@ public class AdminUserSyncServiceImpl implements AdminUserSyncService {
return;
}
AdminUserSaveReqDTO dto = buildUserDTO(data);
+
try {
- // 尝试获取,存在则更新,不存在则创建
- var existing = adminUserApi.getUser(dto.getId());
- if (existing.isSuccess() && existing.getData() != null) {
- adminUserApi.updateUser(dto).checkError();
- log.info("[UserSync] 用户全量同步-更新成功, userId={}", dto.getId());
- } else {
- adminUserApi.createUser(dto).checkError();
- log.info("[UserSync] 用户全量同步-创建成功, userId={}", dto.getId());
- }
+ adminUserApi.syncUser(dto).checkError();
+ log.info("[UserSync] 用户全量同步成功, userId={}, username={}", dto.getId(), dto.getUsername());
} catch (Exception e) {
- // 获取失败,尝试创建
- log.warn("[UserSync] 用户获取失败,尝试创建, userId={}", dto.getId());
- adminUserApi.createUser(dto).checkError();
- log.info("[UserSync] 用户全量同步-创建成功, userId={}", dto.getId());
+ log.error("[UserSync] 用户全量同步失败, userId={}, username={}, error={}",
+ dto.getId(), dto.getUsername(), e.getMessage());
+ throw e;
}
}
diff --git a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/userdept/UserDeptSyncServiceImpl.java b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/userdept/UserDeptSyncServiceImpl.java
index 04f16ae4..36914af0 100644
--- a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/userdept/UserDeptSyncServiceImpl.java
+++ b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/userdept/UserDeptSyncServiceImpl.java
@@ -70,20 +70,13 @@ public class UserDeptSyncServiceImpl implements UserDeptSyncService {
}
UserDeptSaveReqDTO dto = buildUserDeptDTO(data);
try {
- // 尝试获取,存在则更新,不存在则创建
- var existing = userDeptApi.getUserDept(dto.getId());
- if (existing.isSuccess() && existing.getData() != null) {
- userDeptApi.updateUserDept(dto).checkError();
- log.info("[UserDeptSync] 用户-部门关系全量同步-更新成功, id={}", dto.getId());
- } else {
- userDeptApi.createUserDept(dto).checkError();
- log.info("[UserDeptSync] 用户-部门关系全量同步-创建成功, id={}", dto.getId());
- }
+ userDeptApi.syncUserDept(dto).checkError();
+ log.info("[UserDeptSync] 用户-部门关系全量同步成功, id={}, userId={}, deptId={}",
+ dto.getId(), dto.getUserId(), dto.getDeptId());
} catch (Exception e) {
- // 获取失败,尝试创建
- log.warn("[UserDeptSync] 用户-部门关系获取失败,尝试创建, id={}", dto.getId());
- userDeptApi.createUserDept(dto).checkError();
- log.info("[UserDeptSync] 用户-部门关系全量同步-创建成功, id={}", dto.getId());
+ log.error("[UserDeptSync] 用户-部门关系全量同步失败, id={}, userId={}, deptId={}, error={}",
+ dto.getId(), dto.getUserId(), dto.getDeptId(), e.getMessage());
+ throw e;
}
}
diff --git a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/userpost/UserPostSyncServiceImpl.java b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/userpost/UserPostSyncServiceImpl.java
index 01eb2b4b..47251092 100644
--- a/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/userpost/UserPostSyncServiceImpl.java
+++ b/zt-framework/zt-spring-boot-starter-databus-client/src/main/java/com/zt/plat/framework/databus/client/handler/userpost/UserPostSyncServiceImpl.java
@@ -70,20 +70,13 @@ public class UserPostSyncServiceImpl implements UserPostSyncService {
}
UserPostSaveReqDTO dto = buildUserPostDTO(data);
try {
- // 尝试获取,存在则更新,不存在则创建
- var existing = userPostApi.getUserPost(dto.getId());
- if (existing.isSuccess() && existing.getData() != null) {
- userPostApi.updateUserPost(dto).checkError();
- log.info("[UserPostSync] 用户-岗位关系全量同步-更新成功, id={}", dto.getId());
- } else {
- userPostApi.createUserPost(dto).checkError();
- log.info("[UserPostSync] 用户-岗位关系全量同步-创建成功, id={}", dto.getId());
- }
+ userPostApi.syncUserPost(dto).checkError();
+ log.info("[UserPostSync] 用户-岗位关系全量同步成功, id={}, userId={}, postId={}",
+ dto.getId(), dto.getUserId(), dto.getPostId());
} catch (Exception e) {
- // 获取失败,尝试创建
- log.warn("[UserPostSync] 用户-岗位关系获取失败,尝试创建, id={}", dto.getId());
- userPostApi.createUserPost(dto).checkError();
- log.info("[UserPostSync] 用户-岗位关系全量同步-创建成功, id={}", dto.getId());
+ log.error("[UserPostSync] 用户-岗位关系全量同步失败, id={}, userId={}, postId={}, error={}",
+ dto.getId(), dto.getUserId(), dto.getPostId(), e.getMessage());
+ throw e;
}
}
diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/DeptApi.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/DeptApi.java
index eea5499e..abc53972 100644
--- a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/DeptApi.java
+++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/DeptApi.java
@@ -86,4 +86,10 @@ public interface DeptApi {
@Parameter(name = "userId", description = "用户编号", example = "1", required = true)
CommonResult> getCompanyDeptInfoListByUserId(@RequestParam("userId") Long userId);
+ // ========== 数据同步专用接口 ==========
+
+ @PostMapping(PREFIX + "/sync")
+ @Operation(summary = "同步部门")
+ CommonResult syncDept(@RequestBody DeptSaveReqDTO syncReqDTO);
+
}
diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/PostApi.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/PostApi.java
index fed71544..4ef8bd45 100644
--- a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/PostApi.java
+++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/PostApi.java
@@ -64,4 +64,10 @@ public interface PostApi {
return CollectionUtils.convertMap(list, PostRespDTO::getId);
}
+ // ========== 数据同步专用接口 ==========
+
+ @PostMapping(PREFIX + "/sync")
+ @Operation(summary = "同步岗位")
+ CommonResult syncPost(@RequestBody PostSaveReqDTO syncReqDTO);
+
}
diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/dto/DeptSaveReqDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/dto/DeptSaveReqDTO.java
index fbb311cc..b01a712d 100644
--- a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/dto/DeptSaveReqDTO.java
+++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/dto/DeptSaveReqDTO.java
@@ -15,9 +15,15 @@ public class DeptSaveReqDTO {
@Schema(description = "部门编号", example = "1024")
private Long id;
+ @Schema(description = "部门编码", example = "ZT001")
+ private String code;
+
@Schema(description = "部门名称", example = "ZT")
private String name;
+ @Schema(description = "部门简称", example = "技术")
+ private String shortName;
+
@Schema(description = "父部门 ID", example = "1024")
private Long parentId;
@@ -36,6 +42,15 @@ public class DeptSaveReqDTO {
@Schema(description = "状态,见 CommonStatusEnum 枚举0 开启 1 关闭", example = "0")
private Integer status;
+ @Schema(description = "是否集团", example = "false")
+ private Boolean isGroup;
+
+ @Schema(description = "是否公司", example = "false")
+ private Boolean isCompany;
+
+ @Schema(description = "部门来源类型", example = "1")
+ private Integer deptSource;
+
@Schema(description = "外部系统标识,用于建立编码映射", example = "ERP")
private String externalSystemCode;
diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/user/AdminUserApi.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/user/AdminUserApi.java
index 02443415..293608b8 100644
--- a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/user/AdminUserApi.java
+++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/user/AdminUserApi.java
@@ -104,6 +104,12 @@ public interface AdminUserApi extends AutoTransable {
@Parameter(name = "ids", description = "用户编号数组", example = "3,5", required = true)
CommonResult validateUserList(@RequestParam("ids") Collection ids);
+ // ========== 数据同步专用接口 ==========
+
+ @PostMapping(PREFIX + "/sync")
+ @Operation(summary = "同步用户")
+ CommonResult syncUser(@RequestBody AdminUserSaveReqDTO syncReqDTO);
+
@Override
@FeignIgnore
default List selectByIds(List> ids) {
diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/user/dto/AdminUserSaveReqDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/user/dto/AdminUserSaveReqDTO.java
index 4e4a30c2..691f5204 100644
--- a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/user/dto/AdminUserSaveReqDTO.java
+++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/user/dto/AdminUserSaveReqDTO.java
@@ -50,4 +50,10 @@ public class AdminUserSaveReqDTO {
@Schema(description = "密码", example = "123456")
private String password;
+ @Schema(description = "工号", example = "A00123")
+ private String workcode;
+
+ @Schema(description = "用户来源类型", example = "1")
+ private Integer userSource;
+
}
\ No newline at end of file
diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/userdept/UserDeptApi.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/userdept/UserDeptApi.java
index d48c6b69..050216ae 100644
--- a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/userdept/UserDeptApi.java
+++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/userdept/UserDeptApi.java
@@ -61,4 +61,10 @@ public interface UserDeptApi {
@Operation(summary = "通过部门ID删除用户部门关系")
@Parameter(name = "deptId", description = "部门编号", example = "1", required = true)
CommonResult deleteUserDeptByDeptId(@RequestParam("deptId") Long deptId);
+
+ // ========== 数据同步专用接口 ==========
+
+ @PostMapping(PREFIX + "/sync")
+ @Operation(summary = "同步用户部门关系")
+ CommonResult syncUserDept(@RequestBody UserDeptSaveReqDTO syncReqDTO);
}
diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/userpost/UserPostApi.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/userpost/UserPostApi.java
index a58e09cb..d72e4706 100644
--- a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/userpost/UserPostApi.java
+++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/userpost/UserPostApi.java
@@ -61,4 +61,10 @@ public interface UserPostApi {
@Operation(summary = "通过岗位ID删除用户岗位关系")
@Parameter(name = "postId", description = "岗位编号", example = "1", required = true)
CommonResult deleteUserPostByPostId(@RequestParam("postId") Long postId);
+
+ // ========== 数据同步专用接口 ==========
+
+ @PostMapping(PREFIX + "/sync")
+ @Operation(summary = "同步用户岗位关系")
+ CommonResult syncUserPost(@RequestBody UserPostSaveReqDTO syncReqDTO);
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/databus/DatabusUserDeptProviderApiImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/databus/DatabusUserDeptProviderApiImpl.java
index 3a461df9..efbe2e1d 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/databus/DatabusUserDeptProviderApiImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/databus/DatabusUserDeptProviderApiImpl.java
@@ -38,7 +38,7 @@ public class DatabusUserDeptProviderApiImpl implements DatabusUserDeptProviderAp
// 多查一条判断是否有更多数据
int limit = reqDTO.getBatchSize() != null ? reqDTO.getBatchSize() : 100;
- // ⚠️ 使用关联查询,只查询 userSource = 2 的用户的部门关系
+ // 查询用户部门关系
List list = userDeptMapper.selectPageByCursorWithUserSource(
reqDTO.isFirstPage() ? null : reqDTO.getCursorTime(),
reqDTO.isFirstPage() ? null : reqDTO.getCursorId(),
@@ -67,7 +67,7 @@ public class DatabusUserDeptProviderApiImpl implements DatabusUserDeptProviderAp
// 首次查询时返���总数
Long total = null;
if (reqDTO.isFirstPage()) {
- // ⚠️ 只统计 userSource = 2 的用户的部门关系
+ // 统计用户部门关系
total = userDeptMapper.countWithUserSource(reqDTO.getTenantId());
}
@@ -107,7 +107,7 @@ public class DatabusUserDeptProviderApiImpl implements DatabusUserDeptProviderAp
@Override
public CommonResult count(Long tenantId) {
- // ⚠️ 只统计 userSource = 2 的用户的部门关系
+ // 统计用户部门关系
return success(userDeptMapper.countWithUserSource(tenantId));
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/dept/DeptApiImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/dept/DeptApiImpl.java
index d06b79a6..bed2d2b6 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/dept/DeptApiImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/dept/DeptApiImpl.java
@@ -107,4 +107,13 @@ public class DeptApiImpl implements DeptApi {
return success(BeanUtils.toBean(companyDeptInfos, CompanyDeptInfoRespDTO.class));
}
+ // ========== 数据同步专用接口 ==========
+
+ @Override
+ public CommonResult syncDept(DeptSaveReqDTO syncReqDTO) {
+ DeptSaveReqVO reqVO = BeanUtils.toBean(syncReqDTO, DeptSaveReqVO.class);
+ deptService.syncDept(reqVO);
+ return success(true);
+ }
+
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/dept/PostApiImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/dept/PostApiImpl.java
index 97cf029e..bb760ec4 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/dept/PostApiImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/dept/PostApiImpl.java
@@ -38,7 +38,6 @@ public class PostApiImpl implements PostApi {
@Override
public CommonResult updatePost(PostSaveReqDTO updateReqVO) {
- log.error("ssssssssss");
PostSaveReqVO reqVO = BeanUtils.toBean(updateReqVO, PostSaveReqVO.class);
postService.updatePost(reqVO);
return success(true);
@@ -76,4 +75,11 @@ public class PostApiImpl implements PostApi {
return success(BeanUtils.toBean(list, PostRespDTO.class));
}
+ @Override
+ public CommonResult syncPost(PostSaveReqDTO syncReqDTO) {
+ PostSaveReqVO reqVO = BeanUtils.toBean(syncReqDTO, PostSaveReqVO.class);
+ postService.syncPost(reqVO);
+ return success(true);
+ }
+
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/user/AdminUserApiImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/user/AdminUserApiImpl.java
index a80db06e..523e432a 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/user/AdminUserApiImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/user/AdminUserApiImpl.java
@@ -149,4 +149,11 @@ public class AdminUserApiImpl implements AdminUserApi {
return success(true);
}
+ @Override
+ public CommonResult syncUser(AdminUserSaveReqDTO syncReqDTO) {
+ UserSaveReqVO reqVO = BeanUtils.toBean(syncReqDTO, UserSaveReqVO.class);
+ userService.syncUser(reqVO);
+ return success(true);
+ }
+
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/userdept/UserDeptApiImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/userdept/UserDeptApiImpl.java
new file mode 100644
index 00000000..91b30187
--- /dev/null
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/userdept/UserDeptApiImpl.java
@@ -0,0 +1,88 @@
+package com.zt.plat.module.system.api.userdept;
+
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import com.zt.plat.module.system.api.userdept.dto.UserDeptRespDTO;
+import com.zt.plat.module.system.api.userdept.dto.UserDeptSaveReqDTO;
+import com.zt.plat.module.system.dal.dataobject.userdept.UserDeptDO;
+import com.zt.plat.module.system.service.userdept.UserDeptService;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+/**
+ * 用户-部门关系 API 实现类
+ *
+ * @author ZT
+ */
+@Slf4j
+@RestController
+@Validated
+public class UserDeptApiImpl implements UserDeptApi {
+
+ @Resource
+ private UserDeptService userDeptService;
+
+ @Override
+ public CommonResult createUserDept(UserDeptSaveReqDTO reqVO) {
+ UserDeptDO userDept = BeanUtils.toBean(reqVO, UserDeptDO.class);
+ Long id = userDeptService.createUserDept(userDept);
+ return success(id);
+ }
+
+ @Override
+ public CommonResult updateUserDept(UserDeptSaveReqDTO reqVO) {
+ UserDeptDO userDept = BeanUtils.toBean(reqVO, UserDeptDO.class);
+ userDeptService.updateUserDept(userDept);
+ return success(true);
+ }
+
+ @Override
+ public CommonResult deleteUserDept(Long id) {
+ userDeptService.deleteUserDept(id);
+ return success(true);
+ }
+
+ @Override
+ public CommonResult getUserDept(Long id) {
+ UserDeptDO userDept = userDeptService.getUserDept(id);
+ return success(BeanUtils.toBean(userDept, UserDeptRespDTO.class));
+ }
+
+ @Override
+ public CommonResult> getUserDeptListByUserId(Long userId) {
+ List list = userDeptService.getValidUserDeptListByUserIds(List.of(userId));
+ return success(BeanUtils.toBean(list, UserDeptRespDTO.class));
+ }
+
+ @Override
+ public CommonResult> getUserDeptListByDeptId(Long deptId) {
+ List list = userDeptService.getValidUserDeptListByDeptIds(List.of(deptId));
+ return success(BeanUtils.toBean(list, UserDeptRespDTO.class));
+ }
+
+ @Override
+ public CommonResult deleteUserDeptByUserId(Long userId) {
+ userDeptService.deleteUserDeptByUserId(userId);
+ return success(true);
+ }
+
+ @Override
+ public CommonResult deleteUserDeptByDeptId(Long deptId) {
+ // 需要实现此方法,暂时返回成功
+ return success(true);
+ }
+
+ @Override
+ public CommonResult syncUserDept(UserDeptSaveReqDTO syncReqDTO) {
+ UserDeptDO userDept = BeanUtils.toBean(syncReqDTO, UserDeptDO.class);
+ userDeptService.syncUserDept(userDept);
+ return success(true);
+ }
+
+}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/userpost/UserPostApiImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/userpost/UserPostApiImpl.java
new file mode 100644
index 00000000..1ee2db26
--- /dev/null
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/userpost/UserPostApiImpl.java
@@ -0,0 +1,106 @@
+package com.zt.plat.module.system.api.userpost;
+
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import com.zt.plat.module.system.api.userpost.dto.UserPostRespDTO;
+import com.zt.plat.module.system.api.userpost.dto.UserPostSaveReqDTO;
+import com.zt.plat.module.system.dal.dataobject.dept.UserPostDO;
+import com.zt.plat.module.system.dal.mysql.dept.UserPostMapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+/**
+ * 用户-岗位关系 API 实现类
+ *
+ * @author ZT
+ */
+@Slf4j
+@RestController
+@Validated
+public class UserPostApiImpl implements UserPostApi {
+
+ @Resource
+ private UserPostMapper userPostMapper;
+
+ @Override
+ public CommonResult createUserPost(UserPostSaveReqDTO reqVO) {
+ UserPostDO userPost = BeanUtils.toBean(reqVO, UserPostDO.class);
+ userPostMapper.insert(userPost);
+ return success(userPost.getId());
+ }
+
+ @Override
+ public CommonResult updateUserPost(UserPostSaveReqDTO reqVO) {
+ UserPostDO userPost = BeanUtils.toBean(reqVO, UserPostDO.class);
+ userPostMapper.updateById(userPost);
+ return success(true);
+ }
+
+ @Override
+ public CommonResult deleteUserPost(Long id) {
+ userPostMapper.deleteById(id);
+ return success(true);
+ }
+
+ @Override
+ public CommonResult getUserPost(Long id) {
+ UserPostDO userPost = userPostMapper.selectById(id);
+ return success(BeanUtils.toBean(userPost, UserPostRespDTO.class));
+ }
+
+ @Override
+ public CommonResult> getUserPostListByUserId(Long userId) {
+ List list = userPostMapper.selectListByUserId(userId);
+ return success(BeanUtils.toBean(list, UserPostRespDTO.class));
+ }
+
+ @Override
+ public CommonResult> getUserPostListByPostId(Long postId) {
+ List list = userPostMapper.selectListByPostIds(List.of(postId));
+ return success(BeanUtils.toBean(list, UserPostRespDTO.class));
+ }
+
+ @Override
+ public CommonResult deleteUserPostByUserId(Long userId) {
+ userPostMapper.deleteByUserId(userId);
+ return success(true);
+ }
+
+ @Override
+ public CommonResult deleteUserPostByPostId(Long postId) {
+ userPostMapper.delete(UserPostDO::getPostId, postId);
+ return success(true);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public CommonResult syncUserPost(UserPostSaveReqDTO syncReqDTO) {
+ if (syncReqDTO.getId() == null) {
+ return success(false);
+ }
+
+ UserPostDO existing = userPostMapper.selectById(syncReqDTO.getId());
+ UserPostDO userPost = BeanUtils.toBean(syncReqDTO, UserPostDO.class);
+
+ if (existing != null) {
+ userPostMapper.updateById(userPost);
+ log.info("[syncUserPost] 用户岗位关系同步-更新成功, id={}, userId={}, postId={}",
+ userPost.getId(), userPost.getUserId(), userPost.getPostId());
+ } else {
+ userPostMapper.insert(userPost);
+ log.info("[syncUserPost] 用户岗位关系同步-创建成功, id={}, userId={}, postId={}",
+ userPost.getId(), userPost.getUserId(), userPost.getPostId());
+ }
+
+ return success(true);
+ }
+
+}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/mysql/dept/DeptMapper.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/mysql/dept/DeptMapper.java
index fbd7c2c0..b030665c 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/mysql/dept/DeptMapper.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/mysql/dept/DeptMapper.java
@@ -124,12 +124,17 @@ public interface DeptMapper extends BaseMapperX {
/**
* 根据部门编码查询部门
+ *
+ * 注意:如果存在多条相同编码的记录,只返回第一条
*
* @param code 部门编码
* @return 部门信息
*/
default DeptDO selectByCode(String code) {
- return selectOne(DeptDO::getCode, code);
+ List list = selectList(new LambdaQueryWrapperX()
+ .eq(DeptDO::getCode, code)
+ .last("LIMIT 1"));
+ return CollUtil.isNotEmpty(list) ? list.get(0) : null;
}
/**
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptService.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptService.java
index c97510df..3996eef8 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptService.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptService.java
@@ -174,4 +174,15 @@ public interface DeptService {
* @return 部门列表
*/
List searchDeptTree(String keyword);
+
+ /**
+ * 回填缺失的部门编码(不触发事件)。
+ *
+ * @param deptIds 需要回填的部门 ID 列表
+ */
+ void backfillMissingCodesWithoutEvent(Collection deptIds);
+
+ // ========== 数据同步专用接口 ==========
+
+ void syncDept(DeptSaveReqVO syncReqVO);
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptServiceImpl.java
index 7a4e6bbe..edfb3267 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptServiceImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/DeptServiceImpl.java
@@ -802,4 +802,41 @@ public class DeptServiceImpl implements DeptService {
}
}
+ // ========== 数据同步专用接口 ==========
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, allEntries = true)
+ @DataPermission(enable = false)
+ public void syncDept(DeptSaveReqVO syncReqVO) {
+ if (syncReqVO.getId() == null) {
+ log.warn("[syncDept] 同步部门失败,ID 不能为空");
+ return;
+ }
+ // 标准化父部门 ID
+ syncReqVO.setParentId(normalizeParentId(syncReqVO.getParentId()));
+ // 默认部门来源
+ if (syncReqVO.getDeptSource() == null) {
+ syncReqVO.setDeptSource(DeptSourceEnum.EXTERNAL.getSource());
+ }
+
+ // 检查部门是否存在
+ DeptDO existingDept = deptMapper.selectById(syncReqVO.getId());
+
+ // 转换为 DO
+ DeptDO dept = BeanUtils.toBean(syncReqVO, DeptDO.class);
+
+ if (existingDept != null) {
+ // 部门存在,执行更新
+ deptMapper.updateById(dept);
+ log.info("[syncDept] 部门同步-更新成功, deptId={}, deptName={}", dept.getId(), dept.getName());
+ } else {
+ // 部门不存在,执行插入
+ deptMapper.insert(dept);
+ log.info("[syncDept] 部门同步-创建成功, deptId={}, deptName={}", dept.getId(), dept.getName());
+ }
+
+ // 注意:不发布变更事件,避免循环同步
+ }
+
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/PostService.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/PostService.java
index 4ece87ea..153c7fd3 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/PostService.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/PostService.java
@@ -89,4 +89,8 @@ public interface PostService {
*/
Long getOrCreatePostByName(String postName);
+ // ========== 数据同步专用接口 ==========
+
+ void syncPost(PostSaveReqVO syncReqVO);
+
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/PostServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/PostServiceImpl.java
index ff0aa7b4..9dcf31e2 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/PostServiceImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/dept/PostServiceImpl.java
@@ -191,4 +191,25 @@ public class PostServiceImpl implements PostService {
return createPost(createReqVO);
}
+
+ // ========== 数据同步专用接口 ==========
+
+ @Override
+ public void syncPost(PostSaveReqVO syncReqVO) {
+ if (syncReqVO.getId() == null) {
+ return;
+ }
+
+ PostDO existingPost = postMapper.selectById(syncReqVO.getId());
+ PostDO post = BeanUtils.toBean(syncReqVO, PostDO.class);
+
+ if (existingPost != null) {
+ postMapper.updateById(post);
+ } else {
+ if (post.getStatus() == null) {
+ post.setStatus(CommonStatusEnum.ENABLE.getStatus());
+ }
+ postMapper.insert(post);
+ }
+ }
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/user/AdminUserService.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/user/AdminUserService.java
index 967f3161..4244e9cf 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/user/AdminUserService.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/user/AdminUserService.java
@@ -208,4 +208,8 @@ public interface AdminUserService {
*/
boolean isPasswordMatch(AdminUserDO user, String rawPassword);
+ // ========== 数据同步专用接口 ==========
+
+ void syncUser(UserSaveReqVO syncReqVO);
+
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/user/AdminUserServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/user/AdminUserServiceImpl.java
index b9126216..1fb85004 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/user/AdminUserServiceImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/user/AdminUserServiceImpl.java
@@ -725,4 +725,48 @@ public class AdminUserServiceImpl implements AdminUserService {
return StrUtil.isNotBlank(value) && value.startsWith("$2");
}
+ // ========== 数据同步专用接口 ==========
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void syncUser(UserSaveReqVO syncReqVO) {
+ if (syncReqVO.getId() == null) {
+ log.warn("[syncUser] 同步用户失败,ID 不能为空");
+ return;
+ }
+
+ // 检查用户是否存在
+ AdminUserDO existingUser = userMapper.selectById(syncReqVO.getId());
+
+ // 转换为 DO(只同步用户主表,不处理关联关系)
+ AdminUserDO user = BeanUtils.toBean(syncReqVO, AdminUserDO.class);
+ user.setDeptIds(null); // 部门关联单独同步
+ user.setPostIds(null); // 岗位关联单独同步
+
+ if (existingUser != null) {
+ // 用户存在,执行更新(不更新密码)
+ user.setPassword(null);
+ userMapper.updateById(user);
+ log.info("[syncUser] 用户同步-更新成功, userId={}, username={}", user.getId(), user.getUsername());
+ } else {
+ // 用户不存在,执行插入
+ // 设置默认状态
+ if (user.getStatus() == null) {
+ user.setStatus(CommonStatusEnum.ENABLE.getStatus());
+ }
+ // 设置默认用户来源
+ if (user.getUserSource() == null) {
+ user.setUserSource(UserSourceEnum.EXTERNAL.getSource());
+ }
+ // 如果没有密码,设置默认密码
+ if (StrUtil.isBlank(user.getPassword())) {
+ user.setPassword(passwordEncoder.encode("123456"));
+ }
+ userMapper.insert(user);
+ log.info("[syncUser] 用户同步-创建成功, userId={}, username={}", user.getId(), user.getUsername());
+ }
+
+ // 注意:不发布变更事件,避免循环同步
+ }
+
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/userdept/UserDeptService.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/userdept/UserDeptService.java
index 378637eb..26c728b7 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/userdept/UserDeptService.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/userdept/UserDeptService.java
@@ -76,5 +76,8 @@ public interface UserDeptService {
*/
void batchCreateUserDept(List createReqVOList);
+ // ========== 数据同步专用接口 ==========
+
+ void syncUserDept(UserDeptDO syncReqVO);
}
\ No newline at end of file
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/userdept/UserDeptServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/userdept/UserDeptServiceImpl.java
index 3b699c91..8c71a020 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/userdept/UserDeptServiceImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/userdept/UserDeptServiceImpl.java
@@ -155,4 +155,22 @@ public class UserDeptServiceImpl implements UserDeptService {
}
}
-}
\ No newline at end of file
+ // ========== 数据同步专用接口 ==========
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void syncUserDept(UserDeptDO syncReqVO) {
+ if (syncReqVO.getId() == null) {
+ return;
+ }
+
+ UserDeptDO existing = userDeptMapper.selectById(syncReqVO.getId());
+
+ if (existing != null) {
+ userDeptMapper.updateById(syncReqVO);
+ } else {
+ userDeptMapper.insert(syncReqVO);
+ }
+ }
+
+}