perf: 支持课程补录

This commit is contained in:
richarjiang
2026-09-08 15:08:29 +08:00
parent d1f193e13e
commit b4b3caac70
24 changed files with 1074 additions and 945 deletions

View File

@@ -0,0 +1,27 @@
-- CreateTable
CREATE TABLE `lesson_supplements` (
`id` VARCHAR(191) NOT NULL,
`user_id` VARCHAR(191) NOT NULL,
`request_id` VARCHAR(80) NOT NULL,
`quantity` INTEGER NOT NULL,
`membership_id` VARCHAR(191) NULL,
`deducted_times` INTEGER NOT NULL DEFAULT 0,
`card_name` VARCHAR(191) NULL,
`remark` VARCHAR(200) NULL,
`operator_id` VARCHAR(191) NOT NULL,
`operator_name` VARCHAR(191) NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`revoked_at` DATETIME(3) NULL,
`revoked_by` VARCHAR(191) NULL,
INDEX `lesson_supplements_user_id_revoked_at_created_at_idx`(`user_id`, `revoked_at`, `created_at`),
UNIQUE INDEX `lesson_supplements_user_id_request_id_key`(`user_id`, `request_id`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `lesson_supplements` ADD CONSTRAINT `lesson_supplements_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `lesson_supplements` ADD CONSTRAINT `lesson_supplements_membership_id_fkey` FOREIGN KEY (`membership_id`) REFERENCES `memberships`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

View File

@@ -84,6 +84,7 @@ model User {
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
lessonSupplements LessonSupplement[]
memberships Membership[]
bookings Booking[]
orders Order[]
@@ -155,6 +156,7 @@ model Membership {
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
lessonSupplements LessonSupplement[]
user User @relation(fields: [userId], references: [id])
cardType CardType @relation(fields: [cardTypeId], references: [id])
bookings Booking[]
@@ -307,7 +309,7 @@ model InviteRewardGrant {
updatedAt DateTime @updatedAt @map("updated_at")
inviter User @relation("InviteRewardGrantInviter", fields: [inviterId], references: [id])
membership Membership? @relation(fields: [membershipId], references: [id])
membership Membership? @relation(fields: [membershipId], references: [id], onDelete: Restrict)
@@index([inviterId, grantedAt])
@@map("invite_reward_grants")
@@ -373,3 +375,27 @@ model FlashSaleOrder {
@@index([status])
@@map("flash_sale_orders")
}
// Historical totals without fabricated scheduled dates.
model LessonSupplement {
id String @id @default(uuid())
userId String @map("user_id")
requestId String @map("request_id") @db.VarChar(80)
quantity Int
membershipId String? @map("membership_id")
deductedTimes Int @default(0) @map("deducted_times")
cardName String? @map("card_name")
remark String? @db.VarChar(200)
operatorId String @map("operator_id")
operatorName String @map("operator_name")
createdAt DateTime @default(now()) @map("created_at")
revokedAt DateTime? @map("revoked_at")
revokedBy String? @map("revoked_by")
user User @relation(fields: [userId], references: [id])
membership Membership? @relation(fields: [membershipId], references: [id], onDelete: Restrict)
@@unique([userId, requestId])
@@index([userId, revokedAt, createdAt])
@@map("lesson_supplements")
}