docs: add research findings

This commit is contained in:
2026-03-27 19:04:17 +08:00
parent cf59380784
commit 3078bc71c8
5 changed files with 1456 additions and 0 deletions

View File

@@ -0,0 +1,121 @@
# Research Summary
**Domain:** 君鸿卡管系统 — IoT 卡/号卡/设备全生命周期管理平台
**Synthesized:** 2026-03-27
**Sources:** STACK.md · FEATURES.md · ARCHITECTURE.md · PITFALLS.md
---
## 技术栈评估
**结论:当前技术选型合理,无需大规模替换。**
| 组件 | 状态 | 行动建议 |
|------|------|---------|
| Fiber v2.52.9 | ✅ 继续使用 | 不升级 v3破坏性变更 100+ 处,迁移成本过高) |
| GORM v1.31.x | ✅ 最新 | 继续使用;多级递归查询用原生 `WITH RECURSIVE` |
| Asynq v0.24.x | ⚠️ 落后 | 可选升级到 v0.26.0(无破坏性变更) |
| go-redis v9.7.0 | ⚠️ 落后 | 建议升级到 v9.18.x无破坏性变更 |
| sonic / PowerWeChat | ✅ 正常 | 继续使用 |
**技术债**:佣金计算全程使用 `int64` 整数运算是正确的;退款比例计算(方案 I-3禁止用 `float64`,应使用整数算术 `a * b / c`
---
## 功能完整性分析
### 已覆盖的 Table Stakes ✅
- IoT 卡全生命周期(开卡/激活/停复机/销户)
- 套餐系统(主套餐/加油包/排队/囤货待实名/流量扣减)
- 五种订单购买场景 + 三种支付方式
- 代理商多级分销7 级层级,差价佣金+一次性佣金)
- RBAC 权限系统 + 多租户数据隔离
- C 端微信认证 + 钱包充值购包
### 缺失的 Table Stakes ⚠️(修复阶段应关注)
| 功能 | 优先级 | 说明 |
|------|--------|------|
| 卡/资产批量操作(停/复/注销) | HIGH | 运营场景必须,单卡操作无法应对批量场景 |
| 卡/订单批量导出Excel | HIGH | 财务对账必须,已有导入但缺导出 |
| 退款完整流程 | HIGH | 方案 I 已规划,必须实现 |
| 卡状态变更历史记录 | MEDIUM | 出现纠纷时需要溯源 |
| 套餐到期提醒(微信模板消息) | MEDIUM | 用户断网会差评,竞品标配 |
| 代理商完整资金流水账单 | MEDIUM | 代理需要对账 |
| 富友支付 JSAPI/小程序接口补全 | HIGH | 方案 J-1SDK 已实现但接口是留桩 |
### 竞品差异化v2+ 方向)
- 智能套餐推荐(基于历史用量)
- 告警推送(流量耗尽前预警)
- 数据大屏(代理商业绩可视化)
---
## 架构风险
### 当前正确的设计决策 ✅
- 双进程隔离API vs Worker— 独立扩容
- 数据权限显式过滤(非 GORM Callback— 可见性强
- Asynq 任务队列解耦同步/异步链路
- Bootstrap 集中依赖装配
### 需要立即处理的架构问题 🔴
**1. PollingHandler 缺少 asynqClient方案 A-3**
- 实名激活任务通过 RPush Redis List 降级,绕过 Asynq
- 修复后才能保证异步任务链路可靠性
**2. 多个 Service 实例依赖注入残缺(方案 F-6**
- StopResumeCallback / ResumeCallback 未在 bootstrap 注入
- 停复机后套餐联动回调不触发
**3. Worker 注册遗漏(方案 A-4**
- AutoPurchaseHandler 未在 handler.go 注册
- 充值回调后自动购包任务入队但永远不消费
### SaaS 化时的潜在瓶颈供参考v2+ 考量)
- 代理层级 7 级限制需松绑为配置化
- tb_shop/tb_enterprise 的 owner_shop_id 设计需调整为 tenant_id
- 套餐成本价体系(每个代理一套)将成为最大多租户难点
---
## 关键陷阱(超出修正方案范围)
### 🔴 高危
**1. sellerCostPrice 赋值错误可能不止 1 处A-5 相关)**
- 修正方案只点名场景 5但 order/service.go 中有 6 处 `sellerCostPrice = buyerCostPrice`
- 修复时必须逐一验证每个场景的语义正确性
**2. 退款佣金回扣禁用 float64方案 I-3**
- `ratio := float64(x) / float64(y)` 会引入精度误差
- 应使用:`deductAmount = commission.Amount * approvedAmount / actualAmount`(纯整数)
**3. 分佣树形遍历可能循环引用**
- `shop.ParentID` 向上遍历没有深度上限和循环检测
- 人工修改数据库可能导致 Worker 死循环
### 🟡 中危
**4. 店铺软删除没有级联检查**
- 删除有子代理的店铺后,子代理 parent_id 指向软删除记录
- 佣金计算时找不到父链接,上级代理静默丢失佣金
**5. 实名状态轮询无限重试设计**
- 卡在"未实名"状态的卡每次轮询都入队,没有最大重试次数限制
- 大量长期未实名的卡会持续占用轮询资源
---
## 构建优先级建议
```
立即1-2 天):方案 A7 个 P0 Bug
近期3-5 天):方案 B/C/G/H + J-4企业权限/提现/实名重构/轮询小修)
中期1-2 周):方案 D/I/J-1/J-2/J-3/F设备/退款/富友支付/代码清理)
长期(低峰期):方案 E流量体系改革破坏性 DB 迁移)
```
---
*Research synthesized: 2026-03-27*