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

173 lines
4.6 KiB

<?php
namespace App\Services;
use App\Models\AdminFloor;
use App\Models\AdminFloorRegion;
use Exception;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class AdminFloorService
{
/**
* @var OperationLogService
*/
private OperationLogService $logService;
/**
* 构造函数
* @param OperationLogService $logService
*/
public function __construct(OperationLogService $logService)
{
$this->logService = $logService;
}
/**
* 创建角色
* @param array $data
* @return Model|Builder
* @throws Exception
*/
public function createModel(array $data): Model|Builder
{
try {
DB::beginTransaction();
$region_data = $data['region_data'];
if (AdminFloor::query()->where('name', $data['name'])->exists()) {
throw new Exception(__('service.admin_floor.name_exists'));
}
$model = AdminFloor::query()->create([
'name' => $data['name'],
'image_url' => $data['image_url'],
'created_at' => get_datetime()
]);
$this->logService->logCreated($model, '创建楼层');
$this->addAdminFloorRegion($model->id, $region_data);
DB::commit();
return $model;
} catch (Exception $e) {
DB::rollBack();
throw $e;
}
}
/**
* 同步添加区域关联数据
* @param int $floor_id
* @param array $regionData
* @return void
*/
private function addAdminFloorRegion(int $floor_id, array $regionData): void
{
$regionSaveData = [];
foreach ($regionData as $value) {
$regionSaveData[] = [
'floor_id' => $floor_id,
'name' => $value['name'],
'created_at' => get_datetime()
];
}
AdminFloorRegion::query()->insert($regionSaveData);
$AdminRoleMenuData = AdminFloorRegion::getFloorRegion($floor_id);
$this->logService->logCreatedData(
new AdminFloorRegion(),
'创建楼层关联区域',
$AdminRoleMenuData
);
}
/**
* @param array $data
* @param int $id
* @return Model|Builder
* @throws Exception
*/
public function updateModel(array $data, int $id): Model|Builder
{
try {
DB::beginTransaction();
$region_data = $data['region_data'];
// 验证
$existsWhere = [
['name', '=', $data['name']],
['id', '<>', $id]
];
if (AdminFloor::query()->where($existsWhere)->exists()) {
throw new Exception(__('service.admin_role.name_exists'));
}
// 更新
$model = AdminFloor::query()->findOrFail($id);
$oldValues = $model->toArray();
$model->update([
'name' => $data['name'],
'image_url' => $data['image_url'],
'updated_at' => get_datetime()
]);
$this->logService->logUpdated($model, $oldValues, '更新楼层');
// 删除再创建关联
$nameArr = array_column($region_data, 'name');
if (AdminFloorRegion::existsRoleMenu($id, $nameArr)) {
$this->delAdminFloorRegion($id);
$this->addAdminFloorRegion($id, $region_data);
}
DB::commit();
return $model;
} catch (Exception $e) {
DB::rollBack();
throw $e;
}
}
protected function delAdminFloorRegion($floor_id): void
{
$oldData = AdminFloorRegion::query()->where('floor_id', $floor_id)
->select()->get()->toArray();
$this->logService->logDeletedData(
new AdminFloorRegion(),
'删除角色关联菜单',
$oldData
);
AdminFloorRegion::query()->where('floor_id', $floor_id)->delete();
}
/**
* @param $id
* @return bool
* @throws Exception
*/
public function deleteModel($id): bool
{
try {
DB::beginTransaction();
$model = AdminFloor::query()->findOrFail($id);
$this->logService->logDeleted($model, '删除楼层');
$model->delete();
$this->delAdminFloorRegion($id);
DB::commit();
return true;
} catch (Exception $e) {
DB::rollBack();
throw $e;
}
}
}