prepare($sql);
$stmt->bind_param("ssi", $start_date, $end_date, $limit);
$stmt->execute();
return $stmt->get_result();
}
/**
* 获取产品销售趋势
*
* @param mysqli $conn 数据库连接
* @param string $start_date 开始日期
* @param string $end_date 结束日期
* @param int $product_id 产品ID,为0时获取所有产品的总体趋势
* @param string $period 时间粒度 (day/week/month)
* @return mysqli_result 产品销售趋势数据结果集
*/
function getProductSalesTrend($conn, $start_date, $end_date, $product_id = 0, $period = 'month') {
$groupFormat = '%Y-%m-%d';
if ($period == 'week') {
$groupFormat = '%x-W%v'; // ISO year and week number
} else if ($period == 'month') {
$groupFormat = '%Y-%m';
}
$sql = "SELECT
DATE_FORMAT(o.order_date, '$groupFormat') as time_period,
SUM(oi.quantity) as total_quantity,
SUM(oi.total_price) as total_revenue,
COUNT(DISTINCT o.id) as order_count
FROM order_items oi
JOIN orders o ON oi.order_id = o.id";
if ($product_id > 0) {
$sql .= " WHERE o.order_date BETWEEN ? AND ? AND oi.product_id = ?";
} else {
$sql .= " WHERE o.order_date BETWEEN ? AND ?";
}
$sql .= " GROUP BY time_period
ORDER BY MIN(o.order_date)";
$stmt = $conn->prepare($sql);
if ($product_id > 0) {
$stmt->bind_param("ssi", $start_date, $end_date, $product_id);
} else {
$stmt->bind_param("ss", $start_date, $end_date);
}
$stmt->execute();
return $stmt->get_result();
}
/**
* 获取产品类别销售分布
*
* @param mysqli $conn 数据库连接
* @param string $start_date 开始日期
* @param string $end_date 结束日期
* @return mysqli_result 产品类别销售分布数据结果集
*/
function getProductCategorySales($conn, $start_date, $end_date) {
$sql = "SELECT
pc.name as category_name,
SUM(oi.quantity) as total_quantity,
SUM(oi.total_price) as total_revenue,
COUNT(DISTINCT o.id) as order_count
FROM order_items oi
JOIN products p ON oi.product_id = p.id
JOIN product_categories pc ON p.category_id = pc.id
JOIN orders o ON oi.order_id = o.id
WHERE o.order_date BETWEEN ? AND ?
GROUP BY p.category_id
ORDER BY total_revenue DESC";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $start_date, $end_date);
$stmt->execute();
return $stmt->get_result();
}
/**
* 获取产品与地区关联分析
*
* @param mysqli $conn 数据库连接
* @param string $start_date 开始日期
* @param string $end_date 结束日期
* @param int $limit 限制返回的产品-地区组合数量
* @return mysqli_result 产品与地区关联分析数据结果集
*/
function getProductRegionAnalysis($conn, $start_date, $end_date, $limit = 10) {
$sql = "SELECT
p.ProductName,
c.countryName,
SUM(oi.quantity) as total_quantity,
SUM(oi.total_price) as total_revenue
FROM order_items oi
JOIN products p ON oi.product_id = p.id
JOIN orders o ON oi.order_id = o.id
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 oi.product_id, cu.cs_country
ORDER BY total_revenue DESC
LIMIT ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssi", $start_date, $end_date, $limit);
$stmt->execute();
return $stmt->get_result();
}
/**
* 渲染热门产品表格
*
* @param mysqli_result $top_products 热门产品数据
* @return void
*/
function renderTopProductsTable($top_products) {
?>
产品名称 |
销售数量 |
销售收入 |
fetch_assoc()): ?>
|
|
¥ |
产品名称 |
国家/地区 |
销售数量 |
销售收入 |
fetch_assoc()): ?>
|
|
|
¥ |