Files
AIclinicalresearch/backend/prisma/migrations/20251010075003_init/migration.sql
HaHafeng 5db4a7064c feat(iit): Implement real-time quality control system
Summary:

- Add 4 new database tables: iit_field_metadata, iit_qc_logs, iit_record_summary, iit_qc_project_stats

- Implement pg-boss debounce mechanism in WebhookController

- Refactor QC Worker for dual output: QC logs + record summary

- Enhance HardRuleEngine to support form-based rule filtering

- Create QcService for QC data queries

- Optimize ChatService with new intents: query_enrollment, query_qc_status

- Add admin batch operations: one-click full QC + one-click full summary

- Create IIT Admin management module: project config, QC rules, user mapping

Status: Code complete, pending end-to-end testing
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 21:56:11 +08:00

221 lines
7.1 KiB
SQL

-- CreateSchemas (added for shadow database compatibility)
CREATE SCHEMA IF NOT EXISTS "admin_schema";
CREATE SCHEMA IF NOT EXISTS "agent_schema";
CREATE SCHEMA IF NOT EXISTS "aia_schema";
CREATE SCHEMA IF NOT EXISTS "asl_schema";
CREATE SCHEMA IF NOT EXISTS "capability_schema";
CREATE SCHEMA IF NOT EXISTS "common_schema";
CREATE SCHEMA IF NOT EXISTS "dc_schema";
CREATE SCHEMA IF NOT EXISTS "ekb_schema";
CREATE SCHEMA IF NOT EXISTS "iit_schema";
CREATE SCHEMA IF NOT EXISTS "pkb_schema";
CREATE SCHEMA IF NOT EXISTS "platform_schema";
CREATE SCHEMA IF NOT EXISTS "protocol_schema";
CREATE SCHEMA IF NOT EXISTS "rvw_schema";
CREATE SCHEMA IF NOT EXISTS "ssa_schema";
CREATE SCHEMA IF NOT EXISTS "st_schema";
-- CreateTable
CREATE TABLE "users" (
"id" TEXT NOT NULL,
"email" TEXT NOT NULL,
"password" TEXT NOT NULL,
"name" TEXT,
"avatar_url" TEXT,
"role" TEXT NOT NULL DEFAULT 'user',
"status" TEXT NOT NULL DEFAULT 'active',
"kb_quota" INTEGER NOT NULL DEFAULT 3,
"kb_used" INTEGER NOT NULL DEFAULT 0,
"trial_ends_at" TIMESTAMP(3),
"is_trial" BOOLEAN NOT NULL DEFAULT true,
"last_login_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "projects" (
"id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT NOT NULL,
"conversation_count" INTEGER NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "projects_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "conversations" (
"id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"project_id" TEXT,
"agent_id" TEXT NOT NULL,
"title" TEXT NOT NULL,
"model_name" TEXT NOT NULL DEFAULT 'deepseek-v3',
"message_count" INTEGER NOT NULL DEFAULT 0,
"total_tokens" INTEGER NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "conversations_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "messages" (
"id" TEXT NOT NULL,
"conversation_id" TEXT NOT NULL,
"role" TEXT NOT NULL,
"content" TEXT NOT NULL,
"metadata" JSONB,
"tokens" INTEGER,
"is_pinned" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "messages_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "knowledge_bases" (
"id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"dify_dataset_id" TEXT NOT NULL,
"file_count" INTEGER NOT NULL DEFAULT 0,
"total_size_bytes" BIGINT NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "knowledge_bases_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "documents" (
"id" TEXT NOT NULL,
"kb_id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"filename" TEXT NOT NULL,
"file_type" TEXT NOT NULL,
"file_size_bytes" BIGINT NOT NULL,
"file_url" TEXT NOT NULL,
"dify_document_id" TEXT NOT NULL,
"status" TEXT NOT NULL DEFAULT 'uploading',
"progress" INTEGER NOT NULL DEFAULT 0,
"error_message" TEXT,
"segments_count" INTEGER,
"tokens_count" INTEGER,
"uploaded_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"processed_at" TIMESTAMP(3),
CONSTRAINT "documents_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "admin_logs" (
"id" SERIAL NOT NULL,
"admin_id" TEXT NOT NULL,
"action" TEXT NOT NULL,
"resource_type" TEXT,
"resource_id" TEXT,
"details" JSONB,
"ip_address" TEXT,
"user_agent" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "admin_logs_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
-- CreateIndex
CREATE INDEX "users_email_idx" ON "users"("email");
-- CreateIndex
CREATE INDEX "users_status_idx" ON "users"("status");
-- CreateIndex
CREATE INDEX "users_created_at_idx" ON "users"("created_at");
-- CreateIndex
CREATE INDEX "projects_user_id_idx" ON "projects"("user_id");
-- CreateIndex
CREATE INDEX "projects_created_at_idx" ON "projects"("created_at");
-- CreateIndex
CREATE INDEX "conversations_user_id_idx" ON "conversations"("user_id");
-- CreateIndex
CREATE INDEX "conversations_project_id_idx" ON "conversations"("project_id");
-- CreateIndex
CREATE INDEX "conversations_agent_id_idx" ON "conversations"("agent_id");
-- CreateIndex
CREATE INDEX "conversations_created_at_idx" ON "conversations"("created_at");
-- CreateIndex
CREATE INDEX "messages_conversation_id_idx" ON "messages"("conversation_id");
-- CreateIndex
CREATE INDEX "messages_created_at_idx" ON "messages"("created_at");
-- CreateIndex
CREATE INDEX "messages_is_pinned_idx" ON "messages"("is_pinned");
-- CreateIndex
CREATE INDEX "knowledge_bases_user_id_idx" ON "knowledge_bases"("user_id");
-- CreateIndex
CREATE INDEX "knowledge_bases_dify_dataset_id_idx" ON "knowledge_bases"("dify_dataset_id");
-- CreateIndex
CREATE INDEX "documents_kb_id_idx" ON "documents"("kb_id");
-- CreateIndex
CREATE INDEX "documents_user_id_idx" ON "documents"("user_id");
-- CreateIndex
CREATE INDEX "documents_status_idx" ON "documents"("status");
-- CreateIndex
CREATE INDEX "documents_dify_document_id_idx" ON "documents"("dify_document_id");
-- CreateIndex
CREATE INDEX "admin_logs_admin_id_idx" ON "admin_logs"("admin_id");
-- CreateIndex
CREATE INDEX "admin_logs_created_at_idx" ON "admin_logs"("created_at");
-- CreateIndex
CREATE INDEX "admin_logs_action_idx" ON "admin_logs"("action");
-- AddForeignKey
ALTER TABLE "projects" ADD CONSTRAINT "projects_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "conversations" ADD CONSTRAINT "conversations_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "conversations" ADD CONSTRAINT "conversations_project_id_fkey" FOREIGN KEY ("project_id") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "messages" ADD CONSTRAINT "messages_conversation_id_fkey" FOREIGN KEY ("conversation_id") REFERENCES "conversations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "knowledge_bases" ADD CONSTRAINT "knowledge_bases_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "documents" ADD CONSTRAINT "documents_kb_id_fkey" FOREIGN KEY ("kb_id") REFERENCES "knowledge_bases"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "documents" ADD CONSTRAINT "documents_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "admin_logs" ADD CONSTRAINT "admin_logs_admin_id_fkey" FOREIGN KEY ("admin_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;