Files
yxe-java/fix_self_report_chain_id_placeholder_2026-10-11.sql
T
weicw-dshsa 92baf41073 fix: 消除 GROUP BY 非分组列报错并修复连锁标识脏数据
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 行)
2026-10-11 16:34:21 +08:00

43 lines
2.1 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 用途:修正 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)
--
-- 生产库:尚未执行。需经确认后按同一条语句复核执行。