EmployeeService.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  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\EmployeeManagerDepart;
  7. use App\Model\EmployeeMenuPermission;
  8. use App\Model\EmployeeRole;
  9. use App\Model\EmployeeTeamPermission;
  10. use App\Model\Role;
  11. use App\Model\SysMenu;
  12. use App\Model\Team;
  13. use Illuminate\Support\Facades\DB;
  14. use Illuminate\Support\Facades\Hash;
  15. /**
  16. * 人员相关
  17. * @package App\Models
  18. */
  19. class EmployeeService extends Service
  20. {
  21. public function employeeEdit($data,$user){
  22. list($status,$msg) = $this->employeeRule($data,false);
  23. if(!$status) return [$status,$msg];
  24. $model = new Employee();
  25. $model = $model->where('id',$data['id'])->first();
  26. $model->id_card = $data['id_card']??'';
  27. $model->number = $data['number'] ;
  28. $model->mobile = $data['mobile']??'';
  29. $model->emp_name = $data['emp_name'];
  30. $model->is_admin = $data['is_admin'];
  31. if($model->is_admin == 1){
  32. $model->account = $data['number'];
  33. if($data['password'] !== '********'){
  34. $model->password = Hash::make($data['password']);
  35. }
  36. $model->sqlserver_account = $data['sqlserver_account'] ?? '';
  37. if(! empty($data['sqlserver_password']) && $data['sqlserver_password'] !== '********'){
  38. $model->sqlserver_password = $data['sqlserver_password'];
  39. }else{
  40. $model->sqlserver_password = '';
  41. }
  42. }
  43. $model->save();
  44. $permisson_model = new EmployeeDepartPermission();
  45. $permisson_model = $permisson_model->where('employee_id',$data['id'])->first();
  46. if($permisson_model){
  47. $permisson_model->depart_id = $data['depart_id'] ?? 0;
  48. $permisson_model->save();
  49. }else{
  50. $permisson_model = new EmployeeDepartPermission();
  51. $permisson_model->employee_id = $data['id'];
  52. $permisson_model->depart_id = $data['depart_id'] ?? 0;
  53. $permisson_model->save();
  54. }
  55. return [true,'保存成功!'];
  56. }
  57. public function employeeAdd($data,$user){
  58. list($status,$msg) = $this->employeeRule($data);
  59. if(!$status) return [$status,$msg];
  60. $model = new Employee();
  61. $model->id_card = $data['id_card']??'';
  62. $model->number = $data['number'] ;
  63. $model->mobile = $data['mobile']??'';
  64. $model->emp_name = $data['emp_name'];
  65. $model->state = 1;
  66. $model->crt_id = $user['id'];
  67. $model->is_admin = $data['is_admin'];
  68. if($model->is_admin == 1){
  69. $model->account = $data['number'];
  70. $model->password = Hash::make($data['password']);
  71. $model->sqlserver_account = $data['sqlserver_account'] ?? '';
  72. $model->sqlserver_password = $data['sqlserver_password'] ?? '';
  73. }
  74. $model->save();
  75. if(! empty($data['depart_id'])){
  76. $permisson_model = new EmployeeDepartPermission();
  77. $permisson_model->employee_id = $model->id;
  78. $permisson_model->depart_id = $data['depart_id'];
  79. $permisson_model->save();
  80. }
  81. return [true,'保存成功!'];
  82. }
  83. public function employeeDel($data){
  84. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  85. Employee::where('id',$data['id'])->update([
  86. 'del_time'=>time()
  87. ]);
  88. return [true,'删除成功'];
  89. }
  90. public function employeeList($data){
  91. $model = Employee::where('del_time',0)
  92. ->select('id_card','emp_name','mobile','crt_time','account','is_admin','upd_time','id','number','sqlserver_account','sqlserver_password')
  93. ->orderBy('id','desc');
  94. if(! empty($data['depart_id'])) {
  95. $depart = Depart::where('del_time',0)
  96. ->select('id','parent_id')
  97. ->get()->toArray();
  98. $result = array_merge($this->getAllDescendants($depart,$data['depart_id']),[$data['depart_id']]);
  99. $employee_id = DB::table('employee_depart_permission')
  100. ->whereIn("depart_id", $result)
  101. ->select("employee_id")
  102. ->get()->toArray();
  103. $employee_id = array_column($employee_id,'employee_id');
  104. $model->whereIn("id", $employee_id);
  105. }
  106. if(! empty($data['number'])) $model->where('number', 'LIKE', '%'.$data['number'].'%');
  107. if(! empty($data['emp_name'])) $model->where('emp_name', 'LIKE', '%'.$data['emp_name'].'%');
  108. $list = $this->limit($model,'',$data);
  109. //组织数据
  110. $list = $this->organizationEmployeeData($list);
  111. return [200,$list];
  112. }
  113. public function organizationEmployeeData($data) {
  114. if (empty($data['data'])) return $data;
  115. $res = DB::table('employee_depart_permission as a')
  116. ->select('a.employee_id','b.title','b.id')
  117. ->join('depart as b','a.depart_id','=','b.id')
  118. ->whereIn("a.employee_id",array_column($data['data'],'id'))
  119. ->get()->toArray();
  120. $map = array_column($res,null,'employee_id');
  121. $res = DB::table('employee_team_permission as a')
  122. ->select('a.employee_id','b.title','b.id')
  123. ->join('team as b','a.team_id','=','b.id')
  124. ->whereIn("a.employee_id",array_column($data['data'],'id'))
  125. ->get()->toArray();
  126. $map2 = array_column($res,null,'employee_id');
  127. foreach ($data['data'] as $key => $value){
  128. $data['data'][$key]['depart_id'] = $map[$value['id']]->id ?? '';
  129. $data['data'][$key]['depart_title'] = $map[$value['id']]->title ?? '';
  130. $data['data'][$key]['has_pwd'] = $value['sqlserver_password'] ? 1 : 0;
  131. unset($data['data'][$key]['sqlserver_password']);
  132. }
  133. return $data;
  134. }
  135. public function employeeRule($data,$is_add = true){
  136. if($this->isEmpty($data,'number')) return [false,'工号不存在!'];
  137. if($this->isEmpty($data,'emp_name')) return [false,'姓名不存在!'];
  138. if(! $is_add){
  139. if($this->isEmpty($data,'id')) return [false,'ID不能为空!'];
  140. $bool = Employee::where('number',$data['number'])
  141. ->where('id','<>',$data['id'])
  142. ->where('del_time',0)->exists();
  143. }else{
  144. $bool = Employee::where('number',$data['number'])
  145. ->where('del_time',0)->exists();
  146. }
  147. if($bool) return [false,'工号已存在!'];
  148. return [true,''];
  149. }
  150. public function roleEdit($data){
  151. list($status,$msg) = $this->roleRule($data);
  152. if(!$status) return [$status,$msg];
  153. $first = Role::where('title',$data['title'])->where('id','<>',$data['id'])->where('del_time',0)->first();
  154. if(!empty($first))return [false,'名称已存在!'];
  155. $model = new Role();
  156. $model = $model->where('id',$data['id'])->first();
  157. $model->title = $data['title'];
  158. $model->save();
  159. return [true,'保存成功!'];
  160. }
  161. public function roleAdd($data,$user){
  162. // if($this->isEmpty($data,'title')) return [201,'名称不存在!'];
  163. list($status,$msg) = $this->roleRule($data);
  164. if(!$status) return [$status,$msg];
  165. $first = SysMenu::where('title',$data['title'])->where('del_time',0)->first();
  166. if(!empty($first))return [false,'名称已存在!'];
  167. $model = new Role();
  168. $model->title = $data['title'] ;
  169. $model->save();
  170. return [true,'保存成功!'];
  171. }
  172. public function roleDel($data){
  173. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  174. Role::where('id',$data['id'])->update([
  175. 'del_time'=>time()
  176. ]);
  177. return [true,'删除成功'];
  178. }
  179. public function roleList($data){
  180. $list = Role::where('del_time',0)->select('title','title','crt_time','id','upd_time')->orderBy('id','desc');
  181. $list = $this->limit($list,'',$data);
  182. return [200,$list];
  183. }
  184. public function roleRule($data){
  185. if($this->isEmpty($data,'title')) return [false,'名称不存在!'];
  186. return [true,''];
  187. }
  188. public function departEdit($data){
  189. list($status,$msg) = $this->departRule($data,false);
  190. if(!$status) return [$status,$msg];
  191. $update = $msg['data'][0];
  192. $model = new Depart();
  193. $model->where('id',$data['id'])->update($update);
  194. return [true,'保存成功!'];
  195. }
  196. public function departAdd($data){
  197. list($status,$msg) = $this->departRule($data);
  198. if(!$status) return [$status,$msg];
  199. Depart::insert($msg['data']);
  200. return [true,'保存成功!'];
  201. }
  202. public function departDel($data){
  203. list($status,$msg) = $this->checkDepartDel($data);
  204. if(! $status) return [false, $msg];
  205. Depart::whereIn('id',$data['id'])->update([
  206. 'del_time'=>time()
  207. ]);
  208. return [true,'删除成功'];
  209. }
  210. public function departList($data){
  211. $model = Depart::where('del_time',0)
  212. ->select('title','id','code','parent_id','is_use')
  213. ->orderby('code', 'asc');
  214. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  215. if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
  216. $list = $model->get()->toArray();
  217. if(! empty($list)) {
  218. $list = $this->makeTree(0,$list);
  219. $list = $this->set_sort_circle($list);
  220. }
  221. return [200,$list];
  222. }
  223. public function departRule($data, $is_check = true){
  224. if($this->isEmpty($data,'data')) return [false,'数据不能为空!'];
  225. $code = array_column($data['data'],'code');
  226. $title = array_column($data['data'],'title');
  227. $code = array_map(function($val) {
  228. return $val !== null ? $val : 0;
  229. }, $code);
  230. $title = array_map(function($val) {
  231. return $val !== null ? $val : 0;
  232. }, $title);
  233. $code_count = array_count_values($code);
  234. $title_count = array_count_values($title);
  235. foreach ($code as $value){
  236. if(empty($value)) return [false,'编码不能为空!'];
  237. if($code_count[$value] > 1) return [false,'编码不能重复'];
  238. }
  239. foreach ($title as $value){
  240. if(empty($value)) return [false,'名称不能为空!'];
  241. if($title_count[$value] > 1) return [false,'名称不能重复'];
  242. }
  243. $depart_id = array_filter(array_column($data['data'],'parent_id'));
  244. $res = $this->checkDepartHasPerson($depart_id);
  245. if($res) return [false,'部门下已有人员,不能新建子部门!'];
  246. foreach ($data['data'] as $key => $value){
  247. if(empty($value['parent_id'])) $data['data'][$key]['parent_id'] = 0;
  248. $data['data'][$key]['upd_time'] = time();
  249. if($is_check){
  250. $data['data'][$key]['crt_time'] = time();
  251. $bool = Depart::whereRaw("(binary code = '{$value['code']}' OR title = '{$value['title']}')")
  252. ->where('del_time',0)
  253. ->exists();
  254. }else{
  255. if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
  256. if(! $value['is_use']) {
  257. $bool_is = $this->checkDepartHasPerson([$data['id']]);
  258. if($bool_is) return [false,'部门下已经有人员,停用失败!'];
  259. }
  260. $bool = Depart::whereRaw("(binary code = '{$value['code']}' OR title = '{$value['title']}')")
  261. ->where('id','<>',$data['id'])
  262. ->where('del_time',0)
  263. ->exists();
  264. }
  265. if($bool) return [false,'编码或部门名称不能重复'];
  266. }
  267. return [true, $data];
  268. }
  269. public function checkDepartDel($data){
  270. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  271. $bool = Depart::whereIn('parent_id',$data['id'])->where('del_time',0)->exists();
  272. if($bool) return [false,'部门下有子部门!'];
  273. if($this->checkDepartHasPerson($data['id'])) return [false,'部门下有人员档案!'];
  274. return [true, ''];
  275. }
  276. //检测部门下是否存在人员
  277. public function checkDepartHasPerson($depart_id = []){
  278. if(empty($depart_id)) return false;
  279. $bool = EmployeeDepartPermission::from('employee_depart_permission as a')
  280. ->leftJoin('employee as b','b.id','a.employee_id')
  281. ->where('b.del_time',0)
  282. ->whereIn('a.depart_id',$depart_id)
  283. ->exists();
  284. return $bool;
  285. }
  286. public function teamEdit($data){
  287. list($status,$msg) = $this->teamRule($data,false);
  288. if(!$status) return [$status,$msg];
  289. $model = new Team();
  290. $model = $model->where('id',$data['id'])->first();
  291. $model->title = $data['title'];
  292. $model->code = $data['code'];
  293. $model->save();
  294. return [true,'保存成功!'];
  295. }
  296. public function teamAdd($data,$user){
  297. list($status,$msg) = $this->teamRule($data);
  298. if(!$status) return [$status,$msg];
  299. $model = new Team();
  300. $model->title = $data['title'] ;
  301. $model->code = $data['code'];
  302. $model->save();
  303. return [true,'保存成功!'];
  304. }
  305. public function teamDel($data){
  306. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  307. Team::where('id',$data['id'])->update([
  308. 'del_time'=>time()
  309. ]);
  310. return [true,'删除成功'];
  311. }
  312. public function teamList($data){
  313. $list = Team::where('del_time',0)->select('title','id','crt_time','upd_time','code')->orderBy('id','desc');
  314. $list = $this->limit($list,'',$data);
  315. return [200,$list];
  316. }
  317. public function teamRule($data,$is_add = true){
  318. if($this->isEmpty($data,'title')) return [false,'名称不存在!'];
  319. if($this->isEmpty($data,'code')) return [false,'编码不存在'];
  320. $model = Team::where('title',$data['title'])
  321. ->where('code',$data['code'])
  322. ->where('del_time',0);
  323. if(! $is_add){
  324. if($this->isEmpty($data,'id')) return [false,'ID不能为空'];
  325. $model->where('id','<>',$data['id']);
  326. }
  327. $bool = $model->exists();
  328. if($bool) return [false,'名称和编码已存在!'];
  329. return [true,''];
  330. }
  331. public function teamDetail($data){
  332. if($this->isEmpty($data,'id')) return [false,'ID不能为空!'];
  333. $result = EmployeeTeamPermission::from('employee_team_permission as a')
  334. ->leftJoin('employee as b','b.id','a.employee_id')
  335. ->where('team_id',$data['id'])
  336. ->select('b.id','b.emp_name','b.number as code')
  337. ->get()->toArray();
  338. return [true,$result];
  339. }
  340. public function employeeRole($data){
  341. $role_ids = [];
  342. $employee_ids = [];
  343. foreach ($data as $v){
  344. if(isset($v['role_id'])){
  345. if(!in_array($v['role_id'],$role_ids)){
  346. $role_ids[] = $v['role_id'];
  347. }
  348. }
  349. if(isset($v['employee_id'])){
  350. if(!in_array($v['employee_id'],$employee_ids)){
  351. $employee_ids[] = $v['employee_id'];
  352. }
  353. }
  354. }
  355. EmployeeMenuPermission::wherein('role_id',$role_ids)->delete();
  356. EmployeeMenuPermission::wherein('employee_id',$employee_ids)->delete();
  357. EmployeeMenuPermission::insert($data);
  358. return [200,'保存成功!'];
  359. }
  360. public function employeeDepart($data){
  361. if($this->isEmpty($data,'insert')) return [false,'数据不能为空!'];
  362. DB::beginTransaction();
  363. try {
  364. if($data['type'] == 1){
  365. EmployeeDepartPermission::whereIn('depart_id',$data['insert']['depart_id'])->delete();
  366. }else{
  367. EmployeeDepartPermission::whereIn('employee_id',$data['insert']['employee_id'])->delete();
  368. }
  369. $insert = [];
  370. foreach ($data['insert']['depart_id'] as $t){
  371. foreach ($data['insert']['employee_id'] as $e){
  372. $insert[] = [
  373. 'depart_id' => $t,
  374. 'employee_id' => $e
  375. ];
  376. }
  377. }
  378. EmployeeDepartPermission::insert($insert);
  379. DB::commit();
  380. }catch (\Throwable $exception){
  381. DB::rollBack();
  382. return [false,$exception->getMessage()];
  383. }
  384. return [true,'保存成功!'];
  385. }
  386. public function employeeTeam($data){
  387. if($this->isEmpty($data,'insert')) return [false,'数据不能为空!'];
  388. DB::beginTransaction();
  389. try {
  390. if($data['type'] == 1){
  391. EmployeeTeamPermission::whereIn('team_id',$data['insert']['team_id'])->delete();
  392. }else{
  393. EmployeeTeamPermission::whereIn('employee_id',$data['insert']['employee_id'])->delete();
  394. }
  395. $insert = [];
  396. foreach ($data['insert']['team_id'] as $t){
  397. foreach ($data['insert']['employee_id'] as $e){
  398. $insert[] = [
  399. 'team_id' => $t,
  400. 'employee_id' => $e
  401. ];
  402. }
  403. }
  404. EmployeeTeamPermission::insert($insert);
  405. DB::commit();
  406. }catch (\Throwable $exception){
  407. DB::rollBack();
  408. return [false,$exception->getMessage()];
  409. }
  410. return [true,'保存成功!'];
  411. }
  412. public function loginRule($data){
  413. if($this->isEmpty($data,'account')) return [false,'账号不能为空!'];
  414. if($this->isEmpty($data,'password')) return [false,'密码不存在!'];
  415. $account = $data['account'];
  416. $res = Employee::where('del_time',0)
  417. ->where(function ($query)use($account) {
  418. $query->where('account', $account)
  419. ->orWhere('emp_name', $account);
  420. })
  421. ->get()->toArray();
  422. if(empty($res)) return [false,'账号不存在或已被删除!'];
  423. $res = reset($res);
  424. if(! Hash::check($data['password'], $res['password'])) return [false,'密码错误!'];
  425. if($res['is_admin'] != Employee::IS_ADMIN) return [false,'该账号不能登录!'];
  426. if($res['state'] == Employee::NOT_USE) return [false,'账号停用!'];
  427. return [true, ['id'=>$res['id'], 'name'=>$res['emp_name'], 'account' => $res['account']]];
  428. }
  429. public static function checkUser($userId){
  430. $res = Employee::where('id', $userId)
  431. ->where('del_time',0)
  432. ->where('is_admin',Employee::IS_ADMIN)
  433. ->where('state',Employee::USE)->get()->first();
  434. if(empty($res)) return [false, '该账号无法登录,请联系管理员!'];
  435. return [true, $res];
  436. }
  437. //获取登录账号的角色
  438. public static function getPersonRole($employee_id){
  439. if(empty($employee_id)) return [];
  440. $role = EmployeeRole::where('del_time',0)
  441. ->where('employee_id',$employee_id)
  442. ->select('role_id')
  443. ->get()->toArray();
  444. //组织
  445. $role_id = array_column($role,'role_id');
  446. asort($role_id);
  447. $role_id = array_values($role_id);
  448. return $role_id;
  449. }
  450. //获取登录账号的权限部门
  451. public static function getPersonDepart($employee_id){
  452. if(empty($employee_id)) return [];
  453. //admin账号
  454. if($employee_id == Employee::SPECIAL_ADMIN) return [Depart::RULE_DEPART];
  455. //操作人员直接绑定部门
  456. $employee_manager_depart = EmployeeManagerDepart::where('del_time',0)
  457. ->where('employee_id',$employee_id)
  458. ->select('depart_id')
  459. ->get()->toArray();
  460. //操作人员绑定角色
  461. $employee_role = EmployeeRole::from('employee_role as a')
  462. ->leftJoin('role_depart as b','b.role_id','a.role_id')
  463. ->select('b.depart_id','b.role_id')
  464. ->where('a.del_time',0)
  465. ->where('b.del_time',0)
  466. ->where('a.employee_id',$employee_id)
  467. ->get()->toArray();
  468. return array_filter(array_merge_recursive(array_column($employee_manager_depart,'depart_id'),array_column($employee_role,'depart_id')));
  469. }
  470. //人员直接绑定部门
  471. public function employeeManagerDepart($data,$user){
  472. if($user['id'] != Employee::SPECIAL_ADMIN) return [false,'非ADMIN账号不能操作'];
  473. if($this->isEmpty($data,'employee_id')) return [false,'请选择操作人员'];
  474. if($this->isEmpty($data,'depart_id')) return [false,'请选择部门'];
  475. EmployeeManagerDepart::where('employee_id',$data['employee_id'])->update([
  476. 'del_time' => time()
  477. ]);
  478. $insert = [];
  479. foreach ($data['depart_id'] as $value){
  480. $insert[] = [
  481. 'employee_id' => $data['employee_id'],
  482. 'depart_id' => $value,
  483. 'crt_time' => time(),
  484. 'upd_time' => time(),
  485. ];
  486. }
  487. EmployeeManagerDepart::insert($insert);
  488. return [true,''];
  489. }
  490. }