提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、场景
- 二、问题
- 三、解决
一、场景
将一个机构撤销,然后撤销机构的子机构挂到新机构下
二、问题
将子机构挂到新机构后,涉及ancestors这个祖级列表字段的变动
1、挂到新机构下的子机构的祖级列表的变动
2、挂到新机构下的子机构的子机构的祖级列表的变动
三、解决
1、对于问题1,我们很好解决
挂载子机构的新祖级机构列表ancestors = 新机构的祖级列表 + 新机构的deptId(挂载的子机构的parentId)
java逻辑代码
//SysDept 这个是将要挂在到新机构的子机构信息
public int updateDept(SysDept dept) {//查询新机构信息SysDept info = deptMapper.selectByDeptId(dept.getParentId);if (StringUtils.isNotNull(info)) {//挂载子机构的新祖级机构列表ancestors = 新机构的祖级列表 + 新机构的deptId(挂载的子机构的parentId)String ancestors = info.getAncestors() + "," + dept.getParentId();dept.setAncestors(ancestors);//更新子机构下的子节点的祖级列表(这个才是重点)updateDeptChildren(dept.getDeptId(), ancestors);}return deptMapper.updateByDeptId(dept);
}
2、对于问题2,这个才是关键,涉及到子机构下的子节点
子机构的子节点祖级列表 = 子机构的祖级列表 + 子机构子节点的parentId
/*** 更新子机构下的子节点的祖级列表* deptId 子机构的部门id* ancestors 子机构的祖级列表字段*/
public void updateDeptChildren(Long deptId, String ancestors) {SysDept dept = new Dept();dept.setParentId(deptId);//查询子机构下的子节点List<SysDept> childrens = deptMapper.selectChildrenDeptById(deptId);for (SysDept children : childrens){//子机构的子节点祖级列表 = 子机构的祖级列表 + 子机构子节点的parentIdchildren.setAncestors(ancestors + "," + dept.getParentId());}if (children.size() > 0) {deptMapper.updateDeptChildren(children);}
}
updateDeptChildren的Xml语句
<update id="updateDeptChildren" parameterType="java.util.List">update sys_dept set ancestors =<foreach collection="depts" item="item" index="index"separator=" " open="case dept_id" close="end">when #{item.deptId} then #{item.ancestors}</foreach>where dept_id in<foreach collection="depts" item="item" index="index"separator="," open="(" close=")">#{item.deptId}</foreach>
</update>
通过上面的sql可以看到,首先先通过where条件找到所有需要更新的数据,然后在更新的时候通过判断dept_id的值在决定ancestors的值,所以一句sql语句可以解决所有的子级分类更新问题。