|
|
|
|
@ -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();
|
|
|
|
|
|