You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
4.2 KiB

<?php
namespace App\Models;
class VisitArea extends SoftDeletesModel
{
protected $table = 'visit_areas';
protected $casts = [
'audit_admin' => '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);
}
}