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

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