diff --git a/backend/src/main/java/com/designhub/service/DingTalkService.java b/backend/src/main/java/com/designhub/service/DingTalkService.java index 60d746f..208ac89 100644 --- a/backend/src/main/java/com/designhub/service/DingTalkService.java +++ b/backend/src/main/java/com/designhub/service/DingTalkService.java @@ -6,6 +6,7 @@ import com.designhub.entity.DingTalkConfig; import com.designhub.exception.BusinessException; import com.designhub.mapper.DepartmentMapper; import com.designhub.mapper.DingTalkConfigMapper; +import org.springframework.util.StringUtils; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; @@ -574,9 +575,47 @@ public class DingTalkService { departmentMapper.updateById(sysDept); log.info("更新部门: id={}, name={}, ding_dept_id={}", sysDept.getId(), deptName, dingDeptId); } else { - // 部门不存在,可以选择创建或跳过 - // 这里选择跳过,因为部门应该先在系统中创建 - log.warn("系统部门不存在,跳过同步: name={}, ding_dept_id={}", deptName, dingDeptId); + // 部门不存在,自动创建 + try { + Long parentId = 0L; + if (parentDingDeptId != null && !parentDingDeptId.equals("1")) { + // 查找父部门的系统ID + com.designhub.entity.Department parentDept = departmentMapper.selectOne( + new LambdaQueryWrapper() + .eq(com.designhub.entity.Department::getDingDeptId, parentDingDeptId) + .eq(com.designhub.entity.Department::getDeleted, 0) + .last("LIMIT 1") + ); + if (parentDept != null) { + parentId = parentDept.getId(); + } + } + + // 根据部门名称智能判断部门类型(可根据实际业务规则调整) + String deptType = inferDeptType(deptName); + + // 创建新部门 + com.designhub.entity.Department newDept = new com.designhub.entity.Department(); + newDept.setDeptName(deptName); + newDept.setDingDeptId(dingDeptId); + newDept.setDeptType(deptType); + newDept.setParentId(parentId); + newDept.setStatus(1); // 启用 + newDept.setSortOrder(0); + + departmentMapper.insert(newDept); + + // 初始化积分池会在DepartmentService.createDepartment中处理 + // 这里直接调用createDepartment会触发积分池初始化 + // 但为了避免循环依赖,我们直接使用mapper插入,积分池可以稍后初始化 + // 如果需要积分池,可以在后台手动初始化,或者用户首次使用时会自动创建 + + log.info("自动创建部门: id={}, name={}, ding_dept_id={}, type={}, parentId={}", + newDept.getId(), deptName, dingDeptId, deptType, parentId); + } catch (Exception e) { + log.error("自动创建部门失败: name={}, ding_dept_id={}", deptName, dingDeptId, e); + // 创建失败不影响其他部门的同步,继续处理下一个 + } } syncCount++; } diff --git a/backend/src/main/java/com/designhub/service/UserService.java b/backend/src/main/java/com/designhub/service/UserService.java index c23221a..7be01e1 100644 --- a/backend/src/main/java/com/designhub/service/UserService.java +++ b/backend/src/main/java/com/designhub/service/UserService.java @@ -488,29 +488,71 @@ public class UserService { } // 3. 检查部门是否需要更新 - if (user.getDeptId() != null && dingDepartments != null && !dingDepartments.isEmpty()) { - Department currentDept = departmentMapper.selectById(user.getDeptId()); - if (currentDept != null && StringUtils.hasText(currentDept.getDingDeptId())) { - // 检查用户是否还在原部门 - boolean stillInDept = dingDepartments.stream() - .anyMatch(d -> currentDept.getDingDeptId().equals(d.get("dept_id").toString())); - - if (!stillInDept) { - String newDeptNames = dingDepartments.stream() - .map(d -> String.valueOf(d.get("name"))) - .collect(Collectors.joining(",")); - log.warn("用户钉钉部门已变化: userId={}, 原部门={}, 钉钉部门={}", - user.getId(), currentDept.getDeptName(), newDeptNames); + if (dingDepartments != null && !dingDepartments.isEmpty()) { + if (user.getDeptId() != null) { + // 用户已有部门:检查是否需要更新 + Department currentDept = departmentMapper.selectById(user.getDeptId()); + if (currentDept != null && StringUtils.hasText(currentDept.getDingDeptId())) { + // 检查用户是否还在原部门 + boolean stillInDept = dingDepartments.stream() + .anyMatch(d -> currentDept.getDingDeptId().equals(d.get("dept_id").toString())); - // 尝试重新匹配部门 - Long newDeptId = matchSystemDepartment(dingDepartments); - if (newDeptId != null && !newDeptId.equals(user.getDeptId())) { - Department newDept = departmentMapper.selectById(newDeptId); - user.setDeptId(newDeptId); - user.setDeptName(newDept.getDeptName()); + if (!stillInDept) { + String newDeptNames = dingDepartments.stream() + .map(d -> String.valueOf(d.get("name"))) + .collect(Collectors.joining(",")); + log.warn("用户钉钉部门已变化: userId={}, 原部门={}, 钉钉部门={}", + user.getId(), currentDept.getDeptName(), newDeptNames); + + // 尝试重新匹配部门 + Long newDeptId = matchSystemDepartment(dingDepartments); + if (newDeptId != null && !newDeptId.equals(user.getDeptId())) { + Department newDept = departmentMapper.selectById(newDeptId); + user.setDeptId(newDeptId); + user.setDeptName(newDept.getDeptName()); + // 根据部门类型设置角色 + user.setRoleIds("receiving".equals(newDept.getDeptType()) ? "5" : "6"); + user.setStatus(1); // 启用用户 + needUpdate = true; + log.info("自动同步到新部门: userId={}, 新部门={}", + user.getId(), newDept.getDeptName()); + } + } + } + } else { + // 用户没有部门:尝试匹配部门 + Long matchedDeptId = matchSystemDepartment(dingDepartments); + if (matchedDeptId != null) { + Department dept = departmentMapper.selectById(matchedDeptId); + user.setDeptId(matchedDeptId); + user.setDeptName(dept.getDeptName()); + user.setRoleIds("receiving".equals(dept.getDeptType()) ? "5" : "6"); + user.setStatus(1); // 启用用户 + needUpdate = true; + log.info("已有用户匹配到部门: userId={}, deptId={}, deptName={}", + user.getId(), matchedDeptId, dept.getDeptName()); + } else { + // 无法匹配,使用第一个可用部门作为默认值 + List availableDepts = departmentMapper.selectList( + new LambdaQueryWrapper() + .eq(Department::getStatus, 1) + .eq(Department::getDeleted, 0) + .orderByAsc(Department::getSortOrder) + .orderByAsc(Department::getId) + ); + + if (!availableDepts.isEmpty()) { + Department defaultDept = availableDepts.get(0); + user.setDeptId(defaultDept.getId()); + user.setDeptName(defaultDept.getDeptName()); + user.setRoleIds("receiving".equals(defaultDept.getDeptType()) ? "5" : "6"); + user.setStatus(1); // 启用用户 needUpdate = true; - log.info("自动同步到新部门: userId={}, 新部门={}", - user.getId(), newDept.getDeptName()); + log.warn("已有用户无法匹配,使用默认部门: userId={}, deptId={}, deptName={}, 钉钉部门: {}", + user.getId(), defaultDept.getId(), defaultDept.getDeptName(), + dingDepartments.stream() + .map(d -> String.valueOf(d.get("name"))) + .collect(Collectors.joining(", "))); } } }