优化获取项目行政区划接口逻辑

This commit is contained in:
蒾酒 2024-10-28 00:23:26 +08:00
parent c19a08f78c
commit 3b51726b58
3 changed files with 61 additions and 58 deletions

View File

@ -143,9 +143,9 @@ public class ProjectController extends BaseController
/**
* 查询项目的行政区划树状列表
*/
@GetMapping("/areaTree/{projectId}/{reachLevel}")
@GetMapping("/areaTree/{projectId}/{startLevel}")
@ApiOperation("查询项目的行政区划树状列表")
public AjaxResult getProjectAreaTree(@PathVariable("projectId") Long projectId, @PathVariable("reachLevel") Integer reachLevel){
return success(projectService.getProjectAreaTree(projectId, reachLevel));
public AjaxResult getProjectAreaTree(@PathVariable("projectId") Long projectId, @PathVariable("startLevel") Integer startLevel){
return success(projectService.getProjectAreaTree(projectId, startLevel));
}
}

View File

@ -78,5 +78,5 @@ public interface IProjectService
* 获取项目行政区域列表
* @return 行政区域列表
*/
List<SysDistrict> getProjectAreaTree(Long projectId,Integer reachLevel);
List<SysDistrict> getProjectAreaTree(Long projectId,Integer startLevel);
}

View File

@ -27,7 +27,6 @@ import java.util.stream.Collectors;
/**
* 项目Service业务层处理
*
* @author kerwincui
* &#064;date 2024-09-26
*/
@ -81,13 +80,14 @@ public class ProjectServiceImpl implements IProjectService
*/
@Override
public int insertProject(Project project)
{ //判断选择的机构下是否已经绑定项目
// List<Project> projectList = new LambdaQueryChainWrapper<>(projectMapper)
// .select(Project::getId, Project::getProjectName)
// .eq(Project::getDeptId, project.getDeptId()).list();
// if(!projectList.isEmpty()){
// throw new ServiceException("该机构下已经存在项目");
// }
{
//判断选择的机构下是否已经绑定项目
List<Project> 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())){
@ -230,8 +230,9 @@ public class ProjectServiceImpl implements IProjectService
.list();
//遍历项目把已绑定项目的机构从机构列表中移除
for (Project project : projectList) {
if (Objects.nonNull(project.getDeptId()))
sysDeptList.removeIf(sysDept -> sysDept.getDeptId().equals(project.getDeptId()));
if (Objects.nonNull(project.getDeptId())) {
sysDeptList.removeIf(sysDept -> sysDept.getDeptId().equals(project.getDeptId()));
}
}
return sysDeptList;
}
@ -283,6 +284,27 @@ public class ProjectServiceImpl implements IProjectService
//判断项目的省村行政区划列表数据不为null
isProvinceCodeBlank(project);
List<Object> administrativeCodeList = getTownAndvillageCodeList(project,startLevel);
//查询项目所属县下面的所有镇村行政区划列表
List<SysDistrict> projectDistrictList;
LambdaQueryChainWrapper<SysDistrict> sysDistrictLambdaQueryChainWrapper = new LambdaQueryChainWrapper<>(sysDistrictMapper)
.select(SysDistrict::getId, SysDistrict::getParentId, SysDistrict::getName, SysDistrict::getAdcode,
SysDistrict::getLevel, SysDistrict::getFullName, SysDistrict::getName
, SysDistrict::getLng, SysDistrict::getLat);
//限制行政区划级别
projectDistrictList = sysDistrictLambdaQueryChainWrapper
.in(SysDistrict::getAdcode,administrativeCodeList)
.list();
System.err.println("项目所属县下面的所有镇、村行政区划列表");
System.err.println(projectDistrictList);
//构建树状结构
return buildTree(projectDistrictList);
}
private static List<Object> getTownAndvillageCodeList(Project project,Integer startLevel) {
//查询项目的省村行政区划列表数据
//目前项目下面的镇或者村都可以多选划分成一个项目
//找到项目行政区划开始多选的级别
@ -292,6 +314,8 @@ public class ProjectServiceImpl implements IProjectService
if (!provinceCodeList.stream().allMatch(provinceCode -> provinceCode.equals(provinceCodeList.get(0)))) {
throw new ServiceException("项目省级行政区划只能包含一个省!");
}
//省去重
List<Object> distinctProvinceCodeList = provinceCodeList.stream().distinct().collect(Collectors.toList());
//判断市是否多选
JSONArray cityCodeList = JSONUtil.parseArray(project.getCityCode());
@ -299,67 +323,46 @@ public class ProjectServiceImpl implements IProjectService
if (!cityCodeList.stream().allMatch(cityCode -> cityCode.equals(cityCodeList.get(0)))) {
throw new ServiceException("项目市级行政区划只能包含一个市!");
}
//市去重
List<Object> distinctCityCodeList = cityCodeList.stream().distinct().collect(Collectors.toList());
//判断县是否多选
JSONArray countyCodeList = JSONUtil.parseArray(project.getCountyCode());
//判断集合中的元素值都相等则说明县未多选
if (!countyCodeList.stream().allMatch(countyCode -> countyCode.equals(countyCodeList.get(0)))) {
throw new ServiceException("项目县级行政区划只能包含一个县!");
}
//县去重
List<Object> distinctcCountyCodeList= countyCodeList.stream().distinct().collect(Collectors.toList());
//判断镇是否多选
JSONArray townCodeList = JSONUtil.parseArray(project.getTownCode());
//判断集合中的元素值都相等则说明镇未多选
List<Object> distinctTownCodeList = new ArrayList<>();
// if (!townCodeList.stream().allMatch(townCode -> townCode.equals(townCodeList.get(0)))) {
//找出选择了哪些镇,给元素去重
distinctTownCodeList = townCodeList.stream().distinct().collect(Collectors.toList());
// }
List<Object> distinctTownCodeList;
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<Object> townAndvillageCodeList = new ArrayList<>();
townAndvillageCodeList.addAll(distinctTownCodeList);
townAndvillageCodeList.addAll(villageCodeList);
//合并省村行政区划代码集合
List<Object> administrativeCodeList = new ArrayList<>();
int[] startLevels = {1, 2, 3, 4, 5};
List<List<Object>> distinctCodeLists = Arrays.asList(distinctProvinceCodeList, distinctCityCodeList, distinctcCountyCodeList, distinctTownCodeList, villageCodeList);
for (int i = 0; i < startLevels.length; i++) {
if (startLevel <= startLevels[i]) {
for (int j = i; j < distinctCodeLists.size(); j++) {
administrativeCodeList.addAll(distinctCodeLists.get(j));
}
break;
}
}
System.err.println("合并后镇、村行政区划代码");
System.err.println(townAndvillageCodeList);
//查询项目所属县下面的所有镇村行政区划列表
List<SysDistrict> projectDistrictList =new ArrayList<>();
LambdaQueryChainWrapper<SysDistrict> sysDistrictLambdaQueryChainWrapper = new LambdaQueryChainWrapper<>(sysDistrictMapper)
.select(SysDistrict::getId, SysDistrict::getParentId, SysDistrict::getName, SysDistrict::getAdcode,
SysDistrict::getLevel, SysDistrict::getFullName, SysDistrict::getName
, SysDistrict::getLng, SysDistrict::getLat);
// List<Integer> 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);
System.err.println(administrativeCodeList);
return administrativeCodeList;
}
private static void isProvinceCodeBlank(Project project) {