EmployeeService.php 44 KB

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