LoginService.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Depart;
  4. use App\Model\Employee;
  5. use App\Model\EmployeeDepartPermission;
  6. use App\Model\EmployeeRole;
  7. use App\Model\ItemNodeMissionDetails;
  8. use App\Model\ItemNodeMissionShare;
  9. use App\Model\Role;
  10. use App\Model\RoleMenu;
  11. use App\Model\RoleMenuButton;
  12. use App\Model\SysMenu;
  13. use Illuminate\Support\Facades\Hash;
  14. class LoginService extends Service
  15. {
  16. public function login($data){
  17. if(empty($data['account'])) return [false, '账号不能为空'];
  18. if(empty($data['password'])) return [false, '密码不能为空'];
  19. $account = $data['account'];
  20. $password = $data['password'];
  21. $employee = Employee::where('del_time',0)
  22. ->where('account', $account)
  23. ->first();
  24. if(empty($employee)) return [false,'账号不存在或已被删除'];
  25. $employee = $employee->toArray();
  26. if(! Hash::check($password, $employee['password'])) return [false,'密码错误'];
  27. if($employee['is_admin'] == Employee::IS_ADMIN_ZERO || $employee['is_admin'] == Employee::IS_ADMIN_THREE) return [false, '账号限制登录'];
  28. //生成token
  29. list($status, $jwtToken) = TokenService::getToken($employee);
  30. if(! $status) return [false, $jwtToken];
  31. //获取人员所有的所有的顶级菜单
  32. $sysMenu = $this->getPersonRoleForSysMenuList($employee['id']);
  33. if(empty($sysMenu)) return [false, '账户未设置菜单功能'];
  34. //获取使用时段 工时系统需要
  35. $use_range_check = MiddleGroundService::getUseRangeDetail($employee);
  36. return [true, [
  37. 'token' => $jwtToken,
  38. 'employee_id' => $employee['id'],
  39. 'title' => $employee['title'],
  40. 'sys_menu' => $sysMenu,
  41. 'use_range_check' => $use_range_check
  42. ]];
  43. }
  44. public function clogin($data){
  45. if(empty($data['account'])) return [false, '账号不能为空'];
  46. if(empty($data['password'])) return [false, '密码不能为空'];
  47. $account = $data['account'];
  48. $password = $data['password'];
  49. $employee = Employee::where('del_time',0)
  50. ->where('account', $account)
  51. ->first();
  52. if(empty($employee)) return [false,'账号不存在或已被删除'];
  53. $employee = $employee->toArray();
  54. if(! Hash::check($password, $employee['password'])) return [false,'密码错误'];
  55. if($employee['is_admin'] != Employee::IS_ADMIN_THREE) return [false, '账号限制登录'];
  56. //生成token
  57. list($status, $jwtToken) = TokenService::getToken($employee);
  58. if(! $status) return [false, $jwtToken];
  59. return [true, [
  60. 'token' => $jwtToken,
  61. 'employee_id' => $employee['id'],
  62. 'title' => $employee['title'],
  63. ]];
  64. }
  65. public function shareLogin($data){
  66. if(empty($data['account'])) return [false, '账号不能为空'];
  67. if(empty($data['password'])) return [false, '密码不能为空'];
  68. if(empty($data['share_token'])) return [false, '分享链接不能为空'];
  69. $account = $data['account'];
  70. $password = $data['password'];
  71. $employee = Employee::where('del_time',0)
  72. ->where('account', $account)
  73. ->first();
  74. if(empty($employee)) return [false,'账号不存在或已被删除'];
  75. $employee = $employee->toArray();
  76. if(! Hash::check($password, $employee['password'])) return [false,'密码错误'];
  77. list($status, $msg) = (new ItemService())->shareCheck($data['share_token'], $employee['id']);
  78. if(! $status) return [false, $msg];
  79. //生成token
  80. list($status, $jwtToken) = TokenService::getToken($employee, 3600);
  81. if(! $status) return [false, $jwtToken];
  82. return [true, [
  83. 'token' => $jwtToken,
  84. 'employee_id' => $employee['id'],
  85. 'title' => $employee['title'],
  86. ]];
  87. }
  88. private function getPersonRoleForSysMenuList($employee_id) {
  89. $sysMenu = SysMenu::where('del_time',0)
  90. ->where('type', SysMenu::type_zero)
  91. ->where('parent_id', 0)
  92. ->select('id','title', 'tree_type', 'uri')
  93. ->get()->toArray();
  94. $role_menu_id = EmployeeRole::from('employee_role as a')
  95. ->join('role_menu as b', 'b.role_id', '=', 'a.role_id')
  96. ->where('a.del_time', 0)
  97. ->where('b.del_time', 0)
  98. ->whereIn('b.menu_id', array_column($sysMenu,'id'))
  99. ->where('a.employee_id',$employee_id)
  100. ->pluck('b.menu_id')
  101. ->toArray();
  102. foreach ($sysMenu as $key => $value){
  103. if(! in_array($value['id'], $role_menu_id)) unset($sysMenu[$key]);
  104. }
  105. return array_values($sysMenu);
  106. }
  107. public static function hasPersonRoleForSysMenuList($employee_id, $tree_type) {
  108. $sysMenu = SysMenu::where('del_time',0)
  109. ->where('type', SysMenu::type_zero)
  110. ->where('parent_id', 0)
  111. ->where('tree_type', $tree_type)
  112. ->pluck('id')
  113. ->toArray();
  114. return EmployeeRole::from('employee_role as a')
  115. ->join('role_menu as b', 'b.role_id', '=', 'a.role_id')
  116. ->where('a.del_time', 0)
  117. ->where('b.del_time', 0)
  118. ->where('b.menu_id', $sysMenu)
  119. ->where('a.employee_id',$employee_id)
  120. ->exists();
  121. }
  122. public static function checkUser($employee){
  123. if(empty($employee['employee_id'])) return [false, 'token错误'];
  124. if(! isset($employee['p_version'])) return [false, 'token错误'];
  125. $result = Employee::where('id', $employee['employee_id'])
  126. ->where('del_time',0)
  127. ->first();
  128. if(empty($result)) return [false, '账号不存在或已被删除'];
  129. $result = $result->toArray();
  130. if($result['is_admin'] == Employee::IS_ADMIN_ZERO || $result['is_admin'] == Employee::IS_ADMIN_THREE) return [false, '账号限制登录'];
  131. if($result['p_version'] != $employee['p_version']) return [false, '请重新登录'];
  132. return [true, $result];
  133. }
  134. public static function checkCompany($employee){
  135. $top_depart_id = $employee['top_depart_id'];
  136. if(empty($top_depart_id)) return [false, '公司信息不存在'];
  137. return [true, ''];
  138. }
  139. public static function checkRoute($employee, $request){
  140. $currentRouteName = $request->route()->getName();
  141. //没有取别名的路由需要校验
  142. if(! empty($currentRouteName)){
  143. if($currentRouteName == "only.admin"){
  144. return [false, '无接口'. $currentRouteName . '访问权限'];
  145. }else{
  146. //角色中所有的按钮
  147. $role_id = $employee['role_ids'];
  148. $bool = RoleMenuButton::from('role_menu_button as a')
  149. ->join('sys_menu_button as b', 'b.id', '=', 'a.button_id')
  150. ->whereIn('a.role_id', $role_id)
  151. ->where('b.func',$currentRouteName)
  152. ->where('a.del_time', 0)
  153. ->where('b.del_time', 0)
  154. ->exists();
  155. if(! $bool) return [false, '无接口'. $currentRouteName . '访问权限'];
  156. }
  157. }
  158. return [true, ''];
  159. }
  160. public static function getPersonDepart($employee_id) {
  161. // 1. 初始化返回结构
  162. $result = [
  163. 'top_depart_id' => 0,
  164. 'top_depart_code' => "",
  165. 'depart_id' => [],
  166. ];
  167. // 2. 基础校验
  168. if (empty($employee_id) ) return $result;
  169. $depart = EmployeeDepartPermission::from('employee_depart_permission as a')
  170. ->join('depart as c', 'c.id', '=', 'a.top_depart_id') // 公司必须存在
  171. ->leftJoin('depart as b', 'b.id', '=', 'a.depart_id') // 部门可能为0
  172. ->where('a.employee_id', $employee_id)
  173. ->where('c.is_use', Depart::IS_UES) // 公司必须启用
  174. ->select('a.depart_id', 'b.is_use as dept_use','a.top_depart_id','c.code as top_depart_code')
  175. ->get()->toArray();
  176. foreach ($depart as $value){
  177. if($value['depart_id'] && $value['dept_use'] && ! in_array($value['depart_id'], $result['depart_id'])) $result['depart_id'][] = $value['depart_id'];
  178. if($value['top_depart_id'] && ! $result['top_depart_id']) $result['top_depart_id'] = $value['top_depart_id'];
  179. if($value['top_depart_code'] && ! $result['top_depart_code']) $result['top_depart_code'] = $value['top_depart_code'];
  180. }
  181. return $result;
  182. }
  183. public static function getPersonRoleAndPermissions($employee) {
  184. // 初始化返回结构
  185. $result = [
  186. 'role_ids' => [],
  187. 'menu_permissions' => []
  188. ];
  189. // // 2. 是管理员账户
  190. // if ($employee['is_admin'] == Employee::IS_ADMIN_TWO) {
  191. // return $result;
  192. // }
  193. $role_ids = EmployeeRole::where('del_time', 0)
  194. ->where('employee_id', $employee['id'])
  195. ->pluck('role_id')
  196. ->toArray();
  197. if (empty($role_ids)) return $result;
  198. $result['role_ids'] = $role_ids;
  199. // 4. 获取合法的系统菜单 ID (用于过滤)
  200. $valid_menu_ids = SysMenu::where('del_time', 0)
  201. ->where('is_authority', '>', 0)
  202. ->pluck('id')
  203. ->toArray();
  204. // 5. 获取并合并菜单权限
  205. $role_menus = RoleMenu::where('del_time', 0)
  206. ->whereIn('role_id', $role_ids)
  207. ->select('menu_id', 'type')
  208. ->get();
  209. $permissions = [];
  210. foreach ($role_menus as $item) {
  211. // 过滤不在系统权限菜单内的记录
  212. if (!in_array($item->menu_id, $valid_menu_ids)) {
  213. continue;
  214. }
  215. // 取相同 menu_id 下最大的 type
  216. if (!isset($permissions[$item->menu_id]) || $permissions[$item->menu_id] < $item->type) {
  217. $permissions[$item->menu_id] = $item->type;
  218. }
  219. }
  220. $result['menu_permissions'] = $permissions;
  221. return $result;
  222. }
  223. }