'integer', 'level' => 'boolean', ]; // 审核状态常量 const STATUS_PENDING = 0; // 待审核 const STATUS_APPROVED = 1; // 通过 const STATUS_REJECTED = 2; // 驳回 /** * 关联访问申请 */ public function visit() { return $this->belongsTo(Visit::class, 'visit_id'); } /** * 关联审核人员 */ public function auditAdmin() { return $this->belongsTo(Admin::class, 'audit_admin_id'); } /** * 获取审核状态文本 */ public function getStatusTextAttribute() { $statuses = [ self::STATUS_PENDING => '待审核', self::STATUS_APPROVED => '通过', self::STATUS_REJECTED => '驳回', ]; return $statuses[$this->status] ?? '未知'; } /** * 获取审核等级文本 */ public function getLevelTextAttribute() { return $this->level ? '高级审核' : '普通审核'; } /** * 检查是否可以审核 */ public function canAudit($adminId) { // 检查审核权限 if ($this->audit_admin_id != $adminId) { return false; } // 检查状态 if ($this->status != self::STATUS_PENDING) { return false; } return true; } /** * 执行审核 */ public function performAudit($status, $reason = null, $adminId = null) { if (!$this->canAudit($adminId)) { throw new \Exception('无权限审核或状态不允许'); } $this->status = $status; $this->reason = $reason; $this->save(); // 更新访问申请状态 $visit = $this->visit; if ($visit) { if ($status == self::STATUS_APPROVED) { $visit->audit_status = Visit::AUDIT_STATUS_APPROVED; } elseif ($status == self::STATUS_REJECTED) { $visit->audit_status = Visit::AUDIT_STATUS_REJECTED; } $visit->save(); } return $this; } /** * 邮件通知下一个审核人 */ public static function smsNextAudit($visit, $nowVisitAuditLevel = -1) { // 获取下一个审核人 $nextAuditAdmin = null; if ($nowVisitAuditLevel == -1) { // 通知第一个审核人 $adminId = VisitAudit::where('visit_id', $visit->id)->orderBy('level', 'asc')->value('audit_admin_id'); } else { $adminId = VisitAudit::where('visit_id', $visit->id) ->where('level', '>', $nowVisitAuditLevel) ->orderBy('level', 'asc') ->value('audit_admin_id'); } if (empty($adminId)) { return false; } $nextAuditAdmin = Admin::find($adminId); if (!$nextAuditAdmin || !$nextAuditAdmin->email) { return false; } // 准备邮件数据 $visitData = [ 'name' => $visit->name, 'date' => $visit->date, 'mobile' => $visit->mobile, 'reason' => $visit->reason ?? null, ]; // 如果不是第一个审核人,添加上一级审核人信息 if ($nowVisitAuditLevel != -1) { $previousAdmin = Admin::where('id', $visit->accept_admin_id)->value('name'); $visitData['previous_admin'] = $previousAdmin; } // 发送邮件通知 $isFirstAudit = ($nowVisitAuditLevel == -1); $nextAuditAdmin->notify(new \App\Notifications\AuditEmailNotify($visitData, $isFirstAudit)); return true; } }