## 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 接口，确认返回正确用户名和手机号
