ffc5ee80c79c5074fb1b7063dccbcc934a861cb6
根因:AreaServiceImpl.areaInfoByName 只按 name 精确匹配后调用 getOne(wrapper),
其默认 throwEx=true 走 MyBatis selectOne,重名区县(白云区=广州/贵阳、
朝阳区=北京/长春…)命中多条即抛 TooManyResultsException,被全局异常处理器
包成 {"code":1,"message":"操作失败"}。小程序客户拜访页定位链路依赖该接口,
表现为「有时能定位、有时不能」。
改动:
- areaInfoByName(两个重载):改用 findOneByName,以 selectList + Java 侧按 id
取最小替代 getOne —— 多条命中不再抛异常,且结果稳定(不随数据库返回顺序
漂移);查无结果返回 null,修掉原实现对 null 调 getLevelId() 的 NPE
- 新增 areaInfoById:按行政区划编码(adcode = sys_area.id)精确查询,
天然唯一,用于彻底绕开区县重名
- AreaController:POST /api/common/area/area-info-by-name 支持传 id 精确命中,
只传 name 时行为不变;查无结果返回 data=null 而非失败码
(该接口在 SecurityConfig 中为 permitAll,不得加 @PreAuthorize)
- 抽出 fillCity 与 LEVEL_COUNTY 常量,消除层级魔数
- 新增单测 11 个:AreaInfoByNameDuplicateTest(7) 覆盖重名不抛异常/结果稳定/
按 id 取最小/唯一名仍补 city/查无返 null/adcode 精确命中;
AreaControllerDispatchTest(4) 锁定 id 派发与 name 兼容
验证:单测 11/11;全量 22/22 BUILD SUCCESS。转红验证:临时还原为 getOne 后
4 个测试转红,证明测试非假绿。真实库集成验证(临时测试,已删除,仅 SELECT):
重名区县全部不再抛异常;adcode 520113→贵阳白云区(520100)、440111→广州白云区
(440100) 精确区分。纯代码修复,无 DDL/DML,故未新增 SQL 文件。
Description
No description provided
Languages
Java
100%