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/取消回退)
这个提交包含在:
@@ -154,7 +154,8 @@ export async function initDatabase(): Promise<void> {
|
||||
"ALTER TABLE orders ADD COLUMN finish_applied_at DATETIME NULL AFTER paid_at",
|
||||
"ALTER TABLE orders ADD COLUMN refund_amount DECIMAL(10,2) DEFAULT 0.00 AFTER coupon_discount",
|
||||
"ALTER TABLE orders ADD COLUMN claimed_by INT NULL AFTER expert_id",
|
||||
"ALTER TABLE orders ADD COLUMN claimed_at DATETIME NULL AFTER claimed_by"
|
||||
"ALTER TABLE orders ADD COLUMN claimed_at DATETIME NULL AFTER claimed_by",
|
||||
"ALTER TABLE orders ADD COLUMN user_coupon_id VARCHAR(64) NULL AFTER coupon_discount"
|
||||
];
|
||||
for (const colSql of extraOrderCols) {
|
||||
try {
|
||||
@@ -660,6 +661,26 @@ export async function initDatabase(): Promise<void> {
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`);
|
||||
|
||||
// 用户已领取的优惠券(券中心领取 → 下单核销 → 取消/退款回退)
|
||||
await conn.query(`
|
||||
CREATE TABLE IF NOT EXISTS user_coupons (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
user_id INT NOT NULL,
|
||||
coupon_id INT NOT NULL,
|
||||
name VARCHAR(64) NOT NULL DEFAULT '',
|
||||
discount_amount DECIMAL(10,2) NOT NULL DEFAULT 0.00,
|
||||
min_spend DECIMAL(10,2) NOT NULL DEFAULT 0.00,
|
||||
category_limit VARCHAR(64) DEFAULT 'ALL',
|
||||
status VARCHAR(16) NOT NULL DEFAULT 'UNUSED',
|
||||
order_id VARCHAR(64) NULL,
|
||||
claimed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
expired_at DATETIME NULL,
|
||||
used_at DATETIME NULL,
|
||||
INDEX idx_uc_user_status (user_id, status),
|
||||
INDEX idx_uc_coupon_user (coupon_id, user_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`);
|
||||
|
||||
// 一次性清理:历史版本会自动为大神生成 3 个演示服务包(现已改为大神自助维护),删除演示数据
|
||||
try {
|
||||
await conn.query(`
|
||||
|
||||
在新工单中引用
屏蔽一个用户