Files
junhong_cmp_fiber/openspec/changes/archive/2026-04-17-fix-fund-summary-primary-account/design.md
huang 4aab0bcbf2
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 4m39s
提案以及归档
2026-04-18 09:10:29 +08:00

63 lines
2.5 KiB
Markdown
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.
## Context
`/api/admin/shops/fund-summary` 通过 `GetPrimaryAccountsByShopIDs` 查询 `is_primary = true` 的账号来获取店铺主账号信息(用户名、手机号)。
问题根因:`shop/service.go` 创建店铺初始账号时从未设置 `IsPrimary: true`,导致所有账号的 `is_primary` 均为默认值 `false`。数据库验证确认系统中唯一一个店铺账号id=128`is_primary = false`
## Goals / Non-Goals
**Goals:**
- 修复店铺创建逻辑,初始账号设 `IsPrimary: true`
- 数据迁移修复存量数据(每个店铺选最早创建的代理账号设为主账号)
- fund-summary 接口返回正确的用户名和手机号
**Non-Goals:**
- 不修改 `GetPrimaryAccountsByShopIDs` 查询逻辑(查询本身是正确的)
- 不实现"切换主账号"功能(超出范围)
- 不修改 fund-summary 的其他字段
## Decisions
### 决策1修代码不改查询
**选择**:在 `shop/service.go` 创建账号时加 `IsPrimary: true`,而非修改 `GetPrimaryAccountsByShopIDs` 为"查最早账号"。
**理由**`is_primary` 字段本身语义明确("是否为主账号"),查询逻辑是正确的。改查询是绕过问题而非解决问题,且未来如果引入"多账号切换主账号"功能会与改查询的方式冲突。
### 决策2历史数据修复策略
**选择**:迁移 SQL 对每个 shop 取 `created_at` 最早的代理账号(`user_type = 3`)设为 `is_primary = true`
**理由**:最早创建的账号最可能是初始主账号。这个规则简单确定,无歧义。
**SQL**
```sql
UPDATE tb_account a
SET is_primary = true
FROM (
SELECT DISTINCT ON (shop_id) id
FROM tb_account
WHERE shop_id IS NOT NULL
AND user_type = 3
AND deleted_at IS NULL
ORDER BY shop_id, created_at ASC
) earliest
WHERE a.id = earliest.id
AND a.is_primary = false;
```
## Risks / Trade-offs
**[风险] 一个店铺有多个账号时选错主账号**
→ 当前系统只有 1 个店铺且 1 个账号,风险极低。取最早账号的策略合理。
→ 如有异议,超级管理员可手动修正(未来可开放"设置主账号"接口)。
**[风险] 迁移 SQL 误更新已手动设置的 is_primary = true 记录**
→ SQL 加了 `AND a.is_primary = false` 条件,不会覆盖已正确的数据。
## Migration Plan
1. 执行代码变更shop/service.go 加 `IsPrimary: true`
2. 执行数据库迁移文件UPDATE SQL
3. 验证:调用 fund-summary 接口,确认返回正确用户名和手机号