BaseServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. package com.poyee.base.service.impl;
  2. import com.baomidou.mybatisplus.annotation.TableField;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  5. import com.poyee.base.dto.UserInfo;
  6. import com.poyee.common.exception.AuthException;
  7. import com.poyee.annotation.MpjWapper;
  8. import com.poyee.base.dto.BaseDto;
  9. import com.poyee.base.dto.BaseReq;
  10. import com.poyee.base.mapper.IBaseMapper;
  11. import com.poyee.base.service.BaseService;
  12. import com.poyee.framework.domain.MpjWrapper;
  13. import com.poyee.common.exception.ServiceException;
  14. import com.poyee.i18n.I18nUtils;
  15. import com.poyee.redis.util.RedisUtils;
  16. import com.poyee.util.DateUtils;
  17. import com.poyee.util.ObjectUtil;
  18. import com.poyee.util.ServletUtils;
  19. import org.apache.commons.lang.StringUtils;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.transaction.annotation.Transactional;
  23. import java.lang.reflect.Field;
  24. import java.util.*;
  25. import static com.poyee.i18n.I18nMessageEnums.*;
  26. /**
  27. * @param <E>
  28. * @param <R>
  29. * @param <D>
  30. */
  31. @Service
  32. public abstract class BaseServiceImpl<E extends IBaseMapper<D>, R extends BaseReq, D extends BaseDto> extends ServiceImpl<E, D> implements BaseService<R, D> {
  33. @Autowired
  34. protected RedisUtils redisUtils;
  35. /**
  36. * 获取当前用户ID
  37. * @return
  38. */
  39. public Long getUserId(){
  40. UserInfo userInfo = ServletUtils.getUserInfo();
  41. return StringUtils.isNotBlank(userInfo.getUserId())?Long.parseLong(userInfo.getUserId()): Long.valueOf(userInfo.getId());
  42. }
  43. /**
  44. * 获取当前用户ID
  45. * @return
  46. */
  47. public String getLoginName(){
  48. try {
  49. UserInfo userInfo = ServletUtils.getUserInfo();
  50. return StringUtils.isNotBlank(userInfo.getDisplayName()) ? userInfo.getDisplayName() : userInfo.getUserId();
  51. }catch (Exception e) {
  52. log.error("获取用户信息失败",e);
  53. // throw new AuthException(I18nUtils.get(GET_USER_INFO_ERROR));
  54. }
  55. return "游客";
  56. }
  57. /**
  58. * 检查用户权限
  59. * @param p
  60. * @param <P>
  61. */
  62. public <P extends BaseReq> void checkAndSetUserId(P p){
  63. try {
  64. UserInfo userInfo = ServletUtils.getUserInfo();
  65. //解析 p 中的user_id
  66. if (Objects.nonNull(p)) {
  67. Field userId = p.getClass().getDeclaredField("userId");
  68. if (Objects.nonNull(userId)) {
  69. userId.setAccessible(true);
  70. String typeName = userId.getType().getName();
  71. if(Objects.equals("java.lang.Long",typeName)){
  72. userId.set(p, Long.valueOf(userInfo.getId()));
  73. }else if(Objects.equals("java.lang.Integer",typeName)){
  74. userId.set(p, userInfo.getId());
  75. }
  76. }
  77. }
  78. } catch (NoSuchFieldException ne) {
  79. log.error("请求参数中无userId",ne);
  80. throw new AuthException(402, I18nUtils.get(NO_PERMISSION, "【需指定用户】") );
  81. } catch (Exception e) {
  82. log.error("获取用户信息失败",e);
  83. throw new AuthException(I18nUtils.get(GET_USER_INFO_ERROR));
  84. }
  85. }
  86. /**
  87. * 检查商户权限
  88. * @param p
  89. * @param <P>
  90. */
  91. public <P extends BaseReq> void checkAndSetMerchantId(P p){
  92. try {
  93. if(p.isDoRedis()){
  94. log.debug(DateUtils.dateTime()+" 定时任务【"+p.getServiceMethodName()+"】缓存");
  95. return ;
  96. }
  97. UserInfo userInfo = ServletUtils.getUserInfo();
  98. if(userInfo.isMerchant()) {
  99. //解析 p 中的user_id
  100. if (Objects.nonNull(p)) {
  101. Field merchantId = p.getClass().getDeclaredField("merchantId");
  102. if (Objects.nonNull(merchantId)) {
  103. merchantId.setAccessible(true);
  104. String typeName = merchantId.getType().getName();
  105. if (Objects.equals("java.lang.Long", typeName)) {
  106. merchantId.set(p, Long.valueOf(userInfo.getMerchantId()));
  107. } else if (Objects.equals("java.lang.Integer", typeName)) {
  108. merchantId.set(p, userInfo.getMerchantId());
  109. }
  110. }
  111. }
  112. }
  113. } catch (NoSuchFieldException ne) {
  114. log.error("请求参数中无userId",ne);
  115. throw new AuthException(402, I18nUtils.get(NO_PERMISSION,"【权限不足】"));
  116. } catch (Exception e) {
  117. log.error("获取用户信息失败",e);
  118. throw new AuthException(I18nUtils.get(GET_USER_INFO_ERROR));
  119. }
  120. }
  121. /**
  122. * 检查商户权限
  123. * @param p
  124. * @param <P>
  125. */
  126. public <P extends BaseReq> void checkAndPutMerchantId(P p){
  127. try {
  128. UserInfo userInfo = ServletUtils.getUserInfo();
  129. if(userInfo.isMerchant()) {
  130. //解析 p 中的merchantId
  131. if (Objects.nonNull(p)) {
  132. Field merchantId = p.getClass().getDeclaredField("merchantId");
  133. if (Objects.nonNull(merchantId)) {
  134. merchantId.setAccessible(true);
  135. String typeName = merchantId.getType().getName();
  136. if (Objects.equals("java.lang.Long", typeName)) {
  137. merchantId.set(p, Long.valueOf(userInfo.getMerchantId()));
  138. } else if (Objects.equals("java.lang.Integer", typeName)) {
  139. merchantId.set(p, userInfo.getMerchantId());
  140. }
  141. }
  142. }
  143. }
  144. } catch (NoSuchFieldException | IllegalAccessException ne) {
  145. log.error("请求参数中无merchantId",ne);
  146. throw new AuthException(402, I18nUtils.get(NO_PERMISSION, "【权限不足】"));
  147. } catch (AuthException e) {
  148. log.error("获取用户信息失败",e);
  149. }
  150. }
  151. /**
  152. * 获取请求用户的信息
  153. *
  154. * @return
  155. */
  156. @Transactional
  157. @Override
  158. public UserInfo getUserInfo() {
  159. return ServletUtils.getUserInfo();
  160. }
  161. /**
  162. * @param req
  163. * @return
  164. */
  165. public MPJLambdaWrapper<D> mpjWrapper(Object req) {
  166. return mpjWrapper(new MPJLambdaWrapper<>(),req,"t");
  167. }
  168. /**
  169. * @param req
  170. * @return
  171. */
  172. public MPJLambdaWrapper<D> mpjWrapper(MPJLambdaWrapper<D> mpjLambdaWrapper,Object req,String alias) {
  173. try {
  174. if (null != req) {
  175. Field[] declaredFields = req.getClass().getDeclaredFields();
  176. Map<String, MpjWrapper> mpjWapperMap = new HashMap<>();
  177. for (Field field : declaredFields) {
  178. field.setAccessible(true);
  179. String name = field.getName();
  180. //判断是否有注解 MpjWapper
  181. MpjWapper mpjWapper = field.getAnnotation(MpjWapper.class);
  182. if (Objects.nonNull(mpjWapper)) {
  183. if (Objects.nonNull(mpjWapper.value()) ) {
  184. MpjWrapper mpjWrapper = Optional.ofNullable(mpjWapperMap.get(mpjWapper.value()))
  185. .orElse(new MpjWrapper());
  186. if(Objects.nonNull(field.get(req))) {
  187. mpjWrapper = mpjWrapper.builder(mpjWapper,alias, field.get(req));
  188. mpjWapperMap.put(mpjWapper.value(), mpjWrapper);
  189. }
  190. }
  191. }
  192. //判断非使用属性
  193. TableField tableField = field.getAnnotation(TableField.class);
  194. if (Objects.isNull(tableField) || ( !Objects.isNull(tableField) && !tableField.exist()) ) {
  195. continue;
  196. }
  197. Object value = field.get(req);
  198. if(Objects.isNull(value)){
  199. continue;
  200. }
  201. String column = alias+"."+ (Objects.isNull(tableField) ? ObjectUtil.toUnderScoreCase(name) : tableField.value());
  202. if (Objects.equals("java.lang.String",field.getType().getName())
  203. && StringUtils.isNotBlank((String) value)) {
  204. mpjLambdaWrapper = mpjLambdaWrapper.like(column, value);
  205. } else if ( Objects.equals("java.lang.Integer",field.getType() .getName())
  206. || Objects.equals("java.lang.Long",field.getType() .getName())
  207. ) {
  208. mpjLambdaWrapper = mpjLambdaWrapper.eq(column, value);
  209. }
  210. }
  211. if( mpjWapperMap.size() > 0){
  212. //处理 非空条件
  213. MPJLambdaWrapper<D> finalMpjLambdaWrapper = mpjLambdaWrapper;
  214. mpjWapperMap.forEach((key, value) -> checkMpjWrapper(finalMpjLambdaWrapper, value));
  215. }
  216. }
  217. }catch (Exception ex ){
  218. ex.printStackTrace();
  219. }
  220. return mpjLambdaWrapper;
  221. }
  222. /**
  223. * @param mpjWrapper
  224. * @param wrapper
  225. */
  226. private void checkMpjWrapper(MPJLambdaWrapper<D> mpjWrapper ,MpjWrapper wrapper ){
  227. try {
  228. MpjWapper field = wrapper.getField();
  229. String alias = wrapper.getAlias();
  230. String value =(StringUtils.isNotBlank(alias)?alias+".":"")+ field.value();
  231. String data = wrapper.getData();
  232. if(StringUtils.isBlank(data) || data.replaceAll(",","").length() == 0){
  233. return ;
  234. }
  235. switch (field.operator()) {
  236. case EQ:
  237. Object eqVal = checkColumnType(wrapper, data);
  238. mpjWrapper = mpjWrapper.eq(value, eqVal);
  239. break;
  240. case NE:
  241. Object neVal = checkColumnType(wrapper, data);
  242. mpjWrapper = mpjWrapper.ne(value, neVal);
  243. break;
  244. case BETWEEN:
  245. String[] split = data.split(",");
  246. if (split.length != 2) {
  247. throw new ServiceException("参数错误");
  248. }
  249. Object val1 = checkColumnType(wrapper, split[0]);
  250. Object val2 = checkColumnType(wrapper, split[1]);
  251. mpjWrapper = mpjWrapper.between(value, val1, val2);
  252. break;
  253. }
  254. }catch (Exception ex){
  255. throw new ServiceException("参数错误");
  256. }
  257. }
  258. /**
  259. * @param wrapper
  260. * @param data
  261. * @return
  262. */
  263. private Object checkColumnType(MpjWrapper wrapper ,Object data){
  264. Object obj = data;
  265. boolean isSame = data.getClass().getName().contains(wrapper.getField().columnType().name());
  266. if(isSame){
  267. return obj;
  268. }
  269. switch (wrapper.getField().columnType()) {
  270. case STRING:
  271. obj = data.toString();
  272. break;
  273. case NUMBER:
  274. obj = Double.parseDouble(data.toString());
  275. break;
  276. case DATE:
  277. obj = DateUtils.parseDate(data.toString());
  278. break;
  279. case BOOLEAN:
  280. obj = Boolean.parseBoolean(data.toString());
  281. break;
  282. }
  283. return obj;
  284. }
  285. }