query($sql); } /** * 获取成交阶段分布 * * @param mysqli $conn 数据库连接 * @return mysqli_result 成交阶段分布数据结果集 */ function getDealStageDistribution($conn) { $sql = "SELECT cs_deal, CASE WHEN cs_deal = 1 THEN '背景调查' WHEN cs_deal = 2 THEN '明确需求' WHEN cs_deal = 3 THEN '已成交' ELSE '其他' END as stage_name, COUNT(id) as customer_count FROM customer GROUP BY cs_deal"; return $conn->query($sql); } /** * 获取客户增长趋势 * * @param mysqli $conn 数据库连接 * @param int $months 获取多少个月的数据,默认12个月 * @return mysqli_result 客户增长趋势数据结果集 */ function getCustomerGrowthTrend($conn, $months = 12) { $sql = "SELECT DATE_FORMAT(cs_addtime, '%Y-%m') as month, COUNT(id) as new_customers FROM customer WHERE cs_addtime >= DATE_SUB(CURDATE(), INTERVAL ? MONTH) GROUP BY DATE_FORMAT(cs_addtime, '%Y-%m') ORDER BY month"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $months); $stmt->execute(); return $stmt->get_result(); } /** * 获取新老客户订单分析 * * @param mysqli $conn 数据库连接 * @param string $start_date 开始日期 * @param string $end_date 结束日期 * @return array 新老客户订单分析数据 */ function getNewVsReturningCustomerOrders($conn, $start_date, $end_date) { // 获取选定日期范围内的订单 $sql = "SELECT o.customer_id, COUNT(o.id) as order_count, SUM(o.total_amount) as total_amount, MIN(o.order_date) as first_order_date, MAX(c.cs_addtime) as customer_addtime FROM orders o JOIN customer c ON o.customer_id = c.id WHERE o.order_date BETWEEN ? AND ? GROUP BY o.customer_id"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $start_date, $end_date); $stmt->execute(); $result = $stmt->get_result(); $new_customers = 0; $returning_customers = 0; $new_customer_amount = 0; $returning_customer_amount = 0; while ($row = $result->fetch_assoc()) { // 查找之前是否有订单 $prev_sql = "SELECT id FROM orders WHERE customer_id = ? AND order_date < ? LIMIT 1"; $prev_stmt = $conn->prepare($prev_sql); $prev_stmt->bind_param("is", $row['customer_id'], $start_date); $prev_stmt->execute(); $prev_result = $prev_stmt->get_result(); if ($prev_result->num_rows > 0) { // 老客户 $returning_customers++; $returning_customer_amount += $row['total_amount']; } else { // 新客户 $new_customers++; $new_customer_amount += $row['total_amount']; } } return [ 'new_customers' => $new_customers, 'returning_customers' => $returning_customers, 'new_customer_amount' => $new_customer_amount, 'returning_customer_amount' => $returning_customer_amount, 'total_customers' => $new_customers + $returning_customers, 'total_amount' => $new_customer_amount + $returning_customer_amount ]; } /** * 渲染客户类型分布图 * * @param array $type_labels 类型标签 * @param array $type_data 类型数据 * @return void */ function renderCustomerTypeChart($type_labels, $type_data) { ?>

客户类型分布

成交阶段分布

客户增长趋势

新老客户分析

客户数量分布

销售额分布

总客户数:
新客户: ( 0) ? number_format(($new_vs_returning['new_customers'] / $new_vs_returning['total_customers']) * 100, 1) : '0'; ?>%)
老客户: ( 0) ? number_format(($new_vs_returning['returning_customers'] / $new_vs_returning['total_customers']) * 100, 1) : '0'; ?>%)
总销售额: ¥
新客户销售额: ¥ ( 0) ? number_format(($new_vs_returning['new_customer_amount'] / $new_vs_returning['total_amount']) * 100, 1) : '0'; ?>%)
老客户销售额: ¥ ( 0) ? number_format(($new_vs_returning['returning_customer_amount'] / $new_vs_returning['total_amount']) * 100, 1) : '0'; ?>%)
query($sql); $row = $result->fetch_assoc(); return $row['total']; } /** * 获取指定时间段内新增客户数 * * @param mysqli $conn 数据库连接 * @param string $start_date 开始日期 * @param string $end_date 结束日期 * @return int 新增客户数 */ function getNewCustomers($conn, $start_date, $end_date) { $sql = "SELECT COUNT(id) as new_count FROM customer WHERE cs_addtime BETWEEN ? AND ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $start_date, $end_date); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); return $row['new_count']; } /** * 计算平均客户价值(客户平均订单金额) * * @param mysqli $conn 数据库连接 * @param string $start_date 开始日期 * @param string $end_date 结束日期 * @return float 平均客户价值 */ function getAverageCustomerValue($conn, $start_date, $end_date) { $sql = "SELECT AVG(customer_value) as avg_value FROM ( SELECT o.customer_id, SUM(o.total_amount) as customer_value FROM orders o WHERE o.order_date BETWEEN ? AND ? GROUP BY o.customer_id ) as customer_values"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $start_date, $end_date); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); return $row['avg_value'] ? $row['avg_value'] : 0; } /** * 计算客户留存率 * * @param mysqli $conn 数据库连接 * @param string $start_date 开始日期 * @param string $end_date 结束日期 * @return array 客户留存率数据 */ function getCustomerRetentionRate($conn, $start_date, $end_date) { // 获取之前时间段的客户 $previous_start = date('Y-m-d', strtotime('-1 year', strtotime($start_date))); $previous_end = date('Y-m-d', strtotime('-1 day', strtotime($start_date))); // 之前时间段的客户ID $prev_sql = "SELECT DISTINCT customer_id FROM orders WHERE order_date BETWEEN ? AND ?"; $prev_stmt = $conn->prepare($prev_sql); $prev_stmt->bind_param("ss", $previous_start, $previous_end); $prev_stmt->execute(); $prev_result = $prev_stmt->get_result(); $previous_customers = []; while ($row = $prev_result->fetch_assoc()) { $previous_customers[] = $row['customer_id']; } $previous_count = count($previous_customers); // 如果没有之前的客户,返回0 if ($previous_count == 0) { return [ 'retained_count' => 0, 'total_previous' => 0, 'retention_rate' => 0 ]; } // 查询当前时间段内,之前客户中再次购买的客户数 $current_sql = "SELECT COUNT(DISTINCT customer_id) as retained_count FROM orders WHERE order_date BETWEEN ? AND ? AND customer_id IN (" . implode(',', $previous_customers) . ")"; $current_stmt = $conn->prepare($current_sql); $current_stmt->bind_param("ss", $start_date, $end_date); $current_stmt->execute(); $current_result = $current_stmt->get_result(); $row = $current_result->fetch_assoc(); $retained_count = $row['retained_count']; $retention_rate = ($retained_count / $previous_count) * 100; return [ 'retained_count' => $retained_count, 'total_previous' => $previous_count, 'retention_rate' => $retention_rate ]; } /** * 计算下单转换率 * * @param mysqli $conn 数据库连接 * @param string $start_date 开始日期 * @param string $end_date 结束日期 * @return array 下单转换率数据 */ function getOrderConversionRate($conn, $start_date, $end_date) { // 获取指定时间段内总客户数 $total_sql = "SELECT COUNT(DISTINCT id) as total_count FROM customer WHERE cs_addtime <= ?"; $total_stmt = $conn->prepare($total_sql); $total_stmt->bind_param("s", $end_date); $total_stmt->execute(); $total_result = $total_stmt->get_result(); $total_row = $total_result->fetch_assoc(); $total_customers = $total_row['total_count']; // 获取有订单的客户数 $order_sql = "SELECT COUNT(DISTINCT customer_id) as order_count FROM orders WHERE order_date BETWEEN ? AND ?"; $order_stmt = $conn->prepare($order_sql); $order_stmt->bind_param("ss", $start_date, $end_date); $order_stmt->execute(); $order_result = $order_stmt->get_result(); $order_row = $order_result->fetch_assoc(); $customers_with_orders = $order_row['order_count']; // 计算转换率 $conversion_rate = ($total_customers > 0) ? ($customers_with_orders / $total_customers) * 100 : 0; return [ 'total_customers' => $total_customers, 'customers_with_orders' => $customers_with_orders, 'conversion_rate' => $conversion_rate ]; } /** * 渲染关键指标仪表板 * * @param array $kpi_data 关键指标数据 * @return void */ function renderKeyMetricsCard($kpi_data) { ?>

客户总数

新增客户

平均客户价值

¥

客户留存率

%
/

下单转换率

%
/