You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

日期区间导出脚本优化:新推荐人统计与订单金额分离

解决方案

要实现你需要的逻辑,核心是拆分「新被推荐人计数」和「新被推荐人销售额统计」的判断条件——前者只看注册日期是否在区间内,后者需要同时满足注册日期和订单日期都在区间内。另外还要注意处理被推荐人没有下单($dateOrder为空)的情况,避免逻辑错误。

以下是修改后的完整代码:

$filename = $this->l('export_perfs');
$header = array('Ambassadrice:Nom/Prénom', 'Nb Filleul','CA Filleul (total)','Nvx Filleul', 'CA Nvx Filleul');
// Récupére le nombre de filleuls total et le CA total
$sql1 = Db::getInstance()->executeS("
SELECT CONCAT(amb.firstname, ' ', amb.lastname) AS NomPrénom,
rs.id_sponsor, c.id_customer,
SUM(o.total_products_wt + o.total_shipping) AS CA,
c.date_add AS dateFilleul, o.date_add AS dateOrder
FROM `"._DB_PREFIX_."rewards_sponsorship` rs
LEFT JOIN `"._DB_PREFIX_."customer` c ON rs.id_customer = c.id_customer
LEFT JOIN `"._DB_PREFIX_."customer` amb ON rs.id_sponsor = amb.id_customer
LEFT JOIN `"._DB_PREFIX_."orders` o ON(c.id_customer = o.id_customer)
GROUP BY rs.id_customer");
$lines = array();
foreach ($sql1 as $row) {
    $id_sponsor = $row['id_sponsor'];
    $lines[$id_sponsor]['ambassadrice'] = $row['NomPrénom'];
    $lines[$id_sponsor]['totalCa'] += $row['CA'] ?? 0; // 处理无订单时CA为null的情况
    $lines[$id_sponsor]['nbFilleul']++;
    
    $dateInscriptionFilleul = $row['dateFilleul'];
    $dateOrder = $row['dateOrder'];
    
    // 第一步:判断注册日期是否在区间内,是则统计新被推荐人数
    $isInscriptionInRange = ($dateInscriptionFilleul >= $date_from .' 00:00:00') && ($dateInscriptionFilleul <= $date_to.' 23:59:59');
    if ($isInscriptionInRange) {
        $lines[$id_sponsor]['nbFilleulNew'] = isset($lines[$id_sponsor]['nbFilleulNew']) ? $lines[$id_sponsor]['nbFilleulNew'] + 1 : 1;
        
        // 第二步:只有当订单日期也在区间内时,才统计该订单的销售额
        if (!empty($dateOrder) && ($dateOrder >= $date_from.' 00:00:00') && ($dateOrder <= $date_to.' 23:59:59')) {
            $lines[$id_sponsor]['totalCaNew'] += $row['CA'] ?? 0;
        }
    }
}
$results = [];
foreach ($lines as $id_sponsor => $data) {
    $results[] = array(
        $data['ambassadrice'],
        $data['nbFilleul'],
        $data['totalCa'] ?? 0,
        isset($data['nbFilleulNew'])?$data['nbFilleulNew']:0,
        isset($data['totalCaNew'])?$data['totalCaNew']:0,
    );
}
return $this->generateCSV($results, $header, $filename);
break;

关键修改点说明:

  1. 拆分判断逻辑:

    • 先单独判断被推荐人的注册日期是否在导出区间内,只要满足就给nbFilleulNew加1,完全符合你说的「注册在区间内就算新被推荐人」的需求。
    • 只有当注册日期在区间内且订单日期也在区间内时,才把该订单的金额加到totalCaNew中,解决了「订单在区间外不统计销售额」的问题。
  2. 空值安全处理:

    • 给$row['CA']添加了?? 0的空值合并运算符,避免被推荐人没有订单时(CA为null)导致累加出错。
    • 判断订单日期时先检查!empty($dateOrder),避免空日期参与比较引发的逻辑问题。
  3. 日期比较优化:

    • 把日期范围判断的结果存到$isInscriptionInRange变量中,让代码更清晰易读。
    • 把原来的>和<改成>=和<=,确保区间边界的日期(比如01/01 00:00:00和30/01 23:59:59)也能被正确统计。

内容的提问来源于stack exchange,提问作者Chris99391

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:01:57