From 113f68365da9376fd68687e6ccbdbf93d352083b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=98=8A=E5=A4=A9?= <442384644@qq.com> Date: Wed, 21 Oct 2026 11:49:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E7=94=A8=E6=88=B7=E5=88=97=E8=A1=A8):=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=B8=8A=E6=AC=A1=E6=B6=88=E8=B4=B9=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=AD=9B=E9=80=89=E5=B9=B6=E7=BB=9F=E4=B8=80=E5=8C=BA?= =?UTF-8?q?=E9=97=B4=E8=BE=B9=E7=95=8C=E4=B8=BA=E9=97=AD=E5=8C=BA=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 上次消费时间按中台订单已支付未退款的用户最近 pay_time 子查询筛选 - 消费次数/消费金额/余额/积分单边区间改 >=/<= 闭区间;访问/注册时间起始同步对齐 - 未访问时间段筛选取反条件包进闭包,避免 OR 破坏外层 AND --- backend/app/dao/user/UserWechatUserDao.php | 50 ++++++++++++++++------ 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/backend/app/dao/user/UserWechatUserDao.php b/backend/app/dao/user/UserWechatUserDao.php index f92197760..9da2af795 100644 --- a/backend/app/dao/user/UserWechatUserDao.php +++ b/backend/app/dao/user/UserWechatUserDao.php @@ -162,15 +162,19 @@ class UserWechatUserDao extends BaseDao list($startTime, $endTime) = explode('-', $where['user_time']); if ($startTime && $endTime) { $endTime = strtotime($endTime) + 24 * 3600; - // last_time 小于开始时间 或 大于结束时间(即不在该时间段内访问) - $model = $model->where($userAlias . "last_time < " . strtotime($startTime) . " OR " . $userAlias . "last_time > " . $endTime); + $startTime = strtotime($startTime); + // last_time 不在指定时间段内(结束日期按当天 24:00 处理) + $model = $model->where(function ($query) use ($userAlias, $startTime, $endTime) { + $query->where($userAlias . 'last_time', '<', $startTime) + ->whereOr($userAlias . 'last_time', '>=', $endTime); + }); } } // 筛选指定时间内访问过的用户 if ($where['user_time_type'] == 'visit' && $where['user_time'] !== '') { list($startTime, $endTime) = explode('-', $where['user_time']); if ($startTime && $endTime) { - $model = $model->where($userAlias . 'last_time', '>', strtotime($startTime)); + $model = $model->where($userAlias . 'last_time', '>=', strtotime($startTime)); $model = $model->where($userAlias . 'last_time', '<', strtotime($endTime) + 24 * 3600); } } @@ -178,12 +182,32 @@ class UserWechatUserDao extends BaseDao if ($where['user_time_type'] == 'add_time' && $where['user_time'] !== '') { list($startTime, $endTime) = explode('-', $where['user_time']); if ($startTime && $endTime) { - $model = $model->where($userAlias . 'add_time', '>', strtotime($startTime)); + $model = $model->where($userAlias . 'add_time', '>=', strtotime($startTime)); $model = $model->where($userAlias . 'add_time', '<', strtotime($endTime) + 24 * 3600); } } } + // --- 上次消费时间筛选 --- + // 仅统计已支付且未退款订单,并按用户最近一次消费时间筛选。 + if (isset($where['before_pay_time']) && $where['before_pay_time'] !== '') { + $timeRange = explode('-', $where['before_pay_time'], 2); + if (count($timeRange) === 2 && $timeRange[0] !== '' && $timeRange[1] !== '') { + $startTime = strtotime($timeRange[0]); + $endTime = strtotime($timeRange[1]) + 24 * 3600; + if ($startTime !== false && $endTime !== false) { + $model = $model->whereIn($userAlias . 'uid', function ($query) use ($startTime, $endTime) { + $query->name('order_center') + ->where('pay_status', 1) + ->where('refund_status', 0) + ->field('uid') + ->group('uid') + ->having('MAX(pay_time) >= ' . (int)$startTime . ' AND MAX(pay_time) < ' . (int)$endTime); + }); + } + } + } + // --- 购买次数筛选 (单一数值) --- // pay_count: -1(0次), 其他数值(大于该数值) if (isset($where['pay_count']) && $where['pay_count'] !== '' && $where['pay_count'] !== null) { @@ -201,16 +225,16 @@ class UserWechatUserDao extends BaseDao // 区间查询 $model = $model->whereBetween($userAlias . 'pay_count', $where['pay_count_num']); } elseif ($where['pay_count_num'][0] !== '' && $where['pay_count_num'][1] === '') { - // 大于最小值 - $model = $model->where($userAlias . 'pay_count', '>', $where['pay_count_num'][0]); + // 大于等于最小值 + $model = $model->where($userAlias . 'pay_count', '>=', $where['pay_count_num'][0]); } elseif ($where['pay_count_num'][0] === '' && $where['pay_count_num'][1] !== '') { - // 小于最大值 - $model = $model->where($userAlias . 'pay_count', '<', $where['pay_count_num'][1]); + // 小于等于最大值 + $model = $model->where($userAlias . 'pay_count', '<=', $where['pay_count_num'][1]); } } // --- 消费金额筛选 (区间) --- - // pay_count_money: [min, max] 统计 store_order 表中实际支付金额 + // pay_count_money: [min, max] 统计 order_center 表中实际支付金额 if (isset($where['pay_count_money']) && count($where['pay_count_money']) == 2) { $min = $where['pay_count_money'][0]; $max = $where['pay_count_money'][1]; @@ -228,9 +252,9 @@ class UserWechatUserDao extends BaseDao if ($min !== '' && $max !== '') { $q->whereBetween('pay_price', [$min, $max]); } elseif ($min !== '' && $max === '') { - $q->where('pay_price', '>', $min); + $q->where('pay_price', '>=', $min); } elseif ($min === '' && $max !== '') { - $q->where('pay_price', '<', $max); + $q->where('pay_price', '<=', $max); } }); @@ -297,9 +321,9 @@ class UserWechatUserDao extends BaseDao if ($where['integral'][0] !== '' && $where['integral'][1] !== '') { $model = $model->whereBetween($userAlias . 'integral', $where['integral']); } elseif ($where['integral'][0] !== '' && $where['integral'][1] === '') { - $model = $model->where($userAlias . 'integral', '>', $where['integral'][0]); + $model = $model->where($userAlias . 'integral', '>=', $where['integral'][0]); } elseif ($where['integral'][0] === '' && $where['integral'][1] !== '') { - $model = $model->where($userAlias . 'integral', '<', $where['integral'][1]); + $model = $model->where($userAlias . 'integral', '<=', $where['integral'][1]); } }