2
0

UserServiceImpl.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  144. public void updateByUser(UserDto userDto) {
  145. User userOne = (User) SecurityUtils.getSubject().getPrincipal();
  146. User user = baseMapper.selectOne(new QueryWrapper<User>().lambda().like(
  147. !StringUtils.isEmpty(userDto.getId()), User::getId, userDto.getId()));
  148. if (Objects.isNull(user)) {
  149. throw new CostException("用户不存在");
  150. }
  151. baseMapper.deleteById(user.getId());
  152. User userRequest = BeanUtil.convertObj(userDto, User.class);
  153. userRequest.setId(null);
  154. userRequest.setHospitalStatus(userDto.getHospitalStatus());
  155. userRequest.setCreateTime(System.currentTimeMillis());
  156. userRequest.setHospId(userOne.getHospId());
  157. if (!StringUtils.isEmpty(userDto.getPassword())) {
  158. String newPassWord = SecureUtil.md5(userDto.getPassword());
  159. userRequest.setPassword(newPassWord);
  160. }else {
  161. userRequest.setPassword(user.getPassword());
  162. }
  163. baseMapper.insert(userRequest);
  164. }
  165. /**
  166. * 导入用户
  167. *
  168. * @param list 上传的文件读取的内容
  169. * @param currentUser 当前登录用户
  170. */
  171. @Override
  172. @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
  173. public Result importUser(List<List<Object>> list, User currentUser) {
  174. // TODO: 2021/7/26 校验excel格式是否正确
  175. for (int i = list.size() - 1; i >= 0; i--) {
  176. if (i == 0 || i == 1 || i == 2 || i == 3) {
  177. list.remove(list.get(i));
  178. }
  179. }
  180. log.info("读取的数据为:{}", list);
  181. List<User> users = new ArrayList<>();
  182. List<String> errRowNums = new ArrayList<>();
  183. for (int i = 0; i < list.size(); i++) {
  184. List<Object> data = list.get(i);
  185. log.info("得到用户输入的数据为:{}", data);
  186. User user = new User();
  187. user.setHospId(currentUser.getHospId());
  188. user.setCreateTime(System.currentTimeMillis());
  189. int size = data.size();
  190. if (size != 5) {
  191. // 补充读取的null问题
  192. if (size == 4) {
  193. data.add(StrUtil.EMPTY);
  194. }
  195. for (int j = 0; j < 5; j++) {
  196. if (Objects.isNull(data.get(j))) {
  197. data.set(j, StrUtil.EMPTY);
  198. }
  199. }
  200. }
  201. for (int j = 0; j < 5; j++) {
  202. String str = String.valueOf(data.get(j));
  203. log.info("得到的字符串{}", str);
  204. if (StrUtil.isBlank(str)) {
  205. errRowNums.add("" + (i + 5));
  206. }
  207. if (j == 0) {
  208. Hospital hospital = hosptailService.getByName(str);
  209. user.setHospId(hospital.getId());
  210. } else if (j == 1) {
  211. user.setName(str);
  212. } else if (j == 2) {
  213. user.setAccount(str);
  214. } else if (j == 3) {
  215. user.setPassword(SecureUtil.md5(str));
  216. } else {
  217. user.setMobilePhoneNum(str);
  218. }
  219. }
  220. users.add(user);
  221. }
  222. if (CollUtil.isNotEmpty(errRowNums)) {
  223. String collect = errRowNums.stream().collect(Collectors.joining(StrUtil.COMMA));
  224. throw new CostException(500, "第" + collect + "行数据异常");
  225. }
  226. // 校验users
  227. List<User> realUsers = new ArrayList<>();
  228. users.forEach(i -> {
  229. User one = getOne(
  230. new QueryWrapper<User>().lambda()
  231. .eq(User::getAccount, i.getAccount())
  232. .eq(User::getHospId, i.getHospId())
  233. );
  234. if (Objects.nonNull(one)) {
  235. realUsers.add(one);
  236. }
  237. });
  238. users = users.stream().filter(i -> !realUsers.stream().map(User::getAccount).collect(Collectors.toList()).contains(i.getAccount())).collect(Collectors.toList());
  239. this.saveBatch(users);
  240. return Result.build(200, "有" + realUsers.size() + "条数据已存在,未被导入", null);
  241. }
  242. // /**
  243. // * 校验是否是本院下人员,并且返回对应的院区id
  244. // * @param hospId
  245. // * @param str
  246. // * @return
  247. // */
  248. // private Integer getByNameAndCheck(Long hospId, String str) {
  249. // Integer thisHospAreaId = this.hosptailService.getByNameAndCheck(hospId, str);
  250. // return thisHospAreaId;
  251. // }
  252. /**
  253. * 退出登录
  254. *
  255. * @param user
  256. */
  257. @Override
  258. public void logout(User user) {
  259. redisUtil.del(user.getId() + "");
  260. }
  261. }