'array', 'car_no' => 'array', 'created_at' => 'datetime', 'updated_at' => 'datetime', ]; // 扫码类型常量 const TYPE_ENTER = 'enter'; // 进厂 const TYPE_LEAVE = 'leave'; // 离厂 const TYPE_CHECK = 'check'; // 检查 /** * 关联管理员 */ public function admin() { return $this->belongsTo(Admin::class, 'admin_id'); } /** * 关联访问申请 */ public function visit() { return $this->belongsTo(Visit::class, 'code', 'code'); } /** * 记录门岗扫码 */ public static function logScan($code, $type, $remark = null, $adminId = null, $personNo = null, $carNo = null) { return self::create([ 'code' => $code, 'admin_id' => $adminId, 'remark' => $remark, 'person_no' => $personNo, 'car_no' => $carNo, 'created_at' => now(), 'updated_at' => now(), ]); } /** * 记录进厂扫码 */ public static function logEnter($code, $remark = null, $adminId = null, $personNo = null, $carNo = null) { return self::logScan($code, self::TYPE_ENTER, $remark, $adminId, $personNo, $carNo); } /** * 记录离厂扫码 */ public static function logLeave($code, $remark = null, $adminId = null, $personNo = null, $carNo = null) { return self::logScan($code, self::TYPE_LEAVE, $remark, $adminId, $personNo, $carNo); } /** * 记录检查扫码 */ public static function logCheck($code, $remark = null, $adminId = null, $personNo = null, $carNo = null) { return self::logScan($code, self::TYPE_CHECK, $remark, $adminId, $personNo, $carNo); } /** * 获取扫码类型文本 */ public function getTypeTextAttribute() { $types = [ self::TYPE_ENTER => '进厂', self::TYPE_LEAVE => '离厂', self::TYPE_CHECK => '检查', ]; return $types[$this->remark] ?? '未知'; } /** * 获取操作人信息 */ public function getOperatorAttribute() { return $this->admin ? $this->admin->name : '系统'; } /** * 获取人牌信息 */ public function getPersonNosAttribute() { if (!$this->person_no) { return []; } return is_array($this->person_no) ? $this->person_no : [$this->person_no]; } /** * 获取车牌信息 */ public function getCarNosAttribute() { if (!$this->car_no) { return []; } return is_array($this->car_no) ? $this->car_no : [$this->car_no]; } /** * 检查二维码是否有效 */ public function isValidCode() { return $this->visit && $this->visit->audit_status == Visit::AUDIT_STATUS_APPROVED; } /** * 获取门岗记录统计 */ public static function getStatistics($startDate = null, $endDate = null) { $query = self::query(); if ($startDate) { $query->where('created_at', '>=', $startDate); } if ($endDate) { $query->where('created_at', '<=', $endDate); } $total = $query->count(); $today = self::whereDate('created_at', today())->count(); $thisWeek = self::whereBetween('created_at', [ now()->startOfWeek(), now()->endOfWeek() ])->count(); $thisMonth = self::whereMonth('created_at', now()->month)->count(); // 按类型统计 $enterCount = self::where('remark', self::TYPE_ENTER)->count(); $leaveCount = self::where('remark', self::TYPE_LEAVE)->count(); $checkCount = self::where('remark', self::TYPE_CHECK)->count(); return [ 'total' => $total, 'today' => $today, 'this_week' => $thisWeek, 'this_month' => $thisMonth, 'enter_count' => $enterCount, 'leave_count' => $leaveCount, 'check_count' => $checkCount, ]; } /** * 获取访问申请的门岗记录 */ public static function getVisitGateLogs($visitId) { $visit = Visit::find($visitId); if (!$visit || !$visit->code) { return collect(); } return self::where('code', $visit->code) ->with(['admin']) ->orderBy('created_at', 'desc') ->get(); } /** * 获取今日门岗记录 */ public static function getTodayLogs() { return self::whereDate('created_at', today()) ->with(['admin', 'visit']) ->orderBy('created_at', 'desc') ->get(); } /** * 获取未离厂的记录 */ public static function getNotLeftLogs() { $enterLogs = self::where('remark', self::TYPE_ENTER) ->whereDate('created_at', today()) ->get(); $leaveLogs = self::where('remark', self::TYPE_LEAVE) ->whereDate('created_at', today()) ->pluck('code') ->toArray(); return $enterLogs->filter(function ($log) use ($leaveLogs) { return !in_array($log->code, $leaveLogs); }); } /** * 检查访问申请是否已进厂 */ public static function hasEntered($code) { return self::where('code', $code) ->where('remark', self::TYPE_ENTER) ->whereDate('created_at', today()) ->exists(); } /** * 检查访问申请是否已离厂 */ public static function hasLeft($code) { return self::where('code', $code) ->where('remark', self::TYPE_LEAVE) ->whereDate('created_at', today()) ->exists(); } /** * 获取门岗记录详情 */ public function getDetails() { return [ 'id' => $this->id, 'code' => $this->code, 'type' => $this->getTypeTextAttribute(), 'operator' => $this->getOperatorAttribute(), 'remark' => $this->remark, 'person_nos' => $this->getPersonNosAttribute(), 'car_nos' => $this->getCarNosAttribute(), 'created_at' => $this->created_at->format('Y-m-d H:i:s'), 'visit_info' => $this->visit ? [ 'id' => $this->visit->id, 'name' => $this->visit->name, 'mobile' => $this->visit->mobile, 'company_name' => $this->visit->company_name, 'type' => $this->visit->getTypeTextAttribute(), ] : null, ]; } /** * 清理过期记录 */ public static function cleanExpiredLogs($days = 90) { $expiredDate = now()->subDays($days); return self::where('created_at', '<', $expiredDate)->delete(); } }