一、该问题的重现步骤是什么?
1. 部门表是否能实现这样的场景:A部门下有个C,B部门下要有个C,不是说部门名称一样,而是就是同一个C部门。这个C部门下面还有很多子部门以及大量人员。目前我们是人工创建了2个C部门,其下所有子部门和人员都搞了2套,维护比较麻烦
二、你期待的结果是什么?实际看到的又是什么?
有种类似虚拟部门的概念,实际就是同一个子部门,在A和B下都能看到这个部门。有没有好的实现方式?
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
bladex4.4
四、请提供详细的错误堆栈信息,这很重要。
五、若有更多详细信息,请在下面提供。
伪代码如下,增加虚拟节点相关的字段,依旧手动创建部门C,但是第二个部门C要设置为虚拟,并且有一个真实id指向主维护的部门C的id。这样后续不管有多少个虚拟的部门C创建并绑定,都可以根据这些虚拟节点的真实ID反推找到主维护的部门。
@Service
public class VirtualDeptService {
/**
* 创建虚拟部门节点
*/
public Department createVirtualDept(Long realDeptId, Long parentId) {
Department realDept = departmentMapper.selectById(realDeptId);
// 创建虚拟节点
Department virtualDept = new Department();
virtualDept.setDeptName(realDept.getDeptName() + "_引用");
virtualDept.setParentId(parentId);
virtualDept.setIsVirtual(true);
virtualDept.setRealDeptId(realDeptId); // 指向真实部门
departmentMapper.insert(virtualDept);
return virtualDept;
}
/**
* 获取部门信息(自动解析虚拟节点)
*/
public DeptVO getDeptInfo(Long deptId) {
Department dept = departmentMapper.selectById(deptId);
if (dept.getIsVirtual()) {
// 如果是虚拟节点,获取真实部门信息
Department realDept = departmentMapper.selectById(dept.getRealDeptId());
return buildDeptVO(realDept, dept.getParentId());
}
return buildDeptVO(dept, dept.getParentId());
}
/**
* 获取部门下的人员(支持虚拟节点)
*/
public List<User> getDeptUsers(Long deptId) {
Department dept = departmentMapper.selectById(deptId);
Long targetDeptId = dept.getIsVirtual() ? dept.getRealDeptId() : deptId;
// 递归获取所有子部门
List<Long> allDeptIds = getAllSubDeptIds(targetDeptId);
return userMapper.selectByDeptIds(allDeptIds);
}
}