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 9831e89f..31a7a5ee 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 76943edf..a8416485 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 @@ -127,12 +127,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 80834565..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 @@ -181,4 +181,8 @@ public interface DeptService { * @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 24104dc1..0a5c607e 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 @@ -923,4 +923,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 382a15fd..5ca6e39c 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 @@ -212,4 +212,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 93058b6f..cd4480c4 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); + } + } + +}