diff --git a/app/Http/Controllers/GateController.php b/app/Http/Controllers/GateController.php index 1f92b5a..fa33fb1 100644 --- a/app/Http/Controllers/GateController.php +++ b/app/Http/Controllers/GateController.php @@ -186,16 +186,16 @@ class GateController extends Controller * path="/api/admin/gate/visits/update", * tags={"门岗端接口"}, * summary="更新拜访信息", - * description="门岗端更新拜访信息(绑定ID卡、修改状态、上传货车图片等)", + * description="门岗端更新拜访信息(按字段进行更新:绑定ID卡、修改进/离厂状态、上传货车图片等)", * @OA\RequestBody( * required=true, * @OA\JsonContent( * @OA\Property(property="id", type="integer", description="拜访ID"), - * @OA\Property(property="action", type="string", description="操作类型:bind_card绑定ID卡,enter进厂,leave离厂,upload_vehicle上传货车图片"), - * @OA\Property(property="person_no", type="string", description="人牌号(绑定ID卡时必填)"), - * @OA\Property(property="car_no", type="string", description="停车牌号(绑定ID卡时必填)"), - * @OA\Property(property="vehicle_images", type="array", description="货车图片ID数组(上传货车图片时必填)", @OA\Items(type="integer")), - * @OA\Property(property="remark", type="string", description="备注信息") + * @OA\Property(property="person_no", type="string", description="人牌号(提供则更新并记录绑定日志)"), + * @OA\Property(property="car_no", type="string", description="停车牌号(提供则更新)"), + * @OA\Property(property="audit_status", type="integer", enum={3,4}, description="审核状态:3进厂(需当前为已通过),4离厂(需当前为已进厂)"), + * @OA\Property(property="vehicle_images", type="array", description="货车图片ID数组(仅物流车辆可提供,需为有效上传ID)", @OA\Items(type="integer")), + * @OA\Property(property="remark", type="string", description="备注信息(用于进/离厂日志可选附加)") * ) * ), * @OA\Response( @@ -223,94 +223,82 @@ class GateController extends Controller return $this->fail([ResponseCode::ERROR_BUSINESS, __('gate.visit_not_found')]); } - $action = $request->input('action'); $remark = $request->input('remark', ''); + $personNo = $request->input('person_no'); + $carNo = $request->input('car_no'); + $vehicleImages = $request->input('vehicle_images'); // null 表示未尝试更新 + $newAuditStatus = $request->input('audit_status'); // 可选:3进厂,4离厂 DB::beginTransaction(); - switch ($action) { - case 'bind_card': - // 绑定ID卡 - $personNo = $request->input('person_no'); - $carNo = $request->input('car_no'); - - if (!$personNo) { - return $this->fail([ResponseCode::ERROR_PARAMETER, __('gate.person_no_required')]); - } + $hasAnyChange = false; + // 绑定/更新人牌、车牌 + if (!is_null($personNo) || !is_null($carNo)) { + if (!is_null($personNo)) { $visit->person_no = $personNo; - if ($carNo) { - $visit->car_no = $carNo; - } - $visit->save(); - - // 记录日志 - $this->createVisitLog($visit, VisitLog::TYPE_ENTER, __('gate.bind_card_log', ['person_no' => $personNo, 'car_no' => $carNo ?: ''])); - - break; + } + if (!is_null($carNo)) { + $visit->car_no = $carNo; + } + $visit->save(); + $hasAnyChange = true; + + $this->createVisitLog( + $visit, + VisitLog::TYPE_ENTER, + __('gate.bind_card_log', [ + 'person_no' => $visit->person_no ?: '', + 'car_no' => $visit->car_no ?: '' + ]) + ); + } - case 'enter': - // 进厂 + // 审核状态变更:支持进厂(Approved -> Entered) 与 离厂(Entered -> Left) + if (!is_null($newAuditStatus)) { + if ((int) $newAuditStatus === Visit::AUDIT_STATUS_ENTERED) { if ($visit->audit_status != Visit::AUDIT_STATUS_APPROVED) { return $this->fail([ResponseCode::ERROR_BUSINESS, __('gate.only_approved_visits_can_enter')]); } - $visit->audit_status = Visit::AUDIT_STATUS_ENTERED; $visit->save(); + $hasAnyChange = true; - // 记录日志 $this->createVisitLog($visit, VisitLog::TYPE_ENTER, __('gate.enter_log') . ($remark ? ':' . $remark : '')); - - // 记录门岗日志 $this->createGateLog($visit, 'enter', $remark); - - break; - - case 'leave': - // 离厂 + } elseif ((int) $newAuditStatus === Visit::AUDIT_STATUS_LEFT) { if ($visit->audit_status != Visit::AUDIT_STATUS_ENTERED) { return $this->fail([ResponseCode::ERROR_BUSINESS, __('gate.only_entered_visitors_can_leave')]); } - $visit->audit_status = Visit::AUDIT_STATUS_LEFT; $visit->save(); + $hasAnyChange = true; - // 记录日志 $this->createVisitLog($visit, VisitLog::TYPE_LEAVE, __('gate.leave_log') . ($remark ? ':' . $remark : '')); - - // 记录门岗日志 $this->createGateLog($visit, 'leave', $remark); + } + } - break; - - case 'upload_vehicle': - // 上传货车图片 - if ($visit->type != Visit::TYPE_LOGISTICS_CAR) { - return $this->fail([ResponseCode::ERROR_BUSINESS, __('gate.only_logistics_cars_can_upload_images')]); - } - - $vehicleImages = $request->input('vehicle_images', []); - if (empty($vehicleImages)) { - return $this->fail([ResponseCode::ERROR_BUSINESS, __('gate.vehicle_images_required')]); - } - - // 验证图片ID是否存在于uploads表中 - $existingImages = Upload::whereIn('id', $vehicleImages)->pluck('id')->toArray(); - if (count($existingImages) !== count($vehicleImages)) { - return $this->fail([ResponseCode::ERROR_BUSINESS, __('gate.invalid_vehicle_images')]); - } + // 货车图片更新(仅物流车辆) + if (!is_null($vehicleImages)) { + if ($visit->type != Visit::TYPE_LOGISTICS_CAR) { + return $this->fail([ResponseCode::ERROR_BUSINESS, __('gate.only_logistics_cars_can_upload_images')]); + } - // 存储货车图片ID数组到vehicle_images字段 - $visit->vehicle_images = $vehicleImages; - $visit->save(); + if (!is_array($vehicleImages) || empty($vehicleImages)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, __('gate.vehicle_images_required')]); + } - // 记录日志 - $this->createVisitLog($visit, VisitLog::TYPE_ENTER, __('gate.upload_vehicle_images_log', ['count' => count($vehicleImages)])); + $visit->vehicle_images = $vehicleImages; + $visit->save(); + $hasAnyChange = true; - break; + $this->createVisitLog($visit, VisitLog::TYPE_ENTER, __('gate.upload_vehicle_images_log', ['count' => count($vehicleImages)])); + } - default: - return $this->fail([ResponseCode::ERROR_BUSINESS, __('gate.invalid_action_type')]); + if (!$hasAnyChange) { + DB::rollBack(); + return $this->fail([ResponseCode::ERROR_PARAMETER, __('gate.invalid_action_type')]); } DB::commit();