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
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);
|
|
}
|
|
}
|