feat: complete M1-M3 infrastructure — OSS client, native execution chain, rule lifecycle API, system docs

- M1: unified OSS client (upload/download/presign) + path utils + config
- M2: rule service with validate/create/publish/rollback + binding CRUD endpoints
- M3: native AuditCtx runner, file/rule resolvers, storage adapter with full persistence
- docs: SYSTEM_OVERVIEW.md as comprehensive architecture reference
- fix: double finalize — terminal state now written once by finalize_run
This commit is contained in:
wren
2026-04-28 11:49:55 +08:00
parent be9fc4856b
commit 246c0e5ded
26 changed files with 1771 additions and 188 deletions
+44 -44
View File
@@ -18,8 +18,8 @@ CREATE TABLE IF NOT EXISTS leaudit_entry_modules (
areas JSONB,
sort_order INTEGER NOT NULL DEFAULT 0,
is_enabled BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
create_time TIMESTAMPTZ NOT NULL DEFAULT now(),
update_time TIMESTAMPTZ NOT NULL DEFAULT now()
);
COMMENT ON TABLE leaudit_entry_modules IS '入口模块表 — 定义前端导航入口菜单及其区域配置';
@@ -32,8 +32,8 @@ COMMENT ON COLUMN leaudit_entry_modules.icon_path IS '入口菜单图标OSS路
COMMENT ON COLUMN leaudit_entry_modules.areas IS '区域配置JSON,格式: [{"area":"梅州","enabled":true,"sort_order":1}]';
COMMENT ON COLUMN leaudit_entry_modules.sort_order IS '排序序号';
COMMENT ON COLUMN leaudit_entry_modules.is_enabled IS '是否启用';
COMMENT ON COLUMN leaudit_entry_modules.created_at IS '创建时间';
COMMENT ON COLUMN leaudit_entry_modules.updated_at IS '更新时间';
COMMENT ON COLUMN leaudit_entry_modules.create_time IS '创建时间';
COMMENT ON COLUMN leaudit_entry_modules.update_time IS '更新时间';
-- ============================================================================
@@ -51,9 +51,9 @@ CREATE TABLE IF NOT EXISTS leaudit_document_types (
prompt_config JSONB,
is_enabled BOOLEAN NOT NULL DEFAULT true,
sort_order INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
deleted_at TIMESTAMPTZ
create_time TIMESTAMPTZ NOT NULL DEFAULT now(),
update_time TIMESTAMPTZ NOT NULL DEFAULT now(),
delete_time TIMESTAMPTZ
);
COMMENT ON TABLE leaudit_document_types IS '文档类型定义表 — 定义系统支持的文档类型及其分类/抽取配置';
@@ -69,9 +69,9 @@ COMMENT ON COLUMN leaudit_document_types.extraction_mode IS '抽取模式: singl
COMMENT ON COLUMN leaudit_document_types.prompt_config IS '提示词配置JSON,覆盖默认的LLM提示词模板';
COMMENT ON COLUMN leaudit_document_types.is_enabled IS '是否启用';
COMMENT ON COLUMN leaudit_document_types.sort_order IS '排序序号';
COMMENT ON COLUMN leaudit_document_types.created_at IS '创建时间';
COMMENT ON COLUMN leaudit_document_types.updated_at IS '更新时间';
COMMENT ON COLUMN leaudit_document_types.deleted_at IS '软删除时间,NULL表示未删除';
COMMENT ON COLUMN leaudit_document_types.create_time IS '创建时间';
COMMENT ON COLUMN leaudit_document_types.update_time IS '更新时间';
COMMENT ON COLUMN leaudit_document_types.delete_time IS '软删除时间,NULL表示未删除';
-- ============================================================================
@@ -86,9 +86,9 @@ CREATE TABLE IF NOT EXISTS leaudit_evaluation_point_groups (
rule_set_id BIGINT,
sort_order INTEGER NOT NULL DEFAULT 0,
is_enabled BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
deleted_at TIMESTAMPTZ
create_time TIMESTAMPTZ NOT NULL DEFAULT now(),
update_time TIMESTAMPTZ NOT NULL DEFAULT now(),
delete_time TIMESTAMPTZ
);
COMMENT ON TABLE leaudit_evaluation_point_groups IS '评查点规则组表 — 评查点的树形分组结构,支持PID层级嵌套';
@@ -101,9 +101,9 @@ COMMENT ON COLUMN leaudit_evaluation_point_groups.description IS '分组描述';
COMMENT ON COLUMN leaudit_evaluation_point_groups.rule_set_id IS '关联的规则集ID,外键引用 leaudit_rule_sets.id';
COMMENT ON COLUMN leaudit_evaluation_point_groups.sort_order IS '同级排序序号';
COMMENT ON COLUMN leaudit_evaluation_point_groups.is_enabled IS '是否启用';
COMMENT ON COLUMN leaudit_evaluation_point_groups.created_at IS '创建时间';
COMMENT ON COLUMN leaudit_evaluation_point_groups.updated_at IS '更新时间';
COMMENT ON COLUMN leaudit_evaluation_point_groups.deleted_at IS '软删除时间,NULL表示未删除';
COMMENT ON COLUMN leaudit_evaluation_point_groups.create_time IS '创建时间';
COMMENT ON COLUMN leaudit_evaluation_point_groups.update_time IS '更新时间';
COMMENT ON COLUMN leaudit_evaluation_point_groups.delete_time IS '软删除时间,NULL表示未删除';
-- ============================================================================
@@ -133,9 +133,9 @@ CREATE TABLE IF NOT EXISTS leaudit_evaluation_points (
action_config TEXT,
document_attribute_type VARCHAR(20) DEFAULT 'ALL',
sort_order INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
deleted_at TIMESTAMPTZ
create_time TIMESTAMPTZ NOT NULL DEFAULT now(),
update_time TIMESTAMPTZ NOT NULL DEFAULT now(),
delete_time TIMESTAMPTZ
);
COMMENT ON TABLE leaudit_evaluation_points IS '规则点(评查点)表 — 评查点的完整元数据定义,与DSL YAML中的rule一一对应';
@@ -163,9 +163,9 @@ COMMENT ON COLUMN leaudit_evaluation_points.post_action IS '评查后动作: non
COMMENT ON COLUMN leaudit_evaluation_points.action_config IS '动作配置文本,配合 post_action 使用';
COMMENT ON COLUMN leaudit_evaluation_points.document_attribute_type IS '适用文档属性: ALL(通用) | SALE(买卖) | LEASE(租赁) | SERVICE(服务) | MANDATE(委托) | CONSTRUCTION(建设工程) | TRAINING(培训) | TECHNOLOGY(技术) | DONATION(赠与) | TRANSPORT(运输) | STORAGE(仓储) | COOPERATION(合作) | UNDERTAKING(承揽)';
COMMENT ON COLUMN leaudit_evaluation_points.sort_order IS '排序序号';
COMMENT ON COLUMN leaudit_evaluation_points.created_at IS '创建时间';
COMMENT ON COLUMN leaudit_evaluation_points.updated_at IS '更新时间';
COMMENT ON COLUMN leaudit_evaluation_points.deleted_at IS '软删除时间,NULL表示未删除';
COMMENT ON COLUMN leaudit_evaluation_points.create_time IS '创建时间';
COMMENT ON COLUMN leaudit_evaluation_points.update_time IS '更新时间';
COMMENT ON COLUMN leaudit_evaluation_points.delete_time IS '软删除时间,NULL表示未删除';
-- ============================================================================
@@ -194,8 +194,8 @@ COMMENT ON COLUMN jwt_tokens.last_used_at IS '令牌最近一次使用时间';
COMMENT ON COLUMN jwt_tokens.is_revoked IS '是否已被吊销';
COMMENT ON COLUMN jwt_tokens.revoked_at IS '吊销时间';
COMMENT ON COLUMN jwt_tokens.revoke_reason IS '吊销原因: logout(主动登出) | password_change(密码修改) | admin(管理员强制) | security(安全事件)';
COMMENT ON COLUMN jwt_tokens.created_at IS '记录创建时间';
COMMENT ON COLUMN jwt_tokens.updated_at IS '记录更新时间';
COMMENT ON COLUMN jwt_tokens.create_time IS '记录创建时间';
COMMENT ON COLUMN jwt_tokens.update_time IS '记录更新时间';
-- --------------------------------------------------------------------------
@@ -208,8 +208,8 @@ COMMENT ON COLUMN leaudit_documents.biz_document_id IS '业务系统文档ID
COMMENT ON COLUMN leaudit_documents.type_id IS '文档类型ID,外键引用 leaudit_document_types.id';
COMMENT ON COLUMN leaudit_documents.processing_status IS '处理状态: waiting(等待处理) | running(处理中) | completed(已完成) | failed(失败)';
COMMENT ON COLUMN leaudit_documents.current_run_id IS '当前活跃的评查运行ID,外键引用 leaudit_audit_runs.id';
COMMENT ON COLUMN leaudit_documents.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_documents.updated_at IS '记录更新时间';
COMMENT ON COLUMN leaudit_documents.create_time IS '记录创建时间';
COMMENT ON COLUMN leaudit_documents.update_time IS '记录更新时间';
-- --------------------------------------------------------------------------
@@ -230,7 +230,7 @@ COMMENT ON COLUMN leaudit_document_files.oss_url IS 'OSS对象存储URL(唯一
COMMENT ON COLUMN leaudit_document_files.storage_provider IS '存储提供商: minio | aliyun_oss | local';
COMMENT ON COLUMN leaudit_document_files.is_active IS '是否为当前活跃版本';
COMMENT ON COLUMN leaudit_document_files.created_by IS '上传者用户ID,关联 sso_users.id';
COMMENT ON COLUMN leaudit_document_files.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_document_files.create_time IS '记录创建时间';
-- --------------------------------------------------------------------------
@@ -269,8 +269,8 @@ COMMENT ON COLUMN leaudit_audit_runs.skipped_count IS '跳过的规则数(条
COMMENT ON COLUMN leaudit_audit_runs.result_status IS '整体结果: pass(通过) | fail(不通过) | partial(部分通过) | review(需人工复核)';
COMMENT ON COLUMN leaudit_audit_runs.started_at IS '评查开始时间';
COMMENT ON COLUMN leaudit_audit_runs.finished_at IS '评查结束时间';
COMMENT ON COLUMN leaudit_audit_runs.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_audit_runs.updated_at IS '记录更新时间';
COMMENT ON COLUMN leaudit_audit_runs.create_time IS '记录创建时间';
COMMENT ON COLUMN leaudit_audit_runs.update_time IS '记录更新时间';
-- --------------------------------------------------------------------------
@@ -297,7 +297,7 @@ COMMENT ON COLUMN leaudit_artifacts.oss_url IS 'OSS对象存储URL(唯一真
COMMENT ON COLUMN leaudit_artifacts.storage_provider IS '存储提供商: minio | aliyun_oss | local';
COMMENT ON COLUMN leaudit_artifacts.is_persisted IS '是否已持久化到OSS';
COMMENT ON COLUMN leaudit_artifacts.retention_policy IS '保留策略: temp(临时) | run_life(评查周期) | permanent(永久)';
COMMENT ON COLUMN leaudit_artifacts.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_artifacts.create_time IS '记录创建时间';
-- --------------------------------------------------------------------------
@@ -327,8 +327,8 @@ COMMENT ON COLUMN leaudit_rule_results.remediation IS '修正建议JSON,结构
COMMENT ON COLUMN leaudit_rule_results.rescue_applied IS '是否已应用补救流程';
COMMENT ON COLUMN leaudit_rule_results.rescue_passed IS '补救后是否通过';
COMMENT ON COLUMN leaudit_rule_results.result_payload IS '原始结果JSON(完整保留leaudit引擎输出)';
COMMENT ON COLUMN leaudit_rule_results.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_rule_results.updated_at IS '记录更新时间';
COMMENT ON COLUMN leaudit_rule_results.create_time IS '记录创建时间';
COMMENT ON COLUMN leaudit_rule_results.update_time IS '记录更新时间';
-- --------------------------------------------------------------------------
@@ -352,7 +352,7 @@ COMMENT ON COLUMN leaudit_field_results.rule_score IS '规则置信分(业务
COMMENT ON COLUMN leaudit_field_results.hard_failed IS '是否硬失败(落在置信阈值以下且无兜底值)';
COMMENT ON COLUMN leaudit_field_results.fallback_value IS '兜底/替代值(置信不足时使用)';
COMMENT ON COLUMN leaudit_field_results.meta_json IS '扩展元数据JSON(phase信息、field位置、分组等)';
COMMENT ON COLUMN leaudit_field_results.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_field_results.create_time IS '记录创建时间';
-- --------------------------------------------------------------------------
@@ -376,7 +376,7 @@ COMMENT ON COLUMN leaudit_run_metrics.llm_call_count IS 'LLM调用次数';
COMMENT ON COLUMN leaudit_run_metrics.vlm_call_count IS 'VLM调用次数';
COMMENT ON COLUMN leaudit_run_metrics.rescue_rule_count IS '补救规则数(触发rescue的规则数量)';
COMMENT ON COLUMN leaudit_run_metrics.artifact_count IS '产出的产物文件总数';
COMMENT ON COLUMN leaudit_run_metrics.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_run_metrics.create_time IS '记录创建时间';
-- --------------------------------------------------------------------------
@@ -392,7 +392,7 @@ COMMENT ON COLUMN leaudit_run_errors.level IS '错误级别: fatal(致命) | err
COMMENT ON COLUMN leaudit_run_errors.error_code IS '错误码(标准化标识,如 OCR_TIMEOUT / LLM_API_ERROR';
COMMENT ON COLUMN leaudit_run_errors.message IS '错误描述信息';
COMMENT ON COLUMN leaudit_run_errors.detail_json IS '错误详情JSON(堆栈、上下文、请求参数等)';
COMMENT ON COLUMN leaudit_run_errors.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_run_errors.create_time IS '记录创建时间';
-- --------------------------------------------------------------------------
@@ -414,8 +414,8 @@ COMMENT ON COLUMN leaudit_rescue_outcomes.vlm_calls IS '补救过程VLM调用次
COMMENT ON COLUMN leaudit_rescue_outcomes.duration_ms IS '补救总耗时(毫秒)';
COMMENT ON COLUMN leaudit_rescue_outcomes.requires_human_review IS '是否需要人工复核';
COMMENT ON COLUMN leaudit_rescue_outcomes.payload IS '补救过程完整数据JSON(含每层rescue的输入输出)';
COMMENT ON COLUMN leaudit_rescue_outcomes.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_rescue_outcomes.updated_at IS '记录更新时间';
COMMENT ON COLUMN leaudit_rescue_outcomes.create_time IS '记录创建时间';
COMMENT ON COLUMN leaudit_rescue_outcomes.update_time IS '记录更新时间';
-- --------------------------------------------------------------------------
@@ -433,9 +433,9 @@ COMMENT ON COLUMN leaudit_rule_sets.current_version_id IS '当前生效版本ID
COMMENT ON COLUMN leaudit_rule_sets.status IS '状态: draft(草稿) | active(生效) | deprecated(废弃) | archived(归档)';
COMMENT ON COLUMN leaudit_rule_sets.is_builtin IS '是否为系统内置规则(内置规则不可删除)';
COMMENT ON COLUMN leaudit_rule_sets.owner_user_id IS '负责人用户ID,外键引用 sso_users.id';
COMMENT ON COLUMN leaudit_rule_sets.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_rule_sets.updated_at IS '记录更新时间';
COMMENT ON COLUMN leaudit_rule_sets.deleted_at IS '软删除时间,NULL表示未删除';
COMMENT ON COLUMN leaudit_rule_sets.create_time IS '记录创建时间';
COMMENT ON COLUMN leaudit_rule_sets.update_time IS '记录更新时间';
COMMENT ON COLUMN leaudit_rule_sets.delete_time IS '软删除时间,NULL表示未删除';
-- --------------------------------------------------------------------------
@@ -461,8 +461,8 @@ COMMENT ON COLUMN leaudit_rule_versions.change_note IS '版本变更说明';
COMMENT ON COLUMN leaudit_rule_versions.editor_user_id IS '编辑者用户ID,外键引用 sso_users.id';
COMMENT ON COLUMN leaudit_rule_versions.publisher_user_id IS '发布者用户ID,外键引用 sso_users.id';
COMMENT ON COLUMN leaudit_rule_versions.published_at IS '发布时间';
COMMENT ON COLUMN leaudit_rule_versions.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_rule_versions.updated_at IS '记录更新时间';
COMMENT ON COLUMN leaudit_rule_versions.create_time IS '记录创建时间';
COMMENT ON COLUMN leaudit_rule_versions.update_time IS '记录更新时间';
-- --------------------------------------------------------------------------
@@ -478,8 +478,8 @@ COMMENT ON COLUMN leaudit_rule_type_bindings.binding_mode IS '绑定模式: expl
COMMENT ON COLUMN leaudit_rule_type_bindings.priority IS '优先级(数值越大优先级越高),通配符绑定通常优先级较低';
COMMENT ON COLUMN leaudit_rule_type_bindings.is_active IS '是否激活';
COMMENT ON COLUMN leaudit_rule_type_bindings.note IS '备注说明';
COMMENT ON COLUMN leaudit_rule_type_bindings.created_at IS '记录创建时间';
COMMENT ON COLUMN leaudit_rule_type_bindings.updated_at IS '记录更新时间';
COMMENT ON COLUMN leaudit_rule_type_bindings.create_time IS '记录创建时间';
COMMENT ON COLUMN leaudit_rule_type_bindings.update_time IS '记录更新时间';
-- ============================================================================