package com.app.mvc.acl.service; import com.app.mvc.acl.convert.BaseConvert; import com.app.mvc.acl.convert.DeptConvert; import com.app.mvc.acl.dao.SysDeptDao; import com.app.mvc.acl.dao.SysUserDao; import com.app.mvc.acl.domain.SysDept; import com.app.mvc.acl.util.LevelUtil; import com.app.mvc.acl.util.RequestHolder; import com.app.mvc.acl.vo.DeptPara; import com.app.mvc.exception.ParaException; import com.google.common.base.Preconditions; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * Created by jimin on 16/1/18. */ @Service public class SysDeptService implements SysService { @Resource private SysDeptDao sysDeptDao; @Resource private SysLogService sysLogService; @Resource private SysUserDao sysUserDao; /** * 新增部门 */ public void save(DeptPara para) { BaseConvert.checkPara(para); SysDept dept = DeptConvert.of(para); if (checkExist(para.getParentId(), para.getName(), null)) { throw new ParaException("同一层级下存在相同名称的部门"); } dept.setLevel(LevelUtil.calculateLevel(getLevel(para.getParentId()), para.getParentId())); sysDeptDao.save(dept); sysLogService.saveDeptLog(null, dept); } /** * 更新部门 */ public void update(DeptPara para) { BaseConvert.checkPara(para); SysDept before = sysDeptDao.findById(para.getId()); Preconditions.checkNotNull(before, "待更新部门不存在"); if (checkExist(para.getParentId(), para.getName(), para.getId())) { throw new ParaException("当前模块下存在相同名称的权限点"); } SysDept after = DeptConvert.of(para); after.setLevel(LevelUtil.calculateLevel(getLevel(para.getParentId()), para.getParentId())); updateWithChild(before, after); sysLogService.saveDeptLog(before, after); } @Transactional private void updateWithChild(SysDept before, SysDept after) { sysDeptDao.update(after); // 获取所有子树 String newLevelPrefix = after.getLevel(); String oldLevelPrefix = before.getLevel(); if (!after.getLevel().equals(before.getLevel())) { List<SysDept> deptList = sysDeptDao.getChildDeptListByLevel(LevelUtil.calculateLevel(before.getLevel(), after.getId())); if (CollectionUtils.isEmpty(deptList)) { return; } for (SysDept tempDept : deptList) { String level = tempDept.getLevel(); if (level.indexOf(oldLevelPrefix) == 0) { level = newLevelPrefix + level.substring(oldLevelPrefix.length()); // 更新每个子树的level tempDept.setLevel(level); } } // 批量更新层级 sysDeptDao.batchUpdateLevel(deptList); } } public String getLevel(int deptId) { SysDept dept = sysDeptDao.findById(deptId); return dept == null ? null : dept.getLevel(); } /** * 获取部门列表 */ public List<SysDept> getBySupplierId(int supplierId) { return sysDeptDao.getBySupplierId(supplierId); } /** * 获取用户所在供应商的部门列表 */ public List<SysDept> list() { int userSupplierId = RequestHolder.getCurrentUser().getSupplierId(); return getBySupplierId(userSupplierId); } public SysDept findById(int id) { return sysDeptDao.findById(id); } public void deleteById(int id) { SysDept dept = sysDeptDao.findById(id); Preconditions.checkNotNull(dept, "该部门不存在,无法执行删除操作"); Preconditions.checkArgument(sysUserDao.countAvailableByDeptId(id) == 0, "部门下还有用户,不允许删除!"); Preconditions.checkArgument(sysDeptDao.countByParentId(id) == 0, "部门下还有子部门,不允许删除!"); sysDeptDao.deleteById(id); sysLogService.saveDeptLog(dept, null); } @Override public void recover(int targetId, Object o) { SysDept dept = (SysDept) o; Preconditions.checkNotNull(dept, "还原前的部门为空,无法还原"); SysDept before = sysDeptDao.findById(targetId); Preconditions.checkNotNull(before, "待还原的部门不存在"); sysDeptDao.update(dept); sysLogService.saveDeptLog(before, dept); } private boolean checkExist(int deptId, String name, Integer id) { return sysDeptDao.countByNameAndParentId(deptId, name, id) > 0; } }