实现部门自动创建功能:同步钉钉部门时自动创建不存在的部门,修复已有用户部门分配逻辑
This commit is contained in:
parent
5f75dd3888
commit
43c6a6ce36
@ -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<com.designhub.entity.Department>()
|
||||
.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++;
|
||||
}
|
||||
|
||||
@ -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<Department> availableDepts = departmentMapper.selectList(
|
||||
new LambdaQueryWrapper<Department>()
|
||||
.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(", ")));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user