package com.cl.privilege.biz.impl; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.cl.privilege.biz.IDepartmentService; import com.cl.privilege.mapper.DepartmentMapper; import com.cl.privilege.model.Department; import com.cl.privilege.model.User; import com.cl.privilege.utils.StringUtil; import com.cl.privilege.utils.ConstantUtil; @Service public class DepartmentServiceImpl implements IDepartmentService { @Autowired private DepartmentMapper departmentMapper; private void setDepartmentInsert(Department department,User operator) { Date d = new Date(); department.setCreatePerson(operator.getUsername()); department.setUpdatePerson(operator.getUsername()); department.setCreateDate(d); department.setUpdateDate(d); } private void setDepartmentUpdate(Department department,User operator) { Date d = new Date(); department.setUpdatePerson(operator.getUsername()); department.setUpdateDate(d); } @Override public List<Department> getDepartmentList() { return departmentMapper.getDepartmentList(); } @Override public Department getDepartmentById(Integer id) { return departmentMapper.selectByPrimaryKey(id); } @Override public Integer createDepartment(Department department,User user) { //生成structure String structure = "1"; Department parentDepartment = departmentMapper.selectByPrimaryKey(department.getParentId()); List<Department> departments = departmentMapper.getDepartmentListByParentId(department.getParentId()); if(departments==null || departments.size()==0) { structure = parentDepartment.getStructure()+"-1"; } else { Integer parentLevel = parentDepartment.getStructure().split("-").length; for(Department r:departments) { String[] structures = r.getStructure().split("-"); if(structures.length == parentLevel + 1) { if(StringUtil.isNumber(structures[structures.length-1])&&StringUtil.compareTo(structures[structures.length-1], structure)>0) { structure = structures[structures.length-1]; } } } structure = String.valueOf(Integer.parseInt(structure) + 1); structure = parentDepartment.getStructure()+"-" + structure; } department.setStructure(structure); setDepartmentInsert(department,user); return departmentMapper.insertSelective(department); } @Override public Integer updateDepartmentById(Department department,User user) { setDepartmentUpdate(department,user); return departmentMapper.updateByPrimaryKeySelective(department); } @Override public Integer deleteDepartmentById(Integer id) { return departmentMapper.deleteByPrimaryKey(id); } @Override public Boolean isUsedByUser(Integer departmentId) { return departmentMapper.isUsedByUser(departmentId); } @Override public String getDepartmentTree() { List<Department> departmentList = departmentMapper.getDepartmentList(); if(departmentList==null || departmentList.size()==0) return ConstantUtil.EmptyJsonObject; Collections.sort(departmentList,new ComparatorDepartment()); Set<Integer> setParent = new HashSet<Integer>(); for(Department d:departmentList) { setParent.add(d.getParentId()); } StringBuilder sb = new StringBuilder(); sb.append("["); int i = 0; for(Department d:departmentList) { int level = d.getStructure().split("-").length; if(i!=0) { sb.append(","); } i++; sb.append("{") .append("\"id\":\"").append(d.getId()).append("\"") .append(",\"parent\":\"").append(d.getParentId()==0?"#":d.getParentId()).append("\"") .append(",\"text\":\"").append(d.getName()).append("\"") .append(",\"li_attr\":{\"sortNo\":").append(d.getSortNo()).append("}");; //前两个级别默认打开 if(level <=3) { sb.append(",\"state\":{\"opened\":true}"); } //最后一个级别换个绿色图标 if(!setParent.contains(d.getId())) { sb.append(", \"icon\": \"fa fa-briefcase icon-success\""); } sb.append("}"); } sb.append("]"); return sb.toString(); } @Override public List<Department> getDepartmentListForOption() { List<Department> departments = getDepartmentList(); if(departments==null || departments.size()==0) { return null; } List<Department> tempImmediateDepartments = new ArrayList<Department>(); for(Department d:departments) { if(d.getParentId()==0) { //一级子节点 tempImmediateDepartments.add(d); } } return buildDepartmentListForOption(departments,tempImmediateDepartments,"s"); } /** * 这种写法和直接对所有部门列表进行循环的写法比较 * 优点是:更少的循环次数,所以也就是更少的CPU计算和更快的返回时间;缺点是:更多的内存占用 * 也可以看做是一种空间换时间 * @param descendantDepartments * @param immediateDepartments * @param structure * @return */ private List<Department> buildDepartmentListForOption(List<Department> descendantDepartments,List<Department> immediateDepartments,String structure) { if(descendantDepartments == null || descendantDepartments.size()==0 ||immediateDepartments == null || immediateDepartments.size()==0) { return null; } Collections.sort(immediateDepartments,new ComparatorDepartment()); List<Department> result = new ArrayList<Department>(); Integer index = 0; Integer level = structure.split("-").length; String prefix = ""; for(int i=0;i<level-1;i++) { prefix += "   "; } for(Department department:immediateDepartments) { if(department.getStructure().split("-").length != level+1 || !department.getStructure().startsWith(structure+"-") ) { continue; } department.setName(prefix + department.getName()); result.add(department); List<Department> tempDescendantDepartment = new ArrayList<Department>(); List<Department> tempImmediateDepartment = new ArrayList<Department>(); for(Department r:descendantDepartments) { if(r.getStructure().startsWith(department.getStructure()+"-")) { if(r.getStructure().split("-").length == level + 2 ) { //第一级子节点 tempImmediateDepartment.add(r); } //所有子节点 tempDescendantDepartment.add(r); } } if(tempDescendantDepartment!=null && tempDescendantDepartment.size()>0 && tempImmediateDepartment!=null && tempImmediateDepartment.size()>0) { List<Department> sub = buildDepartmentListForOption(tempDescendantDepartment,tempImmediateDepartment, department.getStructure()); if(sub!=null && sub.size()>0) { result.addAll(sub); } } index++; } return result; } /** * Department排序器,保证jsTree可以按照SortNo字段显示 */ class ComparatorDepartment implements Comparator<Department> { public int compare(Department r1, Department r2) { int l1 = r1.getStructure().length(); int l2 = r2.getStructure().length(); if(l1 == l2 ) { return r1.getSortNo().compareTo(r2.getSortNo()); } return l1>l2?1:-1; } } }