<?php
namespace App\Modules\Admin\Services;
use App\Exceptions\Exception;
use App\Modules\Admin\Entities\Rabc\AdminMenu;
use App\Modules\Admin\Entities\Rabc\AdminRole;
use Illuminate\Support\Facades\DB;
class AdminRoleService extends BaseService
{
public function __construct(AdminRole $adminRole)
{
$this->model = $adminRole;
$this->with = ['menus'];
}
public function lists(array $params) : array
{
$params['where_callback'] = function($query) use ($params){
$request = request();
if (!empty($search = $request->input('search', ''))){
$query->where('role_name', 'LIKE', '%' . trim($search) . '%');
}
$is_check = $request->input('is_check', -1);
if ($is_check > -1){
$query->where('is_check', '=', $is_check);
}
};
return parent::lists($params); }
public function getSelectLists($request)
{
return $this->model->where(function($query) use ($request){
$search = $request->input('search', '');
if (!empty($search)){
$query->where('role_name', 'LIKE', '%' . trim($search) . '%');
}
})->with(['menus'])->orderBy($this->model->getKeyName(), 'ASC')->limit(100)->get();
}
public function create(array $params)
{
DB::beginTransaction();
try{
parent::create($params);
$this->setMenuForRole($params);
DB::commit();
return true;
}catch (Exception $e){
DB::rollBack();
$this->setError($e->getMessage());
return false;
}
}
public function update(array $params)
{
DB::beginTransaction();
try{
parent::update($params);
$this->setMenuForRole($params);
DB::commit();
return true;
}catch (Exception $e){
DB::rollBack();
$this->setError($e->getMessage());
return false;
}
}
protected function setMenuForRole($params)
{
if (isset($params['menu_ids']) && $this->detail->{$this->model->getKeyName()} != 1){
$menu_rules = $params['menu_ids'];
$all_menus = AdminMenu::select('menu_id')->find($menu_rules)->toArray() $new_all_menus = array_column($all_menus, 'menu_id', 'menu_id');
$has_menus = $this->detail->menus->toArray() $new_has_menus = array_column($has_menus, 'menu_id', 'menu_id');
$primary_key = $this->model->getKeyName();
$add_menus = get_array_diff($new_all_menus, $new_has_menus);
if (!empty($add_menus)) {
foreach ($add_menus as $menus) $this->model->grantMenus([
$primary_key => $this->detail->{$primary_key},
'menu_id' => $menus,
]);
}
$delete_menus = get_array_diff($new_has_menus, $new_all_menus);
if (!empty($delete_menus)) {
foreach ($delete_menus as $menus) $this->model->deleteMenus([
$primary_key => $this->detail->{$primary_key},
'menu_id' => $menus,
]);
}
}
}
public function delete(array $params)
{
$primaryKey = $this->model->getKeyName();
if (isset($params[$primaryKey]) && $params[$primaryKey] == 1){
$this->setError('超管角色禁止删除!');
return false;
}
if(isset($params['is_batch']) && $params['is_batch'] == 1){
$ids_ary = explode(',', $params[$primaryKey]);
if (in_array(1, $ids_ary)){
$key = array_search(1, $ids_ary);
unset($ids_ary[$key]);
$params[$primaryKey] = implode(',', $ids_ary);
}
}
return parent::delete($params); }
}