# 拜访邮件通知功能实现总结 ## 实现内容 已成功将 `api/mobile/visit/visit-save` 方法中的短信通知改为邮件通知,并为admin数据表增加了邮箱字段。 ## 修改详情 ### 1. 数据库迁移 #### 新增邮箱字段迁移 (`2025_09_09_131331_add_email_to_admins_table.php`) ```php public function up() { Schema::table('admins', function (Blueprint $table) { $table->string('email')->nullable()->comment('邮箱地址'); }); } public function down() { Schema::table('admins', function (Blueprint $table) { $table->dropColumn('email'); }); } ``` ### 2. 邮件通知类 #### 创建专门的拜访邮件通知类 (`app/Notifications/VisitEmailNotify.php`) ```php class VisitEmailNotify extends Notification { protected $visitData; public function __construct($visitData) { $this->visitData = $visitData; } public function via($notifiable) { return ['mail']; } public function toMail($notifiable) { $visitData = $this->visitData; return (new MailMessage) ->subject(__('mobile.visit.email_subject', ['name' => $visitData['name']])) ->greeting(__('mobile.visit.email_greeting', ['admin_name' => $notifiable->name])) ->line(__('mobile.visit.email_content_line1', [ 'visitor_name' => $visitData['name'], 'visit_date' => $visitData['date'] ])) ->line(__('mobile.visit.email_content_line2', [ 'visitor_mobile' => $visitData['mobile'] ])) ->line(__('mobile.visit.email_content_line3', [ 'visit_reason' => $visitData['reason'] ?? __('mobile.visit.no_reason') ])) ->action(__('mobile.visit.email_action'), url('/admin/visits')) ->line(__('mobile.visit.email_footer')); } } ``` ### 3. 控制器修改 #### VisitController.php 中的 visitSave 方法 ```php // 修改前:短信通知 $vars = ['date' => $all['date'], 'name' => $all['name'], 'phone_number' => $all['mobile']]; $template_id = '5wReg1'; sms($acceptAdmin->mobile, $vars, $template_id); // 修改后:邮件通知 if ($acceptAdmin && $acceptAdmin->email) { $visitData = [ 'name' => $all['name'], 'date' => $all['date'], 'mobile' => $all['mobile'], 'reason' => $all['reason'] ?? null, ]; $acceptAdmin->notify(new VisitEmailNotify($visitData)); } ``` ### 4. 多语言支持 #### 中文语言文件 (`lang/zh-CN/mobile.php`) ```php 'visit' => [ // ... 其他翻译 'email_subject' => '新的拜访预约通知 - :name', 'email_greeting' => '您好 :admin_name,', 'email_content_line1' => '您有一个新的拜访预约,访客 :visitor_name 预约于 :visit_date 到访。', 'email_content_line2' => '访客联系电话::visitor_mobile', 'email_content_line3' => '拜访事由::visit_reason', 'email_action' => '查看详情', 'email_footer' => '请及时处理此拜访预约。', 'no_reason' => '无', ], ``` #### 英文语言文件 (`lang/en/mobile.php`) ```php 'visit' => [ // ... 其他翻译 'email_subject' => 'New Visit Appointment Notification - :name', 'email_greeting' => 'Hello :admin_name,', 'email_content_line1' => 'You have a new visit appointment. Visitor :visitor_name is scheduled to visit on :visit_date.', 'email_content_line2' => 'Visitor contact phone: :visitor_mobile', 'email_content_line3' => 'Visit reason: :visit_reason', 'email_action' => 'View Details', 'email_footer' => 'Please handle this visit appointment promptly.', 'no_reason' => 'None', ], ``` ### 5. 模型工厂 #### 为测试创建了必要的模型工厂 - `AdminFactory.php` - Admin模型工厂 - `DepartmentFactory.php` - Department模型工厂 - `VisitAreaFactory.php` - VisitArea模型工厂 #### 为模型添加了HasFactory trait - `Admin.php` - 添加了 `use HasFactory;` - `Department.php` - 添加了 `use HasFactory;` - `VisitArea.php` - 添加了 `use HasFactory;` ## 邮件内容示例 ### 中文邮件 ``` 主题:新的拜访预约通知 - 张三 您好 李管理员, 您有一个新的拜访预约,访客 张三 预约于 2024-01-15 到访。 访客联系电话:13800138000 拜访事由:商务洽谈 [查看详情] 按钮 请及时处理此拜访预约。 ``` ### 英文邮件 ``` Subject: New Visit Appointment Notification - John Hello Admin, You have a new visit appointment. Visitor John is scheduled to visit on 2024-01-15. Visitor contact phone: 13800138000 Visit reason: Business meeting [View Details] button Please handle this visit appointment promptly. ``` ## 功能特点 1. **多语言支持**: 根据系统语言设置自动切换邮件语言 2. **条件发送**: 只有当管理员有邮箱地址时才发送邮件 3. **详细信息**: 包含访客姓名、预约日期、联系电话、拜访事由等完整信息 4. **操作链接**: 提供直接跳转到管理后台的链接 5. **优雅降级**: 如果没有拜访事由,显示"无"或"None" ## 测试验证 创建了完整的测试用例验证邮件通知功能: ```php /** @test */ public function test_visit_email_notification_content() { // 设置中文语言环境 app()->setLocale('zh-CN'); $admin = Admin::factory()->create([ 'name' => '测试管理员', 'email' => 'test@example.com' ]); $visitData = [ 'name' => '测试访客', 'date' => '2024-01-15', 'mobile' => '13800138000', 'reason' => '商务洽谈', ]; $notification = new VisitEmailNotify($visitData); $mailMessage = $notification->toMail($admin); // 验证邮件内容 $this->assertStringContainsString('新的拜访预约通知', $mailMessage->subject); $this->assertStringContainsString('测试访客', $mailMessage->subject); // ... 其他验证 } ``` ## 优势 1. **更环保**: 邮件通知比短信更环保 2. **更丰富**: 邮件可以包含更多信息和格式 3. **更便宜**: 邮件发送成本通常比短信低 4. **更可靠**: 邮件服务通常比短信服务更稳定 5. **更灵活**: 邮件内容可以根据需要自定义格式 ## 总结 已成功将拜访预约的短信通知改为邮件通知,实现了: - ✅ admin表增加email字段 - ✅ 创建专门的邮件通知类 - ✅ 支持中英双语邮件内容 - ✅ 完整的测试覆盖 - ✅ 保持原有审核流程不变 现在当用户提交拜访预约时,系统会自动向被访管理员发送包含详细信息的邮件通知,提供更好的用户体验。