|
|
7 meses atrás | |
|---|---|---|
| .. | ||
| README.md | 7 meses atrás | |
本目录包含通知模块的所有命令类,用于处理通知相关的命令行任务。
发送通知命令,用于手动发送通知。
class SendNotificationCommand extends Command
{
/**
* 命令名称
*
* @var string
*/
protected $signature = 'notification:send
{--template= : 通知模板ID}
{--type= : 通知类型}
{--channel= : 通知渠道}
{--title= : 通知标题}
{--content= : 通知内容}
{--data= : 通知数据(JSON)}
{--priority= : 优先级}
{--to= : 接收者(邮箱/手机号/设备令牌)}
{--user= : 用户ID}';
/**
* 命令描述
*
* @var string
*/
protected $description = '发送通知';
/**
* 通知服务
*
* @var NotificationService
*/
protected $notificationService;
/**
* 构造函数
*
* @param NotificationService $notificationService
*/
public function __construct(NotificationService $notificationService)
{
parent::__construct();
$this->notificationService = $notificationService;
}
/**
* 执行命令
*/
public function handle()
{
try {
// 1. 获取参数
$data = $this->getData();
// 2. 验证参数
if (!$this->validateData($data)) {
return;
}
// 3. 发送通知
$result = $this->notificationService->send($data);
// 4. 输出结果
if ($result['success']) {
$this->info('通知发送成功');
$this->info('通知ID: ' . $result['notification_id']);
} else {
$this->error('通知发送失败: ' . $result['message']);
}
} catch (\Exception $e) {
$this->error('命令执行失败: ' . $e->getMessage());
}
}
/**
* 获取参数数据
*
* @return array
*/
protected function getData()
{
$data = [
'template_id' => $this->option('template'),
'type' => $this->option('type'),
'channel' => $this->option('channel'),
'title' => $this->option('title'),
'content' => $this->option('content'),
'priority' => $this->option('priority'),
'user_id' => $this->option('user')
];
// 处理通知数据
if ($this->option('data')) {
$data['data'] = json_decode($this->option('data'), true);
}
// 处理接收者
$to = $this->option('to');
if ($to) {
switch ($data['channel']) {
case NotificationChannel::MAIL:
$data['to'] = $to;
break;
case NotificationChannel::SMS:
$data['phone'] = $to;
break;
case NotificationChannel::PUSH:
$data['device_token'] = $to;
break;
}
}
return $data;
}
/**
* 验证参数数据
*
* @param array $data
* @return bool
*/
protected function validateData(array $data)
{
$validator = new NotificationValidator();
if (!$validator->validate($data)) {
$this->error('参数验证失败:');
foreach ($validator->getErrors() as $field => $errors) {
$this->error("{$field}: " . implode(', ', $errors));
}
return false;
}
return true;
}
}
重试通知命令,用于重试失败的通知。
class RetryNotificationCommand extends Command
{
/**
* 命令名称
*
* @var string
*/
protected $signature = 'notification:retry
{--id= : 通知ID}
{--all : 重试所有失败的通知}';
/**
* 命令描述
*
* @var string
*/
protected $description = '重试失败的通知';
/**
* 通知服务
*
* @var NotificationService
*/
protected $notificationService;
/**
* 构造函数
*
* @param NotificationService $notificationService
*/
public function __construct(NotificationService $notificationService)
{
parent::__construct();
$this->notificationService = $notificationService;
}
/**
* 执行命令
*/
public function handle()
{
try {
if ($this->option('all')) {
$this->retryAll();
} else {
$this->retryOne();
}
} catch (\Exception $e) {
$this->error('命令执行失败: ' . $e->getMessage());
}
}
/**
* 重试单个通知
*/
protected function retryOne()
{
$id = $this->option('id');
if (!$id) {
$this->error('请指定通知ID');
return;
}
$result = $this->notificationService->retry($id);
if ($result['success']) {
$this->info('通知重试成功');
} else {
$this->error('通知重试失败: ' . $result['message']);
}
}
/**
* 重试所有失败的通知
*/
protected function retryAll()
{
$notifications = Notification::where('status', NotificationStatus::FAILED)
->where('retry_count', '<', config('notification.max_retry_count'))
->get();
$total = $notifications->count();
$success = 0;
$fail = 0;
$this->info("找到 {$total} 个失败通知");
foreach ($notifications as $notification) {
$result = $this->notificationService->retry($notification->id);
if ($result['success']) {
$success++;
} else {
$fail++;
}
}
$this->info("重试完成: 成功 {$success} 个, 失败 {$fail} 个");
}
}
# 发送邮件通知
php artisan notification:send \
--template=1 \
--type=system \
--channel=mail \
--title="测试通知" \
--content="这是一条测试通知" \
--data='{"name":"张三","amount":100}' \
--priority=2 \
--to=example@example.com \
--user=1
# 发送短信通知
php artisan notification:send \
--template=2 \
--type=user \
--channel=sms \
--title="验证码" \
--content="您的验证码是:123456" \
--data='{"code":"123456"}' \
--to=13800138000
# 发送推送通知
php artisan notification:send \
--template=3 \
--type=business \
--channel=push \
--title="订单通知" \
--content="您的订单已发货" \
--data='{"order_id":"123456"}' \
--to=device_token_123
# 重试单个通知
php artisan notification:retry --id=1
# 重试所有失败的通知
php artisan notification:retry --all