# 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-1,SDK 已实现但接口是留桩 | ### 竞品差异化(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 天):方案 A(7 个 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*