209 lines
10 KiB
PL/PgSQL
209 lines
10 KiB
PL/PgSQL
-- ============================================================================
|
||
-- 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;
|