部门模块总共就三个功能
部门增加,修改,删除操作
SysDeptService
public interface SysDeptService {
void saveDept(DepartmentDTO param);
void updateDept(DepartmentDTO param);
void delete(int deptId);
}
SysDeptServiceImpl
@Service
public class SysDeptServiceImpl implements SysDeptService {
@Resource
private SysDeptMapper sysDeptMapper;
@Resource
private SysUserMapper sysUserMapper;
@Override
public void saveDept(DepartmentDTO param) {
BeanValidator.check(param);
if(checkExist(param.getParentId(), param.getName(), param.getId())) {
throw new BizException("同一层级下存在相同名称的部门");
}
SysDept dept = SysDept.builder().name(param.getName()).parentId(param.getParentId())
.seq(param.getSeq()).remark(param.getRemark()).build();
dept.setLevel(LevelUtil.calculateLevel(getLevel(param.getParentId()), param.getParentId()));
dept.setOperator(RequestHolder.getCurrentUser().getUsername());
dept.setOperateIp(IPUtil.getIpAddress(RequestHolder.getCurrentRequest()));
dept.setOperateTime(new Date());
sysDeptMapper.insertSelective(dept);
}
@Override
public void updateDept(DepartmentDTO param) {
BeanValidator.check(param);
if(checkExist(param.getParentId(), param.getName(), param.getId())) {
throw new BizException("同一层级下存在相同名称的部门");
}
SysDept before = sysDeptMapper.selectByPrimaryKey(param.getId());
Preconditions.checkNotNull(before,"待更新的部门不存在");
SysDept after = SysDept.builder().id(param.getId()).name(param.getName()).parentId(param.getParentId())
.seq(param.getSeq()).remark(param.getRemark()).build();
after.setLevel(LevelUtil.calculateLevel(getLevel(param.getParentId()), param.getParentId()));
after.setOperator(RequestHolder.getCurrentUser().getUsername());
after.setOperateIp(IPUtil.getIpAddress(RequestHolder.getCurrentRequest()));
after.setOperateTime(new Date());
this.updateWithChild(before,after);
}
@Transactional
void updateWithChild(SysDept before, SysDept after){
String newLevel = after.getLevel();
String oldLevel = before.getLevel();
if(!after.getLevel().equals(before.getLevel())){
List<SysDept> deptList = sysDeptMapper.getChildDeptListByLevel(before.getLevel());
if(CollectionUtils.isNotEmpty(deptList)){
for(SysDept sysDept:deptList){
String level = sysDept.getLevel();
if(level.indexOf(oldLevel) == 0){
level = newLevel+level.substring(oldLevel.length());
sysDept.setLevel(level);
}
}
sysDeptMapper.batchUpdateLevel(deptList);
}
}
sysDeptMapper.updateByPrimaryKey(after);
}
@Override
public void delete(int deptId) {
SysDept dept = sysDeptMapper.selectByPrimaryKey(deptId);
Preconditions.checkNotNull(dept, "待删除的部门不存在,无法删除");
if (sysDeptMapper.countByParentId(dept.getId()) > 0) {
throw new BizException("当前部门下面有子部门,无法删除");
}
if(sysUserMapper.countByDeptId(dept.getId()) > 0) {
throw new BizException("当前部门下面有用户,无法删除");
}
sysDeptMapper.deleteByPrimaryKey(deptId);
}
private boolean checkExist(Integer parentId, String deptName, Integer deptId) {
return sysDeptMapper.countByNameAndParentId(parentId, deptName, deptId) > 0;
}
private String getLevel(Integer deptId) {
SysDept dept = sysDeptMapper.selectByPrimaryKey(deptId);
if (dept == null) {
return null;
}
return dept.getLevel();
}
}
LevelUtil
public class LevelUtil {
public final static String SEPARATOR = ".";
public final static String ROOT = "0";
// 0
// 0.1
// 0.1.2
// 0.1.3
// 0.4
public static String calculateLevel(String parentLevel, int parentId) {
if (StringUtils.isBlank(parentLevel)) {
return ROOT;
} else {
return StringUtils.join(parentLevel, SEPARATOR, parentId);
}
}
}
部门实现层最为核心的就是部门层级的赋值,初始赋值,一级部门层级初始为0,通过parentId将层级关联起来
dept.setLevel(LevelUtil.calculateLevel(getLevel(param.getParentId()), param.getParentId()));
当对部门进行修改时,要考虑部门层级以及其子部门部门层级的变动
子部门部门层级变动
@Transactional
void updateWithChild(SysDept before, SysDept after){
String newLevel = after.getLevel();
String oldLevel = before.getLevel();
if(!after.getLevel().equals(before.getLevel())){
List<SysDept> deptList = sysDeptMapper.getChildDeptListByLevel(before.getLevel());
if(CollectionUtils.isNotEmpty(deptList)){
for(SysDept sysDept:deptList){
String level = sysDept.getLevel();
if(level.indexOf(oldLevel) == 0){
level = newLevel+level.substring(oldLevel.length());
sysDept.setLevel(level);
}
}
sysDeptMapper.batchUpdateLevel(deptList);
}
}
sysDeptMapper.updateByPrimaryKey(after);
}
获取修改前部门和修改后部门的层级,对数据库进行查找,先将之前涉及到之前部门层级的子部门查出来,然后对层级进行统一修改,将涉及到原部门层级的用新部门层级覆盖掉。
查找涉及到原层级部门sql
<select id="getChildDeptListByLevel" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from sys_dept
where level like #{level} || '.%'
</select>