master
cody 3 months ago
parent 7b07924ba2
commit d45e832207

@ -4,6 +4,7 @@ namespace App\Console\Commands;
use App\Models\BirthdayMessage; use App\Models\BirthdayMessage;
use App\Models\Config; use App\Models\Config;
use App\Models\EmailRecordUser;
use App\Models\User; use App\Models\User;
use App\Repositories\MeetRepository; use App\Repositories\MeetRepository;
use Illuminate\Console\Command; use Illuminate\Console\Command;
@ -56,42 +57,82 @@ class CheckBirthday extends Command
// 发送通知给用户 // 发送通知给用户
$smsSign = Config::getValueByKey('sms_sign') ?: ''; $smsSign = Config::getValueByKey('sms_sign') ?: '';
$userSuccessCount = 0; $userSmsSuccessCount = 0;
$userFailCount = 0; $userSmsFailCount = 0;
$userEmailSuccessCount = 0;
$userEmailFailCount = 0;
foreach ($users as $user) { foreach ($users as $user) {
// 检查用户是否有手机号 $username = $user->username ?: '校友';
if (empty($user->mobile)) { $hasMobile = !empty($user->mobile);
continue; $hasEmail = !empty($user->email);
// 发送短信
if ($hasMobile) {
// 获取随机短信模板
$smsMessage = BirthdayMessage::getRandomSmsMessage();
if ($smsMessage) {
// 替换用户名占位符
$smsContent = str_replace('{username}', $username, $smsMessage);
// 添加短信签名
$smsContent = $smsSign . $smsContent;
// 直接发送短信
$result = ymSms($user->mobile, $smsContent);
if ($result) {
$userSmsSuccessCount++;
$this->info("已向用户 {$username}({$user->mobile}) 发送生日祝福短信");
} else {
$userSmsFailCount++;
$this->error("向用户 {$username}({$user->mobile}) 发送短信失败");
}
}
} }
// 获取随机文案 // 发送邮件
$message = BirthdayMessage::getRandomMessage(); if ($hasEmail) {
if ($message) { // 获取随机邮件模板
// 替换用户名占位符 $emailTemplate = BirthdayMessage::getRandomEmailMessage();
$username = $user->username ?: '校友'; if ($emailTemplate) {
$content = str_replace('{username}', $username, $message); try {
// 准备变量数据
// 添加短信签名 $varData = [
$content = $smsSign . $content; 'username' => $username,
];
// 直接发送短信
$result = ymSms($user->mobile, $content); // 使用模板方法替换邮件标题和内容中的变量
if ($result) { $emailSubject = EmailRecordUser::template($emailTemplate['subject'], $varData);
$userSuccessCount++; $emailContent = EmailRecordUser::template($emailTemplate['content'], $varData);
$this->info("已向用户 {$user->username}({$user->mobile}) 发送生日祝福短信");
// 发送邮件
EmailRecordUser::email($emailSubject, $emailContent, $user->email);
$userEmailSuccessCount++;
$this->info("已向用户 {$username}({$user->email}) 发送生日祝福邮件");
} catch (\Exception $e) {
$userEmailFailCount++;
$this->error("向用户 {$username}({$user->email}) 发送邮件失败: " . $e->getMessage());
}
} else { } else {
$userFailCount++; $this->warn("未找到可用的邮件模板,跳过向用户 {$username}({$user->email}) 发送邮件");
$this->error("向用户 {$user->username}({$user->mobile}) 发送短信失败");
} }
} }
} }
if ($userSuccessCount > 0) { // 输出短信发送统计
$this->info("共向 {$userSuccessCount} 位用户发送生日祝福短信成功"); if ($userSmsSuccessCount > 0) {
$this->info("共向 {$userSmsSuccessCount} 位用户发送生日祝福短信成功");
}
if ($userSmsFailCount > 0) {
$this->error("共 {$userSmsFailCount} 位用户短信发送失败");
}
// 输出邮件发送统计
if ($userEmailSuccessCount > 0) {
$this->info("共向 {$userEmailSuccessCount} 位用户发送生日祝福邮件成功");
} }
if ($userFailCount > 0) { if ($userEmailFailCount > 0) {
$this->error("共 {$userFailCount} 位用户短信发送失败"); $this->error("共 {$userEmailFailCount} 位用户邮件发送失败");
} }
// 如果有生日用户,给管理员发送短信 // 如果有生日用户,给管理员发送短信

@ -6,7 +6,7 @@ class BirthdayMessage extends SoftDeletesModel
{ {
/** /**
* 随机获取一条启用的生日祝福文案 * 随机获取一条启用的生日祝福文案(短信模板)
* *
* @return string|null * @return string|null
*/ */
@ -18,5 +18,42 @@ class BirthdayMessage extends SoftDeletesModel
return $message ? $message->content : null; return $message ? $message->content : null;
} }
/**
* 随机获取一条启用的短信模板
*
* @return string|null
*/
public static function getRandomSmsMessage()
{
$message = self::where('status', 1)
->where('type', 1)
->inRandomOrder()
->first();
return $message ? $message->content : null;
}
/**
* 随机获取一条启用的邮件模板
*
* @return array|null 返回包含 subject 和 content 的数组,如果没有找到则返回 null
*/
public static function getRandomEmailMessage()
{
$message = self::where('status', 1)
->where('type', 2)
->inRandomOrder()
->first();
if (!$message) {
return null;
}
return [
'subject' => $message->email_subject ?: '生日快乐',
'content' => $message->content,
];
}
} }

@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('birthday_messages', function (Blueprint $table) {
// 添加模板类型字段1=短信模板2=邮件模板
$table->tinyInteger('type')->default(1)->after('id')->comment('模板类型1=短信模板2=邮件模板');
// 添加邮件标题字段(仅邮件模板使用)
$table->string('email_subject')->nullable()->after('content')->comment('邮件标题,支持{username}占位符');
});
// 将现有所有记录标记为短信模板type=1
DB::table('birthday_messages')->whereNull('type')->update(['type' => 1]);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('birthday_messages', function (Blueprint $table) {
$table->dropColumn(['type', 'email_subject']);
});
}
};
Loading…
Cancel
Save