1
This commit is contained in:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user