158 lines
5.6 KiB
PHP
158 lines
5.6 KiB
PHP
|
<?php
|
|||
|
|
|||
|
namespace App\Http\Controllers;
|
|||
|
|
|||
|
use App\Http\Requests\SendRoomSwitchCommandRequest;
|
|||
|
use App\Http\Requests\ReceiveRoomRegisterRequest;
|
|||
|
use App\Services\TcpSocketClient;
|
|||
|
use Illuminate\Http\JsonResponse;
|
|||
|
|
|||
|
use App\Models\Room;
|
|||
|
use App\Enums\RoomStatus;
|
|||
|
|
|||
|
/**
|
|||
|
* @OA\Tag(
|
|||
|
* name="Auth",
|
|||
|
* description="包廂控制"
|
|||
|
* )
|
|||
|
*/
|
|||
|
class RoomControlController extends Controller
|
|||
|
{
|
|||
|
/**
|
|||
|
* @OA\Post(
|
|||
|
* path="/api/room/receiveRegister",
|
|||
|
* summary="包廂註冊控制指令",
|
|||
|
* description="依據傳入的 branch_id 與 room_name,知道過來的設備來之於那個IP設備。",
|
|||
|
* operationId="registerRoomCommand",
|
|||
|
* tags={"Room Control"},
|
|||
|
* security={{"Authorization":{}}},
|
|||
|
* @OA\RequestBody(
|
|||
|
* required=true,
|
|||
|
* @OA\JsonContent(ref="#/components/schemas/ReceiveRoomRegisterRequest")
|
|||
|
* ),
|
|||
|
* @OA\Response(
|
|||
|
* response=200,
|
|||
|
* description="成功傳送指令並回傳 TCP 回應",
|
|||
|
* @OA\JsonContent(
|
|||
|
* allOf={
|
|||
|
* @OA\Schema(ref="#/components/schemas/ApiResponse"),
|
|||
|
* @OA\Schema(
|
|||
|
* @OA\Property(property="data", ref="#/components/schemas/Room")
|
|||
|
* )
|
|||
|
* }
|
|||
|
* )
|
|||
|
* ),
|
|||
|
* @OA\Response(
|
|||
|
* response=401,
|
|||
|
* description="Unauthorized",
|
|||
|
* @OA\JsonContent(
|
|||
|
* allOf={
|
|||
|
* @OA\Schema(ref="#/components/schemas/ApiResponse"),
|
|||
|
* @OA\Schema(
|
|||
|
* @OA\Property(property="code", type="string", example="UNAUTHORIZED"),
|
|||
|
* @OA\Property(property="message", type="string", example="Unauthorized"),
|
|||
|
* @OA\Property(property="data", type="null")
|
|||
|
* )
|
|||
|
* }
|
|||
|
* )
|
|||
|
* ),
|
|||
|
* @OA\Parameter(
|
|||
|
* name="Accept",
|
|||
|
* in="header",
|
|||
|
* required=true,
|
|||
|
* @OA\Schema(type="string", default="application/json")
|
|||
|
* )
|
|||
|
* )
|
|||
|
*/
|
|||
|
public function receiveRegister(ReceiveRoomRegisterRequest $request): JsonResponse
|
|||
|
{
|
|||
|
$validated = $request->validated();
|
|||
|
|
|||
|
$room= Room::where([['branch_id',$validated['branch_id']],['name',$validated['room_name']]])->first();
|
|||
|
if (!$room) {
|
|||
|
return \App\Http\Responses\ApiResponse::error("'找不到對應包廂'");
|
|||
|
}
|
|||
|
$room->internal_ip = $validated['room_ip'];
|
|||
|
$room->port =1000;
|
|||
|
$room->touch();
|
|||
|
$room->status=RoomStatus::Closed;
|
|||
|
$room->save();
|
|||
|
return \App\Http\Responses\ApiResponse::success($room);
|
|||
|
|
|||
|
}
|
|||
|
/**
|
|||
|
* @OA\Post(
|
|||
|
* path="/api/room/sendSwitch",
|
|||
|
* summary="送出包廂控制指令",
|
|||
|
* description="依據傳入的 room_id 與 command,透過 TCP 傳送對應指令給包廂電腦。",
|
|||
|
* operationId="sendRoomSwitchCommand",
|
|||
|
* tags={"Room Control"},
|
|||
|
* security={{"Authorization":{}}},
|
|||
|
* @OA\RequestBody(
|
|||
|
* required=true,
|
|||
|
* @OA\JsonContent(ref="#/components/schemas/SendRoomSwitchCommandRequest")
|
|||
|
* ),
|
|||
|
* @OA\Response(
|
|||
|
* response=200,
|
|||
|
* description="成功傳送指令並回傳 TCP 回應",
|
|||
|
* @OA\JsonContent(
|
|||
|
* allOf={
|
|||
|
* @OA\Schema(ref="#/components/schemas/ApiResponse"),
|
|||
|
* @OA\Schema(
|
|||
|
* @OA\Property(property="data", ref="#/components/schemas/Room")
|
|||
|
* )
|
|||
|
* }
|
|||
|
* )
|
|||
|
* ),
|
|||
|
* @OA\Response(
|
|||
|
* response=401,
|
|||
|
* description="Unauthorized",
|
|||
|
* @OA\JsonContent(
|
|||
|
* allOf={
|
|||
|
* @OA\Schema(ref="#/components/schemas/ApiResponse"),
|
|||
|
* @OA\Schema(
|
|||
|
* @OA\Property(property="code", type="string", example="UNAUTHORIZED"),
|
|||
|
* @OA\Property(property="message", type="string", example="Unauthorized"),
|
|||
|
* @OA\Property(property="data", type="null")
|
|||
|
* )
|
|||
|
* }
|
|||
|
* )
|
|||
|
* ),
|
|||
|
* @OA\Parameter(
|
|||
|
* name="Accept",
|
|||
|
* in="header",
|
|||
|
* required=true,
|
|||
|
* @OA\Schema(type="string", default="application/json")
|
|||
|
* )
|
|||
|
* )
|
|||
|
*/
|
|||
|
public function sendSwitch(SendRoomSwitchCommandRequest $request): JsonResponse
|
|||
|
{
|
|||
|
$validated = $request->validated();
|
|||
|
$room= Room::where([['branch_id',$validated['branch_id']],['name',$validated['room_name']]])->first();
|
|||
|
|
|||
|
$ip = $room->internal_ip;
|
|||
|
$port = $room->port;
|
|||
|
$data=(substr($room->name, -3) ?? $room->name).",".($validated['command']=='active' ? 'O':'X');
|
|||
|
|
|||
|
//dd($data);
|
|||
|
$client = new TcpSocketClient($ip, $port);
|
|||
|
try {
|
|||
|
$response = $client->send($data);
|
|||
|
|
|||
|
$room->status=$validated['command'];
|
|||
|
$room->started_at=$validated['started_at'];
|
|||
|
$room->ended_at=$validated['ended_at'];
|
|||
|
$room->save();
|
|||
|
|
|||
|
return \App\Http\Responses\ApiResponse::success($room);
|
|||
|
} catch (\Throwable $e) {
|
|||
|
$room->status=RoomStatus::Error;
|
|||
|
$room->started_at=null;
|
|||
|
$room->ended_at=null;
|
|||
|
$room->save();
|
|||
|
return \App\Http\Responses\ApiResponse::error($e->getMessage());
|
|||
|
}
|
|||
|
}
|
|||
|
}
|