From 3fe5ae0807abab7e7181ae069c3f7fd3f2c97c46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Wed, 20 May 2026 12:02:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(migrate-tenant):=20=E8=A1=A5=E5=85=A8=20app?= =?UTF-8?q?=5Flicenses=20=E8=BF=81=E7=A7=BB=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E8=BF=81=E7=A7=BB=E5=90=8E=20license=20404?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit migrate-tenant.sh 迁移 t_app 时未同步写入 license-service 的 app_licenses 表,导致前端 /api/license/admin/apps/:appKey 返回 404。 新增 Step 4c:为所有迁移的 app 以 INSERT ... ON DUPLICATE KEY UPDATE 方式创建 app_licenses 记录(max_devices=1000,永不过期),操作幂等, 不影响已存在的 license 配置。 Co-Authored-By: Claude Sonnet 4.6 --- scripts/migrate-tenant.sh | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/scripts/migrate-tenant.sh b/scripts/migrate-tenant.sh index 850e9c7..924096a 100755 --- a/scripts/migrate-tenant.sh +++ b/scripts/migrate-tenant.sh @@ -352,6 +352,39 @@ if [ -f "$_XUQM_ENV_FILE" ] && ! grep -q "^SYSTEM_APP_KEY=" "$_XUQM_ENV_FILE"; t fi audit "migrate-tenant" "SYSTEM_APP_CREATED" "app_key=$_SYS_APP_KEY tenant=$TENANT_ID" +# --------------------------------------------------------------------------- +# Step 4c — 为迁移的 app 在 app_licenses 表补录 license 记录 +# --------------------------------------------------------------------------- +printf '\n[3c/5] 同步 app_licenses 记录(license-service 授权表)...\n' + +if [ -n "$APP_KEYS_RAW" ]; then + _LICENSE_SQL="$(mktemp /tmp/xuqm-license-XXXXXX.sql)" + { + printf 'SET FOREIGN_KEY_CHECKS=0;\n' + # 为每个迁移的 app 创建 license 记录(若已存在则跳过,保证幂等) + printf "INSERT INTO app_licenses (app_key, name, max_devices, registered_devices, expires_at, is_active, remark, created_at, updated_at)\n" + printf "SELECT a.app_key, a.name, 1000, 0, NULL, 1,\n" + printf " CONCAT('迁移自 %s — ', NOW()), NOW(), NOW()\n" "$TENANT_NICKNAME" + printf "FROM t_app a\n" + printf "WHERE a.app_key IN (%s)\n" "$APP_KEYS_SQL" + printf "ON DUPLICATE KEY UPDATE updated_at = updated_at;\n" + printf 'SET FOREIGN_KEY_CHECKS=1;\n' + } > "$_LICENSE_SQL" + + if dst_mysql < "$_LICENSE_SQL" 2>/dev/null; then + printf ' app_licenses 记录已创建(共 %s 个应用,max_devices=1000,永不过期)\n' "$APP_COUNT" + else + warn "app_licenses 写入遇到警告,请手动检查" + fi + rm -f "$_LICENSE_SQL" + + # 验证写入结果 + _LICENSE_COUNT="$(dst_mysql -N -e "SELECT COUNT(*) FROM app_licenses WHERE app_key IN (${APP_KEYS_SQL})" 2>/dev/null || echo 0)" + printf ' DB check: %s/%s 个 app_licenses 记录就绪\n' "${_LICENSE_COUNT:-0}" "$APP_COUNT" +fi + +audit "migrate-tenant" "LICENSE_SYNCED" "tenant=$TENANT_ID apps=$APP_COUNT" + # --------------------------------------------------------------------------- # Step 5 — Restart tenant-service to flush any cached state # ---------------------------------------------------------------------------