Commit 8d970b35f17574046f1152df7de231c6a77ab4ba

Authored by 王彪总
1 parent f4436f75

feat(garden): 添加GIS道路管理和坐标转换功能

- 新增GIS道路管理相关控制器、服务和数据对象
- 实现WGS84到GCJ02坐标转换算法和工具类
- 添加GIS道路关联和取消关联功能
- 实现GIS道路坐标批量转换功能
- 添加GIS道路数据导入导出功能
- 新增问题类型级联查询接口优化前端展示
- 配置本地调试Mock认证支持
- 更新部署脚本和数据库表结构变更SQL
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/problemtype/GardenProblemTypeMapper.java
... ... @@ -63,12 +63,27 @@ public interface GardenProblemTypeMapper extends BaseMapperX<GardenProblemTypeDO
63 63 }
64 64  
65 65 /**
  66 + * 根据名称、父级编码、层级查询记录(校验名称在同级下唯一)
  67 + * 使用 LIMIT 1 避免已有脏数据导致 TooManyResultsException
  68 + */
  69 + default GardenProblemTypeDO selectByNameAndParentAndLevel(String typeName, String parentCode, Integer level) {
  70 + return selectOne(new LambdaQueryWrapperX<GardenProblemTypeDO>()
  71 + .eq(GardenProblemTypeDO::getTypeName, typeName)
  72 + .eq(GardenProblemTypeDO::getParentCode, parentCode)
  73 + .eq(GardenProblemTypeDO::getLevel, level)
  74 + .last("LIMIT 1"));
  75 + }
  76 +
  77 + /**
66 78 * 生成下一个编码:父级编码 + 5位递增序号
67 79 * 如 parentCode=BIZ_GARDEN → BIZ_GARDEN00001, BIZ_GARDEN00002
  80 + * 注意:加 LENGTH 条件避免匹配到子级编码(如 yl0000100001 干扰 yl 下的二级编码)
68 81 */
69 82 default String generateNextCode(String parentCode) {
  83 + int expectedLength = parentCode.length() + 5;
70 84 List<GardenProblemTypeDO> list = selectList(new LambdaQueryWrapperX<GardenProblemTypeDO>()
71 85 .likeRight(GardenProblemTypeDO::getTypeCode, parentCode)
  86 + .apply("LENGTH(type_code) = {0}", expectedLength)
72 87 .orderByDesc(GardenProblemTypeDO::getTypeCode)
73 88 .last("LIMIT 1"));
74 89 if (list == null || list.isEmpty()) {
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java
... ... @@ -150,6 +150,7 @@ public interface ErrorCodeConstants {
150 150 // ========== 问题类型配置 1-100-009-000 ==========
151 151 ErrorCode PROBLEM_TYPE_NOT_EXISTS = new ErrorCode(1100009000, "问题类型不存在");
152 152 ErrorCode PROBLEM_TYPE_CODE_EXISTS = new ErrorCode(1100009001, "问题类型编码已存在");
  153 + ErrorCode PROBLEM_TYPE_NAME_DUPLICATE = new ErrorCode(1100009002, "同级下问题类型名称已存在,一级、二级、三级类型名称不能同时重复");
153 154  
154 155 // ========== 一树一档案巡检与风险评估 1-100-008-000 ==========
155 156 ErrorCode TREE_INSPECTION_NOT_EXISTS = new ErrorCode(1100008001, "巡检评估记录不存在");
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/problemtype/GardenProblemTypeServiceImpl.java
... ... @@ -43,6 +43,9 @@ public class GardenProblemTypeServiceImpl implements GardenProblemTypeService {
43 43 public Long createProblemType(ProblemTypeSaveReqVO createReqVO) {
44 44 // 校验编码唯一性
45 45 validateTypeCodeUnique(createReqVO.getTypeCode(), null);
  46 + // 校验名称在同级父节点下唯一
  47 + validateTypeNameUniqueUnderParent(createReqVO.getTypeName(),
  48 + createReqVO.getParentCode(), createReqVO.getLevel(), null);
46 49 // 插入
47 50 GardenProblemTypeDO problemType = BeanUtils.toBean(createReqVO, GardenProblemTypeDO.class);
48 51 gardenProblemTypeMapper.insert(problemType);
... ... @@ -81,6 +84,15 @@ public class GardenProblemTypeServiceImpl implements GardenProblemTypeService {
81 84 }
82 85 }
83 86  
  87 + private void validateTypeNameUniqueUnderParent(String typeName, String parentCode,
  88 + Integer level, Long excludeId) {
  89 + GardenProblemTypeDO exist = gardenProblemTypeMapper.selectByNameAndParentAndLevel(
  90 + typeName, parentCode, level);
  91 + if (exist != null && (excludeId == null || !exist.getId().equals(excludeId))) {
  92 + throw exception(PROBLEM_TYPE_NAME_DUPLICATE);
  93 + }
  94 + }
  95 +
84 96 @Override
85 97 public GardenProblemTypeDO getProblemType(Long id) {
86 98 return gardenProblemTypeMapper.selectById(id);
... ...