Files
lingxi/prisma/migrations/20261104024511_a4_dict_system_configs/migration.sql
T
Stev_Wang cc6e84cdbc feat(shared): A4 数据字典与系统配置契约
背景:A4 需要字典三层合并、配置版本与命名规则的共享契约。\n改动:新增 dict/config 契约、system-configs 定义与校验、命名模板解析;新增 dict_types/dict_items/system_config_versions 迁移与 13 类/96 条字典、26 项配置种子。\n影响面:shared 新增导出;prisma 新增表与迁移;客户基础字段 DTO 硬上界调整为 50(实际生效上限仍由配置动态校验)。\n回滚:回滚本提交并保留新增表(不删数据)。\n验证:shared typecheck/test 147;seed 幂等;prisma migrate dev 已应用。
2026-11-04 11:48:38 +08:00

91 lines
3.5 KiB
SQL

-- CreateEnum
CREATE TYPE "DictStatus" AS ENUM ('ACTIVE', 'DISABLED');
-- CreateEnum
CREATE TYPE "DictKind" AS ENUM ('TREE', 'LIST');
-- CreateTable
CREATE TABLE "system_config_versions" (
"id" CHAR(26) NOT NULL,
"config_key" VARCHAR(128) NOT NULL,
"version" INTEGER NOT NULL,
"old_value" JSONB,
"new_value" JSONB NOT NULL,
"reason" VARCHAR(255),
"changed_by" CHAR(26),
"changed_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "system_config_versions_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "dict_types" (
"id" CHAR(26) NOT NULL,
"code" VARCHAR(64) NOT NULL,
"name" VARCHAR(64) NOT NULL,
"group_key" VARCHAR(32) NOT NULL,
"kind" "DictKind" NOT NULL DEFAULT 'LIST',
"description" VARCHAR(255) NOT NULL DEFAULT '',
"industry_scoped" BOOLEAN NOT NULL DEFAULT false,
"builtin" BOOLEAN NOT NULL DEFAULT false,
"status" "DictStatus" NOT NULL DEFAULT 'ACTIVE',
"sort_order" INTEGER NOT NULL DEFAULT 0,
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMPTZ(3) NOT NULL,
"updated_by" VARCHAR(64),
CONSTRAINT "dict_types_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "dict_items" (
"id" CHAR(26) NOT NULL,
"type_id" CHAR(26) NOT NULL,
"code" VARCHAR(64) NOT NULL,
"name" VARCHAR(64) NOT NULL,
"parent_code" VARCHAR(64),
"industry_id" CHAR(26),
"sort_order" INTEGER NOT NULL DEFAULT 0,
"status" "DictStatus" NOT NULL DEFAULT 'ACTIVE',
"remark" VARCHAR(255) NOT NULL DEFAULT '',
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMPTZ(3) NOT NULL,
"updated_by" VARCHAR(64),
CONSTRAINT "dict_items_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "system_config_versions_changed_at_idx" ON "system_config_versions"("changed_at");
-- CreateIndex
CREATE UNIQUE INDEX "system_config_versions_config_key_version_key" ON "system_config_versions"("config_key", "version");
-- CreateIndex
CREATE UNIQUE INDEX "dict_types_code_key" ON "dict_types"("code");
-- CreateIndex
CREATE INDEX "dict_types_group_key_sort_order_idx" ON "dict_types"("group_key", "sort_order");
-- CreateIndex
CREATE INDEX "dict_items_type_id_industry_id_sort_order_idx" ON "dict_items"("type_id", "industry_id", "sort_order");
-- CreateIndex
CREATE INDEX "dict_items_type_id_parent_code_idx" ON "dict_items"("type_id", "parent_code");
-- AddForeignKey
ALTER TABLE "system_config_versions" ADD CONSTRAINT "system_config_versions_config_key_fkey" FOREIGN KEY ("config_key") REFERENCES "system_configs"("config_key") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "dict_items" ADD CONSTRAINT "dict_items_type_id_fkey" FOREIGN KEY ("type_id") REFERENCES "dict_types"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "dict_items" ADD CONSTRAINT "dict_items_industry_id_fkey" FOREIGN KEY ("industry_id") REFERENCES "industries"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- A4 / R-10:同 type + code + 行业层唯一;industry_id 为 NULL 的通用层也必须唯一
CREATE UNIQUE INDEX "dict_items_type_code_generic_key" ON "dict_items"("type_id", "code") WHERE "industry_id" IS NULL;
CREATE UNIQUE INDEX "dict_items_type_code_industry_key" ON "dict_items"("type_id", "code", "industry_id") WHERE "industry_id" IS NOT NULL;
-- 一条条目不能把自己作为父级
ALTER TABLE "dict_items" ADD CONSTRAINT "dict_items_no_self_parent_check" CHECK ("parent_code" IS NULL OR "parent_code" <> "code");