query($sql); } /** * 获取不同地区的订单数量 * * @param mysqli $conn 数据库连接 * @param string $start_date 开始日期 * @param string $end_date 结束日期 * @return mysqli_result 地区订单数据结果集 */ function getOrdersByRegion($conn, $start_date, $end_date) { $sql = "SELECT c.countryName, COUNT(o.id) as order_count, SUM(o.total_amount) as total_amount, SUM(oi.quantity) as total_quantity FROM orders o JOIN customer cu ON o.customer_id = cu.id JOIN country c ON cu.cs_country = c.id LEFT JOIN order_items oi ON o.id = oi.order_id WHERE o.order_date BETWEEN ? AND ? GROUP BY cu.cs_country ORDER BY total_quantity DESC LIMIT 10"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $start_date, $end_date); $stmt->execute(); return $stmt->get_result(); } /** * 获取地区销售同比环比数据 * * @param mysqli $conn 数据库连接 * @param string $current_start 当前周期开始日期 * @param string $current_end 当前周期结束日期 * @return array 地区销售同比环比数据 */ function getRegionSalesComparison($conn, $current_start, $current_end) { // 计算上一个相同时长的周期 $current_start_date = new DateTime($current_start); $current_end_date = new DateTime($current_end); $interval = $current_start_date->diff($current_end_date); $prev_end_date = clone $current_start_date; $prev_end_date->modify('-1 day'); $prev_start_date = clone $prev_end_date; $prev_start_date->sub($interval); $prev_start = $prev_start_date->format('Y-m-d'); $prev_end = $prev_end_date->format('Y-m-d') . ' 23:59:59'; // 获取当前周期数据 $sql = "SELECT c.countryName, COUNT(o.id) as order_count, SUM(o.total_amount) as total_amount FROM orders o JOIN customer cu ON o.customer_id = cu.id JOIN country c ON cu.cs_country = c.id WHERE o.order_date BETWEEN ? AND ? GROUP BY cu.cs_country ORDER BY total_amount DESC LIMIT 5"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $current_start, $current_end); $stmt->execute(); $current_result = $stmt->get_result(); $current_data = []; while ($row = $current_result->fetch_assoc()) { $current_data[$row['countryName']] = [ 'order_count' => $row['order_count'], 'total_amount' => $row['total_amount'] ]; } // 获取上一个周期数据 $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $prev_start, $prev_end); $stmt->execute(); $prev_result = $stmt->get_result(); $prev_data = []; while ($row = $prev_result->fetch_assoc()) { $prev_data[$row['countryName']] = [ 'order_count' => $row['order_count'], 'total_amount' => $row['total_amount'] ]; } // 计算同比变化 $comparison_data = []; foreach ($current_data as $country => $current) { $prev = $prev_data[$country] ?? ['order_count' => 0, 'total_amount' => 0]; $order_growth = $prev['order_count'] > 0 ? (($current['order_count'] - $prev['order_count']) / $prev['order_count']) * 100 : 100; $amount_growth = $prev['total_amount'] > 0 ? (($current['total_amount'] - $prev['total_amount']) / $prev['total_amount']) * 100 : 100; $comparison_data[] = [ 'countryName' => $country, 'current_orders' => $current['order_count'], 'prev_orders' => $prev['order_count'], 'order_growth' => $order_growth, 'current_amount' => $current['total_amount'], 'prev_amount' => $prev['total_amount'], 'amount_growth' => $amount_growth ]; } return $comparison_data; } /** * 渲染客户国家分布图 * * @param array $country_labels 国家标签 * @param array $country_data 国家数据 * @return void */ function renderCustomerCountryDistributionChart($country_labels, $country_data) { ?>

客户国家分布

地区订单分析

地区销售同比分析

国家/地区 当前订单数 上期订单数 订单增长率 当前销售额 上期销售额 销售额增长率
% ¥ ¥ %