menuRule($data,false); if(! $status) return [$status,$msg]; DB::beginTransaction(); try{ $model = SysMenu::where('id',$data['id'])->first(); $model->title = $data['title']; $model->icon = $data['icon'] ?? ''; $model->uri = $data['uri']; $model->parent_id = $data['parent_id']; $model->sort = $data['sort'] ?? 0; $model->save(); $time = time(); if(! empty($data['button'])){ foreach ($data['button'] as $key => $value){ $tmp['title'] = $value['title']; $tmp['sort'] = $key; $tmp['func'] = $value['func']; if(! empty($value['id'])){ SysMenuButton::where('id',$value['id'])->update($tmp); }else{ $tmp['menu_id'] = $model->id; $tmp['crt_time'] = $time; SysMenuButton::insert($tmp); } } } if(! empty($msg)){ foreach ($msg as $button_id){ SysMenuButton::where('id',$button_id)->update(['del_time' => $time]); RoleMenuButton::where('del_time',0)->where('button_id',$button_id)->update(['del_time' => $time]); } } DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true,'保存成功!']; } public function add($data,$user){ list($status,$msg) = $this->menuRule($data); if(! $status) return [$status,$msg]; DB::beginTransaction(); try{ $model = new SysMenu(); $sort = $model->where('parent_id',$data['parent_id'])->max('sort'); $model->title = $data['title']; $model->icon = $data['icon'] ?? ''; $model->uri = $data['uri']; $model->parent_id = $data['parent_id']; $model->sort = $sort ? $sort + 1 : 1; $model->crt_id = $user['id']; $model->save(); //按钮 if(! empty($data['button'])){ $time = time(); $insert = []; foreach ($data['button'] as $key => $value){ $tmp = []; $tmp['menu_id'] = $model->id; $tmp['title'] = $value['title']; $tmp['sort'] = $key; $tmp['func'] = $value['func'] ?? ''; $tmp['crt_time'] = $time; $insert[] = $tmp; } SysMenuButton::insert($insert); } DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true,'保存成功!']; } public function del($data){ if($this->isEmpty($data,'id')) return [false,'ID必须!']; $bool = RoleMenu::where('del_time',0) ->where('menu_id',$data['id']) ->exists(); if($bool) return [false,'菜单已绑定角色!']; DB::beginTransaction(); try { SysMenu::where('id',$data['id'])->update([ 'del_time' => time() ]); SysMenuButton::where('menu_id',$data['id'])->update([ 'del_time' => time() ]); DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true,'删除成功']; } public function menuList($data,$user){ if(isset($data['type'])) $type = $data['type']; else $type = '1'; if($type === '1'){ $return = SysMenu::where('del_time',0) ->select('title','icon','uri','parent_id','sort','crt_time','id','is_authority') ->orderBy('sort','desc') ->get()->toArray(); $return = $this->fillMenuButton($return); }elseif($type === '2'){ $list = SysMenu::where('del_time',0) ->where('state',1) ->select('title','icon','uri','parent_id','sort','crt_time','id','is_authority') ->orderBy('sort','desc'); //过滤菜单 $emp = new EmployeeService(); $menu = $emp->getMenuByRoleInList($user); $list->whereIn('id',$menu); $list = $list->get()->toArray(); $return = $this->makeTree(0,$list); $return = $this->set_sort_circle($return); }else{ //菜单的按钮 $return = (new EmployeeService())->getMenuByRole($user); } return [200, $return]; } public function menuRule($data, $is_check = true){ if($this->isEmpty($data,'title')) return [false,'名称不能为空!']; if($this->isEmpty($data,'parent_id')) return [false,'父级不存在!']; //菜单 if($is_check){ $bool = SysMenu::where('title',$data['title']) ->where('del_time',0) ->exists(); }else{ if($this->isEmpty($data,'id')) return [false,'ID不能为空!']; $bool = SysMenu::where('title',$data['title']) ->where('id','<>',$data['id']) ->where('del_time',0) ->exists(); $menu_button = SysMenuButton::where('del_time',0) ->where('menu_id',$data['id']) ->select('id')->get()->toArray(); $menu_button = array_column($menu_button,'id'); } if($bool) return [false,'菜单名称已经存在!']; //按钮 if(! empty($data['button'])){ $title = array_column($data['button'],'title'); $title = array_map(function($val) { return $val !== null ? $val : ""; }, $title); $title_count = array_count_values($title); foreach ($title as $value){ if(empty($value)) return [false,'按钮名称不能为空!']; if($title_count[$value] > 1) return [false,'按钮名称不能重复']; } } $del = []; if(! empty($menu_button)){ $submit = array_column($data['button'],'id'); foreach ($menu_button as $value){ if(! in_array($value,$submit)) $del[] = $value; } } return [true, $del]; } public function menuMove($data){ if($this->isEmpty($data,'id')) return [false,'ID不能为空!']; if($this->isEmpty($data,'move')) return [false,'移动不能能为空!']; //移动项 $model = new SysMenu(); $res = $model->where('id', $data['id'])->first(); if($data['move'] == 1 || $data['move'] == -1){ //替项目 $moveModel = $model->where('del_time',0)->where('parent_id',$res->parent_id); //下移-1 上移1 $data['move'] == 1 ? $moveModel->orderby('sort','desc')->where('sort','<', $res['sort']) : $moveModel->orderby('sort','asc')->where('sort','>', $res['sort']); $moveRes = $moveModel->first(); if(! $moveRes) return [false, '移动失败']; $weightOne = $res->sort; $weightTwo = $moveRes->sort; $res->sort = $weightTwo; $res->save(); $moveRes->sort = $weightOne; $moveRes->save(); }elseif($data['move'] == 'top' || $data['move'] == 'bottom'){ if($data['move'] == 'top'){ $sort = $model->where('del_time',0)->where('parent_id',$res->parent_id)->max('sort'); if($sort == $res->sort) return [false,'已经置顶,移动失败!']; $res->sort = $sort + 1; }elseif($data['move'] == 'bottom'){ $sort = $model->where('del_time',0)->where('parent_id',$res->parent_id)->min('sort'); if($sort == $res->sort) return [false,'已经置底部,移动失败!']; $res->sort = $sort - 1; } $res->save(); }else{ return [false, '移动失败']; } return [true,'移动成功']; } public function fillMenuButton($data){ $button = SysMenuButton::where('del_time',0) ->whereIn('menu_id',array_column($data,'id')) ->select('id','title','sort','func','menu_id') ->get()->toArray(); $button_map = []; $special_button = config('specialButton'); foreach ($special_button as $value){ $button[] = $value; } foreach ($button as $value){ $button_map[$value['menu_id']][] = $value; } foreach ($data as $key => $value){ $data[$key]['button'] = $button_map[$value['id']] ?? []; } return $data; } public function export($data){ //(共有的) 菜单 =》 按钮 $sys_menu = SysMenu::where('del_time',0) ->select('title','uri','parent_id','sort','id','is_authority') ->orderBy('sort','desc') ->get()->toArray(); $sys_menu_button = $this->fillMenuButton($sys_menu); $role = Role::where('del_time',0) ->select('id','title') ->orderBy('id','desc') ->get()->toArray(); $role_menu = RoleMenu::where('del_time',0) ->whereIn('role_id',array_column($role,'id')) ->select('menu_id','role_id','type') ->get()->toArray(); $role_menu_map = []; foreach ($role_menu as $value){ $role_menu_map[$value['role_id']][] = $value; } $role_menu_button = RoleMenuButton::where('del_time',0) ->whereIn('role_id',array_column($role,'id')) ->select('menu_id','role_id','button_id') ->get()->toArray(); $role_menu_button_map = []; foreach ($role_menu_button as $value){ $role_menu_button_map[$value['role_id']][] = $value; } $result = []; foreach ($role as $value){ $tmp = $sys_menu_button; $role_menu_tmp = $role_menu_map[$value['id']] ?? []; $role_menu_button_tmp = $role_menu_button_map[$value['id']] ?? []; $menu_button = []; $data_array = []; $data_array[] = ['菜单名称','是否勾选菜单','菜单按钮','数据范围']; foreach ($role_menu_button_tmp as $v){ $menu_button[$v['menu_id']][] = $v['button_id']; } foreach ($tmp as $k => $v){ $v['has_menu'] = 0; $v['type'] = 0; foreach ($role_menu_tmp as $v2){ //菜单 if($v2['menu_id'] == $v['id']) { $v['has_menu'] = 1; $v['type'] = $v2['type']; } //菜单下的按钮 if(! empty($tmp[$k]['button'])){ $button_tmp = $menu_button[$v['id']] ?? []; $str = ""; foreach ($tmp[$k]['button'] as $v_b){ if(in_array($v_b['id'],$button_tmp)){ $str .= $v_b['title'] . ","; } } $v['button'] = rtrim($str,','); }else{ $v['button'] = ""; } } $rule = RoleMenu::$type_name[$v['type']] ?? ""; $data_array[] = [ $v['title'], $v['has_menu'] ? "√" : "×", $v['button'], $rule ]; } $result[$value['title']] = $data_array; } $filename = date("Ymd").time().rand(1000,9999) . ".xlsx"; \Maatwebsite\Excel\Facades\Excel::store(new MultiSheetExport($result),"/public/export/{$filename}", null, 'Xlsx', []); return [true,$filename]; } }