feat(ops): show order redeem records including FIFO secondary coupons
CI / verify (pull_request) Has been cancelled

Persist redeem allocations and surface them on HQ order detail with backfill for history.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-22 23:38:51 +08:00
parent f2303f7fb8
commit e0d3c840a2
5 changed files with 542 additions and 21 deletions
+28 -8
View File
@@ -1038,9 +1038,10 @@ model BenefitCoupon {
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
order Order? @relation(fields: [orderId], references: [id], onDelete: Restrict)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
order Order? @relation(fields: [orderId], references: [id], onDelete: Restrict)
redeemRecords RedeemRecord[]
redeemAllocations RedeemRecordAllocation[]
@@index([userId, status])
@@map("user_benefit_coupon")
@@ -1056,17 +1057,36 @@ model RedeemRecord {
settleAmount Decimal @map("settle_amount") @db.Decimal(10, 2)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
coupon BenefitCoupon @relation(fields: [couponId], references: [id], onDelete: Restrict)
store Store @relation(fields: [storeId], references: [id], onDelete: Restrict)
rating StoreRating?
payout StorePayout?
pending RedeemPendingRecord?
user User @relation(fields: [userId], references: [id], onDelete: Restrict)
coupon BenefitCoupon @relation(fields: [couponId], references: [id], onDelete: Restrict)
store Store @relation(fields: [storeId], references: [id], onDelete: Restrict)
rating StoreRating?
payout StorePayout?
pending RedeemPendingRecord?
allocations RedeemRecordAllocation[]
@@index([storeId, createdAt])
@@map("user_redeem_record")
}
// 核销单跨券 FIFO 分摊明细(含次券可追溯)
model RedeemRecordAllocation {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
redeemRecordId BigInt @map("redeem_record_id") @db.UnsignedBigInt
couponId BigInt @map("coupon_id") @db.UnsignedBigInt
amount Decimal @db.Decimal(10, 2)
sortOrder Int @default(0) @map("sort_order")
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
redeemRecord RedeemRecord @relation(fields: [redeemRecordId], references: [id], onDelete: Cascade)
coupon BenefitCoupon @relation(fields: [couponId], references: [id], onDelete: Restrict)
@@unique([redeemRecordId, couponId])
@@index([couponId])
@@index([redeemRecordId])
@@map("user_redeem_record_allocation")
}
model RedeemPendingRecord {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
pendingNo String @unique @map("pending_no") @db.VarChar(32)