| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516 |
- <?php
- namespace App\Service;
- use App\Model\Depart;
- use App\Model\Employee;
- use App\Model\EmployeeDepartPermission;
- use App\Model\EmployeeRole;
- use App\Model\Role;
- use App\Model\RoleMenu;
- use App\Model\RoleMenuButton;
- use App\Model\SysMenu;
- use App\Model\SysMenuButton;
- use App\Model\WorkRangeDetails;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Hash;
- class MiddleGroundService extends Service
- {
- // 角色 ---------------------------------------
- public function roleEdit($data,$user){
- list($status,$msg) = $this->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);
- }else{
- $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 [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')
- ->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];
- }
- }
|