feat(coupon): 优惠券中心(领取)+ 我的券 + 下单核销/回退
- 新表 user_coupons(快照面额/门槛/类目/有效期)+ orders.user_coupon_id - 仓储:getCouponsWithClaimed/claimCoupon/getUserCoupons/resolveUserCoupon/consumeUserCoupon/releaseUserCouponByOrder - 接口:POST /api/marketing/coupons/:id/claim(同券仅一次、受总量限制)、GET /api/marketing/my-coupons(自动标记过期)、券中心带 claimed 标识 - 下单:createOrder 支持 userCouponId(校验归属/门槛/类目/有效期,服务端算抵扣,与订单同事务占用) - 回退:买家取消/大神拒单/超时退款/仲裁退款 均把券退回为 UNUSED - 小程序:新增 pages/user/coupons(券中心+我的券)、个人中心入口(可用张数)、下单改为选择"我的券"并传 userCouponId - 回归 94 套件/666 用例全绿;冒烟 9/9(领取/重复领取409/不存在404/下单抵扣100-10=90/取消回退)
这个提交包含在:
@@ -150,6 +150,12 @@ MYSQL_DATABASE=peiwan
|
||||
- `40037` 排查:点后台「**拉取小程序模板列表(核对ID)**」,会显示当前 appId(脱敏)与其下真实存在的订阅消息模板;若后台填写的 ID 不在列表中,即为 appId 与建模板的小程序不一致(或用了公众号/服务号的模板ID)。用列表里的真实 ID 覆盖即可。
|
||||
6. 订阅消息为**一次性**:用户授权一次只能收 1 条;高频场景需每次动作前请求授权(代码已在下单/报名/提现前请求)。
|
||||
|
||||
### 优惠券中心与"我的券"(已内置)
|
||||
- 券中心:`GET /api/marketing/coupons`(带 `userId` 时返回 `claimed` 标识)、`POST /api/marketing/coupons/:id/claim` 领取(同一用户同一券仅可领一次,受 `total_count` 限制);
|
||||
- 我的券:`GET /api/marketing/my-coupons?status=UNUSED|USED|EXPIRED`(读取时自动把过期券标记为 EXPIRED);
|
||||
- 下单:`POST /api/orders` 支持 `userCouponId`(校验归属/门槛/类目/有效期后服务端计算抵扣,并在同事务占用);
|
||||
- 回退:买家取消 / 大神拒单 / 超时退款 / 仲裁退款 都会把券**退回**给用户(`user_coupons.status` 回到 UNUSED)。
|
||||
|
||||
### 大神服务包自助维护(已内置)
|
||||
- 大神工作台可**自助新增/编辑/删除/上下架**服务包(`POST|PUT|DELETE /api/companions/:id/services[...]`,仅本人大神或管理员);
|
||||
- 校验:名称必填 ≤40 字、单价须落在平台定价规范区间(`expert_rules` 的 min/maxHourlyRate)、说明 ≤200 字、通过内容安全检测、每人上限 20 个;
|
||||
|
||||
在新工单中引用
屏蔽一个用户