实现部门自动创建功能:同步钉钉部门时自动创建不存在的部门,修复已有用户部门分配逻辑
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.exception.BusinessException;
|
||||||
import com.designhub.mapper.DepartmentMapper;
|
import com.designhub.mapper.DepartmentMapper;
|
||||||
import com.designhub.mapper.DingTalkConfigMapper;
|
import com.designhub.mapper.DingTalkConfigMapper;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -574,9 +575,47 @@ public class DingTalkService {
|
|||||||
departmentMapper.updateById(sysDept);
|
departmentMapper.updateById(sysDept);
|
||||||
log.info("更新部门: id={}, name={}, ding_dept_id={}", sysDept.getId(), deptName, dingDeptId);
|
log.info("更新部门: id={}, name={}, ding_dept_id={}", sysDept.getId(), deptName, dingDeptId);
|
||||||
} else {
|
} else {
|
||||||
// 部门不存在,可以选择创建或跳过
|
// 部门不存在,自动创建
|
||||||
// 这里选择跳过,因为部门应该先在系统中创建
|
try {
|
||||||
log.warn("系统部门不存在,跳过同步: name={}, ding_dept_id={}", deptName, dingDeptId);
|
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++;
|
syncCount++;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -488,29 +488,71 @@ public class UserService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 3. 检查部门是否需要更新
|
// 3. 检查部门是否需要更新
|
||||||
if (user.getDeptId() != null && dingDepartments != null && !dingDepartments.isEmpty()) {
|
if (dingDepartments != null && !dingDepartments.isEmpty()) {
|
||||||
Department currentDept = departmentMapper.selectById(user.getDeptId());
|
if (user.getDeptId() != null) {
|
||||||
if (currentDept != null && StringUtils.hasText(currentDept.getDingDeptId())) {
|
// 用户已有部门:检查是否需要更新
|
||||||
// 检查用户是否还在原部门
|
Department currentDept = departmentMapper.selectById(user.getDeptId());
|
||||||
boolean stillInDept = dingDepartments.stream()
|
if (currentDept != null && StringUtils.hasText(currentDept.getDingDeptId())) {
|
||||||
.anyMatch(d -> currentDept.getDingDeptId().equals(d.get("dept_id").toString()));
|
// 检查用户是否还在原部门
|
||||||
|
boolean stillInDept = dingDepartments.stream()
|
||||||
|
.anyMatch(d -> currentDept.getDingDeptId().equals(d.get("dept_id").toString()));
|
||||||
|
|
||||||
if (!stillInDept) {
|
if (!stillInDept) {
|
||||||
String newDeptNames = dingDepartments.stream()
|
String newDeptNames = dingDepartments.stream()
|
||||||
.map(d -> String.valueOf(d.get("name")))
|
.map(d -> String.valueOf(d.get("name")))
|
||||||
.collect(Collectors.joining(","));
|
.collect(Collectors.joining(","));
|
||||||
log.warn("用户钉钉部门已变化: userId={}, 原部门={}, 钉钉部门={}",
|
log.warn("用户钉钉部门已变化: userId={}, 原部门={}, 钉钉部门={}",
|
||||||
user.getId(), currentDept.getDeptName(), newDeptNames);
|
user.getId(), currentDept.getDeptName(), newDeptNames);
|
||||||
|
|
||||||
// 尝试重新匹配部门
|
// 尝试重新匹配部门
|
||||||
Long newDeptId = matchSystemDepartment(dingDepartments);
|
Long newDeptId = matchSystemDepartment(dingDepartments);
|
||||||
if (newDeptId != null && !newDeptId.equals(user.getDeptId())) {
|
if (newDeptId != null && !newDeptId.equals(user.getDeptId())) {
|
||||||
Department newDept = departmentMapper.selectById(newDeptId);
|
Department newDept = departmentMapper.selectById(newDeptId);
|
||||||
user.setDeptId(newDeptId);
|
user.setDeptId(newDeptId);
|
||||||
user.setDeptName(newDept.getDeptName());
|
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;
|
needUpdate = true;
|
||||||
log.info("自动同步到新部门: userId={}, 新部门={}",
|
log.warn("已有用户无法匹配,使用默认部门: userId={}, deptId={}, deptName={}, 钉钉部门: {}",
|
||||||
user.getId(), newDept.getDeptName());
|
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