/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.springblade.modules.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springblade.common.cache.SysCache; import org.springblade.common.utils.AuthUtils; import org.springblade.common.utils.NodeTreeUtil; import org.springblade.common.utils.SpringUtils; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.constant.BladeConstant; import org.springblade.core.tool.node.ForestNodeMerger; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.SpringUtil; import org.springblade.core.tool.utils.StringPool; import org.springblade.modules.community.entity.CommunityEntity; import org.springblade.modules.community.service.ICommunityService; import org.springblade.modules.grid.entity.GridEntity; import org.springblade.modules.grid.service.IGridService; import org.springblade.modules.police.entity.PoliceAffairsGridEntity; import org.springblade.modules.police.service.IPoliceAffairsGridService; import org.springblade.modules.property.entity.PropertyCompanyEntity; import org.springblade.modules.property.service.IPropertyCompanyService; import org.springblade.modules.system.entity.Dept; import org.springblade.modules.system.entity.Region; import org.springblade.modules.system.mapper.DeptMapper; import org.springblade.modules.system.node.DeptUserTreeNode; import org.springblade.modules.system.service.IDeptService; import org.springblade.modules.system.service.IRegionService; import org.springblade.modules.system.vo.DeptVO; import org.springblade.modules.system.wrapper.DeptWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 服务实现类 * * @author Chill */ @Service public class DeptServiceImpl extends ServiceImpl implements IDeptService { private static final String TENANT_ID = "tenantId"; private static final String PARENT_ID = "parentId"; @Autowired private IPropertyCompanyService propertyCompanyService; @Autowired private IRegionService regionService; @Override public List lazyList(String tenantId, Long parentId, Map param) { // 设置租户ID if (AuthUtil.isAdministrator()) { tenantId = StringPool.EMPTY; } String paramTenantId = Func.toStr(param.get(TENANT_ID)); if (Func.isNotEmpty(paramTenantId) && AuthUtil.isAdministrator()) { tenantId = paramTenantId; } // 判断点击搜索但是没有查询条件的情况 if (Func.isEmpty(param.get(PARENT_ID)) && param.size() == 1) { parentId = 0L; } // 判断数据权限控制,非超管角色只可看到本级及以下数据 if (Func.toLong(parentId) == 0L && !AuthUtils.isAdministratorOrAdmin(AuthUtil.getUserRole())) { Long deptId = Func.firstLong(AuthUtil.getDeptId()); Dept dept = SysCache.getDept(deptId); if (dept != null && dept.getParentId() != 0) { parentId = dept.getParentId(); } List deptVOS = baseMapper.lazyList(tenantId, parentId, param); deptVOS = deptVOS.stream().filter(item -> AuthUtil.getDeptId().contains(item.getId().toString())).collect(Collectors.toList()); return deptVOS; } // 判断点击搜索带有查询条件的情况 if (Func.isEmpty(param.get(PARENT_ID)) && param.size() > 1 && Func.toLong(parentId) == 0L) { parentId = null; } return baseMapper.lazyList(tenantId, parentId, param); } @Override public List tree(String tenantId) { Long id = null; // 判断数据权限控制,非超管角色只可看到本级及以下数据 if (!AuthUtil.isAdmin()) { id = Func.firstLong(AuthUtil.getDeptId()); } List tree = baseMapper.tree(tenantId, id); return ForestNodeMerger.merge(tree); } @Override public List lazyTree(String tenantId, Long parentId) { if (AuthUtil.isAdministrator()) { tenantId = StringPool.EMPTY; } // 判断数据权限控制,非超管角色只可看到本级及以下数据 // if (Func.toLong(parentId) == 0L && !AuthUtil.isAdministrator()) { // Long deptId = Func.firstLong(AuthUtil.getDeptId()); // Dept dept = SysCache.getDept(deptId); // if (dept.getParentId() != 0) { // parentId = dept.getParentId(); // } // } if (Func.toLong(parentId) == 0L && !AuthUtil.isAdmin()) { Long deptId = Func.firstLong(AuthUtil.getDeptId()); Dept dept = SysCache.getDept(deptId); if (dept != null && dept.getParentId() != 0) { parentId = dept.getParentId(); } List merge = ForestNodeMerger.merge(baseMapper.lazyTree(tenantId, parentId)); List copy = BeanUtil.copy(merge, DeptVO.class); copy = copy.stream().filter(item -> AuthUtil.getDeptId().contains(item.getId().toString())).collect(Collectors.toList()); return copy; } return ForestNodeMerger.merge(baseMapper.lazyTree(tenantId, parentId)); } @Override public String getDeptIds(String tenantId, String deptNames) { List deptList = baseMapper.selectList(Wrappers.query().lambda().eq(Dept::getTenantId, tenantId).in(Dept::getDeptName, Func.toStrList(deptNames))); if (deptList != null && deptList.size() > 0) { return deptList.stream().map(dept -> Func.toStr(dept.getId())).distinct().collect(Collectors.joining(",")); } return null; } @Override public String getDeptIdsByFuzzy(String tenantId, String deptNames) { LambdaQueryWrapper queryWrapper = Wrappers.query().lambda().eq(Dept::getTenantId, tenantId); queryWrapper.and(wrapper -> { List names = Func.toStrList(deptNames); names.forEach(name -> wrapper.like(Dept::getDeptName, name).or()); }); List deptList = baseMapper.selectList(queryWrapper); if (deptList != null && deptList.size() > 0) { return deptList.stream().map(dept -> Func.toStr(dept.getId())).distinct().collect(Collectors.joining(",")); } return null; } @Override public List getDeptNames(String deptIds) { return baseMapper.getDeptNames(Func.toLongArray(deptIds)); } @Override public List getDeptChild(Long deptId) { return baseMapper.selectList(Wrappers.query().lambda().like(Dept::getAncestors, deptId)); } @Override @Transactional(rollbackFor = Exception.class) public boolean removeDept(String ids) { Long cnt = baseMapper.selectCount(Wrappers.query().lambda().in(Dept::getParentId, Func.toLongList(ids))); if (cnt > 0L) { throw new ServiceException("请先删除子节点!"); } List longs = Func.toLongList(ids); // 遍历 for (Long id : longs) { // 查询当前机构信息 DeptVO dept = baseMapper.getDeptById(id); // 如果父机构为物业公司 if (dept.getParentName().equals("物业公司")) { // 删除 propertyCompanyService.remove(Wrappers.update().lambda().eq(PropertyCompanyEntity::getDeptId, id)); } } return removeByIds(longs); } @Override public boolean submit(Dept dept) { deptHandle(dept); // 保存并返回 return saveOrUpdate(dept); } /** * 机构信息处理 * * @param dept */ private void deptHandle(Dept dept) { if (Func.isEmpty(dept.getParentId())) { dept.setTenantId(AuthUtil.getTenantId()); dept.setParentId(BladeConstant.TOP_PARENT_ID); dept.setAncestors(String.valueOf(BladeConstant.TOP_PARENT_ID)); } if (dept.getParentId() > 0) { Dept parent = getById(dept.getParentId()); if (Func.toLong(dept.getParentId()) == Func.toLong(dept.getId())) { throw new ServiceException("父节点不可选择自身!"); } dept.setTenantId(parent.getTenantId()); String ancestors = parent.getAncestors() + StringPool.COMMA + dept.getParentId(); dept.setAncestors(ancestors); } dept.setIsDeleted(BladeConstant.DB_NOT_DELETED); } /** * 自定义新增或修改 * * @param dept * @return */ @Override @Transactional(rollbackFor = Exception.class) public boolean saveOrUpdateDeptInfo(Dept dept) { boolean flag = false; deptHandle(dept); // 判断类型,如果为物业公司(上级机构名称为物业公司),名称不能重复 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("is_deleted", 0).eq("id", dept.getParentId()); Dept parentDept = getOne(queryWrapper); // 如果父机构为物业公司 if (parentDept != null && parentDept.getDeptName().equals("物业公司")) { // 查询当前 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("is_deleted", 0) .eq("dept_name", dept.getDeptName()); Dept one = getOne(wrapper); if (null != one) { dept.setId(one.getId()); flag = updateById(dept); } else { if (dept.getId() != null && dept.getId() > 0) { flag = updateById(dept); } else { flag = save(dept); } } //保存物业公司信息 savePropertyCompany(dept); } else { flag = saveOrUpdate(dept); } // 保存并返回 return flag; } /** * 保存物业公司信息 * * @param dept */ @Transactional(rollbackFor = Exception.class) public void savePropertyCompany(Dept dept) { // 查询物业公司是否存在 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("is_deleted", 0) .eq("dept_id", dept.getId()); PropertyCompanyEntity propertyCompanyEntity = propertyCompanyService.getOne(wrapper); if (null != propertyCompanyEntity) { // 修改 propertyCompanyEntity.setDeptId(dept.getId()); propertyCompanyEntity.setName(dept.getDeptName()); // 往物业公司表中插入一条数据 propertyCompanyService.updateById(propertyCompanyEntity); } else { // 新增 PropertyCompanyEntity companyEntity = new PropertyCompanyEntity(); companyEntity.setDeptId(dept.getId()); companyEntity.setName(dept.getDeptName()); // 往物业公司表中插入一条数据 propertyCompanyService.save(companyEntity); } } @Override public List search(String deptName, Long parentId) { String tenantId = AuthUtil.getTenantId(); LambdaQueryWrapper queryWrapper = Wrappers.query().lambda(); if (Func.isNotEmpty(tenantId)) { queryWrapper.eq(Dept::getTenantId, tenantId); } if (Func.isNotEmpty(deptName)) { queryWrapper.like(Dept::getDeptName, deptName); } if (Func.isNotEmpty(parentId) && parentId > 0L) { queryWrapper.eq(Dept::getParentId, parentId); } List deptList = baseMapper.selectList(queryWrapper); return DeptWrapper.build().listNodeVO(deptList); } /** * 数据处理(社区绑定) */ @Override @Transactional(rollbackFor = Exception.class) public Object dataHandle() { // 查询所有的社区 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("district_code", "361102").eq("region_level", 5); List list = regionService.list(queryWrapper); // 遍历 for (Region region : list) { // 查询是否已创建 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("is_deleted", 0).eq("dept_name", region.getName()); Dept one = getOne(wrapper); if (null == one) { // 新增 Dept dept = new Dept(); dept.setFullName(region.getName()); dept.setDeptName(region.getName()); dept.setDeptCategory(1); dept.setTenantId("000000"); // 查询上级id QueryWrapper deptQueryWrapper = new QueryWrapper<>(); deptQueryWrapper.eq("is_deleted", 0).eq("dept_name", region.getTownName()); Dept parentDept = getOne(deptQueryWrapper); if (null != parentDept) { dept.setParentId(parentDept.getId()); dept.setAncestors(parentDept.getAncestors() + "," + parentDept.getId()); } dept.setRegionCode(region.getCode()); // 新增 saveOrUpdate(dept); // 插入社区表数据 } } return null; } /** * 数据处理(社区绑定)--处理机构 */ @Override @Transactional(rollbackFor = Exception.class) public Object dataHandleCommunity() { // 查询所有的社区 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("district_code", "361102").eq("region_level", 5); List list = regionService.list(queryWrapper); // 遍历 for (Region region : list) { // 查询是否已创建 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("is_deleted", 0).eq("name", region.getName()); CommunityEntity one = SpringUtil.getBean(ICommunityService.class).getOne(wrapper); if (null == one) { // 新增 CommunityEntity communityEntity = new CommunityEntity(); communityEntity.setStreetCode(region.getTownCode()); communityEntity.setName(region.getName()); communityEntity.setCode(region.getCode()); // 新增 SpringUtil.getBean(ICommunityService.class).save(communityEntity); } } return null; } /** * 数据处理(区域网格编号绑定) */ @Override @Transactional(rollbackFor = Exception.class) public Object dataRegionGridCodeBindHandle() { // 查询网格对应的机构信息(包含父级机构名称) List deptVOS = baseMapper.getGridDeptAndParentList(); //遍历处理 for (DeptVO deptVO : deptVOS) { GridEntity gridEntity = SpringUtils.getBean(IGridService.class).getGridByNames(deptVO.getDeptName(), deptVO.getParentName()); if (null != gridEntity) { deptVO.setRegionCode(gridEntity.getGridCode()); // 更新 updateById(deptVO); } } return null; } @Override public List getDeptAndUserTree(DeptUserTreeNode treeNode) { // 查询数据 // Map deptMap = baseMapper.getDeptMap(treeNode); Map deptMap = baseMapper.getDeptMapAndChildren(treeNode); Map userMap = baseMapper.getUserMap(treeNode); deptMap.putAll(userMap); List deptAndUserNodeTree = NodeTreeUtil.getDeptAndUserNodeTree(deptMap); return deptAndUserNodeTree; } @Override public Object getDeptAndUserTreeLazyTree(DeptUserTreeNode treeNode) { //传一个部门id,查询出该部门的下一级部门 Map deptMap = baseMapper.getDeptMapAndChild(treeNode); String deptIds = ""; int count = 0; for (String key : deptMap.keySet()) { count++; deptIds += key; if (count < deptMap.size()) { deptIds += ","; } } Map userMap = baseMapper.getUserMapByDeptIds(deptIds); deptMap.putAll(userMap); List deptAndUserNodeTree = NodeTreeUtil.getDeptAndUserNodeTree(deptMap); return deptAndUserNodeTree; } /** * 数据处理(社区绑定)-- 处理社区(派出所下) */ @Override @Transactional(rollbackFor = Exception.class) public Object dataHandleCommunityByPolice() { // 查询所有的派出所 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("is_deleted", 0).like("dept_name", "派出所"); List list = list(wrapper); // 遍历 for (Dept dept : list) { // 通过派出所名称查询对应的警务网格信息 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("is_deleted", 0).eq("pcs_name", dept.getDeptName()); List policeAffairsGridEntityList = SpringUtil.getBean(IPoliceAffairsGridService.class).list(queryWrapper); // 遍历 for (PoliceAffairsGridEntity policeAffairsGridEntity : policeAffairsGridEntityList) { Dept deptInfo = new Dept(); deptInfo.setTenantId("000000"); deptInfo.setDeptName(policeAffairsGridEntity.getCommunityName()); deptInfo.setFullName(policeAffairsGridEntity.getCommunityName()); deptInfo.setDeptCategory(1); deptInfo.setDeptNature(1); deptInfo.setParentId(dept.getId()); deptInfo.setAncestors(dept.getAncestors() + "," + dept.getId()); deptInfo.setRegionCode(policeAffairsGridEntity.getJwGridCode()); // 保存 save(deptInfo); } } return null; } /** * 查询对应的派出所 * * @param deptId * @return */ @Override public Dept getDeptByDeptIds(String deptId) { return baseMapper.getDeptByDeptIds(deptId); } }