/* * 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.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.util.Strings; import org.springblade.common.cache.SysCache; import org.springblade.common.node.TreeStringNode; import org.springblade.common.utils.AuthUtils; import org.springblade.common.utils.NodeTreeUtil; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringPool; import org.springblade.modules.system.entity.Dept; import org.springblade.modules.system.entity.Region; import org.springblade.modules.system.excel.RegionExcel; import org.springblade.modules.system.mapper.RegionMapper; import org.springblade.modules.system.service.IDeptService; import org.springblade.modules.system.service.IRegionService; import org.springblade.modules.system.vo.RegionParamVO; import org.springblade.modules.system.vo.RegionVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; import static org.springblade.common.cache.RegionCache.*; /** * 行政区划表 服务实现类 * * @author Chill */ @Service public class RegionServiceImpl extends ServiceImpl implements IRegionService { @Autowired private IDeptService deptService; @Override public boolean submit(Region region) { Long cnt = baseMapper.selectCount(Wrappers.query().lambda().eq(Region::getCode, region.getCode())); if (cnt > 0L) { return this.updateById(region); } // 设置祖区划编号 Region parent = getByCode(region.getParentCode()); if (Func.isNotEmpty(parent) || Func.isNotEmpty(parent.getCode())) { String ancestors = parent.getAncestors() + StringPool.COMMA + parent.getCode(); region.setAncestors(ancestors); } // 设置省、市、区、镇、村 Integer level = region.getRegionLevel(); String code = region.getCode(); String name = region.getName(); if (level == PROVINCE_LEVEL) { region.setProvinceCode(code); region.setProvinceName(name); } else if (level == CITY_LEVEL) { region.setCityCode(code); region.setCityName(name); } else if (level == DISTRICT_LEVEL) { region.setDistrictCode(code); region.setDistrictName(name); } else if (level == TOWN_LEVEL) { region.setTownCode(code); region.setTownName(name); } else if (level == VILLAGE_LEVEL) { region.setVillageCode(code); region.setVillageName(name); } return this.save(region); } @Override public boolean removeRegion(String id) { Long cnt = baseMapper.selectCount(Wrappers.query().lambda().eq(Region::getParentCode, id)); if (cnt > 0L) { throw new ServiceException("请先删除子节点!"); } return removeById(id); } @Override public List lazyList(String parentCode, Map param) { return baseMapper.lazyList(parentCode, param); } @Override public List lazyTree(String parentCode, Map param) { return baseMapper.lazyTree(parentCode, param); } @Override public void importRegion(List data, Boolean isCovered) { List list = new ArrayList<>(); data.forEach(regionExcel -> { Region region = BeanUtil.copy(regionExcel, Region.class); list.add(region); }); if (isCovered) { this.saveOrUpdateBatch(list); } else { this.saveBatch(list); } } @Override public List exportRegion(Wrapper queryWrapper) { return baseMapper.exportRegion(queryWrapper); } /** * 树列表 * * @param region * @return */ @Override public List getTree(RegionParamVO region) { List regionChildCodesList = SysCache.getRegionChildCodesByDeptId(AuthUtil.getDeptId(), null); Integer isAdministrator = AuthUtils.isAdministratorOrAdmin(AuthUtil.getUserRole()) == true ? 1 : 2; if (null != region.getDeptNature()) { // 公安 if (region.getDeptNature() == 1) { // 查询公安对应的辖区树 return NodeTreeUtil.getStringNodeTree(baseMapper.getPoliceTreeList()); } // 综治的需要查到网格 if (region.getDeptNature()==2){ region.setCityCode("361102"); region.setDistrictCode("361102"); } // 综治的需要查到网格 if (region.getDeptNature()==3){ region.setDistrictCode("361102"); } } // 非公安 Map treeList = baseMapper.getTreeList(region, regionChildCodesList, isAdministrator); return NodeTreeUtil.getStringNodeTree(treeList); } /** * 树列表(获取当前树) * * @param code * @return */ @Override public List getTownTree(String code) { String regionCode = null; if (!AuthUtil.isAdministrator() && !AuthUtil.isAdmin()) { Dept dept = deptService.getById(AuthUtil.getDeptId()); if (null != dept) { regionCode = dept.getRegionCode(); if (StringUtils.isNotBlank(regionCode) && regionCode.equals("361100")) { regionCode = "361102"; } } } return NodeTreeUtil.getStringNodeTree(baseMapper.getTownTree(regionCode)); } /** * 树列表(包含省市县三级) * * @return */ @Override public List getBaseTree() { return NodeTreeUtil.getStringNodeTree(baseMapper.getBaseTree()); } /** * 区划数据处理 */ @Override public void regionDataHandle() { // 查询所有区划数据 List regionList = baseMapper.getCodeLess12DataList(); // 遍历处理 for (Region region : regionList) { // 设置code region.setCode(StringUtils.rightPad(region.getCode(), 12, "0")); // 设置parent_code region.setParentCode(StringUtils.rightPad(region.getParentCode(), 12, "0")); // 设置Ancestors setAncestors(region); // 设置ProvinceCode region.setProvinceCode(StringUtils.rightPad(region.getProvinceCode(), 12, "0")); // 设置CityCode region.setCityCode(StringUtils.rightPad(region.getCityCode(), 12, "0")); // 设置DistrictCode region.setDistrictCode(StringUtils.rightPad(region.getDistrictCode(), 12, "0")); // 设置TownCode region.setTownCode(StringUtils.rightPad(region.getTownCode(), 12, "0")); // 设置VillageCode region.setVillageCode(StringUtils.rightPad(region.getVillageCode(), 12, "0")); // 更新 updateById(region); } } /** * Ancestors 字段处理 * * @param region */ private void setAncestors(Region region) { String[] split = region.getAncestors().split(","); List list = new ArrayList<>(); for (String s : split) { list.add(StringUtils.rightPad(s, 12, "0")); } region.setAncestors(Strings.join(list, ',')); } /** * 查询下级区域(拼接网格) * * @param regionCode * @return */ @Override public List getRegionChild(String regionCode, String communityCode) { // 创建区域对象 List list = new ArrayList<>(); // 查询公安相关的区域数据 List regionList = baseMapper.getPoliceList(communityCode); if (regionList.size() > 0) { List policeList = treeRegionList(regionList, regionCode, list); list.addAll(policeList); } // 查询综治区域集合 List regionChildList = baseMapper.getRegionChildList(regionCode, null, null); list.addAll(regionChildList); // 返回 return list; } /** * 获取民警下级区域 * * @param regionCode * @return */ @Override public List getPoliceRegionChild(String regionCode, String communityCode) { // 创建区域对象 List list = new ArrayList<>(); // 查询公安相关的区域数据 List regionList = baseMapper.getPoliceList(communityCode); if (regionList.size() > 0) { List policeList = treeRegionList(regionList, regionCode, list); list.addAll(policeList); } // 返回 return list; } /** * 获取综治下级区域 * * @param regionCode * @return */ @Override public List getGridRegionChild(String regionCode, String communityCode, String roleName) { // 创建区域对象 List list = new ArrayList<>(); if (!Strings.isBlank(roleName) && roleName.equals("wgy")) { // 查询综治区域集合 List regionChildList = baseMapper.getGridRegionChildList(regionCode); list.addAll(regionChildList); }else if (!Strings.isBlank(roleName) && roleName.equals("mj")){ // 查询公安相关的区域数据 List regionList = baseMapper.getPoliceList(communityCode); if (regionList.size()>0) { List policeList = treeRegionList(regionList,regionCode, list); list.addAll(policeList); } } else { // 查询综治区域集合 List regionChildList = baseMapper.getRegionChildList(regionCode, communityCode, roleName); list.addAll(regionChildList); } // 返回 return list; } /** * 获取某个父节点下面的所有子节点 * * @param regionList * @param parentCode * @param list * @return */ public static List treeRegionList(List regionList, String parentCode, List list) { for (Region region : regionList) { //遍历出父id等于参数的id,add进子节点集合 if (region.getParentCode().equals(parentCode)) { list.add(region); //递归遍历下一级 treeRegionList(regionList, region.getCode(), list); } if(region.getCode().equals(parentCode)){ // 本身也加入 list.add(region); } } return list; } /** * 查询当前文章范围对应的社区编号字符串集合 * @param articleRange * @return */ @Override public String getAllCommunityNameListString(String articleRange) { // 分割后es搜索才有效果,不能用逗号分割 return String.join("\\",baseMapper.getAllCommunityNameListString(articleRange)); } /** * 树列表-查询到社区的树 * * @return */ @Override public List treeToCommunity(String isFiter) { List regionChildCodesList = SysCache.getRegionChildCodesByDeptId(AuthUtil.getDeptId(), null); Integer isAdministrator; // 判断是否是超级管理员,并且是否过滤,isfiter为空时,过滤 if (StringUtils.isBlank(isFiter)) { isAdministrator = AuthUtils.isAdministratorOrAdmin(AuthUtil.getUserRole()) == true ? 1 : 2; } else { isAdministrator = 1; } // 查询 Map treeList = baseMapper.treeToCommunity(regionChildCodesList, isAdministrator); return NodeTreeUtil.getStringNodeTree(treeList); } }