package org.jeecg.modules.system.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import io.netty.util.internal.StringUtil; import org.apache.commons.lang.StringUtils; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.FillRuleConstant; import org.jeecg.common.util.FillRuleUtil; import org.jeecg.common.util.YouBianCodeUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.mapper.*; import org.jeecg.modules.system.model.DepartIdModel; import org.jeecg.modules.system.model.SysDepartTreeModel; import org.jeecg.modules.system.service.ISysDepartService; import org.jeecg.modules.system.util.FindsDepartsChildrenUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; /** *

* 部门表 服务实现类 *

* * @Author Steve * @Since 2019-01-22 */ @Service public class SysDepartServiceImpl extends ServiceImpl implements ISysDepartService { @Autowired private SysUserDepartMapper userDepartMapper; @Autowired private SysDepartRoleMapper sysDepartRoleMapper; @Autowired private SysDepartPermissionMapper departPermissionMapper; @Autowired private SysDepartRolePermissionMapper departRolePermissionMapper; @Autowired private SysDepartRoleUserMapper departRoleUserMapper; @Autowired private SysUserMapper sysUserMapper; @Override public List queryMyDeptTreeList(String departIds) { //根据部门id获取所负责部门 LambdaQueryWrapper query = new LambdaQueryWrapper(); String[] codeArr = this.getMyDeptParentOrgCode(departIds); for(int i=0;i listDepts = this.list(query); for(int i=0;i listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(listDepts); return listResult; } /** * queryTreeList 对应 queryTreeList 查询所有的部门数据,以树结构形式响应给前端 */ @Cacheable(value = CacheConstant.SYS_DEPARTS_CACHE) @Override public List queryTreeList() { LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.orderByAsc(SysDepart::getDepartOrder); List list = this.list(query); // 调用wrapTreeDataToTreeList方法生成树状数据 List listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(list); return listResult; } @Cacheable(value = CacheConstant.SYS_DEPART_IDS_CACHE) @Override public List queryDepartIdTreeList() { LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.orderByAsc(SysDepart::getDepartOrder); List list = this.list(query); // 调用wrapTreeDataToTreeList方法生成树状数据 List listResult = FindsDepartsChildrenUtil.wrapTreeDataToDepartIdTreeList(list); return listResult; } /** * saveDepartData 对应 add 保存用户在页面添加的新的部门对象数据 */ @Override @Transactional public void saveDepartData(SysDepart sysDepart, String username) { if (sysDepart != null && username != null) { if (sysDepart.getParentId() == null) { sysDepart.setParentId(""); } String s = UUID.randomUUID().toString().replace("-", ""); sysDepart.setId(s); // 先判断该对象有无父级ID,有则意味着不是最高级,否则意味着是最高级 // 获取父级ID String parentId = sysDepart.getParentId(); //update-begin--Author:baihailong Date:20191209 for:部门编码规则生成器做成公用配置 JSONObject formData = new JSONObject(); formData.put("parentId",parentId); String[] codeArray = (String[]) FillRuleUtil.executeRule(FillRuleConstant.DEPART,formData); //update-end--Author:baihailong Date:20191209 for:部门编码规则生成器做成公用配置 sysDepart.setOrgCode(codeArray[0]); String orgType = codeArray[1]; sysDepart.setOrgType(String.valueOf(orgType)); sysDepart.setCreateTime(new Date()); sysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); this.save(sysDepart); } } /** * saveDepartData 的调用方法,生成部门编码和部门类型(作废逻辑) * @deprecated * @param parentId * @return */ private String[] generateOrgCode(String parentId) { //update-begin--Author:Steve Date:20190201 for:组织机构添加数据代码调整 LambdaQueryWrapper query = new LambdaQueryWrapper(); LambdaQueryWrapper query1 = new LambdaQueryWrapper(); String[] strArray = new String[2]; // 创建一个List集合,存储查询返回的所有SysDepart对象 List departList = new ArrayList<>(); // 定义新编码字符串 String newOrgCode = ""; // 定义旧编码字符串 String oldOrgCode = ""; // 定义部门类型 String orgType = ""; // 如果是最高级,则查询出同级的org_code, 调用工具类生成编码并返回 if (StringUtil.isNullOrEmpty(parentId)) { // 线判断数据库中的表是否为空,空则直接返回初始编码 query1.eq(SysDepart::getParentId, "").or().isNull(SysDepart::getParentId); query1.orderByDesc(SysDepart::getOrgCode); departList = this.list(query1); if(departList == null || departList.size() == 0) { strArray[0] = YouBianCodeUtil.getNextYouBianCode(null); strArray[1] = "1"; return strArray; }else { SysDepart depart = departList.get(0); oldOrgCode = depart.getOrgCode(); orgType = depart.getOrgType(); newOrgCode = YouBianCodeUtil.getNextYouBianCode(oldOrgCode); } } else { // 反之则查询出所有同级的部门,获取结果后有两种情况,有同级和没有同级 // 封装查询同级的条件 query.eq(SysDepart::getParentId, parentId); // 降序排序 query.orderByDesc(SysDepart::getOrgCode); // 查询出同级部门的集合 List parentList = this.list(query); // 查询出父级部门 SysDepart depart = this.getById(parentId); // 获取父级部门的Code String parentCode = depart.getOrgCode(); // 根据父级部门类型算出当前部门的类型 orgType = String.valueOf(Integer.valueOf(depart.getOrgType()) + 1); // 处理同级部门为null的情况 if (parentList == null || parentList.size() == 0) { // 直接生成当前的部门编码并返回 newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, null); } else { //处理有同级部门的情况 // 获取同级部门的编码,利用工具类 String subCode = parentList.get(0).getOrgCode(); // 返回生成的当前部门编码 newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, subCode); } } // 返回最终封装了部门编码和部门类型的数组 strArray[0] = newOrgCode; strArray[1] = orgType; return strArray; //update-end--Author:Steve Date:20190201 for:组织机构添加数据代码调整 } /** * removeDepartDataById 对应 delete方法 根据ID删除相关部门数据 * */ /* * @Override * * @Transactional public boolean removeDepartDataById(String id) { * System.out.println("要删除的ID 为=============================>>>>>"+id); boolean * flag = this.removeById(id); return flag; } */ /** * updateDepartDataById 对应 edit 根据部门主键来更新对应的部门数据 */ @Override @Transactional public Boolean updateDepartDataById(SysDepart sysDepart, String username) { if (sysDepart != null && username != null) { sysDepart.setUpdateTime(new Date()); sysDepart.setUpdateBy(username); this.updateById(sysDepart); return true; } else { return false; } } @Override @Transactional(rollbackFor = Exception.class) public void deleteBatchWithChildren(List ids) { List idList = new ArrayList(); for(String id: ids) { idList.add(id); this.checkChildrenExists(id, idList); } this.removeByIds(idList); //根据部门id获取部门角色id List roleIdList = new ArrayList<>(); LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.select(SysDepartRole::getId).in(SysDepartRole::getDepartId, idList); List depRoleList = sysDepartRoleMapper.selectList(query); for(SysDepartRole deptRole : depRoleList){ roleIdList.add(deptRole.getId()); } //根据部门id删除用户与部门关系 userDepartMapper.delete(new LambdaQueryWrapper().in(SysUserDepart::getDepId,idList)); //根据部门id删除部门授权 departPermissionMapper.delete(new LambdaQueryWrapper().in(SysDepartPermission::getDepartId,idList)); //根据部门id删除部门角色 sysDepartRoleMapper.delete(new LambdaQueryWrapper().in(SysDepartRole::getDepartId,idList)); if(roleIdList != null && roleIdList.size()>0){ //根据角色id删除部门角色授权 departRolePermissionMapper.delete(new LambdaQueryWrapper().in(SysDepartRolePermission::getRoleId,roleIdList)); //根据角色id删除部门角色用户信息 departRoleUserMapper.delete(new LambdaQueryWrapper().in(SysDepartRoleUser::getDroleId,roleIdList)); } } @Override public List getSubDepIdsByDepId(String departId) { return this.baseMapper.getSubDepIdsByDepId(departId); } @Override public List getMySubDepIdsByDepId(String departIds) { //根据部门id获取所负责部门 String[] codeArr = this.getMyDeptParentOrgCode(departIds); return this.baseMapper.getSubDepIdsByOrgCodes(codeArr); } /** *

* 根据关键字搜索相关的部门数据 *

*/ @Override public List searhBy(String keyWord,String myDeptSearch,String departIds) { LambdaQueryWrapper query = new LambdaQueryWrapper(); List newList = new ArrayList<>(); //myDeptSearch不为空时为我的部门搜索,只搜索所负责部门 if(!StringUtil.isNullOrEmpty(myDeptSearch)){ //departIds 为空普通用户或没有管理部门 if(StringUtil.isNullOrEmpty(departIds)){ return newList; } //根据部门id获取所负责部门 String[] codeArr = this.getMyDeptParentOrgCode(departIds); for(int i=0;i departList = this.list(query); if(departList.size() > 0) { for(SysDepart depart : departList) { model = new SysDepartTreeModel(depart); model.setChildren(null); //update-end--Author:huangzhilin Date:20140417 for:[bugfree号]组织机构搜索功回显优化---------------------- newList.add(model); } return newList; } return null; } /** * 根据部门id删除并且删除其可能存在的子级任何部门 */ @Override @Transactional(rollbackFor = Exception.class) public boolean delete(String id) { List idList = new ArrayList<>(); idList.add(id); this.checkChildrenExists(id, idList); //清空部门树内存 //FindsDepartsChildrenUtil.clearDepartIdModel(); boolean ok = this.removeByIds(idList); //根据部门id获取部门角色id List roleIdList = new ArrayList<>(); LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.select(SysDepartRole::getId).in(SysDepartRole::getDepartId, idList); List depRoleList = sysDepartRoleMapper.selectList(query); for(SysDepartRole deptRole : depRoleList){ roleIdList.add(deptRole.getId()); } //根据部门id删除用户与部门关系 userDepartMapper.delete(new LambdaQueryWrapper().in(SysUserDepart::getDepId,idList)); //根据部门id删除部门授权 departPermissionMapper.delete(new LambdaQueryWrapper().in(SysDepartPermission::getDepartId,idList)); //根据部门id删除部门角色 sysDepartRoleMapper.delete(new LambdaQueryWrapper().in(SysDepartRole::getDepartId,idList)); if(roleIdList != null && roleIdList.size()>0){ //根据角色id删除部门角色授权 departRolePermissionMapper.delete(new LambdaQueryWrapper().in(SysDepartRolePermission::getRoleId,roleIdList)); //根据角色id删除部门角色用户信息 departRoleUserMapper.delete(new LambdaQueryWrapper().in(SysDepartRoleUser::getDroleId,roleIdList)); } return ok; } /** * delete 方法调用 * @param id * @param idList */ private void checkChildrenExists(String id, List idList) { LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(SysDepart::getParentId,id); List departList = this.list(query); if(departList != null && departList.size() > 0) { for(SysDepart depart : departList) { idList.add(depart.getId()); this.checkChildrenExists(depart.getId(), idList); } } } @Override public List queryUserDeparts(String userId) { return baseMapper.queryUserDeparts(userId); } @Override public List queryDepartsByUsername(String username) { return baseMapper.queryDepartsByUsername(username); } /** * 根据用户所负责部门ids获取父级部门编码 * @param departIds * @return */ private String[] getMyDeptParentOrgCode(String departIds){ //根据部门id查询所负责部门 LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.in(SysDepart::getId, Arrays.asList(departIds.split(","))); query.orderByAsc(SysDepart::getOrgCode); List list = this.list(query); //查找根部门 if(list == null || list.size()==0){ return null; } String orgCode = this.getMyDeptParentNode(list); String[] codeArr = orgCode.split(","); return codeArr; } /** * 获取负责部门父节点 * @param list * @return */ private String getMyDeptParentNode(List list){ Map map = new HashMap<>(); //1.先将同一公司归类 for(SysDepart dept : list){ String code = dept.getOrgCode().substring(0,3); if(map.containsKey(code)){ String mapCode = map.get(code)+","+dept.getOrgCode(); map.put(code,mapCode); }else{ map.put(code,dept.getOrgCode()); } } StringBuffer parentOrgCode = new StringBuffer(); //2.获取同一公司的根节点 for(String str : map.values()){ String[] arrStr = str.split(","); parentOrgCode.append(",").append(this.getMinLengthNode(arrStr)); } return parentOrgCode.substring(1); } /** * 获取同一公司中部门编码长度最小的部门 * @param str * @return */ private String getMinLengthNode(String[] str){ int min =str[0].length(); String orgCode = str[0]; for(int i =1;i queryTreeByKeyWord(String keyWord) { LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.orderByAsc(SysDepart::getDepartOrder); List list = this.list(query); // 调用wrapTreeDataToTreeList方法生成树状数据 List listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(list); List treelist =new ArrayList<>(); if(StringUtils.isNotBlank(keyWord)){ this.getTreeByKeyWord(keyWord,listResult,treelist); }else{ return listResult; } return treelist; } /** * 根据parentId查询部门树 * @param parentId * @return */ @Override public List queryTreeListByPid(String parentId) { List list = this.baseMapper.queryTreeListByPid(parentId); List records = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { SysDepart depart = list.get(i); SysDepartTreeModel treeModel = new SysDepartTreeModel(depart); //TODO 异步树加载key拼接__+时间戳,以便于每次展开节点会刷新数据 //treeModel.setKey(treeModel.getKey()+"__"+System.currentTimeMillis()); treeModel.setKey(treeModel.getKey()); Integer count=this.baseMapper.queryCountByPid(depart.getId()); if(count>0){ treeModel.setIsLeaf(false); }else{ treeModel.setIsLeaf(true); } records.add(treeModel); } return records; } @Override public JSONObject queryAllParentIdByDepartId(String departId) { JSONObject result = new JSONObject(); for (String id : departId.split(",")) { JSONObject all = this.queryAllParentId("id", id); result.put(id, all); } return result; } @Override public JSONObject queryAllParentIdByOrgCode(String orgCode) { JSONObject result = new JSONObject(); for (String code : orgCode.split(",")) { JSONObject all = this.queryAllParentId("org_code", code); result.put(code, all); } return result; } /** * 查询某个部门的所有父ID信息 * * @param fieldName 字段名 * @param value 值 */ private JSONObject queryAllParentId(String fieldName, String value) { JSONObject data = new JSONObject(); // 父ID集合,有序 data.put("parentIds", new JSONArray()); // 父ID的部门数据,key是id,value是数据 data.put("parentMap", new JSONObject()); this.queryAllParentIdRecursion(fieldName, value, data); return data; } /** * 递归调用查询父部门接口 */ private void queryAllParentIdRecursion(String fieldName, String value, JSONObject data) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq(fieldName, value); SysDepart depart = super.getOne(queryWrapper); if (depart != null) { data.getJSONArray("parentIds").add(0, depart.getId()); data.getJSONObject("parentMap").put(depart.getId(), depart); if (oConvertUtils.isNotEmpty(depart.getParentId())) { this.queryAllParentIdRecursion("id", depart.getParentId(), data); } } } @Override public SysDepart queryCompByOrgCode(String orgCode) { int length = YouBianCodeUtil.zhanweiLength; String compyOrgCode = orgCode.substring(0,length); return this.baseMapper.queryCompByOrgCode(compyOrgCode); } /** * 根据id查询下级部门 * @param pid * @return */ @Override public List queryDeptByPid(String pid) { return this.baseMapper.queryDeptByPid(pid); } /** * 根据关键字筛选部门信息 * @param keyWord * @return */ public void getTreeByKeyWord(String keyWord,List allResult,List newResult){ for (SysDepartTreeModel model:allResult) { if (model.getDepartName().contains(keyWord)){ newResult.add(model); continue; }else if(model.getChildren()!=null){ getTreeByKeyWord(keyWord,model.getChildren(),newResult); } } } }