测算应用在源码中的领域名是 suanming。它不是一个单独部署的网站,而是 Easy Admin SaaS 内部拥有独立领域模型的业务应用:租户负责产品与运营配置,用户通过 PC 或移动端选择项目、提交资料并取得结果,账号、支付和租户能力继续由平台公共层提供。
代码与入口
| 层次 | 源码位置 | 主要职责 |
|---|---|---|
| PC 用户端 | pc/pages/suan-ming、pc/api/suanming.ts |
产品列表、资料填写、订单、结果与分销中心 |
| 移动用户端 | uniapp/src/packages/pages/suan_ming |
H5、小程序和 App 的测算流程 |
| 租户后台 | tenant/src/views/suanming |
产品、订单、分销商、佣金、提现和应用设置 |
| 用户 API | server/app/api/*/suanming |
产品读取、输入校验、下单、结果与用户资产查询 |
| 租户 API | server/app/tenantapi/*/suanming |
产品运营、订单与分销审核 |
| 领域服务 | server/app/common/service/suanming |
产品目录、测算引擎、安装同步、旧数据适配与分销结算 |
核心领域对象
| 对象 | 作用 | 关键约束 |
|---|---|---|
SuanMingProduct |
定义项目编码、分类、表单结构、价格和展示信息 | 项目编码稳定;上下架不修改历史订单 |
SuanMingOrder |
保存购买人、产品快照、输入、支付状态和结果 | 未支付订单不能返回结果;结果属于下单用户 |
SuanMingDistributor |
保存推广码、上下级和佣金汇总 | 绑定关系不能形成环,也不能绑定自己 |
SuanMingCommission |
记录订单产生的分销佣金 | 订单和层级组合保持幂等 |
SuanMingWithdrawal |
表示提现申请、审核、打款或拒绝 | 申请时冻结余额,拒绝时解冻,打款后扣除冻结额 |
用户主流程
flowchart LR
Catalog[读取产品目录] --> Form[按 form_schema 填写资料]
Form --> Validate[服务端校验输入]
Validate --> Price{是否付费}
Price -- 免费 --> Engine[测算引擎]
Price -- 付费 --> Order[创建待支付订单]
Order --> Pay[统一支付]
Pay --> Engine
Engine --> Snapshot[结果写入订单快照]
Snapshot --> Result[用户查看结果]
Pay --> Settle[分销佣金结算]
产品的 form_schema 决定需要填写的字段,SuanMingEngineService 根据产品编码选择八字、姓名、生肖星座、数字、抽签、塔罗等计算路径。免费项目可以直接计算;付费项目先保存清洗后的输入并创建订单,支付完成后再生成结果。订单查询会对未支付结果进行隐藏,避免只靠前端遮挡。
输入与结果都应保存在订单中作为本次交易快照。以后调整产品说明或计算规则时,不能重新解释已经交付的历史订单;进一步演进时还应把规则版本写入订单,便于复算和审计。
分销与提现
用户可以通过推广码建立上下级关系。订单支付完成后,结算服务按照当时配置计算一级和二级佣金,并以“订单 + 层级”防止重复入账。佣金流水解释余额变化,total_amount、available_amount 和 frozen_amount 只作为汇总投影。
提现申请在数据库事务中锁定分销账户并把可用余额转入冻结余额。审核拒绝时退回可用余额,审核通过后才能确认打款;收款账户和真实姓名属于敏感信息,后台展示、导出和日志都应脱敏。
边界与风险
- 结果属于传统文化或娱乐参考,页面必须保留免责声明,不能包装成医疗、法律或投资结论;
- 产品、输入、结果和支付状态由服务端判断,客户端不能直接提交价格或“已支付”;
- 计算失败可以重试,但必须复用原业务订单,避免重复支付和重复结算佣金;
- 每个产品、订单、佣金和提现记录都应携带租户范围,后台统计也不能跨租户聚合;
- 旧数据适配只负责迁移和兼容,不应长期成为新订单的主写入口。