停车场管理系统
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.
 
 

280 lines
8.8 KiB

<?php
namespace App\Services;
use App\Exceptions\CustomException;
use App\Models\AdminFloor;
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;
}
}
// 处理列表数据
public function optionItems($item)
{
$item['floor'] = AdminFloor::getName($item['floor_id']);
$item['parking_space_count']
= ParkingSpaceCamera::getSpaceCount($item['id']);
$item['parking_space_numbers']
= ParkingSpaceCamera::getParkingSpaceNumber(
$item['id']
);
$isArr = ParkingCameraService::getIsControlLights();
$typeArr = ParkingCameraService::getType();
$statusArr = ParkingCameraService::getStatus();
$item['is_control_lights']
= $isArr[$item['is_control_lights']] ?? '';
$item['type'] = $typeArr[$item['type']] ?? '';
$item['status'] = $statusArr[$item['status']] ?? '';
return $item;
}
}