| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- -- 一个租户允许多个商户编号(2026-09-24 用户裁定)
- -- 手工执行: psycopg2 / psql 连接 payment_platform_java 库
- --
- -- 【本脚本尚未执行】执行由用户做。
- --
- -- ── 背景 ─────────────────────────────────────────────────────────────
- -- db/har-tenant-level.sql 在 2026-09-24 早些时候建了这条索引:
- -- uk_har_merchant_tenant_level ON pay_har_merchant (tenant_id)
- -- WHERE enterprise_id IS NULL
- -- 它的语义是「一个租户只能有一条租户级商户映射」。用户随后裁定:
- -- **一个租户允许配置多个商户** ⇒ 这条索引必须去掉,否则第二条永远插不进去
- -- (报 23505 唯一约束冲突,落到 GlobalExceptionHandler 就是一句 500)。
- --
- -- 去掉了会不会失去保护?不会:
- -- · merchant_code 仍是**全局**唯一(uk_har_merchant_code,V1.8 建表时就有)
- -- ⇒ 同一个商户编号不可能被插两次,跨租户也不行;
- -- · enterprise_id 仍是**全局**唯一(uk_har_merchant_enterprise)
- -- ⇒ 一个企业不会挂到两条映射上。
- -- 也就是说本条索引本来只管「租户内条数」,而条数现在由业务自己决定。
- --
- -- ⚠ 代价(如实写):多条之后,「用哪一条」不再有唯一答案。
- -- 代码侧已按「谁下单谁指定」处理 —— HarMerchantService#requireByTenant 在该租户有
- -- 多条时抛 400「请指定 merchant_code」,**不做 LIMIT 1 随便挑**(挑错了钱会进错
- -- 商户账号,且全程无报错)。请求体里新增的 merchant_code 见三个入参:
- -- HarOrderCreateDTO / HarShopCreateDTO / HarOpenOrderQueryDTO(查单也要带 ——
- -- 不带而本租户有多条时,那句 400 提示就成了无法照办的死路)。
- --
- -- 顺序:本脚本与代码**同批**上即可,不像 har-tenant-level.sql 那样有先后约束 ——
- -- 代码在索引还在时也能跑(只是第二个商户存不进去),索引先删也不会让老代码出错。
- DROP INDEX IF EXISTS uk_har_merchant_tenant_level;
- -- ── 只读核对(执行后手工跑一遍)──────────────────────────────────────
- --
- -- 1) 那条索引确实没了(**期望 0 行**)
- -- SELECT indexname FROM pg_indexes
- -- WHERE indexname = 'uk_har_merchant_tenant_level';
- --
- -- 2) 两道仍然在的保护(**期望 2 行**)
- -- SELECT indexname FROM pg_indexes
- -- WHERE indexname IN ('uk_har_merchant_enterprise', 'uk_har_merchant_code');
- -- ★ 若这两行少了一行,先别建第二条商户 —— 那是重复商户编号的唯一防线。
- --
- -- 3) 端到端(唯一能证明「多个商户」真的成立的一条):
- -- 用超管在「商户配置」页给**同一个租户**录两条 merchant_code(第二条留空企业),
- -- 两条都应保存成功;再用该租户的账号调开放 API 下单:
- -- · 不带 merchant_code ⇒ 400「当前租户配置了多个商户编号,请在请求中指定 merchant_code」;
- -- · 带其中一条 ⇒ 成功,且订单列表里那一行的商户编号就是它。
|