第一版为企业邀请企业:新企业首购前绑定邀请企业,首购后完成对应规格的后续完整配送签收,后台核实后向邀请企业发放水权益。奖励与代理佣金分别记账,不产生现金余额或提现,不增加实物库存。本次不实现自动送水。
php -d extension=mbstring scripts/migrate_water_promotion.php 只查看计划;加 --apply 新建三张 InnoDB 表,初始化关闭的规则。复跑不覆盖已有配置,不回填历史订单或奖励。water:finance:read,配置及审核沿用 water:finance:write,接口仍实时核对账号、角色和权限状态。bound 待首购 → pending 待签收及审核 → issued 已发放 / rejected 不予发放。首笔实际购水低于门槛直接不予发放,后续订单不能替代首购。审核驳回不可通过重复请求改成发放。promotion_reward 流水在同一事务;失败全部回滚。赠水后配送继续校验仓库库存并冻结权益,不预先创造库存。新增 sa_water_promotion_setting(平台配置)、sa_water_promotion_code(企业邀请码)、sa_water_promotion_referral(关系、规则及首购快照、奖励状态)。没有 Redis、队列或外部付款调用。
小程序已有 GET /api/mini/v1/enterprises/{enterprise}/rewards?page=1 返回真实记录,每页20条。新增:
POST /api/mini/v1/enterprises/{enterprise}/promotion/code:{request_key},仅企业管理员。POST /api/mini/v1/enterprises/{enterprise}/promotion/bind:{request_key, invite_code},仅企业管理员。后台新增:
GET /core/water/finance/promotion?page=1&status=pending:配置及分页奖励记录。POST /core/water/finance/promotion/policy:{enabled, sku_id, quantity, min_amount_cents, revision}。POST /core/water/finance/promotion/review:{id, revision, decision, note, receipt_refund_checked};decision 为 issued/rejected,发放须显式核实标记为true。收款入口:WaterPurchaseReceipt::issue → PromotionReferrals::purchased;小程序控制器 → PromotionService(权限/幂等)→ 领域服务 → Eloquent模型;后台控制器沿用财务权限,委托配置、查询及审核服务。没有通过控制器查询业务表。
OpenAPI维护源为 docs/openapi/water-mini-v1.json,通过 php scripts/build_mini_docs.php 同步公开文档、npm run api:types 生成小程序类型。
php -d extension=mbstring tests/water_promotion_test.php 使用真实数据库事务,覆盖活动开关、规则版本、自邀/重复/共用管理员/循环绑定、权限撤销、首购、旧签收拒绝、完整签收、规则快照、组合结算、重试、驳回、财务信息隔离及失败回滚。结束比较策略、邀请、权益、收款和流水快照,所有业务夹具回滚。
回退时先关闭新邀请,保留新增表、已发放权益及审计流水;不得删除已生效权益或账本。需要回退代码时先停用新增接口入口,再使用对应旧版本构建。关闭活动不撤销已发放权益,也不取消已有绑定的约定。