Files
junhong_cmp_fiber/.planning/PROJECT.md

188 lines
12 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.
# 君鸿卡管系统
## 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_currentisCurrentMap 模式) — 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 为空不发起调用,失败只记 Warndevice_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 注入 asynqClientRPush 降级方案删除)— CRITICAL-03
- ✓ 充值回调触发自动购包TaskTypeAutoPurchaseAfterRecharge 入队)— CRITICAL-04
- ✓ 自动购包后佣金链补全TaskTypeCommission 正确触发)— CRITICAL-05
- ✓ 代购订单 sellerCostPrice 修正场景5使用 operatorCostPrice6处全部审查— CRITICAL-06
- ✓ 设备导入补充 IMEI 字段DeviceRow.IMEI + buildDeviceColumnIndex 多别名)— CRITICAL-07
- ✓ 提现冻结并发校验RowsAffected==0 检查,防止重复提现单)— CRITICAL-08
- ✓ IoT 卡全生命周期管理(开卡/激活/停复机/销户)— 已实现
- ✓ 设备管理(绑卡/解绑/批量导入 Excel— 已实现
- ✓ 代理商多级体系(最多 7 层层级parent_id 维护)— 已实现
- ✓ RBAC 权限系统(角色/权限/菜单,基于店铺层级数据过滤)— 已实现
- ✓ B 端认证Admin JWT + Redis TokenSuperAdmin/Platform/Agent/Enterprise— 已实现
- ✓ C 端认证(微信 OAuth + 手机号绑定JWT 单独中间件)— 已实现
- ✓ 套餐系统(主套餐/加油包/排队激活/囤货待实名激活/流量计费)— 已实现
- ✓ 订单系统(五种购买场景,钱包/微信/富友支付)— 已实现
- ✓ 微信支付JSAPI + H5PowerWeChat v3 SDK— 已实现
- ✓ 资产钱包(绑定卡/设备,转手后钱包跟着走)— 已实现
- ✓ 代理佣金钱包(差价佣金 + 一次性佣金,多级分链)— 已实现
- ✓ 代理佣金提现申请流程(申请/审批/拒绝)— 已实现(待修复)
- ✓ 轮询系统(实名状态/流量/套餐余额Asynq + Redis Sorted Set— 已实现
- ✓ 标签系统(平台/企业/店铺三级隔离)— 已实现
- ✓ 对象存储(联通云 OSSS3 兼容,批量导入/导出)— 已实现
- ✓ 审计日志账号操作create/update/delete/assign_roles— 已实现
- ✓ 企业账号管理B 端大客户,被分配卡/设备,无钱包)— 已实现(待修复权限)
- ✓ 订单超时自动取消Asynq Scheduler30 分钟)— 已实现
- ✓ 富友支付 SDKpkg/fuiou/ 完整实现 + 回调已实现)— SDK 已实现,接口留桩待补全
### Active
*当前阶段需要完成的工作,来自修正业务完整方案(.sisyphus/plans/修正业务-完整方案.md*
**方案 A — 紧急 Bug 修复P0***Validated in Phase 1*
- [x] A-1实名状态常量统一DB 写入值 2 vs 常量 1所有链路断裂
- [x] A-2C 端实名校验修复(依赖 A-1
- [x] A-3实名激活任务断链修复PollingHandler 缺少 asynqClientRPush 降级)
- [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-1Resolve 接口错误拦截企业账号(应可查,需移除拦截)
- [x] B-2Refresh 接口缺少企业账号拦截(应只读)
**方案 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-1Gateway sync-info 同步接口对接CurrentIccid 预留结构待填充)
- [x] D-2device_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_usageRedis 增量缓存)
- [ ] E-2current_month_usage_mb 改增量累加(不再被上游自然月归零覆盖)
- [ ] E-3流量查询层适配兼容 Redis 今日 + DB 历史两段数据)
**方案 F — 代码质量清理**
- [ ] F-1佣金链断裂改为零额待审记录status=99不再静默跳过
- [ ] F-2废弃 sim:status:sync 任务代码删除
- [ ] F-3错误不应被吞cards, _ := 改为记日志)
- [ ] F-4C 端 Handler 迁移到 Service 层(直接 DB 访问改回分层)
- [ ] F-5Handler/Service 权限不一致修复
- [ ] F-6StopResumeCallback / ResumeCallback 注入bootstrap 未调用)
**方案 G — 实名激活架构重构***Validated in Phase 2*
- [x] Genable_realname_activation 字段拆分为 expiry_basefrom_activation/from_purchase
**方案 H — 轮询系统小修***Validated in Phase 2*
- [x] H-1polling:protect 接入调度(已注册未调度)
- [x] H-2gatewayClient=nil 时停复机应返回错误(而非假装成功)
- [x] H-3packages 接口加分页
- [x] H-4Series 删除前检查关联套餐
**方案 I — 退款完整功能(新功能)**
- [ ] I-1新建 tb_refund_request 数据模型
- [ ] I-27 个退款接口(申请/列表/详情/审批/拒绝/退回/重提)
- [ ] I-3审批通过后按比例扣减代理佣金钱包
**方案 J — 其他修复**
- [ ] J-1富友支付 JSAPI + 小程序接口实现(替换留桩)
- [ ] J-2平台代理钱包代购支持platform buyerType 绕过代理检查)
- [ ] J-3status 3/4 业务触发逻辑激活→3最后套餐到期→4
- [ ] J-4payment_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 CallbackREADME 描述已过时)
- **支付体系**微信PowerWeChat v3 JSAPI/H5+ 富友(自研 SDKSDK 完整但主调接口留桩)+ 钱包余额
- **修复文档**:完整规格书位于 .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