94 行
3.2 KiB
PHP
94 行
3.2 KiB
PHP
<?php
|
|
|
|
namespace addons\shopro\service\partner;
|
|
|
|
use app\admin\model\shopro\order\Order as OrderModel;
|
|
|
|
/**
|
|
* 30 日活跃:含今天共 N 个自然日有本人合格订单
|
|
*/
|
|
class ActiveService
|
|
{
|
|
public function windowStart($endTime = null)
|
|
{
|
|
$days = PartnerConfig::activeDays();
|
|
$end = $endTime ?: time();
|
|
$endDay = strtotime(date('Y-m-d 00:00:00', $end));
|
|
return $endDay - ($days - 1) * 86400;
|
|
}
|
|
|
|
public function isActive($agent, $atTime = null)
|
|
{
|
|
if (!$agent) {
|
|
return false;
|
|
}
|
|
$last = is_array($agent) ? ($agent['last_self_order_time'] ?? null) : ($agent->last_self_order_time ?? null);
|
|
$userId = is_array($agent) ? ($agent['user_id'] ?? 0) : ($agent->user_id ?? 0);
|
|
$at = $atTime ?: time();
|
|
$start = $this->windowStart($at);
|
|
|
|
if ($last) {
|
|
return intval($last) >= $start;
|
|
}
|
|
if (!$userId) {
|
|
return false;
|
|
}
|
|
return $this->hasQualifiedOrder($userId, $start, $at);
|
|
}
|
|
|
|
public function hasQualifiedOrder($userId, $start, $end)
|
|
{
|
|
$order = OrderModel::where('user_id', $userId)
|
|
->where('type', '<>', 'score')
|
|
->where('pay_fee', '>', 0)
|
|
->paid()
|
|
->where('paid_time', '>=', $start)
|
|
->where('paid_time', '<=', $end)
|
|
->find();
|
|
return (bool) $order;
|
|
}
|
|
|
|
public function activeUserIds($start, $end, $extraWhere = [])
|
|
{
|
|
$createBaseQuery = function () use ($extraWhere) {
|
|
$q = \think\Db::name('shopro_commission_agent')
|
|
->where('status', 'in', ['normal', 'freeze'])
|
|
->where('level', '>=', 1);
|
|
foreach ($extraWhere as $field => $value) {
|
|
$q->where($field, $value);
|
|
}
|
|
return $q;
|
|
};
|
|
|
|
// 1. 优先通过 last_self_order_time 索引快速命中
|
|
$hitUserIds = $createBaseQuery()->where(function ($q) use ($start, $end) {
|
|
$q->where('last_self_order_time', '>=', $start)
|
|
->where('last_self_order_time', '<=', $end);
|
|
})->column('user_id');
|
|
|
|
// 2. 容错:查找 last_self_order_time 为空或为 0 的代理商
|
|
$nullUserIds = $createBaseQuery()->where(function ($q) {
|
|
$q->whereNull('last_self_order_time')->whereOr('last_self_order_time', 0);
|
|
})->column('user_id');
|
|
|
|
if (!empty($nullUserIds)) {
|
|
$orderHits = \think\Db::name('shopro_order')
|
|
->whereIn('user_id', $nullUserIds)
|
|
->where('type', '<>', 'score')
|
|
->where('pay_fee', '>', 0)
|
|
->whereIn('status', ['paid', 'completed'])
|
|
->where('paid_time', '>=', $start)
|
|
->where('paid_time', '<=', $end)
|
|
->group('user_id')
|
|
->column('max(paid_time)', 'user_id');
|
|
|
|
foreach ($orderHits as $uId => $lastTime) {
|
|
\think\Db::name('shopro_commission_agent')->where('user_id', $uId)->update(['last_self_order_time' => $lastTime]);
|
|
$hitUserIds[] = intval($uId);
|
|
}
|
|
}
|
|
|
|
return array_values(array_unique(array_map('intval', $hitUserIds)));
|
|
}
|
|
}
|