#!/usr/bin/env bash set -euo pipefail SILVER_TENANT_ID="" MEITU_TENANT_ID="" DRY_RUN=false CONFIRMED=false usage() { echo "Usage: $0 --silver-tenant-id ID --meitu-tenant-id ID [--dry-run | --confirm]" >&2 } while [[ $# -gt 0 ]]; do case "$1" in --silver-tenant-id) SILVER_TENANT_ID="${2:-}"; shift 2 ;; --meitu-tenant-id) MEITU_TENANT_ID="${2:-}"; shift 2 ;; --dry-run) DRY_RUN=true; shift ;; --confirm) CONFIRMED=true; shift ;; -h|--help) usage; exit 0 ;; *) usage; exit 2 ;; esac done valid_tenant_id() { [[ "$1" =~ ^[A-Za-z0-9_-]{1,20}$ ]] } if ! valid_tenant_id "$SILVER_TENANT_ID" || ! valid_tenant_id "$MEITU_TENANT_ID"; then usage exit 2 fi if [[ "$SILVER_TENANT_ID" == "$MEITU_TENANT_ID" ]]; then echo "银城和美途必须使用不同租户 ID" >&2 exit 2 fi print_plan() { echo "[SPACE] tenant=$SILVER_TENANT_ID code=yc_public_policy name=公共制度 type=PUBLIC sensitivity=INTERNAL status=ACTIVE" echo "[SPACE] tenant=$SILVER_TENANT_ID code=yc_property_sop name=物业业务SOP type=BUSINESS sensitivity=INTERNAL status=ACTIVE" echo "[SPACE] tenant=$SILVER_TENANT_ID code=yc_management_ops name=管理运营 type=MANAGEMENT sensitivity=CONFIDENTIAL status=ACTIVE" echo "[SPACE] tenant=$MEITU_TENANT_ID code=mt_customer_service name=美途客户咨询 type=EXTERNAL sensitivity=PUBLIC status=ACTIVE" echo "[APP] tenant=$SILVER_TENANT_ID code=yc_admin auth=SESSION client=pc status=ACTIVE" echo "[APP] tenant=$SILVER_TENANT_ID code=yc_mobile auth=SESSION client=app status=ACTIVE" echo "[APP] tenant=$MEITU_TENANT_ID code=mt_card_miniapp auth=API_TOKEN status=DISABLED" echo "[BINDING] yc_admin -> yc_public_policy,yc_property_sop,yc_management_ops" echo "[BINDING] yc_mobile -> yc_public_policy,yc_property_sop,yc_management_ops" echo "[BINDING] mt_card_miniapp -> mt_customer_service" echo "[GRANT] employee READ yc_public_policy,yc_property_sop" echo "[GRANT] supervisor READ yc_public_policy,yc_property_sop,yc_management_ops" echo "[GRANT] superadmin,hr_operator MANAGE 银城三个空间" } if [[ "$DRY_RUN" == true ]]; then print_plan exit 0 fi if [[ "$CONFIRMED" != true ]]; then echo "实际写入前必须查询 sys_tenant 确认公司名称,并显式传 --confirm" >&2 exit 2 fi MYSQL_DATABASE="${AIHR_DB_NAME:-ry-vue}" MYSQL_CONTAINER="${AIHR_MYSQL_CONTAINER:-wygj-mysql}" MYSQL_USER="${AIHR_DB_USER:-root}" MYSQL_PASSWORD="${AIHR_DB_PASSWORD:-root}" mysql_exec() { if [[ -n "${AIHR_DB_HOST:-}" ]]; then MYSQL_PWD="$MYSQL_PASSWORD" mysql -h "$AIHR_DB_HOST" -P "${AIHR_DB_PORT:-3306}" -u "$MYSQL_USER" \ --default-character-set=utf8mb4 "$MYSQL_DATABASE" "$@" else docker exec -i -e MYSQL_PWD="$MYSQL_PASSWORD" "$MYSQL_CONTAINER" mysql -u "$MYSQL_USER" \ --default-character-set=utf8mb4 "$MYSQL_DATABASE" "$@" fi } tenant_row() { mysql_exec -Nse "select concat(tenant_id, ':', company_name) from sys_tenant where tenant_id = '$1' and del_flag = '0' limit 1" } SILVER_ROW="$(tenant_row "$SILVER_TENANT_ID")" MEITU_ROW="$(tenant_row "$MEITU_TENANT_ID")" if [[ -z "$SILVER_ROW" || -z "$MEITU_ROW" ]]; then echo "sys_tenant 中未找到两个有效租户,请先确认租户 ID" >&2 exit 3 fi echo "已确认租户:$SILVER_ROW" echo "已确认租户:$MEITU_ROW" for app_code in yc_admin yc_mobile mt_card_miniapp; do other_tenant="$(mysql_exec -Nse "select tenant_id from aihr_knowledge_app where app_code = '$app_code' and tenant_id not in ('$SILVER_TENANT_ID', '$MEITU_TENANT_ID') limit 1")" if [[ -n "$other_tenant" ]]; then echo "应用编码 $app_code 已被其他租户占用,停止初始化" >&2 exit 4 fi done mysql_exec <