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.

226 lines
11 KiB

3 years ago
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Admin;
use App\Models\Blacklist;
use App\Models\GateLog;
use App\Models\Role;
use App\Models\Visit;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use App\Helpers\ResponseCode;
7 days ago
use Illuminate\Support\Carbon;
use Rap2hpoutre\FastExcel\FastExcel;
3 years ago
/**
* 门岗
*/
class GateController extends CommonController
{
/**
* @OA\Get(
* path="/api/admin/gate/user-list",
* tags={"门岗-门岗人列表"},
* summary="列表",
* description="",
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function uerList()
{
$admin = Admin::whereHas('role', function ($query) {
$query->where('name', 'like', '%门岗%');
3 years ago
})->get();
3 years ago
return $this->success($admin);
}
/**
* @OA\Get(
* path="/api/admin/gate/visit-list",
* tags={"门岗-拜访记录"},
* summary="拜访记录",
* description="",
* @OA\Parameter(name="keyword", in="query", @OA\Schema(type="string"), required=false, description="关键词"),
* @OA\Parameter(name="audit_status", in="query", @OA\Schema(type="string"), required=false, description="审核状态-1待学习0待审核1通过(待进厂)2驳回3已进厂4已离厂"),
* @OA\Parameter(name="start_date", in="query", @OA\Schema(type="string"), required=false, description="开始日期"),
* @OA\Parameter(name="end_date", in="query", @OA\Schema(type="string"), required=false, description="结束日期"),
* @OA\Parameter(name="page_size", in="query", @OA\Schema(type="string"), required=false, description="每页显示的条数"),
* @OA\Parameter(name="page", in="query", @OA\Schema(type="string"), required=false, description="页码"),
* @OA\Parameter(name="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"),
* @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"),
3 years ago
* @OA\Parameter(name="code", in="query", @OA\Schema(type="string"), required=false, description="编码"),
3 years ago
* @OA\Parameter(name="idcard", in="query", @OA\Schema(type="string"), required=false, description="身份证号码"),
3 years ago
* @OA\Parameter(name="car_no", in="query", @OA\Schema(type="string"), required=false, description="停车牌"),
* @OA\Parameter(name="person_no", in="query", @OA\Schema(type="string"), required=false, description="人牌"),
3 years ago
* @OA\Parameter(name="is_export", in="query", @OA\Schema(type="string"), required=false, description="是否导出0否1是默认0"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function visitList()
{
$all = request()->all();
3 years ago
$list = Visit::with('logs.admin', 'logs.user', 'visitTime', 'admin', 'visitArea', 'acceptAdmin.department', 'acceptAdminSignFile', 'acceptGoodsAdmin.department')->where(function ($query) use ($all) {
3 years ago
if (isset($all['keyword'])) {
$query->where('name', 'like', '%' . $all['keyword'] . '%');
}
if (isset($all['audit_status'])) {
$query->where('audit_status', $all['audit_status']);
}
3 years ago
if (isset($all['code'])) {
$query->where('code', $all['code']);
}
3 years ago
if (isset($all['idcard'])) {
$query->where('idcard', $all['idcard']);
}
7 days ago
// 普通访客:按预约到访日 date 落在查询区间内;长期访客:查询区间与长期有效区间 [start_date,end_date] 有交集即可出现在「今日」等列表中
if (!empty($all['start_date']) && !empty($all['end_date'])) {
$qs = $all['start_date'];
$qe = $all['end_date'];
$query->where(function ($sub) use ($qs, $qe) {
$sub->where(function ($q1) use ($qs, $qe) {
$q1->where(function ($q2) {
$q2->whereNull('long_time')->orWhere('long_time', 0);
})->whereBetween('date', [$qs, $qe]);
})->orWhere(function ($q1) use ($qs, $qe) {
$q1->where('long_time', 1)
->whereNotNull('start_date')
->whereNotNull('end_date')
->where('start_date', '<=', $qe)
->where('end_date', '>=', $qs);
});
});
3 years ago
}
7 days ago
})->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc');
if (isset($all['is_export']) && !empty($all['is_export'])) {
return (new FastExcel($list->limit(10000)->get()->toArray()))->download('门岗访客记录' . date('YmdHis') . '.csv', function ($info) {
return [
'编码' => $info['code'] ?? '',
'姓名' => $info['name'] ?? '',
'类型' => $info['type_text'] ?? '',
'审核状态' => $info['audit_status_text'] ?? '',
'被访人' => ($info['accept_admin']['name']) ?? '',
'预约日期' => $info['date'] ?? '',
'证件号' => $info['idcard'] ?? '',
'手机号' => $info['mobile'] ?? '',
'单位名称' => $info['company_name'] ?? '',
'到访时段开始' => ($info['visit_time']['start_time']) ?? '',
'到访时段结束' => ($info['visit_time']['end_time']) ?? '',
'创建时间' => $info['created_at'] ?? '',
];
});
}
$list = $list->paginate($all['page_size'] ?? 20);
3 years ago
return $this->success($list);
}
/**
* @OA\Get(
* path="/api/admin/gate/use-code",
* tags={"门岗-核销"},
* summary="核销",
* description="",
* @OA\Parameter(name="admin_id", in="query", @OA\Schema(type="string"), required=false, description="管理员id"),
* @OA\Parameter(name="code", in="query", @OA\Schema(type="string"), required=false, description="编码"),
3 years ago
* @OA\Parameter(name="car_no", in="query", @OA\Schema(type="string"), required=false, description="停车牌"),
* @OA\Parameter(name="person_no", in="query", @OA\Schema(type="string"), required=false, description="人牌"),
3 years ago
* @OA\Parameter(name="type", in="query", @OA\Schema(type="string"), required=false, description="1进厂2离厂"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function useCode()
{
$all = \request()->all();
$messages = [
'code.required' => '编号必填',
'type.required' => '类型必填',
'admin_id.required' => '操作人必填'
];
$validator = Validator::make($all, [
'code' => 'required',
'type' => 'required',
'admin_id' => 'required'
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
3 years ago
$check = Visit::where('code', $all['code'])->first();
if (empty($check)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '拜访记录不存在']);
}
7 days ago
if ($check->audit_status == 2 || $check->audit_status == 5) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '当前记录不可核销']);
}
// 物流访客:每次进/离厂都必须先上传当次车辆照片
if ((int)$check->type === 3) {
$latestGateLog = GateLog::where('visit_id', $check->id)->orderByDesc('id')->first();
$fileIds = [];
if (is_array($check->file)) {
$fileIds = $check->file;
} elseif (is_string($check->file) && !empty($check->file)) {
$decoded = json_decode($check->file, true);
if (is_array($decoded)) {
$fileIds = $decoded;
}
}
$hasPhoto = count($fileIds) > 0;
if (!$hasPhoto) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '物流访客需先上传车辆照片后再核销']);
}
// 要求本次核销前有一次新的更新动作,避免重复使用上次照片直接核销
if (!empty($latestGateLog) && strtotime((string)$check->updated_at) <= strtotime((string)$latestGateLog->created_at)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '物流访客本次进/离厂请先上传当次照片']);
}
}
// 长期访客:校验当前日期在有效周期内
$today = Carbon::now()->format('Y-m-d');
if ((int)$check->long_time === 1) {
if (empty($check->start_date) || empty($check->end_date)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '长期访客未配置有效周期']);
}
if ($today < $check->start_date || $today > $check->end_date) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '当前不在长期访客有效周期内']);
}
$todayLastLog = GateLog::where('visit_id', $check->id)->where('biz_date', $today)->orderByDesc('id')->first();
if ((int)$all['type'] === 1 && $todayLastLog && (int)$todayLastLog->action === 1) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '今日已进厂,请先离厂后再进厂']);
}
if ((int)$all['type'] === 2 && (!$todayLastLog || (int)$todayLastLog->action !== 1)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '今日无有效进厂记录,无法离厂']);
}
}
3 years ago
$remark = '进厂';
if ($all['type'] == 2) {
$remark = '离厂';
}
7 days ago
$gateLog = GateLog::add($all['admin_id'], $all['code'], $all['person_no'] ?? [], $all['car_no'] ?? [], $remark, $check->id, (int)$all['type'], $today);
3 years ago
if ($all['type'] == 1) {
3 years ago
// 入场
Visit::where('code', $all['code'])->update(['audit_status' => 3, 'person_no' => $all['person_no'] ?? '', 'car_no' => $all['car_no'] ?? '']);
// 通知被访人
$vars = ['date' => $check->date, 'name' => $check->name, 'phone_number' => $check->mobile];
$template_id = 'zPtka4';
$acceptAdmin = Admin::find($check->accept_admin_id);
sms($acceptAdmin->mobile, $vars, $template_id);
3 years ago
}
if ($all['type'] == 2) {
Visit::where('code', $all['code'])->update(['audit_status' => 4]);
}
return $this->success($gateLog);
}
}