Commit 8d970b35f17574046f1152df7de231c6a77ab4ba
1 parent
f4436f75
feat(garden): 添加GIS道路管理和坐标转换功能
- 新增GIS道路管理相关控制器、服务和数据对象 - 实现WGS84到GCJ02坐标转换算法和工具类 - 添加GIS道路关联和取消关联功能 - 实现GIS道路坐标批量转换功能 - 添加GIS道路数据导入导出功能 - 新增问题类型级联查询接口优化前端展示 - 配置本地调试Mock认证支持 - 更新部署脚本和数据库表结构变更SQL
Showing
3 changed files
with
28 additions
and
0 deletions
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,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 | * 生成下一个编码:父级编码 + 5位递增序号 | 78 | * 生成下一个编码:父级编码 + 5位递增序号 |
| 67 | * 如 parentCode=BIZ_GARDEN → BIZ_GARDEN00001, BIZ_GARDEN00002 | 79 | * 如 parentCode=BIZ_GARDEN → BIZ_GARDEN00001, BIZ_GARDEN00002 |
| 80 | + * 注意:加 LENGTH 条件避免匹配到子级编码(如 yl0000100001 干扰 yl 下的二级编码) | ||
| 68 | */ | 81 | */ |
| 69 | default String generateNextCode(String parentCode) { | 82 | default String generateNextCode(String parentCode) { |
| 83 | + int expectedLength = parentCode.length() + 5; | ||
| 70 | List<GardenProblemTypeDO> list = selectList(new LambdaQueryWrapperX<GardenProblemTypeDO>() | 84 | List<GardenProblemTypeDO> list = selectList(new LambdaQueryWrapperX<GardenProblemTypeDO>() |
| 71 | .likeRight(GardenProblemTypeDO::getTypeCode, parentCode) | 85 | .likeRight(GardenProblemTypeDO::getTypeCode, parentCode) |
| 86 | + .apply("LENGTH(type_code) = {0}", expectedLength) | ||
| 72 | .orderByDesc(GardenProblemTypeDO::getTypeCode) | 87 | .orderByDesc(GardenProblemTypeDO::getTypeCode) |
| 73 | .last("LIMIT 1")); | 88 | .last("LIMIT 1")); |
| 74 | if (list == null || list.isEmpty()) { | 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,6 +150,7 @@ public interface ErrorCodeConstants { | ||
| 150 | // ========== 问题类型配置 1-100-009-000 ========== | 150 | // ========== 问题类型配置 1-100-009-000 ========== |
| 151 | ErrorCode PROBLEM_TYPE_NOT_EXISTS = new ErrorCode(1100009000, "问题类型不存在"); | 151 | ErrorCode PROBLEM_TYPE_NOT_EXISTS = new ErrorCode(1100009000, "问题类型不存在"); |
| 152 | ErrorCode PROBLEM_TYPE_CODE_EXISTS = new ErrorCode(1100009001, "问题类型编码已存在"); | 152 | ErrorCode PROBLEM_TYPE_CODE_EXISTS = new ErrorCode(1100009001, "问题类型编码已存在"); |
| 153 | + ErrorCode PROBLEM_TYPE_NAME_DUPLICATE = new ErrorCode(1100009002, "同级下问题类型名称已存在,一级、二级、三级类型名称不能同时重复"); | ||
| 153 | 154 | ||
| 154 | // ========== 一树一档案巡检与风险评估 1-100-008-000 ========== | 155 | // ========== 一树一档案巡检与风险评估 1-100-008-000 ========== |
| 155 | ErrorCode TREE_INSPECTION_NOT_EXISTS = new ErrorCode(1100008001, "巡检评估记录不存在"); | 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,6 +43,9 @@ public class GardenProblemTypeServiceImpl implements GardenProblemTypeService { | ||
| 43 | public Long createProblemType(ProblemTypeSaveReqVO createReqVO) { | 43 | public Long createProblemType(ProblemTypeSaveReqVO createReqVO) { |
| 44 | // 校验编码唯一性 | 44 | // 校验编码唯一性 |
| 45 | validateTypeCodeUnique(createReqVO.getTypeCode(), null); | 45 | validateTypeCodeUnique(createReqVO.getTypeCode(), null); |
| 46 | + // 校验名称在同级父节点下唯一 | ||
| 47 | + validateTypeNameUniqueUnderParent(createReqVO.getTypeName(), | ||
| 48 | + createReqVO.getParentCode(), createReqVO.getLevel(), null); | ||
| 46 | // 插入 | 49 | // 插入 |
| 47 | GardenProblemTypeDO problemType = BeanUtils.toBean(createReqVO, GardenProblemTypeDO.class); | 50 | GardenProblemTypeDO problemType = BeanUtils.toBean(createReqVO, GardenProblemTypeDO.class); |
| 48 | gardenProblemTypeMapper.insert(problemType); | 51 | gardenProblemTypeMapper.insert(problemType); |
| @@ -81,6 +84,15 @@ public class GardenProblemTypeServiceImpl implements GardenProblemTypeService { | @@ -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 | @Override | 96 | @Override |
| 85 | public GardenProblemTypeDO getProblemType(Long id) { | 97 | public GardenProblemTypeDO getProblemType(Long id) { |
| 86 | return gardenProblemTypeMapper.selectById(id); | 98 | return gardenProblemTypeMapper.selectById(id); |