From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 docker/postgres/migration/install.sh |  168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 168 insertions(+), 0 deletions(-)

diff --git a/docker/postgres/migration/install.sh b/docker/postgres/migration/install.sh
new file mode 100644
index 0000000..f22904b
--- /dev/null
+++ b/docker/postgres/migration/install.sh
@@ -0,0 +1,168 @@
+#!/usr/bin/env bash
+# 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+# JNPF PostgreSQL schema 鍒濆鍖栵紙鍏ㄦ柊绌哄簱涓撶敤锛�
+#   1) 寤哄洓搴� jnpf_init / jnpf_flow / jnpf_xxljob / nacos_config
+#   2) 璺戝畼鏂瑰垵濮嬪寲鑴氭湰锛堢粨鏋勶紝鏃犱笟鍔℃暟鎹級
+#   3) 璺戣嚜寤鸿〃 DDL self_built_tables_pg.sql
+#   4) 璺戞暟鎹帴鍙d慨姝� data_interface_pg_fixes.sql锛堟鍒荤┖琛ㄢ啋骞傜瓑 no-op锛屾暟鎹縼绉诲悗鐢� migrate-data.sh 鍐嶆斁涓�娆★級
+#   5) 寤� Nacos 瀛樺偍搴� schema锛坣acos_config_pg.sql锛�
+#
+# 鍓嶇疆锛歝x-postgres 瀹瑰櫒宸茬敱鏍� compose 鎷夎捣锛堝畨鍏ㄥ熀绾块殢鏍� compose锛屾湰鑴氭湰涓嶅啀閮ㄧ讲瀹瑰櫒锛夛細
+#   docker volume create postgres_pgdata        # 鍏ㄦ柊鏈哄櫒
+#   docker compose up -d cx-postgres          # 鍦ㄤ粨搴撴牴 / 绂荤嚎浜や粯鍖呮牴鐩綍鎵ц
+#
+# 瀹夊叏瀹堝崼锛氱洰鏍囧簱宸插瓨鍦ㄤ笖鍚〃鏃�**鎷掔粷鎵ц**锛堝畼鏂� init 鍚� DROP TABLE IF EXISTS锛�
+# 閲嶆斁浼氭竻绌烘棦鏈夋暟鎹級锛涚‘闇�閲嶇亴璇锋樉寮� FORCE_RESEED=1銆�
+#
+# 鐢ㄦ硶锛�
+#   ./install.sh              # 寤哄簱 + 寤鸿〃锛�= schema锛�
+#   ./install.sh schema       # 鍚屼笂锛堝吋瀹规棫鍙傛暟鍐欐硶锛�
+#
+# 鍙傛暟锛堢幆澧冨彉閲忥紝榛樿=鐜板満鏍囧噯鍊硷級锛�
+#   CONTAINER   PG 瀹瑰櫒鍚�           榛樿 cx-postgres
+#   PGUSER      瓒呯骇鐢ㄦ埛            榛樿 postgres锛坋xec psql 璧板鍣ㄦ湰鍦� trust锛屾棤闇�瀵嗙爜锛�
+#   DB_INIT / DB_FLOW / DB_XXLJOB / DB_NACOS  鍥涘簱鍚嶏紙娴嬭瘯鏃跺彲鏀� *_t8 闅旂锛�
+#   CREATE_EXTENSIONS  鏄惁寤哄父鐢ㄦ墿灞曪紙1/0锛夛紝榛樿 1锛堥潪鑷村懡锛屽け璐ヤ粎鍛婅锛�
+#   FORCE_RESEED       鐩爣搴撻潪绌烘椂浠嶅己鍒堕噸鐏岋紙1/0锛夛紝榛樿 0
+# 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+SQL_DIR="$SCRIPT_DIR/sql"
+
+CONTAINER="${CONTAINER:-cx-postgres}"
+PGUSER="${PGUSER:-postgres}"
+DB_INIT="${DB_INIT:-jnpf_init}"
+DB_FLOW="${DB_FLOW:-jnpf_flow}"
+DB_XXLJOB="${DB_XXLJOB:-jnpf_xxljob}"
+DB_NACOS="${DB_NACOS:-nacos_config}"
+CREATE_EXTENSIONS="${CREATE_EXTENSIONS:-1}"
+FORCE_RESEED="${FORCE_RESEED:-0}"
+STEP="${1:-schema}"
+
+log()  { printf '\033[1;34m[install]\033[0m %s\n' "$*"; }
+warn() { printf '\033[1;33m[install][warn]\033[0m %s\n' "$*"; }
+die()  { printf '\033[1;31m[install][err]\033[0m %s\n' "$*" >&2; exit 1; }
+
+# 鍦ㄥ鍣ㄥ唴璺� psql锛堟湰鍦� unix socket锛宲ostgres 瓒呯骇鐢ㄦ埛 trust锛屾棤闇�瀵嗙爜/绔彛锛�
+psql_exec() { docker exec -i "$CONTAINER" psql -U "$PGUSER" "$@"; }
+
+# 绛� PG 杩涚▼灏辩华锛堥娆� initdb 鏁板崄绉掞級銆傛闃舵瀹瑰櫒鍋ュ悍妫�鏌� unhealthy 灞為鏈熲�斺��
+# 瀹冩帰娴嬬殑涓氬姟搴撴鏄湰鑴氭湰瑕佸垱寤虹殑锛宧ealthy 鍙細鍑虹幇鍦ㄦ湰鑴氭湰鎴愬姛涔嬪悗
+for _i in $(seq 1 60); do
+  if docker exec "$CONTAINER" pg_isready -qU "$PGUSER" 2>/dev/null; then break; fi
+  [ "$_i" = 60 ] && { echo "閿欒锛氱瓑寰� PG 灏辩华瓒呮椂锛坉ocker logs $CONTAINER 鏌ョ湅锛�" >&2; exit 1; }
+  sleep 2
+done
+# 鎶婂涓� SQL 鏂囦欢鍠傜粰瀹瑰櫒鍐� psql锛岄亣閿欏嵆鍋�
+run_sql_file() {
+  local db="$1" file="$2"
+  [ -f "$file" ] || die "缂� SQL 鏂囦欢锛�${file}锛坓it 鎷夌爜璺嚎锛氬厛璺� ./assemble-sql-onsite.sh锛涚绾垮寘璺嚎锛氬寘鍐� sql/ 搴斿凡缁勮锛岃仈绯绘瀯寤烘満锛�"
+  log "鈫� [$db] 鎵ц $(basename "$file") ($(du -h "$file" | cut -f1))"
+  psql_exec -d "$db" -v ON_ERROR_STOP=1 -q -f - < "$file"
+}
+db_exists() { psql_exec -tAc "SELECT 1 FROM pg_database WHERE datname='$1'" | grep -q 1; }
+create_db() {
+  local db="$1"
+  if db_exists "$db"; then
+    warn "搴� $db 宸插瓨鍦紝璺宠繃 CREATE DATABASE锛堝箓绛夛級"
+  else
+    log "鍒涘缓搴� $db"
+    psql_exec -d postgres -v ON_ERROR_STOP=1 -c "CREATE DATABASE \"$db\" ENCODING 'UTF8'"
+  fi
+}
+# 鍙暟 BASE TABLE锛堟帓闄� pg_stat_statements 绛夋墿灞曡鍥撅紝璁℃暟涓嶅彈 CREATE_EXTENSIONS 褰卞搷锛�
+table_count() { psql_exec -tAc "SELECT count(*) FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE'" -d "$1"; }
+# 鍏ㄦ柊 schema 鍩虹嚎锛氬畼鏂� 293 寮犺〃 + 鑷缓 99 寮犺〃锛堝惈 DMS V2.3 鍗佽〃鍙婃枃浠跺璞℃槧灏勮〃锛夈��
+verify_init_table_count() {
+  local init_table_count init_custom_table_count
+  init_table_count="$(table_count "$DB_INIT")"
+  init_custom_table_count=$((init_table_count - 293))
+  if [ "$init_table_count" -ne 392 ] || [ "$init_custom_table_count" -ne 99 ]; then
+    die "琛ㄦ暟鏍稿澶辫触锛�$DB_INIT 鍏� ${init_table_count} 寮� BASE TABLE锛岃嚜寤鸿〃 ${init_custom_table_count} 寮狅紱鏈熸湜鎬绘暟 392 寮犮�佽嚜寤� 99 寮�"
+  fi
+}
+# 闈炵┖瀹堝崼锛歩nit SQL 鍚� DROP TABLE IF EXISTS锛屽宸叉湁鏁版嵁鐨勫簱閲嶆斁=娓呭簱
+guard_empty() {
+  local db="$1" n
+  db_exists "$db" || return 0
+  n="$(table_count "$db")"
+  [ "$n" -eq 0 ] && return 0
+  if [ "$FORCE_RESEED" = "1" ]; then
+    warn "搴� $db 宸叉湁 $n 寮犺〃锛孎ORCE_RESEED=1 鈫� 缁х画閲嶇亴锛堟棦鏈夋暟鎹皢琚� init 鑴氭湰瑕嗙洊/娓呯┖锛�"
+  else
+    die "搴� $db 宸叉湁 $n 寮犺〃鈥斺�旀湰鑴氭湰鍙敤浜庡叏鏂扮┖搴擄紙init 鍚� DROP TABLE锛岄噸鏀句細娓呮暟鎹級銆傜‘闇�閲嶇亴锛欶ORCE_RESEED=1 ./install.sh"
+  fi
+}
+
+# 鈹�鈹� schema锛氬缓搴� + 瀹樻柟 init + 鑷缓琛� + 鏁版嵁鎺ュ彛淇 + Nacos 瀛樺偍搴� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+do_schema() {
+  docker inspect "$CONTAINER" >/dev/null 2>&1 \
+    || die "瀹瑰櫒 $CONTAINER 涓嶅湪鈥斺�斿厛鍦ㄤ粨搴撴牴/浜や粯鍖呮牴鐩綍锛歞ocker volume create postgres_pgdata && docker compose up -d cx-postgres"
+
+  log "===== 闈炵┖瀹堝崼 ====="
+  guard_empty "$DB_INIT"; guard_empty "$DB_FLOW"; guard_empty "$DB_XXLJOB"; guard_empty "$DB_NACOS"
+
+  log "===== 寤哄洓搴� ====="
+  create_db "$DB_INIT"; create_db "$DB_FLOW"; create_db "$DB_XXLJOB"; create_db "$DB_NACOS"
+
+  if [ "$CREATE_EXTENSIONS" = "1" ]; then
+    log "寤哄父鐢ㄦ墿灞曪紙闈炶嚧鍛斤級"
+    for ext in pg_stat_statements pg_trgm pgcrypto pg_bigm vector; do
+      psql_exec -d "$DB_INIT" -c "CREATE EXTENSION IF NOT EXISTS \"$ext\"" >/dev/null 2>&1 \
+        && log "   ext $ext 鉁�" || warn "   ext $ext 璺宠繃锛堥暅鍍忔湭鍚垨鏃犻渶锛�"
+    done
+  fi
+
+  log "===== 瀹樻柟鍒濆鍖栬剼鏈� ====="
+  run_sql_file "$DB_INIT"   "$SQL_DIR/jnpf_dbnull_init.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/Update_PostgreSQL_1127.sql"
+  run_sql_file "$DB_FLOW"   "$SQL_DIR/jnpf_flow_init.sql"
+  run_sql_file "$DB_XXLJOB" "$SQL_DIR/jnpf_xxljob_init.sql"
+
+  log "===== 鑷缓琛� DDL ====="
+  run_sql_file "$DB_INIT"   "$SQL_DIR/self_built_tables_pg.sql"
+
+  log "===== 鑷缓琛ㄥ閲忥紙杩佺Щ蹇収鍚庣殑鍒楃骇瀵归綈锛屽箓绛夛級====="
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_lims_huanjing_20260717.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_lims_sxt_wendingxing_20260717.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_lims_sxt_wendingxing_20260720.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_lims_sxt_flow_biz_status_20260719.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_lims_sxt_quyang_zhongzhi_shenqing_biz_status_20260723.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_lims_sxt_quyang_zhongzhi_shenqing_qingyandan_link_20260723.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_lims_sxt_plan_status_20260720.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_lims_wendingxing_biangeng_20260720.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/create_lims_sxt_quyang_jihua_renwu_20260724.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/alter_lims_sxt_quyang_jihua_renwu_jianyan_xiang_kuaizhao_20260724.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/create_audit_events_ext_20260724.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/create_audit_events_20260724.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_audit_events_title_entry_20260810.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_audit_events_ingest_merge_20260818.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/repair_audit_events_integrity_20260824.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/create_dms_permission_v2_2_20260815.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/upgrade_dms_permission_v2_2_to_v2_3_20260817.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/create_dms_file_objects_20260817.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/upgrade_dms_file_properties_20260820.sql"
+  run_sql_file "$DB_INIT"   "$SQL_DIR/update_audit_events_target_timeline_index_20260823.sql"
+
+  log "===== 鏁版嵁鎺ュ彛淇锛堢┖琛ㄥ箓绛夛紝鏁版嵁杩佺Щ鍚� migrate-data.sh 鍐嶆斁涓�娆★級====="
+  run_sql_file "$DB_INIT"   "$SQL_DIR/data_interface_pg_fixes.sql"
+
+  log "===== Nacos 瀛樺偍搴� schema ====="
+  run_sql_file "$DB_NACOS"  "$SQL_DIR/nacos_config_pg.sql"
+
+  log "===== 琛ㄦ暟鏍稿 ====="
+  verify_init_table_count
+  log "  $DB_INIT   BASE TABLE = $(table_count "$DB_INIT")   (鏈熸湜 392锛氬畼鏂�293 + 鑷缓99锛屽惈 DMS V2.3 鍗佽〃鍜屾枃浠跺璞℃槧灏勮〃)"
+  log "  $DB_FLOW   BASE TABLE = $(table_count "$DB_FLOW")   (鏈熸湜 70)"
+  log "  $DB_XXLJOB BASE TABLE = $(table_count "$DB_XXLJOB") (鏈熸湜 11)"
+  log "  $DB_NACOS  BASE TABLE = $(table_count "$DB_NACOS")  (鏈熸湜 12)"
+  log "schema 灏辩华銆備笅涓�姝ワ細鍋滄満绐楀彛璺� ./migrate-data.sh 杩佹暟鎹紱Nacos 閰嶇疆鍐呭鎸� docs/archive/server-pg-cutover-checklist.md SW-7 瀵煎叆銆�"
+}
+
+case "$STEP" in
+  schema)        do_schema ;;
+  container|all) die "姝ラ '$STEP' 宸插簾寮冿細PG 瀹瑰櫒缁熶竴鐢辨牴 compose 鎷夎捣锛坉ocker compose up -d cx-postgres锛夛紝鏈剼鏈彧鍋� schema" ;;
+  *)             die "鏈煡姝ラ '$STEP'锛堜粎鏀寔 schema锛�" ;;
+esac
+log "install.sh [$STEP] 瀹屾垚 鉁�"

--
Gitblit v1.8.0