92baf41073
MySQL ONLY_FULL_GROUP_BY 下,MyBatis-Plus 的 list(wrapper) 默认 SELECT
实体全部字段,配合 groupBy 后非分组列既不在 GROUP BY 中也不函数依赖分组键,
导致 SQLSyntaxErrorException。即便放宽模式,这些字段也只是组内随机一行的值。
根因是借用 SQL GROUP BY 实现"按某列去重",共 7 处,统一改为一次查询 +
内存分组,返回值结构与原实现一致:
- MerchantServiceImpl.groupByChain(本次线上报错点)
- YxeProductServiceImpl.listByGroup / listByChain / listByCate(2 个重载)
- YxeTaskProductServiceImpl.productGroupByTask
- YxeShareServiceImpl.listByMerchant(2 个重载)
分组父节点用独立副本(BeanUtils.copyProperties)而非复用子列表实例,
否则 parent.setChildren(children) 会造成对象自引用,JSON 序列化报
"Direct self-reference leading to cycle"。
附带消除 N+1:groupByChain 原为 1+12 次查询、重复拉取 8105 行。
同时 groupByChain 返回稳定 chainId(连锁名,与字典 sys_dict_data.dict_id=175
的 dict_data_code 一致),从源头消除前端回退到 `chain_${index}` 位置型占位符,
避免其经审核端写入 yxe_self_report.chain_id 后按连锁等值筛选永久漏查。
SQL: fix_self_report_chain_id_placeholder_2026-10-11.sql(本地已执行 5 行)
43 lines
2.1 KiB
SQL
43 lines
2.1 KiB
SQL
-- 用途:修正 yxe_self_report.chain_id 中残留的位置型占位符(chain_0、chain_3、chain_6 …)
|
||
-- 日期:2026-10-11
|
||
-- 背景:前端 normalizeMerchantChain 在接口未返回 chainId 时会回退成 `chain_${index}`,
|
||
-- 该值经审核端 saveMerchantEdit 写入 chain_id 落库。而按连锁筛选走的是等值匹配
|
||
-- (YxeSelfReportMapper.xml: a.chain_id = #{param.chainId}),占位符导致这些记录
|
||
-- 在按连锁筛选时被永久漏掉。本系统没有连锁表,chain 名称即事实上的连锁标识
|
||
-- (连锁字典 sys_dict_data.dict_id=175 的 dict_data_code 同样是连锁名)。
|
||
-- 影响:5 行(chain_6 -> 老百姓 3 行;chain_3 -> 百姓人家 2 行)
|
||
-- 性质:幂等,可重复执行;以 chain_name 为准回填 chain_id
|
||
-- 配套代码:MerchantServiceImpl.groupByChain 返回稳定 chainId;
|
||
-- AuditSelfReportItem.vue 兜底链改用连锁名并在写入前拦截 chain_ 前缀
|
||
|
||
-- 执行前核对(应为 5 行)
|
||
SELECT id, chain_id, chain_name
|
||
FROM yxe_self_report
|
||
WHERE chain_id REGEXP '^chain_[0-9]+$'
|
||
ORDER BY id;
|
||
|
||
-- 修正
|
||
UPDATE yxe_self_report
|
||
SET chain_id = chain_name
|
||
WHERE chain_id REGEXP '^chain_[0-9]+$'
|
||
AND chain_name IS NOT NULL
|
||
AND chain_name <> '';
|
||
|
||
-- 执行后核对(remaining_placeholder 与 mismatch 均应为 0)
|
||
SELECT SUM(chain_id REGEXP '^chain_[0-9]+$') AS remaining_placeholder,
|
||
SUM(chain_id <> chain_name) AS mismatch,
|
||
COUNT(*) AS total
|
||
FROM yxe_self_report;
|
||
|
||
-- ============================================================
|
||
-- 执行记录
|
||
-- ============================================================
|
||
-- 2026-10-11 本地开发库(127.0.0.1:3306/yaoxiaoer,root)
|
||
-- 执行结果:受影响 5 行
|
||
-- 执行后核对:remaining_placeholder = 0,mismatch = 0
|
||
-- 功能验证:按连锁筛选命中数
|
||
-- chainId=老百姓 279 -> 282(找回 id 119、130、169)
|
||
-- chainId=百姓人家 174 -> 176(找回 id 138、139)
|
||
--
|
||
-- 生产库:尚未执行。需经确认后按同一条语句复核执行。
|