138 lines
4.8 KiB
PHP
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);
|
|
}
|
|
}
|
|
}
|