From c19a08f78ca86d59a865341b394bd10b2dd10da4 Mon Sep 17 00:00:00 2001 From: mi9688 Date: Fri, 25 Oct 2024 18:08:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E9=A1=B9=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E8=A1=8C=E6=94=BF=E5=8C=BA=E5=9F=9F=E4=BF=A1=E6=81=AF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E9=A1=B9=E7=9B=AE=E7=9B=B8=E5=85=B3=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=8E=A5=E5=8F=A3=E9=80=BB=E8=BE=91=E5=AE=8C=E5=96=84?= =?UTF-8?q?=EF=BC=8C=E8=A1=8C=E6=94=BF=E5=8C=BA=E5=88=92=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E9=80=BB=E8=BE=91=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/gis/GLegendController.java | 6 +- .../controller/project/ProjectController.java | 9 + .../com/fastbee/ggroup/domain/GSites.java | 3 + .../ggroup/service/IGLegendService.java | 4 +- .../service/impl/GGroupsServiceImpl.java | 4 +- .../service/impl/GLegendServiceImpl.java | 35 ++- .../com/fastbee/project/domain/Project.java | 35 ++- .../fastbee/project/mapper/ProjectMapper.java | 2 +- .../project/service/IProjectService.java | 6 + .../service/impl/ProjectServiceImpl.java | 233 +++++++++++++++++- .../mapper/project/ProjectMapper.xml | 39 ++- .../fastbee/system/domain/SysDistrict.java | 47 ++-- .../service/impl/SysDistrictServiceImpl.java | 49 +++- .../mapper/system/SysDistrictMapper.xml | 12 +- 14 files changed, 425 insertions(+), 59 deletions(-) diff --git a/fastbee-open-api/src/main/java/com/fastbee/data/controller/gis/GLegendController.java b/fastbee-open-api/src/main/java/com/fastbee/data/controller/gis/GLegendController.java index f7a8f6b..0058ed9 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/data/controller/gis/GLegendController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/data/controller/gis/GLegendController.java @@ -102,11 +102,11 @@ public class GLegendController extends BaseController /** * 删除图例 */ - @DeleteMapping("/{ids}") + @DeleteMapping("/{id}") @ApiOperation("删除图例") - public AjaxResult remove(@PathVariable Long[] ids) + public AjaxResult remove(@PathVariable Long id) { - return toAjax(gLegendService.deleteGLegendByIds(ids)); + return toAjax(gLegendService.deleteGLegendById(id)); } /** diff --git a/fastbee-open-api/src/main/java/com/fastbee/data/controller/project/ProjectController.java b/fastbee-open-api/src/main/java/com/fastbee/data/controller/project/ProjectController.java index c486cde..c6dcd71 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/data/controller/project/ProjectController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/data/controller/project/ProjectController.java @@ -139,4 +139,13 @@ public class ProjectController extends BaseController public AjaxResult getUnbindProjectDeptList(){ return success(projectService.getUnbindDeptList()); } + + /** + * 查询项目的行政区划树状列表 + */ + @GetMapping("/areaTree/{projectId}/{reachLevel}") + @ApiOperation("查询项目的行政区划树状列表") + public AjaxResult getProjectAreaTree(@PathVariable("projectId") Long projectId, @PathVariable("reachLevel") Integer reachLevel){ + return success(projectService.getProjectAreaTree(projectId, reachLevel)); + } } diff --git a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/domain/GSites.java b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/domain/GSites.java index 4831582..3ad7e78 100644 --- a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/domain/GSites.java +++ b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/domain/GSites.java @@ -68,4 +68,7 @@ public class GSites extends BaseEntity { @Excel(name = "关联的视频设备") @ApiModelProperty("关联的视频设备") private String videoDevices; + + /** 类型id(即图例id) */ + private Long typeId; } \ No newline at end of file diff --git a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/IGLegendService.java b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/IGLegendService.java index 598e48f..e4d34c6 100644 --- a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/IGLegendService.java +++ b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/IGLegendService.java @@ -33,9 +33,9 @@ public interface IGLegendService int updateGLegend(GLegend gLegend); /** - * 批量删除图例 + * 删除图例 */ - int deleteGLegendByIds(Long[] ids); + int deleteGLegendById(Long id); /** diff --git a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/impl/GGroupsServiceImpl.java b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/impl/GGroupsServiceImpl.java index fd33fd0..152a06a 100644 --- a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/impl/GGroupsServiceImpl.java +++ b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/impl/GGroupsServiceImpl.java @@ -132,8 +132,8 @@ public class GGroupsServiceImpl implements IGGroupsService List roots = new ArrayList<>(); //所有站点列表 List gGroupSiteAllList = selectGGroupsAllListSites(new GGroups()); - System.err.println("当前项目下所有站点:"); - gGroupSiteAllList.forEach(System.err::println); +// System.err.println("当前项目下所有站点:"); +// gGroupSiteAllList.forEach(System.err::println); for (GGroups group : groupsList) { //查询组的直接子站点列表 diff --git a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/impl/GLegendServiceImpl.java b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/impl/GLegendServiceImpl.java index 23b439a..872d0a1 100644 --- a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/impl/GLegendServiceImpl.java +++ b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/service/impl/GLegendServiceImpl.java @@ -3,18 +3,23 @@ package com.fastbee.ggroup.service.impl; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.fastbee.common.exception.ServiceException; import com.fastbee.common.utils.DateUtils; +import com.fastbee.ggroup.domain.GSites; import com.fastbee.ggroup.enums.SiteTypeCategoryEnum; +import com.fastbee.ggroup.mapper.GSitesMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import com.fastbee.ggroup.mapper.GLegendMapper; import com.fastbee.ggroup.domain.GLegend; import com.fastbee.ggroup.service.IGLegendService; +import org.springframework.transaction.annotation.Transactional; /** * 图例Service业务层处理 @@ -29,8 +34,11 @@ public class GLegendServiceImpl implements IGLegendService private final GLegendMapper gLegendMapper; - public GLegendServiceImpl(GLegendMapper gLegendMapper) { + private final GSitesMapper gSitesMapper; + + public GLegendServiceImpl(GLegendMapper gLegendMapper, GSitesMapper gSitesMapper) { this.gLegendMapper = gLegendMapper; + this.gSitesMapper = gSitesMapper; } @@ -95,6 +103,7 @@ public class GLegendServiceImpl implements IGLegendService * @return 结果 */ @Override + @Transactional(rollbackFor=Exception. class) public int updateGLegend(GLegend gLegend) { //图例名称不能重复 @@ -105,21 +114,35 @@ public class GLegendServiceImpl implements IGLegendService if(!duplicateNameList.isEmpty()){ throw new ServiceException("图例名称已存在!"); } + gLegend.setUpdateTime(DateUtils.getNowDate()); return gLegendMapper.updateGLegend(gLegend); } /** - * 批量删除图例 + * 删除图例 * - * @param ids 需要删除的图例主键 + * @param id 需要删除的图例主键 * @return 结果 */ @Override - public int deleteGLegendByIds(Long[] ids) + public int deleteGLegendById(Long id) { - return gLegendMapper.deleteGLegendByIds(ids); - } + List list = new LambdaQueryChainWrapper<>(gLegendMapper) + .select(GLegend::getId, GLegend::getName) + .eq(GLegend::getId, id).list(); + if (list.isEmpty()){ + throw new ServiceException("图例不存在!"); + } + List gSitesList = new LambdaQueryChainWrapper<>(gSitesMapper) + .select(GSites::getId, GSites::getType) + .eq(GSites::getType, list.get(0).getName()) + .list(); + if(!gSitesList.isEmpty()){ + throw new ServiceException("图例已被站点使用,无法删除!"); + } + return gLegendMapper.deleteById(id); + } /** diff --git a/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/domain/Project.java b/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/domain/Project.java index 373a1e8..c8c7061 100644 --- a/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/domain/Project.java +++ b/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/domain/Project.java @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.fastbee.common.annotation.Excel; import com.fastbee.common.core.domain.BaseEntity; @@ -11,7 +13,7 @@ import com.fastbee.common.core.domain.BaseEntity; * 项目对象 project * * @author kerwincui - * @date 2024-10-18 + * @date 2024-10-25 */ @ApiModel(value = "Project",description = "项目 project") @Data @@ -121,9 +123,34 @@ public class Project extends BaseEntity @ApiModelProperty("项目所属机构名称") private String deptName; - /** 项目级别:市,县 */ - @Excel(name = "项目级别:市,县") - @ApiModelProperty("项目级别:市,县") + /** 项目级别:1市级2县级 */ + @Excel(name = "项目级别:1市级2县级") + @ApiModelProperty("项目级别:1市级2县级") private String level; + /** 行政区域省代码 */ + @Excel(name = "行政区域省代码") + @ApiModelProperty("行政区域省代码") + private String provinceCode; + + /** 行政区域市代码 */ + @Excel(name = "行政区域市代码") + @ApiModelProperty("行政区域市代码") + private String cityCode; + + /** 行政区域县代码 */ + @Excel(name = "行政区域县代码") + @ApiModelProperty("行政区域县代码") + private String countyCode; + + /** 行政区域镇代码 */ + @Excel(name = "行政区域镇代码") + @ApiModelProperty("行政区域镇代码") + private String townCode; + + /** 行政区域村代码 */ + @Excel(name = "行政区域村代码") + @ApiModelProperty("行政区域村代码") + private String villageCode; + } diff --git a/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/mapper/ProjectMapper.java b/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/mapper/ProjectMapper.java index 3fc3d8b..bf28b57 100644 --- a/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/mapper/ProjectMapper.java +++ b/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/mapper/ProjectMapper.java @@ -23,7 +23,7 @@ public interface ProjectMapper extends MPJBaseMapper * @param projectId 项目主键 * @return 项目 */ - Project selectProjectByProjectId(Long projectId); + Project selectProjectById(Long projectId); /** * 查询项目列表 diff --git a/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/service/IProjectService.java b/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/service/IProjectService.java index d15d9fc..16d3772 100644 --- a/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/service/IProjectService.java +++ b/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/service/IProjectService.java @@ -2,6 +2,7 @@ package com.fastbee.project.service; import com.fastbee.common.core.domain.entity.SysDept; import com.fastbee.project.domain.Project; +import com.fastbee.system.domain.SysDistrict; import java.util.List; import java.util.Map; @@ -73,4 +74,9 @@ public interface IProjectService */ List selectAdminProjectList(); + /** + * 获取项目行政区域列表 + * @return 行政区域列表 + */ + List getProjectAreaTree(Long projectId,Integer reachLevel); } diff --git a/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/service/impl/ProjectServiceImpl.java b/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/service/impl/ProjectServiceImpl.java index 45e6e25..6b29642 100644 --- a/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/service/impl/ProjectServiceImpl.java +++ b/fastbee-service/fastbee-project-service/src/main/java/com/fastbee/project/service/impl/ProjectServiceImpl.java @@ -1,6 +1,9 @@ package com.fastbee.project.service.impl; import cn.hutool.core.codec.Base64; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONException; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.fastbee.common.constant.ProjectLevelConstant; import com.fastbee.common.core.domain.entity.SysDept; @@ -12,12 +15,15 @@ import com.fastbee.project.domain.Project; import com.fastbee.project.mapper.ProjectMapper; import com.fastbee.project.service.IProjectService; +import com.fastbee.system.domain.SysDistrict; import com.fastbee.system.mapper.SysDeptMapper; +import com.fastbee.system.mapper.SysDistrictMapper; import com.fastbee.system.mapper.SysUserMapper; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.util.*; +import java.util.stream.Collectors; /** * 项目Service业务层处理 @@ -33,10 +39,13 @@ public class ProjectServiceImpl implements IProjectService private final SysDeptMapper sysDeptMapper; private final SysUserMapper sysUserMapper; - public ProjectServiceImpl(ProjectMapper projectMapper, SysDeptMapper sysDeptMapper, SysUserMapper sysUserMapper) { + private final SysDistrictMapper sysDistrictMapper; + + public ProjectServiceImpl(ProjectMapper projectMapper, SysDeptMapper sysDeptMapper, SysUserMapper sysUserMapper, SysDistrictMapper sysDistrictMapper) { this.projectMapper = projectMapper; this.sysDeptMapper = sysDeptMapper; this.sysUserMapper = sysUserMapper; + this.sysDistrictMapper = sysDistrictMapper; } /** @@ -48,7 +57,7 @@ public class ProjectServiceImpl implements IProjectService @Override public Project selectProjectByProjectId(Long projectId) { - return projectMapper.selectProjectByProjectId(projectId); + return projectMapper.selectProjectById(projectId); } /** @@ -59,9 +68,10 @@ public class ProjectServiceImpl implements IProjectService { return new LambdaQueryChainWrapper<>(projectMapper) .select(Project::getId, Project::getProjectName, Project::getScope, - Project::getAdministrativeArea, Project::getDeptId,Project::getAdministrativeAreaCode, + Project::getDeptId, Project::getLogo, Project::getImage, Project::getLevel, Project::getDeptName, - Project::getCreateTime) + Project::getCreateTime, + Project::getAdministrativeAreaCode,Project::getAdministrativeArea, Project::getProvinceCode,Project::getCityCode,Project::getCountyCode) .like(StringUtils.isNotBlank(project.getSearchValue()),Project::getProjectName, project.getSearchValue()) .list(); } @@ -72,16 +82,76 @@ public class ProjectServiceImpl implements IProjectService @Override public int insertProject(Project project) { //判断选择的机构下是否已经绑定项目 - List projectList = new LambdaQueryChainWrapper<>(projectMapper) - .select(Project::getId, Project::getProjectName) - .eq(Project::getDeptId, project.getDeptId()).list(); - if(!projectList.isEmpty()){ - throw new ServiceException("该机构下已经存在项目"); +// List projectList = new LambdaQueryChainWrapper<>(projectMapper) +// .select(Project::getId, Project::getProjectName) +// .eq(Project::getDeptId, project.getDeptId()).list(); +// if(!projectList.isEmpty()){ +// throw new ServiceException("该机构下已经存在项目"); +// } + //项目行政区域处理 + //拆解项目行政区域代码信息 + if(StringUtils.isBlank(project.getAdministrativeAreaCode())){ + throw new ServiceException("项目行政区域代码不能为空!"); } + //判断行政区域代码json格式 + if(isNotValidJsonArray(project.getAdministrativeAreaCode())){ + throw new ServiceException("项目行政区域代码多选列表非json数组!"); + } + //项目省代码列表 + List provincialCodeList =new ArrayList<>(); + //项目市代码列表 + List cityCodeList =new ArrayList<>(); + //项目县代码列表 + List countyCodeList =new ArrayList<>(); + //项目镇代码列表 + List townCodeList =new ArrayList<>(); + //项目村代码列表 + List villageCodeList =new ArrayList<>(); + JSONArray administrativeAreaList = JSONUtil.parseArray(project.getAdministrativeAreaCode()); + administrativeAreaList.forEach(item->{ + if(isNotValidJsonArray(item.toString())){ + throw new ServiceException("项目行政区域代码多选列表的元素非json数组!"); + } + //单个行政区划代码列表 + JSONArray administrativeArea = JSONUtil.parseArray(item); + //拆解出每个行政区划代码里面的镇或村 + if(administrativeArea.size()!=5){ + throw new ServiceException("项目行政区域代码多选列表的元素长度必须为5,到达村级别!"); + } + //保存项目省代码列表 + provincialCodeList.add(administrativeArea.get(0).toString()); + //保存项目市代码列表 + cityCodeList.add(administrativeArea.get(1).toString()); + //保存项目县代码列表 + countyCodeList.add(administrativeArea.get(2).toString()); + //保存项目镇代码列表 + townCodeList.add(administrativeArea.get(3).toString()); + //保存项目村代码列表 + villageCodeList.add(administrativeArea.get(4).toString()); + }); + + //设置项目省、市、县、镇、村行政区划代码列表 + project.setProvinceCode(JSONUtil.toJsonStr(provincialCodeList)); + project.setCityCode(JSONUtil.toJsonStr(cityCodeList)); + project.setCountyCode(JSONUtil.toJsonStr(countyCodeList)); + project.setTownCode(JSONUtil.toJsonStr(townCodeList)); + project.setVillageCode(JSONUtil.toJsonStr(villageCodeList)); project.setCreateTime(DateUtils.getNowDate()); return projectMapper.insertProject(project); } + /** + * 验证json对象是否是数组 + */ + public boolean isNotValidJsonArray(String jsonStr) { + try { + JSONUtil.parseArray(jsonStr); + } catch (JSONException e) { + return true; + } + return false; + } + /** * 修改项目 */ @@ -186,11 +256,154 @@ public class ProjectServiceImpl implements IProjectService //查询所有子一级项目列表 projectList = new LambdaQueryChainWrapper<>(projectMapper) .select(Project::getId, Project::getProjectName) - .in(!ProjectHolder.getProjectInfo().getProjectIdList().isEmpty(),Project::getParentId, ProjectHolder.getProjectInfo().getProjectIdList()) + .in(!ProjectHolder.getProjectInfo().getProjectIdList().isEmpty(),Project::getParentId, + ProjectHolder.getProjectInfo().getProjectIdList()) .list(); } return projectList; } + /** + * 查询项目的行政区划树状列表 + */ + @Override + public List getProjectAreaTree(Long projectId,Integer startLevel) { + //参数校验 + if(startLevel>5||startLevel<1){ + throw new ServiceException("超出行政级别查询范围(1~5级)!"); + } + //查询项目的行政区划信息 + Project project = new LambdaQueryChainWrapper<>(projectMapper) + .select(Project::getProvinceCode, Project::getCityCode, Project::getCountyCode, + Project::getTownCode, Project::getVillageCode) + .eq(Project::getId, projectId) + .one(); + if (Objects.isNull(project)) { + throw new ServiceException("项目不存在"); + } + //判断项目的省、市、县、镇、村行政区划列表数据不为null + isProvinceCodeBlank(project); + + //查询项目的省、市、县、镇、村行政区划列表数据 + //目前项目下面的镇或者村都可以多选划分成一个项目 + //找到项目行政区划开始多选的级别 + //判断省是否多选 + JSONArray provinceCodeList = JSONUtil.parseArray(project.getProvinceCode()); + //判断集合中的元素值都相等则说明省未多选 + if (!provinceCodeList.stream().allMatch(provinceCode -> provinceCode.equals(provinceCodeList.get(0)))) { + throw new ServiceException("项目省级行政区划只能包含一个省!"); + } + + //判断市是否多选 + JSONArray cityCodeList = JSONUtil.parseArray(project.getCityCode()); + //判断集合中的元素值都相等则说明市未多选 + if (!cityCodeList.stream().allMatch(cityCode -> cityCode.equals(cityCodeList.get(0)))) { + throw new ServiceException("项目市级行政区划只能包含一个市!"); + } + //判断县是否多选 + JSONArray countyCodeList = JSONUtil.parseArray(project.getCountyCode()); + //判断集合中的元素值都相等则说明县未多选 + if (!countyCodeList.stream().allMatch(countyCode -> countyCode.equals(countyCodeList.get(0)))) { + throw new ServiceException("项目县级行政区划只能包含一个县!"); + } + //判断镇是否多选 + JSONArray townCodeList = JSONUtil.parseArray(project.getTownCode()); + //判断集合中的元素值都相等则说明镇未多选 + List distinctTownCodeList = new ArrayList<>(); +// if (!townCodeList.stream().allMatch(townCode -> townCode.equals(townCodeList.get(0)))) { + //找出选择了哪些镇,给元素去重 + distinctTownCodeList = townCodeList.stream().distinct().collect(Collectors.toList()); + +// } + + JSONArray villageCodeList = JSONUtil.parseArray(project.getVillageCode()); + + System.err.println("镇行政区划代码"); + System.err.println(distinctTownCodeList); + System.err.println("村行政区划代码"); + System.err.println(villageCodeList); + //合并镇、村行政区划代码集合 + List townAndvillageCodeList = new ArrayList<>(); + townAndvillageCodeList.addAll(distinctTownCodeList); + townAndvillageCodeList.addAll(villageCodeList); + System.err.println("合并后镇、村行政区划代码"); + System.err.println(townAndvillageCodeList); + + //查询项目所属县下面的所有镇、村行政区划列表 + List projectDistrictList =new ArrayList<>(); + LambdaQueryChainWrapper sysDistrictLambdaQueryChainWrapper = new LambdaQueryChainWrapper<>(sysDistrictMapper) + .select(SysDistrict::getId, SysDistrict::getParentId, SysDistrict::getName, SysDistrict::getAdcode, + SysDistrict::getLevel, SysDistrict::getFullName, SysDistrict::getName + , SysDistrict::getLng, SysDistrict::getLat); +// List administrativeDivisionLevelList=new ArrayList<>(); +// //倒叙循环reachLevel次 +// for (int i = startLevel;i<6; i++) { +// administrativeDivisionLevelList.add(i); +// } + //限制行政区划级别 + projectDistrictList = sysDistrictLambdaQueryChainWrapper +// .in(SysDistrict::getLevel, administrativeDivisionLevelList) + +// .eq(SysDistrict::getParentId, countyCodeList.get(0)) +// .in(SysDistrict::getAdcode,townAndvillageCodeList) + .list(); + //过滤掉非项目行政区划的省份数据 + projectDistrictList = projectDistrictList.stream(). + filter(sysDistrict -> ( + sysDistrict.getAdcode().toString().equals(provinceCodeList.get(0).toString()) + && sysDistrict.getParentId()==null +// ||!sysDistrict.getAdcode().equals(cityCodeList.get(0)) +// ||!sysDistrict.getAdcode().equals(countyCodeList.get(0)) + ) + ) + .collect(Collectors.toList()); + System.err.println("项目所属县下面的所有镇、村行政区划列表"); + System.err.println(projectDistrictList); + //构建树状结构 + return buildTree(projectDistrictList); + } + + private static void isProvinceCodeBlank(Project project) { + if (StringUtils.isBlank(project.getProvinceCode())){ + throw new ServiceException("项目省级行政区划信息缺失!"); + } + if (StringUtils.isBlank(project.getCityCode())){ + throw new ServiceException("项目市级行政区划信息缺失!"); + } + if (StringUtils.isBlank(project.getCountyCode())){ + throw new ServiceException("项目县级行政区划信息缺失!"); + } + if (StringUtils.isBlank(project.getTownCode())){ + throw new ServiceException("项目镇级行政区划信息缺失!"); + } + if (StringUtils.isBlank(project.getVillageCode())){ + throw new ServiceException("项目村级行政区划信息缺失!"); + } + } + + private List buildTree(List SysDistricts) { + Map map = new HashMap<>(); + List roots = new ArrayList<>(); + for (SysDistrict sysDistrict : SysDistricts) { + map.put(sysDistrict.getAdcode(), sysDistrict); + } + return getDistricts(SysDistricts, map, roots); + } + + private List getDistricts(List SysDistricts, Map map, List roots) { + for (SysDistrict sysDistrict : SysDistricts) { + Long parentId = sysDistrict.getParentId(); + if (parentId == null || !map.containsKey(parentId)) { + roots.add(sysDistrict); + } else { + SysDistrict parent = map.get(parentId); + if (parent.getChildren() == null) { + parent.setChildren(new ArrayList<>()); + } + parent.getChildren().add(sysDistrict); + } + } + return roots; + } public List getAllProjects(Long projectId) { List allProjects = new ArrayList<>(); diff --git a/fastbee-service/fastbee-project-service/src/main/resources/mapper/project/ProjectMapper.xml b/fastbee-service/fastbee-project-service/src/main/resources/mapper/project/ProjectMapper.xml index 458f1bd..9351290 100644 --- a/fastbee-service/fastbee-project-service/src/main/resources/mapper/project/ProjectMapper.xml +++ b/fastbee-service/fastbee-project-service/src/main/resources/mapper/project/ProjectMapper.xml @@ -31,10 +31,15 @@ + + + + + - select id, project_name, sys_show_name, central_coordinates, scope, administrative_area, owner, logo, image, video_introduction, remark, p_params, introduce, del_flag, create_time, create_by, update_time, remarks, tenant_id, tenant_name, owner_id, parent_id, dept_id, administrative_area_code, dept_name, level from project + select id, project_name, sys_show_name, central_coordinates, scope, administrative_area, owner, logo, image, video_introduction, remark, p_params, introduce, del_flag, create_time, create_by, update_time, remarks, tenant_id, tenant_name, owner_id, parent_id, dept_id, administrative_area_code, dept_name, level, province_code, city_code, county_code, town_code, village_code from project - where id = #{id} - + insert into project - id, project_name, sys_show_name, central_coordinates, @@ -97,9 +106,13 @@ administrative_area_code, dept_name, level, + province_code, + city_code, + county_code, + town_code, + village_code, - #{id}, #{projectName}, #{sysShowName}, #{centralCoordinates}, @@ -125,6 +138,11 @@ #{administrativeAreaCode}, #{deptName}, #{level}, + #{provinceCode}, + #{cityCode}, + #{countyCode}, + #{townCode}, + #{villageCode}, @@ -156,17 +174,22 @@ administrative_area_code = #{administrativeAreaCode}, dept_name = #{deptName}, level = #{level}, + province_code = #{provinceCode}, + city_code = #{cityCode}, + county_code = #{countyCode}, + town_code = #{townCode}, + village_code = #{villageCode}, where id = #{id} - + delete from project where id = #{id} - + delete from project where id in - + #{id} diff --git a/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysDistrict.java b/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysDistrict.java index 4416092..bc59c76 100644 --- a/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysDistrict.java +++ b/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/domain/SysDistrict.java @@ -16,55 +16,66 @@ import com.fastbee.common.core.domain.BaseEntity; * 行政区划对象 sys_district * * @author kerwincui - * @date 2024-10-18 + * @date 2024-10-25 */ @ApiModel(value = "SysDistrict",description = "行政区划 sys_district") @Data @EqualsAndHashCode(callSuper = true) public class SysDistrict extends BaseEntity - { -private static final long serialVersionUID = 1L; +{ + private static final long serialVersionUID = 1L; /** */ private Long id; /** 城市id */ - @Excel(name = "城市id") - @ApiModelProperty("城市id") + @Excel(name = "城市id") + @ApiModelProperty("城市id") private Long adcode; /** 省市级别 */ - @Excel(name = "省市级别") - @ApiModelProperty("省市级别") + @Excel(name = "省市级别") + @ApiModelProperty("省市级别") private Long level; - /** 父级id */ - @Excel(name = "父级id") - @ApiModelProperty("父级id") + /** 父级id(指向adcode字段) */ + @Excel(name = "父级id(指向adcode字段)") + @ApiModelProperty("父级id(指向adcode字段)") private Long parentId; /** 简称 */ - @Excel(name = "简称") - @ApiModelProperty("简称") + @Excel(name = "简称") + @ApiModelProperty("简称") private String name; /** 全称 */ - @Excel(name = "全称") - @ApiModelProperty("全称") + @Excel(name = "全称") + @ApiModelProperty("全称") private String fullName; /** 经度 */ - @Excel(name = "经度") - @ApiModelProperty("经度") + @Excel(name = "经度") + @ApiModelProperty("经度") private BigDecimal lng; /** 纬度 */ - @Excel(name = "纬度") - @ApiModelProperty("纬度") + @Excel(name = "纬度") + @ApiModelProperty("纬度") private BigDecimal lat; /** 删除标志(0代表存在 2代表删除) */ private String delFlag; + /** 行政区域地图轮廓json数据 */ + @Excel(name = "行政区域地图轮廓json数据") + @ApiModelProperty("行政区域地图轮廓json数据") + private String mapOutline; + + /** 行政区域地图轮廓json数据url */ + @Excel(name = "行政区域地图轮廓json数据url") + @ApiModelProperty("行政区域地图轮廓json数据url") + private String mapOutlineUrl; + private List children; + } diff --git a/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysDistrictServiceImpl.java b/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysDistrictServiceImpl.java index f768fea..e6be2cd 100644 --- a/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysDistrictServiceImpl.java +++ b/fastbee-service/fastbee-system-service/src/main/java/com/fastbee/system/service/impl/SysDistrictServiceImpl.java @@ -1,13 +1,17 @@ package com.fastbee.system.service.impl; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONException; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.fastbee.common.exception.ServiceException; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.fastbee.system.mapper.SysDistrictMapper; @@ -72,9 +76,46 @@ public class SysDistrictServiceImpl implements ISysDistrictService @Override public int updateSysDistrict(SysDistrict sysDistrict) { + String mapOutlineUrl = sysDistrict.getMapOutlineUrl(); + //未上传行政区划轮廓不做处理 + if(StringUtils.isBlank(mapOutlineUrl)){ + return sysDistrictMapper.updateSysDistrict(sysDistrict); + } + + //判断行政区划轮廓json文件路url是否是完整url还是相对url + if((mapOutlineUrl.contains("http://") || mapOutlineUrl.contains("https://"))){ + //如果不是是相对url则代表修改过行政区划轮廓数据 + String jsonData = HttpUtil.get(mapOutlineUrl); + System.err.println("获取到行政区划轮廓json:"+jsonData); + //读取文件内容 + if (Objects.isNull(jsonData)) { + throw new ServiceException("上传行政区划地图轮廓json数据为空!"); + } + //校验文件内容是否是json格式 + if (!isValidJson(jsonData)) { + throw new ServiceException("json格式不正确!"); + } + int startIndex = mapOutlineUrl.indexOf("/profile/upload/"); + String relativeUrl = mapOutlineUrl.substring(startIndex); + sysDistrict.setMapOutlineUrl(relativeUrl); + sysDistrict.setMapOutline(jsonData); + } + return sysDistrictMapper.updateSysDistrict(sysDistrict); } + /** + * 验证字符串是否是json格式 + */ + public boolean isValidJson(String jsonStr) { + try { + JSONUtil.parseObj(jsonStr); + } catch (JSONException e) { + return false; + } + return true; + } + /** * 批量删除行政区划 * diff --git a/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysDistrictMapper.xml b/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysDistrictMapper.xml index 9f23d48..92ee008 100644 --- a/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysDistrictMapper.xml +++ b/fastbee-service/fastbee-system-service/src/main/resources/mapper/system/SysDistrictMapper.xml @@ -14,10 +14,12 @@ + + - select id, adcode, level, parent_id, name, full_name, lng, lat, del_flag from sys_district + select id, adcode, level, parent_id, name, full_name, lng, lat, del_flag, map_outline, map_outline_url from sys_district @@ -49,6 +53,8 @@ lng, lat, del_flag, + map_outline, + map_outline_url, #{adcode}, @@ -59,6 +65,8 @@ #{lng}, #{lat}, #{delFlag}, + #{mapOutline}, + #{mapOutlineUrl}, @@ -73,6 +81,8 @@ lng = #{lng}, lat = #{lat}, del_flag = #{delFlag}, + map_outline = #{mapOutline}, + map_outline_url = #{mapOutlineUrl}, where id = #{id}