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

190 lines
5.0 KiB

<?php
namespace App\Services;
use App\Models\AdminRoleMenu;
use App\Models\AdminRoles;
use Exception;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
final class AdminRolesService
{
/**
* @var OperationLogService
*/
private OperationLogService $logService;
/**
* 构造函数
* @param OperationLogService $logService
*/
public function __construct(OperationLogService $logService)
{
$this->logService = $logService;
}
/**
* @param array $data
* @param int $id
* @return Model|Builder
* @throws Exception
*/
public function updateModel(array $data, int $id): Model|Builder
{
try {
DB::beginTransaction();
$remark = $data['remark'] ?? '';
$menu_ids = $data['menu_ids'];
// 验证
$existsWhere = [
['name', '=', $data['name']],
['id', '<>', $id]
];
if (AdminRoles::query()->where($existsWhere)->exists()) {
throw new Exception(__('service.admin_role.name_exists'));
}
self::validateMenuIds($menu_ids);
// 更新
$model = AdminRoles::query()->findOrFail($id);
$oldValues = $model->toArray();
$model->update([
'name' => $data['name'],
'remark' => $remark,
'level' => $data['level'],
'updated_at' => get_datetime()
]);
$this->logService->logUpdated($model, $oldValues, '更新角色');
// 删除再创建关联
if (AdminRoleMenu::existsRoleMenu($id, $menu_ids)) {
$this->delAdminRoleMenu($id);
$this->addAdminRoleMenu($id, $menu_ids);
}
DB::commit();
return $model;
} catch (Exception $e) {
DB::rollBack();
throw $e;
}
}
/**
* 验证菜单数据
* @param array $menu_ids
* @return void
* @throws Exception
*/
public static function validateMenuIds(array $menu_ids): void
{
foreach ($menu_ids as $menu_id) {
if (!is_numeric($menu_id)) {
throw new Exception(__('service.admin_role.menu_error'));
}
}
}
/**
* 同步删除角色菜单关联数据
* @param int $role_id
* @return void
*/
private function delAdminRoleMenu(int $role_id): void
{
$oldAdminRoleMenu = AdminRoleMenu::query()->where('role_id', $role_id)
->select()->get()->toArray();
$this->logService->logDeletedData(
new AdminRoleMenu(),
'删除角色关联菜单',
$oldAdminRoleMenu
);
AdminRoleMenu::query()->where('role_id', $role_id)->delete();
}
/**
* 同步添加角色菜单关联数据
* @param int $role_id
* @param array $menu_ids
* @return void
*/
private function addAdminRoleMenu(int $role_id, array $menu_ids): void
{
AdminRoleMenu::createModel($menu_ids, $role_id);
$AdminRoleMenuData = AdminRoleMenu::getMenuData($role_id);
$this->logService->logCreatedData(
new AdminRoleMenu(),
'创建角色关联菜单',
$AdminRoleMenuData
);
}
/**
* 创建角色
* @param array $data
* @return Model|Builder
* @throws Exception
*/
public function createModel(array $data): Model|Builder
{
try {
DB::beginTransaction();
$remark = $data['remark'] ?? '';
$menu_ids = $data['menu_ids'];
if (AdminRoles::query()->where('name', $data['name'])->exists()) {
throw new Exception(__('service.admin_role.name_exists'));
}
self::validateMenuIds($menu_ids);
$model = AdminRoles::query()->create([
'name' => $data['name'],
'remark' => $remark,
'level' => $data['level'],
'created_at' => get_datetime()
]);
$this->logService->logCreated($model, '创建角色');
$this->addAdminRoleMenu($model->id, $menu_ids);
DB::commit();
return $model;
} catch (Exception $e) {
DB::rollBack();
throw $e;
}
}
/**
* 删除角色
* @param int $id
* @return bool
* @throws Exception
*/
public function deleteModel(int $id): bool
{
try {
DB::beginTransaction();
$model = AdminRoles::query()->findOrFail($id);
$this->logService->logDeleted($model, '删除角色');
$model->delete();
$this->delAdminRoleMenu($id);
DB::commit();
return true;
} catch (Exception $e) {
DB::rollBack();
throw $e;
}
}
}