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
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;
|
|
}
|
|
}
|
|
}
|
|
|