MiddleGroundService.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Depart;
  4. use App\Model\Employee;
  5. use App\Model\EmployeeDepartPermission;
  6. use App\Model\EmployeeRole;
  7. use App\Model\Role;
  8. use App\Model\RoleMenu;
  9. use App\Model\RoleMenuButton;
  10. use App\Model\SysMenu;
  11. use App\Model\SysMenuButton;
  12. use App\Model\WorkRangeDetails;
  13. use Illuminate\Support\Facades\DB;
  14. use Illuminate\Support\Facades\Hash;
  15. class MiddleGroundService extends Service
  16. {
  17. // 角色 ---------------------------------------
  18. public function roleEdit($data,$user){
  19. list($status,$msg) = $this->roleRule($data,$user, false);
  20. if(!$status) return [$status,$msg];
  21. $model = new Role();
  22. $model = $model->where('id',$data['id'])->first();
  23. $model->title = $data['title'];
  24. $model->save();
  25. return [true,''];
  26. }
  27. public function roleAdd($data,$user){
  28. list($status,$msg) = $this->roleRule($data,$user);
  29. if(!$status) return [$status,$msg];
  30. $model = new Role();
  31. $model->title = $data['title'] ;
  32. $model->top_depart_id = $user['top_depart_id'];
  33. $model->save();
  34. return [true,''];
  35. }
  36. public function roleDel($data, $user){
  37. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  38. $bool = EmployeeRole::where('del_time',0)
  39. ->whereIn('role_id',$data['id'])
  40. ->exists();
  41. if($bool) return [false,'角色已绑定人员'];
  42. try {
  43. DB::beginTransaction();
  44. $time = time();
  45. Role::where('id',$data['id'])->update([
  46. 'del_time' => $time
  47. ]);
  48. RoleMenu::where('del_time',0)->where('role_id',$data['id'])->update([
  49. 'del_time' => $time
  50. ]);
  51. RoleMenuButton::where('del_time',0)->where('role_id',$data['id'])->update([
  52. 'del_time' => $time
  53. ]);
  54. DB::commit();
  55. }catch (\Exception $exception){
  56. DB::rollBack();
  57. return [false,$exception->getMessage()];
  58. }
  59. return [true, ''];
  60. }
  61. public function roleList($data,$user){
  62. $model = Role::TopClear($user,$data);
  63. $model = $model->where('del_time',0)
  64. ->select('title','crt_time','id','upd_time')
  65. ->orderBy('id','desc');
  66. if(! empty($data['title'])) $model->where('title', 'LIKE', '%' . $data['title'] . '%');
  67. $list = $this->limit($model,'',$data);
  68. return [true, $list];
  69. }
  70. public function roleRule(&$data,$user, $is_check = true){
  71. if($this->isEmpty($data,'title')) return [false,'名称不能为空'];
  72. if($is_check){
  73. $bool = Role::where('title',$data['title'])
  74. ->where('top_depart_id', $user['top_depart_id'])
  75. ->where('del_time',0)
  76. ->exists();
  77. if($bool) return [false,'角色名称已存在'];
  78. }else{
  79. if($this->isEmpty($data,'id')) return [false,'ID不能为空'];
  80. $top_depart_id = Role::where('id',$data['id'])->value('top_depart_id');
  81. $bool = Role::where('title',$data['title'])
  82. ->where('top_depart_id',$top_depart_id)
  83. ->where('id','<>',$data['id'])
  84. ->where('del_time',0)
  85. ->exists();
  86. if($bool) return [false,'角色名称已存在'];
  87. }
  88. return [true, ''];
  89. }
  90. public function roleMenu($data){
  91. if(empty($data['role_id'])) return [false,'角色不能为空!'];
  92. if(empty($data['menu'])) return [false,'菜单数据不能为空!'];
  93. DB::beginTransaction();
  94. try {
  95. RoleMenu::where('del_time',0)->where('role_id',$data['role_id'])->update(['del_time' => time()]);
  96. RoleMenuButton::where('del_time',0)->where('role_id',$data['role_id'])->update(['del_time' => time()]);
  97. $insert = $insert2 = [];
  98. foreach ($data['menu'] as $t){
  99. $insert[] = [
  100. 'role_id' => $data['role_id'],
  101. 'menu_id' => $t['menu_id'],
  102. 'type' => $t['type'],
  103. 'crt_time' => time()
  104. ];
  105. if(! empty($t['button'])){
  106. foreach ($t['button'] as $b){
  107. $insert2[] = [
  108. 'role_id' => $data['role_id'],
  109. 'menu_id' => $t['menu_id'],
  110. 'button_id' => $b,
  111. 'crt_time' => time()
  112. ];
  113. }
  114. RoleMenuButton::insert($insert2);
  115. }
  116. }
  117. RoleMenu::insert($insert);
  118. DB::commit();
  119. }catch (\Throwable $exception){
  120. DB::rollBack();
  121. return [false,$exception->getMessage()];
  122. }
  123. return [true, ''];
  124. }
  125. public function roleDetail($data){
  126. if(empty($data['role_id'])) return [false,'请选择角色'];
  127. $role = Role::where('id',$data['role_id'])
  128. ->where('del_time',0)
  129. ->select('id','title')
  130. ->first();
  131. if(empty($role)) return [false,'角色不存在或已被删除'];
  132. $role = $role->toArray();
  133. $menu = RoleMenu::where('role_id',$data['role_id'])
  134. ->where('del_time',0)
  135. ->select('menu_id','type')
  136. ->get()->toArray();
  137. $button = $this->fillRoleButton([$data['role_id']]);
  138. foreach ($menu as $key => $value){
  139. $menu[$key]['button'] = $button[$value['menu_id']] ?? [];
  140. }
  141. $role['menu'] = $menu;
  142. return [true, $role];
  143. }
  144. public function fillRoleButton($role_id){
  145. $button = RoleMenuButton::whereIn('role_id',$role_id)
  146. ->where('del_time',0)
  147. ->select('menu_id','button_id')
  148. ->get()->toArray();
  149. $button_map = [];
  150. foreach ($button as $value){
  151. if(! isset($button_map[$value['menu_id']])){
  152. $button_map[$value['menu_id']][] = $value['button_id'];
  153. }else{
  154. if(! in_array($value['button_id'], $button_map[$value['menu_id']])) $button_map[$value['menu_id']][] = $value['button_id'];
  155. }
  156. }
  157. return $button_map;
  158. }
  159. public function initializationCompanyList($data, $user){
  160. $model = Depart::where('del_time',0)
  161. ->where('parent_id', 0)
  162. ->select('*')
  163. ->orderby('id', 'desc');
  164. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  165. if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
  166. $list = $this->limit($model,'',$data);
  167. return [true, $list];
  168. }
  169. // 公司初始化 返回 公司后台管理员账户 密码
  170. public function initializationCompany($data, $user){
  171. if(empty($data['title'])) return [false, '公司名称不能为空'];
  172. if(empty($data['code'])) return [false, '公司代码不能为空'];
  173. // ^[A-Za-z]+$ 表示从头到尾只能是英文字母(不区分大小写)
  174. if (! preg_match('/^[A-Za-z]+$/', $data['code']) || mb_strlen($data['code']) < 4) return [false, "公司代码必须全为英文且长度需大于等于 4 位"];
  175. $exists = Depart::where('parent_id', 0)
  176. ->where('del_time', 0)
  177. ->where(function($query) use ($data) {
  178. $query->where('title', $data['title'])
  179. ->orWhere('code', $data['code']);
  180. })
  181. ->exists();
  182. if($exists) return [false, '公司名称或公司代码已存在,新增失败'];
  183. $account = $data['code'] . "_" . 'admin';
  184. $exists = Employee::where('del_time', 0)
  185. ->where('account', $account)
  186. ->exists();
  187. if($exists) return [false, '创建账号已存在,新增失败'];
  188. try {
  189. DB::beginTransaction();
  190. //创建公司
  191. $model = new Depart();
  192. $model->parent_id = 0;
  193. $model->title = $data['title'];
  194. $model->code = $data['code'];
  195. $model->top_depart_id = 0;
  196. $model->save();
  197. //公司ID
  198. $top_depart_id = $model->id;
  199. $password = $this->generateAt8CharPassword();
  200. //创建账号
  201. $model_2 = new Employee();
  202. $model_2->title = $data['title'];
  203. $model_2->account = $account;
  204. $model_2->password = Hash::make($password);
  205. $model_2->is_admin = Employee::IS_ADMIN_TWO;
  206. $model_2->top_depart_id = $top_depart_id;
  207. $model_2->state = Employee::TYPE_ONE;
  208. $model_2->save();
  209. $employee_id = $model_2->id;
  210. //关联人员的部门初始信息
  211. $model_3 = new EmployeeDepartPermission();
  212. $model_3->employee_id = $employee_id;
  213. $model_3->depart_id = 0;
  214. $model_3->top_depart_id = $top_depart_id;
  215. $model_3->save();
  216. //公司上班时段
  217. $work_range[] = [
  218. 'top_depart_id' => $top_depart_id,
  219. 'start_time_hour' => 9,
  220. 'start_time_min' => 0,
  221. 'end_time_hour' => 12,
  222. 'end_time_min' => 0,
  223. 'total_work_min' => 180,
  224. ];
  225. $work_range[] = [
  226. 'top_depart_id' => $top_depart_id,
  227. 'start_time_hour' => 13,
  228. 'start_time_min' => 0,
  229. 'end_time_hour' => 18,
  230. 'end_time_min' => 0,
  231. 'total_work_min' => 300,
  232. ];
  233. WorkRangeDetails::insert($work_range);
  234. DB::commit();
  235. }catch (\Throwable $exception){
  236. DB::rollBack();
  237. return [false, $exception->getMessage()];
  238. }
  239. return [true, ['account' => $account, 'password' => $password]];
  240. }
  241. function generateAt8CharPassword() {
  242. $lettersNumbers = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789';
  243. $password = '@'; // 1. 先把固定的 @ 放进去
  244. // 2. 随机抽取 6 位英文或数字
  245. for ($i = 0; $i < 6; $i++) {
  246. $password .= $lettersNumbers[random_int(0, strlen($lettersNumbers) - 1)];
  247. }
  248. // 3. 打乱顺序,让 @ 的位置不固定
  249. return str_shuffle($password);
  250. }
  251. // 菜单
  252. public function menuList($data, $user){
  253. $type = $data['type'] ?? "";
  254. if(empty($type)){
  255. //权限
  256. $sysList = SysMenu::where('del_time',0)
  257. ->where('type', SysMenu::type_zero)
  258. ->select('title','icon','uri','parent_id','sort','id','is_authority', 'state')
  259. ->orderBy('sort','desc')
  260. ->get()
  261. ->toArray();
  262. $button = SysMenuButton::where('del_time',0)
  263. ->select('id','title','sort','func','menu_id')
  264. ->get()->toArray();
  265. $return = $this->fillMenuButton($button,$sysList, $user);
  266. }elseif($type == "all"){
  267. $sysList = SysMenu::where('del_time',0)
  268. ->where('type', SysMenu::type_one)
  269. ->select('title','icon','uri','parent_id','sort','id','is_authority', 'state')
  270. ->orderBy('sort','desc')
  271. ->get()
  272. ->toArray();
  273. //侧边栏
  274. $return = $this->returnTwo($sysList, $user);
  275. $return = [
  276. 'one' => $sysList,
  277. 'two' => $return,
  278. ];
  279. }
  280. return [true, $return];
  281. }
  282. private function returnTwo($sysList, $user){
  283. foreach ($sysList as $key => $value){
  284. if($value['state'] <= 0) unset($sysList[$key]);
  285. }
  286. $list = array_values($sysList);
  287. $return = $this->makeTree(0,$list);
  288. return $this->set_sort_circle($return);;
  289. }
  290. public function fillMenuButton($button, $menu, $user)
  291. {
  292. // 1. 预处理所有按钮池(合并配置中的特殊按钮)
  293. $allButtons = collect($button)->concat(config('specialButton') ?? [])->groupBy('menu_id');
  294. // 2. 获取权限基础数据
  295. $isSuper = ($user['is_admin'] == Employee::IS_ADMIN_THREE);
  296. $result = [];
  297. foreach ($menu as $m) {
  298. $menuId = $m['id'];
  299. // 权限过滤:非超管
  300. if (!$isSuper) continue;
  301. // 计算当前菜单拥有的按钮
  302. $btns = $allButtons->get($menuId) ?? [];
  303. $m['button'] = $btns;
  304. $result[] = $m;
  305. }
  306. return $result;
  307. }
  308. // 管理员
  309. public function employeeCommon($data,$user){
  310. $model = Employee::where('del_time',0)
  311. ->where('is_admin', Employee::IS_ADMIN_TWO)
  312. ->select('id', 'account', 'crt_time', 'top_depart_id','title')
  313. ->orderBy('id','desc');
  314. if(! empty($data['id'])) $model->whereIn('id', $data['id']);
  315. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  316. if(! empty($data['mobile'])) $model->where('mobile', 'LIKE', '%'.$data['mobile'].'%');
  317. if(! empty($data['role'])) {
  318. $emp = EmployeeRole::where('role_id',$data['role'])
  319. ->where('del_time',0)
  320. ->select('employee_id')->get()->toArray();
  321. $model->whereIn('id',array_column($emp,'employee_id'));
  322. }
  323. return $model;
  324. }
  325. public function employeeList($data,$user){
  326. $model = $this->employeeCommon($data, $user);
  327. $list = $this->limit($model,'',$data);
  328. $list = $this->organizationEmployeeData($list, $data, $user);
  329. return [true, $list];
  330. }
  331. public function organizationEmployeeData($data, $ergs, $user)
  332. {
  333. if (empty($data['data'])) return $data;
  334. // 获取员工ID并查询扩展数据
  335. $employee_ids = array_column($data['data'], 'id');
  336. list($status, $extraMap) = $this->getEmployee($employee_ids);
  337. $depart_map = Depart::whereIn('id', array_unique(array_column($data['data'],'top_depart_id')))
  338. ->pluck('title', 'id')
  339. ->toArray();
  340. foreach ($data['data'] as &$item) {
  341. $id = $item['id'];
  342. $extra = $extraMap[$id] ?? null;
  343. $item['role'] = $extra['role_ids'] ?? [];
  344. $item['role_name'] = isset($extra['role_names']) ? implode(',', $extra['role_names']) : '';
  345. $item['top_depart_title'] = $depart_map[$item['top_depart_id']];
  346. $item['crt_time'] = !empty($item['crt_time']) ? date("Y-m-d", $item['crt_time']) : "";
  347. }
  348. return $data;
  349. }
  350. public function getEmployee(array $employee_ids)
  351. {
  352. if (empty($employee_ids)) return [false, []];
  353. // 1. 一次性获取所有角色
  354. $roles = DB::table('employee_role as a')
  355. ->join('role as b', 'a.role_id', '=', 'b.id')
  356. ->where('a.del_time', 0)
  357. ->where('b.del_time', 0)
  358. ->whereIn("a.employee_id", $employee_ids)
  359. ->select('a.employee_id', 'b.title', 'b.id')
  360. ->get();
  361. $resultMap = [];
  362. foreach ($roles as $r) {
  363. $resultMap[$r->employee_id]['role_ids'][] = $r->id;
  364. $resultMap[$r->employee_id]['role_names'][] = $r->title;
  365. }
  366. return [true, $resultMap];
  367. }
  368. public function employeeEdit($data,$user){
  369. list($status,$msg) = $this->employeeRule($data,$user,false);
  370. if(!$status) return [$status,$msg];
  371. try {
  372. DB::beginTransaction();
  373. $model = new Employee();
  374. $model = $model->where('id',$data['id'])->first();
  375. if($model->is_admin && $data['password'] !== '******') {
  376. $model->password = Hash::make($data['password']);
  377. $model->p_version = $model->p_version + 1;
  378. }
  379. $model->save();
  380. $time = time();
  381. EmployeeRole::where('employee_id',$data['id'])->update([
  382. 'del_time' => $time
  383. ]);
  384. if(! empty($data['role'])){
  385. $insert = [];
  386. foreach ($data['role'] as $value){
  387. $insert[] = [
  388. 'employee_id' => $model->id,
  389. 'role_id' => $value,
  390. 'crt_time' => $time,
  391. ];
  392. }
  393. EmployeeRole::insert($insert);
  394. }
  395. DB::commit();
  396. }catch (\Exception $exception){
  397. DB::rollBack();
  398. return [false, $exception->getMessage()];
  399. }
  400. return [true, ''];
  401. }
  402. public function employeeRule(&$data, $user, $is_add = true){
  403. if(empty($data['id'])) return [false, '管理员ID不能为空'];
  404. $bool = Employee::where('del_time',0)
  405. ->where('id', $data['id'])
  406. ->exists();
  407. if(! $bool) return [false, '管理员账户不存在或已被删除'];
  408. if(empty($data['password'])) return [false, '密码不能为空'];
  409. if(mb_strlen($data['password']) < 6) return [false, '密码长度不得小于6位长度'];
  410. return [true, ''];
  411. }
  412. public static function checkCenterUser($employee){
  413. if(empty($employee['employee_id'])) return [false, 'token错误'];
  414. if(! isset($employee['p_version'])) return [false, 'token错误'];
  415. $result = Employee::where('id', $employee['employee_id'])
  416. ->where('del_time',0)
  417. ->first();
  418. if(empty($result)) return [false, '账号不存在或已被删除'];
  419. $result = $result->toArray();
  420. if($result['is_admin'] != Employee::IS_ADMIN_THREE) return [false, '账号限制登录'];
  421. if($result['p_version'] != $employee['p_version']) return [false, '请重新登录'];
  422. return [true, $result];
  423. }
  424. }