all(); $filter = $all['filter'] ?? []; $show_relation = $all['show_relation'] ?? []; $page_size = $all['page_size'] ?? 10; $page = $all['page'] ?? 1; $sort_name = $all['sort_name'] ?? 'id'; $sort_type = $all['sort_type'] ?? 'desc'; $query = $this->model->query(); // 应用过滤条件 if (!empty($filter)) { $query = $this->applyFilters($query, $filter); } // 应用排序 $query->orderBy($sort_name, $sort_type); // 加载关联关系 if (!empty($show_relation)) { $query->with($show_relation); } // 分页 $result = $query->paginate($page_size, ['*'], 'page', $page); return $this->success($result); } /** * @OA\Get( * path="/api/admin/visits/show", * tags={"访客预约管理"}, * summary="访客预约登记详情", * description="获取指定的访客预约登记详情", * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="访客预约登记ID"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", * description="成功获取访客预约登记详情" * ) * ) */ public function show() { $all = request()->all(); $detail = $this->model->with([ 'visitArea', 'visitTime', 'admin', 'department', 'visitAudits', 'logs' ])->find($all['id']); return $this->success($detail); } /** * @OA\Post( * path="/api/admin/visits/save", * tags={"访客预约管理"}, * summary="新增/更新访客预约登记", * description="创建或更新访客预约登记", * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=false, description="访客预约登记ID,更新时必填"), * @OA\Parameter(name="date", in="query", @OA\Schema(type="string"), required=true, description="到访日期"), * @OA\Parameter(name="visit_time_id", in="query", @OA\Schema(type="string"), required=true, description="访问时段ID"), * @OA\Parameter(name="visit_area_id", in="query", @OA\Schema(type="string"), required=true, description="访问区域ID"), * @OA\Parameter(name="reason", in="query", @OA\Schema(type="string"), required=true, description="事由"), * @OA\Parameter(name="name", in="query", @OA\Schema(type="string"), required=true, description="姓名"), * @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=true, description="手机号"), * @OA\Parameter(name="credent", in="query", @OA\Schema(type="string"), required=true, description="证件类型"), * @OA\Parameter(name="idcard", in="query", @OA\Schema(type="string"), required=false, description="证件号码"), * @OA\Parameter(name="company_name", in="query", @OA\Schema(type="string"), required=true, description="单位名称"), * @OA\Parameter(name="type", in="query", @OA\Schema(type="string"), required=true, description="类型"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", * description="成功保存访客预约登记" * ) * ) */ public function save() { $request = new VisitRequest(); $request->setContainer(app()); $request->setRedirector(app('redirect')); DB::beginTransaction(); try { $data = $request->validated(); $all = request()->all(); // 检查黑名单 if (Config::isBlacklistCheckEnabled()) { $blacklist = Blacklist::checkVisitor($data['mobile'], $data['idcard'] ?? null); if ($blacklist && (!isset($all['id']) || $blacklist->id != $all['id'])) { return $this->fail([ResponseCode::ERROR_BUSINESS, __('visit.blacklist_check_failed')]); } } if (isset($all['id'])) { // 更新 $visit = $this->model->find($all['id']); if (!$visit) { return $this->fail([ResponseCode::ERROR_BUSINESS, __('visit.not_found')]); } $visit->update($data); VisitLog::log($visit->id, VisitLog::TYPE_UPDATE, __('visit.updated_successfully'), $this->getUserId()); $message = __('visit.updated_successfully'); } else { // 新增 $data['code'] = Visit::generateCode(); $data['admin_id'] = $this->getUserId(); $data['department_id'] = $this->getUser()->department_id; $data['audit_status'] = Config::isStudyRequired() ? Visit::AUDIT_STATUS_PENDING_STUDY : Visit::AUDIT_STATUS_PENDING; $visit = $this->model->create($data); VisitLog::logCreate($visit->id, __('visit.created_successfully'), $data['user_id'] ?? null); $message = __('visit.created_successfully'); } DB::commit(); return $this->success($visit); } catch (\Exception $exception) { DB::rollBack(); return $this->fail([$exception->getCode(), $exception->getMessage()]); } } /** * @OA\Get( * path="/api/admin/visits/destroy", * tags={"访客预约管理"}, * summary="删除访客预约登记", * description="删除指定的访客预约登记", * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="访客预约登记ID"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", * description="成功删除访客预约登记" * ) * ) */ public function destroy() { $all = request()->all(); $visit = $this->model->find($all['id']); if (!$visit) { return $this->fail([ResponseCode::ERROR_BUSINESS, __('visit.not_found')]); } DB::beginTransaction(); try { // 记录日志 VisitLog::log($visit->id, VisitLog::TYPE_CANCEL, __('visit.deleted_successfully'), $this->getUserId()); $visit->delete(); DB::commit(); return $this->success(__('visit.deleted_successfully')); } catch (\Exception $exception) { DB::rollBack(); return $this->fail([$exception->getCode(), $exception->getMessage()]); } } /** * 应用过滤条件 */ private function applyFilters($query, $filter) { foreach ($filter as $key => $value) { if (is_array($value)) { $query->whereIn($key, $value); } else { $query->where($key, $value); } } return $query; } }