This commit is contained in:
wangjinlei
2026-04-16 13:30:31 +08:00
parent a2338340f6
commit ae221e6be6
8 changed files with 838 additions and 91 deletions

View File

@@ -205,13 +205,13 @@ class PromotionService
$failed++;
continue;
}else{
$expert_fields = Db::name('expert_fields')->where('expert_id', $expert['expert_id'])->select();
$expert_fields = Db::name('expert_field')->where('expert_id', $expert['expert_id'])->select();
$field_str = '';
foreach ($expert_fields as $field){
if($field_str != ''){
$field_str .= ','.$field['field_name'];
$field_str .= ','.$field['field'];
}else{
$field_str = $field['field_name'];
$field_str = $field['field'];
}
}
$expert['fields'] = $field_str;
@@ -255,8 +255,11 @@ class PromotionService
/**
* 为指定日期的任务批量预生成邮件(供定时任务调用,如每天 22:00 准备明天的)
*
* 每个 task 通过队列异步执行 prepareTask避免条目过多时 HTTP 请求超时。
*
* @param string $date Y-m-d如 2026-03-12
* @return array ['tasks' => int, 'prepared' => int, 'failed' => int, 'details' => []]
* @return array ['tasks' => int, 'task_ids' => int[]]
*/
public function prepareTasksForDate($date)
{
@@ -265,32 +268,34 @@ class PromotionService
->where('state', 0)
->select();
$totalPrepared = 0;
$totalFailed = 0;
$details = [];
$taskIds = [];
foreach ($tasks as $task) {
$ret = $this->prepareTask($task['task_id']);
$totalPrepared += $ret['prepared'];
$totalFailed += $ret['failed'];
$details[] = [
'task_id' => $task['task_id'],
'task_name' => $task['task_name'],
'prepared' => $ret['prepared'],
'failed' => $ret['failed'],
'error' => $ret['error'],
];
$this->enqueuePrepareTask($task['task_id']);
$taskIds[] = $task['task_id'];
}
$this->log("prepareTasksForDate date={$date} tasks=" . count($tasks) . " prepared={$totalPrepared} failed={$totalFailed}");
$this->log("prepareTasksForDate date={$date} tasks=" . count($tasks) . " queued task_ids=" . implode(',', $taskIds));
return [
'tasks' => count($tasks),
'prepared' => $totalPrepared,
'failed' => $totalFailed,
'details' => $details,
'task_ids' => $taskIds,
];
}
/**
* 将单个 task 的 prepare 推入队列异步执行
*/
public function enqueuePrepareTask($taskId, $delay = 0)
{
$jobClass = 'app\api\job\PromotionPrepare@fire';
$data = ['task_id' => intval($taskId)];
if ($delay > 0) {
Queue::later($delay, $jobClass, $data, 'promotion');
} else {
Queue::push($jobClass, $data, 'promotion');
}
}
/**
* 触发指定日期的已准备任务开始发送(供定时任务调用,如每天 8:00 触发今天的)
* 会先对 send_date=date 且 state=0 的任务做一次补准备,再启动所有 state=5 的任务
@@ -299,13 +304,13 @@ class PromotionService
*/
public function startTasksForDate($date)
{
// 补准备:当天日期但尚未准备的任务(如 22:00 后创建)
// 补准备:当天日期但尚未准备的任务(如 22:00 后创建),推队列异步执行
$catchUpTasks = Db::name('promotion_task')
->where('send_date', $date)
->where('state', 0)
->select();
foreach ($catchUpTasks as $t) {
$this->prepareTask($t['task_id']);
$this->enqueuePrepareTask($t['task_id']);
}
$tasks = Db::name('promotion_task')