From 872bcd397b5d8b81e92d1d5d07835336da616350 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 09:58:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Mobile/VisitController.php | 98 +++++++++---------- app/Models/VisitAudit.php | 35 ++++++- app/Notifications/CancelEmailNotify.php | 56 +++++++++++ 3 files changed, 138 insertions(+), 51 deletions(-) create mode 100644 app/Notifications/CancelEmailNotify.php diff --git a/app/Http/Controllers/Mobile/VisitController.php b/app/Http/Controllers/Mobile/VisitController.php index 1437545..d3d75fe 100644 --- a/app/Http/Controllers/Mobile/VisitController.php +++ b/app/Http/Controllers/Mobile/VisitController.php @@ -82,65 +82,63 @@ class VisitController extends CommonController try { if (isset($all['id'])) { $model = Visit::find($all['id']); + $model->fill($all); + $model->save(); + VisitLog::add('', $this->getUser(), $model->id, isset($all['id']) ? '更新拜访记录' : '新增拜访记录'); + DB::commit(); + // 当状态为取消(status=5)时,给被访人发送取消邮件 + if (isset($all['audit_status']) && $all['audit_status'] == Visit::AUDIT_STATUS_CANCELLED) { + VisitAudit::emailCancelNotify($model); + } } else { + // 新增拜访 $model = new Visit(); $all['user_id'] = $this->getUserId(); $all['code'] = randStr(6, true); - } - $model->fill($all); - $model->save(); - // 创建时候审核流程写入 - // 被访问做第一级审核 - VisitAudit::create([ - 'visit_id' => $model->id, - 'audit_admin_id' => $all['accompany_id'], - 'status' => 0, - 'level' => 0 - ]); - $area = VisitArea::find($all['visit_area_id']); - if ($area->audit_admin && !isset($all['id'])) { - // 其他按设置审核 - $audit_admin = collect($area->audit_admin)->sortBy('level'); - foreach ($audit_admin as $key => $item) { - if (empty($item['admin_id'])) { - // 上级审核 - $admin = Admin::find($all['accept_admin_id']); - if (empty($admin->department_id)) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '接待人部门不存在']); + $model->fill($all); + $model->save(); + // 创建时候审核流程写入 + // 被访问做第一级审核 + VisitAudit::create([ + 'visit_id' => $model->id, + 'audit_admin_id' => $all['accompany_id'], + 'status' => 0, + 'level' => 0 + ]); + $area = VisitArea::find($all['visit_area_id']); + if ($area->audit_admin && !isset($all['id'])) { + // 其他按设置审核 + $audit_admin = collect($area->audit_admin)->sortBy('level'); + foreach ($audit_admin as $key => $item) { + if (empty($item['admin_id'])) { + // 上级审核 + $admin = Admin::find($all['accept_admin_id']); + if (empty($admin->department_id)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '接待人部门不存在']); + } + $department = Department::find($admin->department_id); + if (empty($department->manager_id)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '接待人部门不存在负责人']); + } + $item['admin_id'] = $department->manager_id; } - $department = Department::find($admin->department_id); - if (empty($department->manager_id)) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '接待人部门不存在负责人']); + // 判断不能重复 + if ($item['admin_id'] == $all['accept_admin_id']) { + continue; } - $item['admin_id'] = $department->manager_id; + VisitAudit::create([ + 'visit_id' => $model->id, + 'audit_admin_id' => $item['admin_id'], + 'status' => 0, + 'level' => $item['level'] + 1 + ]); } - // 判断不能重复 - if ($item['admin_id'] == $all['accept_admin_id']) { - continue; - } - VisitAudit::create([ - 'visit_id' => $model->id, - 'audit_admin_id' => $item['admin_id'], - 'status' => 0, - 'level' => $item['level'] + 1 - ]); } + VisitLog::add('', $this->getUser(), $model->id, isset($all['id']) ? '更新拜访记录' : '新增拜访记录'); + DB::commit(); + // 邮件通知第一个审核人 + VisitAudit::emailNextAudit($model, -1); } - VisitLog::add('', $this->getUser(), $model->id, isset($all['id']) ? '更新拜访记录' : '新增拜访记录'); - - // 被访人信息 - $acceptAdmin = Admin::find($all['accept_admin_id']); - // 邮件通知被访人 - $visitData = [ - 'date' => $all['date'], - 'name' => $all['name'], - 'mobile' => $all['mobile'], - 'reason' => $all['reason'] ?? '' - ]; - $acceptAdmin->notify(new VisitEmailNotify($visitData)); - // 邮件通知第一个审核人 - VisitAudit::emailNextAudit($model, -1); - DB::commit(); return $this->success('更新成功'); } catch (\Exception $exception) { DB::rollBack(); diff --git a/app/Models/VisitAudit.php b/app/Models/VisitAudit.php index b00e1a7..371bb45 100644 --- a/app/Models/VisitAudit.php +++ b/app/Models/VisitAudit.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Notifications\AuditEmailNotify; +use App\Notifications\CancelEmailNotify; class VisitAudit extends SoftDeletesModel { @@ -19,7 +20,7 @@ class VisitAudit extends SoftDeletesModel } /** - * 邮件通知下一个审核人 + * 邮件通知下一个审核人审核 */ public static function emailNextAudit($visit, $nowVisitAuditLevel = -1) { @@ -71,4 +72,36 @@ class VisitAudit extends SoftDeletesModel return true; } + /** + * 邮件通知被访人拜访已取消 + */ + public static function emailCancelNotify($visit) + { + // 获取被访人(第一个审核人,level最小的) + $admin = Admin::where('id', function ($query) use ($visit) { + $query->select('audit_admin_id') + ->from('visit_audits') + ->where('visit_id', $visit->id) + ->orderBy('level', 'asc') + ->limit(1); + })->first(); + + if (empty($admin)) { + return false; + } + + // 准备邮件数据 + $visitData = [ + 'date' => $visit->date, + 'name' => $visit->name, + 'mobile' => $visit->mobile, + 'reason' => $visit->reason ?? '' + ]; + + // 发送取消邮件通知 + $admin->notify(new CancelEmailNotify($visitData)); + + return true; + } + } diff --git a/app/Notifications/CancelEmailNotify.php b/app/Notifications/CancelEmailNotify.php new file mode 100644 index 0000000..03cb2b2 --- /dev/null +++ b/app/Notifications/CancelEmailNotify.php @@ -0,0 +1,56 @@ +visitData = $visitData; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + $visitData = $this->visitData; + + return (new MailMessage) + ->subject('拜访预约取消通知 - ' . $visitData['name']) + ->greeting('您好 ' . $notifiable->name . ',') + ->line('访客 ' . $visitData['name'] . ' 原预约于 ' . $visitData['date'] . ' 的拜访已取消。') + ->line('访客联系电话:' . $visitData['mobile']) + ->line('拜访事由:' . ($visitData['reason'] ?? '无')) + ->line('如有疑问,请联系访客确认。'); + } +} +