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.
259 lines
8.0 KiB
259 lines
8.0 KiB
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Exceptions\CustomException;
|
|
use App\Models\ParkingCamera;
|
|
use App\Models\ParkingSpace;
|
|
use App\Models\ParkingSpaceCamera;
|
|
use Exception;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class ParkingCameraService extends BaseService
|
|
{
|
|
|
|
|
|
private static array $statusArr = ['offline', 'online'];
|
|
private static array $typeArr = [1 => 'flat_garage'];
|
|
private static array $isControlLightsArr = ['no', 'yes'];
|
|
|
|
public function __construct(OperationLogService $logService)
|
|
{
|
|
parent::__construct($logService);
|
|
$this->logService->menuTitle = 'camera_management';
|
|
}
|
|
|
|
/**
|
|
* @return array|string[]
|
|
*/
|
|
public static function getStatus(): array
|
|
{
|
|
$statusArr = self::$statusArr;
|
|
foreach ($statusArr as $key => $value) {
|
|
$statusArr[$key] = __('admin.' . $value);
|
|
}
|
|
return $statusArr;
|
|
}
|
|
|
|
/**
|
|
* @return array|string[]
|
|
*/
|
|
public static function getType(): array
|
|
{
|
|
$typeArr = self::$typeArr;
|
|
foreach ($typeArr as $key => $value) {
|
|
$typeArr[$key] = __('service.parking_camera.' . $value);
|
|
}
|
|
return $typeArr;
|
|
}
|
|
|
|
/**
|
|
* @return array|string[]
|
|
*/
|
|
public static function getIsControlLights(): array
|
|
{
|
|
$arr = self::$isControlLightsArr;
|
|
foreach ($arr as $key => $value) {
|
|
$arr[$key] = __('service.reservation.' . $value);
|
|
}
|
|
return $arr;
|
|
}
|
|
|
|
/**
|
|
* 创建车位相机
|
|
* @param array $data
|
|
* @return Builder|Model
|
|
* @throws CustomException
|
|
*/
|
|
public function createModel(array $data): Builder|Model
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
$parking_space_data = $data['parking_space_data'];
|
|
|
|
if (ParkingCamera::query()->where('number', $data['number'])
|
|
->exists()
|
|
) {
|
|
throw new Exception(__('service.parking_camera.number_exists'));
|
|
}
|
|
|
|
self::validateSpaceData($parking_space_data);
|
|
|
|
$model = ParkingCamera::query()->create([
|
|
'number' => $data['number'],
|
|
'camera_ip' => $data['camera_ip'],
|
|
'server_ip' => $data['server_ip'],
|
|
'floor_id' => $data['floor_id'] ?? 0,
|
|
'floor_region_id' => $data['floor_region_id'] ?? 0,
|
|
'is_control_lights' => $data['is_control_lights'] ?? 1,
|
|
'is_external' => $data['is_external'] ?? 0,
|
|
'built_in_light' => $data['built_in_light'] ?? 0,
|
|
'off_light' => $data['off_light'] ?? 0,
|
|
'remark' => $data['remark'] ?? '',
|
|
'created_at' => get_datetime()
|
|
]);
|
|
|
|
$this->logService->logCreated($model, 'parking_camera.create');
|
|
|
|
$this->addSpaceCamera($model->id, $parking_space_data);
|
|
|
|
DB::commit();
|
|
return $model;
|
|
} catch (Exception $e) {
|
|
DB::rollBack();
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 验证车位控灯相机数据
|
|
* @param $data
|
|
* @return void
|
|
* @throws CustomException
|
|
*/
|
|
private function validateSpaceData(&$data): void
|
|
{
|
|
foreach ($data as &$item) {
|
|
$control_lights_ip = $item['control_lights_ip'] ?? '';
|
|
$space_attr_id = $item['space_attr_id'] ?? '';
|
|
if (empty($control_lights_ip)) {
|
|
throw new CustomException(
|
|
__('validation.parking_camera.lights_ip_empty')
|
|
);
|
|
}
|
|
if (strlen($control_lights_ip) > 15) {
|
|
throw new CustomException(
|
|
__('validation.parking_camera.lights_ip_max')
|
|
);
|
|
}
|
|
$space_id = ParkingSpace::getValueId($item['space_number']);
|
|
if (!$space_id && $space_attr_id) {
|
|
// 创建车位
|
|
$spaceData = [
|
|
'floor_id' => $data['floor_id'],
|
|
'number' => $item['space_number'],
|
|
'space_attr_id' => $space_attr_id
|
|
];
|
|
(new ParkingSpaceService($this->logService))->create(
|
|
$spaceData
|
|
);
|
|
$space_id = ParkingSpace::getValueId($item['space_number']);
|
|
} elseif ($space_id && $space_attr_id) {
|
|
// 更新车位属性
|
|
(new ParkingSpaceService($this->logService))->updateAttr(
|
|
$space_id,
|
|
$space_attr_id
|
|
);
|
|
}
|
|
// 获取车位id
|
|
$item['space_id'] = $space_id;
|
|
}
|
|
}
|
|
|
|
private function addSpaceCamera($camera_id, $data)
|
|
{
|
|
ParkingSpaceCamera::createModel($data, $camera_id);
|
|
$AdminRoleMenuData = ParkingSpaceCamera::getData($camera_id);
|
|
$this->logService->logCreatedData(
|
|
new ParkingSpaceCamera(),
|
|
'parking_camera.create_space_camera',
|
|
$AdminRoleMenuData
|
|
);
|
|
}
|
|
|
|
// 创建车位空灯数据
|
|
|
|
/**
|
|
* 更新车位相机
|
|
* @param array $data
|
|
* @param string $id
|
|
* @return Builder|Model
|
|
* @throws CustomException
|
|
*/
|
|
public function updateModel(array $data, string $id): Builder|Model
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
$parking_space_data = $data['parking_space_data'];
|
|
|
|
$existsWhere = [
|
|
['number', '=', $data['number']],
|
|
['id', '<>', $id]
|
|
];
|
|
if (ParkingCamera::query()->where($existsWhere)->exists()) {
|
|
throw new Exception(__('service.parking_camera.number_exists'));
|
|
}
|
|
self::validateSpaceData($parking_space_data);
|
|
|
|
// 更新
|
|
$model = ParkingCamera::query()->findOrFail($id);
|
|
$oldValues = $model->toArray();
|
|
$model->update([
|
|
'number' => $data['number'],
|
|
'camera_ip' => $data['camera_ip'],
|
|
'server_ip' => $data['server_ip'],
|
|
'floor_id' => $data['floor_id'] ?? 0,
|
|
'floor_region_id' => $data['floor_region_id'] ?? 0,
|
|
'is_control_lights' => $data['is_control_lights'] ?? 1,
|
|
'is_external' => $data['is_external'] ?? 0,
|
|
'built_in_light' => $data['built_in_light'] ?? 0,
|
|
'off_light' => $data['off_light'] ?? 0,
|
|
'remark' => $data['remark'] ?? '',
|
|
'updated_at' => get_datetime()
|
|
]);
|
|
|
|
$this->logService->logUpdated(
|
|
$model,
|
|
$oldValues,
|
|
'parking_camera.update'
|
|
);
|
|
|
|
// 删除再添加
|
|
$this->delAdminRoleMenu($id);
|
|
$this->addSpaceCamera($id, $parking_space_data);
|
|
|
|
DB::commit();
|
|
return $model;
|
|
} catch (Exception $e) {
|
|
DB::rollBack();
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
// 删除车位空灯数据
|
|
|
|
private function delAdminRoleMenu(int $camera_id): void
|
|
{
|
|
$oldAdminRoleMenu = ParkingSpaceCamera::getData($camera_id);
|
|
$this->logService->logDeletedData(
|
|
new ParkingSpaceCamera(),
|
|
'parking_camera.delete_space_camera',
|
|
$oldAdminRoleMenu
|
|
);
|
|
ParkingSpaceCamera::query()->where('camera_id', $camera_id)->delete();
|
|
}
|
|
|
|
// 删除
|
|
public function deleteModel(int $id): bool
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
|
|
$model = ParkingCamera::query()->findOrFail($id);
|
|
|
|
$this->logService->logDeleted($model, 'parking_camera.delete');
|
|
|
|
$model->delete();
|
|
|
|
$this->delAdminRoleMenu($id);
|
|
|
|
DB::commit();
|
|
return true;
|
|
} catch (Exception $e) {
|
|
DB::rollBack();
|
|
throw $e;
|
|
}
|
|
}
|
|
}
|
|
|