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.
148 lines
3.7 KiB
148 lines
3.7 KiB
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
class VisitAudit extends SoftDeletesModel
|
|
{
|
|
protected $table = 'visit_audits';
|
|
|
|
protected $casts = [
|
|
'status' => '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;
|
|
}
|
|
}
|