Add market watch and match hub workflows
这个提交包含在:
90
drizzle/0013_match_hub.sql
普通文件
90
drizzle/0013_match_hub.sql
普通文件
@@ -0,0 +1,90 @@
|
||||
CREATE TABLE `match_sessions` (
|
||||
`id` int AUTO_INCREMENT NOT NULL,
|
||||
`createdByUserId` int NOT NULL,
|
||||
`matchMode` enum('daily','competitive') NOT NULL DEFAULT 'daily',
|
||||
`workflowStatus` enum('draft','recording','review_pending','reviewed','finalizing','finalized','cancelled') NOT NULL DEFAULT 'draft',
|
||||
`title` varchar(256) NOT NULL,
|
||||
`courtName` varchar(128),
|
||||
`notes` text,
|
||||
`durationMinutes` int NOT NULL DEFAULT 90,
|
||||
`scheduledAt` timestamp,
|
||||
`startedAt` timestamp,
|
||||
`endedAt` timestamp,
|
||||
`suggestionStatus` enum('idle','queued','ready','failed') NOT NULL DEFAULT 'idle',
|
||||
`suggestionTaskId` varchar(64),
|
||||
`suggestedScore` json,
|
||||
`suggestedMetrics` json,
|
||||
`finalScore` json,
|
||||
`finalMetrics` json,
|
||||
`reviewNotes` text,
|
||||
`reviewSubmittedAt` timestamp,
|
||||
`reviewedByUserId` int,
|
||||
`reviewedAt` timestamp,
|
||||
`finalizedByUserId` int,
|
||||
`finalizedAt` timestamp,
|
||||
`createdAt` timestamp NOT NULL DEFAULT (now()),
|
||||
`updatedAt` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
|
||||
CONSTRAINT `match_sessions_id` PRIMARY KEY(`id`)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
|
||||
CREATE TABLE `match_participants` (
|
||||
`id` int AUTO_INCREMENT NOT NULL,
|
||||
`matchId` int NOT NULL,
|
||||
`userId` int NOT NULL,
|
||||
`playerSlot` enum('player_a','player_b') NOT NULL,
|
||||
`cameraSlot` enum('camera_a','camera_b') NOT NULL,
|
||||
`cameraStatus` enum('pending','bound','active','completed','failed') NOT NULL DEFAULT 'pending',
|
||||
`cameraLabel` varchar(128),
|
||||
`cameraVideoId` int,
|
||||
`cameraVideoUrl` text,
|
||||
`cameraSnapshot` json,
|
||||
`isWinner` int NOT NULL DEFAULT 0,
|
||||
`suggestedSetsWon` int NOT NULL DEFAULT 0,
|
||||
`suggestedGamesWon` int NOT NULL DEFAULT 0,
|
||||
`suggestedPointsWon` int NOT NULL DEFAULT 0,
|
||||
`finalSetsWon` int NOT NULL DEFAULT 0,
|
||||
`finalGamesWon` int NOT NULL DEFAULT 0,
|
||||
`finalPointsWon` int NOT NULL DEFAULT 0,
|
||||
`suggestedStats` json,
|
||||
`finalStats` json,
|
||||
`createdAt` timestamp NOT NULL DEFAULT (now()),
|
||||
`updatedAt` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
|
||||
CONSTRAINT `match_participants_id` PRIMARY KEY(`id`),
|
||||
CONSTRAINT `match_participants_match_player_idx` UNIQUE(`matchId`,`playerSlot`),
|
||||
CONSTRAINT `match_participants_match_user_idx` UNIQUE(`matchId`,`userId`)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
|
||||
CREATE TABLE `match_score_events` (
|
||||
`id` int AUTO_INCREMENT NOT NULL,
|
||||
`matchId` int NOT NULL,
|
||||
`eventIndex` int NOT NULL,
|
||||
`source` enum('camera_a','camera_b','system','admin') NOT NULL DEFAULT 'system',
|
||||
`eventType` enum('point','game','set','metric','score_suggestion','review_adjustment','finalized') NOT NULL,
|
||||
`winnerSlot` enum('player_a','player_b'),
|
||||
`matchSecond` int,
|
||||
`confidence` float,
|
||||
`payload` json,
|
||||
`createdByUserId` int,
|
||||
`createdAt` timestamp NOT NULL DEFAULT (now()),
|
||||
CONSTRAINT `match_score_events_id` PRIMARY KEY(`id`),
|
||||
CONSTRAINT `match_score_events_match_event_idx` UNIQUE(`matchId`,`eventIndex`)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
|
||||
ALTER TABLE `background_tasks`
|
||||
MODIFY COLUMN `type` enum(
|
||||
'media_finalize',
|
||||
'training_plan_generate',
|
||||
'training_plan_adjust',
|
||||
'analysis_corrections',
|
||||
'pose_correction_multimodal',
|
||||
'ntrp_refresh_user',
|
||||
'ntrp_refresh_all',
|
||||
'market_source_sync',
|
||||
'market_watch_refresh',
|
||||
'market_push_delivery',
|
||||
'match_score_suggest',
|
||||
'match_finalize'
|
||||
) NOT NULL;
|
||||
在新工单中引用
屏蔽一个用户