MiddleGroundService.php 18 KB

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