safeLoad(); $dsn = sprintf( 'mysql:host=%s;port=%s;dbname=%s;charset=%s', $_ENV['DB_HOST'] ?? '127.0.0.1', $_ENV['DB_PORT'] ?? '3306', $_ENV['DB_DATABASE'] ?? '', $_ENV['DB_CHARSET'] ?? 'utf8mb4' ); $pdo = new PDO( $dsn, $_ENV['DB_USERNAME'] ?? '', $_ENV['DB_PASSWORD'] ?? '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); function column_exists(PDO $pdo, string $table, string $column): bool { $stmt = $pdo->prepare("SHOW COLUMNS FROM {$table} LIKE ?"); $stmt->execute([$column]); return (bool)$stmt->fetch(); } function add_column_if_missing(PDO $pdo, string $table, string $column, string $definition): void { if (column_exists($pdo, $table, $column)) { return; } $pdo->exec("ALTER TABLE {$table} ADD COLUMN {$column} {$definition}"); echo "ADD_COLUMN {$table}.{$column}\n"; } $pdo->exec(<<<'SQL' CREATE TABLE IF NOT EXISTS appraisal_service_price_packages ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, service_provider VARCHAR(32) NOT NULL DEFAULT 'anxinyan', package_name VARCHAR(128) NOT NULL DEFAULT '', package_code VARCHAR(64) NOT NULL DEFAULT '', price DECIMAL(10,2) NOT NULL DEFAULT 0.00, description VARCHAR(500) NOT NULL DEFAULT '', is_enabled TINYINT(1) NOT NULL DEFAULT 1, is_default TINYINT(1) NOT NULL DEFAULT 0, sort_order INT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_appraisal_service_price_packages_code (service_provider, package_code), KEY idx_appraisal_service_price_packages_provider (service_provider), KEY idx_appraisal_service_price_packages_enabled (is_enabled) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='鉴定服务价格套餐' SQL); add_column_if_missing($pdo, 'appraisal_drafts', 'price_package_id', 'BIGINT UNSIGNED NULL DEFAULT NULL AFTER service_provider'); add_column_if_missing($pdo, 'appraisal_drafts', 'price_package_name', "VARCHAR(128) NOT NULL DEFAULT '' AFTER price_package_id"); add_column_if_missing($pdo, 'appraisal_drafts', 'price_package_code', "VARCHAR(64) NOT NULL DEFAULT '' AFTER price_package_name"); add_column_if_missing($pdo, 'appraisal_drafts', 'price_package_price', 'DECIMAL(10,2) NULL DEFAULT NULL AFTER price_package_code'); add_column_if_missing($pdo, 'orders', 'price_package_id', 'BIGINT UNSIGNED NULL DEFAULT NULL AFTER service_provider'); add_column_if_missing($pdo, 'orders', 'price_package_name', "VARCHAR(128) NOT NULL DEFAULT '' AFTER price_package_id"); add_column_if_missing($pdo, 'orders', 'price_package_code', "VARCHAR(64) NOT NULL DEFAULT '' AFTER price_package_name"); add_column_if_missing($pdo, 'orders', 'price_package_price', 'DECIMAL(10,2) NULL DEFAULT NULL AFTER price_package_code'); $indexRows = $pdo->query("SHOW INDEX FROM orders WHERE Key_name = 'idx_orders_price_package_id'")->fetchAll(); if (!$indexRows) { $pdo->exec('ALTER TABLE orders ADD KEY idx_orders_price_package_id (price_package_id)'); echo "ADD_INDEX orders.idx_orders_price_package_id\n"; } $now = date('Y-m-d H:i:s'); $seedStmt = $pdo->prepare( 'INSERT INTO appraisal_service_price_packages (service_provider, package_name, package_code, price, description, is_enabled, is_default, sort_order, created_at, updated_at) SELECT ?, ?, ?, ?, ?, 1, 1, 1, ?, ? WHERE NOT EXISTS ( SELECT 1 FROM appraisal_service_price_packages WHERE service_provider = ? AND package_code = ? )' ); $seedStmt->execute(['anxinyan', '安心验基础套餐', 'anxinyan_basic', 99.00, '默认服务价格套餐', $now, $now, 'anxinyan', 'anxinyan_basic']); $seedStmt->execute(['zhongjian', '中检基础套餐', 'zhongjian_basic', 199.00, '默认服务价格套餐', $now, $now, 'zhongjian', 'zhongjian_basic']); foreach (['anxinyan', 'zhongjian'] as $serviceProvider) { $candidateStmt = $pdo->prepare('SELECT id FROM appraisal_service_price_packages WHERE service_provider = ? AND is_enabled = 1 ORDER BY is_default DESC, sort_order ASC, id ASC LIMIT 1'); $candidateStmt->execute([$serviceProvider]); $candidateId = (int)$candidateStmt->fetchColumn(); if ($candidateId > 0) { $clearStmt = $pdo->prepare('UPDATE appraisal_service_price_packages SET is_default = 0, updated_at = ? WHERE service_provider = ? AND id <> ? AND is_default = 1'); $clearStmt->execute([$now, $serviceProvider, $candidateId]); $defaultStmt = $pdo->prepare('UPDATE appraisal_service_price_packages SET is_default = 1, updated_at = ? WHERE id = ? AND is_default <> 1'); $defaultStmt->execute([$now, $candidateId]); echo "NORMALIZE_DEFAULT_PACKAGE {$serviceProvider}:{$candidateId}\n"; } else { $clearStmt = $pdo->prepare('UPDATE appraisal_service_price_packages SET is_default = 0, updated_at = ? WHERE service_provider = ? AND is_default = 1'); $clearStmt->execute([$now, $serviceProvider]); } } $permissionStmt = $pdo->prepare( 'INSERT INTO admin_permissions (name, code, module, action, created_at, updated_at) SELECT ?, ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM admin_permissions WHERE code = ?)' ); $permissionStmt->execute(['管理服务价格', 'service_prices.manage', 'service_prices', 'manage', $now, $now, 'service_prices.manage']); $permissionIdStmt = $pdo->prepare('SELECT id FROM admin_permissions WHERE code = ?'); $permissionIdStmt->execute(['service_prices.manage']); $permissionId = (int)$permissionIdStmt->fetchColumn(); $roleIdStmt = $pdo->prepare('SELECT id FROM admin_roles WHERE code = ? LIMIT 1'); $roleIdStmt->execute(['super_admin']); $roleId = (int)$roleIdStmt->fetchColumn(); if ($permissionId > 0 && $roleId > 0) { $rolePermissionStmt = $pdo->prepare( 'INSERT INTO admin_role_permissions (role_id, permission_id, created_at) SELECT ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM admin_role_permissions WHERE role_id = ? AND permission_id = ?)' ); $rolePermissionStmt->execute([$roleId, $permissionId, $now, $roleId, $permissionId]); } $pdo->exec("DELETE FROM system_configs WHERE config_group = 'appraisal_service'"); echo "SCHEMA_UPGRADE_SERVICE_PRICE_PACKAGES_OK\n";