部门管理模块只剩下删除功能还没有做,这节课我们编写程序来实现删除部门的后端代码。删除部门有个要求,那就是只能删除没有用户的部门。如果某部门有关联的用户,这样的部门是不能删除的。
一、编写持久层代码
在TbDeptDao.xml
文件中,定义两个SQL语句。searchCanDelete
这个语句是查询要删除的部门是否存在关联的用户,这个SQL语句的语法跟角色管理模块类似,没什么可讲的。
<select id="searchCanDelete" resultType="boolean">
SELECT IF( SUM( temp.users ) > 0, FALSE, TRUE ) AS result FROM (
SELECT COUNT( u.id ) AS users
FROM tb_dept d
JOIN tb_user u ON d.id=u.dept_id
WHERE d.id IN
<foreach collection="array" open="(" separator="," close=")" item="one">
#{one}
</foreach>
GROUP BY d.id
) temp
</select>
<delete id="deleteDeptByIds">
DELETE FROM tb_dept
WHERE id IN
<foreach collection="array" open="(" separator="," close=")" item="one">
#{one}
</foreach>
</delete>
在TbDeptDao.java
接口中,定义DAO方法。
public interface TbDeptDao {
……
public boolean searchCanDelete(Integer[] ids);
public int deleteDeptByIds(Integer[] ids);
}
二、编写业务层代码
在DeptService.java
接口中,定义抽象方法。
public interface DeptService {
……
public int deleteDeptByIds(Integer[] ids);
}
在DeptServiceImpl.java
类中,实现抽象方法,其中就有判定部门是否能删除。
public class DeptServiceImpl implements DeptService {
……
@Override
public int deleteDeptByIds(Integer[] ids) {
if (!deptDao.searchCanDelete(ids)) {
throw new EmosException("无法删除关联用户的部门");
}
int rows = deptDao.deleteDeptByIds(ids);
return rows;
}
}
三、编写Web层代码
创建DeleteDeptByIdsForm.java
类,封装Ajax提交的数据。
@Data
@Schema(description = "删除部门表单")
public class DeleteDeptByIdsForm {
@NotEmpty(message = "ids不能为空")
@Schema(description = "部门ID")
private Integer[] ids;
}
在DeptController.java
类中,声明Web方法,然后大家可以用Swagger测试一下。
public class DeptController {
……
@PostMapping("/deleteDeptByIds")
@Operation(summary = "删除部门记录")
@SaCheckPermission(value = {"ROOT", "DEPT:DELETE"}, mode = SaMode.OR)
public R deleteDeptByIds(@Valid @RequestBody DeleteDeptByIdsForm form) {
int rows = deptService.deleteDeptByIds(form.getIds());
return R.ok().put("rows", rows);
}
}