Files
dax-pay/_config/sql/update-datas.sql
DaxPay Dev bc4e388dfd feat(merchant): 默认应用/门店策略统一治理(唯一约束/删除阻挡/异常分类)
- 数据库加部分唯一索引 uk_mch_app_info_default / uk_mch_store_info_default 兜底
- Service.delete 检查默认项, 禁止删除默认应用/门店
- MchAppInfoService.add 首应用自动默认, 与 MchStoreInfoService 对齐
- resolveApp 异常分类: 默认应用不存在 vs 已停用 vs 指定应用异常
- resolveStoreNo 改抛异常 (替代返回 null), 与 resolveApp 策略对齐
- update-datas.sql 提供脏数据/缺默认项诊断查询
- 6 语种 i18n 新增 5 个错误 key
2026-07-18 23:56:22 +08:00

63 lines
2.9 KiB
SQL

-- ============================================================
-- 门店/应用默认项数据迁移诊断(升级脚本)
-- ============================================================
-- 背景:
-- 本次升级后, 支付下单若未显式传 appId / storeNo,
-- 系统会回落到商户的默认应用/默认门店;
-- 若默认项不存在或已停用, 将直接抛异常阻断下单(对齐 MchApp 既有策略)。
-- 风险:
-- 历史数据中可能存在「从未创建默认应用/默认门店」的商户(如 SQL 直接导入未走入驻流程),
-- 升级后这些商户的下单会被阻断。
-- 迁移策略:
-- 主键(id)与应用号(appId)/门店号(storeNo)由应用层(MyBatis-Plus 雪花 ID / RandomUtil)生成,
-- SQL 层难以精确复现; 且每个商户的默认应用名/门店名应按当前请求语言生成,
-- 不适合在 SQL 中硬编码。
-- 因此本脚本不自动执行数据补建, 仅提供诊断查询, 由运维确认后处理。
-- ============================================================
-- 诊断 1: 查询没有默认应用的商户(升级后这些商户未传 appId 的下单会失败)
-- SELECT mch.mch_no, mch.mch_name
-- FROM merchant_info mch
-- WHERE NOT EXISTS (
-- SELECT 1 FROM mch_app_info app
-- WHERE app.mch_no = mch.mch_no
-- AND app.default_app = TRUE
-- AND app.deleted = FALSE
-- )
-- AND mch.deleted = FALSE;
-- 诊断 2: 查询没有默认门店的商户(升级后这些商户未传 storeNo 的下单会失败)
-- SELECT mch.mch_no, mch.mch_name
-- FROM merchant_info mch
-- WHERE NOT EXISTS (
-- SELECT 1 FROM mch_store_info s
-- WHERE s.mch_no = mch.mch_no
-- AND s.default_store = TRUE
-- AND s.deleted = FALSE
-- )
-- AND mch.deleted = FALSE;
-- 诊断 3: 查询同商户存在多个默认应用的脏数据(会导致 uk_mch_app_info_default 索引创建失败)
-- SELECT mch_no, COUNT(*)
-- FROM mch_app_info
-- WHERE default_app = TRUE AND deleted = FALSE
-- GROUP BY mch_no
-- HAVING COUNT(*) > 1;
-- 诊断 4: 查询同商户存在多个默认门店的脏数据(会导致 uk_mch_store_info_default 索引创建失败)
-- SELECT mch_no, COUNT(*)
-- FROM mch_store_info
-- WHERE default_store = TRUE AND deleted = FALSE
-- GROUP BY mch_no
-- HAVING COUNT(*) > 1;
-- ============================================================
-- 修复指引(诊断查询有结果时按以下方式处理):
-- 1. 诊断 3/4 命中(脏数据):
-- 手动 UPDATE 保留其中一条 default_app/default_store = TRUE, 其余置 FALSE。
-- 2. 诊断 1/2 命中(缺默认项):
-- 登录运营端 -> 商户管理 -> 选择对应商户 -> 应用管理/门店管理 ->
-- 新增应用/门店后调用「设为默认」接口(set-default);
-- 或通过 MerchantAdminService.createDefaultApp / MchStoreInfoService.createDefaultStore 触发。
-- ============================================================