WARCH1 实现企微审批最小历史留存

这个提交包含在:
2026-05-20 00:22:27 +08:00
父节点 56a8e2bb0c
当前提交 5cd960cf90
共修改 28 个文件,包含 3081 行新增和 261 行删除
@@ -0,0 +1,257 @@
CREATE TABLE "wecom_approval_archives" (
"id" UUID NOT NULL,
"corp_id_hash" VARCHAR(64) NOT NULL,
"sp_no" VARCHAR(160) NOT NULL,
"template_id" VARCHAR(160),
"template_type" VARCHAR(40) NOT NULL DEFAULT 'unknown',
"sp_name" VARCHAR(160),
"normalized_status" VARCHAR(32) NOT NULL DEFAULT 'unknown',
"wecom_status" VARCHAR(40),
"applicant_employee_id" UUID,
"applicant_external_user_id" VARCHAR(128),
"submitted_at" TIMESTAMP(3),
"applied_at" TIMESTAMP(3),
"completed_at" TIMESTAMP(3),
"status_observed_at" TIMESTAMP(3),
"last_callback_at" TIMESTAMP(3),
"last_compensation_at" TIMESTAMP(3),
"last_source" VARCHAR(40),
"last_detail_digest" VARCHAR(64),
"readability_status" VARCHAR(40),
"single_tap_approve_risk" BOOLEAN NOT NULL DEFAULT false,
"template_adjustment_required" BOOLEAN NOT NULL DEFAULT false,
"external_config_status" VARCHAR(40),
"source_summary" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_approval_archives_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "wecom_approval_participants" (
"id" UUID NOT NULL,
"archive_id" UUID NOT NULL,
"role" VARCHAR(32) NOT NULL,
"node_index" INTEGER NOT NULL DEFAULT 0,
"external_user_id" VARCHAR(128) NOT NULL,
"employee_id" UUID,
"is_current" BOOLEAN NOT NULL DEFAULT false,
"mapping_status" VARCHAR(32) NOT NULL DEFAULT 'unknown',
"display_summary" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_approval_participants_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "wecom_approval_actions" (
"id" UUID NOT NULL,
"archive_id" UUID NOT NULL,
"action_type" VARCHAR(40) NOT NULL,
"operator_external_user_id" VARCHAR(128),
"operator_employee_id" UUID,
"action_time" TIMESTAMP(3),
"node_index" INTEGER NOT NULL DEFAULT 0,
"comment_summary" TEXT,
"source" VARCHAR(40) NOT NULL,
"idempotency_key" VARCHAR(96) NOT NULL,
"evidence_digest" VARCHAR(64),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_approval_actions_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "wecom_approval_field_summaries" (
"id" UUID NOT NULL,
"archive_id" UUID NOT NULL,
"field_key" VARCHAR(120) NOT NULL,
"field_index" INTEGER NOT NULL DEFAULT 0,
"field_name" VARCHAR(160),
"field_type" VARCHAR(80),
"normalized_value" TEXT,
"value_preview" TEXT,
"sensitive_level" VARCHAR(32) NOT NULL DEFAULT 'normal',
"display_allowed" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_approval_field_summaries_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "wecom_approval_attachment_summaries" (
"id" UUID NOT NULL,
"archive_id" UUID NOT NULL,
"attachment_index" INTEGER NOT NULL DEFAULT 0,
"attachment_type" VARCHAR(80),
"external_ref_summary" TEXT,
"downloaded" BOOLEAN NOT NULL DEFAULT false,
"sensitive_level" VARCHAR(32) NOT NULL DEFAULT 'restricted',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_approval_attachment_summaries_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "wecom_approval_callback_events" (
"id" UUID NOT NULL,
"archive_id" UUID,
"corp_id_hash" VARCHAR(64) NOT NULL,
"sp_no" VARCHAR(160) NOT NULL,
"template_id" VARCHAR(160),
"event_type" VARCHAR(80) NOT NULL,
"callback_kind" VARCHAR(80) NOT NULL,
"approval_type" VARCHAR(40) NOT NULL DEFAULT 'unknown',
"normalized_status" VARCHAR(32) NOT NULL DEFAULT 'unknown',
"wecom_status" VARCHAR(40),
"received_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"event_time" TIMESTAMP(3),
"apply_time" TIMESTAMP(3),
"processing_status" VARCHAR(40) NOT NULL DEFAULT 'accepted',
"processing_error_code" VARCHAR(80),
"processing_error_message" TEXT,
"retry_count" INTEGER NOT NULL DEFAULT 0,
"idempotency_key" VARCHAR(96) NOT NULL,
"event_digest" VARCHAR(64) NOT NULL,
"source_summary" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_approval_callback_events_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "wecom_approval_compensation_runs" (
"id" UUID NOT NULL,
"run_key" VARCHAR(64),
"mode" VARCHAR(32) NOT NULL DEFAULT 'live_read',
"status" VARCHAR(32) NOT NULL DEFAULT 'running',
"start_time" TIMESTAMP(3) NOT NULL,
"end_time" TIMESTAMP(3) NOT NULL,
"template_filter" JSONB,
"cursor_summary" TEXT,
"page_size" INTEGER NOT NULL DEFAULT 100,
"page_count" INTEGER NOT NULL DEFAULT 0,
"item_count" INTEGER NOT NULL DEFAULT 0,
"detail_count" INTEGER NOT NULL DEFAULT 0,
"finding_count" INTEGER NOT NULL DEFAULT 0,
"error_code" VARCHAR(80),
"error_message" TEXT,
"started_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"finished_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_approval_compensation_runs_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "wecom_approval_compensation_items" (
"id" UUID NOT NULL,
"run_id" UUID NOT NULL,
"archive_id" UUID,
"sp_no" VARCHAR(160) NOT NULL,
"template_id" VARCHAR(160),
"template_type" VARCHAR(40) NOT NULL DEFAULT 'unknown',
"normalized_status" VARCHAR(32) NOT NULL DEFAULT 'unknown',
"detail_status" VARCHAR(40) NOT NULL DEFAULT 'pending',
"detail_digest" VARCHAR(64),
"error_code" VARCHAR(80),
"error_message" TEXT,
"source_summary" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_approval_compensation_items_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "wecom_approval_reconcile_findings" (
"id" UUID NOT NULL,
"archive_id" UUID,
"run_id" UUID,
"finding_type" VARCHAR(80) NOT NULL,
"status" VARCHAR(32) NOT NULL DEFAULT 'open',
"severity" VARCHAR(32) NOT NULL DEFAULT 'info',
"evidence_digest" VARCHAR(64) NOT NULL,
"source" VARCHAR(40) NOT NULL,
"description" TEXT,
"detected_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"resolved_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_approval_reconcile_findings_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "wecom_approval_archives_corp_sp_no_ux" ON "wecom_approval_archives"("corp_id_hash", "sp_no");
CREATE INDEX "idx_wecom_approval_arch_applicant_status_at" ON "wecom_approval_archives"("applicant_employee_id", "status_observed_at");
CREATE INDEX "idx_wecom_approval_arch_type_status" ON "wecom_approval_archives"("template_type", "normalized_status");
CREATE INDEX "idx_wecom_approval_arch_last_source" ON "wecom_approval_archives"("last_source");
CREATE UNIQUE INDEX "wecom_approval_participants_node_user_ux" ON "wecom_approval_participants"("archive_id", "role", "node_index", "external_user_id");
CREATE INDEX "idx_wecom_approval_part_employee_role" ON "wecom_approval_participants"("employee_id", "role");
CREATE INDEX "idx_wecom_approval_part_external_user" ON "wecom_approval_participants"("external_user_id");
CREATE UNIQUE INDEX "wecom_approval_actions_archive_key_ux" ON "wecom_approval_actions"("archive_id", "idempotency_key");
CREATE INDEX "idx_wecom_approval_actions_operator_time" ON "wecom_approval_actions"("operator_employee_id", "action_time");
CREATE INDEX "idx_wecom_approval_actions_type_time" ON "wecom_approval_actions"("action_type", "action_time");
CREATE UNIQUE INDEX "wecom_approval_fields_archive_key_ux" ON "wecom_approval_field_summaries"("archive_id", "field_key", "field_index");
CREATE INDEX "idx_wecom_approval_fields_key" ON "wecom_approval_field_summaries"("field_key");
CREATE INDEX "idx_wecom_approval_attach_archive_idx" ON "wecom_approval_attachment_summaries"("archive_id", "attachment_index");
CREATE UNIQUE INDEX "wecom_approval_callback_events_idempotency_key_key" ON "wecom_approval_callback_events"("idempotency_key");
CREATE INDEX "idx_wecom_approval_callbacks_sp_no" ON "wecom_approval_callback_events"("sp_no");
CREATE INDEX "idx_wecom_approval_callbacks_archive_at" ON "wecom_approval_callback_events"("archive_id", "received_at");
CREATE INDEX "idx_wecom_approval_callbacks_status_at" ON "wecom_approval_callback_events"("processing_status", "received_at");
CREATE INDEX "idx_wecom_approval_comp_runs_key" ON "wecom_approval_compensation_runs"("run_key");
CREATE INDEX "idx_wecom_approval_comp_runs_status" ON "wecom_approval_compensation_runs"("status", "started_at");
CREATE INDEX "idx_wecom_approval_comp_runs_window" ON "wecom_approval_compensation_runs"("start_time", "end_time");
CREATE UNIQUE INDEX "wecom_approval_comp_items_run_sp_no_ux" ON "wecom_approval_compensation_items"("run_id", "sp_no");
CREATE INDEX "idx_wecom_approval_comp_items_archive" ON "wecom_approval_compensation_items"("archive_id");
CREATE INDEX "idx_wecom_approval_comp_items_status" ON "wecom_approval_compensation_items"("detail_status");
CREATE UNIQUE INDEX "wecom_approval_findings_archive_digest_ux" ON "wecom_approval_reconcile_findings"("archive_id", "finding_type", "evidence_digest");
CREATE UNIQUE INDEX "wecom_approval_findings_run_digest_ux" ON "wecom_approval_reconcile_findings"("run_id", "finding_type", "evidence_digest");
CREATE INDEX "idx_wecom_approval_findings_status_at" ON "wecom_approval_reconcile_findings"("status", "detected_at");
CREATE INDEX "idx_wecom_approval_findings_run" ON "wecom_approval_reconcile_findings"("run_id");
ALTER TABLE "wecom_approval_archives"
ADD CONSTRAINT "wecom_approval_archives_applicant_employee_id_fkey"
FOREIGN KEY ("applicant_employee_id") REFERENCES "employees"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_participants"
ADD CONSTRAINT "wecom_approval_participants_archive_id_fkey"
FOREIGN KEY ("archive_id") REFERENCES "wecom_approval_archives"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_participants"
ADD CONSTRAINT "wecom_approval_participants_employee_id_fkey"
FOREIGN KEY ("employee_id") REFERENCES "employees"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_actions"
ADD CONSTRAINT "wecom_approval_actions_archive_id_fkey"
FOREIGN KEY ("archive_id") REFERENCES "wecom_approval_archives"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_actions"
ADD CONSTRAINT "wecom_approval_actions_operator_employee_id_fkey"
FOREIGN KEY ("operator_employee_id") REFERENCES "employees"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_field_summaries"
ADD CONSTRAINT "wecom_approval_field_summaries_archive_id_fkey"
FOREIGN KEY ("archive_id") REFERENCES "wecom_approval_archives"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_attachment_summaries"
ADD CONSTRAINT "wecom_approval_attachment_summaries_archive_id_fkey"
FOREIGN KEY ("archive_id") REFERENCES "wecom_approval_archives"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_callback_events"
ADD CONSTRAINT "wecom_approval_callback_events_archive_id_fkey"
FOREIGN KEY ("archive_id") REFERENCES "wecom_approval_archives"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_compensation_items"
ADD CONSTRAINT "wecom_approval_compensation_items_run_id_fkey"
FOREIGN KEY ("run_id") REFERENCES "wecom_approval_compensation_runs"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_compensation_items"
ADD CONSTRAINT "wecom_approval_compensation_items_archive_id_fkey"
FOREIGN KEY ("archive_id") REFERENCES "wecom_approval_archives"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_reconcile_findings"
ADD CONSTRAINT "wecom_approval_reconcile_findings_archive_id_fkey"
FOREIGN KEY ("archive_id") REFERENCES "wecom_approval_archives"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "wecom_approval_reconcile_findings"
ADD CONSTRAINT "wecom_approval_reconcile_findings_run_id_fkey"
FOREIGN KEY ("run_id") REFERENCES "wecom_approval_compensation_runs"("id") ON DELETE SET NULL ON UPDATE CASCADE;