From d15dabfeac167ac7e08df89912ae2d5d04032dbe Mon Sep 17 00:00:00 2001 From: chenbowen Date: Wed, 28 Jan 2026 14:10:05 +0800 Subject: [PATCH 1/2] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=20iwork=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=90=8C=E6=AD=A5=E9=80=BB=E8=BE=91=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=AF=B9=E9=9D=9E=20iwork=20=E6=9D=A5=E6=BA=90=E7=9A=84?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=85=B3=E7=B3=BB=E8=BF=9B=E8=A1=8C=E8=A6=86?= =?UTF-8?q?=E7=9B=96=EF=BC=8C=E4=B8=8D=E8=A6=86=E7=9B=96=E5=B7=B2=E5=85=B3?= =?UTF-8?q?=E8=81=94=E7=9A=84=E5=B2=97=E4=BD=8D=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iwork/impl/IWorkSyncProcessorImpl.java | 87 ++++++++++++++++++- .../service/userdept/UserDeptService.java | 7 ++ .../service/userdept/UserDeptServiceImpl.java | 13 ++- 3 files changed, 103 insertions(+), 4 deletions(-) diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkSyncProcessorImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkSyncProcessorImpl.java index 50c1bd92..a32be23a 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkSyncProcessorImpl.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkSyncProcessorImpl.java @@ -13,8 +13,11 @@ import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkHrUs import com.zt.plat.module.system.controller.admin.user.vo.user.UserSaveReqVO; import com.zt.plat.module.system.dal.dataobject.dept.DeptDO; import com.zt.plat.module.system.dal.dataobject.dept.PostDO; +import com.zt.plat.module.system.dal.dataobject.dept.UserPostDO; import com.zt.plat.module.system.dal.dataobject.user.AdminUserDO; +import com.zt.plat.module.system.dal.dataobject.userdept.UserDeptDO; import com.zt.plat.module.system.dal.mysql.dept.PostMapper; +import com.zt.plat.module.system.dal.mysql.dept.UserPostMapper; import com.zt.plat.module.system.dal.mysql.user.AdminUserMapper; import com.zt.plat.module.system.enums.common.SexEnum; import com.zt.plat.module.system.enums.dept.DeptSourceEnum; @@ -24,6 +27,7 @@ import com.zt.plat.module.system.service.dept.DeptService; import com.zt.plat.module.system.service.dept.PostService; import com.zt.plat.module.system.service.integration.iwork.IWorkSyncProcessor; import com.zt.plat.module.system.service.user.AdminUserService; +import com.zt.plat.module.system.service.userdept.UserDeptService; import com.zt.plat.module.system.util.sync.SyncVerifyUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -33,6 +37,7 @@ import org.springframework.util.DigestUtils; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; @Slf4j @Service @@ -47,8 +52,10 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { private final DeptService deptService; private final PostService postService; private final PostMapper postMapper; + private final UserPostMapper userPostMapper; private final AdminUserService adminUserService; private final AdminUserMapper adminUserMapper; + private final UserDeptService userDeptService; private final Map postCache = new ConcurrentHashMap<>(); @@ -531,11 +538,16 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { String externalPassword) { UserSaveReqVO req = buildUserSaveReq(source, username, deptId, postId, status); req.setId(existing.getId()); + Long iworkDeptId = resolveIWorkDeptId(deptId); + req.setDeptIds(null); + req.setPostIds(null); boolean disabledChanged = CommonStatusEnum.isDisable(status.getStatus()) && CommonStatusEnum.isEnable(existing.getStatus()); boolean infoChanged = isUserInfoChanged(existing, req); boolean passwordChanged = isPasswordChanged(existing, externalPassword); + boolean deptChanged = syncIWorkUserDeptRelations(existing.getId(), iworkDeptId); + boolean postChanged = syncIWorkUserPostRelations(existing.getId(), postId); - if (!infoChanged && !passwordChanged) { + if (!infoChanged && !passwordChanged && !deptChanged && !postChanged) { return new UserSyncOutcome(SyncAction.SKIPPED, false, existing.getId()); } @@ -619,8 +631,9 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { req.setWorkcode(resolveWorkcode(source)); req.setNickname(limitLength(StrUtil.blankToDefault(source.getLastname(), username), 30)); req.setRemark(buildUserRemark(source)); - if (deptId != null) { - req.setDeptIds(singletonSet(deptId)); + Long iworkDeptId = resolveIWorkDeptId(deptId); + if (iworkDeptId != null) { + req.setDeptIds(singletonSet(iworkDeptId)); } if (postId != null) { req.setPostIds(singletonSet(postId)); @@ -635,6 +648,74 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { return req; } + private boolean syncIWorkUserDeptRelations(Long userId, Long iworkDeptId) { + if (userId == null) { + return false; + } + List relations = userDeptService.getValidUserDeptListByUserIds(Collections.singleton(userId)); + Set existingDeptIds = relations.stream() + .map(UserDeptDO::getDeptId) + .filter(Objects::nonNull) + .collect(Collectors.toCollection(LinkedHashSet::new)); + Set existingIworkDeptIds = new LinkedHashSet<>(); + if (CollUtil.isNotEmpty(existingDeptIds)) { + Map deptMap = deptService.getDeptMap(existingDeptIds); + existingIworkDeptIds = deptMap.values().stream() + .filter(this::isIWorkDept) + .map(DeptDO::getId) + .filter(Objects::nonNull) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } + Set desiredIworkDeptIds = iworkDeptId == null + ? Collections.emptySet() + : Collections.singleton(iworkDeptId); + if (existingIworkDeptIds.equals(desiredIworkDeptIds)) { + return false; + } + Collection toDelete = CollUtil.subtract(existingIworkDeptIds, desiredIworkDeptIds); + Collection toAdd = CollUtil.subtract(desiredIworkDeptIds, existingIworkDeptIds); + if (CollUtil.isNotEmpty(toDelete)) { + userDeptService.deleteUserDeptByUserIdAndDeptIds(userId, toDelete); + } + if (CollUtil.isNotEmpty(toAdd)) { + userDeptService.batchCreateUserDept(Collections.singletonList( + new UserDeptDO().setUserId(userId).setDeptId(iworkDeptId))); + } + return true; + } + + private boolean syncIWorkUserPostRelations(Long userId, Long postId) { + if (userId == null || postId == null) { + return false; + } + List relations = userPostMapper.selectListByUserId(userId); + Set existingPostIds = relations.stream() + .map(UserPostDO::getPostId) + .filter(Objects::nonNull) + .collect(Collectors.toCollection(LinkedHashSet::new)); + if (existingPostIds.contains(postId)) { + return false; + } + userPostMapper.insertBatch(Collections.singletonList( + new UserPostDO().setUserId(userId).setPostId(postId))); + return true; + } + + private Long resolveIWorkDeptId(Long deptId) { + if (deptId == null) { + return null; + } + DeptDO dept = deptService.getDept(deptId); + return isIWorkDept(dept) ? deptId : null; + } + + private boolean isIWorkDept(DeptDO dept) { + if (dept == null) { + return false; + } + return Objects.equals(dept.getDeptSource(), DeptSourceEnum.IWORK.getSource()); + } + private void mergeDeptDefaults(DeptSaveReqVO target, DeptDO existing) { target.setCode(StrUtil.blankToDefault(target.getCode(), existing.getCode())); target.setShortName(StrUtil.blankToDefault(target.getShortName(), existing.getShortName())); 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 26c728b7..7a4e027c 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 @@ -70,6 +70,13 @@ public interface UserDeptService { */ void deleteUserDeptByUserId(Long userId); + /** + * 根据用户ID与部门ID集合删除用户与部门关系 + * @param userId 用户ID + * @param deptIds 部门ID集合 + */ + void deleteUserDeptByUserIdAndDeptIds(Long userId, Collection deptIds); + /** * 批量创建用户与部门关系 * @param createReqVOList 创建信息列表 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 8c71a020..bbc78645 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 @@ -3,6 +3,7 @@ package com.zt.plat.module.system.service.userdept; import cn.hutool.core.collection.CollUtil; import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.framework.security.core.LoginUser; +import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zt.plat.module.system.dal.dataobject.userdept.UserDeptDO; import com.zt.plat.module.system.dal.mysql.userdept.UserDeptMapper; import jakarta.annotation.Resource; @@ -128,10 +129,20 @@ public class UserDeptServiceImpl implements UserDeptService { @Override public void deleteUserDeptByUserId(Long userId) { if (userId == null) return; - userDeptMapper.delete(new com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX() + userDeptMapper.delete(new LambdaQueryWrapperX() .eq(UserDeptDO::getUserId, userId)); } + @Override + public void deleteUserDeptByUserIdAndDeptIds(Long userId, Collection deptIds) { + if (userId == null || CollUtil.isEmpty(deptIds)) { + return; + } + userDeptMapper.delete(new LambdaQueryWrapperX() + .eq(UserDeptDO::getUserId, userId) + .in(UserDeptDO::getDeptId, deptIds)); + } + @Override @Transactional(rollbackFor = Exception.class) public void batchCreateUserDept(List createReqVOList) { From 58df702cef7bb5f9502f06d1c97ec938fc86969a Mon Sep 17 00:00:00 2001 From: yangchaojin <549193112@qq.com> Date: Thu, 29 Jan 2026 10:42:37 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/infra/controller/admin/file/vo/file/FileRespVO.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/vo/file/FileRespVO.java b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/vo/file/FileRespVO.java index 77d3d443..8431c7c2 100644 --- a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/vo/file/FileRespVO.java +++ b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/vo/file/FileRespVO.java @@ -9,6 +9,7 @@ import com.zt.plat.module.infra.service.file.FileConfigService; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; +import lombok.extern.slf4j.Slf4j; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; @@ -18,6 +19,7 @@ import java.util.Date; /** * @author chenbowen */ +@Slf4j @Schema(description = "管理后台 - 文件 Response VO,不返回 content 字段,太大") @Data @Accessors(chain = true) @@ -87,6 +89,7 @@ public class FileRespVO { if (presignedUrl == null || presignedUrl.isEmpty()) { return null; } + log.info("presignedUrl:{}", presignedUrl); String base64PresignedUrl = Base64.getEncoder().encodeToString(presignedUrl.getBytes(StandardCharsets.UTF_8)); String timestamp = String.valueOf(System.currentTimeMillis()); String loginUserNickname = SecurityFrameworkUtils.getLoginUserNickname();