日期区间导出脚本优化:新推荐人统计与订单金额分离
解决方案
要实现你需要的逻辑,核心是拆分「新被推荐人计数」和「新被推荐人销售额统计」的判断条件——前者只看注册日期是否在区间内,后者需要同时满足注册日期和订单日期都在区间内。另外还要注意处理被推荐人没有下单($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;
关键修改点说明:
拆分判断逻辑:
- 先单独判断被推荐人的注册日期是否在导出区间内,只要满足就给
nbFilleulNew加1,完全符合你说的「注册在区间内就算新被推荐人」的需求。 - 只有当注册日期在区间内且订单日期也在区间内时,才把该订单的金额加到
totalCaNew中,解决了「订单在区间外不统计销售额」的问题。
- 先单独判断被推荐人的注册日期是否在导出区间内,只要满足就给
空值安全处理:
- 给
$row['CA']添加了?? 0的空值合并运算符,避免被推荐人没有订单时(CA为null)导致累加出错。 - 判断订单日期时先检查
!empty($dateOrder),避免空日期参与比较引发的逻辑问题。
- 给
日期比较优化:
- 把日期范围判断的结果存到
$isInscriptionInRange变量中,让代码更清晰易读。 - 把原来的
>和<改成>=和<=,确保区间边界的日期(比如01/01 00:00:00和30/01 23:59:59)也能被正确统计。
- 把日期范围判断的结果存到
内容的提问来源于stack exchange,提问作者Chris99391
相关产品推荐
相关产品推荐

