Files
yycea/application/admin/job/SendMemberNotification.php
2026-03-17 09:56:06 +08:00

138 lines
4.8 KiB
PHP

<?php
// +----------------------------------------------------------------------
// | 麦沃德科技赋能开发者,助力商协会发展
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2024 www.wdsxh.cn All rights reserved.
// +----------------------------------------------------------------------
// | 沃德商协会系统并不是自由软件,不加密,并不代表开源,未经许可不可自由转售和商用
// +----------------------------------------------------------------------
// | Author: MY WORLD Team <bd@maiwd.cn> 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);
}
}
}