package cn.huge.module.kind.service; import cn.huge.base.common.exception.ServiceException; import cn.huge.base.common.utils.DateUtils; import cn.huge.base.common.utils.IdUtils; import cn.huge.base.common.utils.ObjectUtils; import cn.huge.module.client.api.impl.CustClientImpl; import cn.huge.module.client.api.impl.UtilsClientImpl; import cn.huge.module.constant.BaseConsts; import cn.huge.module.cust.dto.CtUnitDTO; import cn.huge.module.kind.dao.mapper.SyRegionMapper; import cn.huge.module.kind.domain.bo.AreaBO; import cn.huge.module.kind.domain.dto.RegionSelectJSDTO; import cn.huge.module.kind.domain.po.SyRegion; import cn.huge.module.sys.dto.QueAddrBaseDTO; import cn.huge.module.sys.dto.QueAreaDTO; import cn.huge.module.utils.BaiduMapAddrDTO; import cn.huge.module.utils.BaiduMapLngLatDTO; import cn.huge.module.utils.BaiduMapUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import javax.swing.plaf.synth.Region; import java.util.*; /** * @author liyj * @version 1.0.0 * @title: 地域字典表业务逻辑处理 * @Description 地域字典表业务逻辑处理 * @company hugeinfo * @Time 2024-09-09 14:31:22 */ @Slf4j @Service @Transactional(rollbackFor = Exception.class) public class SyRegionService extends ServiceImpl { @Autowired private SyRegionMapper mapper; @Autowired private UtilsClientImpl utilsClient; @Autowired private CustClientImpl custClient; /** * 更新对象 * * @param entity 对象 */ public void updateSyRegion(SyRegion entity) { try { mapper.updateSyRegion(entity); } catch (Exception e) { log.error("[SyRegionService.updateSyRegion]调用失败,异常信息:" + e, e); throw new ServiceException("SyRegionService.updateSyRegion", e); } } /** * 条件更新对象 * * @param entity 对象 * @param terms 条件 */ public void updateSyRegionTerms(SyRegion entity, Map terms) { try { mapper.updateSyRegionTerms(entity, terms); } catch (Exception e) { log.error("[SyRegionService.updateSyRegionTerms]调用失败,异常信息:" + e, e); throw new ServiceException("SyRegionService.updateSyRegionTerms", e); } } /** * 根据编号物理删除 * * @param id 查询条件集合 */ public void deleteSyRegion(String id) { try { mapper.deleteSyRegion(id); } catch (Exception e) { log.error("[SyRegionService.deleteSyRegion]调用失败,异常信息:" + e, e); throw new ServiceException("SyRegionService.deleteSyRegion", e); } } /** * 按条件查询 * * @param terms 条件 * @return List */ public List listTerms(Map terms) { return mapper.listTerms(terms); } /** * 按条件统计 * * @param terms 条件 * @return long */ public long countTerms(Map terms) { return mapper.countTerms(terms); } /** * 按条件分页查询 * * @param page 分页对象 * @param terms 条件 * @return Page */ public Page pageQuery(PageRequest page, Map terms) { long total = mapper.countTerms(terms); List content = mapper.pageTerms(page, terms); return new PageImpl(content, page, total); } /** * 新增或更新对象 * * @param syRegion 实体对象 */ public void saveSyRegion(SyRegion syRegion) { try { Date nowDate = DateUtils.getNowDate(); // 判断是否新增 if (IdUtils.checkNewId(syRegion.getId())) { syRegion.setId(utilsClient.getNewTimeId()); syRegion.setCreateTime(nowDate); } syRegion.setUpdateTime(nowDate); this.saveOrUpdate(syRegion); } catch (Exception e) { log.error("[SyRegionService.saveSyRegion]调用失败,异常信息:" + e, e); throw new ServiceException("SyRegionService.saveSyRegion", e); } } /** * 递归保存树形结构 * * @param childrenList * @param level */ public void webSaveByJSTree(List childrenList, int level) { try { Date nowDate = new Date(); for (RegionSelectJSDTO regionSelectJSDTO : childrenList) { SyRegion region = new SyRegion(); region.setId(regionSelectJSDTO.getValue()); region.setKind(level); region.setName(regionSelectJSDTO.getLabel()); region.setLevel(level); region.setParentId(regionSelectJSDTO.getParentId()); region.setCreateTime(nowDate); region.setUpdateTime(nowDate); this.saveOrUpdate(region); if (CollectionUtils.isNotEmpty(regionSelectJSDTO.getChildren())) { this.webSaveByJSTree(regionSelectJSDTO.getChildren(), level + 1); } } } catch (Exception e) { log.error("[SyRegionService.webSaveByJSTree]调用失败,异常信息:" + e, e); throw new ServiceException("SyRegionService.webSaveByJSTree", e); } } /** * 根据百度地图经纬度获取街道 * * @param lng * @param lat * @return */ public QueAddrBaseDTO getQueAddrByBaiduiLngLat(String lng, String lat) { try { QueAddrBaseDTO queAddrBaseDTO = new QueAddrBaseDTO(); BaiduMapAddrDTO baiduMapAddrDTO = BaiduMapUtils.getAddrByLngLat(lng, lat, BaiduMapUtils.coordtype_bd09ll); if (ObjectUtils.isNotEmpty(baiduMapAddrDTO)) { QueryWrapper syRegionQueryWrapper = new QueryWrapper<>(); // 查询省 syRegionQueryWrapper.like("name", baiduMapAddrDTO.getProvince()); SyRegion province = mapper.selectOne(syRegionQueryWrapper); queAddrBaseDTO.setQueProv(province.getId()); queAddrBaseDTO.setQueProvName(province.getName()); // 查询市 syRegionQueryWrapper.clear(); syRegionQueryWrapper.like("name", baiduMapAddrDTO.getCity()); SyRegion city = mapper.selectOne(syRegionQueryWrapper); queAddrBaseDTO.setQueCity(city.getId()); queAddrBaseDTO.setQueCityName(city.getName()); // 查询区 syRegionQueryWrapper.clear(); syRegionQueryWrapper.like("name", baiduMapAddrDTO.getDistrict()); SyRegion district = mapper.selectOne(syRegionQueryWrapper); queAddrBaseDTO.setQueArea(district.getId()); queAddrBaseDTO.setQueAreaName(district.getName()); // 查询街道 syRegionQueryWrapper.clear(); syRegionQueryWrapper.like("name", baiduMapAddrDTO.getTown()); SyRegion town = mapper.selectOne(syRegionQueryWrapper); queAddrBaseDTO.setQueRoad(town.getId()); queAddrBaseDTO.setQueRoadName(town.getName()); } return queAddrBaseDTO; } catch (Exception e) { log.error("[SyRegionService.getQueAddrByBaiduiLngLat]调用失败,异常信息:" + e, e); throw new ServiceException("SyRegionService.getQueAddrByBaiduiLngLat", e); } } /** * 根据百度地图地址获取街道 * * @param addr * @return */ public QueAddrBaseDTO getQueAddrByBaiduiAddr(String addr) { try { QueAddrBaseDTO queAddrBaseDTO = new QueAddrBaseDTO(); BaiduMapLngLatDTO baiduMapLngLatDTO = BaiduMapUtils.getLngLatByAddr(addr, "广州市"); if (StringUtils.isNotEmpty(baiduMapLngLatDTO.getLng()) && StringUtils.isNotEmpty(baiduMapLngLatDTO.getLat())) { queAddrBaseDTO = this.getQueAddrByBaiduiLngLat(baiduMapLngLatDTO.getLng(), baiduMapLngLatDTO.getLat()); } return queAddrBaseDTO; } catch (Exception e) { log.error("[SyRegionService.getQueAddrByBaiduiLngLat]调用失败,异常信息:" + e, e); throw new ServiceException("SyRegionService.getQueAddrByBaiduiLngLat", e); } } public List listByParentId(String parentId) { List list = new ArrayList<>(); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("parent_id", parentId); List syRegions = mapper.selectList(queryWrapper); if (ObjectUtils.isNotEmpty(syRegions)) { for (SyRegion syRegion : syRegions) { QueAreaDTO queAreaDTO = new QueAreaDTO(); queAreaDTO.setAreaCode(syRegion.getId()); queAreaDTO.setAreaName(syRegion.getName()); queAreaDTO.setParentId(syRegion.getParentId()); list.add(queAreaDTO); } } return list; } public List treeByUserId(String userId, String areaType) { CtUnitDTO ctUnitDTO = custClient.getUnitByUserId(userId); Integer unitGrade = ctUnitDTO.getUnitGrade(); log.info("treeByUserId ctUnitDTO {}", ctUnitDTO); Set areaSet = new HashSet<>(); if (unitGrade.equals(1)) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.gt("level", 0); if (ObjectUtils.isNotEmpty(areaType)) { queryWrapper.le("level", areaType); } queryWrapper.orderByAsc("level", "create_time"); List syRegions = mapper.selectList(queryWrapper); for (SyRegion syRegion : syRegions) { AreaBO areaBO = new AreaBO(); areaBO.setParentId(syRegion.getParentId()); if (syRegion.getLevel().equals(1)) { areaBO.setParentId("root"); } areaBO.setLevel(String.valueOf(syRegion.getLevel())); areaBO.setLabel(syRegion.getName()); areaBO.setValue(syRegion.getId()); areaBO.setSort(syRegion.getId()); areaSet.add(areaBO); } } else if (unitGrade.equals(2)) { SyRegion areaSyRegion = mapper.selectById(ctUnitDTO.getArea()); if (ObjectUtils.isNotEmpty(areaSyRegion)) { AreaBO areaBO = new AreaBO(); areaBO.setParentId("root"); areaBO.setLabel(areaSyRegion.getName()); areaBO.setValue(areaSyRegion.getId()); areaBO.setLevel(String.valueOf(areaSyRegion.getLevel())); areaBO.setSort(areaSyRegion.getId()); areaSet.add(areaBO); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("parent_id", areaSyRegion.getId()); if (ObjectUtils.isNotEmpty(areaType)) { queryWrapper.le("level", areaType); } List syRegions = mapper.selectList(queryWrapper); for (SyRegion syRegion : syRegions) { AreaBO roadaBO = new AreaBO(); roadaBO.setParentId(syRegion.getParentId()); roadaBO.setLabel(syRegion.getName()); roadaBO.setValue(syRegion.getId()); roadaBO.setLevel(String.valueOf(syRegion.getLevel())); roadaBO.setSort(syRegion.getId()); areaSet.add(roadaBO); QueryWrapper villageWrapper = new QueryWrapper(); villageWrapper.eq("parent_id", syRegion.getId()); if (ObjectUtils.isNotEmpty(areaType)) { villageWrapper.le("level", areaType); } List villages = mapper.selectList(villageWrapper); for (SyRegion village : villages) { AreaBO villageBO = new AreaBO(); villageBO.setParentId(village.getParentId()); villageBO.setLabel(village.getName()); villageBO.setValue(village.getId()); villageBO.setLevel(String.valueOf(village.getLevel())); villageBO.setSort(village.getId()); areaSet.add(villageBO); } } } } else if (unitGrade.equals(3)) { SyRegion roadSyRegion = mapper.selectById(ctUnitDTO.getRoad()); AreaBO roadaBO = new AreaBO(); roadaBO.setParentId("root"); roadaBO.setLabel(roadSyRegion.getName()); roadaBO.setValue(roadSyRegion.getId()); roadaBO.setLevel(String.valueOf(roadSyRegion.getLevel())); roadaBO.setSort(roadSyRegion.getId()); areaSet.add(roadaBO); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("parent_id", roadSyRegion.getId()); if (ObjectUtils.isNotEmpty(areaType)) { queryWrapper.le("level", areaType); } List syRegions = mapper.selectList(queryWrapper); for (SyRegion syRegion : syRegions) { AreaBO villageBO = new AreaBO(); villageBO.setParentId(syRegion.getParentId()); villageBO.setLabel(syRegion.getName()); villageBO.setValue(syRegion.getId()); villageBO.setLevel(String.valueOf(syRegion.getLevel())); villageBO.setSort(syRegion.getId()); areaSet.add(villageBO); } } else if (unitGrade.equals(4)) { SyRegion roadSyRegion = mapper.selectById(ctUnitDTO.getVillage()); AreaBO roadaBO = new AreaBO(); roadaBO.setParentId("root"); roadaBO.setLabel(roadSyRegion.getName()); roadaBO.setValue(roadSyRegion.getId()); roadaBO.setLevel(String.valueOf(roadSyRegion.getLevel())); roadaBO.setSort(roadSyRegion.getId()); areaSet.add(roadaBO); } if (ObjectUtils.isEmpty(areaSet)) { return new ArrayList<>(); } List areaBOList = sort(areaSet); List areaBOS = sortArea(areaBOList); return createTree(areaBOS, null); } public List treeByUserId2(String userId, String areaType) { CtUnitDTO ctUnitDTO = custClient.getUnitByUserId(userId); Integer unitGrade = ctUnitDTO.getUnitGrade(); if (unitGrade == 4) { unitGrade = 3; } log.info("treeByUserId unitGrade {}", unitGrade); Set areaSet = new HashSet<>(); if (unitGrade.equals(1)) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.gt("level", 0); queryWrapper.orderByAsc("level", "create_time"); if (ObjectUtils.isNotEmpty(areaType)) { queryWrapper.le("level", areaType); } List syRegions = mapper.selectList(queryWrapper); for (SyRegion syRegion : syRegions) { AreaBO areaBO = new AreaBO(); areaBO.setParentId(syRegion.getParentId()); if (syRegion.getLevel().equals(1)) { areaBO.setParentId("root"); } areaBO.setLevel(String.valueOf(syRegion.getLevel())); areaBO.setLabel(syRegion.getName()); areaBO.setValue(syRegion.getId()); areaBO.setSort(syRegion.getId()); areaSet.add(areaBO); } } else if (unitGrade.equals(2)) { SyRegion areaSyRegion = mapper.selectById(ctUnitDTO.getArea()); if (ObjectUtils.isNotEmpty(areaSyRegion)) { AreaBO areaBO = new AreaBO(); areaBO.setParentId("root"); areaBO.setLabel(areaSyRegion.getName()); areaBO.setValue(areaSyRegion.getId()); areaBO.setLevel(String.valueOf(areaSyRegion.getLevel())); areaBO.setSort(areaSyRegion.getId()); areaSet.add(areaBO); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("parent_id", areaSyRegion.getId()); if (ObjectUtils.isNotEmpty(areaType)) { queryWrapper.le("level", areaType); } List syRegions = mapper.selectList(queryWrapper); for (SyRegion syRegion : syRegions) { AreaBO roadaBO = new AreaBO(); roadaBO.setParentId(syRegion.getParentId()); roadaBO.setLabel(syRegion.getName()); roadaBO.setValue(syRegion.getId()); roadaBO.setLevel(String.valueOf(syRegion.getLevel())); roadaBO.setSort(syRegion.getId()); areaSet.add(roadaBO); QueryWrapper villageWrapper = new QueryWrapper(); villageWrapper.eq("parent_id", syRegion.getId()); if (ObjectUtils.isNotEmpty(areaType)) { villageWrapper.le("level", areaType); } List villages = mapper.selectList(villageWrapper); for (SyRegion village : villages) { AreaBO villageBO = new AreaBO(); villageBO.setParentId(village.getParentId()); villageBO.setLabel(village.getName()); villageBO.setValue(village.getId()); villageBO.setLevel(String.valueOf(village.getLevel())); villageBO.setSort(village.getId()); areaSet.add(villageBO); } } } } else if (unitGrade.equals(3)) { SyRegion roadSyRegion = mapper.selectById(ctUnitDTO.getArea()); AreaBO roadaBO = new AreaBO(); roadaBO.setParentId("root"); roadaBO.setLabel(roadSyRegion.getName()); roadaBO.setValue(roadSyRegion.getId()); roadaBO.setLevel(String.valueOf(roadSyRegion.getLevel())); roadaBO.setSort(roadSyRegion.getId()); areaSet.add(roadaBO); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("parent_id", roadSyRegion.getId()); if (ObjectUtils.isNotEmpty(areaType)) { queryWrapper.le("level", areaType); } List syRegions = mapper.selectList(queryWrapper); for (SyRegion syRegion : syRegions) { AreaBO villageBO = new AreaBO(); villageBO.setParentId(syRegion.getParentId()); villageBO.setLabel(syRegion.getName()); villageBO.setValue(syRegion.getId()); villageBO.setLevel(String.valueOf(syRegion.getLevel())); villageBO.setSort(syRegion.getId()); areaSet.add(villageBO); } } else if (unitGrade.equals(4)) { SyRegion roadSyRegion = mapper.selectById(ctUnitDTO.getArea()); AreaBO roadaBO = new AreaBO(); roadaBO.setParentId("root"); roadaBO.setLabel(roadSyRegion.getName()); roadaBO.setValue(roadSyRegion.getId()); roadaBO.setLevel(String.valueOf(roadSyRegion.getLevel())); roadaBO.setSort(roadSyRegion.getId()); areaSet.add(roadaBO); } if (ObjectUtils.isEmpty(areaSet)) { return new ArrayList<>(); } List areaBOList = sort(areaSet); List areaBOS = sortArea(areaBOList); return createTree(areaBOS, null); } public List getRegionTree() { Set areaSet = new HashSet<>(); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.gt("level", -1); List syRegions = mapper.selectList(queryWrapper); for (SyRegion syRegion : syRegions) { AreaBO areaBO = new AreaBO(); areaBO.setParentId(syRegion.getParentId()); if (syRegion.getLevel().equals(1)) { areaBO.setParentId("root"); } areaBO.setLevel(String.valueOf(syRegion.getLevel())); areaBO.setLabel(syRegion.getName()); areaBO.setValue(syRegion.getId()); areaBO.setSort(syRegion.getId()); areaSet.add(areaBO); } if (ObjectUtils.isEmpty(areaSet)) { return new ArrayList<>(); } List areaBOList = sort(areaSet); List areaBOS = sortArea(areaBOList); return createTree(areaBOS, null); } public List sortArea(List list) { Map map = new HashMap<>(); map.put("越秀区", "2"); map.put("海珠区", "3"); map.put("荔湾区", "4"); map.put("天河区", "5"); map.put("白云区", "6"); map.put("黄埔区", "7"); map.put("花都区", "8"); map.put("番禺区", "9"); map.put("南沙区", "10"); map.put("从化区", "11"); map.put("增城区", "12"); for (AreaBO areaBO : list) { if (map.containsKey(areaBO.getLabel())) { areaBO.setSort(map.get(areaBO.getLabel())); } } // list.sort((o1, o2) -> { // Integer totalScore1 = Integer.valueOf(o1.getSort()); // Integer totalScore2 = Integer.valueOf(o2.getSort()); // if (totalScore1 > totalScore2) { // return 1; // } else if (totalScore1.equals(totalScore2)) { // return 0; // } else { // return -1; // } // }); return list; } public List sort(Set termsSet) { List termsList = new ArrayList<>(); if (ObjectUtils.isNotEmpty(termsSet)) { for (AreaBO selectTermDTO : termsSet) { termsList.add(selectTermDTO); } // termsList.sort((o1, o2)->{ // Double totalScore1 = Double.valueOf(o1.getValue()); // Double totalScore2 = Double.valueOf(o2.getValue()); // if(totalScore1 > totalScore2) { // return 1; // }else if (totalScore1.equals(totalScore2)) { // return 0; // }else { // return -1; // } // }); } return termsList; } /** * 创建树形结构 * * @param selectTermDTOList 所有集合 * @param firstId 某一级编号 * @return List */ public List createTree(List selectTermDTOList, String firstId) { List firstMapList = new ArrayList<>(); for (AreaBO selectTermDTO : selectTermDTOList) { for (AreaBO currentParam : selectTermDTOList) { if (currentParam.getValue().equals(selectTermDTO.getParentId())) { addToMBean(currentParam, selectTermDTO); break; } } } //取第一级节点 for (AreaBO selectTermDTO : selectTermDTOList) { if (StringUtils.isNotEmpty(firstId)) { if (firstId.equals(selectTermDTO.getValue())) { firstMapList.add(selectTermDTO); } } else { if (BaseConsts.ROOT.equals(selectTermDTO.getParentId()) || StringUtils.isEmpty(selectTermDTO.getParentId())) { log.info("xsd:{},{}", selectTermDTO.getLabel(), selectTermDTO.getSort()); firstMapList.add(selectTermDTO); } } } AreaBO areaBO = firstMapList.get(0); if (null != areaBO.getValue() && "440100".equals(areaBO.getValue())) { List children = areaBO.getChildren(); try { Collections.sort(children, new Comparator() { @Override public int compare(AreaBO o1, AreaBO o2) { return Integer.compare(Integer.valueOf(o1.getSort()), Integer.valueOf(o2.getSort())); } }); } catch (Exception e) { } } return firstMapList; } public void addToMBean(AreaBO targetUnit, AreaBO currentUnit) { List childListObj = targetUnit.getChildren(); List childList = null; if (CollectionUtils.isEmpty(childListObj)) { childList = new ArrayList(); targetUnit.setChildren(childList); } else { childList = childListObj; } childList.add(currentUnit); } /** * 查询js树形结构 * * @return */ public List listSelectJS() { try { List regionSelectJSDTOList = mapper.listSelectJS(); return this.createTreeJs(regionSelectJSDTOList, null); } catch (Exception e) { log.error("[SyCauseService.listSelectJS]调用失败,异常信息:" + e, e); throw new ServiceException("SyCauseService.listSelectJS", e); } } /** * 创建某一级树形结构 * * @param allList 所有集合 * @param firstId 某一级编号 * @return List */ public List createTreeJs(List allList, String firstId) { List firstMapList = new ArrayList<>(); for (RegionSelectJSDTO regionSelectJSDTO : allList) { for (RegionSelectJSDTO currentParam : allList) { if (currentParam.getValue().equals(regionSelectJSDTO.getParentId())) { addToMBeanJs(currentParam, regionSelectJSDTO); break; } } } //取第一级节点 for (RegionSelectJSDTO regionSelectJSDTO : allList) { if (StringUtils.isNotEmpty(firstId)) { if (firstId.equals(regionSelectJSDTO.getValue())) { firstMapList.add(regionSelectJSDTO); } } else { if (BaseConsts.ROOT.equals(regionSelectJSDTO.getParentId()) || StringUtils.isEmpty(regionSelectJSDTO.getParentId())) { firstMapList.add(regionSelectJSDTO); } } } return firstMapList; } /** * 获取子级数组 * * @param target 目标 * @param child 子级 */ public void addToMBeanJs(RegionSelectJSDTO target, RegionSelectJSDTO child) { List childListObj = target.getChildren(); List childList = null; if (CollectionUtils.isEmpty(childListObj)) { childList = new ArrayList(); target.setChildren(childList); } else { childList = childListObj; } childList.add(child); } }