merge: 集成V2.6 性能增强与小宝后台化
# Conflicts: # apps/server/prisma/schema.prisma # apps/server/src/app.module.ts # apps/web/components/layout/Sidebar.tsx # docs/architecture.md # docs/decisions.md # docs/roadmap.md
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
-- V2.6 hot query indexes for performance harness, query budget audit,
|
||||
-- and background Xiaobao summary refresh scans.
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "projects_product_created_at_idx"
|
||||
ON "projects"("product_id", "created_at" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "versions_product_created_at_idx"
|
||||
ON "versions"("product_id", "created_at" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "versions_product_project_created_at_idx"
|
||||
ON "versions"("product_id", "project_id", "created_at" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "version_plans_owner_open_due_idx"
|
||||
ON "version_plans"("owner_id", "expected_end_at" ASC, "updated_at" DESC)
|
||||
WHERE "status" <> 'completed';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "dev_tasks_assignee_open_priority_idx"
|
||||
ON "dev_tasks"("assignee_id", "priority" ASC, "updated_at" DESC)
|
||||
WHERE "status" <> 'submitted';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "test_cases_assignee_open_priority_idx"
|
||||
ON "test_cases"("assignee_id", "priority" ASC, "updated_at" DESC)
|
||||
WHERE "status" NOT IN ('passed', 'failed', 'blocked');
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "bugs_version_status_priority_updated_at_idx"
|
||||
ON "bugs"("version_id", "status" ASC, "priority" ASC, "updated_at" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "bugs_assignee_open_priority_idx"
|
||||
ON "bugs"("assignee_id", "priority" ASC, "updated_at" DESC)
|
||||
WHERE "status" IN ('open', 'fixing', 'fixed', 'verifying');
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "test_cases_version_round_status_updated_at_desc_idx"
|
||||
ON "test_cases"("version_id", "round_no" DESC, "status" ASC, "updated_at" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "xiaobao_risk_summaries_warning_score_idx"
|
||||
ON "xiaobao_risk_summaries"("risk_score" DESC, "updated_at" DESC)
|
||||
WHERE "risk_level" <> 'on_track';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "xiaobao_risk_summaries_dirty_updated_at_idx"
|
||||
ON "xiaobao_risk_summaries"("updated_at" ASC)
|
||||
WHERE "dirty" = true;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "work_activities_version_occurred_at_idx"
|
||||
ON "work_activities"("version_id", "occurred_at" DESC);
|
||||
@@ -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');
|
||||
@@ -443,6 +443,25 @@ model AuditEvent {
|
||||
@@map("audit_events")
|
||||
}
|
||||
|
||||
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")
|
||||
|
||||
Reference in New Issue
Block a user