SysUserFacade.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. package com.diagbot.facade;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.diagbot.client.AuthServiceClient;
  4. import com.diagbot.dto.HospitalInfoDTO;
  5. import com.diagbot.dto.HospitalLoginDTO;
  6. import com.diagbot.dto.JwtDTO;
  7. import com.diagbot.dto.LoginDTO;
  8. import com.diagbot.dto.UserLoginDTO;
  9. import com.diagbot.entity.*;
  10. import com.diagbot.entity.wrapper.SysMenuWrapper;
  11. import com.diagbot.enums.ConstantEnum;
  12. import com.diagbot.enums.IsDeleteEnum;
  13. import com.diagbot.enums.StatusEnum;
  14. import com.diagbot.exception.CommonErrorCode;
  15. import com.diagbot.exception.CommonException;
  16. import com.diagbot.exception.ServiceErrorCode;
  17. import com.diagbot.service.impl.SysUserServiceImpl;
  18. import com.diagbot.util.*;
  19. import com.diagbot.vo.UserSaveVO;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.security.crypto.factory.PasswordEncoderFactories;
  22. import org.springframework.security.crypto.password.PasswordEncoder;
  23. import org.springframework.security.oauth2.common.OAuth2AccessToken;
  24. import org.springframework.stereotype.Component;
  25. import java.util.*;
  26. import java.util.stream.Collectors;
  27. /**
  28. * @Description: 用户业务层
  29. * @author: gaodm
  30. * @time: 2018/8/6 9:00
  31. */
  32. @Component
  33. public class SysUserFacade extends SysUserServiceImpl {
  34. @Autowired
  35. private TokenFacade tokenFacade;
  36. @Autowired
  37. private AuthServiceClient authServiceClient;
  38. @Autowired
  39. private SysMenuFacade sysMenuFacade;
  40. @Autowired
  41. private HospitalInfoFacade hospitalInfoFacade;
  42. @Autowired
  43. private SysUserRoleFacade sysUserRoleFacade;
  44. @Autowired
  45. private SysUserHospitalFacade sysUserHospitalFacade;
  46. /**
  47. * 获取jwt
  48. *
  49. * @param username 用户名
  50. * @param password 密码
  51. * @return jwt
  52. */
  53. public JwtDTO getJwt(String username, String password) {
  54. JwtDTO data = new JwtDTO();
  55. if (StringUtil.isBlank(username)) {
  56. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  57. "请输入用户名");
  58. }
  59. if (StringUtil.isBlank(password)) {
  60. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  61. "请输入密码");
  62. }
  63. QueryWrapper<SysUser> userQueryWrapper = new QueryWrapper<>();
  64. userQueryWrapper.eq("username", username)
  65. .eq("status", StatusEnum.Enable.getKey())
  66. .eq("is_deleted", IsDeleteEnum.N.getKey());
  67. SysUser user = this.getOne(userQueryWrapper, false);
  68. if (null == user) {
  69. throw new CommonException(ServiceErrorCode.USER_NOT_FOUND);
  70. }
  71. PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
  72. if (!passwordEncoder.matches(password, user.getPassword())) {
  73. throw new CommonException(ServiceErrorCode.USER_PASSWORD_ERROR);
  74. }
  75. JWT jwt = authServiceClient.getToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2",
  76. "password", username, password);
  77. if (null == jwt) {
  78. throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL);
  79. }
  80. data.setAccessToken(jwt.getAccess_token());
  81. data.setRefreshToken(jwt.getRefresh_token());
  82. data.setType(user.getType());
  83. data.setTypeCn(ConstantEnum.getName(user.getType()));//返回中文
  84. //token存入redis
  85. JwtStore jwtStore = new JwtStore();
  86. jwtStore.setAccessToken(jwt.getAccess_token());
  87. jwtStore.setRefreshToken(jwt.getRefresh_token());
  88. tokenFacade.createToken(jwtStore);
  89. return data;
  90. }
  91. /**
  92. * 刷新jwt
  93. *
  94. * @param refreshToken
  95. * @return jwt
  96. */
  97. public JwtDTO refreshJwt(String refreshToken) {
  98. JwtDTO data = new JwtDTO();
  99. if (StringUtil.isBlank(refreshToken)) {
  100. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  101. "刷新令牌不能为空");
  102. }
  103. //验证刷新令牌有效性
  104. if (!tokenFacade.verifyToken(refreshToken, 2)) {
  105. throw new CommonException(CommonErrorCode.TOKEN_PAST);
  106. }
  107. JWT jwt = authServiceClient.refreshToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2",
  108. "refresh_token", refreshToken);
  109. if (null == jwt) {
  110. throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL);
  111. }
  112. data.setAccessToken(jwt.getAccess_token());
  113. data.setRefreshToken(jwt.getRefresh_token());
  114. //token存入redis
  115. JwtStore jwtStore = new JwtStore();
  116. jwtStore.setAccessToken(jwt.getAccess_token());
  117. jwtStore.setRefreshToken(jwt.getRefresh_token());
  118. tokenFacade.createToken(jwtStore);
  119. return data;
  120. }
  121. /**
  122. * 验证jwt
  123. *
  124. * @param token
  125. * @return jwt
  126. */
  127. public OAuth2AccessToken checkToken(String token) {
  128. if (StringUtil.isBlank(token)) {
  129. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  130. "令牌不能为空");
  131. }
  132. OAuth2AccessToken jwt
  133. = authServiceClient.checkToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2", token);
  134. if (null == jwt) {
  135. throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL, "该Token不正确!");
  136. }
  137. return jwt;
  138. }
  139. /**
  140. * 修改密码
  141. *
  142. * @param password 原密码
  143. * @param modifyPassword 新密码
  144. * @return 修改密码是否成功
  145. */
  146. public Boolean modifyPassword(String password, String modifyPassword) {
  147. if (StringUtil.isBlank(password)) {
  148. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  149. "请输入密码");
  150. }
  151. if (StringUtil.isBlank(modifyPassword)) {
  152. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  153. "请输入新密码");
  154. }
  155. if (password.equals(modifyPassword)) {
  156. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  157. "原密码和新密码不能相同");
  158. }
  159. String userId = SysUserUtils.getCurrentPrincipleID();
  160. SysUser user = this.getOne(new QueryWrapper<SysUser>()
  161. .eq("is_deleted", IsDeleteEnum.N.getKey())
  162. .eq("status", StatusEnum.Enable.getKey())
  163. .eq("id", userId), false);
  164. if (null == user) {
  165. throw new CommonException(ServiceErrorCode.USER_NOT_FOUND);
  166. }
  167. PasswordEncoder passwordEncoder
  168. = PasswordEncoderFactories.createDelegatingPasswordEncoder();
  169. if (!passwordEncoder.matches(password, user.getPassword())) {
  170. throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "原密码错误");
  171. }
  172. String entryPassword = passwordEncoder.encode(modifyPassword);
  173. user.setPassword(entryPassword);
  174. user.setGmtModified(DateUtil.now());
  175. user.setModifier(userId);
  176. this.updateById(user);
  177. return true;
  178. }
  179. /**
  180. * 登录
  181. *
  182. * @return 登录相关信息
  183. */
  184. public LoginDTO getUserOrgMenu() {
  185. LoginDTO data = new LoginDTO();
  186. Long userId = Long.parseLong(SysUserUtils.getCurrentPrincipleID());
  187. SysUser user = this.getOne(new QueryWrapper<SysUser>()
  188. .eq("is_deleted", IsDeleteEnum.N.getKey())
  189. .eq("status", StatusEnum.Enable.getKey())
  190. .eq("id", userId), false);
  191. if (user == null) {
  192. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
  193. "用户不存在【" + userId + "】");
  194. }
  195. //添加用户
  196. UserLoginDTO userLoginDTO = new UserLoginDTO();
  197. BeanUtil.copyProperties(user, userLoginDTO);
  198. data.setUserLoginDTO(userLoginDTO);
  199. //添加医院信息
  200. if (user.getType().equals(ConstantEnum.OUTER_USER.getKey())) {
  201. QueryWrapper<HospitalInfo> queryWrapper = new QueryWrapper<>();
  202. queryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  203. .eq("id", SysUserUtils.getCurrentHospitalID());
  204. HospitalInfo hospitalInfo = hospitalInfoFacade.getOne(queryWrapper, false);
  205. HospitalLoginDTO hospitalLoginDTO = new HospitalLoginDTO();
  206. BeanUtil.copyProperties(hospitalInfo, hospitalLoginDTO);
  207. data.setHospitalLoginDTO(hospitalLoginDTO);
  208. }
  209. //添加菜单信息
  210. List<SysMenuWrapper> menuList = sysMenuFacade.getByRole(user.getId());
  211. Map<Long, List<SysMenuWrapper>> menuMap = EntityUtil.makeEntityListMap(menuList, "parentId");
  212. List<SysMenuWrapper> menuRes = menuMap.get(-1L);
  213. // if (StringUtil.isNotEmpty(user.getRemark())){
  214. // menuRes = menuRes.stream().filter(e -> "CDSS-YXSYK".equalsIgnoreCase(e.getCode())).collect(Collectors.toList());
  215. // }
  216. if (ListUtil.isNotEmpty(menuRes)){
  217. for (SysMenuWrapper bean : menuRes) {
  218. getSonMenu(bean, menuMap);
  219. }
  220. }
  221. data.setMenuWrappers(menuRes);
  222. return data;
  223. }
  224. /**
  225. * 递归获取菜单结构
  226. *
  227. * @param menu 当前菜单
  228. * @param menuMap 菜单集
  229. * @return 菜单结构
  230. */
  231. public List<SysMenuWrapper> getSonMenu(SysMenuWrapper menu,
  232. Map<Long, List<SysMenuWrapper>> menuMap) {
  233. List<SysMenuWrapper> res = new ArrayList<>();
  234. List<SysMenuWrapper> list = menuMap.get(menu.getId());
  235. if (ListUtil.isNotEmpty(list)) {
  236. menu.setSubMenuList(list);
  237. for (SysMenuWrapper bean : list) {
  238. getSonMenu(bean, menuMap);
  239. }
  240. }
  241. return res;
  242. }
  243. /**
  244. * 根据用户ID列表获取用户数据
  245. *
  246. * @param ids 用户ID列表
  247. * @return 用户名信息列表
  248. */
  249. public Map<String, String> getUserInfoByIds(List<String> ids) {
  250. List<Long> longList
  251. = ids.stream().map(r -> Long.valueOf(r)).distinct().collect(Collectors.toList());
  252. Map<String, String> map = new HashMap<>();
  253. if (ListUtil.isNotEmpty(longList)) {
  254. List<SysUser> userList = this.getByIds(longList);
  255. if (ListUtil.isNotEmpty(userList)) {
  256. map = userList.stream()
  257. .collect(Collectors.toMap(k -> k.getId().toString(), v -> v.getLinkman()));
  258. }
  259. }
  260. return map;
  261. }
  262. /**
  263. * 注册
  264. *
  265. * @param userSaveVO 参数
  266. * @return 用户信息
  267. */
  268. public JwtDTO createUserAndGetJwt(UserSaveVO userSaveVO) {
  269. SysUser user = new SysUser();
  270. BeanUtil.copyProperties(userSaveVO, user);
  271. QueryWrapper<SysUser> userQueryWrapper = new QueryWrapper<>();
  272. userQueryWrapper.eq("username", user.getUsername())
  273. .eq("status", StatusEnum.Enable.getKey())
  274. .eq("is_deleted", IsDeleteEnum.N.getKey());
  275. SysUser bean = this.getOne(userQueryWrapper, false);
  276. String password = "{bcrypt}$2a$10$qhV.bPLz1xsjQKQc35Ohz.oMU2y.lffnogvLEK69u3Z1rbLpQVFh2";
  277. if (bean == null) {
  278. user.setGmtCreate(new Date());
  279. user.setPassword(password);
  280. user.setLinkman(user.getUsername());
  281. // user.setPhone(userSaveVO.getUsername());
  282. this.save(user);
  283. SysUserRole userRole = new SysUserRole();
  284. userRole.setUserId(user.getId());
  285. userRole.setRoleId(1L);
  286. userRole.setGmtCreate(new Date());
  287. userRole.setGmtModified(new Date());
  288. sysUserRoleFacade.save(userRole);
  289. SysUserHospital userHospital = new SysUserHospital();
  290. userHospital.setHospitalId(51L);
  291. userHospital.setUserId(user.getId());
  292. sysUserHospitalFacade.save(userHospital);
  293. }else {
  294. password = bean.getPassword();
  295. }
  296. JwtDTO data = new JwtDTO();
  297. JWT jwt = authServiceClient.getToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2",
  298. "password", user.getUsername(), password);
  299. if (null == jwt) {
  300. throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL);
  301. }
  302. data.setAccessToken(jwt.getAccess_token());
  303. data.setRefreshToken(jwt.getRefresh_token());
  304. data.setType(user.getType());
  305. data.setTypeCn(ConstantEnum.getName(user.getType()));//返回中文
  306. //token存入redis
  307. JwtStore jwtStore = new JwtStore();
  308. jwtStore.setAccessToken(jwt.getAccess_token());
  309. jwtStore.setRefreshToken(jwt.getRefresh_token());
  310. tokenFacade.createToken(jwtStore);
  311. return data;
  312. }
  313. }