weicw-dshsa ffc5ee80c7 fix(area): 区县重名时按名字查不再抛 TooManyResults,并支持按 adcode 精确查
根因: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 文件。
2026-10-16 21:23:58 +08:00
2023-06-03 23:56:49 +08:00
2026-10-10 21:34:36 +08:00
2023-06-03 23:56:49 +08:00
2026-10-10 21:34:36 +08:00
S
Description
No description provided
1.6 MiB
Languages
Java 100%