刘光辉
10 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
-- 产品母版洗数据(docs/adr-multi-customer-db-isolation.md §6.2)
--
-- 只在母版实例 cx-pg-template 的 jnpf_init 上跑。幂等可重放。
-- 用法:docker exec -i cx-pg-template psql -U postgres -d jnpf_init -v ON_ERROR_STOP=1 < 本文件
--
-- ═══ 为什么是白名单(枚举保留),不是黑名单(枚举清空)═══
-- 两个方向的错误后果不对称:
--   漏清一张业务表 → 客户1 的数据流到新客户,可能很久才被发现;
--   误清一张配置表 → 新客户少一份配置,装完就发现。
-- 所以枚举「保留什么」,其余一律清空。新增业务表不用改本文件(默认被清);
-- 新增【配置类】表才需要加进 keep[]。
--
-- ═══ 保留/清空的产品决策(用户 2026-08-04 拍板)═══
--   · LIMS 基础档案(检验项目/请验类型/单位/质量标准/储存条件)→ 不分发,清空。
--     理由:客户1 的档案带给客户2 大概率是错的,而且错得不明显;新客户按其实际标准录入。
--   · JNPF 自带 demo 数据(ext_* 10 张 / wform_* 6 张)→ 清空。平台示例,非产品资产。
--   · 组织架构与角色授权(base_organize/base_position/base_role/base_authorize)→ 全清。
--     新客户组织结构必然不同;admin 是超管,不依赖 role 也能登录并配权限。
--
-- ⚠️ 本文件必须与 jnpf_flow 侧的清理【成套执行】:
--    workflow_template.f_flowable_id 引用 act_re_deployment.id_,只洗一边
--    等于人为制造 ADR §4 的半切故障。配套脚本见 product-baseline-cleanup-flow.sql。
-- ⚠️ 跑之前确认没有 FK 的 parent 落在 keep[] 上(TRUNCATE ... CASCADE 会连带清空)。
--    2026-08-04 实查:全库仅 4 条 FK,全在 lims_* 内部且为 RESTRICT,不波及 keep[]。
 
BEGIN;
 
DO $$
DECLARE
  keep text[] := ARRAY[
    -- ① 低代码表单 / 流程 / 大屏 / 报表【定义】——产品资产核心
    'base_visual_dev','base_visual_release','base_visual_filter','base_visual_kit',
    'base_visual_link','base_visual_personal',
    'blade_visual','blade_visual_config','blade_visual_component','blade_visual_assets','blade_visual_map',
    'report_template','report_charts','report_version',
    'workflow_template','workflow_version','workflow_node','workflow_candidates','workflow_operator',
    -- ② 菜单 / 字典 / 数据接口 / 打印模板 / 门户 / 系统配置
    'base_module','base_module_button','base_module_data',
    'base_dictionary_type','base_dictionary_data',
    'base_data_interface','base_data_interface_oauth','base_data_set',
    'base_sys_config','base_system','base_system_top','base_common_fields','base_common_words',
    'base_bill_rule','base_code_num','base_print_template','base_print_version',
    'base_portal','base_portal_data','base_portal_manage','base_standing',
    'base_msg_template','base_msg_template_param','base_msg_send_template',
    'base_integrate','base_integrate_node','base_permission_group','base_action','base_sign_img',
    -- ③ 平台自带基础数据(与客户无关的字典性数据)
    'base_province','base_province_atlas','base_language',
    -- ④ 部分保留:整表豁免 TRUNCATE,下面用 DELETE 精确清(只留 admin)
    'base_user','base_user_relation'
  ];
  t text;
BEGIN
  FOR t IN
    SELECT tablename FROM pg_tables
    WHERE schemaname = 'public' AND NOT (tablename = ANY(keep))
  LOOP
    EXECUTE format('TRUNCATE TABLE %I CASCADE', t);
  END LOOP;
END $$;
 
-- ④ 的精确清理:只留 admin 一个账号及其关联
DELETE FROM base_user_relation
 WHERE f_user_id NOT IN (SELECT f_id FROM base_user WHERE f_account = 'admin');
DELETE FROM base_user WHERE f_account <> 'admin';
 
COMMIT;