feat(jobs): 增加后台任务运行时

This commit is contained in:
2026-07-08 17:02:51 +08:00
parent 69f50ea1f5
commit ba999c9322
14 changed files with 575 additions and 2 deletions

View File

@@ -0,0 +1,32 @@
CREATE TABLE "background_jobs" (
"id" TEXT NOT NULL,
"type" TEXT NOT NULL,
"status" TEXT NOT NULL DEFAULT 'queued',
"dedupe_key" TEXT,
"payload" JSONB NOT NULL DEFAULT '{}',
"attempts" INTEGER NOT NULL DEFAULT 0,
"max_attempts" INTEGER NOT NULL DEFAULT 3,
"available_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"locked_by" TEXT,
"locked_until" TIMESTAMP(3),
"last_error" TEXT,
"completed_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "background_jobs_pkey" PRIMARY KEY ("id")
);
CREATE INDEX "background_jobs_status_available_at_idx"
ON "background_jobs"("status", "available_at" ASC, "created_at" ASC);
CREATE INDEX "background_jobs_type_status_available_at_idx"
ON "background_jobs"("type", "status", "available_at" ASC);
CREATE INDEX "background_jobs_lease_idx"
ON "background_jobs"("status", "locked_until" ASC)
WHERE "locked_until" IS NOT NULL;
CREATE UNIQUE INDEX "background_jobs_active_dedupe_key_idx"
ON "background_jobs"("type", "dedupe_key")
WHERE "dedupe_key" IS NOT NULL AND "status" IN ('queued', 'running');

View File

@@ -423,6 +423,25 @@ model AiLog {
@@map("ai_logs")
}
model BackgroundJob {
id String @id @default(cuid())
type String
status String @default("queued")
dedupeKey String? @map("dedupe_key")
payload Json @default("{}")
attempts Int @default(0)
maxAttempts Int @default(3) @map("max_attempts")
availableAt DateTime @default(now()) @map("available_at")
lockedBy String? @map("locked_by")
lockedUntil DateTime? @map("locked_until")
lastError String? @map("last_error")
completedAt DateTime? @map("completed_at")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("background_jobs")
}
model XiaobaoRiskSummary {
versionId String @id @map("version_id")
riskLevel String @map("risk_level")