'array', 'audit_type' => 'integer', ]; // 审核类型常量 const AUDIT_TYPE_SINGLE = 1; // 单人审核 const AUDIT_TYPE_MULTIPLE = 2; // 多人审核 const AUDIT_TYPE_LEVEL = 3; // 分级审核 /** * 关联访问申请 */ public function visits() { return $this->hasMany(Visit::class, 'visit_area_id'); } /** * 获取审核类型文本 */ public function getAuditTypeTextAttribute() { $types = [ self::AUDIT_TYPE_SINGLE => '单人审核', self::AUDIT_TYPE_MULTIPLE => '多人审核', self::AUDIT_TYPE_LEVEL => '分级审核', ]; return $types[$this->audit_type] ?? '未知'; } /** * 获取审核人员列表 */ public function getAuditAdmins() { if (!$this->audit_admin) { return collect(); } $adminIds = array_column($this->audit_admin, 'admin_id'); return Admin::whereIn('id', $adminIds)->get(); } /** * 检查管理员是否有审核权限 */ public function canAudit($adminId) { if (!$this->audit_admin) { return false; } foreach ($this->audit_admin as $auditAdmin) { if (isset($auditAdmin['admin_id']) && $auditAdmin['admin_id'] == $adminId) { return true; } } return false; } /** * 获取审核流程 */ public function getAuditFlow() { if (!$this->audit_admin) { return []; } $flow = []; foreach ($this->audit_admin as $index => $auditAdmin) { $flow[] = [ 'level' => $index + 1, 'admin_id' => $auditAdmin['admin_id'] ?? 0, 'admin_name' => $auditAdmin['admin_name'] ?? '上级审核', 'is_superior' => ($auditAdmin['admin_id'] ?? 0) == 0, ]; } return $flow; } /** * 添加审核人员 */ public function addAuditAdmin($adminId, $adminName = null) { $auditAdmins = $this->audit_admin ?? []; // 检查是否已存在 foreach ($auditAdmins as $auditAdmin) { if (isset($auditAdmin['admin_id']) && $auditAdmin['admin_id'] == $adminId) { return false; } } $auditAdmins[] = [ 'admin_id' => $adminId, 'admin_name' => $adminName, ]; $this->audit_admin = $auditAdmins; $this->save(); return true; } /** * 移除审核人员 */ public function removeAuditAdmin($adminId) { if (!$this->audit_admin) { return false; } $auditAdmins = array_filter($this->audit_admin, function ($auditAdmin) use ($adminId) { return !isset($auditAdmin['admin_id']) || $auditAdmin['admin_id'] != $adminId; }); $this->audit_admin = array_values($auditAdmins); $this->save(); return true; } /** * 获取区域统计信息 */ public function getStatistics() { $visits = $this->visits(); return [ 'total_visits' => $visits->count(), 'pending_visits' => $visits->where('audit_status', Visit::AUDIT_STATUS_PENDING)->count(), 'approved_visits' => $visits->where('audit_status', Visit::AUDIT_STATUS_APPROVED)->count(), 'rejected_visits' => $visits->where('audit_status', Visit::AUDIT_STATUS_REJECTED)->count(), 'entered_visits' => $visits->where('audit_status', Visit::AUDIT_STATUS_ENTERED)->count(), 'left_visits' => $visits->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), 'audit_type' => $this->getAuditTypeTextAttribute(), 'audit_admin_count' => count($this->audit_admin ?? []), ]; } /** * 检查区域是否可用 */ public function isAvailable() { return !empty($this->name) && !empty($this->audit_type) && !empty($this->audit_admin); } }