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.

257 lines
6.3 KiB

11 months ago
<?php
namespace App\Models;
class Visit extends SoftDeletesModel
{
protected $table = 'visits';
protected $casts = [
'follw_people' => 'array',
'cars' => 'array',
'file' => 'array',
11 months ago
'vehicle_images' => 'array',
'meal_preferences' => 'array',
11 months ago
'date' => 'date',
'start_date' => 'date',
'end_date' => 'date',
'work_start_time' => 'date',
'work_end_time' => 'date',
'credent' => 'boolean',
'long_time' => 'boolean',
'audit_status' => 'integer',
11 months ago
'need_meal' => 'boolean',
11 months ago
];
// 访问类型常量
const TYPE_VISITOR = 1; // 访客
const TYPE_VISITOR_CAR = 2; // 访客车辆
const TYPE_LOGISTICS_CAR = 3; // 物流车辆
// 审核状态常量
const AUDIT_STATUS_PENDING_STUDY = -1; // 待学习
const AUDIT_STATUS_PENDING = 0; // 待审核
const AUDIT_STATUS_APPROVED = 1; // 通过(待进厂)
const AUDIT_STATUS_REJECTED = 2; // 驳回
const AUDIT_STATUS_ENTERED = 3; // 已进厂
const AUDIT_STATUS_LEFT = 4; // 已离厂
// 证件类型常量
const CREDENT_ID_CARD = 1; // 身份证
const CREDENT_PASSPORT = 2; // 护照
11 months ago
// 用餐类型常量
const MEAL_TYPE_BREAKFAST = 1; // 早餐
const MEAL_TYPE_LUNCH = 2; // 午餐
const MEAL_TYPE_DINNER = 3; // 晚餐
const MEAL_TYPE_ALL_DAY = 4; // 全天
11 months ago
/**
* 关联访问区域
*/
public function visitArea()
{
return $this->belongsTo(VisitArea::class, 'visit_area_id');
}
/**
* 关联访问时段
*/
public function visitTime()
{
return $this->belongsTo(VisitTime::class, 'visit_time_id');
}
/**
* 关联接待部门
*/
public function acceptDepartment()
{
return $this->belongsTo(Department::class, 'accpet_department_id');
}
/**
* 关联接待人员
*/
public function acceptAdmin()
{
return $this->belongsTo(Admin::class, 'accept_admin_id');
}
/**
* 关联收货人
*/
public function acceptGoodsAdmin()
{
return $this->belongsTo(Admin::class, 'accept_goods_admin_id');
}
/**
* 关联陪同人
*/
public function accompany()
{
return $this->belongsTo(Admin::class, 'accompany_id');
}
/**
* 关联用户
*/
public function user()
{
return $this->belongsTo(User::class, 'user_id');
}
/**
* 关联审核记录
*/
public function visitAudits()
{
return $this->hasMany(VisitAudit::class, 'visit_id');
}
/**
* 关联访问日志
*/
public function logs()
{
return $this->hasMany(VisitLog::class, 'visit_id');
}
11 months ago
/**
* 关联签字图片(单文件)
*/
public function acceptAdminSign()
{
return $this->belongsTo(Upload::class, 'accept_admin_sign');
}
/**
* 获取附件文件列表(多文件)
*/
public function getFilesAttribute()
{
if (!$this->attributes['file']) {
return collect([]);
}
$files = json_decode($this->attributes['file'], true);
if (!$files) {
return collect([]);
}
return Upload::whereIn('id', $files)->get();
}
/**
* 获取货车图片列表(多文件)
*/
public function getVehicleImagesAttribute()
{
if (!$this->attributes['vehicle_images']) {
return collect([]);
}
$vehicleImages = json_decode($this->attributes['vehicle_images'], true);
if (!$vehicleImages) {
return collect([]);
}
return Upload::whereIn('id', $vehicleImages)->get();
}
11 months ago
/**
* 获取访问类型文本
*/
public function getTypeTextAttribute()
{
$types = [
self::TYPE_VISITOR => '访客',
self::TYPE_VISITOR_CAR => '访客车辆',
self::TYPE_LOGISTICS_CAR => '物流车辆',
];
return $types[$this->type] ?? '未知';
}
/**
* 获取审核状态文本
*/
public function getAuditStatusTextAttribute()
{
$statuses = [
self::AUDIT_STATUS_PENDING_STUDY => '待学习',
self::AUDIT_STATUS_PENDING => '待审核',
self::AUDIT_STATUS_APPROVED => '通过(待进厂)',
self::AUDIT_STATUS_REJECTED => '驳回',
self::AUDIT_STATUS_ENTERED => '已进厂',
self::AUDIT_STATUS_LEFT => '已离厂',
];
return $statuses[$this->audit_status] ?? '未知';
}
/**
* 获取证件类型文本
*/
public function getCredentTextAttribute()
{
$credents = [
self::CREDENT_ID_CARD => '身份证',
self::CREDENT_PASSPORT => '护照',
];
return $credents[$this->credent] ?? '未知';
}
11 months ago
/**
* 获取用餐类型文本
*/
public function getMealTypeTextAttribute()
{
$mealTypes = [
self::MEAL_TYPE_BREAKFAST => '早餐',
self::MEAL_TYPE_LUNCH => '午餐',
self::MEAL_TYPE_DINNER => '晚餐',
self::MEAL_TYPE_ALL_DAY => '全天',
];
return $mealTypes[$this->meal_type] ?? '未知';
}
11 months ago
/**
* 检查是否在黑名单中
*/
public function isInBlacklist()
{
return Blacklist::where('mobile', $this->mobile)
->orWhere('idcard', $this->idcard)
->where('status', 1)
->where(function ($query) {
$query->whereNull('start_date')
->orWhere('start_date', '<=', now());
})
->where(function ($query) {
$query->whereNull('end_date')
->orWhere('end_date', '>=', now());
})
->exists();
}
/**
* 生成访问编号
*/
public static function generateCode()
{
$prefix = 'V' . date('Ymd');
$lastVisit = self::where('code', 'like', $prefix . '%')
->orderBy('code', 'desc')
->first();
if ($lastVisit) {
$lastNumber = intval(substr($lastVisit->code, -4));
$newNumber = $lastNumber + 1;
} else {
$newNumber = 1;
}
return $prefix . str_pad($newNumber, 4, '0', STR_PAD_LEFT);
}
}