where('status', 'processing') ->where('started_at', '<', date('Y-m-d H:i:s', strtotime('-1 hour'))) ->update([ 'status' => 'failed', 'error_message' => '任务超时', 'updated_at' => date('Y-m-d H:i:s') ]); dLog('command')->info('开始同步任务中心状态...'); try { // 提前退出机制:没有排队(pending)或处理中(processing)的任务时直接返回 $pendingCount = MpTaskCenter::whereIn('status', [ MpTaskCenter::STATUS_PENDING, MpTaskCenter::STATUS_PROCESSING, ]) ->where('ref_task_id', '>', 0) ->count('id'); if ($pendingCount <= 0) { dLog('command')->info('任务中心没有待处理任务,直接返回'); return 0; } // 每5秒查询一轮结果,最大持续50秒 $timeStart = time(); $maxDuration = 50; $checkInterval = 10; $updated = 0; while (time() - $timeStart < $maxDuration) { $updated += $taskCenterService->syncTaskStatus(); // 本轮同步后重新统计,全部完成则提前退出 $pendingCount = MpTaskCenter::whereIn('status', [ MpTaskCenter::STATUS_PENDING, MpTaskCenter::STATUS_PROCESSING, ]) ->where('ref_task_id', '>', 0) ->count('id'); if ($pendingCount <= 0) { dLog('command')->info('任务中心任务已全部处理完成,提前退出'); break; } sleep($checkInterval); } dLog('command')->info('任务中心同步完成,更新记录数: ' . $updated); } catch (\Exception $e) { dLog('command')->error('任务中心同步失败: ' . $e->getMessage()); logDB('command', 'error', '任务中心同步失败', ['error' => $e->getMessage()]); return 1; } return 0; } }