UserServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package com.imed.costaccount.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import cn.hutool.crypto.SecureUtil;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9. import com.imed.costaccount.common.exception.CostException;
  10. import com.imed.costaccount.common.token.JwtUtil;
  11. import com.imed.costaccount.common.token.RedisUtil;
  12. import com.imed.costaccount.common.util.BeanUtil;
  13. import com.imed.costaccount.common.util.PageUtils;
  14. import com.imed.costaccount.common.util.Result;
  15. import com.imed.costaccount.mapper.UserMapper;
  16. import com.imed.costaccount.model.Hospital;
  17. import com.imed.costaccount.model.User;
  18. import com.imed.costaccount.model.dto.LoginDTO;
  19. import com.imed.costaccount.model.dto.UserDto;
  20. import com.imed.costaccount.model.vo.LoginVO;
  21. import com.imed.costaccount.model.vo.UserVO;
  22. import com.imed.costaccount.service.HospitalService;
  23. import com.imed.costaccount.service.UserService;
  24. import lombok.extern.slf4j.Slf4j;
  25. import org.apache.shiro.SecurityUtils;
  26. import org.springframework.stereotype.Service;
  27. import org.springframework.transaction.annotation.Propagation;
  28. import org.springframework.transaction.annotation.Transactional;
  29. import org.springframework.util.StringUtils;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. import java.util.Map;
  33. import java.util.Objects;
  34. import java.util.concurrent.ConcurrentHashMap;
  35. import java.util.stream.Collectors;
  36. /**
  37. * @author 11290
  38. */
  39. @Slf4j
  40. @Service("userService")
  41. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
  42. private JwtUtil jwtUtil;
  43. private HospitalService hosptailService;
  44. private final RedisUtil redisUtil;
  45. private Map<String, Integer> map = new ConcurrentHashMap<>();
  46. public UserServiceImpl(JwtUtil jwtUtil, HospitalService hosptailService, RedisUtil redisUtil) {
  47. this.jwtUtil = jwtUtil;
  48. this.hosptailService = hosptailService;
  49. this.redisUtil = redisUtil;
  50. }
  51. /**
  52. * 登录具体逻辑
  53. *
  54. * @param loginDTO {@link LoginDTO} 登录相关参数
  55. * @return
  56. */
  57. @Override
  58. public LoginVO login(LoginDTO loginDTO) {
  59. String hospSign = loginDTO.getHospSign();
  60. Long id = loginDTO.getId();
  61. if (Objects.isNull(id)) {
  62. Hospital hospital = hosptailService.getBySign(hospSign);
  63. id = hospital.getId();
  64. }
  65. // 院区情况
  66. User one = this.getOne(
  67. new LambdaQueryWrapper<User>()
  68. .eq(User::getAccount, loginDTO.getAccount())
  69. .eq(User::getHospId, id)
  70. .last("limit 1")
  71. );
  72. if (Objects.isNull(one)) {
  73. throw new CostException("用户不存在");
  74. }
  75. if (!SecureUtil.md5(loginDTO.getPassword()).equals(one.getPassword())) {
  76. throw new CostException("密码错误");
  77. }
  78. String token = jwtUtil.createToken(one.getId());
  79. // 保存到redis 有效期一天
  80. redisUtil.set(one.getId() + "", token, 60 * 60 * 24);
  81. return LoginVO.builder().token(token).name(one.getName()).userid(one.getId()).build();
  82. }
  83. /**
  84. * 查询查询用户的数据信息
  85. *
  86. * @param page
  87. * @param pageSize
  88. * @param hospId
  89. * @return
  90. */
  91. @Override
  92. public PageUtils queryList(Integer page, Integer pageSize, Long hospId, String name) {
  93. Page<User> userPage = new Page<>(page, pageSize);
  94. Page<User> pages = this.page(userPage,
  95. new QueryWrapper<User>().lambda().
  96. eq(User::getHospId, hospId)
  97. .like(!StringUtils.isEmpty(name), User::getName, name)
  98. .orderByDesc(User::getCreateTime));
  99. List<User> records = pages.getRecords();
  100. List<UserVO> userVOS = BeanUtil.convertList(records, UserVO.class);
  101. PageUtils pageUtils = new PageUtils(pages);
  102. pageUtils.setList(userVOS);
  103. return pageUtils;
  104. }
  105. /**
  106. * 根据用户的姓名查询用户
  107. *
  108. * @param name
  109. * @return
  110. */
  111. @Override
  112. public List<UserVO> getByUserName(String name) {
  113. List<User> users = baseMapper.selectList(new QueryWrapper<User>().lambda().like(!StringUtils.isEmpty(name), User::getName, name));
  114. List<UserVO> userVOS = BeanUtil.convertList(users, UserVO.class);
  115. return userVOS;
  116. }
  117. /**
  118. * 保存用户信息
  119. *
  120. * @param userDto
  121. */
  122. @Override
  123. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  124. public void saveUser(UserDto userDto) {
  125. User user = (User) SecurityUtils.getSubject().getPrincipal();
  126. // 医院的Id
  127. Long hospId = user.getHospId();
  128. User userRequest = BeanUtil.convertObj(userDto, User.class);
  129. if (StringUtils.isEmpty(userDto.getPassword())) {
  130. throw new CostException("密码不能为空");
  131. }
  132. userRequest.setPassword(SecureUtil.md5(userDto.getPassword()));
  133. userRequest.setHospId(hospId);
  134. userRequest.setCreateTime(System.currentTimeMillis());
  135. baseMapper.insert(userRequest);
  136. }
  137. /**
  138. * 修改用户
  139. *
  140. * @param userDto
  141. */
  142. @Override
  143. public void updateByUser(UserDto userDto) {
  144. User userOne = (User) SecurityUtils.getSubject().getPrincipal();
  145. User user = baseMapper.selectOne(new QueryWrapper<User>().lambda().like(
  146. !StringUtils.isEmpty(userDto.getId()), User::getId, userDto.getId()));
  147. if (Objects.isNull(user)) {
  148. throw new CostException("用户不存在");
  149. }
  150. baseMapper.deleteById(user.getId());
  151. User userRequest = BeanUtil.convertObj(userDto, User.class);
  152. userRequest.setId(null);
  153. userRequest.setHospitalStatus(userDto.getHospitalStatus());
  154. userRequest.setCreateTime(System.currentTimeMillis());
  155. userRequest.setHospId(userOne.getHospId());
  156. if (!StringUtils.isEmpty(userDto.getPassword())) {
  157. String newPassWord = SecureUtil.md5(userDto.getPassword());
  158. userRequest.setPassword(newPassWord);
  159. }else {
  160. userRequest.setPassword(user.getPassword());
  161. }
  162. baseMapper.insert(userRequest);
  163. }
  164. /**
  165. * 导入用户
  166. *
  167. * @param list 上传的文件读取的内容
  168. * @param currentUser 当前登录用户
  169. */
  170. @Override
  171. @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
  172. public Result importUser(List<List<Object>> list, User currentUser) {
  173. // TODO: 2021/7/26 校验excel格式是否正确
  174. for (int i = list.size() - 1; i >= 0; i--) {
  175. if (i == 0 || i == 1 || i == 2 || i == 3) {
  176. list.remove(list.get(i));
  177. }
  178. }
  179. log.info("读取的数据为:{}", list);
  180. List<User> users = new ArrayList<>();
  181. List<String> errRowNums = new ArrayList<>();
  182. for (int i = 0; i < list.size(); i++) {
  183. List<Object> data = list.get(i);
  184. log.info("得到用户输入的数据为:{}", data);
  185. User user = new User();
  186. user.setHospId(currentUser.getHospId());
  187. user.setCreateTime(System.currentTimeMillis());
  188. int size = data.size();
  189. if (size != 5) {
  190. // 补充读取的null问题
  191. if (size == 4) {
  192. data.add(StrUtil.EMPTY);
  193. }
  194. for (int j = 0; j < 5; j++) {
  195. if (Objects.isNull(data.get(j))) {
  196. data.set(j, StrUtil.EMPTY);
  197. }
  198. }
  199. }
  200. for (int j = 0; j < 5; j++) {
  201. String str = String.valueOf(data.get(j));
  202. log.info("得到的字符串{}", str);
  203. if (StrUtil.isBlank(str)) {
  204. errRowNums.add("" + (i + 5));
  205. }
  206. if (j == 0) {
  207. Hospital hospital = hosptailService.getByName(str);
  208. user.setHospId(hospital.getId());
  209. } else if (j == 1) {
  210. user.setName(str);
  211. } else if (j == 2) {
  212. user.setAccount(str);
  213. } else if (j == 3) {
  214. user.setPassword(SecureUtil.md5(str));
  215. } else {
  216. user.setMobilePhoneNum(str);
  217. }
  218. }
  219. users.add(user);
  220. }
  221. if (CollUtil.isNotEmpty(errRowNums)) {
  222. String collect = errRowNums.stream().collect(Collectors.joining(StrUtil.COMMA));
  223. throw new CostException(500, "第" + collect + "行数据异常");
  224. }
  225. // 校验users
  226. List<User> realUsers = new ArrayList<>();
  227. users.forEach(i -> {
  228. User one = getOne(
  229. new QueryWrapper<User>().lambda()
  230. .eq(User::getAccount, i.getAccount())
  231. .eq(User::getHospId, i.getHospId())
  232. );
  233. if (Objects.nonNull(one)) {
  234. realUsers.add(one);
  235. }
  236. });
  237. users = users.stream().filter(i -> !realUsers.stream().map(User::getAccount).collect(Collectors.toList()).contains(i.getAccount())).collect(Collectors.toList());
  238. this.saveBatch(users);
  239. return Result.build(200, "有" + realUsers.size() + "条数据已存在,未被导入", null);
  240. }
  241. // /**
  242. // * 校验是否是本院下人员,并且返回对应的院区id
  243. // * @param hospId
  244. // * @param str
  245. // * @return
  246. // */
  247. // private Integer getByNameAndCheck(Long hospId, String str) {
  248. // Integer thisHospAreaId = this.hosptailService.getByNameAndCheck(hospId, str);
  249. // return thisHospAreaId;
  250. // }
  251. /**
  252. * 退出登录
  253. *
  254. * @param user
  255. */
  256. @Override
  257. public void logout(User user) {
  258. redisUtil.del(user.getId() + "");
  259. }
  260. /**
  261. * 通过用户id和医院id获取用户的名称,
  262. *
  263. * @param createUserId id
  264. * @param hospId 医院id
  265. * @return 如果不存在,返回"" (使用redis 缓存避免过多的查询)
  266. */
  267. @Override
  268. public String getUsernameByIdAndHospId(Long createUserId, Long hospId) {
  269. User one = this.getOne(
  270. new LambdaQueryWrapper<User>()
  271. .select(User::getName)
  272. .eq(User::getId, createUserId)
  273. .eq(User::getHospId, hospId)
  274. .last("limit 1")
  275. );
  276. if (Objects.isNull(one)) {
  277. return "";
  278. }
  279. return one.getName();
  280. }
  281. /**
  282. * 批量删除用户集合
  283. *
  284. * @param asList idList
  285. */
  286. @Override
  287. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  288. public void deleteByIds(List<Integer> asList) {
  289. this.removeByIds(asList);
  290. }
  291. }