= '" . mysqli_real_escape_string($conn, $fliterFromDate) . "'";
$urlStr .= "&fliterFromDate=" . urlencode($fliterFromDate);
}
if (!empty($fliterToDate)) {
$fliterStr .= " AND o.order_date <= '" . mysqli_real_escape_string($conn, $fliterToDate) . " 23:59:59'";
$urlStr .= "&fliterToDate=" . urlencode($fliterToDate);
}
// 搜索参数
$keys = $_GET['Keys'] ?? '';
$keyscode = mysqli_real_escape_string($conn, $keys);
$page = $_GET['Page'] ?? 1;
// 构建基本条件SQL - 这部分是两个查询共用的
$employee_id = $_SESSION['employee_id'];
$isAdmin = checkIfAdmin();
// 步骤1:查询符合条件的客户ID列表
$customerListSql = "SELECT DISTINCT o.customer_id
FROM orders o
JOIN order_items oi ON o.id = oi.order_id
JOIN customer c ON o.customer_id = c.id
JOIN products p ON oi.product_id = p.id
WHERE
o.order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
AND o.order_type = 1
AND p.rebate = 1
AND NOT EXISTS (
SELECT 1
FROM rebate_redemption_items rri
WHERE rri.order_item_id = oi.id
)
AND EXISTS (
SELECT 1
FROM rebate_rules rr
WHERE rr.product_id = oi.product_id
)
AND (
SELECT SUM(oi2.quantity)
FROM order_items oi2
JOIN orders o2 ON oi2.order_id = o2.id
WHERE o2.customer_id = o.customer_id
AND o2.order_type = 1
AND oi2.product_id = oi.product_id
AND o2.order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
AND NOT EXISTS (
SELECT 1
FROM rebate_redemption_items rri
WHERE rri.order_item_id = oi2.id
)
) >= (
SELECT MIN(rr.min_quantity)
FROM rebate_rules rr
WHERE rr.product_id = oi.product_id
)";
// 非管理员只能查看自己的客户返点
if (!$isAdmin) {
$customerListSql .= " AND c.cs_belong = $employee_id";
}
// 添加搜索条件
if (!empty($keyscode)) {
$customerListSql .= " AND (c.cs_company LIKE '%$keyscode%' OR c.cs_code LIKE '%$keyscode%')";
}
// 添加日期筛选
$customerListSql .= $fliterStr;
// 执行查询获取客户ID列表
$customerResult = mysqli_query($conn, $customerListSql);
if (!$customerResult) {
die("查询客户列表错误: " . mysqli_error($conn));
}
// 获取客户ID并创建IN子句
$customerIds = [];
while ($row = mysqli_fetch_assoc($customerResult)) {
$customerIds[] = $row['customer_id'];
}
// 如果没有找到客户,设置一个不可能的ID以确保查询不返回任何结果
if (empty($customerIds)) {
$customerIds = [-1]; // 不可能的ID
}
$customerIdsStr = implode(',', $customerIds);
// 设置每页显示记录数和分页
$pageSize = 20;
$totalRecords = count($customerIds);
// 计算总页数
$totalPages = ceil($totalRecords / $pageSize);
if ($totalPages < 1) $totalPages = 1;
// 验证当前页码
$page = (int)$page;
if ($page < 1) $page = 1;
if ($page > $totalPages) $page = $totalPages;
// 计算起始记录
$offset = ($page - 1) * $pageSize;
// 步骤2:获取分页后的客户详细信息
// 为防止表结构问题,使用更简单的SQL格式并明确使用id字段
// 先获取客户基本信息
$paginatedCustomerIds = array_slice($customerIds, $offset, $pageSize);
if (empty($paginatedCustomerIds)) {
$paginatedCustomerIds = [-1]; // 确保不会有结果
}
$paginatedIdsStr = implode(',', $paginatedCustomerIds);
$customerDetailSql = "
SELECT
c.id AS customer_id,
c.cs_company AS customer_name,
c.cs_code
FROM
customer c
WHERE
c.id IN ($paginatedIdsStr)";
$result = mysqli_query($conn, $customerDetailSql);
if (!$result) {
die("查询客户基本信息错误: " . mysqli_error($conn));
}
$customers = [];
while ($row = mysqli_fetch_assoc($result)) {
$customers[$row['customer_id']] = $row;
$customers[$row['customer_id']]['total_rebate_amount'] = 0;
$customers[$row['customer_id']]['qualifying_products'] = 0;
$customers[$row['customer_id']]['rebate_details'] = '';
}
// 如果找到客户,获取每个客户的返点详情
if (!empty($customers)) {
$customerIdsForDetails = array_keys($customers);
$customerIdsForDetailsStr = implode(',', $customerIdsForDetails);
// 获取客户返点总金额和产品数量
$rebateDetailsSql = "
SELECT
o.customer_id,
SUM(
oi.quantity * (
SELECT rr.rebate_amount
FROM rebate_rules rr
WHERE rr.product_id = oi.product_id
AND rr.min_quantity <= (
SELECT SUM(oi2.quantity)
FROM order_items oi2
JOIN orders o2 ON oi2.order_id = o2.id
WHERE o2.customer_id = o.customer_id
AND o2.order_type = 1
AND oi2.product_id = oi.product_id
AND o2.order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
AND NOT EXISTS (
SELECT 1
FROM rebate_redemption_items rri
WHERE rri.order_item_id = oi2.id
)
)
ORDER BY rr.min_quantity DESC
LIMIT 1
)
) AS total_rebate_amount,
COUNT(DISTINCT oi.product_id) AS qualifying_products
FROM
orders o
JOIN
order_items oi ON o.id = oi.order_id
JOIN
products p ON oi.product_id = p.id
WHERE
o.customer_id IN ($customerIdsForDetailsStr)
AND o.order_type = 1
AND o.order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
AND p.rebate = 1
AND NOT EXISTS (
SELECT 1
FROM rebate_redemption_items rri
WHERE rri.order_item_id = oi.id
)
GROUP BY
o.customer_id";
$detailsResult = mysqli_query($conn, $rebateDetailsSql);
if (!$detailsResult) {
die("查询返点详情错误: " . mysqli_error($conn));
}
// 填充总金额和产品数量
while ($detailRow = mysqli_fetch_assoc($detailsResult)) {
if (isset($customers[$detailRow['customer_id']])) {
$customers[$detailRow['customer_id']]['total_rebate_amount'] = $detailRow['total_rebate_amount'];
$customers[$detailRow['customer_id']]['qualifying_products'] = $detailRow['qualifying_products'];
}
}
// 获取每个客户的产品返点详情
foreach ($customerIdsForDetails as $customerId) {
$productDetailsSql = "
SELECT
p.ProductName,
SUM(oi.quantity) AS quantity,
(
SELECT rr.rebate_amount
FROM rebate_rules rr
WHERE rr.product_id = oi.product_id
AND rr.min_quantity <= SUM(oi.quantity)
ORDER BY rr.min_quantity DESC
LIMIT 1
) AS rebate_amount
FROM
order_items oi
JOIN
orders o ON oi.order_id = o.id
JOIN
products p ON oi.product_id = p.id
WHERE
o.customer_id = $customerId
AND o.order_type = 1
AND o.order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
AND p.rebate = 1
AND NOT EXISTS (
SELECT 1
FROM rebate_redemption_items rri
WHERE rri.order_item_id = oi.id
)
GROUP BY
oi.product_id, p.ProductName";
$productResult = mysqli_query($conn, $productDetailsSql);
if (!$productResult) {
die("查询产品详情错误: " . mysqli_error($conn));
}
// 构建返点详情文本
$details = [];
while ($productRow = mysqli_fetch_assoc($productResult)) {
$details[] = $productRow['ProductName'] . ': ' .
$productRow['quantity'] . ' 件 x ' .
$productRow['rebate_amount'] . ' 元/件';
}
$customers[$customerId]['rebate_details'] = implode(';
', $details);
}
// 按照返点金额排序
usort($customers, function($a, $b) {
return $b['total_rebate_amount'] <=> $a['total_rebate_amount'];
});
}
?>