EmployeeService.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  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 Illuminate\Support\Facades\DB;
  11. use Illuminate\Support\Facades\Hash;
  12. use Mockery\Exception;
  13. class EmployeeService extends Service
  14. {
  15. public function employeeEditOther($data,$user){
  16. list($status,$msg) = $this->employeeOtherRule($data,$user);
  17. if(!$status) return [$status,$msg];
  18. try {
  19. DB::beginTransaction();
  20. $model = new Employee();
  21. $model = $model->where('id',$user['id'])->first();
  22. $model->password = Hash::make($data['new_password']);
  23. $model->save();
  24. DB::commit();
  25. }catch (\Exception $exception){
  26. DB::rollBack();
  27. return [false, $exception->getMessage()];
  28. }
  29. return [true,''];
  30. }
  31. public function employeeOtherRule($data,$user){
  32. if(! isset($data['old_password'])) return [false,'请输入原密码'];
  33. if($data['old_password'] == "") return [false,'原密码不能为空'];
  34. if(! isset($data['new_password'])) return [false,'请输入新密码'];
  35. if($data['new_password'] == "") return [false,'新密码不能为空'];
  36. if(! isset($data['re_password'])) return [false,'请输入确认密码'];
  37. if($data['re_password'] == "") return [false,'确认密码不能为空'];
  38. if(! Hash::check($data['old_password'], $user['password'])) return [false,'原密码错误'];
  39. if($data['new_password'] == $data['old_password']) return [false,'原密码与新密码一致'];
  40. if($data['new_password'] !== $data['re_password']) return [false,'新密码与确认密码不一致'];
  41. return [true,''];
  42. }
  43. public function employeeEdit($data,$user){
  44. list($status,$msg) = $this->employeeRule($data,$user,false);
  45. if(!$status) return [$status,$msg];
  46. try {
  47. DB::beginTransaction();
  48. $model = new Employee();
  49. $model = $model->where('id',$data['id'])->first();
  50. $model->number = $data['number'];
  51. $model->title = $data['title'];
  52. $model->mobile = $data['mobile'] ?? '';
  53. $model->is_admin = $data['is_admin'];
  54. if($model->is_admin && $data['password'] !== '******') $model->password = Hash::make($data['password']);
  55. $model->save();
  56. EmployeeDepartPermission::where('employee_id',$data['id'])->delete();
  57. if(isset($data['depart'])){
  58. $insert = [];
  59. foreach ($data['depart'] as $value){
  60. $insert[] = [
  61. 'employee_id' => $model->id,
  62. 'depart_id' => $value,
  63. ];
  64. }
  65. EmployeeDepartPermission::insert($insert);
  66. }
  67. EmployeeRole::where('employee_id',$data['id'])->update([
  68. 'del_time' => time()
  69. ]);
  70. if(isset($data['role'])){
  71. $insert = [];
  72. foreach ($data['role'] as $value){
  73. $insert[] = [
  74. 'employee_id' => $model->id,
  75. 'role_id' => $value,
  76. 'crt_time' => time(),
  77. 'upd_time' => time(),
  78. ];
  79. }
  80. EmployeeRole::insert($insert);
  81. }
  82. DB::commit();
  83. }catch (\Exception $exception){
  84. DB::rollBack();
  85. return [false, $exception->getMessage()];
  86. }
  87. return [true,''];
  88. }
  89. public function employeeAdd($data,$user){
  90. list($status,$msg) = $this->employeeRule($data, $user);
  91. if(!$status) return [$status,$msg];
  92. try{
  93. DB::beginTransaction();
  94. $model = new Employee();
  95. $model->number = $data['number'];
  96. $model->title = $data['title'];
  97. $model->mobile = $data['mobile'] ?? '';
  98. $model->crt_id = $user['id'];
  99. $model->is_admin = $data['is_admin'];
  100. $model->account = $data['account'] ?? "";
  101. if($model->is_admin && $data['password']) $model->password = Hash::make($data['password']);
  102. $model->top_depart_id = $data['top_depart_id'];
  103. $model->save();
  104. if(isset($data['depart'])){
  105. $insert = [];
  106. foreach ($data['depart'] as $value){
  107. $insert[] = [
  108. 'employee_id' => $model->id,
  109. 'depart_id' => $value,
  110. ];
  111. }
  112. EmployeeDepartPermission::insert($insert);
  113. }
  114. if(isset($data['role'])){
  115. $insert = [];
  116. foreach ($data['role'] as $value){
  117. $insert[] = [
  118. 'employee_id' => $model->id,
  119. 'role_id' => $value,
  120. 'crt_time' => time(),
  121. 'upd_time' => time(),
  122. ];
  123. }
  124. EmployeeRole::insert($insert);
  125. }
  126. DB::commit();
  127. }catch (Exception $e){
  128. DB::rollBack();
  129. return [false, $e->getMessage()];
  130. }
  131. return [true,''];
  132. }
  133. public function employeeDel($data){
  134. if($this->isEmpty($data,'id')) return [false,'请选择删除的数据!'];
  135. Employee::whereIn('id',$data['id'])->update([
  136. 'del_time'=>time()
  137. ]);
  138. EmployeeRole::where('del_time',0)->whereIn('employee_id',$data['id'])->update([
  139. 'del_time'=>time()
  140. ]);
  141. EmployeeDepartPermission::whereIn('employee_id',$data['id'])->delete();
  142. return [true,'删除成功'];
  143. }
  144. public function employeeList($data,$user){
  145. $model = Employee::TopClear($user,$data);
  146. $model = $model->where('del_time',0)
  147. ->select('number','mobile','title','id','is_admin', 'account', 'crt_time')
  148. ->orderBy('id','desc');
  149. if(! empty($data['number'])) $model->where('number', 'LIKE', '%'.$data['number'].'%');
  150. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  151. if(! empty($data['mobile'])) $model->where('mobile', 'LIKE', '%'.$data['mobile'].'%');
  152. if(! empty($data['role'])) {
  153. $emp = EmployeeRole::where('role_id',$data['role'])
  154. ->where('del_time',0)
  155. ->select('employee_id')->get()->toArray();
  156. $model->whereIn('id',array_column($emp,'employee_id'));
  157. }
  158. $list = $this->limit($model,'',$data);
  159. //组织数据
  160. $list = $this->organizationEmployeeData($list);
  161. return [true , $list];
  162. }
  163. public function organizationEmployeeData($data)
  164. {
  165. if (empty($data['data'])) return $data;
  166. // 获取员工ID并查询扩展数据
  167. $employee_ids = array_column($data['data'], 'id');
  168. list($status, $extraMap) = $this->getEmployee($employee_ids);
  169. foreach ($data['data'] as &$item) {
  170. $id = $item['id'];
  171. $extra = $extraMap[$id] ?? null;
  172. $item['role'] = $extra['role_ids'] ?? [];
  173. $item['role_name'] = isset($extra['role_names']) ? implode(',', $extra['role_names']) : '';
  174. $item['depart'] = $extra['depart_ids'] ?? [];
  175. $item['depart_title'] = isset($extra['depart_names']) ? implode(',', $extra['depart_names']) : '';
  176. // 业务状态字段
  177. $item['is_admin_title'] = Employee::IS_ADMIN_TITLE[$item['is_admin']] ?? "";
  178. $item['crt_time'] = !empty($item['crt_time']) ? date("Y-m-d", $item['crt_time']) : "";
  179. }
  180. return $data;
  181. }
  182. public function getEmployee(array $employee_ids)
  183. {
  184. if (empty($employee_ids)) return [false, []];
  185. // 1. 一次性获取所有角色
  186. $roles = DB::table('employee_role as a')
  187. ->join('role as b', 'a.role_id', '=', 'b.id')
  188. ->where('a.del_time', 0)
  189. ->where('b.del_time', 0)
  190. ->whereIn("a.employee_id", $employee_ids)
  191. ->select('a.employee_id', 'b.title', 'b.id')
  192. ->get();
  193. // 2. 一次性获取所有部门
  194. $departs = DB::table('employee_depart_permission as a')
  195. ->join('depart as b', 'a.depart_id', '=', 'b.id')
  196. ->whereIn("a.employee_id", $employee_ids)
  197. ->select('a.employee_id', 'b.title', 'b.id')
  198. ->orderBy('b.id')
  199. ->get();
  200. // 3. 结果按员工ID分组归纳
  201. $resultMap = [];
  202. foreach ($employee_ids as $id) {
  203. $resultMap[$id] = [
  204. 'role_ids' => [],
  205. 'role_names' => [],
  206. 'depart_ids' => [],
  207. 'depart_names' => []
  208. ];
  209. }
  210. foreach ($roles as $r) {
  211. $resultMap[$r->employee_id]['role_ids'][] = $r->id;
  212. $resultMap[$r->employee_id]['role_names'][] = $r->title;
  213. }
  214. foreach ($departs as $d) {
  215. $resultMap[$d->employee_id]['depart_ids'][] = $d->id;
  216. $resultMap[$d->employee_id]['depart_names'][] = $d->title;
  217. }
  218. return [true, $resultMap];
  219. }
  220. public function employeeRule(&$data, $user,$is_add = true){
  221. if(empty($data['number'])) return [false,'工号不存在'];
  222. if(empty($data['title'])) return [false,'姓名不存在'];
  223. if(empty($data['depart'])) return [false,'部门不能为空'];
  224. if(! empty($data['is_admin']) && empty($data['password'])) return [false, '密码不能为空'];
  225. $data['top_depart_id'] = $user['top_depart_id'];
  226. $mobile = $data['mobile'] ?? "";
  227. $number = $data['number'] ?? "";
  228. if(! $is_add){
  229. if($this->isEmpty($data,'id')) return [false,'ID不能为空'];
  230. $bool = Employee::where('del_time',0)
  231. ->where('id','<>',$data['id'])
  232. ->where(function ($query) use ($mobile, $number){
  233. $query->where('number', $number);
  234. $query->when(! empty($mobile), function ($query) use ($mobile) {
  235. return $query->orWhere('mobile', $mobile);
  236. });
  237. })->exists();
  238. }else{
  239. if(! empty($data['is_admin'])){
  240. $code = Depart::where('id', $user['top_depart_id'])->value('code');
  241. $data['account'] = $code . "_" . $data['number'];
  242. }
  243. $bool = Employee::where('del_time',0)
  244. ->where(function ($query) use ($mobile, $number){
  245. $query->where('number', $number);
  246. $query->when(! empty($mobile), function ($query) use ($mobile) {
  247. return $query->orWhere('mobile', $mobile);
  248. });
  249. })->exists();
  250. }
  251. if($bool) return [false,'工号或手机号码已存在'];
  252. return [true,''];
  253. }
  254. public function roleEdit($data,$user){
  255. list($status,$msg) = $this->roleRule($data,$user, false);
  256. if(!$status) return [$status,$msg];
  257. $model = new Role();
  258. $model = $model->where('id',$data['id'])->first();
  259. $model->title = $data['title'];
  260. $model->save();
  261. return [true,''];
  262. }
  263. public function roleAdd($data,$user){
  264. list($status,$msg) = $this->roleRule($data,$user);
  265. if(!$status) return [$status,$msg];
  266. $model = new Role();
  267. $model->title = $data['title'] ;
  268. $model->top_depart_id = $data['top_depart_id'];
  269. $model->save();
  270. return [true,''];
  271. }
  272. public function roleDel($data){
  273. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  274. $bool = EmployeeRole::where('del_time',0)
  275. ->whereIn('role_id',$data['id'])
  276. ->exists();
  277. if($bool) return [false,'角色已绑定人员'];
  278. Role::where('id',$data['id'])->update([
  279. 'del_time' => time()
  280. ]);
  281. RoleMenu::where('del_time',0)->where('role_id',$data['id'])->update([
  282. 'del_time' => time()
  283. ]);
  284. RoleMenuButton::where('del_time',0)->where('role_id',$data['id'])->update([
  285. 'del_time' => time()
  286. ]);
  287. return [true, ''];
  288. }
  289. public function roleList($data,$user){
  290. $model = Role::TopClear($user,$data);
  291. $model = $model->where('del_time',0)
  292. ->select('title','crt_time','id','upd_time')
  293. ->orderBy('id','desc');
  294. if(! empty($data['title'])) $model->where('title', 'LIKE', '%' . $data['title'] . '%');
  295. $list = $this->limit($model,'',$data);
  296. return [true, $list];
  297. }
  298. public function roleRule(&$data,$user, $is_check = true){
  299. if($this->isEmpty($data,'title')) return [false,'名称不能为空'];
  300. $data['top_depart_id'] = $user['top_depart_id'];
  301. if($is_check){
  302. $bool = Role::where('title',$data['title'])
  303. ->where('top_depart_id', $data['top_depart_id'])
  304. ->where('del_time',0)
  305. ->exists();
  306. if($bool) return [false,'角色名称已存在'];
  307. }else{
  308. if($this->isEmpty($data,'id')) return [false,'ID不能为空'];
  309. $top_depart_id = Role::where('id',$data['id'])->value('top_depart_id');
  310. $bool = Role::where('title',$data['title'])
  311. ->where('top_depart_id',$top_depart_id)
  312. ->where('id','<>',$data['id'])
  313. ->where('del_time',0)
  314. ->exists();
  315. if($bool) return [false,'角色名称已存在'];
  316. }
  317. return [true, ''];
  318. }
  319. public function roleMenu($data){
  320. if(empty($data['role_id'])) return [false,'角色不能为空!'];
  321. if(empty($data['menu'])) return [false,'菜单数据不能为空!'];
  322. DB::beginTransaction();
  323. try {
  324. RoleMenu::where('del_time',0)->where('role_id',$data['role_id'])->update(['del_time' => time()]);
  325. RoleMenuButton::where('del_time',0)->where('role_id',$data['role_id'])->update(['del_time' => time()]);
  326. $insert = $insert2 = [];
  327. foreach ($data['menu'] as $t){
  328. $insert[] = [
  329. 'role_id' => $data['role_id'],
  330. 'menu_id' => $t['menu_id'],
  331. 'type' => $t['type'],
  332. 'crt_time' => time()
  333. ];
  334. if(! empty($t['button'])){
  335. foreach ($t['button'] as $b){
  336. $insert2[] = [
  337. 'role_id' => $data['role_id'],
  338. 'menu_id' => $t['menu_id'],
  339. 'button_id' => $b,
  340. 'crt_time' => time()
  341. ];
  342. }
  343. RoleMenuButton::insert($insert2);
  344. }
  345. }
  346. RoleMenu::insert($insert);
  347. DB::commit();
  348. }catch (\Throwable $exception){
  349. DB::rollBack();
  350. return [false,$exception->getMessage()];
  351. }
  352. return [true, ''];
  353. }
  354. public function roleDetail($data){
  355. if(empty($data['role_id'])) return [false,'请选择角色'];
  356. $role = Role::where('id',$data['role_id'])
  357. ->where('del_time',0)
  358. ->select('id','title')
  359. ->first();
  360. if(empty($role)) return [false,'角色不存在或已被删除'];
  361. $role = $role->toArray();
  362. $menu = RoleMenu::where('role_id',$data['role_id'])
  363. ->where('del_time',0)
  364. ->select('menu_id','type')
  365. ->get()->toArray();
  366. $button = $this->fillRoleButton([$data['role_id']]);
  367. foreach ($menu as $key => $value){
  368. $menu[$key]['button'] = $button[$value['menu_id']] ?? [];
  369. }
  370. $role['menu'] = $menu;
  371. return [true, $role];
  372. }
  373. public function departEdit($data, $user){
  374. list($status,$msg) = $this->departRule($data,$user,false);
  375. if(!$status) return [$status,$msg];
  376. $update = $msg['data'][0];
  377. $model = new Depart();
  378. $model->where('id',$data['id'])->update($update);
  379. return [true, ''];
  380. }
  381. public function departAdd($data,$user){
  382. list($status,$msg) = $this->departRule($data,$user);
  383. if(!$status) return [$status,$msg];
  384. try {
  385. DB::beginTransaction();
  386. foreach ($msg['data'] as $value){
  387. $model = new Depart();
  388. $model->parent_id = $value['parent_id'];
  389. $model->title = $value['title'];
  390. $model->code = $value['code'];
  391. $model->top_depart_id = $value['top_depart_id'];
  392. $model->save();
  393. }
  394. DB::commit();
  395. }catch (\Exception $exception){
  396. DB::rollBack();
  397. return [false,$exception->getMessage()];
  398. }
  399. return [true,''];
  400. }
  401. public function departDel($data){
  402. list($status,$msg) = $this->checkDepartDel($data);
  403. if(! $status) return [false, $msg];
  404. Depart::whereIn('id',$data['id'])->update([
  405. 'del_time'=>time()
  406. ]);
  407. return [true,''];
  408. }
  409. public function checkDepartDel($data){
  410. if($this->isEmpty($data,'id')) return [false,'ID不能为空'];
  411. $bool = Depart::whereIn('parent_id',$data['id'])->where('del_time',0)->exists();
  412. if($bool) return [false,'部门下有子部门!'];
  413. if($this->checkDepartHasPerson($data['id'])) return [false,'部门下有人员档案!'];
  414. return [true, ''];
  415. }
  416. public function departList($data, $user){
  417. $model = Depart::TopClear($user,$data);
  418. $model = $model->where('del_time',0)
  419. ->select('title','id','code','parent_id','is_use')
  420. ->orderby('id', 'asc');
  421. if(isset($data['parent_id'])) $model->where('parent_id', $data['parent_id']);
  422. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  423. if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
  424. $list = $model->get()->toArray();
  425. $list = $this->fillDepartList($list, $user);
  426. $list_tree = $list;
  427. if(! empty($list_tree)) {
  428. $minParentId = min(array_column($list_tree, 'parent_id'));
  429. $list_tree = $this->makeTree($minParentId,$list_tree);
  430. $list_tree = $this->set_sort_circle($list_tree);
  431. }
  432. return [true,['data' => $list,'tree' => $list_tree]];
  433. }
  434. public function fillDepartList($list,$user){
  435. if(empty($list)) return $list;
  436. // foreach ($list as $key => $value){
  437. //
  438. // }
  439. return $list;
  440. }
  441. public function departRule($data,$user, $is_check = true){
  442. if(empty($data['data'])) return [false,'数据不能为空!'];
  443. $code = array_column($data['data'],'code');
  444. $title = array_column($data['data'],'title');
  445. $code = array_map(function($val) {
  446. return $val !== null ? $val : 0;
  447. }, $code);
  448. $title = array_map(function($val) {
  449. return $val !== null ? $val : 0;
  450. }, $title);
  451. $code_count = array_count_values($code);
  452. $title_count = array_count_values($title);
  453. foreach ($code as $value){
  454. if(empty($value)) return [false,'编码不能为空!'];
  455. if($code_count[$value] > 1) return [false,'编码不能重复'];
  456. }
  457. foreach ($title as $value){
  458. if(empty($value)) return [false,'名称不能为空!'];
  459. if($title_count[$value] > 1) return [false,'名称不能重复'];
  460. }
  461. foreach ($data['data'] as $key => $value){
  462. $top_depart_id = $user['top_depart_id'];
  463. if(empty($value['parent_id'])) $data['data'][$key]['parent_id'] = $user['top_depart_id'];
  464. $data['data'][$key]['top_depart_id'] = $top_depart_id;
  465. $data['data'][$key]['upd_time'] = time();
  466. if($is_check){
  467. $data['data'][$key]['crt_time'] = time();
  468. $bool = Depart::whereRaw("binary code = '{$value['code']}'")
  469. ->where('parent_id', $top_depart_id)
  470. ->where('del_time',0)
  471. ->exists();
  472. }else{
  473. if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
  474. $bool = Depart::whereRaw("binary code = '{$value['code']}'")
  475. ->where('parent_id', $top_depart_id)
  476. ->where('id','<>',$data['id'])
  477. ->where('del_time',0)
  478. ->exists();
  479. }
  480. if($bool) return [false,'部门编码不能重复'];
  481. }
  482. return [true, $data];
  483. }
  484. public function checkDepartHasPerson($depart_id = []){
  485. if(empty($depart_id)) return false;
  486. $bool = EmployeeDepartPermission::from('employee_depart_permission as a')
  487. ->leftJoin('employee as b','b.id','a.employee_id')
  488. ->where('b.del_time',0)
  489. ->whereIn('a.depart_id',$depart_id)
  490. ->exists();
  491. return $bool;
  492. }
  493. public function fillRoleButton($role_id){
  494. $button = RoleMenuButton::whereIn('role_id',$role_id)
  495. ->where('del_time',0)
  496. ->select('menu_id','button_id')
  497. ->get()->toArray();
  498. $button_map = [];
  499. foreach ($button as $value){
  500. if(! isset($button_map[$value['menu_id']])){
  501. $button_map[$value['menu_id']][] = $value['button_id'];
  502. }else{
  503. if(! in_array($value['button_id'], $button_map[$value['menu_id']])) $button_map[$value['menu_id']][] = $value['button_id'];
  504. }
  505. }
  506. return $button_map;
  507. }
  508. }