SysUserFacade.java 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930
  1. package com.diagbot.facade;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.diagbot.client.AuthServiceClient;
  6. import com.diagbot.dto.*;
  7. import com.diagbot.entity.BasHospitalInfo;
  8. import com.diagbot.entity.ImageCaptchaParams;
  9. import com.diagbot.entity.JWT;
  10. import com.diagbot.entity.JwtStore;
  11. import com.diagbot.entity.SysHospitalSet;
  12. import com.diagbot.entity.SysUser;
  13. import com.diagbot.entity.SysUserDept;
  14. import com.diagbot.entity.SysUserHospital;
  15. import com.diagbot.entity.SysUserRole;
  16. import com.diagbot.entity.wrapper.SysMenuWrapper;
  17. import com.diagbot.enums.ConstantEnum;
  18. import com.diagbot.enums.IsDeleteEnum;
  19. import com.diagbot.enums.LockEnum;
  20. import com.diagbot.enums.StatusEnum;
  21. import com.diagbot.exception.CommonErrorCode;
  22. import com.diagbot.exception.CommonException;
  23. import com.diagbot.exception.ServiceErrorCode;
  24. import com.diagbot.service.impl.SysUserDeptServiceImpl;
  25. import com.diagbot.service.impl.SysUserRoleServiceImpl;
  26. import com.diagbot.service.impl.SysUserServiceImpl;
  27. import com.diagbot.task.LockTask;
  28. import com.diagbot.util.BeanUtil;
  29. import com.diagbot.util.DateUtil;
  30. import com.diagbot.util.EntityUtil;
  31. import com.diagbot.util.ImageCaptchaUtil;
  32. import com.diagbot.util.ListUtil;
  33. import com.diagbot.util.RedisUtils;
  34. import com.diagbot.util.StringUtil;
  35. import com.diagbot.util.SysUserUtils;
  36. import com.diagbot.vo.BasDeptInfoVO;
  37. import com.diagbot.vo.SysUserBaseVO;
  38. import com.diagbot.vo.SysUserDeptVO;
  39. import com.diagbot.vo.SysUserQueryVO;
  40. import com.diagbot.vo.SysUserRoleVO;
  41. import org.springframework.beans.factory.annotation.Autowired;
  42. import org.springframework.beans.factory.annotation.Qualifier;
  43. import org.springframework.security.crypto.factory.PasswordEncoderFactories;
  44. import org.springframework.security.crypto.password.PasswordEncoder;
  45. import org.springframework.security.oauth2.common.OAuth2AccessToken;
  46. import org.springframework.stereotype.Component;
  47. import org.springframework.util.DigestUtils;
  48. import org.springframework.util.StringUtils;
  49. import javax.imageio.ImageIO;
  50. import javax.servlet.ServletOutputStream;
  51. import javax.servlet.http.HttpServletRequest;
  52. import javax.servlet.http.HttpServletResponse;
  53. import javax.servlet.http.HttpSession;
  54. import java.awt.image.BufferedImage;
  55. import java.io.IOException;
  56. import java.util.*;
  57. import java.util.concurrent.TimeUnit;
  58. import java.util.stream.Collectors;
  59. /**
  60. * @Description: 用户业务层
  61. * @author: gaodm
  62. * @time: 2018/8/6 9:00
  63. */
  64. @Component
  65. public class SysUserFacade extends SysUserServiceImpl {
  66. @Autowired
  67. private TokenFacade tokenFacade;
  68. @Autowired
  69. private AuthServiceClient authServiceClient;
  70. @Autowired
  71. private SysMenuFacade sysMenuFacade;
  72. @Autowired
  73. private BasHospitalInfoFacade basHospitalInfoFacade;
  74. @Autowired
  75. @Qualifier("sysUserRoleServiceImpl")
  76. private SysUserRoleServiceImpl sysUserRoleService;
  77. @Autowired
  78. @Qualifier("sysUserDeptServiceImpl")
  79. private SysUserDeptServiceImpl sysUserDeptService;
  80. @Autowired
  81. private BasDeptInfoFacade basDeptInfoFacade;
  82. @Autowired
  83. private SysRoleFacade sysRoleFacade;
  84. @Autowired
  85. private SysUserHospitalFacade sysUserHospitalFacade;
  86. @Autowired
  87. private SysUserRoleFacade sysUserRoleFacade;
  88. @Autowired
  89. private SysDictionaryFacade sysDictionaryFacade;
  90. @Autowired
  91. private SysHospitalSetFacade sysHospitalSetFacade;
  92. @Autowired
  93. private RedisUtils redisUtils;
  94. @Autowired
  95. private LockTask lockTask;
  96. public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
  97. response.setContentType("image/png");
  98. response.setHeader("Pragma", "no-cache");
  99. response.setHeader("Cache-Control", "no-cache");
  100. response.setDateHeader("Expires", 0);
  101. HttpSession session = request.getSession();
  102. String captchaId = session.getId();
  103. ServletOutputStream outputStream = response.getOutputStream();
  104. ImageCaptchaUtil imageCaptchaUtil = new ImageCaptchaUtil();
  105. BufferedImage image = imageCaptchaUtil.createRandom();
  106. String captcha = imageCaptchaUtil.getText();
  107. redisUtils.set("user:captchaIds:" + captchaId, captcha, 60 * 3);
  108. ImageIO.write(image, ImageCaptchaParams.DEFAULT_FORMAT, outputStream);
  109. outputStream.flush();
  110. outputStream.close();
  111. }
  112. /**
  113. * 获取标识--选择登录页面
  114. *
  115. * @return java.lang.Long
  116. */
  117. public Long getHospitalMark() {
  118. Long mark = 0L;//0-默认通用医院 1-湘雅医院特殊登录页面
  119. SysHospitalSet sysHospitalSet = sysHospitalSetFacade.lambdaQuery()
  120. .eq(SysHospitalSet::getHospitalId, 35)
  121. .eq(SysHospitalSet::getIsDeleted, IsDeleteEnum.N.getKey())
  122. .eq(SysHospitalSet::getCode, "special_page_csxy").one();
  123. if (null != sysHospitalSet) {
  124. String val = sysHospitalSet.getValue();
  125. if (StringUtil.isNotBlank(val) && "1".equals(val)) {
  126. mark = Long.valueOf(val);
  127. }
  128. }
  129. return mark;
  130. }
  131. /**
  132. * 获取jwt
  133. *
  134. * @param username 用户名
  135. * @param password 密码
  136. * @return jwt
  137. */
  138. public JwtDTO getJwt(HttpServletRequest request, String username, String password, String captcha) {
  139. JwtDTO data = new JwtDTO();
  140. if (StringUtil.isBlank(username)) {
  141. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  142. "请输入用户名");
  143. }
  144. if (StringUtil.isBlank(password)) {
  145. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  146. "请输入密码");
  147. }
  148. if (StringUtils.isEmpty(captcha)) {
  149. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  150. "请输入验证码");
  151. }
  152. // 验证码校验
  153. String captchaId = request.getSession().getId();
  154. checkCaptcha(captchaId, captcha, redisUtils);
  155. //使用MD5对密码进行加密
  156. String MD5Password = DigestUtils.md5DigestAsHex(password.getBytes());
  157. QueryWrapper<SysUser> userQueryWrapper = new QueryWrapper<>();
  158. userQueryWrapper.eq("username", username)
  159. .eq("status", StatusEnum.Enable.getKey())
  160. .eq("is_deleted", IsDeleteEnum.N.getKey());
  161. SysUser user = this.getOne(userQueryWrapper, false);
  162. //判断用户是否存在
  163. if (null == user) {
  164. throw new CommonException(ServiceErrorCode.USER_NOT_FOUND);
  165. }
  166. //获取用户所在医院
  167. Long id = user.getId();
  168. QueryWrapper<SysUserHospital> UserHospitalQueryWrapper = new QueryWrapper<>();
  169. UserHospitalQueryWrapper
  170. .eq("user_id", id)
  171. .eq("is_deleted", IsDeleteEnum.N.getKey());
  172. SysUserHospital userHospital = sysUserHospitalFacade.getOne(UserHospitalQueryWrapper, false);
  173. Long hospitalId = userHospital.getHospitalId();
  174. //判断医院是否启用用户锁定校验
  175. QueryWrapper<SysHospitalSet> hospitalSetQueryWrapper = new QueryWrapper<>();
  176. hospitalSetQueryWrapper.eq("is_deleted", 'N')
  177. .eq("hospital_id", hospitalId)
  178. .eq("code", "lock_user");
  179. SysHospitalSet hospitalSet = sysHospitalSetFacade.getOne(hospitalSetQueryWrapper);
  180. boolean lockFlag = false;
  181. if (hospitalSet != null) {
  182. lockFlag = Boolean.parseBoolean(hospitalSet.getValue());
  183. }
  184. //判断用户是否锁定
  185. if (lockFlag) {
  186. lockCheck(redisUtils, user);
  187. }
  188. //密码是否正确
  189. PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
  190. if (!passwordEncoder.matches(MD5Password, user.getPassword())) {
  191. if (!lockFlag) {
  192. throw new CommonException(ServiceErrorCode.USER_PASSWORD_ERROR);
  193. } else {
  194. //用户获取错误次数
  195. lockNumCheck(redisUtils, user, sysDictionaryFacade);
  196. }
  197. }
  198. JWT jwt = authServiceClient.getToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2",
  199. "password", username, MD5Password);
  200. if (null == jwt) {
  201. throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL);
  202. }
  203. redisUtils.del("user:captchaIds:" + captchaId);
  204. data.setAccessToken(jwt.getAccess_token());
  205. data.setRefreshToken(jwt.getRefresh_token());
  206. data.setType(user.getType());
  207. data.setTypeCn(ConstantEnum.getName(user.getType()));//返回中文
  208. //获取用户角色
  209. try {
  210. SysUserBaseVO sysUserBaseVO = new SysUserBaseVO();
  211. sysUserBaseVO.setUserId(user.getId());
  212. List<SysRoleDTO> selRoles = getlocalUserRoles(sysUserBaseVO);
  213. if (selRoles != null && !selRoles.isEmpty()) {
  214. data.setSelRoles(selRoles);
  215. }
  216. } catch (Exception e) {
  217. e.printStackTrace();
  218. }
  219. //token存入redis
  220. JwtStore jwtStore = new JwtStore();
  221. jwtStore.setAccessToken(jwt.getAccess_token());
  222. jwtStore.setRefreshToken(jwt.getRefresh_token());
  223. tokenFacade.createToken(jwtStore);
  224. //每次登录在redis缓存该用户登录成功的token;缓存时间为token有效时间
  225. long accessTokenTime = sysDictionaryFacade.getAccessTokenOutTime();
  226. redisUtils.set("user:refreshToken:outTime_" + user.getId(), accessTokenTime, accessTokenTime);
  227. /***
  228. * 未经过MD5加密密码复杂度判断
  229. */
  230. // 获取用户医院id
  231. // String hospitalID = SysUserUtils.getCurrentHospitalID();
  232. String idStr = String.valueOf(hospitalId);
  233. Boolean passwordRegular = passwordRegular(password, idStr);
  234. if (!passwordRegular) {
  235. data.setPasswordComplexity("未修改初始密码,请及时修改密码");
  236. }
  237. return data;
  238. }
  239. /**
  240. * @param redisUtils
  241. * @param user
  242. * @param sysDictionaryFacade
  243. * @Description锁定次数校验
  244. * @Return void
  245. */
  246. private void lockNumCheck(RedisUtils redisUtils, SysUser user, SysDictionaryFacade sysDictionaryFacade) {
  247. //获取锁定时间、解锁时间配置
  248. int unlockTime = 180;
  249. int lockTime = 60;
  250. int lockNum = 5;
  251. if (sysDictionaryFacade.getDictionaryWithKey() != null
  252. && sysDictionaryFacade.getDictionaryWithKey().containsKey("31")
  253. && sysDictionaryFacade.getDictionaryWithKey().get("31").containsKey("unlockTime")
  254. && sysDictionaryFacade.getDictionaryWithKey().get("31").containsKey("lockNum")
  255. && sysDictionaryFacade.getDictionaryWithKey().get("31").containsKey("lockTime")) {
  256. unlockTime = Integer.parseInt(sysDictionaryFacade.getDictionaryWithKey().get("31").get("unlockTime"));
  257. lockTime = Integer.parseInt(sysDictionaryFacade.getDictionaryWithKey().get("31").get("lockTime"));
  258. lockNum = Integer.parseInt(sysDictionaryFacade.getDictionaryWithKey().get("31").get("lockNum"));
  259. }
  260. Object numObj = redisUtils.get("user:pasError_" + user.getId());
  261. int num = 1;
  262. if (numObj != null) {
  263. num = (Integer) numObj;
  264. num = num + 1;
  265. if (num < lockNum) {
  266. redisUtils.opsForValue("user:pasError_" + user.getId(), num);
  267. } else {
  268. //锁定账号
  269. lockUser(user.getId(), LockEnum.LOCK.getKey());
  270. //启动定时任务解锁
  271. runTimerTask(user.getId(), LockEnum.UNLOCK.getKey(), unlockTime);
  272. //redis存入解锁账号(用户解锁剩余时间)
  273. redisUtils.set("user:lockTime_" + user.getId(), "lock", unlockTime);
  274. //获取锁定时间
  275. getLockError(user.getId(), redisUtils);
  276. }
  277. } else {
  278. redisUtils.set("user:pasError_" + user.getId(), num, lockTime);
  279. }
  280. String error = "账号或密码不正确,剩%s次机会,之后账号将被锁定10分钟";
  281. throw new CommonException(ServiceErrorCode.USER_PASSWORD_ERROR, String.format(error, lockNum - num));
  282. }
  283. /**
  284. * @param redisUtils
  285. * @param user
  286. * @Description锁定校验
  287. * @Return void
  288. */
  289. private void lockCheck(RedisUtils redisUtils, SysUser user) {
  290. if (LockEnum.LOCK.getKey().equals(user.getLocked())) {
  291. //获取锁定时间
  292. getLockError(user.getId(), redisUtils);
  293. }
  294. }
  295. /**
  296. * @param captchaId
  297. * @param captcha
  298. * @param redisUtils
  299. * @Description验证码校验
  300. * @Return void
  301. */
  302. private void checkCaptcha(String captchaId, String captcha, RedisUtils redisUtils) {
  303. Object captchaObject = redisUtils.get("user:captchaIds:" + captchaId);
  304. if (null == captchaObject || StringUtil.isBlank(captchaObject.toString()) || !captchaObject.toString().trim().equalsIgnoreCase(captcha)) {
  305. throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "验证码错误");
  306. }
  307. }
  308. private void getLockError(Long id, RedisUtils redisUtils) {
  309. Long endTime = redisUtils.getExpire("user:lockTime_" + id);
  310. long mint = endTime / 60;
  311. if (endTime % 60 > 0) {
  312. mint = mint + 1;
  313. }
  314. if (endTime >= 0) {
  315. String error = "账号已被锁定,%s分钟后将自动解锁或联系管理员解锁";
  316. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, String.format(error, mint));
  317. }
  318. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "用户被锁定,自动解锁异常请联系管理员!!!");
  319. }
  320. private void runTimerTask(Long id, String lock, int time) {
  321. lockTask.getMScheduledExecutorService().schedule(new Runnable() {
  322. @Override
  323. public void run() {
  324. try {
  325. lockUser(id, lock);
  326. } catch (Exception e) {
  327. e.printStackTrace();
  328. }
  329. }
  330. }, time, TimeUnit.SECONDS);
  331. }
  332. public boolean lockUser(Long id, String key) {
  333. //清除密码错误状态
  334. redisUtils.del("user:pasError_"+id);
  335. SysUser user = new SysUser();
  336. user.setId(id);
  337. user.setLocked(key);
  338. return this.updateById(user);
  339. }
  340. /**
  341. * 外部获取jwt
  342. *
  343. * @param username 用户名
  344. * @return jwt
  345. */
  346. public JwtDTO getJwtNoPass(String username) {
  347. JwtDTO data = new JwtDTO();
  348. if (StringUtil.isBlank(username)) {
  349. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  350. "请输入用户名");
  351. }
  352. QueryWrapper<SysUser> userQueryWrapper = new QueryWrapper<>();
  353. userQueryWrapper.eq("username", username)
  354. .eq("status", StatusEnum.Enable.getKey())
  355. .eq("is_deleted", IsDeleteEnum.N.getKey());
  356. SysUser user = this.getOne(userQueryWrapper, false);
  357. if (null == user) {
  358. throw new CommonException(ServiceErrorCode.USER_NOT_FOUND);
  359. }
  360. JwtStore jwt = tokenFacade.getToken(user.getId().toString());
  361. if (null == jwt) {
  362. throw new CommonException(CommonErrorCode.NOT_EXISTS, "Token不存在,请重新登录");
  363. }
  364. data.setAccessToken(jwt.getAccessToken());
  365. data.setRefreshToken(jwt.getRefreshToken());
  366. data.setType(user.getType());
  367. data.setTypeCn(ConstantEnum.getName(user.getType()));//返回中文
  368. return data;
  369. }
  370. /**
  371. * 刷新jwt
  372. *
  373. * @param refreshToken
  374. * @return jwt
  375. */
  376. public JwtDTO refreshJwt(String refreshToken) {
  377. JwtDTO data = new JwtDTO();
  378. if (StringUtil.isBlank(refreshToken)) {
  379. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  380. "刷新令牌不能为空");
  381. }
  382. //验证刷新令牌有效性
  383. if (!tokenFacade.verifyToken(refreshToken, 2)) {
  384. throw new CommonException(CommonErrorCode.TOKEN_PAST);
  385. }
  386. JWT jwt = authServiceClient.refreshToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2",
  387. "refresh_token", refreshToken);
  388. if (null == jwt) {
  389. throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL);
  390. }
  391. data.setAccessToken(jwt.getAccess_token());
  392. data.setRefreshToken(jwt.getRefresh_token());
  393. //token存入redis
  394. JwtStore jwtStore = new JwtStore();
  395. jwtStore.setAccessToken(jwt.getAccess_token());
  396. jwtStore.setRefreshToken(jwt.getRefresh_token());
  397. tokenFacade.createToken(jwtStore);
  398. return data;
  399. }
  400. /**
  401. * 验证jwt
  402. *
  403. * @param token
  404. * @return jwt
  405. */
  406. public OAuth2AccessToken checkToken(String token) {
  407. if (StringUtil.isBlank(token)) {
  408. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  409. "令牌不能为空");
  410. }
  411. OAuth2AccessToken jwt
  412. = authServiceClient.checkToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2", token);
  413. if (null == jwt) {
  414. throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL, "该Token不正确!");
  415. }
  416. return jwt;
  417. }
  418. /**
  419. * 修改密码
  420. *
  421. * @param password 原密码
  422. * @param modifyPassword 新密码
  423. * @return 修改密码是否成功
  424. */
  425. public Boolean modifyPassword(String password, String modifyPassword) {
  426. //使用MD5对原密码和新密码进行加密
  427. String MD5Password = DigestUtils.md5DigestAsHex(password.getBytes());
  428. String MD5ModifyPassword = DigestUtils.md5DigestAsHex(modifyPassword.getBytes());
  429. if (StringUtil.isBlank(password)) {
  430. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  431. "请输入原密码");
  432. }
  433. if (StringUtil.isBlank(modifyPassword)) {
  434. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  435. "请输入新密码");
  436. }
  437. //对传入的密码进行格式验证
  438. String hospitalID = SysUserUtils.getCurrentHospitalID();
  439. Boolean regularBoolean = passwordRegular(modifyPassword, hospitalID);
  440. if (!regularBoolean) {
  441. throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "请输入正确格式的新密码");
  442. }
  443. String userId = SysUserUtils.getCurrentPrincipleID();
  444. SysUser user = this.getOne(new QueryWrapper<SysUser>()
  445. .eq("is_deleted", IsDeleteEnum.N.getKey())
  446. .eq("status", StatusEnum.Enable.getKey())
  447. .eq("id", userId), false);
  448. if (null == user) {
  449. throw new CommonException(ServiceErrorCode.USER_NOT_FOUND);
  450. }
  451. PasswordEncoder passwordEncoder
  452. = PasswordEncoderFactories.createDelegatingPasswordEncoder();
  453. if (!passwordEncoder.matches(MD5Password, user.getPassword())) {
  454. throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "原密码错误");
  455. }
  456. if (password.equals(modifyPassword)) {
  457. throw new CommonException(CommonErrorCode.PARAM_IS_ERROR,
  458. "原密码和新密码不能相同");
  459. }
  460. String entryPassword = passwordEncoder.encode(MD5ModifyPassword);
  461. user.setPassword(entryPassword);
  462. user.setGmtModified(DateUtil.now());
  463. user.setModifier(userId);
  464. this.updateById(user);
  465. return true;
  466. }
  467. /**
  468. * 未加密密文正则表达式 至少8个字符,1个大写字母,1个小写字母,1个数字和1个特殊字符:
  469. *
  470. * @param password
  471. * @return
  472. */
  473. public Boolean passwordRegular(String password, String hospitalId) {
  474. boolean check = true;
  475. Map<String, Map<String, String>> dictionaryWithKey = sysDictionaryFacade.getDictionaryWithKey();
  476. if (dictionaryWithKey != null) {
  477. Map<String, String> stringStringMap = dictionaryWithKey.get("30");
  478. if (stringStringMap != null) {
  479. String regular = stringStringMap.get(hospitalId);
  480. if (StringUtil.isNotEmpty(regular)) {
  481. check = password.matches(regular);
  482. }
  483. }
  484. }
  485. return check;
  486. }
  487. /**
  488. * 登录
  489. *
  490. * @return 登录相关信息
  491. */
  492. public LoginDTO getUserOrgMenu() {
  493. LoginDTO data = new LoginDTO();
  494. Set<String> roleSet = new HashSet<>();
  495. Long userId = Long.parseLong(SysUserUtils.getCurrentPrincipleID());
  496. SysUser user = this.getOne(new QueryWrapper<SysUser>()
  497. .eq("is_deleted", IsDeleteEnum.N.getKey())
  498. .eq("status", StatusEnum.Enable.getKey())
  499. .eq("id", userId), false);
  500. QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
  501. sysUserRoleQueryWrapper.eq("user_id", userId);
  502. sysUserRoleQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey());
  503. List<SysUserRole> sysUserRoleList = sysUserRoleFacade.list(sysUserRoleQueryWrapper);
  504. if (ListUtil.isNotEmpty(sysUserRoleList)) {
  505. sysUserRoleList.forEach(sysUserRole -> {
  506. roleSet.add(sysUserRole.getRoleId() + "");
  507. });
  508. }
  509. if (user == null) {
  510. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
  511. "用户不存在【" + userId + "】");
  512. }
  513. //添加用户
  514. UserLoginDTO userLoginDTO = new UserLoginDTO();
  515. BeanUtil.copyProperties(user, userLoginDTO);
  516. data.setUserLoginDTO(userLoginDTO);
  517. //添加医院信息
  518. if (user.getType().equals(ConstantEnum.OUTER_USER.getKey())) {
  519. QueryWrapper<BasHospitalInfo> queryWrapper = new QueryWrapper<>();
  520. queryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
  521. .eq("id", SysUserUtils.getCurrentHospitalID());
  522. BasHospitalInfo basHospitalInfo = basHospitalInfoFacade.getOne(queryWrapper, false);
  523. BasHospitalInfoDTO basHospitalInfoDTO = new BasHospitalInfoDTO();
  524. BeanUtil.copyProperties(basHospitalInfo, basHospitalInfoDTO);
  525. data.setBasHospitalInfoDTO(basHospitalInfoDTO);
  526. }
  527. //添加菜单信息
  528. List<SysMenuWrapper> menuList = sysMenuFacade.getByRole(user.getId(), roleSet);
  529. List<SysUserPermissionDTO> sysUserPermissionDTOList = sysMenuFacade.getByRolePermission(user.getId(), roleSet);
  530. Map<Long, List<SysMenuWrapper>> menuMap = EntityUtil.makeEntityListMap(menuList, "parentId");
  531. Map<Long, List<SysUserPermissionDTO>> menuPermissionMap = EntityUtil.makeEntityListMap(sysUserPermissionDTOList, "menuId");
  532. List<SysMenuWrapper> menuRes = menuMap.get(-1L);
  533. for (SysMenuWrapper bean : menuRes) {
  534. getSonMenu(bean, menuMap, menuPermissionMap);
  535. }
  536. data.setMenuWrappers(menuRes);
  537. return data;
  538. }
  539. /**
  540. * 递归获取菜单结构
  541. *
  542. * @param menu 当前菜单
  543. * @param menuMap 菜单集
  544. * @return 菜单结构
  545. */
  546. public List<SysMenuWrapper> getSonMenu(SysMenuWrapper menu,
  547. Map<Long, List<SysMenuWrapper>> menuMap,
  548. Map<Long, List<SysUserPermissionDTO>> menuPermissionMap) {
  549. List<SysMenuWrapper> res = new ArrayList<>();
  550. List<SysMenuWrapper> list = menuMap.get(menu.getId());
  551. List<SysUserPermissionDTO> listPermission = menuPermissionMap.get(menu.getId());
  552. if (ListUtil.isNotEmpty(listPermission)) {
  553. menu.setSysUserPermissionDTOList(listPermission);
  554. }
  555. if (ListUtil.isNotEmpty(list)) {
  556. menu.setSubMenuList(list);
  557. for (SysMenuWrapper bean : list) {
  558. getSonMenu(bean, menuMap, menuPermissionMap);
  559. }
  560. }
  561. return res;
  562. }
  563. /**
  564. * 递归获取菜单结构
  565. *
  566. * @param menuList 菜单参数
  567. */
  568. public void getMenuStruct(List<SysMenuWrapper> menuList) {
  569. for (SysMenuWrapper m : menuList) {
  570. m.setSubMenuList(recursion(m));
  571. }
  572. }
  573. /**
  574. * 递归查询菜单信息
  575. *
  576. * @param m 参数
  577. * @return 菜单信息
  578. */
  579. public List<SysMenuWrapper> recursion(SysMenuWrapper m) {
  580. List<SysMenuWrapper> subMenu = sysMenuFacade.getSubMenuById(m.getId());
  581. for (SysMenuWrapper sub : subMenu) {
  582. sub.setSubMenuList(recursion(sub));
  583. }
  584. return subMenu;
  585. }
  586. //-------------用户维护BEGAIN------------------------
  587. /**
  588. * 用户列表翻页信息查询
  589. *
  590. * @param sysUserQueryVO 用户列表翻页信息入参
  591. * @return 用户列表翻页信息
  592. */
  593. public IPage<SysUserQueryDTO> userPageFac(SysUserQueryVO sysUserQueryVO) {
  594. sysUserQueryVO.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
  595. return this.userPage(sysUserQueryVO);
  596. }
  597. /**
  598. * 获取用户科室
  599. *
  600. * @param sysUserBaseVO 获取用户科室入参
  601. * @return 用户科室信息
  602. */
  603. public SysUserDeptDTO getUserDepts(SysUserBaseVO sysUserBaseVO) {
  604. checkUser(sysUserBaseVO.getUserId());
  605. SysUserDeptDTO sysUserDeptDTO = new SysUserDeptDTO();
  606. sysUserDeptDTO.setUserId(sysUserBaseVO.getUserId());
  607. BasDeptInfoVO basDeptInfoVO = new BasDeptInfoVO();
  608. List<BasDeptInfoDTO> basDeptInfoDTOList = basDeptInfoFacade.listForUser(basDeptInfoVO);
  609. List<SysUserDept> sysUserDeptList
  610. = sysUserDeptService.list(new QueryWrapper<SysUserDept>()
  611. .eq("is_deleted", IsDeleteEnum.N.getKey())
  612. .eq("user_id", sysUserBaseVO.getUserId())
  613. );
  614. if (ListUtil.isNotEmpty(sysUserDeptList)) {
  615. List<BasDeptInfoDTO> notSelDepts = new ArrayList<>();
  616. List<BasDeptInfoDTO> selDepts = new ArrayList<>();
  617. Set<String> selDeptIds = sysUserDeptList.stream()
  618. .map(SysUserDept::getDeptId)
  619. .collect(Collectors.toSet());
  620. for (BasDeptInfoDTO basDeptInfoDTO : basDeptInfoDTOList) {
  621. if (selDeptIds.contains(basDeptInfoDTO.getDeptId())) {
  622. selDepts.add(basDeptInfoDTO);
  623. } else {
  624. notSelDepts.add(basDeptInfoDTO);
  625. }
  626. }
  627. sysUserDeptDTO.setNotSelDepts(notSelDepts);
  628. sysUserDeptDTO.setSelDepts(selDepts);
  629. } else {
  630. sysUserDeptDTO.setNotSelDepts(basDeptInfoDTOList);
  631. }
  632. return sysUserDeptDTO;
  633. }
  634. /**
  635. * 获取用户角色
  636. *
  637. * @param sysUserBaseVO 获取用户角色入参
  638. * @return 用户角色信息
  639. */
  640. public SysUserRoleDTO getUserRoles(SysUserBaseVO sysUserBaseVO) {
  641. checkUser(sysUserBaseVO.getUserId());
  642. SysUserRoleDTO sysUserRoleDTO = new SysUserRoleDTO();
  643. sysUserRoleDTO.setUserId(sysUserBaseVO.getUserId());
  644. List<SysRoleDTO> sysRoleDTOList = sysRoleFacade.listFac();
  645. List<SysUserRole> sysUserRoleList
  646. = sysUserRoleService.list(new QueryWrapper<SysUserRole>()
  647. .eq("is_deleted", IsDeleteEnum.N.getKey())
  648. .eq("user_id", sysUserBaseVO.getUserId())
  649. );
  650. if (ListUtil.isNotEmpty(sysUserRoleList)) {
  651. List<SysRoleDTO> notSelRoles = new ArrayList<>();
  652. List<SysRoleDTO> selRoles = new ArrayList<>();
  653. Set<Long> selRoleIds = sysUserRoleList.stream()
  654. .map(SysUserRole::getRoleId)
  655. .collect(Collectors.toSet());
  656. for (SysRoleDTO sysRoleDTO : sysRoleDTOList) {
  657. if (selRoleIds.contains(sysRoleDTO.getId())) {
  658. selRoles.add(sysRoleDTO);
  659. } else {
  660. notSelRoles.add(sysRoleDTO);
  661. }
  662. }
  663. sysUserRoleDTO.setNotSelRoles(notSelRoles);
  664. sysUserRoleDTO.setSelRoles(selRoles);
  665. } else {
  666. sysUserRoleDTO.setNotSelRoles(sysRoleDTOList);
  667. }
  668. return sysUserRoleDTO;
  669. }
  670. /**
  671. * 获取用户角色
  672. *
  673. * @param sysUserBaseVO 获取用户角色入参
  674. * @return 用户角色信息
  675. */
  676. private List<SysRoleDTO> getlocalUserRoles(SysUserBaseVO sysUserBaseVO) {
  677. SysUserRoleDTO sysUserRoleDTO = new SysUserRoleDTO();
  678. sysUserRoleDTO.setUserId(sysUserBaseVO.getUserId());
  679. List<SysRoleDTO> sysRoleDTOList = sysRoleFacade.listFac();
  680. List<SysUserRole> sysUserRoleList
  681. = sysUserRoleService.list(new QueryWrapper<SysUserRole>()
  682. .eq("is_deleted", IsDeleteEnum.N.getKey())
  683. .eq("user_id", sysUserBaseVO.getUserId())
  684. );
  685. List<SysRoleDTO> selRoles = new ArrayList<>();
  686. if (ListUtil.isNotEmpty(sysUserRoleList)) {
  687. Set<Long> selRoleIds = sysUserRoleList.stream()
  688. .map(SysUserRole::getRoleId)
  689. .collect(Collectors.toSet());
  690. for (SysRoleDTO sysRoleDTO : sysRoleDTOList) {
  691. if (selRoleIds.contains(sysRoleDTO.getId())) {
  692. selRoles.add(sysRoleDTO);
  693. }
  694. }
  695. sysUserRoleDTO.setSelRoles(selRoles);
  696. }
  697. return selRoles;
  698. }
  699. /**
  700. * 用户启用
  701. *
  702. * @param sysUserBaseVO 用户启用入参
  703. * @return 是否成功
  704. */
  705. public Boolean enable(SysUserBaseVO sysUserBaseVO) {
  706. checkUser(sysUserBaseVO.getUserId());
  707. Date now = DateUtil.now();
  708. String userId = SysUserUtils.getCurrentPrincipleID();
  709. return this.update(new UpdateWrapper<SysUser>()
  710. .eq("is_deleted", IsDeleteEnum.N.getKey())
  711. .eq("id", sysUserBaseVO.getUserId())
  712. .eq("status", StatusEnum.Disable.getKey())
  713. .set("modifier", userId)
  714. .set("gmt_modified", now)
  715. .set("status", StatusEnum.Enable.getKey())
  716. );
  717. }
  718. /**
  719. * 用户停用
  720. *
  721. * @param sysUserBaseVO 用户停用入参
  722. * @return 是否成功
  723. */
  724. public Boolean disable(SysUserBaseVO sysUserBaseVO) {
  725. checkUser(sysUserBaseVO.getUserId());
  726. Date now = DateUtil.now();
  727. String userId = SysUserUtils.getCurrentPrincipleID();
  728. Boolean res = this.update(new UpdateWrapper<SysUser>()
  729. .eq("is_deleted", IsDeleteEnum.N.getKey())
  730. .eq("id", sysUserBaseVO.getUserId())
  731. .eq("status", StatusEnum.Enable.getKey())
  732. .set("modifier", userId)
  733. .set("gmt_modified", now)
  734. .set("status", StatusEnum.Disable.getKey())
  735. );
  736. //删除Token
  737. if (res) {
  738. tokenFacade.deleteToken(sysUserBaseVO.getUserId().toString());
  739. }
  740. return res;
  741. }
  742. /**
  743. * 编辑用户科室
  744. *
  745. * @param sysUserDeptVO 编辑用户科室入参
  746. * @return 是否成功
  747. */
  748. public Boolean editUserDepts(SysUserDeptVO sysUserDeptVO) {
  749. checkUser(sysUserDeptVO.getUserId());
  750. Date now = DateUtil.now();
  751. String userId = SysUserUtils.getCurrentPrincipleID();
  752. //删除原科室
  753. sysUserDeptService.update(new UpdateWrapper<SysUserDept>()
  754. .eq("is_deleted", IsDeleteEnum.N.getKey())
  755. .eq("user_id", sysUserDeptVO.getUserId())
  756. .set("is_deleted", IsDeleteEnum.Y.getKey())
  757. .set("modifier", userId)
  758. .set("gmt_modified", now)
  759. );
  760. //新增新科室
  761. if (ListUtil.isNotEmpty(sysUserDeptVO.getDeptIds())) {
  762. List<SysUserDept> sysUserDeptList = new ArrayList<>();
  763. for (String deptId : sysUserDeptVO.getDeptIds()) {
  764. SysUserDept sysUserDept = new SysUserDept();
  765. sysUserDept.setUserId(sysUserDeptVO.getUserId());
  766. sysUserDept.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
  767. sysUserDept.setDeptId(deptId);
  768. sysUserDept.setCreator(userId);
  769. sysUserDept.setModifier(userId);
  770. sysUserDept.setGmtCreate(now);
  771. sysUserDept.setGmtModified(now);
  772. sysUserDeptList.add(sysUserDept);
  773. }
  774. sysUserDeptService.saveBatch(sysUserDeptList);
  775. }
  776. //更新用户表
  777. return this.update(new UpdateWrapper<SysUser>()
  778. .eq("is_deleted", IsDeleteEnum.N.getKey())
  779. .eq("id", sysUserDeptVO.getUserId())
  780. .set("modifier", userId)
  781. .set("gmt_modified", now)
  782. );
  783. }
  784. /**
  785. * 编辑用户角色
  786. *
  787. * @param sysUserRoleVO 编辑用户角色入参
  788. * @return 是否成功
  789. */
  790. public Boolean editUserRoles(SysUserRoleVO sysUserRoleVO) {
  791. checkUser(sysUserRoleVO.getUserId());
  792. Date now = DateUtil.now();
  793. String userId = SysUserUtils.getCurrentPrincipleID();
  794. //删除原角色
  795. sysUserRoleService.update(new UpdateWrapper<SysUserRole>()
  796. .eq("is_deleted", IsDeleteEnum.N.getKey())
  797. .eq("user_id", sysUserRoleVO.getUserId())
  798. .set("is_deleted", IsDeleteEnum.Y.getKey())
  799. .set("modifier", userId)
  800. .set("gmt_modified", now)
  801. );
  802. //新增角色
  803. if (ListUtil.isNotEmpty(sysUserRoleVO.getRoleIds())) {
  804. List<SysUserRole> sysUserRoleList = new ArrayList<>();
  805. for (Long roleId : sysUserRoleVO.getRoleIds()) {
  806. SysUserRole sysUserRole = new SysUserRole();
  807. sysUserRole.setUserId(sysUserRoleVO.getUserId());
  808. sysUserRole.setRoleId(roleId);
  809. sysUserRole.setCreator(userId);
  810. sysUserRole.setModifier(userId);
  811. sysUserRole.setGmtCreate(now);
  812. sysUserRole.setGmtModified(now);
  813. sysUserRoleList.add(sysUserRole);
  814. }
  815. sysUserRoleService.saveBatch(sysUserRoleList);
  816. }
  817. //更新用户表
  818. this.update(new UpdateWrapper<SysUser>()
  819. .eq("is_deleted", IsDeleteEnum.N.getKey())
  820. .eq("id", sysUserRoleVO.getUserId())
  821. .set("modifier", userId)
  822. .set("gmt_modified", now)
  823. );
  824. //删除Token
  825. tokenFacade.deleteToken(sysUserRoleVO.getUserId().toString());
  826. return true;
  827. }
  828. /**
  829. * 确认用户是否是管理员下的用户
  830. *
  831. * @param userId 用户Id
  832. */
  833. private void checkUser(Long userId) {
  834. //确认用户是否是管理员统一医院下的用户
  835. Integer cnt = sysUserHospitalFacade.count(new QueryWrapper<SysUserHospital>()
  836. .eq("is_deleted", IsDeleteEnum.N.getKey())
  837. .eq("user_id", userId)
  838. .eq("hospital_id", SysUserUtils.getCurrentHospitalID())
  839. );
  840. if (cnt < 1) {
  841. throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "该医院下无该用户");
  842. }
  843. }
  844. //-------------用户维护END---------------------------
  845. /**
  846. * @param
  847. * @Description登出功能
  848. * @Return java.lang.Boolean
  849. */
  850. public Boolean logout() {
  851. try {
  852. //清除缓存
  853. //销毁token
  854. redisUtils.del("user_tokens_" + SysUserUtils.getCurrentPrincipleID());
  855. } catch (Exception e) {
  856. throw new CommonException(CommonErrorCode.FAIL, "登出失败");
  857. }
  858. return true;
  859. }
  860. }