package jnpf.permission.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import jnpf.base.SysConfigApi; import jnpf.base.service.SuperServiceImpl; import jnpf.constant.CodeConst; import jnpf.constant.MsgCode; import jnpf.constant.PermissionConst; import jnpf.emnus.OrgTypeEnum; import jnpf.exception.DataException; import jnpf.model.BaseSystemInfo; import jnpf.permission.entity.OrganizeEntity; import jnpf.permission.entity.PositionEntity; import jnpf.permission.entity.RoleRelationEntity; import jnpf.permission.entity.UserRelationEntity; import jnpf.permission.mapper.OrganizeMapper; import jnpf.permission.mapper.PositionMapper; import jnpf.permission.model.organize.OrganizeListVO; import jnpf.permission.model.organize.OrganizePagination; import jnpf.permission.service.CodeNumService; import jnpf.permission.service.OrganizeService; import jnpf.permission.service.RoleRelationService; import jnpf.permission.service.UserRelationService; import jnpf.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; /** * 组织机构 * * @author JNPF开发平台组 * @version V3.1.0 * @copyright 引迈信息技术有限公司 * @date 2019年9月26日 上午9:18 */ @Service public class OrganizeServiceImpl extends SuperServiceImpl implements OrganizeService { @Autowired private CacheKeyUtil cacheKeyUtil; @Autowired private RedisUtil redisUtil; @Autowired private SysConfigApi sysconfigApi; @Autowired private CodeNumService codeNumService; @Autowired private PositionMapper positionMapper; @Autowired private UserRelationService userRelationService; @Autowired private RoleRelationService roleRelationService; @Override public List getList(OrganizePagination pagination) { return this.baseMapper.getList(pagination); } @Override public void create(OrganizeEntity entity) { // 自动生成编码 if (StringUtil.isEmpty(entity.getEnCode())) { entity.setEnCode(codeNumService.getCodeFunction(() -> codeNumService.getCodeOnce(CodeConst.ZZ), code -> this.isExistByEnCode(code, null))); } String positionId = RandomUtil.uuId(); entity.setDutyPosition(positionId); this.baseMapper.create(entity); //生成默认岗位 BaseSystemInfo sysInfo = sysconfigApi.getSysConfigInfo(); PositionEntity positionEntity = new PositionEntity(); positionEntity.setId(positionId); positionEntity.setEnCode(codeNumService.getCodeFunction(() -> codeNumService.getCodeOnce(CodeConst.GW), code -> positionMapper.isExistByEnCode(code, null))); positionEntity.setFullName(sysInfo.getSysPositionName()); positionEntity.setOrganizeId(entity.getId()); positionEntity.setDefaultMark(1); positionMapper.create(positionEntity); redisUtil.remove(cacheKeyUtil.getOrganizeInfoList()); redisUtil.remove(cacheKeyUtil.getPositionList()); redisUtil.remove(TenantHolder.getDatasourceId() + CacheKeyUtil.SYS_ORG_Tree); redisUtil.remove(TenantHolder.getDatasourceId() + CacheKeyUtil.SYS_POS); } @Override public boolean update(String id, OrganizeEntity entity) { if (StringUtil.isEmpty(entity.getEnCode())) { entity.setEnCode(codeNumService.getCodeFunction(() -> codeNumService.getCodeOnce(CodeConst.ZZ), code -> this.isExistByEnCode(code, id))); } boolean updateById = this.baseMapper.update(id, entity); redisUtil.remove(cacheKeyUtil.getOrganizeInfoList()); redisUtil.remove(cacheKeyUtil.getPositionList()); redisUtil.remove(TenantHolder.getDatasourceId() + CacheKeyUtil.SYS_ORG_Tree); redisUtil.remove(TenantHolder.getDatasourceId() + CacheKeyUtil.SYS_POS); return updateById; } @Override public OrganizeEntity getInfo(String id) { return this.baseMapper.getInfo(id); } @Override @DSTransactional public List delete(String orgId) { OrganizeEntity organizeEntity = this.getInfo(orgId); if (organizeEntity == null) { throw new DataException(MsgCode.FA003.get()); } List orgList = this.baseMapper.getAllChild(orgId); Map> map = new HashMap<>(); for (OrganizeEntity org : orgList) { String organizeIdTree = org.getOrganizeIdTree(); int length = organizeIdTree.split(",").length; List organizeEntityList = map.get(length) != null ? map.get(length) : new ArrayList<>(); organizeEntityList.add(org); map.put(length, organizeEntityList); } List orgIdS = orgList.stream().map(OrganizeEntity::getId).collect(Collectors.toList()); List posList = positionMapper.getListByOrgIds(orgIdS); List posIds = posList.stream().map(PositionEntity::getId).collect(Collectors.toList()); List objectIds = new ArrayList<>(); objectIds.addAll(orgIdS); objectIds.addAll(posIds); List userList = userRelationService.getListByObjectIdAll(objectIds); if (CollectionUtil.isNotEmpty(userList)) { throw new DataException(MsgCode.PS040.get(MsgCode.PS003.get())); } //删除组织,和岗位 for (OrganizeEntity item : orgList) { this.removeById(item.getId()); positionMapper.deleteByOrgId(item.getId()); } List collect = map.keySet() .stream().sorted(Comparator.comparing(Integer::byteValue).reversed()) .collect(Collectors.toList()); List organizeEntities = new ArrayList<>(); for (Integer integer : collect) { organizeEntities.addAll(map.get(integer)); } //删除关系 for (UserRelationEntity ure : userList) { userRelationService.removeById(ure); } List roleList = roleRelationService.getListByObjectId(objectIds, null); for (RoleRelationEntity rre : roleList) { roleRelationService.removeById(rre); } redisUtil.remove(cacheKeyUtil.getOrganizeInfoList()); redisUtil.remove(cacheKeyUtil.getPositionList()); redisUtil.remove(TenantHolder.getDatasourceId() + CacheKeyUtil.SYS_ORG_Tree); redisUtil.remove(TenantHolder.getDatasourceId() + CacheKeyUtil.SYS_POS); return organizeEntities; } @Override public boolean checkLevel(OrganizeEntity entity) { BaseSystemInfo sysInfo = sysconfigApi.getSysConfigInfo(); Integer orgLevel = sysInfo.getOrgLevel(); OrganizeEntity pEntity = this.getInfo(entity.getParentId()); int thisLevel = 1; if (pEntity != null) { String[] parents = pEntity.getOrganizeIdTree().split(","); //创建修改不同判断 if (StringUtil.isEmpty(entity.getId())) { thisLevel += parents.length; } else { int childMax = 1; List allChild = this.baseMapper.getAllChild(entity.getId()); for (OrganizeEntity item : allChild) { String[] trees = item.getOrganizeIdTree().split(entity.getId() + ","); if (trees.length >= 2) { String[] childs = trees[1].split(","); int length = childs.length + 1; if (length > childMax) { childMax = length; } } } thisLevel = parents.length + childMax; } } return thisLevel <= orgLevel; } @Override public boolean checkOrgType(OrganizeEntity entity) { List listChild = this.getListByParentId(entity.getId()); OrgTypeEnum orgTypeEnum = OrgTypeEnum.get(entity.getCategory()); //有一个子组织类型不在范围内就false for (OrganizeEntity item : listChild) { if (!orgTypeEnum.getChildType().contains(item.getCategory())) { return false; } } return true; } @Override public Map getAllOrgsTreeName() { return this.baseMapper.getAllOrgsTreeName(); } @Override public Map getAllOrgsTreeName(boolean enabledMark) { return this.baseMapper.getAllOrgsTreeName(enabledMark); } @Override public List getListAll(List idAll, String keyWord) { return this.baseMapper.getListAll(idAll, keyWord); } @Override public List getListByIds(List idList) { return this.baseMapper.getListByIds(idList); } @Override public boolean isExistByFullName(OrganizeEntity entity, boolean isCheck, boolean isFilter) { return this.baseMapper.isExistByFullName(entity, isCheck, isFilter); } @Override public boolean isExistByEnCode(String enCode, String id) { return this.baseMapper.isExistByEnCode(enCode, id); } @Override public List getParentList(String parentId) { return this.baseMapper.getParentList(parentId); } @Override public List getListByParentIds(List idList) { return this.baseMapper.getListByParentIds(idList); } @Override public void setOrgTreeIdAndName(OrganizeEntity entity) { this.baseMapper.setOrgTreeIdAndName(entity); } @Override public List getDepsByParentId(String id) { return this.baseMapper.getDepsByParentId(id); } @Override public List getList(boolean filterEnabledMark) { return this.baseMapper.getList(filterEnabledMark); } @Override public OrganizeEntity getInfoByFullName(String fullName) { return this.baseMapper.getInfoByFullName(fullName); } @Override public List getList(String keyword, boolean filterEnabledMark) { return this.baseMapper.getList(keyword, filterEnabledMark); } /** * 获取组织信息 * * @return OrgId, OrgEntity */ @Override public Map getOrgMapsAll(SFunction... columns) { return this.baseMapper.getOrgMapsAll(columns); } /** * 获取组织信息 * * @param keyword * @param filterEnabledMark * @param category * @return OrgId, OrgEntity */ @Override public Map getOrgMaps(String keyword, boolean filterEnabledMark, String category, SFunction... columns) { return this.baseMapper.getOrgMaps(keyword, filterEnabledMark, category, columns); } /** * 组织基础过滤 * * @param queryWrapper * @param orderBy Map * @param groupBy Column * @param columns query * @return */ public Map getBaseOrgMaps(QueryWrapper queryWrapper, Map, Boolean> orderBy, List> groupBy, boolean bigColumnHas, SFunction... columns) { return this.baseMapper.getBaseOrgMaps(queryWrapper, orderBy, groupBy, bigColumnHas, columns); } @Override public List getOrgEntityList(List idList, Boolean enable) { return this.baseMapper.getOrgEntityList(idList, enable); } @Override public Map getOrgMap() { return this.baseMapper.getOrgMap(); } @Override public Map getOrgEncodeAndName(String category) { return this.baseMapper.getOrgEncodeAndName(category); } @Override public Map getOrgNameAndId(String category) { return this.baseMapper.getOrgNameAndId(category); } @Override public OrganizeEntity getByFullName(String fullName) { return this.baseMapper.getByFullName(fullName); } @Override public void getOrganizeIdTree(String organizeId, List organizeParentIdList) { this.baseMapper.getOrganizeIdTree(organizeId, organizeParentIdList); } @Override public void getOrganizeId(String organizeId, List organizeList) { this.baseMapper.getOrganizeId(organizeId, organizeList); } @Override public String allowDelete(String orgId) { // 组织底下是否有组织 List list = getListByParentId(orgId); if (Objects.nonNull(list) && list.size() > 0) { return MsgCode.PS003.get(); } // 组织底下是否有岗位 List positonList = positionMapper.getListByOrganizeId(Collections.singletonList(orgId), false); List positonIds = positonList.stream().map(PositionEntity::getId).collect(Collectors.toList()); // 组织底下是否有用户 if (userRelationService.existByObj(PermissionConst.ORGANIZE, orgId)) { return MsgCode.PS005.get(); } // 组织底下是否有角色 List listByObjectId = roleRelationService.getListByObjectId(positonIds, PermissionConst.POSITION); if (listByObjectId.size() > 0) { return MsgCode.PS006.get(); } return null; } @Override public List getOrganizeName(List id) { return this.baseMapper.getOrganizeName(id); } @Override public Map getOrganizeName(List id, String keyword, boolean filterEnabledMark, String category) { return this.baseMapper.getOrganizeName(id, keyword, filterEnabledMark, category); } @Override public List getUnderOrganizations(String organizeId, boolean filterEnabledMark) { return this.baseMapper.getUnderOrganizations(organizeId, filterEnabledMark); } @Override public List getUnderOrganizationss(String organizeId) { return this.baseMapper.getUnderOrganizationss(organizeId); } @Override public List getListByParentId(String id) { return this.baseMapper.getListByParentId(id); } @Override public List getAllOrgByUserId(String userId) { List ids = new ArrayList<>(); userRelationService.getAllOrgRelationByUserId(userId).forEach(r -> { ids.add(r.getObjectId()); }); return this.listByIds(ids); } @Override public String getFullNameByOrgIdTree(Map idNameMaps, String orgIdTree, String regex) { if (idNameMaps == null || idNameMaps.isEmpty()) { idNameMaps = this.getInfoList(); } return this.baseMapper.getFullNameByOrgIdTree(idNameMaps, orgIdTree, regex); } @Override public String getOrganizeIdTree(OrganizeEntity entity) { return this.baseMapper.getOrganizeIdTree(entity); } @Override public List getOrganizeByParentId(String parentId) { return this.baseMapper.getOrganizeByParentId(parentId); } @Override public List getAllChild(String id) { return this.baseMapper.getAllChild(id); } @Override public List getDepartmentAll(String organizeId) { return this.baseMapper.getDepartmentAll(organizeId); } @Override public OrganizeEntity getOrganizeCompany(String organizeId) { return this.baseMapper.getOrganizeCompany(organizeId); } @Override public void getOrganizeDepartmentAll(String organizeId, List organizeList) { this.baseMapper.getOrganizeDepartmentAll(organizeId, organizeList); } @Override public List getOrgIdTree(OrganizeEntity entity) { return this.baseMapper.getOrgIdTree(entity); } @Override public List upWardRecursion(List orgIDs, String orgID) { this.getOrgIDs(orgIDs, orgID); return orgIDs; } private void getOrgIDs(List orgIDs, String orgID) { OrganizeEntity info = this.getInfo(orgID); if (info != null) { this.getOrgIDs(orgIDs, info.getParentId()); orgIDs.add(info.getId()); } } @Override public Map getInfoList() { if (redisUtil.exists(cacheKeyUtil.getOrganizeInfoList())) { return new HashMap<>(redisUtil.getMap(cacheKeyUtil.getOrganizeInfoList())); } else { Map infoMap = this.baseMapper.getInfoList(); redisUtil.insert(cacheKeyUtil.getOrganizeInfoList(), infoMap); return infoMap; } } @Override public List selectedList(List idStrList) { return this.baseMapper.selectedList(idStrList); } @Override public List OrganizeCondition(List idStrList) { return this.baseMapper.OrganizeCondition(idStrList); } @Override public String getNameByIdStr(String idStr) { return this.baseMapper.getNameByIdStr(idStr); } @Override public List getProgeny(List idList, Integer enabledMark) { return this.baseMapper.getProgeny(idList, enabledMark); } }