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>
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
-- IIT Manager Agent V2.9.1 数据库迁移
|
||||
-- 创建 8 张新表用于支持完整的 Agent 功能
|
||||
-- 日期: 2026-02-07
|
||||
|
||||
-- CreateTable: iit_skills (Skill 配置存储)
|
||||
CREATE TABLE "iit_schema"."skills" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"skill_type" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"config" JSONB NOT NULL,
|
||||
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
||||
"version" INTEGER NOT NULL DEFAULT 1,
|
||||
"trigger_type" TEXT NOT NULL DEFAULT 'webhook',
|
||||
"cron_schedule" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "skills_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable: iit_field_mapping (字段名映射字典)
|
||||
CREATE TABLE "iit_schema"."field_mapping" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"alias_name" TEXT NOT NULL,
|
||||
"actual_name" TEXT NOT NULL,
|
||||
"field_type" TEXT,
|
||||
"field_label" TEXT,
|
||||
"validation" JSONB,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "field_mapping_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable: iit_conversation_history (对话历史/流水账)
|
||||
CREATE TABLE "iit_schema"."conversation_history" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"record_id" TEXT,
|
||||
"role" TEXT NOT NULL,
|
||||
"content" TEXT NOT NULL,
|
||||
"intent" TEXT,
|
||||
"entities" JSONB,
|
||||
"feedback" TEXT,
|
||||
"feedback_reason" TEXT,
|
||||
"embedding" vector(1536),
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "conversation_history_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable: iit_project_memory (项目级热记忆)
|
||||
CREATE TABLE "iit_schema"."project_memory" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"content" TEXT NOT NULL,
|
||||
"last_updated_by" TEXT NOT NULL,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "project_memory_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable: iit_weekly_reports (周报归档/历史书)
|
||||
CREATE TABLE "iit_schema"."weekly_reports" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"week_number" INTEGER NOT NULL,
|
||||
"week_start" TIMESTAMP(3) NOT NULL,
|
||||
"week_end" TIMESTAMP(3) NOT NULL,
|
||||
"summary" TEXT NOT NULL,
|
||||
"metrics" JSONB,
|
||||
"created_by" TEXT NOT NULL,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "weekly_reports_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable: iit_agent_trace (ReAct 推理轨迹)
|
||||
CREATE TABLE "iit_schema"."agent_trace" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"query" TEXT NOT NULL,
|
||||
"intent_type" TEXT,
|
||||
"trace" JSONB NOT NULL,
|
||||
"token_usage" INTEGER,
|
||||
"duration" INTEGER,
|
||||
"success" BOOLEAN NOT NULL DEFAULT true,
|
||||
"error_msg" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "agent_trace_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable: iit_pii_audit_log (PII 脱敏审计日志)
|
||||
CREATE TABLE "iit_schema"."pii_audit_log" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"user_id" TEXT NOT NULL,
|
||||
"session_id" TEXT NOT NULL,
|
||||
"original_hash" TEXT NOT NULL,
|
||||
"masked_payload" TEXT NOT NULL,
|
||||
"masking_map" TEXT NOT NULL,
|
||||
"pii_count" INTEGER NOT NULL,
|
||||
"pii_types" TEXT[],
|
||||
"llm_provider" TEXT NOT NULL,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "pii_audit_log_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable: iit_form_templates (表单模板)
|
||||
CREATE TABLE "iit_schema"."form_templates" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"form_name" TEXT NOT NULL,
|
||||
"field_schema" JSONB NOT NULL,
|
||||
"keywords" TEXT[],
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "form_templates_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex: iit_skills
|
||||
CREATE INDEX "idx_iit_skill_project" ON "iit_schema"."skills"("project_id");
|
||||
CREATE INDEX "idx_iit_skill_active" ON "iit_schema"."skills"("is_active");
|
||||
CREATE UNIQUE INDEX "unique_iit_skill_project_type" ON "iit_schema"."skills"("project_id", "skill_type");
|
||||
|
||||
-- CreateIndex: iit_field_mapping
|
||||
CREATE INDEX "idx_iit_field_mapping_project" ON "iit_schema"."field_mapping"("project_id");
|
||||
CREATE UNIQUE INDEX "unique_iit_field_mapping" ON "iit_schema"."field_mapping"("project_id", "alias_name");
|
||||
|
||||
-- CreateIndex: iit_conversation_history
|
||||
CREATE INDEX "idx_iit_conv_project_user" ON "iit_schema"."conversation_history"("project_id", "user_id");
|
||||
CREATE INDEX "idx_iit_conv_project_record" ON "iit_schema"."conversation_history"("project_id", "record_id");
|
||||
CREATE INDEX "idx_iit_conv_created" ON "iit_schema"."conversation_history"("created_at");
|
||||
|
||||
-- CreateIndex: iit_project_memory
|
||||
CREATE UNIQUE INDEX "project_memory_project_id_key" ON "iit_schema"."project_memory"("project_id");
|
||||
|
||||
-- CreateIndex: iit_weekly_reports
|
||||
CREATE INDEX "idx_iit_weekly_report_project" ON "iit_schema"."weekly_reports"("project_id");
|
||||
CREATE UNIQUE INDEX "unique_iit_weekly_report" ON "iit_schema"."weekly_reports"("project_id", "week_number");
|
||||
|
||||
-- CreateIndex: iit_agent_trace
|
||||
CREATE INDEX "idx_iit_trace_project_time" ON "iit_schema"."agent_trace"("project_id", "created_at");
|
||||
CREATE INDEX "idx_iit_trace_user" ON "iit_schema"."agent_trace"("user_id");
|
||||
|
||||
-- CreateIndex: iit_pii_audit_log
|
||||
CREATE INDEX "idx_iit_pii_project_user" ON "iit_schema"."pii_audit_log"("project_id", "user_id");
|
||||
CREATE INDEX "idx_iit_pii_session" ON "iit_schema"."pii_audit_log"("session_id");
|
||||
CREATE INDEX "idx_iit_pii_created" ON "iit_schema"."pii_audit_log"("created_at");
|
||||
|
||||
-- CreateIndex: iit_form_templates
|
||||
CREATE INDEX "idx_iit_form_template_project" ON "iit_schema"."form_templates"("project_id");
|
||||
CREATE UNIQUE INDEX "unique_iit_form_template" ON "iit_schema"."form_templates"("project_id", "form_name");
|
||||
Reference in New Issue
Block a user