Files
leaudit-platform-backend/scripts/创建sql/schema_add_govdoc_module.sql
T

209 lines
10 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================================
-- govdoc 模块建表 DDL
-- 用途:
-- 1. 创建 govdoc 模块专用结果域表(run / rule_result / report_artifact
-- 2. 给 leaudit_documents 补充 engine_type 字段
-- 3. 幂等执行,重复跑不报错
--
-- 设计原则:
-- - 复用 leaudit_documents / leaudit_document_files 作为文档主档
-- - 新建 govdoc 结果域表,不与 leaudit 引擎结果表混用
-- - 后续规则平台化时再补 govdoc_rule_sets / govdoc_rule_versions
-- ============================================================================
BEGIN;
-- ---------------------------------------------------------------------------
-- 1. govdoc_runs —— 公文审查运行主表
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS public.govdoc_runs (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
document_id BIGINT NOT NULL ,
document_file_id BIGINT,
run_no INTEGER NOT NULL DEFAULT 1,
trigger_source VARCHAR(64) NOT NULL DEFAULT 'upload',
trigger_user_id BIGINT,
task_id VARCHAR(128),
-- 运行状态
status VARCHAR(64) NOT NULL DEFAULT 'pending',
phase VARCHAR(32),
-- 引擎快照
engine_version VARCHAR(64),
llm_provider VARCHAR(64),
llm_model VARCHAR(128),
rules_path VARCHAR(1024),
-- 结果汇总
total_score NUMERIC(10, 2),
passed_count INTEGER,
failed_count INTEGER,
skipped_count INTEGER,
result_status VARCHAR(32),
result_summary_json TEXT,
error_message TEXT,
-- 时间
started_at TIMESTAMPTZ,
finished_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMPTZ DEFAULT NULL
);
ALTER TABLE public.govdoc_runs
ADD COLUMN IF NOT EXISTS rules_path VARCHAR(1024);
COMMENT ON TABLE public.govdoc_runs IS '公文审查运行主表';
COMMENT ON COLUMN public.govdoc_runs.id IS '自增主键';
COMMENT ON COLUMN public.govdoc_runs.document_id IS '关联 leaudit_documents.id';
COMMENT ON COLUMN public.govdoc_runs.document_file_id IS '输入文件 ID,关联 leaudit_document_files.id';
COMMENT ON COLUMN public.govdoc_runs.run_no IS '同一文档第几次执行';
COMMENT ON COLUMN public.govdoc_runs.trigger_source IS '触发来源:upload/manual/retry/migration';
COMMENT ON COLUMN public.govdoc_runs.trigger_user_id IS '触发人 user_id';
COMMENT ON COLUMN public.govdoc_runs.task_id IS 'Celery 任务 ID';
COMMENT ON COLUMN public.govdoc_runs.status IS 'pending/processing/completed/failed/cancelled';
COMMENT ON COLUMN public.govdoc_runs.phase IS '当前阶段:parsing/executing/reporting';
COMMENT ON COLUMN public.govdoc_runs.engine_version IS '引擎版本号';
COMMENT ON COLUMN public.govdoc_runs.llm_provider IS 'LLM 提供商';
COMMENT ON COLUMN public.govdoc_runs.llm_model IS 'LLM 模型名';
COMMENT ON COLUMN public.govdoc_runs.rules_path IS '本次运行使用的规则文件路径';
COMMENT ON COLUMN public.govdoc_runs.total_score IS '总分';
COMMENT ON COLUMN public.govdoc_runs.passed_count IS '通过规则数';
COMMENT ON COLUMN public.govdoc_runs.failed_count IS '未通过规则数';
COMMENT ON COLUMN public.govdoc_runs.skipped_count IS '跳过规则数';
COMMENT ON COLUMN public.govdoc_runs.result_status IS '综合结果:pass/fail/partial/error';
COMMENT ON COLUMN public.govdoc_runs.result_summary_json IS '结构化结果摘要 JSON';
COMMENT ON COLUMN public.govdoc_runs.error_message IS '运行失败时错误描述';
COMMENT ON COLUMN public.govdoc_runs.started_at IS '开始执行时间';
COMMENT ON COLUMN public.govdoc_runs.finished_at IS '结束执行时间';
CREATE INDEX IF NOT EXISTS idx_govdoc_runs_document_id ON public.govdoc_runs(document_id) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_govdoc_runs_status ON public.govdoc_runs(status) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_govdoc_runs_trigger_user_id ON public.govdoc_runs(trigger_user_id);
-- ---------------------------------------------------------------------------
-- 2. govdoc_rule_results —— 单条规则执行结果
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS public.govdoc_rule_results (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
run_id BIGINT NOT NULL,
-- 规则标识
rule_id VARCHAR(128) NOT NULL,
rule_name VARCHAR(256),
severity VARCHAR(32),
category VARCHAR(128),
-- 结果内容
message TEXT,
suggestion TEXT,
actual TEXT,
expected TEXT,
evidence TEXT,
-- 文档定位
paragraph_index INTEGER,
paragraph_text TEXT,
location_path VARCHAR(512),
-- 判定
result VARCHAR(32) NOT NULL DEFAULT 'pass',
skip_reason TEXT,
score NUMERIC(10, 2),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMPTZ DEFAULT NULL
);
ALTER TABLE public.govdoc_rule_results
ADD COLUMN IF NOT EXISTS skip_reason TEXT;
COMMENT ON TABLE public.govdoc_rule_results IS '公文规则执行结果明细表';
COMMENT ON COLUMN public.govdoc_rule_results.id IS '自增主键';
COMMENT ON COLUMN public.govdoc_rule_results.run_id IS '关联 govdoc_runs.id';
COMMENT ON COLUMN public.govdoc_rule_results.rule_id IS '规则标识';
COMMENT ON COLUMN public.govdoc_rule_results.rule_name IS '规则名称';
COMMENT ON COLUMN public.govdoc_rule_results.severity IS '严重等级:error/warning/info';
COMMENT ON COLUMN public.govdoc_rule_results.category IS '规则分类';
COMMENT ON COLUMN public.govdoc_rule_results.message IS '结果描述';
COMMENT ON COLUMN public.govdoc_rule_results.suggestion IS '修改建议';
COMMENT ON COLUMN public.govdoc_rule_results.actual IS '实际值';
COMMENT ON COLUMN public.govdoc_rule_results.expected IS '期望值';
COMMENT ON COLUMN public.govdoc_rule_results.evidence IS '证据文本';
COMMENT ON COLUMN public.govdoc_rule_results.paragraph_index IS '段落索引';
COMMENT ON COLUMN public.govdoc_rule_results.paragraph_text IS '段落原文';
COMMENT ON COLUMN public.govdoc_rule_results.location_path IS '文档结构位置路径';
COMMENT ON COLUMN public.govdoc_rule_results.result IS '执行结果:pass/fail/skipped/error';
COMMENT ON COLUMN public.govdoc_rule_results.skip_reason IS '跳过原因,仅 skipped/error 时使用';
COMMENT ON COLUMN public.govdoc_rule_results.score IS '本条得分';
CREATE INDEX IF NOT EXISTS idx_govdoc_rule_results_run_id ON public.govdoc_rule_results(run_id) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_govdoc_rule_results_rule_id ON public.govdoc_rule_results(rule_id) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_govdoc_rule_results_result ON public.govdoc_rule_results(result) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_govdoc_rule_results_paragraph ON public.govdoc_rule_results(run_id, paragraph_index) WHERE deleted_at IS NULL;
-- ---------------------------------------------------------------------------
-- 3. govdoc_report_artifacts —— 报告产物索引
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS public.govdoc_report_artifacts (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
run_id BIGINT NOT NULL,
artifact_type VARCHAR(64) NOT NULL,
file_name VARCHAR(512) NOT NULL,
file_ext VARCHAR(32),
mime_type VARCHAR(128),
file_size BIGINT,
sha256 VARCHAR(64),
oss_url VARCHAR(2048),
storage_provider VARCHAR(32),
description VARCHAR(512),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMPTZ DEFAULT NULL
);
COMMENT ON TABLE public.govdoc_report_artifacts IS '公文审查报告产物索引表';
COMMENT ON COLUMN public.govdoc_report_artifacts.id IS '自增主键';
COMMENT ON COLUMN public.govdoc_report_artifacts.run_id IS '关联 govdoc_runs.id';
COMMENT ON COLUMN public.govdoc_report_artifacts.artifact_type IS '产物类型:html_report/annotated_docx/paragraph_html/json_report/original';
COMMENT ON COLUMN public.govdoc_report_artifacts.file_name IS '文件名';
COMMENT ON COLUMN public.govdoc_report_artifacts.file_ext IS '扩展名';
COMMENT ON COLUMN public.govdoc_report_artifacts.mime_type IS 'MIME 类型';
COMMENT ON COLUMN public.govdoc_report_artifacts.file_size IS '文件大小(字节)';
COMMENT ON COLUMN public.govdoc_report_artifacts.sha256 IS '文件 SHA256';
COMMENT ON COLUMN public.govdoc_report_artifacts.oss_url IS 'OSS 访问地址';
COMMENT ON COLUMN public.govdoc_report_artifacts.storage_provider IS '存储提供商:oss/minio/local';
COMMENT ON COLUMN public.govdoc_report_artifacts.description IS '产物说明';
CREATE INDEX IF NOT EXISTS idx_govdoc_report_artifacts_run_id ON public.govdoc_report_artifacts(run_id) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_govdoc_report_artifacts_type ON public.govdoc_report_artifacts(run_id, artifact_type) WHERE deleted_at IS NULL;
-- ---------------------------------------------------------------------------
-- 4. leaudit_documents —— 补充 engine_type 字段
-- ---------------------------------------------------------------------------
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'leaudit_documents'
AND column_name = 'engine_type'
) THEN
ALTER TABLE public.leaudit_documents
ADD COLUMN engine_type VARCHAR(32) NOT NULL DEFAULT 'leaudit';
COMMENT ON COLUMN public.leaudit_documents.engine_type IS '引擎类型:leaudit/govdoc/rag';
END IF;
END $$;
-- 为 engine_type 加索引,方便按模块过滤文档列表
CREATE INDEX IF NOT EXISTS idx_leaudit_documents_engine_type ON public.leaudit_documents(engine_type) WHERE deleted_at IS NULL;
COMMIT;