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

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("查询项目的行政区划树状列表") @ApiOperation("查询项目的行政区划树状列表")
public AjaxResult getProjectAreaTree(@PathVariable("projectId") Long projectId, @PathVariable("reachLevel") Integer reachLevel){ public AjaxResult getProjectAreaTree(@PathVariable("projectId") Long projectId, @PathVariable("startLevel") Integer startLevel){
return success(projectService.getProjectAreaTree(projectId, reachLevel)); return success(projectService.getProjectAreaTree(projectId, startLevel));
} }
} }

View File

@ -78,5 +78,5 @@ public interface IProjectService
* 获取项目行政区域列表 * 获取项目行政区域列表
* @return 行政区域列表 * @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业务层处理 * 项目Service业务层处理
*
* @author kerwincui * @author kerwincui
* &#064;date 2024-09-26 * &#064;date 2024-09-26
*/ */
@ -81,13 +80,14 @@ public class ProjectServiceImpl implements IProjectService
*/ */
@Override @Override
public int insertProject(Project project) public int insertProject(Project project)
{ //判断选择的机构下是否已经绑定项目 {
// List<Project> projectList = new LambdaQueryChainWrapper<>(projectMapper) //判断选择的机构下是否已经绑定项目
// .select(Project::getId, Project::getProjectName) List<Project> projectList = new LambdaQueryChainWrapper<>(projectMapper)
// .eq(Project::getDeptId, project.getDeptId()).list(); .select(Project::getId, Project::getProjectName)
// if(!projectList.isEmpty()){ .eq(Project::getDeptId, project.getDeptId()).list();
// throw new ServiceException("该机构下已经存在项目"); if(!projectList.isEmpty()){
// } throw new ServiceException("该机构下已经存在项目");
}
//项目行政区域处理 //项目行政区域处理
//拆解项目行政区域代码信息 //拆解项目行政区域代码信息
if(StringUtils.isBlank(project.getAdministrativeAreaCode())){ if(StringUtils.isBlank(project.getAdministrativeAreaCode())){
@ -230,8 +230,9 @@ public class ProjectServiceImpl implements IProjectService
.list(); .list();
//遍历项目把已绑定项目的机构从机构列表中移除 //遍历项目把已绑定项目的机构从机构列表中移除
for (Project project : projectList) { for (Project project : projectList) {
if (Objects.nonNull(project.getDeptId())) if (Objects.nonNull(project.getDeptId())) {
sysDeptList.removeIf(sysDept -> sysDept.getDeptId().equals(project.getDeptId())); sysDeptList.removeIf(sysDept -> sysDept.getDeptId().equals(project.getDeptId()));
}
} }
return sysDeptList; return sysDeptList;
} }
@ -283,6 +284,27 @@ public class ProjectServiceImpl implements IProjectService
//判断项目的省村行政区划列表数据不为null //判断项目的省村行政区划列表数据不为null
isProvinceCodeBlank(project); 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)))) { if (!provinceCodeList.stream().allMatch(provinceCode -> provinceCode.equals(provinceCodeList.get(0)))) {
throw new ServiceException("项目省级行政区划只能包含一个省!"); throw new ServiceException("项目省级行政区划只能包含一个省!");
} }
//省去重
List<Object> distinctProvinceCodeList = provinceCodeList.stream().distinct().collect(Collectors.toList());
//判断市是否多选 //判断市是否多选
JSONArray cityCodeList = JSONUtil.parseArray(project.getCityCode()); 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)))) { if (!cityCodeList.stream().allMatch(cityCode -> cityCode.equals(cityCodeList.get(0)))) {
throw new ServiceException("项目市级行政区划只能包含一个市!"); throw new ServiceException("项目市级行政区划只能包含一个市!");
} }
//市去重
List<Object> distinctCityCodeList = cityCodeList.stream().distinct().collect(Collectors.toList());
//判断县是否多选 //判断县是否多选
JSONArray countyCodeList = JSONUtil.parseArray(project.getCountyCode()); JSONArray countyCodeList = JSONUtil.parseArray(project.getCountyCode());
//判断集合中的元素值都相等则说明县未多选 //判断集合中的元素值都相等则说明县未多选
if (!countyCodeList.stream().allMatch(countyCode -> countyCode.equals(countyCodeList.get(0)))) { if (!countyCodeList.stream().allMatch(countyCode -> countyCode.equals(countyCodeList.get(0)))) {
throw new ServiceException("项目县级行政区划只能包含一个县!"); throw new ServiceException("项目县级行政区划只能包含一个县!");
} }
//县去重
List<Object> distinctcCountyCodeList= countyCodeList.stream().distinct().collect(Collectors.toList());
//判断镇是否多选 //判断镇是否多选
JSONArray townCodeList = JSONUtil.parseArray(project.getTownCode()); JSONArray townCodeList = JSONUtil.parseArray(project.getTownCode());
//判断集合中的元素值都相等则说明镇未多选 //判断集合中的元素值都相等则说明镇未多选
List<Object> distinctTownCodeList = new ArrayList<>(); List<Object> distinctTownCodeList;
// if (!townCodeList.stream().allMatch(townCode -> townCode.equals(townCodeList.get(0)))) {
//找出选择了哪些镇,给元素去重
distinctTownCodeList = townCodeList.stream().distinct().collect(Collectors.toList());
// }
distinctTownCodeList = townCodeList.stream().distinct().collect(Collectors.toList());
JSONArray villageCodeList = JSONUtil.parseArray(project.getVillageCode()); JSONArray villageCodeList = JSONUtil.parseArray(project.getVillageCode());
System.err.println("镇行政区划代码"); System.err.println("镇行政区划代码");
System.err.println(distinctTownCodeList); System.err.println(distinctTownCodeList);
System.err.println("村行政区划代码"); System.err.println("村行政区划代码");
System.err.println(villageCodeList); System.err.println(villageCodeList);
//合并镇村行政区划代码集合 //合并省村行政区划代码集合
List<Object> townAndvillageCodeList = new ArrayList<>(); List<Object> administrativeCodeList = new ArrayList<>();
townAndvillageCodeList.addAll(distinctTownCodeList); int[] startLevels = {1, 2, 3, 4, 5};
townAndvillageCodeList.addAll(villageCodeList); 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("合并后镇、村行政区划代码");
System.err.println(townAndvillageCodeList); System.err.println(administrativeCodeList);
return administrativeCodeList;
//查询项目所属县下面的所有镇村行政区划列表
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);
} }
private static void isProvinceCodeBlank(Project project) { private static void isProvinceCodeBlank(Project project) {