185 lines
7.4 KiB
PL/PgSQL
185 lines
7.4 KiB
PL/PgSQL
BEGIN;
|
|
|
|
-- ============================================================================
|
|
-- LeAudit Platform Contract Template Schema
|
|
-- 目标:
|
|
-- 1. 在主库 leaudit_platform 创建 / 升级合同模板分类表
|
|
-- 2. 在主库 leaudit_platform 创建 / 升级合同模板主表
|
|
-- 3. 补齐地区字段、审计字段、软删除字段、索引与 updated_at 触发器
|
|
-- 说明:
|
|
-- - 本脚本不依赖旧库 docauditai
|
|
-- - 幂等脚本,可重复执行
|
|
-- ============================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS public.contract_categories (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
icon VARCHAR(100) NULL,
|
|
description TEXT NULL,
|
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
created_by BIGINT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_by BIGINT NULL,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
deleted_at TIMESTAMPTZ NULL
|
|
);
|
|
|
|
ALTER TABLE public.contract_categories
|
|
ADD COLUMN IF NOT EXISTS icon VARCHAR(100),
|
|
ADD COLUMN IF NOT EXISTS description TEXT,
|
|
ADD COLUMN IF NOT EXISTS sort_order INTEGER NOT NULL DEFAULT 0,
|
|
ADD COLUMN IF NOT EXISTS created_by BIGINT,
|
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
ADD COLUMN IF NOT EXISTS updated_by BIGINT,
|
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ;
|
|
|
|
CREATE TABLE IF NOT EXISTS public.contract_templates (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
template_code VARCHAR(50) NOT NULL,
|
|
title VARCHAR(200) NOT NULL,
|
|
category_id INTEGER NOT NULL REFERENCES public.contract_categories(id) ON DELETE RESTRICT,
|
|
region VARCHAR(50) NOT NULL DEFAULT '省级',
|
|
description TEXT NULL,
|
|
file_path VARCHAR(500) NULL,
|
|
pdf_file_path VARCHAR(500) NULL,
|
|
file_format VARCHAR(10) NOT NULL,
|
|
original_file_name VARCHAR(500) NOT NULL DEFAULT '',
|
|
mime_type VARCHAR(200) NULL,
|
|
file_size BIGINT NOT NULL DEFAULT 0,
|
|
pdf_file_size BIGINT NULL,
|
|
is_featured BOOLEAN NOT NULL DEFAULT FALSE,
|
|
created_by BIGINT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_by BIGINT NULL,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
deleted_at TIMESTAMPTZ NULL
|
|
);
|
|
|
|
ALTER TABLE public.contract_templates
|
|
ADD COLUMN IF NOT EXISTS region VARCHAR(50) NOT NULL DEFAULT '省级',
|
|
ADD COLUMN IF NOT EXISTS description TEXT,
|
|
ADD COLUMN IF NOT EXISTS file_path VARCHAR(500),
|
|
ADD COLUMN IF NOT EXISTS pdf_file_path VARCHAR(500),
|
|
ADD COLUMN IF NOT EXISTS file_format VARCHAR(10),
|
|
ADD COLUMN IF NOT EXISTS original_file_name VARCHAR(500) NOT NULL DEFAULT '',
|
|
ADD COLUMN IF NOT EXISTS mime_type VARCHAR(200),
|
|
ADD COLUMN IF NOT EXISTS file_size BIGINT NOT NULL DEFAULT 0,
|
|
ADD COLUMN IF NOT EXISTS pdf_file_size BIGINT,
|
|
ADD COLUMN IF NOT EXISTS is_featured BOOLEAN NOT NULL DEFAULT FALSE,
|
|
ADD COLUMN IF NOT EXISTS created_by BIGINT,
|
|
ADD COLUMN IF NOT EXISTS created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
ADD COLUMN IF NOT EXISTS updated_by BIGINT,
|
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ;
|
|
|
|
UPDATE public.contract_templates
|
|
SET region = '省级'
|
|
WHERE region IS NULL OR BTRIM(region) = '';
|
|
|
|
UPDATE public.contract_templates
|
|
SET original_file_name = COALESCE(NULLIF(original_file_name, ''), title || CASE
|
|
WHEN file_format IS NOT NULL AND BTRIM(file_format) <> '' THEN '.' || LOWER(file_format)
|
|
ELSE ''
|
|
END)
|
|
WHERE original_file_name IS NULL OR BTRIM(original_file_name) = '';
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (
|
|
SELECT 1
|
|
FROM pg_indexes
|
|
WHERE schemaname = 'public'
|
|
AND indexname = 'idx_contract_categories_name'
|
|
) THEN
|
|
EXECUTE 'DROP INDEX IF EXISTS public.idx_contract_categories_name';
|
|
END IF;
|
|
|
|
IF EXISTS (
|
|
SELECT 1
|
|
FROM pg_indexes
|
|
WHERE schemaname = 'public'
|
|
AND indexname = 'idx_contract_templates_code'
|
|
) THEN
|
|
EXECUTE 'DROP INDEX IF EXISTS public.idx_contract_templates_code';
|
|
END IF;
|
|
END $$;
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS uq_contract_categories_name_active
|
|
ON public.contract_categories(name)
|
|
WHERE deleted_at IS NULL;
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_contract_categories_sort_active
|
|
ON public.contract_categories(sort_order)
|
|
WHERE deleted_at IS NULL;
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS uq_contract_templates_region_code_active
|
|
ON public.contract_templates(region, template_code)
|
|
WHERE deleted_at IS NULL;
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_contract_templates_region_active
|
|
ON public.contract_templates(region)
|
|
WHERE deleted_at IS NULL;
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_contract_templates_category_active
|
|
ON public.contract_templates(category_id)
|
|
WHERE deleted_at IS NULL;
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_contract_templates_updated_active
|
|
ON public.contract_templates(updated_at DESC)
|
|
WHERE deleted_at IS NULL;
|
|
|
|
CREATE OR REPLACE FUNCTION update_contract_templates_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DO $$
|
|
DECLARE
|
|
t TEXT;
|
|
BEGIN
|
|
FOREACH t IN ARRAY ARRAY['contract_categories', 'contract_templates']
|
|
LOOP
|
|
EXECUTE format('DROP TRIGGER IF EXISTS trg_%s_updated_at ON %I', t, t);
|
|
EXECUTE format(
|
|
'CREATE TRIGGER trg_%s_updated_at
|
|
BEFORE UPDATE ON %I
|
|
FOR EACH ROW EXECUTE FUNCTION update_contract_templates_updated_at()',
|
|
t, t
|
|
);
|
|
END LOOP;
|
|
END;
|
|
$$;
|
|
|
|
COMMENT ON TABLE public.contract_categories IS '合同模板分类表';
|
|
COMMENT ON COLUMN public.contract_categories.name IS '分类名称';
|
|
COMMENT ON COLUMN public.contract_categories.icon IS '分类图标';
|
|
COMMENT ON COLUMN public.contract_categories.description IS '分类描述';
|
|
COMMENT ON COLUMN public.contract_categories.sort_order IS '排序值';
|
|
COMMENT ON COLUMN public.contract_categories.created_by IS '创建人';
|
|
COMMENT ON COLUMN public.contract_categories.updated_by IS '更新人';
|
|
COMMENT ON COLUMN public.contract_categories.deleted_at IS '软删除时间';
|
|
|
|
COMMENT ON TABLE public.contract_templates IS '合同模板主表';
|
|
COMMENT ON COLUMN public.contract_templates.template_code IS '模板编码';
|
|
COMMENT ON COLUMN public.contract_templates.title IS '模板标题';
|
|
COMMENT ON COLUMN public.contract_templates.category_id IS '所属分类ID';
|
|
COMMENT ON COLUMN public.contract_templates.region IS '所属地区,省级模板使用“省级”';
|
|
COMMENT ON COLUMN public.contract_templates.description IS '模板描述';
|
|
COMMENT ON COLUMN public.contract_templates.file_path IS '源模板文件路径';
|
|
COMMENT ON COLUMN public.contract_templates.pdf_file_path IS 'PDF预览文件路径';
|
|
COMMENT ON COLUMN public.contract_templates.file_format IS '文件格式';
|
|
COMMENT ON COLUMN public.contract_templates.original_file_name IS '原始上传文件名';
|
|
COMMENT ON COLUMN public.contract_templates.mime_type IS '文件 MIME 类型';
|
|
COMMENT ON COLUMN public.contract_templates.file_size IS '主文件大小(字节)';
|
|
COMMENT ON COLUMN public.contract_templates.pdf_file_size IS '预览 PDF 文件大小(字节)';
|
|
COMMENT ON COLUMN public.contract_templates.is_featured IS '是否推荐模板';
|
|
COMMENT ON COLUMN public.contract_templates.created_by IS '创建人';
|
|
COMMENT ON COLUMN public.contract_templates.updated_by IS '更新人';
|
|
COMMENT ON COLUMN public.contract_templates.deleted_at IS '软删除时间';
|
|
|
|
COMMIT;
|