# 君鸿卡管系统

## What This Is

物联网卡（IoT SIM）+ 号卡 + 设备全生命周期管理平台，支持多级代理商体系和分佣结算。平台以 B 端代理商为核心分销渠道，兼顾 C 端个人客户和企业客户，覆盖从卡/设备采购、分配、激活、套餐购买到佣金结算的完整业务链路。当前处于 MVP 阶段，核心功能模块已完成，目标是修复所有已知业务链路断点、补全缺失功能，将系统调整至可生产上线状态。

## Core Value

**业务链路完整可用**——代理能采购分配卡/设备，C端客户能充值购包激活套餐，佣金能正确计算并可提现。这条主链路必须端到端跑通。

## Requirements

### Validated

*以下功能已在代码库中实现，视为已验证的基础能力：*

**Validated in Phase 03.1: 设备 sync-info 读取链路修复**
- ✓ 设备管理列表/详情返回 online_status/last_online_time/software_version/switch_mode/last_gateway_sync_at — DEVICE-02/03
- ✓ 设备绑卡列表（ListBindings）返回 is_current 字段 — DEVICE-03
- ✓ 资产 Resolve/Refresh BoundCardInfo 包含 is_current（isCurrentMap 模式） — DEVICE-03
- ✓ admin 资产解析接口（AssetResolveResponse）返回 5 个 DB 缓存字段 — DEVICE-02/03
- ✓ GetRealtimeStatus device 类型实时调用 Gateway sync-info，返回 DeviceGatewayInfo — DEVICE-04
- ✓ C 端 GetAssetInfo device_realtime 从真实 Gateway 数据填充（删除 buildMockDeviceRealtime）— DEVICE-04
- ✓ Gateway 失败降级：IMEI 为空不发起调用，失败只记 Warn，device_realtime 返回 null — DEVICE-04

**Validated in Phase 2: PERM/FIN/REALNAME/POLL 修复**
- ✓ 企业账号 Resolve 接口移除错误拦截，Refresh 接口新增拦截（只读）— PERM-01/02
- ✓ 提现审批人字段补全（approved_by/approved_at）— FIN-01
- ✓ 提现拒绝 remark 必填校验（Reject 补 Validate 调用）— FIN-02
- ✓ 激活配置并发行锁保护（clause.Locking FOR UPDATE）— FIN-03
- ✓ enable_realname_activation → expiry_base 全链路重构，三维激活决策（卡类型+购买路径+expiry_base）— REALNAME-01~05
- ✓ polling:protect 接入调度器（processManualQueue + processTimedQueue）— POLL-01
- ✓ gatewayClient=nil 时停复机返回业务错误而非 nil — POLL-02
- ✓ GetPackages 接口支持分页（page/pageSize/total）— POLL-03
- ✓ PackageSeries 删除前检查关联套餐（CountBySeriesID）— POLL-04

**Validated in Phase 1: P0 紧急修复**
- ✓ 实名状态常量统一（DB 写入值统一为 constants.RealNameStatusVerified=1）— CRITICAL-01
- ✓ C 端实名校验修复（依赖常量统一）— CRITICAL-02
- ✓ 实名激活任务断链修复（PollingHandler 注入 asynqClient，RPush 降级方案删除）— CRITICAL-03
- ✓ 充值回调触发自动购包（TaskTypeAutoPurchaseAfterRecharge 入队）— CRITICAL-04
- ✓ 自动购包后佣金链补全（TaskTypeCommission 正确触发）— CRITICAL-05
- ✓ 代购订单 sellerCostPrice 修正（场景5使用 operatorCostPrice，6处全部审查）— CRITICAL-06
- ✓ 设备导入补充 IMEI 字段（DeviceRow.IMEI + buildDeviceColumnIndex 多别名）— CRITICAL-07
- ✓ 提现冻结并发校验（RowsAffected==0 检查，防止重复提现单）— CRITICAL-08

- ✓ IoT 卡全生命周期管理（开卡/激活/停复机/销户）— 已实现
- ✓ 设备管理（绑卡/解绑/批量导入 Excel）— 已实现
- ✓ 代理商多级体系（最多 7 层层级，parent_id 维护）— 已实现
- ✓ RBAC 权限系统（角色/权限/菜单，基于店铺层级数据过滤）— 已实现
- ✓ B 端认证（Admin JWT + Redis Token，SuperAdmin/Platform/Agent/Enterprise）— 已实现
- ✓ C 端认证（微信 OAuth + 手机号绑定，JWT 单独中间件）— 已实现
- ✓ 套餐系统（主套餐/加油包/排队激活/囤货待实名激活/流量计费）— 已实现
- ✓ 订单系统（五种购买场景，钱包/微信/富友支付）— 已实现
- ✓ 微信支付（JSAPI + H5，PowerWeChat v3 SDK）— 已实现
- ✓ 资产钱包（绑定卡/设备，转手后钱包跟着走）— 已实现
- ✓ 代理佣金钱包（差价佣金 + 一次性佣金，多级分链）— 已实现
- ✓ 代理佣金提现申请流程（申请/审批/拒绝）— 已实现（待修复）
- ✓ 轮询系统（实名状态/流量/套餐余额，Asynq + Redis Sorted Set）— 已实现
- ✓ 标签系统（平台/企业/店铺三级隔离）— 已实现
- ✓ 对象存储（联通云 OSS，S3 兼容，批量导入/导出）— 已实现
- ✓ 审计日志（账号操作：create/update/delete/assign_roles）— 已实现
- ✓ 企业账号管理（B 端大客户，被分配卡/设备，无钱包）— 已实现（待修复权限）
- ✓ 订单超时自动取消（Asynq Scheduler，30 分钟）— 已实现
- ✓ 富友支付 SDK（pkg/fuiou/ 完整实现 + 回调已实现）— SDK 已实现，接口留桩待补全

### Active

*当前阶段需要完成的工作，来自修正业务完整方案（.sisyphus/plans/修正业务-完整方案.md）：*

**方案 A — 紧急 Bug 修复（P0）** ✅ *Validated in Phase 1*
- [x] A-1：实名状态常量统一（DB 写入值 2 vs 常量 1，所有链路断裂）
- [x] A-2：C 端实名校验修复（依赖 A-1）
- [x] A-3：实名激活任务断链修复（PollingHandler 缺少 asynqClient，RPush 降级）
- [x] A-4：充值回调后自动购包触发 + 佣金补全（两个断点：无调用 + 佣金不计算）
- [x] A-5：代购订单金额修正（场景 5 sellerCostPrice 用错字段，佣金链归零）
- [x] A-6：设备导入补充 IMEI 字段（DeviceRow 缺 IMEI，导入后 Gateway 无法调用）
- [x] A-7：提现冻结并发校验（只检查 Error 不检查 RowsAffected，并发创建重复提现单）

**方案 B — 企业端权限完善** ✅ *Validated in Phase 2*
- [x] B-1：Resolve 接口错误拦截企业账号（应可查，需移除拦截）
- [x] B-2：Refresh 接口缺少企业账号拦截（应只读）

**方案 C — 提现/佣金流程完善** ✅ *Validated in Phase 2*
- [x] C-1：审批人字段补全（approved_by/approved_at 永远为空）
- [x] C-2：提现拒绝 remark 必填校验（Reject 缺少 Validate 调用）
- [x] C-3：激活配置并发保护（两步 UPDATE 无锁，可出现两条 active=true）

**方案 D — 设备体系完善** ✅ *Validated in Phase 3 + Phase 03.1*
- [x] D-0：设备模型字段扩展（online_status / last_online_time / software_version 等）
- [x] D-1：Gateway sync-info 同步接口对接（CurrentIccid 预留结构待填充）
- [x] D-2：device_sim_binding 新增 is_current 字段（当前使用卡标识）
- [x] D-3：设备 Refresh + 详情接入 sync-info（在线状态/固件版本/当前卡实时更新）
- [x] D-读取侧：DTO 字段映射补全（5个DB缓存字段 + 2处IsCurrent）+ GetRealtimeStatus Gateway 实时调用 + C端 mock 替换

**方案 E — 流量体系改革（破坏性，低峰期）**
- [ ] E-1：流量详单改为日粒度缓冲（新建 tb_card_daily_usage，Redis 增量缓存）
- [ ] E-2：current_month_usage_mb 改增量累加（不再被上游自然月归零覆盖）
- [ ] E-3：流量查询层适配（兼容 Redis 今日 + DB 历史两段数据）

**方案 F — 代码质量清理**
- [ ] F-1：佣金链断裂改为零额待审记录（status=99，不再静默跳过）
- [ ] F-2：废弃 sim:status:sync 任务代码删除
- [ ] F-3：错误不应被吞（cards, _ := 改为记日志）
- [ ] F-4：C 端 Handler 迁移到 Service 层（直接 DB 访问改回分层）
- [ ] F-5：Handler/Service 权限不一致修复
- [ ] F-6：StopResumeCallback / ResumeCallback 注入（bootstrap 未调用）

**方案 G — 实名激活架构重构** ✅ *Validated in Phase 2*
- [x] G：enable_realname_activation 字段拆分为 expiry_base（from_activation/from_purchase）

**方案 H — 轮询系统小修** ✅ *Validated in Phase 2*
- [x] H-1：polling:protect 接入调度（已注册未调度）
- [x] H-2：gatewayClient=nil 时停复机应返回错误（而非假装成功）
- [x] H-3：packages 接口加分页
- [x] H-4：Series 删除前检查关联套餐

**方案 I — 退款完整功能（新功能）**
- [ ] I-1：新建 tb_refund_request 数据模型
- [ ] I-2：7 个退款接口（申请/列表/详情/审批/拒绝/退回/重提）
- [ ] I-3：审批通过后按比例扣减代理佣金钱包

**方案 J — 其他修复**
- [ ] J-1：富友支付 JSAPI + 小程序接口实现（替换留桩）
- [ ] J-2：平台代理钱包代购支持（platform buyerType 绕过代理检查）
- [ ] J-3：status 3/4 业务触发逻辑（激活→3，最后套餐到期→4）
- [ ] J-4：payment_status 枚举统一（删除 C 端映射函数，与管理端统一）

### Out of Scope

- SaaS 多租户架构 — 当前阶段不影响，v2+ 规划
- 自动化测试（unit/integration/e2e） — 项目明确不做，人工验收
- 设备定期轮询（P1-9） — 确认为伪需求，改为按需实时拉取
- P1-2 企业认证中间件 — 企业账号复用 AdminAuth，不需要新中间件
- P1-3 提现"已到账"接口 — 线下打款，系统无法感知
- P2-6 告警通知渠道 — 无关紧要，暂不做
- P2-9 asset_type 校验 — Service 层已有兜底，非问题
- P2-24 Carrier→Series 绑定 — 系列可跨运营商，不需要强绑定
- P2-30 轮询配置通用化 — 设备轮询取消后此问题不存在

## Context

- **技术栈**：Go + Fiber v2 + GORM + Asynq + PostgreSQL + Redis + sonic JSON + Viper + Zap
- **架构分层**：Handler → Service → Store → Model，双进程（API + Worker），依赖集中在 bootstrap 装配
- **路由注册**：统一经过 internal/routes/registry.go 的 Register()，同时驱动 OpenAPI 文档
- **数据权限**：Store 层显式调用 ApplyShopFilter / ApplyEnterpriseFilter，不依赖 GORM Callback（README 描述已过时）
- **支付体系**：微信（PowerWeChat v3 JSAPI/H5）+ 富友（自研 SDK，SDK 完整但主调接口留桩）+ 钱包余额
- **修复文档**：完整规格书位于 .sisyphus/plans/修正业务-完整方案.md，包含每个 Bug 的文件路径和修改代码片段
- **代码库地图**：.planning/codebase/ 包含 ARCHITECTURE.md / STACK.md / STRUCTURE.md 等

## Constraints

- **Tech Stack**: 严格使用 Fiber v2 + GORM + Asynq + PostgreSQL + Redis，不引入替代框架
- **No Tests**: 项目不写自动化测试，人工验收（rg + go build + DBHub + 日志）
- **Language**: 所有注释/日志/错误消息/文档使用中文，变量/函数名使用英文
- **No Foreign Keys**: 禁止数据库外键约束，关联通过 ID 字段在代码层维护
- **方案 E 风险**: 流量体系改革涉及 DB 迁移 + Redis 架构，必须低峰期发布，单独规划

## Key Decisions

| Decision | Rationale | Outcome |
|----------|-----------|---------|
| 不新建企业认证中间件 | 企业账号 user_type=4 已可复用 AdminAuth JWT | — Pending |
| SaaS 方向不影响当前阶段 | 先把 MVP 跑通上线，SaaS 是 v2+ 的事 | — Pending |
| 修正业务文档为完整范围 | 文档覆盖所有已知断点和缺失功能，无额外遗漏 | — Pending |
| 设备体系不做定期轮询 | 按需实时拉取（sync-info）取代定期后台轮询 | — Pending |
| 流量体系改革独立发布 | 破坏性变更（DB 迁移 + Redis 架构），风险隔离 | — Pending |

---
*Last updated: 2026-03-28 after Phase 03.1 (sync-info-phase-3-dto) completion — device reading-side gap fully closed*

## Evolution

This document evolves at phase transitions and milestone boundaries.

**After each phase transition** (via `/gsd-transition`):
1. Requirements invalidated? → Move to Out of Scope with reason
2. Requirements validated? → Move to Validated with phase reference
3. New requirements emerged? → Add to Active
4. Decisions to log? → Add to Key Decisions
5. "What This Is" still accurate? → Update if drifted

**After each milestone** (via `/gsd-complete-milestone`):
1. Full review of all sections
2. Core Value check — still the right priority?
3. Audit Out of Scope — reasons still valid?
4. Update Context with current state
