SysUserDataImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. package cc.iotkit.data.service;
  2. import cc.iotkit.common.api.PageRequest;
  3. import cc.iotkit.common.api.Paging;
  4. import cc.iotkit.common.constant.UserConstants;
  5. import cc.iotkit.common.tenant.helper.TenantHelper;
  6. import cc.iotkit.common.utils.MapstructUtils;
  7. import cc.iotkit.common.utils.StreamUtils;
  8. import cc.iotkit.common.utils.StringUtils;
  9. import cc.iotkit.data.dao.IJPACommData;
  10. import cc.iotkit.data.dao.SysUserRepository;
  11. import cc.iotkit.data.model.TbSysPost;
  12. import cc.iotkit.data.model.TbSysRole;
  13. import cc.iotkit.data.model.TbSysUser;
  14. import cc.iotkit.data.system.ISysDeptData;
  15. import cc.iotkit.data.system.ISysRoleData;
  16. import cc.iotkit.data.system.ISysUserData;
  17. import cc.iotkit.data.util.PageBuilder;
  18. import cc.iotkit.data.util.PredicateBuilder;
  19. import cc.iotkit.model.system.SysDept;
  20. import cc.iotkit.model.system.SysRole;
  21. import cc.iotkit.model.system.SysUser;
  22. import cn.hutool.core.util.ObjectUtil;
  23. import com.querydsl.core.QueryResults;
  24. import com.querydsl.core.types.Predicate;
  25. import com.querydsl.core.types.Projections;
  26. import com.querydsl.jpa.impl.JPAQueryFactory;
  27. import lombok.RequiredArgsConstructor;
  28. import org.springframework.context.annotation.Primary;
  29. import org.springframework.data.jpa.repository.JpaRepository;
  30. import org.springframework.stereotype.Service;
  31. import java.util.List;
  32. import java.util.Objects;
  33. import java.util.stream.Collectors;
  34. import static cc.iotkit.data.model.QTbSysDept.tbSysDept;
  35. import static cc.iotkit.data.model.QTbSysPost.tbSysPost;
  36. import static cc.iotkit.data.model.QTbSysRole.tbSysRole;
  37. import static cc.iotkit.data.model.QTbSysUser.tbSysUser;
  38. import static cc.iotkit.data.model.QTbSysUserPost.tbSysUserPost;
  39. import static cc.iotkit.data.model.QTbSysUserRole.tbSysUserRole;
  40. /**
  41. * @Author:tfd
  42. * @Date:2023/5/29 16:00
  43. */
  44. @Primary
  45. @Service
  46. @RequiredArgsConstructor
  47. public class SysUserDataImpl implements ISysUserData, IJPACommData<SysUser, Long> {
  48. private final SysUserRepository userRepository;
  49. private final ISysDeptData sysDeptData;
  50. private final ISysRoleData sysRoleData;
  51. private final JPAQueryFactory jpaQueryFactory;
  52. @Override
  53. public JpaRepository getBaseRepository() {
  54. return userRepository;
  55. }
  56. @Override
  57. public Class getJpaRepositoryClass() {
  58. return TbSysUser.class;
  59. }
  60. @Override
  61. public Class getTClass() {
  62. return SysUser.class;
  63. }
  64. @Override
  65. public long countByDeptId(Long aLong) {
  66. return 0;
  67. }
  68. @Override
  69. public boolean checkUserNameUnique(SysUser user) {
  70. final TbSysUser ret = jpaQueryFactory.select(tbSysUser).from(tbSysUser)
  71. .where(PredicateBuilder.instance()
  72. .and(tbSysUser.userName.eq(user.getUserName()))
  73. .and(Objects.nonNull(user.getId()), () -> tbSysUser.id.ne(user.getId()))
  74. .build()).fetchOne();
  75. return Objects.isNull(ret);
  76. }
  77. @Override
  78. public boolean checkPhoneUnique(SysUser user) {
  79. final TbSysUser ret = jpaQueryFactory.select(tbSysUser).from(tbSysUser)
  80. .where(PredicateBuilder.instance()
  81. .and(tbSysUser.phonenumber.eq(user.getPhonenumber()))
  82. .and(Objects.nonNull(user.getId()), () -> tbSysUser.id.ne(user.getId()))
  83. .build()).fetchOne();
  84. return Objects.isNull(ret);
  85. }
  86. @Override
  87. public SysUser findById(Long id) {
  88. TbSysUser sysUser = jpaQueryFactory.select(tbSysUser).from(tbSysUser).where(tbSysUser.id.eq(id)).fetchOne();
  89. SysUser convert = MapstructUtils.convert(sysUser, SysUser.class);
  90. List<SysRole> sysRoles = sysRoleData.findByUserId(id);
  91. convert.setRoles(sysRoles);
  92. Long deptId = convert.getDeptId();
  93. if (deptId == null) {
  94. return convert;
  95. }
  96. SysDept dept = sysDeptData.findById(deptId);
  97. if (ObjectUtil.isNotNull(dept)) {
  98. convert.setDept(dept);
  99. }
  100. return convert;
  101. }
  102. @Override
  103. public boolean checkEmailUnique(SysUser user) {
  104. final TbSysUser ret = jpaQueryFactory.select(tbSysUser).from(tbSysUser)
  105. .where(PredicateBuilder.instance()
  106. .and(tbSysUser.email.eq(user.getEmail()))
  107. .and(Objects.nonNull(user.getId()), () -> tbSysUser.id.ne(user.getId()))
  108. .build()).fetchOne();
  109. return Objects.isNull(ret);
  110. }
  111. @Override
  112. public SysUser selectByPhonenumber(String phonenumber) {
  113. TbSysUser ret = jpaQueryFactory.select(tbSysUser).from(tbSysUser)
  114. .where(PredicateBuilder.instance()
  115. .and(tbSysUser.phonenumber.eq(phonenumber))
  116. .build()).fetchOne();
  117. return MapstructUtils.convert(ret, SysUser.class);
  118. }
  119. @Override
  120. public SysUser selectTenantUserByPhonenumber(String phonenumber, String tenantId) {
  121. TbSysUser ret = jpaQueryFactory.select(tbSysUser).from(tbSysUser)
  122. .where(PredicateBuilder.instance()
  123. .and(tbSysUser.phonenumber.eq(phonenumber))
  124. .and(tbSysUser.tenantId.eq(tenantId))
  125. .build()).fetchOne();
  126. return MapstructUtils.convert(ret, SysUser.class);
  127. }
  128. @Override
  129. public SysUser selectTenantUserByEmail(String email, String tenantId) {
  130. TbSysUser ret = jpaQueryFactory.select(tbSysUser).from(tbSysUser)
  131. .where(PredicateBuilder.instance()
  132. .and(tbSysUser.email.eq(email))
  133. .and(tbSysUser.tenantId.eq(tenantId))
  134. .build()).fetchOne();
  135. return MapstructUtils.convert(ret, SysUser.class);
  136. }
  137. @Override
  138. public SysUser selectUserByEmail(String email) {
  139. TbSysUser ret = jpaQueryFactory.select(tbSysUser).from(tbSysUser)
  140. .where(PredicateBuilder.instance()
  141. .and(tbSysUser.email.eq(email))
  142. .build()).fetchOne();
  143. return MapstructUtils.convert(ret, SysUser.class);
  144. }
  145. @Override
  146. public SysUser selectTenantUserByUserName(String username, String tenantId) {
  147. TbSysUser ret = jpaQueryFactory.select(tbSysUser).from(tbSysUser)
  148. .where(PredicateBuilder.instance()
  149. .and(tbSysUser.userName.eq(username))
  150. .and(StringUtils.isNotEmpty(tenantId), () -> tbSysUser.tenantId.eq(tenantId))
  151. // .and(TenantHelper.isEnable(), () -> tbSysUser.tenantId.eq(tenantId))
  152. .build()).fetchOne();
  153. if (Objects.nonNull(ret)) {
  154. SysUser convert = MapstructUtils.convert(ret, SysUser.class);
  155. Long deptId = ret.getDeptId();
  156. if (Objects.nonNull(deptId)) {
  157. // 获取部门信息
  158. SysDept sysDept = sysDeptData.findById(deptId);
  159. convert.setDept(sysDept);
  160. // 获取角色信息
  161. List<SysRole> sysRoles = sysRoleData.findByUserId(ret.getId());
  162. convert.setRoles(sysRoles);
  163. }
  164. return MapstructUtils.convert(ret, SysUser.class);
  165. } else {
  166. return null;
  167. }
  168. }
  169. @Override
  170. public SysUser selectUserByUserName(String username) {
  171. TbSysUser ret = jpaQueryFactory.select(tbSysUser).from(tbSysUser)
  172. .where(PredicateBuilder.instance()
  173. .and(tbSysUser.userName.eq(username))
  174. .build()).fetchOne();
  175. SysUser convert = MapstructUtils.convert(ret, SysUser.class);
  176. Long deptId = ret.getDeptId();
  177. if (Objects.nonNull(deptId)) {
  178. // 获取部门信息
  179. SysDept sysDept = sysDeptData.findById(deptId);
  180. convert.setDept(sysDept);
  181. // 获取角色信息
  182. List<SysRole> sysRoles = sysRoleData.findByUserId(ret.getId());
  183. convert.setRoles(sysRoles);
  184. }
  185. return convert;
  186. }
  187. @Override
  188. public Paging<SysUser> selectAllocatedList(PageRequest<SysUser> to) {
  189. SysUser data = to.getData();
  190. PredicateBuilder builder = PredicateBuilder.instance()
  191. .and(StringUtils.isNotBlank(data.getPhonenumber()), () -> tbSysUser.phonenumber.like("%"+data.getPhonenumber()+"%"))
  192. .and(StringUtils.isNotBlank(data.getUserName()), () -> tbSysUser.userName.like("%"+data.getUserName()+"%"))
  193. .and(StringUtils.isNotBlank(data.getStatus()), () -> tbSysUser.status.eq(data.getStatus()))
  194. .and(Objects.nonNull(data.getDeptId()), () -> tbSysUser.deptId.eq(data.getDeptId()))
  195. .and(tbSysUser.delFlag.eq(UserConstants.ROLE_NORMAL))
  196. .and(Objects.nonNull(data.getRoleId()), () -> tbSysRole.id.eq(data.getRoleId()));
  197. QueryResults<TbSysUser> tbSysUserQueryResults = jpaQueryFactory.select(Projections.bean(TbSysUser.class, tbSysUser.id, tbSysUser.deptId, tbSysUser.userName,
  198. tbSysUser.nickName, tbSysUser.email, tbSysUser.phonenumber, tbSysUser.createTime)).from(tbSysUser)
  199. .leftJoin(tbSysDept).on(tbSysUser.deptId.eq(tbSysDept.id))
  200. .leftJoin(tbSysUserRole).on(tbSysUser.id.eq(tbSysUserRole.userId))
  201. .leftJoin(tbSysRole).on(tbSysUserRole.roleId.eq(tbSysRole.id))
  202. .where(builder.build()).offset(to.getOffset()).limit(to.getPageSize()).fetchResults();
  203. return new Paging<>(tbSysUserQueryResults.getTotal(), MapstructUtils.convert(tbSysUserQueryResults.getResults(), SysUser.class));
  204. }
  205. @Override
  206. public String selectUserPostGroup(String userName) {
  207. List<TbSysPost> fetch = jpaQueryFactory.select(Projections.bean(TbSysPost.class, tbSysPost.id, tbSysPost.postName, tbSysPost.postCode)).from(tbSysPost)
  208. .leftJoin(tbSysUserPost).on(tbSysPost.id.eq(tbSysUserPost.postId))
  209. .leftJoin(tbSysUser).on(tbSysUserPost.userId.eq(tbSysUser.id))
  210. .where(tbSysUser.userName.eq(userName))
  211. .orderBy(tbSysPost.postSort.asc()).fetch();
  212. return fetch.stream().map(TbSysPost::getPostName).collect(Collectors.joining(","));
  213. }
  214. @Override
  215. public String selectUserRoleGroup(String userName) {
  216. List<TbSysRole> fetch = jpaQueryFactory.select(tbSysRole).from(tbSysRole)
  217. .leftJoin(tbSysUserRole).on(tbSysRole.id.eq(tbSysUserRole.roleId))
  218. .leftJoin(tbSysUser).on(tbSysUserRole.userId.eq(tbSysUser.id))
  219. .where(tbSysUser.userName.eq(userName))
  220. .orderBy(tbSysRole.roleSort.asc()).fetch();
  221. return fetch.stream().map(TbSysRole::getRoleName).collect(Collectors.joining(","));
  222. }
  223. @Override
  224. public Paging<SysUser> selectUnallocatedList(PageRequest<SysUser> to) {
  225. SysUser data = to.getData();
  226. PredicateBuilder builder = PredicateBuilder.instance();
  227. if (Objects.nonNull(data)) {
  228. builder.and(StringUtils.isNotBlank(data.getPhonenumber()), () -> tbSysUser.phonenumber.like("%"+data.getPhonenumber()+"%"))
  229. .and(StringUtils.isNotBlank(data.getUserName()), () -> tbSysUser.userName.like("%"+data.getUserName()+"%"))
  230. .and(StringUtils.isNotBlank(data.getStatus()), () -> tbSysUser.status.eq(data.getStatus()))
  231. .and(Objects.nonNull(data.getDeptId()), () -> tbSysUser.deptId.eq(data.getDeptId()))
  232. .and(tbSysUser.delFlag.eq(UserConstants.ROLE_NORMAL));
  233. }
  234. QueryResults<SysUser> sysUserQueryResults = jpaQueryFactory.select(Projections.bean(SysUser.class, tbSysUser.id, tbSysUser.deptId, tbSysUser.userName,
  235. tbSysUser.nickName, tbSysUser.email, tbSysUser.phonenumber, tbSysUser.createTime)).from(tbSysUser)
  236. .leftJoin(tbSysDept).on(tbSysUser.deptId.eq(tbSysDept.id))
  237. .leftJoin(tbSysUserRole).on(tbSysUser.id.eq(tbSysUserRole.userId))
  238. .leftJoin(tbSysRole).on(tbSysUserRole.roleId.eq(tbSysRole.id))
  239. .where(builder.build()).offset(to.getOffset()).limit(to.getPageSize()).fetchResults();
  240. return new Paging<>(sysUserQueryResults.getTotal(), sysUserQueryResults.getResults());
  241. }
  242. @Override
  243. public SysUser findByPhonenumber(String phonenumber) {
  244. TbSysUser user = jpaQueryFactory.select(tbSysUser).from(tbSysUser)
  245. .where(PredicateBuilder.instance()
  246. .and(tbSysUser.phonenumber.eq(phonenumber))
  247. .build()).fetchOne();
  248. return MapstructUtils.convert(user, SysUser.class);
  249. }
  250. @Override
  251. public Paging<SysUser> findAll(PageRequest<SysUser> pageRequest) {
  252. return PageBuilder.toPaging(userRepository.findAll(buildQueryCondition(pageRequest.getData()), PageBuilder.toPageable(pageRequest))).to(SysUser.class);
  253. }
  254. @Override
  255. public List<SysUser> findAllByCondition(SysUser user) {
  256. return buildQuery(buildQueryCondition(user));
  257. }
  258. private List<SysUser> buildQuery(Predicate predicate) {
  259. List<TbSysUser> users = jpaQueryFactory.select(Projections.bean(TbSysUser.class, tbSysUser.id, tbSysUser.deptId,
  260. tbSysUser.nickName, tbSysUser.userName, tbSysUser.email, tbSysUser.avatar, tbSysUser.phonenumber, tbSysUser.sex,
  261. tbSysUser.status, tbSysUser.delFlag, tbSysUser.loginIp, tbSysUser.loginDate, tbSysUser.createBy, tbSysUser.createTime,
  262. tbSysUser.remark, tbSysDept.deptName, tbSysDept.leader))
  263. .from(tbSysUser)
  264. .leftJoin(tbSysDept).on(tbSysUser.deptId.eq(tbSysDept.id))
  265. .where(predicate).fetch();
  266. return MapstructUtils.convert(users, SysUser.class);
  267. }
  268. private Predicate buildQueryCondition(SysUser user) {
  269. List<Long> ids;
  270. if (Objects.nonNull(user) && Objects.nonNull(user.getDeptId())) {
  271. Long deptId = user.getDeptId();
  272. List<SysDept> depts = sysDeptData.findByDeptId(deptId);
  273. ids = StreamUtils.toList(depts, SysDept::getId);
  274. ids.add(deptId);
  275. } else {
  276. ids = null;
  277. }
  278. return PredicateBuilder.instance()
  279. .and(ObjectUtil.isNotNull(user.getId()), () -> tbSysUser.id.eq(user.getId()))
  280. .and(StringUtils.isNotEmpty(user.getUserName()), () -> tbSysUser.userName.like("%" + user.getUserName() + "%"))
  281. .and(StringUtils.isNotEmpty(user.getStatus()), () -> tbSysUser.status.eq(user.getStatus()))
  282. .and(StringUtils.isNotEmpty(user.getPhonenumber()), () -> tbSysUser.phonenumber.like("%" + user.getPhonenumber() + "%"))
  283. .and(StringUtils.isNotEmpty(user.getTenantId()),()->tbSysUser.tenantId.eq(user.getTenantId()))
  284. .and(ObjectUtil.isNotEmpty(ids), () -> tbSysUser.deptId.in(ids)).build();
  285. }
  286. }