roleRule($data,$user, false); if(!$status) return [$status,$msg]; $model = new Role(); $model = $model->where('id',$data['id'])->first(); $model->title = $data['title']; $model->save(); return [true,'']; } public function roleAdd($data,$user){ list($status,$msg) = $this->roleRule($data,$user); if(!$status) return [$status,$msg]; $model = new Role(); $model->title = $data['title'] ; $model->top_depart_id = $user['top_depart_id']; $model->save(); return [true,'']; } public function roleDel($data, $user){ if($this->isEmpty($data,'id')) return [false,'ID必须!']; $bool = EmployeeRole::where('del_time',0) ->whereIn('role_id',$data['id']) ->exists(); if($bool) return [false,'角色已绑定人员']; try { DB::beginTransaction(); $time = time(); Role::where('id',$data['id'])->update([ 'del_time' => $time ]); RoleMenu::where('del_time',0)->where('role_id',$data['id'])->update([ 'del_time' => $time ]); RoleMenuButton::where('del_time',0)->where('role_id',$data['id'])->update([ 'del_time' => $time ]); DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true, '']; } public function roleList($data,$user){ $model = Role::TopClear($user,$data); $model = $model->where('del_time',0) ->select('title','crt_time','id','upd_time') ->orderBy('id','desc'); if(! empty($data['title'])) $model->where('title', 'LIKE', '%' . $data['title'] . '%'); $list = $this->limit($model,'',$data); return [true, $list]; } public function roleRule(&$data,$user, $is_check = true){ if($this->isEmpty($data,'title')) return [false,'名称不能为空']; if($is_check){ $bool = Role::where('title',$data['title']) ->where('top_depart_id', $user['top_depart_id']) ->where('del_time',0) ->exists(); if($bool) return [false,'角色名称已存在']; }else{ if($this->isEmpty($data,'id')) return [false,'ID不能为空']; $top_depart_id = Role::where('id',$data['id'])->value('top_depart_id'); $bool = Role::where('title',$data['title']) ->where('top_depart_id',$top_depart_id) ->where('id','<>',$data['id']) ->where('del_time',0) ->exists(); if($bool) return [false,'角色名称已存在']; } return [true, '']; } public function roleMenu($data){ if(empty($data['role_id'])) return [false,'角色不能为空!']; if(empty($data['menu'])) return [false,'菜单数据不能为空!']; DB::beginTransaction(); try { RoleMenu::where('del_time',0)->where('role_id',$data['role_id'])->update(['del_time' => time()]); RoleMenuButton::where('del_time',0)->where('role_id',$data['role_id'])->update(['del_time' => time()]); $insert = $insert2 = []; foreach ($data['menu'] as $t){ $insert[] = [ 'role_id' => $data['role_id'], 'menu_id' => $t['menu_id'], 'type' => $t['type'], 'crt_time' => time() ]; if(! empty($t['button'])){ foreach ($t['button'] as $b){ $insert2[] = [ 'role_id' => $data['role_id'], 'menu_id' => $t['menu_id'], 'button_id' => $b, 'crt_time' => time() ]; } RoleMenuButton::insert($insert2); } } RoleMenu::insert($insert); DB::commit(); }catch (\Throwable $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true, '']; } public function roleDetail($data){ if(empty($data['role_id'])) return [false,'请选择角色']; $role = Role::where('id',$data['role_id']) ->where('del_time',0) ->select('id','title') ->first(); if(empty($role)) return [false,'角色不存在或已被删除']; $role = $role->toArray(); $menu = RoleMenu::where('role_id',$data['role_id']) ->where('del_time',0) ->select('menu_id','type') ->get()->toArray(); $button = $this->fillRoleButton([$data['role_id']]); foreach ($menu as $key => $value){ $menu[$key]['button'] = $button[$value['menu_id']] ?? []; } $role['menu'] = $menu; return [true, $role]; } public function fillRoleButton($role_id){ $button = RoleMenuButton::whereIn('role_id',$role_id) ->where('del_time',0) ->select('menu_id','button_id') ->get()->toArray(); $button_map = []; foreach ($button as $value){ if(! isset($button_map[$value['menu_id']])){ $button_map[$value['menu_id']][] = $value['button_id']; }else{ if(! in_array($value['button_id'], $button_map[$value['menu_id']])) $button_map[$value['menu_id']][] = $value['button_id']; } } return $button_map; } public function initializationCompanyList($data, $user){ $model = Depart::where('del_time',0) ->where('parent_id', 0) ->select('*') ->orderby('id', 'desc'); if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%'); if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%'); $list = $this->limit($model,'',$data); return [true, $list]; } // 公司初始化 返回 公司后台管理员账户 密码 public function initializationCompany($data, $user){ if(empty($data['title'])) return [false, '公司名称不能为空']; if(empty($data['code'])) return [false, '公司代码不能为空']; // ^[A-Za-z]+$ 表示从头到尾只能是英文字母(不区分大小写) if (! preg_match('/^[A-Za-z]+$/', $data['code']) || mb_strlen($data['code']) < 4) return [false, "公司代码必须全为英文且长度需大于等于 4 位"]; $exists = Depart::where('parent_id', 0) ->where('del_time', 0) ->where(function($query) use ($data) { $query->where('title', $data['title']) ->orWhere('code', $data['code']); }) ->exists(); if($exists) return [false, '公司名称或公司代码已存在,新增失败']; $account = $data['code'] . "_" . 'admin'; $exists = Employee::where('del_time', 0) ->where('account', $account) ->exists(); if($exists) return [false, '创建账号已存在,新增失败']; try { DB::beginTransaction(); //创建公司 $model = new Depart(); $model->parent_id = 0; $model->title = $data['title']; $model->code = $data['code']; $model->top_depart_id = 0; $model->save(); //公司ID $top_depart_id = $model->id; $password = $this->generateAt8CharPassword(); //创建账号 $model_2 = new Employee(); $model_2->title = $data['title'] . '管理员'; $model_2->code = $data['code']; $model_2->account = $account; $model_2->password = Hash::make($password); $model_2->is_admin = Employee::IS_ADMIN_TWO; $model_2->top_depart_id = $top_depart_id; $model_2->state = Employee::TYPE_ONE; $model_2->save(); $employee_id = $model_2->id; //关联人员的部门初始信息 $model_3 = new EmployeeDepartPermission(); $model_3->employee_id = $employee_id; $model_3->depart_id = 0; $model_3->top_depart_id = $top_depart_id; $model_3->save(); //公司上班时段 $work_range[] = [ 'top_depart_id' => $top_depart_id, 'start_time_hour' => 9, 'start_time_min' => 0, 'end_time_hour' => 12, 'end_time_min' => 0, 'total_work_min' => 180, ]; $work_range[] = [ 'top_depart_id' => $top_depart_id, 'start_time_hour' => 13, 'start_time_min' => 0, 'end_time_hour' => 18, 'end_time_min' => 0, 'total_work_min' => 300, ]; WorkRangeDetails::insert($work_range); DB::commit(); }catch (\Throwable $exception){ DB::rollBack(); return [false, $exception->getMessage()]; } return [true, ['account' => $account, 'password' => $password]]; } function generateAt8CharPassword() { $lettersNumbers = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'; $password = '@'; // 1. 先把固定的 @ 放进去 // 2. 随机抽取 6 位英文或数字 for ($i = 0; $i < 6; $i++) { $password .= $lettersNumbers[random_int(0, strlen($lettersNumbers) - 1)]; } // 3. 打乱顺序,让 @ 的位置不固定 return str_shuffle($password); } // 菜单 public function menuList($data, $user){ $type = $data['type'] ?? ""; if(empty($type)){ //权限 $sysList = SysMenu::where('del_time',0) ->where('type', SysMenu::type_zero) ->select('title','icon','uri','parent_id','sort','id','is_authority', 'state') ->orderBy('sort','desc') ->get() ->toArray(); $button = SysMenuButton::where('del_time',0) ->select('id','title','sort','func','menu_id') ->get()->toArray(); $return = $this->fillMenuButton($button,$sysList, $user); }elseif($type == "all"){ $sysList = SysMenu::where('del_time',0) ->where('type', SysMenu::type_one) ->select('title','icon','uri','parent_id','sort','id','is_authority', 'state') ->orderBy('sort','desc') ->get() ->toArray(); //侧边栏 $return = $this->returnTwo($sysList, $user); $return = [ 'one' => $sysList, 'two' => $return, ]; } return [true, $return]; } private function returnTwo($sysList, $user){ foreach ($sysList as $key => $value){ if($value['state'] <= 0) unset($sysList[$key]); } $list = array_values($sysList); $return = $this->makeTree(0,$list); return $this->set_sort_circle($return);; } public function fillMenuButton($button, $menu, $user) { // 1. 预处理所有按钮池(合并配置中的特殊按钮) $allButtons = collect($button)->concat(config('specialButton') ?? [])->groupBy('menu_id'); // 2. 获取权限基础数据 $isSuper = ($user['is_admin'] == Employee::IS_ADMIN_THREE); $result = []; foreach ($menu as $m) { $menuId = $m['id']; // 权限过滤:非超管 if (!$isSuper) continue; // 计算当前菜单拥有的按钮 $btns = $allButtons->get($menuId) ?? []; $m['button'] = $btns; $result[] = $m; } return $result; } // 管理员 public function employeeCommon($data,$user){ $model = Employee::where('del_time',0) ->where('is_admin', Employee::IS_ADMIN_TWO) ->select('id', 'account', 'crt_time', 'top_depart_id','title') ->orderBy('id','desc'); if(! empty($data['id'])) $model->whereIn('id', $data['id']); if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%'); if(! empty($data['mobile'])) $model->where('mobile', 'LIKE', '%'.$data['mobile'].'%'); if(! empty($data['role'])) { $emp = EmployeeRole::where('role_id',$data['role']) ->where('del_time',0) ->select('employee_id')->get()->toArray(); $model->whereIn('id',array_column($emp,'employee_id')); } return $model; } public function employeeList($data,$user){ $model = $this->employeeCommon($data, $user); $list = $this->limit($model,'',$data); $list = $this->organizationEmployeeData($list, $data, $user); return [true, $list]; } public function organizationEmployeeData($data, $ergs, $user) { if (empty($data['data'])) return $data; // 获取员工ID并查询扩展数据 $employee_ids = array_column($data['data'], 'id'); list($status, $extraMap) = $this->getEmployee($employee_ids); $depart_map = Depart::whereIn('id', array_unique(array_column($data['data'],'top_depart_id'))) ->pluck('title', 'id') ->toArray(); foreach ($data['data'] as &$item) { $id = $item['id']; $extra = $extraMap[$id] ?? null; $item['role'] = $extra['role_ids'] ?? []; $item['role_name'] = isset($extra['role_names']) ? implode(',', $extra['role_names']) : ''; $item['top_depart_title'] = $depart_map[$item['top_depart_id']]; $item['crt_time'] = !empty($item['crt_time']) ? date("Y-m-d", $item['crt_time']) : ""; } return $data; } public function getEmployee(array $employee_ids) { if (empty($employee_ids)) return [false, []]; // 1. 一次性获取所有角色 $roles = DB::table('employee_role as a') ->join('role as b', 'a.role_id', '=', 'b.id') ->where('a.del_time', 0) ->where('b.del_time', 0) ->whereIn("a.employee_id", $employee_ids) ->select('a.employee_id', 'b.title', 'b.id') ->get(); $resultMap = []; foreach ($roles as $r) { $resultMap[$r->employee_id]['role_ids'][] = $r->id; $resultMap[$r->employee_id]['role_names'][] = $r->title; } return [true, $resultMap]; } public function employeeEdit($data,$user){ list($status,$msg) = $this->employeeRule($data,$user,false); if(!$status) return [$status,$msg]; try { DB::beginTransaction(); $model = new Employee(); $model = $model->where('id',$data['id'])->first(); if($model->is_admin && $data['password'] !== '******') { $model->password = Hash::make($data['password']); $model->p_version = $model->p_version + 1; } $model->save(); $time = time(); EmployeeRole::where('employee_id',$data['id'])->update([ 'del_time' => $time ]); if(! empty($data['role'])){ $insert = []; foreach ($data['role'] as $value){ $insert[] = [ 'employee_id' => $model->id, 'role_id' => $value, 'crt_time' => $time, ]; } EmployeeRole::insert($insert); } DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false, $exception->getMessage()]; } return [true, '']; } public function employeeRule(&$data, $user, $is_add = true){ if(empty($data['id'])) return [false, '管理员ID不能为空']; $bool = Employee::where('del_time',0) ->where('id', $data['id']) ->exists(); if(! $bool) return [false, '管理员账户不存在或已被删除']; if(empty($data['password'])) return [false, '密码不能为空']; if(mb_strlen($data['password']) < 6) return [false, '密码长度不得小于6位长度']; return [true, '']; } public static function checkCenterUser($employee){ if(empty($employee['employee_id'])) return [false, 'token错误']; if(! isset($employee['p_version'])) return [false, 'token错误']; $result = Employee::where('id', $employee['employee_id']) ->where('del_time',0) ->first(); if(empty($result)) return [false, '账号不存在或已被删除']; $result = $result->toArray(); if($result['is_admin'] != Employee::IS_ADMIN_THREE) return [false, '账号限制登录']; if($result['p_version'] != $employee['p_version']) return [false, '请重新登录']; return [true, $result]; } }