prepare("INSERT INTO packages (package_name, description, base_duration, price, services, package_reminder) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$package_name, $description, $base_duration, $price, $services, $package_reminder]); $success_message = "套餐添加成功!"; } elseif ($action === 'update') { $id = (int)$_POST['id']; $package_name = trim($_POST['package_name']); $description = trim($_POST['description']); $base_duration = (int)$_POST['base_duration']; $price = (float)$_POST['price']; $services = implode(',', array_filter(array_map('trim', $_POST['services'] ?? []))); $is_active = isset($_POST['is_active']) ? 1 : 0; if (empty($package_name)) { throw new Exception('套餐名称不能为空'); } if ($base_duration <= 0) { throw new Exception('基础时长必须大于0'); } if ($price < 0) { throw new Exception('价格不能为负数'); } // 获取当前套餐的专属预约信息,避免更新时丢失 $stmt = $pdo->prepare("SELECT package_reminder FROM packages WHERE id = ?"); $stmt->execute([$id]); $current_package = $stmt->fetch(); $package_reminder = $current_package['package_reminder'] ?? ''; // 更新套餐信息,保留现有的package_reminder $stmt = $pdo->prepare("UPDATE packages SET package_name = ?, description = ?, base_duration = ?, price = ?, services = ?, package_reminder = ?, is_active = ? WHERE id = ?"); $stmt->execute([$package_name, $description, $base_duration, $price, $services, $package_reminder, $is_active, $id]); $success_message = "套餐更新成功!"; } elseif ($action === 'delete') { $id = (int)$_POST['id']; // 检查是否有预约使用此套餐 $stmt = $pdo->prepare("SELECT COUNT(*) FROM bookings WHERE package_id = ?"); $stmt->execute([$id]); $booking_count = $stmt->fetchColumn(); if ($booking_count > 0) { throw new Exception("无法删除此套餐,因为有 {$booking_count} 个预约正在使用此套餐。建议禁用此套餐而不是删除。"); } $stmt = $pdo->prepare("DELETE FROM packages WHERE id = ?"); $stmt->execute([$id]); $success_message = "套餐删除成功!"; } elseif ($action === 'update_reminder') { // 处理套餐专属预约信息的单独更新 $id = (int)$_POST['id']; $package_reminder = trim($_POST['package_reminder']); $stmt = $pdo->prepare("UPDATE packages SET package_reminder = ? WHERE id = ?"); $stmt->execute([$package_reminder, $id]); // 返回JSON响应 header('Content-Type: application/json'); echo json_encode(['success' => true, 'message' => '套餐专属预约信息更新成功!'], JSON_UNESCAPED_UNICODE); exit; } elseif ($action === 'toggle_active') { // 快速切换启用/禁用状态 $id = (int)$_POST['id']; $stmt = $pdo->prepare("UPDATE packages SET is_active = NOT is_active WHERE id = ?"); $stmt->execute([$id]); header('Content-Type: application/json'); echo json_encode(['success' => true, 'message' => '状态更新成功!'], JSON_UNESCAPED_UNICODE); exit; } } catch (Exception $e) { $message = "操作失败:" . $e->getMessage(); } } // 获取搜索和筛选参数 $search = isset($_GET['search']) ? trim($_GET['search']) : ''; $status_filter = isset($_GET['status']) ? $_GET['status'] : 'all'; // all, active, inactive $sort_by = isset($_GET['sort']) ? $_GET['sort'] : 'created_at'; // created_at, price, duration, name $sort_order = isset($_GET['order']) ? $_GET['order'] : 'desc'; // asc, desc // 构建查询 $query = "SELECT p.*, COUNT(b.id) as booking_count, SUM(CASE WHEN b.status NOT IN ('已完成', '已取消') THEN 1 ELSE 0 END) as active_booking_count FROM packages p LEFT JOIN bookings b ON p.id = b.package_id WHERE 1=1"; $params = []; // 搜索条件 if (!empty($search)) { $query .= " AND (p.package_name LIKE ? OR p.description LIKE ?)"; $search_param = "%{$search}%"; $params[] = $search_param; $params[] = $search_param; } // 状态筛选 if ($status_filter === 'active') { $query .= " AND p.is_active = 1"; } elseif ($status_filter === 'inactive') { $query .= " AND p.is_active = 0"; } $query .= " GROUP BY p.id"; // 排序 $allowed_sorts = ['created_at', 'price', 'base_duration', 'package_name', 'booking_count']; $sort_by = in_array($sort_by, $allowed_sorts) ? $sort_by : 'created_at'; $sort_order = in_array($sort_order, ['asc', 'desc']) ? $sort_order : 'desc'; if ($sort_by === 'package_name') { $query .= " ORDER BY p.package_name " . strtoupper($sort_order); } elseif ($sort_by === 'booking_count') { $query .= " ORDER BY booking_count " . strtoupper($sort_order) . ", p.created_at DESC"; } else { $query .= " ORDER BY p.{$sort_by} " . strtoupper($sort_order); } $stmt = $pdo->prepare($query); $stmt->execute($params); $packages = $stmt->fetchAll(); // 统计信息 $total_packages = count($packages); $active_packages = count(array_filter($packages, function($p) { return $p['is_active']; })); $inactive_packages = $total_packages - $active_packages; $total_bookings = array_sum(array_column($packages, 'booking_count')); ?>
= htmlspecialchars($package['description']) ?>