EmployeeService.php 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Depart;
  4. use App\Model\DepartPriceName;
  5. use App\Model\Employee;
  6. use App\Model\EmployeeDepartPermission;
  7. use App\Model\EmployeeManagerDepart;
  8. use App\Model\EmployeeMenuPermission;
  9. use App\Model\EmployeeRole;
  10. use App\Model\EmployeeTeamPermission;
  11. use App\Model\Role;
  12. use App\Model\RoleMenu;
  13. use App\Model\RoleMenuButton;
  14. use App\Model\SysMenu;
  15. use App\Model\SysMenuButton;
  16. use App\Model\Team;
  17. use Illuminate\Support\Facades\DB;
  18. use Illuminate\Support\Facades\Hash;
  19. use Mockery\Exception;
  20. /**
  21. * 人员相关
  22. * @package App\Models
  23. */
  24. class EmployeeService extends Service
  25. {
  26. /**
  27. * 用户编辑
  28. * @param $data
  29. * @param $user
  30. * @return array
  31. */
  32. public function employeeEdit($data,$user){
  33. list($status,$msg) = $this->employeeRule($data,false);
  34. if(!$status) return [$status,$msg];
  35. try {
  36. DB::beginTransaction();
  37. $model = new Employee();
  38. $model = $model->where('id',$data['id'])->first();
  39. $model->number = $data['number'];
  40. $model->emp_name = $data['emp_name'];
  41. $model->mobile = $data['mobile'] ?? '';
  42. $model->leave_time = $data['leave_time'] ?? '';
  43. $model->entry_time = $data['entry_time'] ?? '';
  44. $model->is_admin = $data['is_admin'];
  45. if($model->is_admin == 1){
  46. $model->account = $data['number'];
  47. if($data['password'] !== '******'){
  48. $model->password = Hash::make($data['password']);
  49. }
  50. }
  51. $model->save();
  52. EmployeeDepartPermission::where('employee_id',$data['id'])->delete();
  53. if(isset($data['depart'])){
  54. $insert = [];
  55. foreach ($data['depart'] as $value){
  56. $insert[] = [
  57. 'employee_id' => $model->id,
  58. 'depart_id' => $value,
  59. ];
  60. }
  61. EmployeeDepartPermission::insert($insert);
  62. }
  63. EmployeeRole::where('employee_id',$data['id'])->update([
  64. 'del_time' => time()
  65. ]);
  66. if(isset($data['role'])){
  67. $insert = [];
  68. foreach ($data['role'] as $value){
  69. $insert[] = [
  70. 'employee_id' => $model->id,
  71. 'role_id' => $value,
  72. 'crt_time' => time(),
  73. 'upd_time' => time(),
  74. ];
  75. }
  76. EmployeeRole::insert($insert);
  77. }
  78. DB::commit();
  79. }catch (\Exception $exception){
  80. DB::rollBack();
  81. return [false, $exception->getMessage()];
  82. }
  83. return [true,''];
  84. }
  85. /**
  86. * 用户新增
  87. * @param $data
  88. * @param $user
  89. * @return array
  90. */
  91. public function employeeAdd($data,$user){
  92. list($status,$msg) = $this->employeeRule($data);
  93. if(!$status) return [$status,$msg];
  94. try{
  95. DB::beginTransaction();
  96. $model = new Employee();
  97. $model->number = $data['number'];
  98. $model->emp_name = $data['emp_name'];
  99. $model->mobile = $data['mobile'] ?? '';
  100. $model->leave_time = $data['leave_time'] ?? '';
  101. $model->entry_time = $data['entry_time'] ?? '';
  102. $model->state = 1;
  103. $model->crt_id = $user['id'];
  104. $model->is_admin = $data['is_admin'];
  105. if($model->is_admin == 1){
  106. $model->account = $data['number'];
  107. if($data['password'] !== '********'){
  108. $model->password = Hash::make($data['password']);
  109. }
  110. }
  111. $model->save();
  112. if(isset($data['depart'])){
  113. $insert = [];
  114. foreach ($data['depart'] as $value){
  115. $insert[] = [
  116. 'employee_id' => $model->id,
  117. 'depart_id' => $value,
  118. ];
  119. }
  120. EmployeeDepartPermission::insert($insert);
  121. }
  122. if(isset($data['role'])){
  123. $insert = [];
  124. foreach ($data['role'] as $value){
  125. $insert[] = [
  126. 'employee_id' => $model->id,
  127. 'role_id' => $value,
  128. 'crt_time' => time(),
  129. 'upd_time' => time(),
  130. ];
  131. }
  132. EmployeeRole::insert($insert);
  133. }
  134. DB::commit();
  135. }catch (Exception $e){
  136. DB::rollBack();
  137. return [false, $e->getMessage()];
  138. }
  139. return [true,''];
  140. }
  141. /**
  142. * 用户删除
  143. * @param $data
  144. * @return array
  145. */
  146. public function employeeDel($data){
  147. if($this->isEmpty($data,'id')) return [false,'请选择删除的数据!'];
  148. Employee::whereIn('id',$data['id'])->update([
  149. 'del_time'=>time()
  150. ]);
  151. return [true,'删除成功'];
  152. }
  153. /**
  154. * 用户列表
  155. * @param $data
  156. * @param $user
  157. * @return array
  158. */
  159. public function employeeList($data,$user){
  160. $model = Employee::where('del_time',0)
  161. ->select('number','mobile','emp_name','id','entry_time','leave_time','is_admin','state')
  162. ->orderBy('id','desc');
  163. if(! empty($data['depart'])) {
  164. $employee_id = DB::table('employee_depart_permission')
  165. ->where("depart_id", $data['depart'])
  166. ->select("employee_id")
  167. ->get()->toArray();
  168. $employee_id = array_column($employee_id,'employee_id');
  169. $model->whereIn("id", $employee_id);
  170. }
  171. if(! empty($data['number'])) $model->where('number', 'LIKE', '%'.$data['number'].'%');
  172. if(! empty($data['emp_name'])) $model->where('emp_name', 'LIKE', '%'.$data['emp_name'].'%');
  173. if(! empty($data['state'])) $model->where('state',$data['state']);
  174. if(! empty($data['mobile'])) $model->where('mobile', 'LIKE', '%'.$data['mobile'].'%');
  175. if(! isset($data['all_emp'])) $model->where('id','<>',Employee::SPECIAL_ADMIN);
  176. if(! empty($data['role'])) {
  177. $emp = EmployeeRole::where('role_id',$data['role'])
  178. ->where('del_time',0)
  179. ->select('employee_id')->get()->toArray();
  180. $model->whereIn('id',array_column($emp,'employee_id'));
  181. }
  182. $list = $this->limit($model,'',$data);
  183. //组织数据
  184. $list = $this->organizationEmployeeData($list);
  185. return [true , $list];
  186. }
  187. /**
  188. * 用户数据组装
  189. * @param $data
  190. * @return array
  191. */
  192. public function organizationEmployeeData($data) {
  193. if (empty($data['data'])) return $data;
  194. $res = DB::table('employee_role as a')
  195. ->leftJoin('role as b','a.role_id','=','b.id')
  196. ->where('a.del_time',0)
  197. ->where('b.del_time',0)
  198. ->whereIn("a.employee_id",array_column($data['data'],'id'))
  199. ->select('a.employee_id','b.title','b.id')
  200. ->get()->toArray();
  201. $role = $role2 = [];
  202. foreach ($res as $value){
  203. if(isset($role[$value->employee_id])){
  204. $role[$value->employee_id] .= ',' . $value->title;
  205. }else{
  206. $role[$value->employee_id] = $value->title;
  207. }
  208. $role2[$value->employee_id][] = $value->id;
  209. }
  210. $res = DB::table('employee_depart_permission as a')
  211. ->select('a.employee_id','b.title','b.id')
  212. ->join('depart as b','a.depart_id','=','b.id')
  213. ->whereIn("a.employee_id",array_column($data['data'],'id'))
  214. ->orderBy('b.id')
  215. ->get()->toArray();
  216. $depart_title = $depart_id = [];
  217. foreach ($res as $value){
  218. if(isset($depart_title[$value->employee_id])){
  219. $depart_title[$value->employee_id] .= ',' . $value->title;
  220. }else{
  221. $depart_title[$value->employee_id] = $value->title;
  222. }
  223. $depart_id[$value->employee_id][] = $value->id;
  224. }
  225. foreach ($data['data'] as $key => $value){
  226. $data['data'][$key]['role'] = $role2[$value['id']] ?? [];
  227. $data['data'][$key]['role_name'] = $role[$value['id']] ?? '';
  228. $data['data'][$key]['depart'] = $depart_id[$value['id']] ?? [];
  229. $data['data'][$key]['depart_title'] = $depart_title[$value['id']] ?? '';
  230. }
  231. return $data;
  232. }
  233. /**
  234. * 用户参数规则
  235. * @param $data
  236. * @param $is_add
  237. * @return array
  238. */
  239. public function employeeRule($data,$is_add = true){
  240. if($this->isEmpty($data,'number')) return [false,'工号不存在!'];
  241. if($this->isEmpty($data,'emp_name')) return [false,'姓名不存在!'];
  242. if(! $is_add){
  243. if($this->isEmpty($data,'id')) return [false,'ID不能为空!'];
  244. $bool = Employee::where('number',$data['number'])
  245. ->where('id','<>',$data['id'])
  246. ->where('del_time',0)->exists();
  247. }else{
  248. $bool = Employee::where('number',$data['number'])
  249. ->where('del_time',0)->exists();
  250. }
  251. if($bool) return [false,'工号已存在!'];
  252. return [true,''];
  253. }
  254. /**
  255. * 角色编辑
  256. * @param $data
  257. * @return array
  258. */
  259. public function roleEdit($data){
  260. list($status,$msg) = $this->roleRule($data, false);
  261. if(!$status) return [$status,$msg];
  262. $model = new Role();
  263. $model = $model->where('id',$data['id'])->first();
  264. $model->title = $data['title'];
  265. $model->save();
  266. return [true,'保存成功!'];
  267. }
  268. /**
  269. * 角色新增
  270. * @param $data
  271. * @param $user
  272. * @return array
  273. */
  274. public function roleAdd($data,$user){
  275. list($status,$msg) = $this->roleRule($data);
  276. if(!$status) return [$status,$msg];
  277. $model = new Role();
  278. $model->title = $data['title'] ;
  279. $model->save();
  280. return [true,'保存成功!'];
  281. }
  282. /**
  283. * 角色删除
  284. * @param $data
  285. * @return array
  286. */
  287. public function roleDel($data){
  288. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  289. $bool = EmployeeRole::where('del_time',0)
  290. ->whereIn('role_id',$data['id'])
  291. ->exists();
  292. if($bool) return [false,'角色已绑定人员!'];
  293. Role::where('id',$data['id'])->update([
  294. 'del_time' => time()
  295. ]);
  296. return [true,'删除成功'];
  297. }
  298. /**
  299. * 角色列表
  300. * @param $data
  301. * @return array
  302. */
  303. public function roleList($data){
  304. $list = Role::where('del_time',0)
  305. ->select('title','crt_time','id','upd_time')
  306. ->orderBy('id','desc');
  307. if(! empty($data['title'])) $list->where('title', 'LIKE', '%' . $data['title'] . '%');
  308. $list = $this->limit($list,'',$data);
  309. return [200,$list];
  310. }
  311. /**
  312. * 角色参数规则
  313. * @param $data
  314. * @param $is_check
  315. * @return array
  316. */
  317. public function roleRule($data,$is_check = true){
  318. if($this->isEmpty($data,'title')) return [false,'名称不能为空!'];
  319. if($is_check){
  320. $bool = Role::where('title',$data['title'])
  321. ->where('del_time',0)
  322. ->exists();
  323. if($bool) return [false,'角色名称已存在!'];
  324. }else{
  325. if($this->isEmpty($data,'id')) return [false,'ID不能为空!'];
  326. $bool = Role::where('title',$data['title'])
  327. ->where('id','<>',$data['id'])
  328. ->where('del_time',0)
  329. ->exists();
  330. if($bool) return [false,'角色名称已存在!'];
  331. }
  332. return [true,''];
  333. }
  334. /**
  335. * 角色菜单更新
  336. * @param $data
  337. * @return array
  338. */
  339. public function roleMenu($data){
  340. if(empty($data['role_id'])) return [false,'角色不能为空!'];
  341. if(empty($data['menu'])) return [false,'菜单数据不能为空!'];
  342. DB::beginTransaction();
  343. try {
  344. RoleMenu::where('del_time',0)->where('role_id',$data['role_id'])->update(['del_time' => time()]);
  345. RoleMenuButton::where('del_time',0)->where('role_id',$data['role_id'])->update(['del_time' => time()]);
  346. $insert = $insert2 = [];
  347. foreach ($data['menu'] as $t){
  348. $insert[] = [
  349. 'role_id' => $data['role_id'],
  350. 'menu_id' => $t['menu_id'],
  351. 'type' => $t['type'],
  352. 'crt_time' => time()
  353. ];
  354. if(! empty($t['button'])){
  355. foreach ($t['button'] as $b){
  356. $insert2[] = [
  357. 'role_id' => $data['role_id'],
  358. 'menu_id' => $t['menu_id'],
  359. 'button_id' => $b,
  360. 'crt_time' => time()
  361. ];
  362. }
  363. RoleMenuButton::insert($insert2);
  364. }
  365. }
  366. RoleMenu::insert($insert);
  367. DB::commit();
  368. }catch (\Throwable $exception){
  369. DB::rollBack();
  370. return [false,$exception->getMessage()];
  371. }
  372. return [true,'保存成功!'];
  373. }
  374. /**
  375. * 角色详情
  376. * @param $data
  377. * @return array
  378. */
  379. public function roleDetail($data){
  380. if(empty($data['role_id'])) return [false,'请选择角色'];
  381. $role = Role::where('id',$data['role_id'])
  382. ->where('del_time',0)
  383. ->select('id','code','title')
  384. ->first();
  385. if(empty($role)) return [false,'角色不存在或已被删除'];
  386. $role = $role->toArray();
  387. $menu = RoleMenu::where('role_id',$data['role_id'])
  388. ->where('del_time',0)
  389. ->select('menu_id','type')
  390. ->get()->toArray();
  391. $button = $this->fillRoleButton([$data['role_id']]);
  392. foreach ($menu as $key => $value){
  393. $menu[$key]['button'] = $button[$value['menu_id']] ?? [];
  394. }
  395. $role['menu'] = $menu;
  396. return [true, $role];
  397. }
  398. /**
  399. * 部门编辑
  400. * @param $data
  401. * @return array
  402. */
  403. public function departEdit($data){
  404. list($status,$msg) = $this->departRule($data,false);
  405. if(!$status) return [$status,$msg];
  406. $update = $msg['data'][0];
  407. $model = new Depart();
  408. $model->where('id',$data['id'])->update($update);
  409. return [true,'保存成功!'];
  410. }
  411. /**
  412. * 部门新增
  413. * @param $data
  414. * @param $user
  415. * @return array
  416. */
  417. public function departAdd($data,$user){
  418. list($status,$msg) = $this->departRule($data);
  419. if(!$status) return [$status,$msg];
  420. Depart::insert($msg['data']);
  421. return [true,'保存成功!'];
  422. }
  423. /**
  424. * 部门删除
  425. * @param $data
  426. * @return array
  427. */
  428. public function departDel($data){
  429. list($status,$msg) = $this->checkDepartDel($data);
  430. if(! $status) return [false, $msg];
  431. Depart::whereIn('id',$data['id'])->update([
  432. 'del_time'=>time()
  433. ]);
  434. return [true,'删除成功'];
  435. }
  436. /**
  437. * 判断部门是否可以删除
  438. * @param $data
  439. * @return array
  440. */
  441. public function checkDepartDel($data){
  442. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  443. $bool = Depart::whereIn('parent_id',$data['id'])->where('del_time',0)->exists();
  444. if($bool) return [false,'部门下有子部门!'];
  445. if($this->checkDepartHasPerson($data['id'])) return [false,'部门下有人员档案!'];
  446. return [true, ''];
  447. }
  448. /**
  449. * 部门列表
  450. * @param $data
  451. * @param $user
  452. * @return array
  453. */
  454. public function departList($data,$user){
  455. $model = Depart::where('del_time',0)
  456. ->select('title','id','code','parent_id','is_main','grade')
  457. ->orderby('code', 'asc');
  458. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  459. if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
  460. $list = $model->get()->toArray();
  461. $list_tree = $list;
  462. if(! empty($list_tree)) {
  463. $list_tree = $this->makeTree(0,$list_tree);
  464. $list_tree = $this->set_sort_circle($list_tree);
  465. }
  466. return [200,['data' => $list,'tree' => $list_tree]];
  467. }
  468. public function fillDepartList($list){
  469. if(empty($list)) return $list;
  470. $name = DepartPriceName::where('del_time',0)
  471. ->whereIn('depart_id', array_column($list,'id'))
  472. ->select('depart_id','title','id')
  473. ->get()->toArray();
  474. $map = array_column($name,null,'depart_id');
  475. foreach ($list as $key => $value){
  476. if(empty($value['parent_id'])){
  477. $list[$key]['dapart_set'] = $map[$value['id']] ?? [];
  478. }
  479. }
  480. return $list;
  481. }
  482. /**
  483. * 部门参数规则
  484. * @param $data
  485. * @param $is_check
  486. * @return array
  487. */
  488. public function departRule($data, $is_check = true){
  489. if($this->isEmpty($data,'data')) return [false,'数据不能为空!'];
  490. $code = array_column($data['data'],'code');
  491. $title = array_column($data['data'],'title');
  492. $code = array_map(function($val) {
  493. return $val !== null ? $val : 0;
  494. }, $code);
  495. $title = array_map(function($val) {
  496. return $val !== null ? $val : 0;
  497. }, $title);
  498. $code_count = array_count_values($code);
  499. $title_count = array_count_values($title);
  500. foreach ($code as $value){
  501. if(empty($value)) return [false,'编码不能为空!'];
  502. if($code_count[$value] > 1) return [false,'编码不能重复'];
  503. }
  504. foreach ($title as $value){
  505. if(empty($value)) return [false,'名称不能为空!'];
  506. if($title_count[$value] > 1) return [false,'名称不能重复'];
  507. }
  508. $count = 0;
  509. foreach ($data['data'] as $value){
  510. if(empty($value['parent_id']) && ! empty($value['is_main'])) $count ++;
  511. }
  512. if($count > 1) return [false,'顶级总社只允许存在一个!'];
  513. if($count == 1){
  514. $id = $data['id'] ?? 0;
  515. $bool = Depart::where('del_time',0)
  516. ->where('parent_id',0)
  517. ->where('is_main',1)
  518. ->when(! empty($id), function ($query) use ($id) {
  519. return $query->where('id', '<>',$id);
  520. })
  521. ->exists();
  522. if($bool) return [false,'顶级总社只允许存在一个!'];
  523. }
  524. foreach ($data['data'] as $key => $value){
  525. if(empty($value['parent_id'])) $data['data'][$key]['parent_id'] = 0;
  526. if(empty($value['grade'])) $data['data'][$key]['grade'] = 0;
  527. $data['data'][$key]['upd_time'] = time();
  528. //Depart::whereRaw("(binary code = '{$value['code']}' OR title = '{$value['title']}')")
  529. if($is_check){
  530. $data['data'][$key]['crt_time'] = time();
  531. $bool = Depart::whereRaw("binary code = '{$value['code']}'")
  532. ->where('del_time',0)
  533. ->exists();
  534. }else{
  535. if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
  536. $bool = Depart::whereRaw("binary code = '{$value['code']}'")
  537. ->where('id','<>',$data['id'])
  538. ->where('del_time',0)
  539. ->exists();
  540. }
  541. if($bool) return [false,'编码不能重复'];
  542. }
  543. return [true, $data];
  544. }
  545. /**
  546. * 检测部门下是否存在人员
  547. * @param $depart_id
  548. * @return false
  549. */
  550. public function checkDepartHasPerson($depart_id = []){
  551. if(empty($depart_id)) return false;
  552. $bool = EmployeeDepartPermission::from('employee_depart_permission as a')
  553. ->leftJoin('employee as b','b.id','a.employee_id')
  554. ->where('b.del_time',0)
  555. ->whereIn('a.depart_id',$depart_id)
  556. ->exists();
  557. return $bool;
  558. }
  559. public function departSet($data,$user){
  560. if(empty($data['id'])) return [false,'请选择部门'];
  561. if(empty($data['grade']) || ! is_numeric($data['grade'])) return [false,'请输入分社等级'];
  562. try {
  563. DB::beginTransaction();
  564. Depart::where('id',$data['id'])->update(['grade' => $data['grade']]);
  565. $time = time();
  566. DepartPriceName::where('del_time',0)->where('depart_id',$data['id'])->update([
  567. 'del_time' => $time
  568. ]);
  569. if(! empty($data['title'])){
  570. $insert = [];
  571. foreach ($data['title'] as $value){
  572. $insert[] = [
  573. 'depart_id' => $data['id'],
  574. 'title' => $value,
  575. 'crt_time' => $time,
  576. ];
  577. }
  578. DepartPriceName::insert($insert);
  579. }
  580. DB::commit();
  581. }catch (\Exception $exception){
  582. DB::rollBack();
  583. return [false,$exception->getMessage()];
  584. }
  585. return [true,''];
  586. }
  587. /**
  588. * 班组编辑
  589. * @param $data
  590. * @return array
  591. */
  592. public function teamEdit($data){
  593. list($status,$msg) = $this->teamRule($data,false);
  594. if(!$status) return [$status,$msg];
  595. $model = new Team();
  596. $model = $model->where('id',$data['id'])->first();
  597. $model->title = $data['title'];
  598. $model->code = $data['code'];
  599. $model->save();
  600. return [true,'保存成功!'];
  601. }
  602. /**
  603. * 班组新增
  604. * @param $data
  605. * @param $user
  606. * @return array
  607. */
  608. public function teamAdd($data,$user){
  609. list($status,$msg) = $this->teamRule($data);
  610. if(!$status) return [$status,$msg];
  611. $model = new Team();
  612. $model->title = $data['title'] ;
  613. $model->code = $data['code'];
  614. $model->save();
  615. return [true,'保存成功!'];
  616. }
  617. /**
  618. * 班组删除
  619. * @param $data
  620. * @return array
  621. */
  622. public function teamDel($data){
  623. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  624. Team::where('id',$data['id'])->update([
  625. 'del_time'=>time()
  626. ]);
  627. return [true,'删除成功'];
  628. }
  629. /**
  630. * 班组列表
  631. * @param $data
  632. * @return array
  633. */
  634. public function teamList($data){
  635. $list = Team::where('del_time',0)
  636. ->select('title','id','crt_time','upd_time','code')
  637. ->orderBy('id','desc');
  638. $list = $this->limit($list,'',$data);
  639. return [200,$list];
  640. }
  641. /**
  642. * 班组参数规则
  643. * @param $data
  644. * @param $is_add
  645. * @return array
  646. */
  647. public function teamRule($data,$is_add = true){
  648. if($this->isEmpty($data,'title')) return [false,'名称不存在!'];
  649. if($this->isEmpty($data,'code')) return [false,'编码不存在'];
  650. $model = Team::where('title',$data['title'])
  651. ->where('code',$data['code'])
  652. ->where('del_time',0);
  653. if(! $is_add){
  654. if($this->isEmpty($data,'id')) return [false,'ID不能为空'];
  655. $model->where('id','<>',$data['id']);
  656. }
  657. $bool = $model->exists();
  658. if($bool) return [false,'名称和编码已存在!'];
  659. return [true,''];
  660. }
  661. /**
  662. * 班组详情
  663. * @param $data
  664. * @return array
  665. */
  666. public function teamDetail($data){
  667. if($this->isEmpty($data,'id')) return [false,'ID不能为空!'];
  668. $result = EmployeeTeamPermission::from('employee_team_permission as a')
  669. ->leftJoin('employee as b','b.id','a.employee_id')
  670. ->where('team_id',$data['id'])
  671. ->select('b.id','b.emp_name','b.number as code')
  672. ->get()->toArray();
  673. return [true,$result];
  674. }
  675. /**
  676. * 人员权限
  677. * @param $data
  678. * @return array
  679. */
  680. public function employeeRole($data){
  681. $role_ids = [];
  682. $employee_ids = [];
  683. foreach ($data as $v){
  684. if(isset($v['role_id'])){
  685. if(!in_array($v['role_id'],$role_ids)){
  686. $role_ids[] = $v['role_id'];
  687. }
  688. }
  689. if(isset($v['employee_id'])){
  690. if(!in_array($v['employee_id'],$employee_ids)){
  691. $employee_ids[] = $v['employee_id'];
  692. }
  693. }
  694. }
  695. EmployeeMenuPermission::wherein('role_id',$role_ids)->delete();
  696. EmployeeMenuPermission::wherein('employee_id',$employee_ids)->delete();
  697. EmployeeMenuPermission::insert($data);
  698. return [200,'保存成功!'];
  699. }
  700. /**
  701. * 人员部门关系更新
  702. * @param $data
  703. * @return array
  704. */
  705. public function employeeDepart($data){
  706. if($this->isEmpty($data,'insert')) return [false,'数据不能为空!'];
  707. DB::beginTransaction();
  708. try {
  709. if($data['type'] == 1){
  710. EmployeeDepartPermission::whereIn('depart_id',$data['insert']['depart_id'])->delete();
  711. }else{
  712. EmployeeDepartPermission::whereIn('employee_id',$data['insert']['employee_id'])->delete();
  713. }
  714. $insert = [];
  715. foreach ($data['insert']['depart_id'] as $t){
  716. foreach ($data['insert']['employee_id'] as $e){
  717. $insert[] = [
  718. 'depart_id' => $t,
  719. 'employee_id' => $e
  720. ];
  721. }
  722. }
  723. EmployeeDepartPermission::insert($insert);
  724. DB::commit();
  725. }catch (\Throwable $exception){
  726. DB::rollBack();
  727. return [false,$exception->getMessage()];
  728. }
  729. return [true,'保存成功!'];
  730. }
  731. /**
  732. * 人员班组关心更新
  733. * @param $data
  734. * @return array
  735. */
  736. public function employeeTeam($data){
  737. if($this->isEmpty($data,'insert')) return [false,'数据不能为空!'];
  738. DB::beginTransaction();
  739. try {
  740. if($data['type'] == 1){
  741. EmployeeTeamPermission::whereIn('team_id',$data['insert']['team_id'])->delete();
  742. }else{
  743. EmployeeTeamPermission::whereIn('employee_id',$data['insert']['employee_id'])->delete();
  744. }
  745. $insert = [];
  746. foreach ($data['insert']['team_id'] as $t){
  747. foreach ($data['insert']['employee_id'] as $e){
  748. $insert[] = [
  749. 'team_id' => $t,
  750. 'employee_id' => $e
  751. ];
  752. }
  753. }
  754. EmployeeTeamPermission::insert($insert);
  755. DB::commit();
  756. }catch (\Throwable $exception){
  757. DB::rollBack();
  758. return [false,$exception->getMessage()];
  759. }
  760. return [true,'保存成功!'];
  761. }
  762. /**
  763. * 登陆参数规则
  764. * @param $data
  765. * @return array
  766. */
  767. public function loginRule($data){
  768. if($this->isEmpty($data,'account')) return [false,'账号不能为空!'];
  769. if($this->isEmpty($data,'password')) return [false,'密码不存在!'];
  770. $account = $data['account'];
  771. $res = Employee::where('del_time',0)
  772. ->where(function ($query)use($account) {
  773. $query->where('account', $account)
  774. ->orWhere('mobile', $account);
  775. })
  776. ->get()->toArray();
  777. if(empty($res)) return [false,'账号不存在或已被删除!'];
  778. if(count($res) > 1) return [false,'该手机号检测出多个账户,请联系后台!'];
  779. $res = reset($res);
  780. if(! Hash::check($data['password'], $res['password'])) return [false,'密码错误!'];
  781. if($res['is_admin'] != Employee::IS_ADMIN) return [false,'该账号不能登录!'];
  782. if($res['state'] == Employee::NOT_USE) return [false,'账号停用!'];
  783. $is_main = EmployeeService::isMain($res['id']);
  784. return [true, ['id'=>$res['id'], 'name'=>$res['emp_name'], 'is_main' => $is_main]];
  785. }
  786. /**
  787. * 检查人员信息
  788. * @param $userId
  789. * @return array
  790. */
  791. public static function checkUser($userId){
  792. $res = Employee::where('id', $userId)
  793. ->where('del_time',0)
  794. ->where('is_admin',Employee::IS_ADMIN)
  795. ->where('state',Employee::USE)->get()->first();
  796. if(empty($res)) return [false, '该账号无法登录,请联系管理员!'];
  797. return [true, $res];
  798. }
  799. /**
  800. * 获取登录账号的角色
  801. * @param $employee_id
  802. * @return array
  803. */
  804. public static function getPersonRole($employee_id){
  805. if(empty($employee_id)) return [];
  806. $role = EmployeeRole::where('del_time',0)
  807. ->where('employee_id',$employee_id)
  808. ->select('role_id')
  809. ->get()->toArray();
  810. //组织
  811. $role_id = array_unique(array_column($role,'role_id'));
  812. asort($role_id);
  813. $role_id = array_values($role_id);
  814. return $role_id;
  815. }
  816. /**
  817. * 获取登录账号的角色的菜单
  818. * @param $role_id
  819. * @param $user_id
  820. * @return array
  821. */
  822. public function getMenuByRole($role_id,$user_id){
  823. $menu = SysMenu::where('del_time',0)->select('id')->get()->toArray();
  824. $button = SysMenuButton::where('del_time',0)->select('id','menu_id')->get()->toArray();
  825. $button_map = [];
  826. foreach ($button as $value){
  827. $button_map[$value['menu_id']][] = $value['id'];
  828. }
  829. $object = [];//返回的模型
  830. if($user_id == Employee::SPECIAL_ADMIN){
  831. //超级管理员
  832. foreach ($menu as $value){
  833. $object[] = [
  834. 'type' => 0,//所有权限
  835. 'menu_id' => $value['id'],
  836. 'button' => $button_map[$value['id']] ?? [],
  837. ];
  838. }
  839. return $object;
  840. }
  841. //没绑定角色
  842. if(empty($role_id)) return [];
  843. $search = RoleMenu::whereIn('role_id',$role_id)
  844. ->where('del_time',0)
  845. ->select('menu_id','type')
  846. ->get()->toArray();
  847. $button = $this->fillRoleButton($role_id);
  848. $tmp = [];
  849. foreach ($search as $value){
  850. if(! in_array($value['menu_id'],$tmp)){
  851. $object[] = [
  852. 'menu_id' => $value['menu_id'],
  853. 'type' => $value['type'],
  854. 'button' => $button[$value['menu_id']] ?? [],
  855. ];
  856. $tmp[] = $value['menu_id'];
  857. }
  858. }
  859. unset($tmp);
  860. return $object;
  861. }
  862. /**
  863. * 人员直接绑定部门
  864. * @param $data
  865. * @param $user
  866. * @return array
  867. */
  868. public function employeeManagerDepart($data,$user){
  869. if($user['id'] != Employee::SPECIAL_ADMIN) return [false,'非ADMIN账号不能操作'];
  870. if($this->isEmpty($data,'employee_id')) return [false,'请选择操作人员'];
  871. if($this->isEmpty($data,'depart_id')) return [false,'请选择部门'];
  872. EmployeeManagerDepart::where('employee_id',$data['employee_id'])->update([
  873. 'del_time' => time()
  874. ]);
  875. $insert = [];
  876. foreach ($data['depart_id'] as $value){
  877. $insert[] = [
  878. 'employee_id' => $data['employee_id'],
  879. 'depart_id' => $value,
  880. 'crt_time' => time(),
  881. 'upd_time' => time(),
  882. ];
  883. }
  884. EmployeeManagerDepart::insert($insert);
  885. return [true,''];
  886. }
  887. /**
  888. * 填充角色下的按钮
  889. * @param $role_id
  890. * @return array
  891. */
  892. public function fillRoleButton($role_id){
  893. $button = RoleMenuButton::whereIn('role_id',$role_id)
  894. ->where('del_time',0)
  895. ->select('menu_id','button_id')
  896. ->get()->toArray();
  897. $button_map = [];
  898. foreach ($button as $value){
  899. if(! isset($button_map[$value['menu_id']])){
  900. $button_map[$value['menu_id']][] = $value['button_id'];
  901. }else{
  902. if(! in_array($value['button_id'], $button_map[$value['menu_id']])) $button_map[$value['menu_id']][] = $value['button_id'];
  903. }
  904. }
  905. return $button_map;
  906. }
  907. /**
  908. * 获取登录账号的部门
  909. * @param $employee_id
  910. * @return array|string[]
  911. */
  912. public static function getLoginDepart($employee_id){
  913. if(empty($employee_id)) return ['', '','',''];
  914. //admin账号
  915. if($employee_id == Employee::SPECIAL_ADMIN) return [Depart::RULE_DEPART, '','',''];
  916. //自己绑定的部门 启用的部门
  917. $depart = EmployeeDepartPermission::from('employee_depart_permission as a')
  918. ->join('depart as b','b.id','a.depart_id')
  919. ->where('a.employee_id',$employee_id)
  920. ->where('b.is_use',Depart::IS_UES)
  921. ->select('a.depart_id','b.is_main','b.parent_id')
  922. ->orderBy('a.depart_id','asc')
  923. ->get()->toArray();
  924. $top = $map = $rule = [];
  925. if(! empty($depart)){
  926. $list = Depart::where('del_time',0)->get()->toArray();
  927. $depart_map = array_column($list,null,'id');
  928. foreach ($depart as $value){
  929. if($value['parent_id'] == 0){//顶级
  930. $tmp['depart_id'] = $value['depart_id'];
  931. $tmp['is_main'] = $value['is_main'];
  932. $top[] = $tmp;
  933. $map[$value['depart_id']] = $value['depart_id'];
  934. }else{
  935. $t = self::getTopParentId($value['depart_id'],$list);
  936. if($t && isset($depart_map[$t])) {
  937. $tmp['depart_id'] = $depart_map[$t]['id'];
  938. $tmp['is_main'] = $depart_map[$t]['is_main'];
  939. $top[] = $tmp;
  940. $map[$value['depart_id']] = $t;
  941. }
  942. }
  943. }
  944. foreach ($depart as $value){
  945. if(in_array($value['depart_id'],$rule)) continue;
  946. if(! $value['parent_id']){ //顶级
  947. if($value['is_main']) {//是总公司
  948. //所有部门都有
  949. $rule = array_column($list,'id');
  950. $rule[] = 0;
  951. }else{//不是总公司
  952. //自己以及子部门
  953. $depart_id = array_merge(self::getAllIds($list,$map[$value['depart_id']]),[$map[$value['depart_id']]]);
  954. $rule = array_merge_recursive($rule,$depart_id);
  955. }
  956. }else{//非顶级
  957. if($value['is_main']) {//是总社
  958. $top_tmp = $map[$value['depart_id']];
  959. if(! empty($depart_map[$top_tmp]['is_main'])){
  960. //顶级公司是总公司 所有部门都有
  961. $rule = array_column($list,'id');
  962. $rule[] = 0;
  963. }else{
  964. //顶级公司是分公司 分公司所有部门
  965. $depart_id = array_merge(self::getAllIds($list,$top_tmp),[$top_tmp]);
  966. $rule = array_merge_recursive($rule,$depart_id);
  967. }
  968. }else{//不是总社
  969. $rule = array_merge($rule,[$value['depart_id']]);
  970. }
  971. }
  972. }
  973. }
  974. return [$depart, $top, $map, array_unique($rule)];
  975. }
  976. //判断是否总公司
  977. public static function isMain($employee_id){
  978. $is_main = 0;
  979. if(empty($employee_id)) return $is_main;
  980. //admin账号
  981. if($employee_id == Employee::SPECIAL_ADMIN) {
  982. $is_main = 1;
  983. return $is_main;
  984. }
  985. //自己绑定的部门 启用的部门
  986. $depart = EmployeeDepartPermission::from('employee_depart_permission as a')
  987. ->join('depart as b','b.id','a.depart_id')
  988. ->where('a.employee_id',$employee_id)
  989. ->where('b.is_use',Depart::IS_UES)
  990. ->select('a.depart_id','b.is_main','b.parent_id')
  991. ->orderBy('a.depart_id','asc')
  992. ->get()->toArray();
  993. if(! empty($depart)){
  994. $list = Depart::where('del_time',0)->get()->toArray();
  995. $depart_map = array_column($list,null,'id');
  996. foreach ($depart as $value){
  997. if($value['parent_id'] == 0){//顶级
  998. $tmp['depart_id'] = $value['depart_id'];
  999. $tmp['is_main'] = $value['is_main'];
  1000. if(! empty($tmp['is_main']) && ! $is_main) $is_main = 1;
  1001. }else{
  1002. $t = self::getTopParentId($value['depart_id'],$list);
  1003. if($t && isset($depart_map[$t])) {
  1004. $tmp['depart_id'] = $depart_map[$t]['id'];
  1005. $tmp['is_main'] = $depart_map[$t]['is_main'];
  1006. $top[] = $tmp;
  1007. $map[$value['depart_id']] = $t;
  1008. if(! empty($tmp['is_main']) && ! $is_main) $is_main = 1;
  1009. }
  1010. }
  1011. }
  1012. }
  1013. return $is_main;
  1014. }
  1015. /**
  1016. * 获取顶级id
  1017. * @param $id
  1018. * @param $data
  1019. * @return int
  1020. */
  1021. public static function getTopParentId($id, $data) {
  1022. foreach ($data as $item) {
  1023. if ($item['id'] == $id) {
  1024. if ($item['parent_id'] == 0) {
  1025. // 找到最顶级的id
  1026. return $item['id'];
  1027. } else {
  1028. // 继续递归查找父级
  1029. return self::getTopParentId($item['parent_id'], $data);
  1030. }
  1031. }
  1032. }
  1033. // 如果没有找到匹配的id,则返回null或者其他你希望的默认值
  1034. return 0;
  1035. }
  1036. /**
  1037. * 递归获取所有id
  1038. * @param $data
  1039. * @param $id
  1040. * @return array
  1041. */
  1042. public static function getAllIds($data, $id) {
  1043. $result = array(); // 存储结果的数组
  1044. foreach ($data as $node) {
  1045. if ($node['parent_id'] == $id) { // 如果当前节点的父 ID 等于指定 ID,则将该节点添加到结果中
  1046. $result[] = $node['id'];
  1047. // 递归查询该节点的所有子孙节点,并将结果合并到结果数组中
  1048. $result = array_merge($result, self::getAllIds($data, $node['id']));
  1049. }
  1050. }
  1051. return $result;
  1052. }
  1053. }