www.maiwd.cn // +---------------------------------------------------------------------- namespace app\admin\job; use addons\wdsxh\library\AlibabaCloudSms; use app\admin\model\wdsxh\Member; use app\admin\model\wdsxh\message\MemberNotification; use think\queue\Job; /** * 发送会员消息通知队列任务 */ class SendMemberNotification { /** * 执行任务 * @param Job $job 任务对象 * @param array $data 任务数据 * @return void */ public function fire(Job $job, $data) { // 检查任务是否已经执行过3次 if ($job->attempts() > 3) { // 任务失败,删除任务 $job->delete(); return; } try { // 获取任务数据 $notificationId = isset($data['notification_id']) ? $data['notification_id'] : 0; $memberId = isset($data['member_id']) ? $data['member_id'] : 0; $title = isset($data['title']) ? $data['title'] : ''; $content = isset($data['content']) ? $data['content'] : ''; if (!$notificationId || !$memberId || !$title || !$content) { // 数据不完整,删除任务 $job->delete(); return; } // 检查是否已经发送过 $exists = MemberNotification::where('notification_id', $notificationId) ->where('member_id', $memberId) ->find(); if ($exists) { // 已经发送过,删除任务 $job->delete(); return; } // 创建会员消息通知记录 $memberNotification = new MemberNotification(); $memberNotification->notification_id = $notificationId; $memberNotification->member_id = $memberId; $memberNotification->is_read = 0; $memberNotification->createtime = time(); $result = $memberNotification->save(); if ($result) { $memberObj = (new Member())->where('id', $memberId)->find(); $this->notify_members($memberObj['mobile'],$memberObj['name']); // 任务执行成功,删除任务 $job->delete(); } else { // 任务执行失败,重新放入队列 if ($job->attempts() <= 3) { // 5秒后重试 $job->release(5); } else { // 超过重试次数,删除任务 $job->delete(); } } } catch (\Exception $e) { // 记录错误日志 // 任务执行失败,重新放入队列 if ($job->attempts() <= 3) { // 5秒后重试 $job->release(5); } else { // 超过重试次数,删除任务 $job->delete(); } } } /** * 任务失败回调 * @param array $data 任务数据 * @return void */ public function failed($data) { // 任务失败后的处理 \think\Log::error('会员消息通知任务最终失败: ' . json_encode($data)); } private function notify_members($phoneNumbers,$member_name) { $configObj = (new \app\admin\model\wdsxh\Config())->where('id', 1)->find(); if (!empty($configObj['alibaba_cloud_sign_name']) && !empty($configObj['alibaba_cloud_access_key_id']) && !empty($configObj['alibaba_cloud_access_key_secret']) && !empty($configObj['alibaba_notify_members']) && !empty($phoneNumbers) ) { $member_name = preg_replace('/[^\x{4e00}-\x{9fa5}]/u', '',$member_name); if (empty($member_name)) { $member_name = '用户'; } $userSendSmsRequestParam = [ "phoneNumbers" => $phoneNumbers, "templateCode" => $configObj['alibaba_notify_members'], "templateParam" => "{'name':'$member_name'}" ]; AlibabaCloudSms::main($userSendSmsRequestParam); } } }