UserFacade.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. package com.diagbot.facade;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.diagbot.client.AuthServiceClient;
  6. import com.diagbot.dto.GetConsoleUserInfoDTO;
  7. import com.diagbot.dto.LoginDTO;
  8. import com.diagbot.dto.RespDTO;
  9. import com.diagbot.dto.UserInfoDTO;
  10. import com.diagbot.dto.UserInfoExportDTO;
  11. import com.diagbot.dto.UserOrgDTO;
  12. import com.diagbot.entity.JWT;
  13. import com.diagbot.entity.Organization;
  14. import com.diagbot.entity.User;
  15. import com.diagbot.entity.UserAuthentication;
  16. import com.diagbot.entity.UserOrganization;
  17. import com.diagbot.entity.UserRole;
  18. import com.diagbot.entity.wrapper.MenuWrapper;
  19. import com.diagbot.enums.AuthStatusEnum;
  20. import com.diagbot.enums.OrganizationTypeEnum;
  21. import com.diagbot.exception.CommonErrorCode;
  22. import com.diagbot.exception.CommonException;
  23. import com.diagbot.exception.ServiceErrorCode;
  24. import com.diagbot.service.impl.UserServiceImpl;
  25. import com.diagbot.util.BeanUtil;
  26. import com.diagbot.util.DateUtil;
  27. import com.diagbot.util.EntityUtil;
  28. import com.diagbot.util.ExportBeanExcelUtil;
  29. import com.diagbot.util.GsonUtil;
  30. import com.diagbot.util.ListUtil;
  31. import com.diagbot.util.RegexValidateUtil;
  32. import com.diagbot.util.StringUtil;
  33. import com.diagbot.util.UserUtils;
  34. import com.diagbot.vo.ImgVerVerVO;
  35. import com.diagbot.vo.UserExportVO;
  36. import com.diagbot.vo.UserSaveVO;
  37. import org.springframework.beans.factory.annotation.Autowired;
  38. import org.springframework.cache.annotation.CacheEvict;
  39. import org.springframework.cache.annotation.CachePut;
  40. import org.springframework.cache.annotation.Cacheable;
  41. import org.springframework.security.crypto.factory.PasswordEncoderFactories;
  42. import org.springframework.security.crypto.password.PasswordEncoder;
  43. import org.springframework.stereotype.Component;
  44. import java.io.Serializable;
  45. import java.util.ArrayList;
  46. import java.util.Date;
  47. import java.util.HashMap;
  48. import java.util.List;
  49. import java.util.Map;
  50. /**
  51. * @Description: 用户业务层
  52. * @author: gaodm
  53. * @time: 2018/8/6 9:00
  54. */
  55. @Component
  56. public class UserFacade extends UserServiceImpl {
  57. private static final String CACHE_NAME = "UserInfo";
  58. @Autowired
  59. AuthServiceClient authServiceClient;
  60. @Autowired
  61. VerFacade verFacade;
  62. @Autowired
  63. OrganizationFacade organizationFacade;
  64. @Autowired
  65. UserOrganizationFacade userOrganizationFacade;
  66. @Autowired
  67. UserRoleFacade userRoleFacade;
  68. @Autowired
  69. MenuFacade menuFacade;
  70. @Autowired
  71. UserAuthenticationFacade userAuthenticationFacade;
  72. @Autowired
  73. PermissionFacade permissionFacade;
  74. /**
  75. * 注册
  76. * @param userSaveVO 参数
  77. * @return 用户信息
  78. */
  79. public User createUser(UserSaveVO userSaveVO){
  80. User user = new User();
  81. BeanUtil.copyProperties(userSaveVO, user);
  82. user.setGmtCreate(new Date());
  83. ImgVerVerVO imgVerVerVO = new ImgVerVerVO();
  84. BeanUtil.copyProperties(userSaveVO, imgVerVerVO);
  85. User bean = findByName(user.getUsername());
  86. if(bean != null) {
  87. throw new CommonException(ServiceErrorCode.USER_EXIST);
  88. }
  89. if(!RegexValidateUtil.checkMobileNumber(userSaveVO.getUsername())) {
  90. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "请输入正确的手机号!");
  91. }
  92. //TODO 测试注释了图形验证和短信验证,后面要开启
  93. // verFacade.verifyImgVerification(imgVerVerVO); //保存时再次校验图形验证码,主要是为了防止跳过前端校验直接调用接口
  94. PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
  95. String entryPassword= passwordEncoder.encode(user.getPassword());
  96. user.setPassword(entryPassword);
  97. this.save(user);
  98. // 机构相关业务
  99. doOrganization(userSaveVO, user);
  100. //权限相关业务
  101. doPermisson(userSaveVO, user);
  102. //用户认证业务
  103. doUserAuthentication(userSaveVO, user);
  104. return user;
  105. }
  106. /**
  107. * @param page 分页参数
  108. * @param userSaveVO 参数
  109. * @return 用户列表
  110. */
  111. public RespDTO<IPage<User>> index(Page page, UserSaveVO userSaveVO){
  112. User user = new User();
  113. BeanUtil.copyProperties(userSaveVO, user);
  114. IPage<User> res = this.indexPage(page, user);
  115. return RespDTO.onSuc(res);
  116. }
  117. /**
  118. * 添加一条默认用户认证信息
  119. * @param userSaveVO 参数
  120. * @param user 参数
  121. */
  122. public void doUserAuthentication(UserSaveVO userSaveVO, User user) {
  123. UserAuthentication ua = new UserAuthentication();
  124. ua.setGmtCreate(new Date());
  125. ua.setUserId(user.getId());
  126. userAuthenticationFacade.save(ua);
  127. }
  128. /**
  129. * 如果机构已存在,只要添加用户与机构的映射即可;如果机构不存在,先添加机构信息
  130. * @param userSaveVO 参数
  131. * @param user 参数
  132. */
  133. public void doPermisson(UserSaveVO userSaveVO, User user) {
  134. UserRole userRole = new UserRole();
  135. userRole.setUserId(user.getId());
  136. userRole.setRoleId(1L);
  137. userRole.setGmtCreate(new Date());
  138. userRoleFacade.save(userRole);
  139. }
  140. /**
  141. * 如果机构已存在,只要添加用户与机构的映射即可;如果机构不存在,先添加机构信息
  142. * @param userSaveVO 参数
  143. * @param user 参数
  144. */
  145. public void doOrganization(UserSaveVO userSaveVO, User user) {
  146. Map<String, Object> paramMap = new HashMap<>();
  147. String name = userSaveVO.getOrganization();
  148. paramMap.put("name", name);
  149. Long orgId = 0L;
  150. List<Organization> list = organizationFacade.selectByMap(paramMap);
  151. if(ListUtil.isEmpty(list)) {
  152. Organization org = new Organization();
  153. org.setName(name);
  154. org.setGmtCreate(new Date());
  155. organizationFacade.save(org);
  156. orgId = org.getId();
  157. } else {
  158. orgId = list.get(0).getId();
  159. //查询机构下是否已存在用户信息,如已存在,就抛异常,需求待核实
  160. Map paramMap1 = new HashMap();
  161. paramMap1.put("organization_id", orgId);
  162. paramMap1.put("is_deleted", "N");
  163. List<UserOrganization> res1 = userOrganizationFacade.selectByMap(paramMap1);
  164. if(ListUtil.isNotEmpty(res1)) {
  165. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "该机构下已存在用户,不能再添加别的用户!");
  166. }
  167. }
  168. UserOrganization userOrganization = new UserOrganization();
  169. userOrganization.setUserId(user.getId());
  170. userOrganization.setOrganizationId(orgId);
  171. userOrganization.setGmtCreate(new Date());
  172. userOrganizationFacade.save(userOrganization);
  173. }
  174. /**
  175. * 根据用户名获取用户信息
  176. * @param username 用户名
  177. * @return 用户信息
  178. */
  179. //@Cacheable(value = "UserName", key = "'username:'+#p0")
  180. public User getUserInfo(String username){
  181. return this.findByName(username);
  182. }
  183. /**
  184. * 登录
  185. * @param username 用户名
  186. * @param password 密码
  187. * @return 登录相关信息
  188. */
  189. public RespDTO login(String username , String password){
  190. User user= this.findByName(username);
  191. if(null==user){
  192. throw new CommonException(ServiceErrorCode.USER_NOT_FOUND);
  193. }
  194. PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
  195. if(!passwordEncoder.matches(password,user.getPassword())){
  196. throw new CommonException(ServiceErrorCode.USER_PASSWORD_ERROR);
  197. }
  198. JWT jwt = authServiceClient.getToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2", "password", username, password);
  199. // 获得用户菜单
  200. if(null==jwt){
  201. throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL);
  202. }
  203. LoginDTO loginDTO=new LoginDTO();
  204. //添加用户
  205. loginDTO.setUser(user);
  206. //添加token
  207. loginDTO.setToken(jwt.getAccess_token());
  208. //添加机构信息
  209. Organization org = organizationFacade.getById(user.getId());
  210. loginDTO.setOrganization(org);
  211. //添加菜单信息
  212. List<MenuWrapper> menuList = menuFacade.getByRole(user.getId());
  213. getMenuStruct(menuList);
  214. loginDTO.setMenuWrappers(menuList);
  215. return RespDTO.onSuc(loginDTO);
  216. }
  217. /**
  218. * 递归获取菜单结构
  219. * @param menuList 菜单参数
  220. */
  221. public void getMenuStruct(List<MenuWrapper> menuList) {
  222. for(MenuWrapper m : menuList) {
  223. m.setSubMenuList(recursion(m));
  224. }
  225. }
  226. /**
  227. * 递归查询菜单信息
  228. * @param m 参数
  229. * @return 菜单信息
  230. */
  231. public List<MenuWrapper> recursion(MenuWrapper m) {
  232. List<MenuWrapper> subMenu = menuFacade.getSubMenuById(m.getId());
  233. for (MenuWrapper sub : subMenu) {
  234. sub.setSubMenuList(recursion(sub));
  235. }
  236. return subMenu;
  237. }
  238. /**
  239. * 获取用户相关信息和机构信息
  240. * @param userIds 用户ids
  241. * @return 用户相关信息和机构信息
  242. */
  243. public Map<Long, UserOrgDTO> getUserAndOrg(List<Long> userIds) {
  244. Map<Long, UserOrgDTO> data = new HashMap();
  245. if(ListUtil.isEmpty(userIds)) {
  246. return data;
  247. }
  248. List<UserOrgDTO> list = this.getUserOrgByIds(userIds);
  249. // for(UserOrgDTO bean : list) {
  250. // data.put(bean.getUserId(), bean);
  251. // }
  252. data = EntityUtil.makeEntityMap(list,"userId");
  253. return data;
  254. }
  255. /**
  256. * 重置密码
  257. * @param username 用户名
  258. * @param password 密码
  259. * @param diffPassword 重置的密码
  260. * @return 重置密码是否成功
  261. */
  262. public RespDTO resetPassword(String username, String password, String diffPassword) {
  263. if (StringUtil.isBlank(username)){
  264. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  265. "请输入手机号!");
  266. }
  267. if (StringUtil.isBlank(password)){
  268. throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
  269. "请输入密码!");
  270. }
  271. User user= this.findByName(username);
  272. if(null==user){
  273. throw new CommonException(ServiceErrorCode.USER_NOT_FOUND);
  274. }
  275. PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
  276. if(!StringUtil.isBlank(diffPassword) && "Y".equals(diffPassword)) {
  277. if(passwordEncoder.matches(password,user.getPassword())){
  278. throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "修改后密码不能与修改前相同!");
  279. }
  280. }
  281. String entryPassword= passwordEncoder.encode(password);
  282. user.setPassword(entryPassword);
  283. user.setGmtModified(new Date());
  284. this.updateById(user);
  285. return RespDTO.onSuc(true);
  286. }
  287. //---------------缓存演示开始-------------------------------------
  288. /**
  289. * 新建用户
  290. * @param user 新建用户信息输入参数
  291. * @return 用户信息
  292. */
  293. @CachePut(value = CACHE_NAME, key = "'user:'+#p0['id']")
  294. public User saveUser(User user){
  295. PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
  296. String entryPassword= passwordEncoder.encode(user.getPassword());
  297. user.setPassword(entryPassword);
  298. user.setGmtCreate(new Date());
  299. user.setCreator(UserUtils.getCurrentPrincipleID());
  300. super.save(user);
  301. return user;
  302. }
  303. /**
  304. * 更新用户信息
  305. * @param user 更新用户信息输入参数
  306. * @return 用户信息
  307. */
  308. @CachePut(value = CACHE_NAME, key = "'user:'+#p0['id']")
  309. public User updateUser(User user){
  310. PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
  311. String entryPassword= passwordEncoder.encode(user.getPassword());
  312. user.setPassword(entryPassword);
  313. user.setGmtModified(new Date());
  314. user.setModifier(UserUtils.getCurrentPrincipleID());
  315. super.updateById(user);
  316. return user;
  317. }
  318. /**
  319. * 根据用户ID获取用户信息
  320. * @param id 用户ID
  321. * @return 用户信息
  322. */
  323. @Override
  324. @Cacheable(value = CACHE_NAME, key = "'user:'+#p0")
  325. public User getById(Serializable id){
  326. return super.getById(id);
  327. }
  328. /**
  329. * 根据用户ID删除用户(物理删除)
  330. * @param id 用户ID
  331. * @return 是否成功
  332. */
  333. @Override
  334. @CacheEvict(value = CACHE_NAME, key = "'user:'+#p0")
  335. public boolean removeById(Serializable id){
  336. return super.removeById(id);
  337. }
  338. /**
  339. * 获取控制台用户信息
  340. * @return 用户信息
  341. */
  342. public GetConsoleUserInfoDTO getConsoleUserInfo() {
  343. Long userId = Long.parseLong(UserUtils.getCurrentPrincipleID());
  344. User user = this.getById(userId);
  345. Organization organization = organizationFacade.getByUserId(userId);
  346. QueryWrapper<UserAuthentication> qw = new QueryWrapper<>();
  347. qw.eq("user_id", userId);
  348. qw.eq("is_deleted", "N");
  349. UserAuthentication userAuthentication = userAuthenticationFacade.getOne(qw);
  350. GetConsoleUserInfoDTO getConsoleUserInfoDTO = new GetConsoleUserInfoDTO();
  351. getConsoleUserInfoDTO.setUser(user);
  352. getConsoleUserInfoDTO.setOrganization(organization);
  353. getConsoleUserInfoDTO.setUserAuthentication(userAuthentication);
  354. return getConsoleUserInfoDTO;
  355. }
  356. //---------------缓存演示结束-------------------------------------
  357. /**
  358. * 远程调用,根据机构名称获取用户信息
  359. * @param orgName 机构信息
  360. * @return 用户ids
  361. */
  362. public List<Long> getUserByOrgNameFac(String orgName) {
  363. List<Long> userIdList = new ArrayList<>();
  364. if(StringUtil.isEmpty(orgName)) {
  365. return userIdList;
  366. }
  367. List<User> userList = this.getUserByOrgName(orgName);
  368. for(User bean : userList) {
  369. userIdList.add(bean.getId());
  370. }
  371. return userIdList;
  372. }
  373. /**
  374. *
  375. * @param userExportVO
  376. * @return 导出Excel文件
  377. */
  378. public RespDTO export(UserExportVO userExportVO){
  379. Map<String, Object> userMap = new HashMap<String, Object>();
  380. userMap.put("startTime", userExportVO.getStartTime());
  381. userMap.put("endTime", userExportVO.getEndTime());
  382. List<UserInfoDTO> datas = dependentuserInfoByTime(userMap);
  383. GsonUtil.toJson(datas);
  384. List<String> listName = new ArrayList<>();
  385. listName.add("用户id");
  386. listName.add("记录创建时间");
  387. listName.add("用户名");
  388. listName.add("联系人");
  389. listName.add("邮箱");
  390. listName.add("机构ID");
  391. listName.add("机构名称");
  392. listName.add("机构属性");
  393. listName.add("负责人");
  394. listName.add("机构地址");
  395. listName.add("上级机构id");
  396. listName.add("下属机构数量");
  397. listName.add("岗位信息");
  398. listName.add("是否通过认证 ");
  399. listName.add("认证状态");
  400. List<String> listId = new ArrayList<>();
  401. listId.add("userId");//用户ID
  402. listId.add("userGmtCreate");//记录创建时间
  403. listId.add("userName");// 用户名
  404. listId.add("linKman");//联系人
  405. listId.add("email");// 邮箱
  406. listId.add("orgId");//机构ID
  407. //listId.add("orgGmtCreate");//记录创建时间
  408. listId.add("orgName");//机构名称
  409. listId.add("orgType");//机构属性
  410. listId.add("orgPrincipal");//负责人
  411. listId.add("orgAddress");//机构地址
  412. listId.add("orgParentId");//上级机构id
  413. listId.add("orgSubNum");//下属机构数量
  414. listId.add("autPosition");//岗位信息
  415. listId.add("autIsReject");//是否通过认证 N:未通过,Y:已通过
  416. listId.add("autStatus");//认证状态
  417. List<UserInfoExportDTO> list = new ArrayList<>();
  418. for (int i = 0; i < datas.size(); i++) {
  419. UserInfoDTO userInfo = datas.get(i);
  420. list.add(new UserInfoExportDTO(String.valueOf(userInfo.getUserId()),
  421. DateUtil.formatDate(userInfo.getUserGmtCreate()),
  422. userInfo.getUserName(),
  423. userInfo.getLinKman(),
  424. userInfo.getEmail(),
  425. String.valueOf(userInfo.getOrgId()),
  426. userInfo.getOrgName(),
  427. OrganizationTypeEnum.getName(userInfo.getOrgType()),
  428. userInfo.getOrgPrincipal(),
  429. userInfo.getOrgAddress(),
  430. String.valueOf(userInfo.getOrgParentId()),
  431. String.valueOf(userInfo.getOrgSubNum()),
  432. userInfo.getAutPosition(),
  433. String.valueOf(userInfo.getAutIsReject()),
  434. AuthStatusEnum.getName(userInfo.getAutStatus())));
  435. }
  436. //response.setContentType("text/html;charset=UTF-8");
  437. String filePath =userExportVO.getFilePath();//文件路径
  438. String fileName = userExportVO.getFileName();//文件名
  439. ExportBeanExcelUtil ex = new ExportBeanExcelUtil();
  440. RespDTO resul = ex.exportExcel("测试POI导出EXCEL文档", listName, listId, list,filePath,fileName);
  441. return resul;
  442. }
  443. }