* @version : HUOSDK 8.0 */ namespace huoOrderRepeat\job; use huolib\queue\job\Fire; use huolib\status\OrderStatus; use huoOrderRepeat\constant\OrderRepeatConstant; use huoOrderRepeat\controller\OrderRepeat; use think\queue\Job; class RepeatFire extends Fire { /** * fire方法是消息队列默认调用的方法 * * @param Job $job 当前的任务对象 * @param array|mixed $data 发布任务时自定义的数据 */ public function fire(Job $job, $data) { $_is_job_done = $this->doJob($data); if ($_is_job_done) { /* 如果任务执行成功, 记得删除任务 */ $job->delete(); } else { $_limit_attempts = get_val($data, 'attempts', OrderRepeatConstant::JOB_REPEAT_MAX_CNT); $_attempts = $job->attempts(); if ($_attempts >= $_limit_attempts) { /* 任务达到最大次数则删除任务不再执行 */ $job->delete(); } else { /* 重新发布任务 */ switch ($_attempts) { case 1: $_delay = OrderRepeatConstant::JOB_ATTEMPTS_SECOND_TIME; break; case 2: $_delay = OrderRepeatConstant::JOB_ATTEMPTS_THIRD_TIME; break; case 3: $_delay = OrderRepeatConstant::JOB_ATTEMPTS_FOURTH_TIME; break; case 4: $_delay = OrderRepeatConstant::JOB_ATTEMPTS_FIFTH_TIME; break; default: $_delay = OrderRepeatConstant::JOB_ATTEMPTS_ONCE_TIME; } // \think\Log::error(['补单尝试次数及时间', $data, time(), $_attempts, $_delay]); $job->release($_delay); /* $_delay为延迟时间,表示该任务延迟$_delay秒后再执行 */ } } } /** * 根据消息中的数据进行实际的业务处理 * * @param array $data 发布任务时自定义的数据 * * @return bool 任务执行的结果 */ public function doJob($data) { $_order_id = isset($data['order_id']) ? $data['order_id'] : ''; if (empty($_order_id)) { /* order_id 为空认为执行成功,否则会重复入队列 */ return true; } $_rdata = (new OrderRepeat())->notify($data['order_id']); $_code = $_rdata['code']; switch ($_code) { /* 成功、订单号为空、订单不存在的认为不需要再次执行 */ case OrderStatus::NO_ERROR: case OrderStatus::ORDER_ID_EMPTY: case OrderStatus::ORDER_NOT_PAY: return true; break; default: return false; } } }