From e11f3db8f9bc5a1f73641fab210d5d167e47293e Mon Sep 17 00:00:00 2001 From: Burce Date: Tue, 28 Apr 2020 22:08:06 +0800 Subject: [PATCH 01/33] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=E6=A0=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/iformall/controller/WxCampaignController.java | 1 + .../src/main/java/com/iformall/controller/WxMallController.java | 1 + .../main/java/com/iformall/controller/WxQuestionController.java | 1 + .../com/iformall/service/impl/WxCouponChannelServiceImpl.java | 1 + 4 files changed, 4 insertions(+) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCampaignController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCampaignController.java index afc5dd872..5e32285b8 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCampaignController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCampaignController.java @@ -49,6 +49,7 @@ public class WxCampaignController extends BaseController { wxCampaign.setStatus(EnumCampaignStatus.STATUS_THROW_IN.getCode()); wxCampaign.updateTenantInfo(getTenantInfo()); wxCampaign.setSortColumns(BaseEntity.SortField.SortNum_ASC, BaseEntity.SortField.CreateTime_ASC); + // TODO 缓存优化 final PageInfo page = wxCampaignService.clistAsPage(wxCampaign, pageNum, pageSize); return new ResultData(page); } diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java index 25b0f0eeb..e203ad210 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java @@ -85,6 +85,7 @@ public class WxMallController extends BaseController { @ApiOperation("商场信息") @GetMapping("/mallInfo") public ResultData getMallInfo() { + //TODO 缓存优化 WxMall mall = wxMallService.getByTenantId(getTenantId()); if (mall == null) { return new ResultData(ErrorCode.MALL_INFO_NOT_FOUND); diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java index 21e94cfb1..6aacdcf85 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java @@ -51,6 +51,7 @@ public class WxQuestionController extends BaseController { }catch (Exception e) { return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); } + // TODO 缓存优化 wxQuestionConfig.setCouponTypeList(ct.toString()); List listConfig = wxQuestionService.findConfigList(wxQuestionConfig); if (listConfig.size() > 0) { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponChannelServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponChannelServiceImpl.java index 59bf9fe87..cb3b79c18 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponChannelServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponChannelServiceImpl.java @@ -177,6 +177,7 @@ public class WxCouponChannelServiceImpl implements WxCouponChannelService { couponId = record.getCouponId(); record.setCouponId(null); } + // TODO 缓存优化 List voList = wxCouponChannelMapper.findVoList(record); if (voList.isEmpty()) { return new ResultData(Result.SUCCESS, "查询成功", null); From 9845af7022fc9fb1463f6d16f21cd1b03110226a Mon Sep 17 00:00:00 2001 From: bruce Date: Thu, 30 Apr 2020 18:58:55 +0800 Subject: [PATCH 02/33] =?UTF-8?q?[=E4=BC=98=E5=8C=96]C=20/getQuestion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/iformall/config/RedisConfig.java | 35 +++++++++++++ .../controller/WxQuestionController.java | 52 ++++++++++++++++--- 2 files changed, 80 insertions(+), 7 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java b/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java index 54f945030..81e2d5a7f 100644 --- a/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java @@ -21,6 +21,7 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -174,4 +175,38 @@ public class RedisConfig extends CachingConfigurerSupport { template.setConnectionFactory(connectionFactory); return template; } + + @Bean("questionRedisTemplate") + public RedisTemplate> getQuestionRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate> template = new RedisTemplate<>(); + + Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer<>(WxQuestion.class); + // value值的序列化 + template.setValueSerializer(j); + template.setHashKeySerializer(j); + + // key的序列化 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + template.setConnectionFactory(connectionFactory); + return template; + } + + @Bean("questionConfigRedisTemplate") + public RedisTemplate> getQuestionConfigRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate> template = new RedisTemplate<>(); + + Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer<>(WxQuestionConfig.class); + // value值的序列化 + template.setValueSerializer(j); + template.setHashKeySerializer(j); + + // key的序列化 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + template.setConnectionFactory(connectionFactory); + return template; + } } diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java index 6aacdcf85..3216444b5 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java @@ -1,12 +1,14 @@ package com.iformall.controller; import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.PageInfo; import com.iformall.common.ErrorCode; import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.domain.po.WxQuestion; import com.iformall.domain.po.WxQuestionConfig; import com.iformall.domain.po.WxQuestionLog; +import com.iformall.domain.vo.WxCouponChannelVo; import com.iformall.enums.EnumQuestionConfigStatus; import com.iformall.service.WxCUserBasicInfoService; import com.iformall.service.WxCUserTagsService; @@ -14,16 +16,22 @@ import com.iformall.service.WxQuestionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import net.sf.saxon.trans.Err; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.configurationprocessor.json.JSONArray; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; +import java.util.concurrent.TimeUnit; @RestController @RequestMapping("/api/wxQuestion") @@ -40,9 +48,18 @@ public class WxQuestionController extends BaseController { @Autowired private WxCUserBasicInfoService wxCUserBasicInfoService; + @Autowired + @Qualifier("questionRedisTemplate") + private RedisTemplate> questionRedisTemplate ; + + @Autowired + @Qualifier("questionConfigRedisTemplate") + private RedisTemplate> questionConfigRedisTemplate ; + @ApiOperation("查寻问券") @GetMapping("getQuestion") public Result getQuestion(@RequestParam("couponType") String couponType) { + List listConfig = null ; WxQuestionConfig wxQuestionConfig = new WxQuestionConfig(); wxQuestionConfig.updateTenantInfo(getTenantInfo()); JSONArray ct = new JSONArray(); @@ -51,18 +68,39 @@ public class WxQuestionController extends BaseController { }catch (Exception e) { return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); } - // TODO 缓存优化 - wxQuestionConfig.setCouponTypeList(ct.toString()); - List listConfig = wxQuestionService.findConfigList(wxQuestionConfig); + + ValueOperations> operations = questionConfigRedisTemplate.opsForValue(); + String keyConfig = StringUtils.join(getTenantInfo().getTenantId(),":","questionConfig",":","getQuestion",":",couponType); + boolean hasKey1 = questionConfigRedisTemplate.hasKey(keyConfig+ couponType); + if (hasKey1) { + listConfig = operations.get(keyConfig+ couponType) ; + } else { + wxQuestionConfig.setCouponTypeList(ct.toString()); + listConfig = wxQuestionService.findConfigList(wxQuestionConfig); + if(!CollectionUtils.isEmpty(listConfig)) { + operations.set(keyConfig+ couponType,listConfig,24, TimeUnit.HOURS); + } + } + if (listConfig.size() > 0) { wxQuestionConfig = listConfig.get(0); List questionIds = JSONObject.parseArray(wxQuestionConfig.getQuestionList(), Long.class); if (wxQuestionConfig.getStatus().equals(EnumQuestionConfigStatus.ON.getCode()) && questionIds.size() > 0) { - WxQuestion wxQuestion = new WxQuestion(); - wxQuestion.updateTenantInfo(getTenantInfo()); - wxQuestion.setIds(questionIds); - List listQuestion = wxQuestionService.findList(wxQuestion); + List listQuestion = null ; + + ValueOperations> questionOperations = questionRedisTemplate.opsForValue(); + String key = StringUtils.join(getTenantInfo().getTenantId(),":","question",":","getQuestion",":",couponType); + boolean hasKey2 = questionRedisTemplate.hasKey(key+ couponType); + if (hasKey2) { + listQuestion = questionOperations.get(key+ couponType) ; + } else { + WxQuestion wxQuestion = new WxQuestion(); + wxQuestion.updateTenantInfo(getTenantInfo()); + wxQuestion.setIds(questionIds); + listQuestion = wxQuestionService.findList(wxQuestion); + } + if (listQuestion.size() > 0) { Iterator q = listQuestion.iterator(); WxQuestionLog wxQuestionLog = new WxQuestionLog(); From 1fce7febe783d047712832b2cc1c0121f15b3acb Mon Sep 17 00:00:00 2001 From: Burce Date: Sat, 2 May 2020 08:25:40 +0800 Subject: [PATCH 03/33] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=E7=BB=9F=E4=B8=80AOP?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/iformall/config/RedisConfig.java | 35 ------------- .../controller/WxQuestionController.java | 51 +++---------------- 2 files changed, 6 insertions(+), 80 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java b/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java index 81e2d5a7f..54f945030 100644 --- a/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java @@ -21,7 +21,6 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -175,38 +174,4 @@ public class RedisConfig extends CachingConfigurerSupport { template.setConnectionFactory(connectionFactory); return template; } - - @Bean("questionRedisTemplate") - public RedisTemplate> getQuestionRedisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate> template = new RedisTemplate<>(); - - Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer<>(WxQuestion.class); - // value值的序列化 - template.setValueSerializer(j); - template.setHashKeySerializer(j); - - // key的序列化 - template.setKeySerializer(new StringRedisSerializer()); - template.setHashKeySerializer(new StringRedisSerializer()); - - template.setConnectionFactory(connectionFactory); - return template; - } - - @Bean("questionConfigRedisTemplate") - public RedisTemplate> getQuestionConfigRedisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate> template = new RedisTemplate<>(); - - Jackson2JsonRedisSerializer j = new Jackson2JsonRedisSerializer<>(WxQuestionConfig.class); - // value值的序列化 - template.setValueSerializer(j); - template.setHashKeySerializer(j); - - // key的序列化 - template.setKeySerializer(new StringRedisSerializer()); - template.setHashKeySerializer(new StringRedisSerializer()); - - template.setConnectionFactory(connectionFactory); - return template; - } } diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java index 3216444b5..21e94cfb1 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxQuestionController.java @@ -1,14 +1,12 @@ package com.iformall.controller; import com.alibaba.fastjson.JSONObject; -import com.github.pagehelper.PageInfo; import com.iformall.common.ErrorCode; import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.domain.po.WxQuestion; import com.iformall.domain.po.WxQuestionConfig; import com.iformall.domain.po.WxQuestionLog; -import com.iformall.domain.vo.WxCouponChannelVo; import com.iformall.enums.EnumQuestionConfigStatus; import com.iformall.service.WxCUserBasicInfoService; import com.iformall.service.WxCUserTagsService; @@ -16,22 +14,16 @@ import com.iformall.service.WxQuestionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import net.sf.saxon.trans.Err; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.configurationprocessor.json.JSONArray; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; -import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; -import java.util.concurrent.TimeUnit; @RestController @RequestMapping("/api/wxQuestion") @@ -48,18 +40,9 @@ public class WxQuestionController extends BaseController { @Autowired private WxCUserBasicInfoService wxCUserBasicInfoService; - @Autowired - @Qualifier("questionRedisTemplate") - private RedisTemplate> questionRedisTemplate ; - - @Autowired - @Qualifier("questionConfigRedisTemplate") - private RedisTemplate> questionConfigRedisTemplate ; - @ApiOperation("查寻问券") @GetMapping("getQuestion") public Result getQuestion(@RequestParam("couponType") String couponType) { - List listConfig = null ; WxQuestionConfig wxQuestionConfig = new WxQuestionConfig(); wxQuestionConfig.updateTenantInfo(getTenantInfo()); JSONArray ct = new JSONArray(); @@ -68,39 +51,17 @@ public class WxQuestionController extends BaseController { }catch (Exception e) { return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); } - - ValueOperations> operations = questionConfigRedisTemplate.opsForValue(); - String keyConfig = StringUtils.join(getTenantInfo().getTenantId(),":","questionConfig",":","getQuestion",":",couponType); - boolean hasKey1 = questionConfigRedisTemplate.hasKey(keyConfig+ couponType); - if (hasKey1) { - listConfig = operations.get(keyConfig+ couponType) ; - } else { - wxQuestionConfig.setCouponTypeList(ct.toString()); - listConfig = wxQuestionService.findConfigList(wxQuestionConfig); - if(!CollectionUtils.isEmpty(listConfig)) { - operations.set(keyConfig+ couponType,listConfig,24, TimeUnit.HOURS); - } - } - + wxQuestionConfig.setCouponTypeList(ct.toString()); + List listConfig = wxQuestionService.findConfigList(wxQuestionConfig); if (listConfig.size() > 0) { wxQuestionConfig = listConfig.get(0); List questionIds = JSONObject.parseArray(wxQuestionConfig.getQuestionList(), Long.class); if (wxQuestionConfig.getStatus().equals(EnumQuestionConfigStatus.ON.getCode()) && questionIds.size() > 0) { - List listQuestion = null ; - - ValueOperations> questionOperations = questionRedisTemplate.opsForValue(); - String key = StringUtils.join(getTenantInfo().getTenantId(),":","question",":","getQuestion",":",couponType); - boolean hasKey2 = questionRedisTemplate.hasKey(key+ couponType); - if (hasKey2) { - listQuestion = questionOperations.get(key+ couponType) ; - } else { - WxQuestion wxQuestion = new WxQuestion(); - wxQuestion.updateTenantInfo(getTenantInfo()); - wxQuestion.setIds(questionIds); - listQuestion = wxQuestionService.findList(wxQuestion); - } - + WxQuestion wxQuestion = new WxQuestion(); + wxQuestion.updateTenantInfo(getTenantInfo()); + wxQuestion.setIds(questionIds); + List listQuestion = wxQuestionService.findList(wxQuestion); if (listQuestion.size() > 0) { Iterator q = listQuestion.iterator(); WxQuestionLog wxQuestionLog = new WxQuestionLog(); From 11ea0140048d90a22e17c83d60399cffac2905a1 Mon Sep 17 00:00:00 2001 From: Burce Date: Sun, 3 May 2020 20:07:17 +0800 Subject: [PATCH 04/33] =?UTF-8?q?[=E4=BC=98=E5=8C=96]AOP=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iformall/log/TableOperateAspect.java | 2 +- .../com/iformall/annotation/RedisCache.java | 53 +++++++ .../com/iformall/aop/RedisCacheAspect.java | 140 ++++++++++++++++++ .../java/com/iformall/config/RedisConfig.java | 10 ++ .../com/iformall/annotation/RedisCache.java | 53 +++++++ .../com/iformall/aop/RedisCacheAspect.java | 139 +++++++++++++++++ .../java/com/iformall/config/RedisConfig.java | 11 ++ .../iformall/controller/WxMallController.java | 4 +- .../java/com/iformall/utils/RedisLock.java | 31 ++++ 9 files changed, 440 insertions(+), 3 deletions(-) create mode 100644 mallinkBApi/src/main/java/com/iformall/annotation/RedisCache.java create mode 100644 mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java create mode 100644 mallinkCApi/src/main/java/com/iformall/annotation/RedisCache.java create mode 100644 mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java diff --git a/mallinkAdmin/src/main/java/com/iformall/log/TableOperateAspect.java b/mallinkAdmin/src/main/java/com/iformall/log/TableOperateAspect.java index d65be0d47..3dee1b300 100644 --- a/mallinkAdmin/src/main/java/com/iformall/log/TableOperateAspect.java +++ b/mallinkAdmin/src/main/java/com/iformall/log/TableOperateAspect.java @@ -3,6 +3,7 @@ package com.iformall.log; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.common.collect.Lists; import com.google.common.collect.MapDifference; import com.google.common.collect.Maps; import com.iformall.common.LogColumn; @@ -17,7 +18,6 @@ import com.iformall.service.invest.impl.InvestBaseServiceImpl; import com.iformall.utils.SpringContextUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.reflect.FieldUtils; import org.aspectj.lang.ProceedingJoinPoint; diff --git a/mallinkBApi/src/main/java/com/iformall/annotation/RedisCache.java b/mallinkBApi/src/main/java/com/iformall/annotation/RedisCache.java new file mode 100644 index 000000000..7f35a8288 --- /dev/null +++ b/mallinkBApi/src/main/java/com/iformall/annotation/RedisCache.java @@ -0,0 +1,53 @@ +package com.iformall.annotation; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + + +/** + * /api/user/detail + * /api/couponOrder/getUnverifiedAmountOnDate + * /api/micropay/getMicroPayAmountOnDate + * /api/couponOrder/getVerifiedAmountOnDate + * /api/wxDateAmountRecord/listMicropay + * /api/wxDateAmountRecord/listVerified + * /api/wxDateAmountRecord/listOrder + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface RedisCache { + + /** + * 缓存key的名称 + * @return + */ + String key() default ""; + + /** + * 自动生成key + * @return + */ + boolean autoKey() default true; + + /** + * 参数md5,解决key过长问题 + * @return + */ + boolean md5() default true ; + + /** + * key 过期日期默认300秒 + * @return + */ + int expireTime() default 300; + + /** + * 时间单位默认为秒 + * @return + */ + TimeUnit dateUnit() default TimeUnit.SECONDS; +} diff --git a/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java b/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java new file mode 100644 index 000000000..de3212d83 --- /dev/null +++ b/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java @@ -0,0 +1,140 @@ +package com.iformall.aop; + + +import com.alibaba.fastjson.JSONObject; +import com.iformall.annotation.RedisCache; +import com.iformall.domain.po.WxCUser; +import com.iformall.service.WxCUserTokenService; +import com.iformall.utils.HashUtil; +import com.iformall.utils.RedisLock; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; + +@Slf4j +@Aspect +@Component +public class RedisCacheAspect { + + /** + * 参数分隔符 param1|param2|param3 + **/ + private static final String DELIMITER_PARAMS = "|"; + + /** + * key 分隔符 + */ + private static final String DELIMITER_KEY = ":"; + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Autowired + RedisLock redisLock; + + @Autowired + private WxCUserTokenService userTokenService; + + @Pointcut("@annotation(com.iformall.annotation.RedisCache)") + public void cacheAspect() { + } + + @Around("cacheAspect()") + public Object round(ProceedingJoinPoint jp, RedisCache cache) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + // 查询token信息 + //从header中获取token + String token = request.getHeader("token"); + //如果header中不存在token,则从参数中获取token + if (StringUtils.isBlank(token)) { + token = request.getParameter("token"); + } + String tenantId; + WxCUser wxCUser = userTokenService.getByToken(token); + if (wxCUser == null || wxCUser.getExpireTime().getTime() < System.currentTimeMillis()) { + tenantId = "0"; + } else { + tenantId = wxCUser.getTenantId(); + } + + // 请求参数 + Object[] args = jp.getArgs(); + + // 接口 返回结果 + Object result; + + String redisKey; + if (cache.autoKey()) { + // 构建 redisKey => reqPath:tenantId:md5(param1_param2_param3) + String requestUrl = request.getRequestURI(); + // 接口路径 reqPath => /api/xxx + String reqPath = requestUrl.substring(requestUrl.indexOf("/api/")); + if (cache.md5()) { + redisKey = StringUtils.join(reqPath, DELIMITER_KEY, tenantId, DELIMITER_KEY, HashUtil.md5(StringUtils.join(args, DELIMITER_PARAMS))); + } else { + redisKey = StringUtils.join(reqPath, DELIMITER_KEY, tenantId, DELIMITER_KEY, StringUtils.join(args, DELIMITER_PARAMS)); + } + } else { + redisKey = cache.key(); + } + + // redisKey 不存在,获取接口数据并返回 + if (StringUtils.isBlank(redisKey)) { + result = proceed(jp, args, null); + } else { + ValueOperations valueOperations = stringRedisTemplate.opsForValue(); + String value = valueOperations.get(redisKey); + if (value == null) { + result = proceed(jp, args, StringUtils.join(redisKey, ":", "lock")); + String json_data = JSONObject.toJSONString(result); + valueOperations.set(redisKey, json_data, cache.expireTime(), cache.dateUnit()); + log.debug("CacheAspect 缓存不存在,获取接口数据并放入缓存,key:{}, expire:{}", redisKey, cache.expireTime()); + } else { + Class returnType = ((MethodSignature) jp.getSignature()).getReturnType(); + result = JSONObject.parseObject(value, returnType); + log.debug("CacheAspect 缓存存在,解析缓存并返回,key:{}", redisKey); + } + } + return result; + } + + private Object proceed(ProceedingJoinPoint jp, Object[] args, String lockKey) { + // 超时1秒 + long time = System.currentTimeMillis() + 1000; + String timeStr = String.valueOf(time); + try { + //分布式锁,保证一个线程读DB,其它线程排队 + if (StringUtils.isBlank(lockKey)) { + //log.debug("CacheAspect 读库并返回,无锁"); + return jp.proceed(args); + } else if (redisLock.lock2(lockKey, timeStr)) { + log.debug("CacheAspect 读库中, key:{}: " + lockKey); + return jp.proceed(args); + } else { + // TODO 挂起,重试 + log.debug("CacheAspect 排队中, key:{}: " + lockKey); + } + } catch (Throwable throwable) { + log.error("CacheAspect proceed error , Illegal argument: {} in {}.{}()", Arrays.toString(jp.getArgs()), + jp.getSignature().getDeclaringTypeName(), jp.getSignature().getName(), throwable); + } finally { + redisLock.unlock(lockKey, timeStr); + } + return null; + } + +} diff --git a/mallinkBApi/src/main/java/com/iformall/config/RedisConfig.java b/mallinkBApi/src/main/java/com/iformall/config/RedisConfig.java index 857f38ec2..ce8351901 100644 --- a/mallinkBApi/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkBApi/src/main/java/com/iformall/config/RedisConfig.java @@ -16,6 +16,8 @@ import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @@ -172,4 +174,12 @@ public class RedisConfig extends CachingConfigurerSupport { template.setConnectionFactory(connectionFactory); return template; } + + @Bean("stringValueOperations") + public ValueOperations getStringValueOperations(RedisConnectionFactory connectionFactory) { + StringRedisTemplate template = new StringRedisTemplate(); + template.setConnectionFactory(connectionFactory); + template.afterPropertiesSet(); + return template.opsForValue(); + } } diff --git a/mallinkCApi/src/main/java/com/iformall/annotation/RedisCache.java b/mallinkCApi/src/main/java/com/iformall/annotation/RedisCache.java new file mode 100644 index 000000000..da8512502 --- /dev/null +++ b/mallinkCApi/src/main/java/com/iformall/annotation/RedisCache.java @@ -0,0 +1,53 @@ +package com.iformall.annotation; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + + +/** + * - /api/wxCouponChannel/change + * - /api/user/userinfo + * - /api/wxBusiness/listAll + * - /api/wxCampaign/list + * - /api/mall/mallInfo + * - /api/mall/getAppIcon + * - /api/mall/getWeapNote + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface RedisCache { + + /** + * 缓存key的名称 + * @return + */ + String key() default ""; + + /** + * 自动生成key + * @return + */ + boolean autoKey() default true; + + /** + * 参数md5,解决key过长问题 + * @return + */ + boolean md5() default true ; + + /** + * key 过期日期默认300秒 + * @return + */ + int expireTime() default 300; + + /** + * 时间单位默认为秒 + * @return + */ + TimeUnit dateUnit() default TimeUnit.SECONDS; +} diff --git a/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java b/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java new file mode 100644 index 000000000..fb1935a2f --- /dev/null +++ b/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java @@ -0,0 +1,139 @@ +package com.iformall.aop; + + +import com.alibaba.fastjson.JSONObject; +import com.iformall.annotation.RedisCache; +import com.iformall.domain.po.WxCUser; +import com.iformall.service.WxCUserTokenService; +import com.iformall.utils.HashUtil; +import com.iformall.utils.RedisLock; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; + +@Slf4j +@Aspect +@Component +public class RedisCacheAspect { + + /** + * 参数分隔符 param1|param2|param3 + **/ + private static final String DELIMITER_PARAMS = "|"; + + /** + * key 分隔符 + */ + private static final String DELIMITER_KEY = ":"; + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Autowired + RedisLock redisLock; + + @Autowired + private WxCUserTokenService userTokenService; + + @Pointcut("@annotation(com.iformall.annotation.RedisCache)") + public void cacheAspect() { + } + + @Around("cacheAspect()") + public Object round(ProceedingJoinPoint jp, RedisCache cache) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + // 查询token信息 + //从header中获取token + String token = request.getHeader("token"); + //如果header中不存在token,则从参数中获取token + if (StringUtils.isBlank(token)) { + token = request.getParameter("token"); + } + String tenantId; + WxCUser wxCUser = userTokenService.getByToken(token); + if (wxCUser == null || wxCUser.getExpireTime().getTime() < System.currentTimeMillis()) { + tenantId = "0"; + } else { + tenantId = wxCUser.getTenantId(); + } + + // 请求参数 + Object[] args = jp.getArgs(); + + // 接口 返回结果 + Object result; + + String redisKey; + if (cache.autoKey()) { + // 构建 redisKey => reqPath:tenantId:md5(param1_param2_param3) + String requestUrl = request.getRequestURI(); + // 接口路径 reqPath => /api/xxx + String reqPath = requestUrl.substring(requestUrl.indexOf("/api/")); + if (cache.md5()) { + redisKey = StringUtils.join(reqPath, DELIMITER_KEY, tenantId, DELIMITER_KEY, HashUtil.md5(StringUtils.join(args, DELIMITER_PARAMS))); + } else { + redisKey = StringUtils.join(reqPath, DELIMITER_KEY, tenantId, DELIMITER_KEY, StringUtils.join(args, DELIMITER_PARAMS)); + } + } else { + redisKey = cache.key(); + } + + // redisKey 不存在,获取接口数据并返回 + if (StringUtils.isBlank(redisKey)) { + result = proceed(jp, args, null); + } else { + ValueOperations valueOperations = stringRedisTemplate.opsForValue(); + String value = valueOperations.get(redisKey); + if (value == null) { + result = proceed(jp, args, StringUtils.join(redisKey, ":", "lock")); + String json_data = JSONObject.toJSONString(result); + valueOperations.set(redisKey, json_data, cache.expireTime(), cache.dateUnit()); + log.debug("CacheAspect 缓存不存在,获取接口数据并放入缓存,key:{}, expire:{}", redisKey, cache.expireTime()); + } else { + Class returnType = ((MethodSignature) jp.getSignature()).getReturnType(); + result = JSONObject.parseObject(value, returnType); + log.debug("CacheAspect 缓存存在,解析缓存并返回,key:{}", redisKey); + } + } + return result; + } + + private Object proceed(ProceedingJoinPoint jp, Object[] args, String lockKey) { + // 超时1秒 + long time = System.currentTimeMillis() + 1000; + String timeStr = String.valueOf(time); + try { + //分布式锁,保证一个线程读DB,其它线程排队 + if (StringUtils.isBlank(lockKey)) { + //log.debug("CacheAspect 读库并返回,无锁"); + return jp.proceed(args); + } else if (redisLock.lock2(lockKey, timeStr)) { + log.debug("CacheAspect 读库中, key:{}: " + lockKey); + return jp.proceed(args); + } else { + // TODO 挂起,重试 + log.debug("CacheAspect 排队中, key:{}: " + lockKey); + } + } catch (Throwable throwable) { + log.error("CacheAspect proceed error , Illegal argument: {} in {}.{}()", Arrays.toString(jp.getArgs()), + jp.getSignature().getDeclaringTypeName(), jp.getSignature().getName(), throwable); + } finally { + redisLock.unlock(lockKey, timeStr); + } + return null; + } + +} diff --git a/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java b/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java index 54f945030..8fa423dee 100644 --- a/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java +++ b/mallinkCApi/src/main/java/com/iformall/config/RedisConfig.java @@ -16,6 +16,8 @@ import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @@ -174,4 +176,13 @@ public class RedisConfig extends CachingConfigurerSupport { template.setConnectionFactory(connectionFactory); return template; } + + + @Bean("stringValueOperations") + public ValueOperations getStringValueOperations(RedisConnectionFactory connectionFactory) { + StringRedisTemplate template = new StringRedisTemplate(); + template.setConnectionFactory(connectionFactory); + template.afterPropertiesSet(); + return template.opsForValue(); + } } diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java index e203ad210..4554f8e98 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java @@ -1,6 +1,7 @@ package com.iformall.controller; import com.iformall.annotation.AuthIgnore; +import com.iformall.annotation.RedisCache; import com.iformall.common.ErrorCode; import com.iformall.common.Result; import com.iformall.common.ResultData; @@ -113,7 +114,7 @@ public class WxMallController extends BaseController { return new ResultData(Result.SUCCESS, "查询成功", map); } - + @RedisCache() @AuthIgnore @ApiOperation("获取后端版本号") @GetMapping("/version") @@ -121,5 +122,4 @@ public class WxMallController extends BaseController { return new ResultData(version); } - } diff --git a/mallinkService/src/main/java/com/iformall/utils/RedisLock.java b/mallinkService/src/main/java/com/iformall/utils/RedisLock.java index 67e2f388b..47b18bc17 100644 --- a/mallinkService/src/main/java/com/iformall/utils/RedisLock.java +++ b/mallinkService/src/main/java/com/iformall/utils/RedisLock.java @@ -55,6 +55,37 @@ public class RedisLock { return false; } + /** + * 加锁 ,设置过期时间 + * @param key productId - 商品的唯一标志 + * @param value 当前时间+超时时间 + * @return + */ + public boolean lock2(String key,String value){ + ValueOperations operations = stringRedisTemplate.opsForValue(); + //对应setnx命令,5s过期 + if(operations.setIfAbsent(key,value,5,TimeUnit.SECONDS)){ + //可以成功设置,也就是key不存在 + return true; + } + + //判断锁超时 - 防止原来的操作异常,没有运行解锁操作 防止死锁 + String currentValue = operations.get(key); + //如果锁过期 + if(!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue) < System.currentTimeMillis()){//currentValue不为空且小于当前时间 + //获取上一个锁的时间value + String oldValue =operations.getAndSet(key,value);//对应getset,如果key存在 + + //假设两个线程同时进来,key被占用了。获取的值currentValue=A(get取的旧的值肯定是一样的),两个线程的value都是B,key都是K.锁时间已经过期了。 + //而这里面的getAndSet一次只会一个执行,也就是一个执行之后,上一个的value已经变成了B。只有一个线程获取的上一个值会是A,另一个线程拿到的值是B。 + if(!StringUtils.isEmpty(oldValue) && oldValue.equals(currentValue) ){ + //oldValue不为空且oldValue等于currentValue,也就是校验是不是上个对应的商品时间戳,也是防止并发 + return true; + } + } + return false; + } + /** * 解锁 From 4df41119d7251847b635ea25e4cc3b2a9100d288 Mon Sep 17 00:00:00 2001 From: Burce Date: Sun, 3 May 2020 20:28:09 +0800 Subject: [PATCH 05/33] =?UTF-8?q?[=E4=BC=98=E5=8C=96]AOP=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=AE=A1=E7=90=86=20C=E7=AB=AF=20-=20/C/api/?= =?UTF-8?q?wxCouponChannel/change=20-=20/C/api/user/userinfo=20-=20/C/api/?= =?UTF-8?q?wxBusiness/listAll=20-=20/C/api/wxCampaign/list=20-=20/C/api/ma?= =?UTF-8?q?ll/mallInfo=20-=20/C/api/mall/getAppIcon=20-=20/C/api/mall/getW?= =?UTF-8?q?eapNote=20B=E7=AB=AF=20-=20/B/api/user/detail=20-=20/B/api/coup?= =?UTF-8?q?onOrder/getUnverifiedAmountOnDate=20-=20/B/api/couponOrder/getV?= =?UTF-8?q?erifiedAmountOnDate=20-=20/B/api/micropay/getMicroPayAmountOnDa?= =?UTF-8?q?te=20-=20/B/api/wxDateAmountRecord/listMicropay=20-=20/B/api/wx?= =?UTF-8?q?DateAmountRecord/listVerified=20-=20/B/api/wxDateAmountRecord/l?= =?UTF-8?q?istOrder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iformall/controller/WxCouponOrderController.java | 3 +++ .../iformall/controller/WxDateAmountRecordController.java | 5 ++++- .../com/iformall/controller/WxMerchantBUserController.java | 2 ++ .../java/com/iformall/controller/WxMicroPayController.java | 2 ++ .../java/com/iformall/controller/WxBusinessController.java | 2 ++ .../java/com/iformall/controller/WxCampaignController.java | 3 ++- .../com/iformall/controller/WxCouponChannelController.java | 3 ++- .../main/java/com/iformall/controller/WxMallController.java | 4 +++- .../java/com/iformall/controller/WxUserGrantController.java | 2 ++ 9 files changed, 22 insertions(+), 4 deletions(-) diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java index 423ad596c..76ba76ac5 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java @@ -1,6 +1,7 @@ package com.iformall.controller; import com.github.pagehelper.PageInfo; +import com.iformall.annotation.RedisCache; import com.iformall.common.ErrorCode; import com.iformall.common.Result; import com.iformall.common.ResultData; @@ -86,6 +87,7 @@ public class WxCouponOrderController extends BaseController { } + @RedisCache @ApiOperation("某日期交易总流水") @GetMapping("getUnverifiedAmountOnDate") @ApiImplicitParams({ @@ -94,6 +96,7 @@ public class WxCouponOrderController extends BaseController { return wxCouponOrderService.listOnDateAsPage(getUser().getId(), date, null, null, false); } + @RedisCache @ApiOperation("某日期核销总流水") @GetMapping("getVerifiedAmountOnDate") @ApiImplicitParams({ diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxDateAmountRecordController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxDateAmountRecordController.java index 80f9ffc7e..01a74f0eb 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxDateAmountRecordController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxDateAmountRecordController.java @@ -1,6 +1,7 @@ package com.iformall.controller; import com.github.pagehelper.PageInfo; +import com.iformall.annotation.RedisCache; import com.iformall.common.ResultData; import com.iformall.domain.po.base.BaseEntity; import com.iformall.domain.po.WxDateAmountRecord; @@ -31,19 +32,21 @@ public class WxDateAmountRecordController extends BaseController { @Autowired private WxDateAmountRecordService wxDateAmountRecordService; - + @RedisCache(expireTime = 120) @ApiOperation("首页查询交易金额记录接口") @GetMapping("listOrder") public ResultData listOrder() { return list(EnumDateAmtType.PAY_RECORD.getCode()); } + @RedisCache(expireTime = 120) @ApiOperation("首页查询核销金额记录接口") @GetMapping("listVerified") public ResultData listVerified() { return list(EnumDateAmtType.VERIFY_RECORD.getCode()); } + @RedisCache(expireTime = 120) @ApiOperation("首页查询刷卡金额记录接口") @GetMapping("listMicropay") public ResultData listMicropay() { diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxMerchantBUserController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxMerchantBUserController.java index 47a356477..a989e452e 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxMerchantBUserController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxMerchantBUserController.java @@ -2,6 +2,7 @@ package com.iformall.controller; import com.iformall.annotation.AuthIgnore; +import com.iformall.annotation.RedisCache; import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; import com.iformall.domain.po.WxMall; @@ -55,6 +56,7 @@ public class WxMerchantBUserController extends BaseController { @Autowired private WxScoreRulesService wxScoreRulesService; + @RedisCache @ApiOperation("查寻当bUser详情接口") @GetMapping("/detail") public ResultData detail() { diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java index d2dcd8236..14476ff59 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java @@ -2,6 +2,7 @@ package com.iformall.controller; import com.alibaba.fastjson.JSONArray; +import com.iformall.annotation.RedisCache; import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; import com.iformall.domain.po.*; @@ -235,6 +236,7 @@ public class WxMicroPayController extends BaseController { return wxOrderService.microPayListOnDateAsPage(getUser().getId(), EnumOrderType.MICROPAY.getCode(), date, pageNum, pageSize); } + @RedisCache @ApiOperation("付款码支付某日期交易总流水") @GetMapping("getMicroPayAmountOnDate") @ApiImplicitParams({ diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxBusinessController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxBusinessController.java index d82b02018..aae158683 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxBusinessController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxBusinessController.java @@ -1,6 +1,7 @@ package com.iformall.controller; import com.github.pagehelper.PageInfo; +import com.iformall.annotation.RedisCache; import com.iformall.common.ResultData; import com.iformall.domain.po.WxBusiness; import com.iformall.domain.po.WxCUser; @@ -26,6 +27,7 @@ public class WxBusinessController extends BaseController { @Autowired private WxBusinessService wxBusinessService; + @RedisCache @ApiOperation("业态全列表接口") @GetMapping("listAll") public ResultData listAll(Integer filter) { diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCampaignController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCampaignController.java index 5e32285b8..88a2f9b01 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCampaignController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCampaignController.java @@ -1,6 +1,7 @@ package com.iformall.controller; import com.github.pagehelper.PageInfo; +import com.iformall.annotation.RedisCache; import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.domain.po.base.BaseEntity; @@ -38,6 +39,7 @@ public class WxCampaignController extends BaseController { @Autowired private WxCouponChannelService wxCouponChannelService; + @RedisCache @ApiOperation("分页列表接口") @GetMapping("list") @ApiImplicitParams({ @@ -49,7 +51,6 @@ public class WxCampaignController extends BaseController { wxCampaign.setStatus(EnumCampaignStatus.STATUS_THROW_IN.getCode()); wxCampaign.updateTenantInfo(getTenantInfo()); wxCampaign.setSortColumns(BaseEntity.SortField.SortNum_ASC, BaseEntity.SortField.CreateTime_ASC); - // TODO 缓存优化 final PageInfo page = wxCampaignService.clistAsPage(wxCampaign, pageNum, pageSize); return new ResultData(page); } diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponChannelController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponChannelController.java index 996f9ac55..657395cca 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponChannelController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponChannelController.java @@ -1,6 +1,7 @@ package com.iformall.controller; import com.github.pagehelper.PageInfo; +import com.iformall.annotation.RedisCache; import com.iformall.common.ResultData; import com.iformall.domain.po.base.BaseEntity; import com.iformall.domain.po.WxCouponChannel; @@ -97,7 +98,7 @@ public class WxCouponChannelController extends BaseController { } } - + @RedisCache @ApiOperation("分页列表接口") @GetMapping("change") public ResultData change(@ModelAttribute WxCouponChannel wxCouponChannel) { diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java index 4554f8e98..fe72a463a 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java @@ -46,6 +46,7 @@ public class WxMallController extends BaseController { @Autowired private WxLevelConfigService wxLevelConfigService; + @RedisCache @AuthIgnore @ApiOperation("商场图标") @GetMapping("/getAppIcon") @@ -65,6 +66,7 @@ public class WxMallController extends BaseController { return new ResultData(Result.SUCCESS, "查询成功", resultMap); } + @RedisCache @AuthIgnore @ApiOperation("商场提示信息") @GetMapping("/getWeapNote") @@ -83,10 +85,10 @@ public class WxMallController extends BaseController { return new ResultData(Result.SUCCESS, "查询成功", resultMap); } + @RedisCache @ApiOperation("商场信息") @GetMapping("/mallInfo") public ResultData getMallInfo() { - //TODO 缓存优化 WxMall mall = wxMallService.getByTenantId(getTenantId()); if (mall == null) { return new ResultData(ErrorCode.MALL_INFO_NOT_FOUND); diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java index b119869b7..56abf8d50 100755 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java @@ -8,6 +8,7 @@ import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.iformall.annotation.AuthIgnore; +import com.iformall.annotation.RedisCache; import com.iformall.common.ErrorCode; import com.iformall.common.Result; import com.iformall.common.ResultData; @@ -633,6 +634,7 @@ public class WxUserGrantController extends BaseController { return new ResultData(Result.SUCCESS, "是老用户,已完成手机号授权", resultMap); } + @RedisCache @ApiOperation("获取当前用户信息") @GetMapping("/userinfo") public ResultData getUserInfo() { From 913e40535d8e75793392de16092218e202f1f698 Mon Sep 17 00:00:00 2001 From: Burce Date: Wed, 6 May 2020 07:21:09 +0800 Subject: [PATCH 06/33] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=AE=A1=E7=90=86=EF=BC=8C=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=88=97=E8=A1=A8=E5=92=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iformall/aop/RedisCacheAspect.java | 85 +++++++++++-------- .../com/iformall/aop/RedisCacheAspect.java | 82 ++++++++++-------- .../iformall/controller/WxMallController.java | 25 ++++-- .../com/iformall/service/RedisService.java | 22 +++++ .../service/impl/RedisServiceImpl.java | 45 ++++++++++ 5 files changed, 181 insertions(+), 78 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/service/RedisService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/RedisServiceImpl.java diff --git a/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java b/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java index de3212d83..83ddc9c16 100644 --- a/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java +++ b/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java @@ -3,7 +3,9 @@ package com.iformall.aop; import com.alibaba.fastjson.JSONObject; import com.iformall.annotation.RedisCache; +import com.iformall.common.ErrorCode; import com.iformall.domain.po.WxCUser; +import com.iformall.exception.MallinkException; import com.iformall.service.WxCUserTokenService; import com.iformall.utils.HashUtil; import com.iformall.utils.RedisLock; @@ -21,8 +23,8 @@ import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; import java.util.Arrays; @Slf4j @@ -54,7 +56,7 @@ public class RedisCacheAspect { } @Around("cacheAspect()") - public Object round(ProceedingJoinPoint jp, RedisCache cache) { + public Object round(ProceedingJoinPoint jp) throws Throwable { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); // 查询token信息 //从header中获取token @@ -73,11 +75,15 @@ public class RedisCacheAspect { // 请求参数 Object[] args = jp.getArgs(); - // 接口 返回结果 Object result; - String redisKey; + + //得到注释的名称 + MethodSignature signature = (MethodSignature) jp.getSignature(); + //判断tag是否在用户权限中 如果存在加入参数查询 + Method method = signature.getMethod(); + RedisCache cache = method.getAnnotation(RedisCache.class) ; if (cache.autoKey()) { // 构建 redisKey => reqPath:tenantId:md5(param1_param2_param3) String requestUrl = request.getRequestURI(); @@ -94,47 +100,54 @@ public class RedisCacheAspect { // redisKey 不存在,获取接口数据并返回 if (StringUtils.isBlank(redisKey)) { - result = proceed(jp, args, null); + result = jp.proceed(args); } else { ValueOperations valueOperations = stringRedisTemplate.opsForValue(); String value = valueOperations.get(redisKey); if (value == null) { - result = proceed(jp, args, StringUtils.join(redisKey, ":", "lock")); - String json_data = JSONObject.toJSONString(result); - valueOperations.set(redisKey, json_data, cache.expireTime(), cache.dateUnit()); - log.debug("CacheAspect 缓存不存在,获取接口数据并放入缓存,key:{}, expire:{}", redisKey, cache.expireTime()); + String lockKey = StringUtils.join(redisKey, ":", "lock"); + long time = System.currentTimeMillis() + 2000; + String timeStr = String.valueOf(time); + try { + //分布式锁,保证一个线程读DB,其它线程排队 + if (redisLock.lock2(lockKey, timeStr)) { + log.debug("CacheAspect 读库中, key:{}: " + lockKey); + result = jp.proceed(args); + String json_data = JSONObject.toJSONString(result); + valueOperations.set(redisKey, json_data, cache.expireTime(), cache.dateUnit()); + log.debug("CacheAspect 缓存不存在,获取接口数据并放入缓存,key:{}, expire:{}", redisKey, cache.expireTime()); + } else { + log.debug("CacheAspect 读库等待中, key:{}: " + lockKey); + Thread.sleep(2000); + value = valueOperations.get(redisKey); + result = parseCache(jp, redisKey, value); + } + } catch (Throwable throwable) { + log.error("CacheAspect proceed error , Illegal argument: {} in {}.{}()", Arrays.toString(jp.getArgs()), + jp.getSignature().getDeclaringTypeName(), jp.getSignature().getName(), throwable); + if (throwable instanceof MallinkException) { + throw throwable; + } + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR); + } finally { + redisLock.unlock(lockKey, timeStr); + } } else { - Class returnType = ((MethodSignature) jp.getSignature()).getReturnType(); - result = JSONObject.parseObject(value, returnType); - log.debug("CacheAspect 缓存存在,解析缓存并返回,key:{}", redisKey); + result = parseCache(jp, redisKey, value); } + // 计数器 + stringRedisTemplate.opsForHash().increment("hotapi", redisKey, 1); } return result; } - private Object proceed(ProceedingJoinPoint jp, Object[] args, String lockKey) { - // 超时1秒 - long time = System.currentTimeMillis() + 1000; - String timeStr = String.valueOf(time); - try { - //分布式锁,保证一个线程读DB,其它线程排队 - if (StringUtils.isBlank(lockKey)) { - //log.debug("CacheAspect 读库并返回,无锁"); - return jp.proceed(args); - } else if (redisLock.lock2(lockKey, timeStr)) { - log.debug("CacheAspect 读库中, key:{}: " + lockKey); - return jp.proceed(args); - } else { - // TODO 挂起,重试 - log.debug("CacheAspect 排队中, key:{}: " + lockKey); - } - } catch (Throwable throwable) { - log.error("CacheAspect proceed error , Illegal argument: {} in {}.{}()", Arrays.toString(jp.getArgs()), - jp.getSignature().getDeclaringTypeName(), jp.getSignature().getName(), throwable); - } finally { - redisLock.unlock(lockKey, timeStr); + private Object parseCache(ProceedingJoinPoint jp, String redisKey, String value) { + if (StringUtils.isBlank(value)) { + log.debug("CacheAspect 缓存存在,解析缓存数据为空:{},key:{}", value, redisKey); + return null; } - return null; + Class returnType = ((MethodSignature) jp.getSignature()).getReturnType(); + log.debug("CacheAspect 缓存存在,解析缓存并返回,key:{}", redisKey); + return JSONObject.parseObject(value, returnType); } - -} +} \ No newline at end of file diff --git a/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java b/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java index fb1935a2f..e58baeb75 100644 --- a/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java +++ b/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java @@ -3,7 +3,9 @@ package com.iformall.aop; import com.alibaba.fastjson.JSONObject; import com.iformall.annotation.RedisCache; +import com.iformall.common.ErrorCode; import com.iformall.domain.po.WxCUser; +import com.iformall.exception.MallinkException; import com.iformall.service.WxCUserTokenService; import com.iformall.utils.HashUtil; import com.iformall.utils.RedisLock; @@ -22,6 +24,7 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; import java.util.Arrays; @Slf4j @@ -53,7 +56,7 @@ public class RedisCacheAspect { } @Around("cacheAspect()") - public Object round(ProceedingJoinPoint jp, RedisCache cache) { + public Object round(ProceedingJoinPoint jp) throws Throwable { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); // 查询token信息 //从header中获取token @@ -72,11 +75,15 @@ public class RedisCacheAspect { // 请求参数 Object[] args = jp.getArgs(); - // 接口 返回结果 Object result; - String redisKey; + + //得到注释的名称 + MethodSignature signature = (MethodSignature) jp.getSignature(); + //判断tag是否在用户权限中 如果存在加入参数查询 + Method method = signature.getMethod(); + RedisCache cache = method.getAnnotation(RedisCache.class) ; if (cache.autoKey()) { // 构建 redisKey => reqPath:tenantId:md5(param1_param2_param3) String requestUrl = request.getRequestURI(); @@ -93,47 +100,54 @@ public class RedisCacheAspect { // redisKey 不存在,获取接口数据并返回 if (StringUtils.isBlank(redisKey)) { - result = proceed(jp, args, null); + result = jp.proceed(args); } else { ValueOperations valueOperations = stringRedisTemplate.opsForValue(); String value = valueOperations.get(redisKey); if (value == null) { - result = proceed(jp, args, StringUtils.join(redisKey, ":", "lock")); - String json_data = JSONObject.toJSONString(result); - valueOperations.set(redisKey, json_data, cache.expireTime(), cache.dateUnit()); - log.debug("CacheAspect 缓存不存在,获取接口数据并放入缓存,key:{}, expire:{}", redisKey, cache.expireTime()); + String lockKey = StringUtils.join(redisKey, ":", "lock"); + long time = System.currentTimeMillis() + 2000; + String timeStr = String.valueOf(time); + try { + //分布式锁,保证一个线程读DB,其它线程排队 + if (redisLock.lock2(lockKey, timeStr)) { + log.debug("CacheAspect 读库中, key:{}: " + lockKey); + result = jp.proceed(args); + String json_data = JSONObject.toJSONString(result); + valueOperations.set(redisKey, json_data, cache.expireTime(), cache.dateUnit()); + log.debug("CacheAspect 缓存不存在,获取接口数据并放入缓存,key:{}, expire:{}", redisKey, cache.expireTime()); + } else { + log.debug("CacheAspect 读库等待中, key:{}: " + lockKey); + Thread.sleep(2000); + value = valueOperations.get(redisKey); + result = parseCache(jp, redisKey, value); + } + } catch (Throwable throwable) { + log.error("CacheAspect proceed error , Illegal argument: {} in {}.{}()", Arrays.toString(jp.getArgs()), + jp.getSignature().getDeclaringTypeName(), jp.getSignature().getName(), throwable); + if (throwable instanceof MallinkException) { + throw throwable; + } + throw new MallinkException(ErrorCode.SYS_SERVER_ERROR); + } finally { + redisLock.unlock(lockKey, timeStr); + } } else { - Class returnType = ((MethodSignature) jp.getSignature()).getReturnType(); - result = JSONObject.parseObject(value, returnType); - log.debug("CacheAspect 缓存存在,解析缓存并返回,key:{}", redisKey); + result = parseCache(jp, redisKey, value); } + // 计数器 + stringRedisTemplate.opsForHash().increment("hotapi", redisKey, 1); } return result; } - private Object proceed(ProceedingJoinPoint jp, Object[] args, String lockKey) { - // 超时1秒 - long time = System.currentTimeMillis() + 1000; - String timeStr = String.valueOf(time); - try { - //分布式锁,保证一个线程读DB,其它线程排队 - if (StringUtils.isBlank(lockKey)) { - //log.debug("CacheAspect 读库并返回,无锁"); - return jp.proceed(args); - } else if (redisLock.lock2(lockKey, timeStr)) { - log.debug("CacheAspect 读库中, key:{}: " + lockKey); - return jp.proceed(args); - } else { - // TODO 挂起,重试 - log.debug("CacheAspect 排队中, key:{}: " + lockKey); - } - } catch (Throwable throwable) { - log.error("CacheAspect proceed error , Illegal argument: {} in {}.{}()", Arrays.toString(jp.getArgs()), - jp.getSignature().getDeclaringTypeName(), jp.getSignature().getName(), throwable); - } finally { - redisLock.unlock(lockKey, timeStr); + private Object parseCache(ProceedingJoinPoint jp, String redisKey, String value) { + if (StringUtils.isBlank(value)) { + log.debug("CacheAspect 缓存存在,解析缓存数据为空:{},key:{}", value, redisKey); + return null; } - return null; + Class returnType = ((MethodSignature) jp.getSignature()).getReturnType(); + log.debug("CacheAspect 缓存存在,解析缓存并返回,key:{}", redisKey); + return JSONObject.parseObject(value, returnType); } - } diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java index fe72a463a..9b2c39b8b 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java @@ -7,8 +7,6 @@ import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.domain.po.*; import com.iformall.domain.po.base.TenantEntity; -import com.iformall.domain.vo.WxMerchantVo; -import com.iformall.enums.EnumMerchantStatus; import com.iformall.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -17,13 +15,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @RestController @RequestMapping("/api/mall") @@ -46,6 +40,9 @@ public class WxMallController extends BaseController { @Autowired private WxLevelConfigService wxLevelConfigService; + @Autowired + private RedisService redisService; + @RedisCache @AuthIgnore @ApiOperation("商场图标") @@ -124,4 +121,16 @@ public class WxMallController extends BaseController { return new ResultData(version); } + @ApiOperation("获取热点缓存接口对应redis key") + @GetMapping("/hotApis") + public ResultData hotApis() { + return new ResultData(redisService.hotApi()); + } + + @ApiOperation("删除指定key") + @PostMapping("/delRedisKey") + public ResultData delRedisKey(@RequestBody List keys) { + return new ResultData(redisService.delRedisKey(keys)); + } + } diff --git a/mallinkService/src/main/java/com/iformall/service/RedisService.java b/mallinkService/src/main/java/com/iformall/service/RedisService.java new file mode 100644 index 000000000..1cffaefcd --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/RedisService.java @@ -0,0 +1,22 @@ +package com.iformall.service; + +import java.util.List; +import java.util.Set; + +public interface RedisService { + + String KEY_HOT_API = "hotapi" ; + + /** + * 获取热点缓存接口列表 + * @return + */ + Set hotApi() ; + + /** + * 清除指定key + * @param keys + * @return + */ + boolean delRedisKey(List keys) ; +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/RedisServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/RedisServiceImpl.java new file mode 100644 index 000000000..bd21b508b --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/RedisServiceImpl.java @@ -0,0 +1,45 @@ +package com.iformall.service.impl; + +import com.iformall.service.RedisService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; + +@Slf4j +@Service +public class RedisServiceImpl implements RedisService { + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Override + public Set hotApi() { + return stringRedisTemplate.opsForHash().keys(KEY_HOT_API); + } + + @Override + public boolean delRedisKey(List keys) { + if (CollectionUtils.isEmpty(keys)) { + return false; + } + boolean result; + stringRedisTemplate.multi(); + try { + stringRedisTemplate.opsForValue().getOperations().delete(keys); + stringRedisTemplate.opsForHash().delete(KEY_HOT_API, keys.toArray()); + result = true; + } catch (Exception e) { + log.error("delRedisKey error", e); + stringRedisTemplate.discard(); + result = false; + } finally { + stringRedisTemplate.exec(); + } + return result; + } +} From a4d05a6eaec13178141e69341c6f7fad473b2279 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Wed, 29 Apr 2020 15:25:05 +0800 Subject: [PATCH 07/33] =?UTF-8?q?csv=E4=B9=B1=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/iformall/service/ExcelService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mallinkService/src/main/java/com/iformall/service/ExcelService.java b/mallinkService/src/main/java/com/iformall/service/ExcelService.java index bfe9e93fc..720e2aea3 100644 --- a/mallinkService/src/main/java/com/iformall/service/ExcelService.java +++ b/mallinkService/src/main/java/com/iformall/service/ExcelService.java @@ -1,6 +1,5 @@ package com.iformall.service; - import cn.afterturn.easypoi.csv.CsvExportUtil; import cn.afterturn.easypoi.csv.entity.CsvExportParams; import cn.afterturn.easypoi.excel.ExcelExportUtil; @@ -74,6 +73,7 @@ public class ExcelService { response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + response.getOutputStream().write(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }); // csv 乱码问题 CsvExportUtil.exportCsv(exportParams, pojoClass, list, response.getOutputStream()); } catch (IOException e) { throw new MallinkException(ErrorCode.EXCEL_EXPORT_ERROR.getCode(), e.getMessage()); From 779f400cd4b7770ee0c54459d3e2bcb2081e4fb6 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Thu, 30 Apr 2020 18:11:47 +0800 Subject: [PATCH 08/33] =?UTF-8?q?[POS][=E5=8D=A1=E6=94=AF=E4=BB=98]:?= =?UTF-8?q?=E5=8D=A1=E6=94=AF=E4=BB=98=E5=87=BA=E9=94=99=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/iformall/service/impl/PosServiceImpl.java | 2 +- mallinkService/src/main/java/com/iformall/common/ErrorCode.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java index 28475f560..7c108e969 100644 --- a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java +++ b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java @@ -2196,7 +2196,7 @@ public class PosServiceImpl implements PosService { cardSpendService.cardSpendForPosPay(scoreCreditCalc, cardSpend, merchant, buUser); } else { logger.error("卡支付ID未发现: " + cardSpendId); - throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR); + throw new MallinkException(ErrorCode.POS_CARD_ORDER_NOT_FOUND); } return payOrder; } diff --git a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java index b0a331e09..e884b878e 100644 --- a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java @@ -270,6 +270,7 @@ public enum ErrorCode{ POS_CARD_OWNER_NOT_EQUAL(11110, "卡拥有者不对应"), POS_ORDER_HAD_SYNCED(11111, "订单已同步"), POS_ORDER_NOT_FOUND(11112, "订单未找到"), + POS_CARD_ORDER_NOT_FOUND(11113, "卡支付订单未找到"), POS_CMD_FAIL(11200, "POS命令错误"), From 47d71963d7d9ac1fd51175ce02798a36ec94ee3c Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Thu, 30 Apr 2020 18:34:13 +0800 Subject: [PATCH 09/33] =?UTF-8?q?[POS][=E5=8D=A1=E6=94=AF=E4=BB=98]:?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=9C=E8=BD=AF=E5=8D=A1=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/iformall/enums/EnumNeuPosPamentType.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumNeuPosPamentType.java b/mallinkService/src/main/java/com/iformall/enums/EnumNeuPosPamentType.java index 7d3cb28fa..72044f3b4 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumNeuPosPamentType.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumNeuPosPamentType.java @@ -5,7 +5,7 @@ package com.iformall.enums; */ public enum EnumNeuPosPamentType { - // 来源于Neusoft的定义 0微信;1支付宝;2现金;3-会员折扣, 4优惠券;5预付卡;6银行卡7记账 + // 来源于Neusoft的定义 0微信;1支付宝;2现金;3-会员折扣, 4优惠券;5预付卡;6银行卡7记账;8:东软预付卡 WECHAT(0, "微信"), ALIPAY(1, "支付宝"), CASH(2, "现金"), @@ -14,6 +14,7 @@ public enum EnumNeuPosPamentType { MEM_CARD(5, "预付卡"), MEM_BANKCARD(6, "银行卡"), RECORD(7, "记账"), + NEU_CARD(8, "东软预付卡"), ; public static EnumNeuPosPamentType getEnum(Integer code) { for (EnumNeuPosPamentType value : values()) { From 7ff0b8112cc42f5697275680d55766fc2b8da7ba Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Sun, 3 May 2020 19:04:46 +0800 Subject: [PATCH 10/33] =?UTF-8?q?[=E6=94=B6=E9=93=B6=E5=8F=B0][=E4=BC=98?= =?UTF-8?q?=E5=8C=96]:=E6=94=B6=E9=93=B6=E5=8F=B0=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=A2=84=E6=A0=B8=E9=94=80=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iformall/controller/WxMicroPayController.java | 9 +++++---- .../src/main/java/com/iformall/common/ErrorCode.java | 7 +++++++ .../java/com/iformall/mapper/WxCouponOrderMapper.java | 1 + .../service/impl/WxCouponOrderServiceImpl.java | 4 ++-- .../src/main/resources/mapper/WxCouponOrderMapper.xml | 10 ++++++++++ 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java index 14476ff59..e84310ee4 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java @@ -417,6 +417,7 @@ public class WxMicroPayController extends BaseController { } wxCouponOrder = wxCouponOrderService.getById(couponOrderId); } + WxPayOrder couponPayOrder = null; Integer remainPrice = payPrice; if (wxCouponOrder != null) { @@ -439,12 +440,12 @@ public class WxMicroPayController extends BaseController { if (remainPrice > 0) { if (StringUtils.isBlank(authCode)) { - logger.error("authCode不能为空"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "authCode不能为空"); + logger.error("微信收款码/authCode不能为空"); + return new ResultData(ErrorCode.MICRO_PAY_NO_AUTHCODE.getCode(), "请提供微信收款码"); } if (!checkAuthCode(authCode)) { - logger.error("authCode不符合规则"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "authCode不符合规则"); + logger.error("微信收款码/authCode不符合规则: {}", authCode); + return new ResultData(ErrorCode.MICRO_PAY_ERR_AUTHCODE.getCode(), "请扫描微信收款码"); } WxPayOrder record = new WxPayOrder(); diff --git a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java index e884b878e..0e9ff5897 100644 --- a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java @@ -273,6 +273,13 @@ public enum ErrorCode{ POS_CARD_ORDER_NOT_FOUND(11113, "卡支付订单未找到"), POS_CMD_FAIL(11200, "POS命令错误"), + /** + * B端收银台 + */ + MICRO_PAY_NO_AUTHCODE(11300, "请提供微信收款码"), + MICRO_PAY_ERR_AUTHCODE(11301, "请提供微信收款码"), + + /** * 支付 diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java index 32fb1e3dd..0c282b5c5 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java @@ -24,6 +24,7 @@ public interface WxCouponOrderMapper extends CommonMapper { // 券包核销 int updateVerifyCouponOrder(WxCouponOrder wxCouponOrder); int updateVerifyCouponOrderStatus(WxCouponOrder wxCouponOrder); + int updateVerifyCouponOrderStatusForMicroPay(WxCouponOrder wxCouponOrder); int cancelVerifyCouponOrder(WxCouponOrder wxCouponOrder); //统一的计数接口 diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java index 06413212b..e0c87eb76 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java @@ -1269,7 +1269,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { logger.error("核销异常:updatete num " + num); throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num); } - } else if (couponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.POS_PRE_VERIFY.getCode()) { + } else if (couponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.POS_PRE_VERIFY.getCode())) { // 券已预核销后,但是未做支付,此券还能继续使用 // 1. update posOrderId PosCouponOrderVerify vQ = new PosCouponOrderVerify(); @@ -1294,7 +1294,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { couponOrder.setBUserId(bUser.getId()); couponOrder.setVerifyType(EnumCouponVerifyType.VERIFY_B.getCode()); couponOrder.setUpdateDate(new Date()); - num = wxCouponOrderMapper.updateVerifyCouponOrder(couponOrder); + num = wxCouponOrderMapper.updateVerifyCouponOrderStatusForMicroPay(couponOrder); } catch (Exception e) { logger.error("db failed: couponOrder-" + couponOrder.getId() + ", e:" + e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); diff --git a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml index e1901b3fa..9aae563c0 100644 --- a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml @@ -121,7 +121,17 @@ and `b_user_id` = #{bUserId} + + + update wx_coupon_order + set `coupon_order_status` = #{couponOrderStatus}, + `b_user_id` = #{bUserId}, + `update_date` = #{updateDate}, + `verify_type` = #{verifyType} + where 1=1 + and `tenant_id`=#{tenantId} + and id=#{id} From 8a0cc1cac069a09f7aa5aa0523650ccb7fceb165 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Sun, 3 May 2020 19:14:32 +0800 Subject: [PATCH 11/33] =?UTF-8?q?[=E6=94=B6=E9=93=B6=E5=8F=B0][=E4=BC=98?= =?UTF-8?q?=E5=8C=96]:=E5=89=8D=E7=AB=AF=E4=BC=A0=E4=BA=86=E6=94=B6?= =?UTF-8?q?=E6=AC=BE=E7=A0=81=EF=BC=8C=E5=85=88=E6=A3=80=E6=9F=A5=E6=94=B6?= =?UTF-8?q?=E6=AC=BE=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iformall/controller/WxMicroPayController.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java index e84310ee4..9ae335659 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java @@ -375,13 +375,18 @@ public class WxMicroPayController extends BaseController { logger.error("payPrice不能为空"); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payPrice不能为空"); } + if (StringUtils.isNotBlank(authCode)) { + // 如果传了收款码,先检查收款码格式是否正确 + if (!checkAuthCode(authCode)) { + logger.error("微信收款码/authCode不符合规则: {}", authCode); + return new ResultData(ErrorCode.MICRO_PAY_ERR_AUTHCODE.getCode(), "请扫描微信收款码"); + } + } BigDecimal totalFee = new BigDecimal(payPriceStr); totalFee.setScale(2, BigDecimal.ROUND_HALF_UP); // 第一个变量是小数位数,第二个变量是取舍方法(四舍五入) Integer payPrice = totalFee.multiply(new BigDecimal(100)).intValue(); - - String ipStr = IPUtil.getIpAddr(request); WxMerchantBUser wxMerchantBUser = wxMerchantBUserService.getById(user.getId()); @@ -443,10 +448,6 @@ public class WxMicroPayController extends BaseController { logger.error("微信收款码/authCode不能为空"); return new ResultData(ErrorCode.MICRO_PAY_NO_AUTHCODE.getCode(), "请提供微信收款码"); } - if (!checkAuthCode(authCode)) { - logger.error("微信收款码/authCode不符合规则: {}", authCode); - return new ResultData(ErrorCode.MICRO_PAY_ERR_AUTHCODE.getCode(), "请扫描微信收款码"); - } WxPayOrder record = new WxPayOrder(); record.updateTenantInfo(user); From 387d6aa67868e161bc05ea20bf923881c5d2f5fa Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Sun, 3 May 2020 08:17:07 +0800 Subject: [PATCH 12/33] =?UTF-8?q?[=E6=A1=86=E6=9E=B6=E5=8D=87=E7=BA=A7][?= =?UTF-8?q?=E4=BC=98=E5=8C=96]:=E5=8D=87=E7=BA=A7springboot2.2.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/sys/WechatLoginController.java | 2 +- .../interceptor/RequestInterceptor.java | 2 +- .../interceptor/RequestInterceptor.java | 3 +- .../interceptor/RequestInterceptor.java | 2 +- .../interceptor/RequestInterceptor.java | 2 +- .../wechat/FmOpenInRedisDBConfigStorage.java | 2 +- .../controller/sys/WechatLoginController.java | 2 +- .../interceptor/RequestInterceptor.java | 2 +- mybatis-multi-tenancy/pom.xml | 8 +-- pom.xml | 55 +++++++++---------- 10 files changed, 39 insertions(+), 41 deletions(-) diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java b/mallinkAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java index d268b79a4..0a4af583c 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java @@ -42,7 +42,7 @@ import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import redis.clients.jedis.Protocol; -import redis.clients.util.SafeEncoder; +import redis.clients.jedis.util.SafeEncoder; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; diff --git a/mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java b/mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java index d01a11de5..d7b493d12 100644 --- a/mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java +++ b/mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java @@ -16,7 +16,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import redis.clients.jedis.Protocol; -import redis.clients.util.SafeEncoder; +import redis.clients.jedis.util.SafeEncoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; diff --git a/mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java b/mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java index ee48542e7..951124af6 100644 --- a/mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java +++ b/mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java @@ -15,7 +15,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import redis.clients.jedis.Protocol; -import redis.clients.util.SafeEncoder; +import redis.clients.jedis.util.SafeEncoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -24,7 +24,6 @@ import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.nio.charset.Charset; import java.util.Enumeration; -import java.util.concurrent.TimeUnit; /** * 幂等检查 diff --git a/mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java b/mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java index 5ae2b3db3..ff7e81880 100644 --- a/mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java +++ b/mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java @@ -16,7 +16,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import redis.clients.jedis.Protocol; -import redis.clients.util.SafeEncoder; +import redis.clients.jedis.util.SafeEncoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; diff --git a/mallinkCallback/src/main/java/com/iformall/interceptor/RequestInterceptor.java b/mallinkCallback/src/main/java/com/iformall/interceptor/RequestInterceptor.java index d01a11de5..d7b493d12 100644 --- a/mallinkCallback/src/main/java/com/iformall/interceptor/RequestInterceptor.java +++ b/mallinkCallback/src/main/java/com/iformall/interceptor/RequestInterceptor.java @@ -16,7 +16,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import redis.clients.jedis.Protocol; -import redis.clients.util.SafeEncoder; +import redis.clients.jedis.util.SafeEncoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; diff --git a/mallinkService/src/main/java/com/iformall/service/wechat/FmOpenInRedisDBConfigStorage.java b/mallinkService/src/main/java/com/iformall/service/wechat/FmOpenInRedisDBConfigStorage.java index fbdd5b7d4..8104ee485 100644 --- a/mallinkService/src/main/java/com/iformall/service/wechat/FmOpenInRedisDBConfigStorage.java +++ b/mallinkService/src/main/java/com/iformall/service/wechat/FmOpenInRedisDBConfigStorage.java @@ -13,7 +13,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; -import redis.clients.util.Pool; +import redis.clients.jedis.util.Pool; import java.util.Date; diff --git a/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java b/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java index d268b79a4..0a4af583c 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java @@ -42,7 +42,7 @@ import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import redis.clients.jedis.Protocol; -import redis.clients.util.SafeEncoder; +import redis.clients.jedis.util.SafeEncoder; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; diff --git a/mallinkSysAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java b/mallinkSysAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java index d01a11de5..d7b493d12 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java @@ -16,7 +16,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import redis.clients.jedis.Protocol; -import redis.clients.util.SafeEncoder; +import redis.clients.jedis.util.SafeEncoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; diff --git a/mybatis-multi-tenancy/pom.xml b/mybatis-multi-tenancy/pom.xml index 3066602fb..3f2930697 100644 --- a/mybatis-multi-tenancy/pom.xml +++ b/mybatis-multi-tenancy/pom.xml @@ -10,13 +10,13 @@ com.github.jsqlparser jsqlparser - 1.4 + 2.0 compile org.mybatis mybatis - 3.5.2 + 3.5.4 compile @@ -30,13 +30,13 @@ test mysql mysql-connector-java - 8.0.17 + 8.0.19 test com.alibaba druid - 1.1.17 + 1.1.22 diff --git a/pom.xml b/pom.xml index ab13e1699..1b457bf0b 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.8.RELEASE + 2.2.5.RELEASE @@ -92,12 +92,30 @@ flowable-spring-boot-starter-process 6.4.0 - + + + mysql + mysql-connector-java + 8.0.19 + runtime + + + + com.baomidou + mybatis-plus-boot-starter + 3.2.0 + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.2 + com.github.pagehelper pagehelper-spring-boot-starter - 1.2.10 + 1.2.13 org.mybatis @@ -109,31 +127,18 @@ - - - com.baomidou - mybatis-plus-boot-starter - 3.1.0 - - + - org.mybatis.spring.boot - mybatis-spring-boot-starter - 2.1.0 + com.alibaba + druid + 1.1.22 - org.springframework spring-context-support - - mysql - mysql-connector-java - 8.0.17 - runtime - org.springframework.boot spring-boot-starter-test @@ -166,14 +171,8 @@ com.alibaba fastjson - 1.2.54 + 1.2.68 - - com.alibaba - druid - 1.1.17 - - org.quartz-scheduler @@ -225,7 +224,7 @@ org.projectlombok lombok - 1.18.2 + 1.18.10 provided From ae5cc0c3c199a37a67ea8ce8095afab664cf1e8a Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Sun, 3 May 2020 20:14:53 +0800 Subject: [PATCH 13/33] =?UTF-8?q?[=E5=8D=87=E7=BA=A7][=E4=BC=98=E5=8C=96]:?= =?UTF-8?q?springboot=E5=8D=87=E7=BA=A7=E5=88=B02.2.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 1b457bf0b..6da73b618 100644 --- a/pom.xml +++ b/pom.xml @@ -194,27 +194,27 @@ io.springfox springfox-swagger2 - 2.8.0 + 2.9.2 io.springfox springfox-swagger-ui - 2.8.0 + 2.9.2 io.springfox springfox-spring-web - 2.8.0 + 2.9.2 com.fasterxml.jackson.core jackson-core - 2.9.7 + 2.10.3 com.fasterxml.jackson.core jackson-databind - 2.9.7 + 2.10.3 javax.xml.bind From cdb668dfe0e2c135fab4e1905a81468b70eb7b9d Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Mon, 4 May 2020 07:28:14 +0800 Subject: [PATCH 14/33] =?UTF-8?q?[=E5=8D=87=E7=BA=A7][=E4=BC=98=E5=8C=96]:?= =?UTF-8?q?wxjava=E5=8D=87=E7=BA=A7=E5=88=B03.7.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mallinkAdmin/pom.xml | 4 ++-- mallinkCallback/pom.xml | 4 ++-- mallinkSysAdmin/pom.xml | 4 ++-- pom.xml | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mallinkAdmin/pom.xml b/mallinkAdmin/pom.xml index 781777ca8..638b94239 100644 --- a/mallinkAdmin/pom.xml +++ b/mallinkAdmin/pom.xml @@ -13,8 +13,8 @@ mallinkAdmin - 3.6.0 - 3.6.0 + 3.7.0 + 3.7.0 diff --git a/mallinkCallback/pom.xml b/mallinkCallback/pom.xml index 1feccd436..328265111 100644 --- a/mallinkCallback/pom.xml +++ b/mallinkCallback/pom.xml @@ -13,8 +13,8 @@ mallinkCallback - 3.6.0 - 3.6.0 + 3.7.0 + 3.7.0 diff --git a/mallinkSysAdmin/pom.xml b/mallinkSysAdmin/pom.xml index f99b954fb..7f6f2ef0b 100644 --- a/mallinkSysAdmin/pom.xml +++ b/mallinkSysAdmin/pom.xml @@ -13,8 +13,8 @@ mallinkSysAdmin - 3.6.0 - 3.6.0 + 3.7.0 + 3.7.0 diff --git a/pom.xml b/pom.xml index 6da73b618..fd58a4556 100644 --- a/pom.xml +++ b/pom.xml @@ -32,11 +32,11 @@ - 3.6.0 - 3.6.0 - 3.6.0 - 3.6.0 - 3.6.0 + 3.7.0 + 3.7.0 + 3.7.0 + 3.7.0 + 3.7.0 2.3.0 From 9e1f60b6bde3cafedded785c0b7c57cdfa1ec61c Mon Sep 17 00:00:00 2001 From: bruce Date: Wed, 6 May 2020 13:05:40 +0800 Subject: [PATCH 15/33] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=AE=A1=E7=90=86=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E7=BC=93=E5=AD=98=E6=97=B6=E9=97=B41?= =?UTF-8?q?=E5=88=86=E9=92=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iformall/annotation/RedisCache.java | 4 +-- .../WxDateAmountRecordController.java | 6 ++-- .../com/iformall/annotation/RedisCache.java | 4 +-- .../iformall/controller/WxMallController.java | 2 +- .../com/iformall/service/RedisService.java | 5 +-- .../service/impl/RedisServiceImpl.java | 31 ++++++++++--------- 6 files changed, 27 insertions(+), 25 deletions(-) diff --git a/mallinkBApi/src/main/java/com/iformall/annotation/RedisCache.java b/mallinkBApi/src/main/java/com/iformall/annotation/RedisCache.java index 7f35a8288..a7ca0d919 100644 --- a/mallinkBApi/src/main/java/com/iformall/annotation/RedisCache.java +++ b/mallinkBApi/src/main/java/com/iformall/annotation/RedisCache.java @@ -40,10 +40,10 @@ public @interface RedisCache { boolean md5() default true ; /** - * key 过期日期默认300秒 + * key 过期日期默认60秒 * @return */ - int expireTime() default 300; + int expireTime() default 60; /** * 时间单位默认为秒 diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxDateAmountRecordController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxDateAmountRecordController.java index 01a74f0eb..7b96bed78 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxDateAmountRecordController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxDateAmountRecordController.java @@ -32,21 +32,21 @@ public class WxDateAmountRecordController extends BaseController { @Autowired private WxDateAmountRecordService wxDateAmountRecordService; - @RedisCache(expireTime = 120) + @RedisCache @ApiOperation("首页查询交易金额记录接口") @GetMapping("listOrder") public ResultData listOrder() { return list(EnumDateAmtType.PAY_RECORD.getCode()); } - @RedisCache(expireTime = 120) + @RedisCache @ApiOperation("首页查询核销金额记录接口") @GetMapping("listVerified") public ResultData listVerified() { return list(EnumDateAmtType.VERIFY_RECORD.getCode()); } - @RedisCache(expireTime = 120) + @RedisCache @ApiOperation("首页查询刷卡金额记录接口") @GetMapping("listMicropay") public ResultData listMicropay() { diff --git a/mallinkCApi/src/main/java/com/iformall/annotation/RedisCache.java b/mallinkCApi/src/main/java/com/iformall/annotation/RedisCache.java index da8512502..185736606 100644 --- a/mallinkCApi/src/main/java/com/iformall/annotation/RedisCache.java +++ b/mallinkCApi/src/main/java/com/iformall/annotation/RedisCache.java @@ -40,10 +40,10 @@ public @interface RedisCache { boolean md5() default true ; /** - * key 过期日期默认300秒 + * key 过期日期默认60秒 * @return */ - int expireTime() default 300; + int expireTime() default 60; /** * 时间单位默认为秒 diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java index bff21da65..2f6b5813b 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxMallController.java @@ -130,7 +130,7 @@ public class WxMallController extends BaseController { @ApiOperation("删除指定key") @PostMapping("/delRedisKey") - public ResultData delRedisKey(@RequestBody List keys) { + public ResultData delRedisKey(@RequestBody Collection keys) { return new ResultData(redisService.delRedisKey(keys)); } diff --git a/mallinkService/src/main/java/com/iformall/service/RedisService.java b/mallinkService/src/main/java/com/iformall/service/RedisService.java index 1cffaefcd..d1bd09801 100644 --- a/mallinkService/src/main/java/com/iformall/service/RedisService.java +++ b/mallinkService/src/main/java/com/iformall/service/RedisService.java @@ -1,5 +1,6 @@ package com.iformall.service; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -11,12 +12,12 @@ public interface RedisService { * 获取热点缓存接口列表 * @return */ - Set hotApi() ; + Collection hotApi() ; /** * 清除指定key * @param keys * @return */ - boolean delRedisKey(List keys) ; + boolean delRedisKey(Collection keys) ; } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/RedisServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/RedisServiceImpl.java index bd21b508b..4d3a905ee 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/RedisServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/RedisServiceImpl.java @@ -4,9 +4,13 @@ import com.iformall.service.RedisService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.data.redis.core.RedisOperations; +import org.springframework.data.redis.core.SessionCallback; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -18,28 +22,25 @@ public class RedisServiceImpl implements RedisService { private StringRedisTemplate stringRedisTemplate; @Override - public Set hotApi() { + public Collection hotApi() { return stringRedisTemplate.opsForHash().keys(KEY_HOT_API); } @Override - public boolean delRedisKey(List keys) { + public boolean delRedisKey(Collection keys) { if (CollectionUtils.isEmpty(keys)) { return false; } - boolean result; - stringRedisTemplate.multi(); - try { - stringRedisTemplate.opsForValue().getOperations().delete(keys); - stringRedisTemplate.opsForHash().delete(KEY_HOT_API, keys.toArray()); - result = true; - } catch (Exception e) { - log.error("delRedisKey error", e); - stringRedisTemplate.discard(); - result = false; - } finally { - stringRedisTemplate.exec(); - } + boolean result = stringRedisTemplate.execute(new SessionCallback() { + @Override + public Boolean execute(RedisOperations redisOperations) throws DataAccessException { + redisOperations.multi(); + redisOperations.opsForValue().getOperations().delete(keys); + redisOperations.opsForHash().delete(KEY_HOT_API, keys.toArray()); + redisOperations.exec(); + return true ; + } + }); return result; } } From e5211699dd4864c11b6088e3f4eeaf168894fb44 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Tue, 5 May 2020 09:29:42 +0800 Subject: [PATCH 16/33] =?UTF-8?q?[=E6=94=B6=E9=93=B6=E5=8F=B0=E6=94=AF?= =?UTF-8?q?=E4=BB=98][=E4=BC=98=E5=8C=96]:=E5=BE=AE=E4=BF=A1=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E6=9F=A5=E8=AF=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iformall/mapper/WxPayOrderMapper.java | 2 + .../java/com/iformall/pay/WxPayOrderQ.java | 1 + .../java/com/iformall/pay/WxPayOrderSQ.java | 2 + .../service/impl/WxPayOrderServiceImpl.java | 53 +++++++++++++++---- .../resources/mapper/WxPayOrderMapper.xml | 11 ++++ 5 files changed, 60 insertions(+), 9 deletions(-) diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxPayOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxPayOrderMapper.java index d48968637..59c5e1d21 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxPayOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxPayOrderMapper.java @@ -12,4 +12,6 @@ public interface WxPayOrderMapper extends CommonMapper { List findListOfPaidOrderByDate(Map dateMap); List findListForUnPs(WxPayOrder wxPayOrder); + + List findExpListForMicroPay(WxPayOrder wxPayOrder); } diff --git a/mallinkService/src/main/java/com/iformall/pay/WxPayOrderQ.java b/mallinkService/src/main/java/com/iformall/pay/WxPayOrderQ.java index e00512413..10ee2ea5c 100644 --- a/mallinkService/src/main/java/com/iformall/pay/WxPayOrderQ.java +++ b/mallinkService/src/main/java/com/iformall/pay/WxPayOrderQ.java @@ -11,6 +11,7 @@ public class WxPayOrderQ { private String mch_id; // 商户号 private String nonce_str; // 随机字符串 private String sign; // 签名 + private String transaction_id; // 微信订单号 private String out_trade_no; // 商户订单号 @Override diff --git a/mallinkService/src/main/java/com/iformall/pay/WxPayOrderSQ.java b/mallinkService/src/main/java/com/iformall/pay/WxPayOrderSQ.java index 4143b8697..62e2cf1c0 100644 --- a/mallinkService/src/main/java/com/iformall/pay/WxPayOrderSQ.java +++ b/mallinkService/src/main/java/com/iformall/pay/WxPayOrderSQ.java @@ -14,6 +14,7 @@ public class WxPayOrderSQ { private String nonce_str; // 随机字符串 private String sign; // 签名 private String sign_type; // 签名类型 + private String transaction_id; // 微信订单号 private String out_trade_no; // 商户订单号 @Override @@ -26,6 +27,7 @@ public class WxPayOrderSQ { sb.append(", nonce_str='").append(nonce_str).append('\''); sb.append(", sign='").append(sign).append('\''); sb.append(", out_trade_no='").append(out_trade_no).append('\''); + sb.append(", transtion_id='").append(out_trade_no).append('\''); sb.append('}'); return sb.toString(); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index febfcbcb9..a1a30978f 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -646,7 +646,11 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { payOrderQ.setAppid(appInfo.getAppId()); payOrderQ.setMch_id(payAccount.getMchId()); payOrderQ.setNonce_str(noncestr); - payOrderQ.setOut_trade_no(record.getPayOrderNo()); + if (StringUtils.isNotBlank(record.getTransactionId())) { + payOrderQ.setTransaction_id(record.getTransactionId()); + } else { + payOrderQ.setOut_trade_no(record.getPayOrderNo()); + } try { Map map = BeanUtils.toStringMap(payOrderQ); @@ -668,7 +672,11 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { payOrderSQ.setMch_id(payAccount.getMchId()); payOrderSQ.setSub_mch_id(payAccount.getSubMchId()); payOrderSQ.setNonce_str(noncestr); - payOrderSQ.setOut_trade_no(record.getPayOrderNo()); + if (StringUtils.isNotBlank(record.getTransactionId())) { + payOrderSQ.setTransaction_id(record.getTransactionId()); + } else { + payOrderSQ.setOut_trade_no(record.getPayOrderNo()); + } payOrderSQ.setSign_type("HMAC-SHA256"); try { @@ -764,14 +772,24 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { return new ResultData(ErrorCode.PAY_ORDER_ERROR, returnMap); } } else { - String errMsg = ""; - JSONObject errObj = errorMapQuery.getJSONObject(result_code); - if (errObj != null) { - errMsg = errObj.toJSONString(); + String errCode = returnMap.get("err_code"); + String errCodeDes = returnMap.get("err_code_des"); + if (errCode.equalsIgnoreCase("ORDERNOTEXIST")) { + // 支付订单不存在, 订单失败 + WxOrder updateOrderForMicroPay = new WxOrder(); + updateOrderForMicroPay.setId(order.getId()); + updateOrderForMicroPay.setOrderStatus(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); + try { + wxOrderMapper.updateById(updateOrderForMicroPay); + } catch (Exception e) { + logger.error(e.getMessage()); + } + } + String errMsg = returnMap.get("return_msg"); + if (StringUtils.isNotBlank(errMsg)) { record.setFailReason(errMsg); } else { - errMsg = returnMap.get("return_msg"); - record.setFailReason(errMsg); + record.setFailReason(errCodeDes); } record.setUpdateTime(new Date()); try { @@ -783,8 +801,25 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); } } else { + String errCode = returnMap.get("err_code"); + String errCodeDes = returnMap.get("err_code_des"); + if (errCode.equalsIgnoreCase("ORDERNOTEXIST")) { + // 支付订单不存在, 订单失败 + WxOrder updateOrderForMicroPay = new WxOrder(); + updateOrderForMicroPay.setId(order.getId()); + updateOrderForMicroPay.setOrderStatus(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); + try { + wxOrderMapper.updateById(updateOrderForMicroPay); + } catch (Exception e) { + logger.error(e.getMessage()); + } + } String errMsg = returnMap.get("return_msg"); - record.setFailReason(errMsg); + if (StringUtils.isNotBlank(errMsg)) { + record.setFailReason(errMsg); + } else { + record.setFailReason(errCodeDes); + } record.setUpdateTime(new Date()); try { wxPayOrderMapper.updateById(record); diff --git a/mallinkService/src/main/resources/mapper/WxPayOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxPayOrderMapper.xml index 2e294e9db..56cc88d29 100644 --- a/mallinkService/src/main/resources/mapper/WxPayOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxPayOrderMapper.xml @@ -159,6 +159,17 @@ and tenant_id in (select tenant_id from wx_pay_account where share =1) and tenant_id != '789' and tenant_id != '1000' ; + + From af35720357b0dc6486e9699606d7d11e3b9e6c27 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Tue, 5 May 2020 09:31:12 +0800 Subject: [PATCH 17/33] =?UTF-8?q?[=E6=94=B6=E9=93=B6=E5=8F=B0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95][=E4=BC=98=E5=8C=96]:=E6=94=B6=E9=93=B6=E5=8F=B0?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=8A=B6=E6=80=81=E6=9F=A5=E8=AF=A2=E5=8F=8A?= =?UTF-8?q?=E9=87=8D=E8=AE=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../micropay/MicropayController.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 mallinkSysAdmin/src/main/java/com/iformall/controller/micropay/MicropayController.java diff --git a/mallinkSysAdmin/src/main/java/com/iformall/controller/micropay/MicropayController.java b/mallinkSysAdmin/src/main/java/com/iformall/controller/micropay/MicropayController.java new file mode 100644 index 000000000..d6507e5c0 --- /dev/null +++ b/mallinkSysAdmin/src/main/java/com/iformall/controller/micropay/MicropayController.java @@ -0,0 +1,91 @@ +package com.iformall.controller.micropay; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.iformall.common.ResultData; +import com.iformall.controller.base.BaseController; +import com.iformall.domain.po.WxMerchantBUser; +import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.WxPayOrder; +import com.iformall.enums.EnumOrderStatus; +import com.iformall.exception.MallinkException; +import com.iformall.mapper.WxMerchantBUserMapper; +import com.iformall.mapper.WxOrderMapper; +import com.iformall.mapper.WxPayOrderMapper; +import com.iformall.service.WxPayOrderService; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 数据初始化 + */ +@Slf4j +@RestController +@RequestMapping("micropay") +public class MicropayController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxOrderMapper orderMapper; + + @Autowired + WxPayOrderMapper payOrderMapper; + + @Autowired + WxMerchantBUserMapper merchantBUserMapper; + + @Autowired + WxPayOrderService payOrderService; + + @ApiOperation(value = "异常支付查询") + @PostMapping("/checkExp") + public void check() { + logger.info("queryMicopayOrder"); + + String tenantId = "1021"; + + WxOrder oq = new WxOrder(); + oq.setTenantId(tenantId); + oq.setType(1); + oq.setOrderStatus(0); + List orders = orderMapper.findList(oq); + log.info("EXP order num: {}", orders.size()); + for (WxOrder order: orders) { + WxMerchantBUser bUser = merchantBUserMapper.selectById(order.getProductId()); + WxPayOrder q = new WxPayOrder(); + q.setTenantId(tenantId); + q.setOrderId(order.getId()); + List payOrderList = payOrderMapper.selectList(new QueryWrapper<>(q)); + if (payOrderList.size() > 0) { + // 查询支付订单状态 + for (WxPayOrder payOrder : payOrderList) { + try { + ResultData resultData = payOrderService.payOrderQuery(bUser, payOrder); + logger.info(resultData.toString()); + } catch (MallinkException e) { + logger.error("payment wechat, order query error, req 2: " + payOrder.toString() + ", e:" + e.getMessage()); + } catch (Exception e) { + logger.error("payment wechat, order query error, req 3: " + payOrder.toString() + ", e:" + e.getMessage()); + } + } + } else { + // 无支付订单, 直接标记订单已取消 + WxOrder updateOrderForMicroPay = new WxOrder(); + updateOrderForMicroPay.setId(order.getId()); + updateOrderForMicroPay.setOrderStatus(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); + try { + orderMapper.updateById(updateOrderForMicroPay); + } catch (Exception e) { + logger.error("update Order: {} ", e.getMessage()); + } + } + } + } +} From 425377508bf6a3637999a4e0abbdc746f288cbef Mon Sep 17 00:00:00 2001 From: bruce Date: Thu, 7 May 2020 10:55:20 +0800 Subject: [PATCH 18/33] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=AE=A1=E7=90=86=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?tenantId=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/iformall/aop/RedisCacheAspect.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java b/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java index 83ddc9c16..31500c136 100644 --- a/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java +++ b/mallinkBApi/src/main/java/com/iformall/aop/RedisCacheAspect.java @@ -4,9 +4,9 @@ package com.iformall.aop; import com.alibaba.fastjson.JSONObject; import com.iformall.annotation.RedisCache; import com.iformall.common.ErrorCode; -import com.iformall.domain.po.WxCUser; +import com.iformall.domain.po.WxBuser; import com.iformall.exception.MallinkException; -import com.iformall.service.WxCUserTokenService; +import com.iformall.service.WxBuserTokenService; import com.iformall.utils.HashUtil; import com.iformall.utils.RedisLock; import lombok.extern.slf4j.Slf4j; @@ -49,7 +49,7 @@ public class RedisCacheAspect { RedisLock redisLock; @Autowired - private WxCUserTokenService userTokenService; + private WxBuserTokenService userTokenService; @Pointcut("@annotation(com.iformall.annotation.RedisCache)") public void cacheAspect() { @@ -66,11 +66,11 @@ public class RedisCacheAspect { token = request.getParameter("token"); } String tenantId; - WxCUser wxCUser = userTokenService.getByToken(token); - if (wxCUser == null || wxCUser.getExpireTime().getTime() < System.currentTimeMillis()) { + WxBuser wxBuser = userTokenService.getByToken(token); + if (wxBuser == null || wxBuser.getExpireTime().getTime() < System.currentTimeMillis()) { tenantId = "0"; } else { - tenantId = wxCUser.getTenantId(); + tenantId = wxBuser.getTenantId(); } // 请求参数 From 66e6a2a354d6810841431095886d3c79d5bb83d8 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Sat, 9 May 2020 09:27:47 +0800 Subject: [PATCH 19/33] =?UTF-8?q?[=E6=94=B6=E9=93=B6=E5=8F=B0][=E5=BC=82?= =?UTF-8?q?=E5=B8=B8]:=E5=BC=82=E5=B8=B8=E8=AE=A2=E5=8D=95=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WxMicroPayController.java | 11 +++ .../iformall/domain/vo/WxOrderPayExpVo.java | 67 +++++++++++++++++++ .../com/iformall/domain/vo/WxOrderPayVo.java | 14 ++-- .../com/iformall/mapper/WxOrderMapper.java | 2 + .../com/iformall/service/WxOrderService.java | 8 +++ .../service/impl/WxOrderServiceImpl.java | 62 +++++++++++++++++ .../main/resources/mapper/WxOrderMapper.xml | 63 +++++++++++++++++ 7 files changed, 220 insertions(+), 7 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/domain/vo/WxOrderPayExpVo.java diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java index 9ae335659..280f294eb 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java @@ -226,6 +226,7 @@ public class WxMicroPayController extends BaseController { } } + @RedisCache @ApiOperation("付款码支付交易流水分页列表接口") @GetMapping("listMicroPay") @ApiImplicitParams({ @@ -245,6 +246,16 @@ public class WxMicroPayController extends BaseController { return wxOrderService.microPayListOnDateAsPage(getUser().getId(), EnumOrderType.MICROPAY.getCode(), date, null, null); } + @ApiOperation("付款码支付某日异常交易分页列表接口") + @GetMapping("listMicroPayExp") + @ApiImplicitParams({ + @ApiImplicitParam(name = "date", value = "日期yyyy-MM-dd", dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query",required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query",required = true)}) + public ResultData listMicroPayExp(String date, Integer pageNum, Integer pageSize) { + return wxOrderService.microPayExpListOnDateAsPage(getUser().getId(), EnumOrderType.MICROPAY.getCode(), date, pageNum, pageSize); + } + @ApiOperation(value = "付款码支付退款", notes = "{\"orderId\":\"string\"}") @PostMapping("/microPayRefund") diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderPayExpVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderPayExpVo.java new file mode 100644 index 000000000..0c727dd52 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderPayExpVo.java @@ -0,0 +1,67 @@ +package com.iformall.domain.vo; + +import com.iformall.domain.po.WxOrder; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class WxOrderPayExpVo extends WxOrder { + + /** 发券商户信息 */ + @ApiModelProperty(value="商户名",name="merchantName") + private String merchantName; + @ApiModelProperty(value="b端用户姓名",name="bUserName") + private String bUserName; + @ApiModelProperty(value="b端用户手机号",name="bUserPhone") + private String bUserPhone; + + /** c端用户信息 */ + @ApiModelProperty(value="c用户绑定的手机号",name="cUserPhone") + private String cUserPhone; + @ApiModelProperty(value="c用户昵称",name="nickName") + private String nickName; + @ApiModelProperty(value="c用户名",name="cUserName") + private String cUserName; + + @ApiModelProperty(value ="支付订单ID", name = "payOrderId") + private Long payOrderId; + @ApiModelProperty(value ="微信支付订单ID", name = "transactionId") + private String transactionId; + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,OrderNumber_ASC("`order_number` ASC"),OrderNumber_DESC("`order_number` DESC") + ,TenantId_ASC("`tenant_id` ASC"),TenantId_DESC("`tenant_id` DESC") + ,CUserId_ASC("`c_user_id` ASC"),CUserId_DESC("`c_user_id` DESC") + ,CouponId_ASC("`product_id` ASC"),CouponId_DESC("`product_id` DESC") + ,PaymentType_ASC("`payment_type` ASC"),PaymentType_DESC("`payment_type` DESC") + ,Payment_ASC("`payment` ASC"),Payment_DESC("`payment` DESC") + ,PaymentTime_ASC("`payment_time` ASC"),PaymentTime_DESC("`payment_time` DESC") + ,OrderStatus_ASC("`order_status` ASC"),OrderStatus_DESC("`order_status` DESC") + ,CreateDate_ASC("`create_date` ASC"),CreateDate_DESC("`create_date` DESC") + ,UpdateDate_ASC("`update_date` ASC"),UpdateDate_DESC("`update_date` DESC") + ,Detail_ASC("`detail` ASC"),Detail_DESC("`detail` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + +} diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderPayVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderPayVo.java index 461fa4235..e281c1bfa 100644 --- a/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderPayVo.java +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxOrderPayVo.java @@ -1,6 +1,7 @@ package com.iformall.domain.vo; import com.iformall.domain.po.WxOrder; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -13,20 +14,19 @@ import java.util.List; public class WxOrderPayVo extends WxOrder { /**发券商户信息*/ - @io.swagger.annotations.ApiModelProperty(value="商户名",name="merchantName") + @ApiModelProperty(value="商户名",name="merchantName") private String merchantName; - @io.swagger.annotations.ApiModelProperty(value="b端用户姓名",name="bUserName") + @ApiModelProperty(value="b端用户姓名",name="bUserName") private String bUserName; - @io.swagger.annotations.ApiModelProperty(value="b端用户手机号",name="bUserPhone") + @ApiModelProperty(value="b端用户手机号",name="bUserPhone") private String bUserPhone; - @io.swagger.annotations.ApiModelProperty(value="c用户绑定的手机号",name="cUserPhone") + @ApiModelProperty(value="c用户绑定的手机号",name="cUserPhone") private String cUserPhone; - - @io.swagger.annotations.ApiModelProperty(value="c用户昵称",name="nickName") + @ApiModelProperty(value="c用户昵称",name="nickName") private String nickName; - @io.swagger.annotations.ApiModelProperty(value="c用户名",name="cUserName") + @ApiModelProperty(value="c用户名",name="cUserName") private String cUserName; public static enum Field diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxOrderMapper.java index f2566be8c..4dbc72579 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxOrderMapper.java @@ -24,8 +24,10 @@ public interface WxOrderMapper extends CommonMapper { List findListOfCUser(WxOrder wxOrder); List selectDetailOfCUser(WxOrder wxOrder); + /** B端收银台(收款码支付) */ Map dayMicroPayAmountList(Map dateMap); List findListOfMicroPayOrderByDate(Map dateMap); + List findListOfExpMicroPayOrderByDate(Map dateMap); List queryForSceneRepotyHistory(HashMap params); diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java index 109325204..b11673021 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java @@ -37,6 +37,14 @@ public interface WxOrderService { ResultData microPayListOnDateAsPage(Long bUserId, Integer type, String date, Integer pageIndex, Integer pageSize); + /** + * 根据日期 b用户查刷卡异常支付list + * + * @param bUserId B端用户) + */ + + ResultData microPayExpListOnDateAsPage(Long bUserId, Integer type, String date, Integer pageIndex, Integer pageSize); + /** * 付款码支付 * @param user diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index e1839f4b0..ee01b9ef2 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -201,6 +201,68 @@ public class WxOrderServiceImpl implements WxOrderService { return new ResultData(resultMap); } + @Override + public ResultData microPayExpListOnDateAsPage(Long bUserId, Integer type, String date, Integer pageIndex, Integer pageSize) { + WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(bUserId.longValue()); + if (wxMerchantBUser == null) { + logger.error("B端用户不存在:" + bUserId); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + + WxMerchant wxMerchant = wxMerchantMapper.selectById(wxMerchantBUser.getMerchantId()); + if (wxMerchant == null) { + logger.error("商户不存在:" + bUserId); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); + String dateString; + Date startDate; + Date endDate; + + if (date == null) { + endDate = new Date(); + dateString = fmt.format(new Date()); + try { + startDate = fmt.parse(dateString); + } catch (ParseException e) { + return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); + } + } else { + try { + startDate = fmt.parse(date); + } catch (ParseException e) { + return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); + } + Calendar cal = Calendar.getInstance(); + cal.setTime(startDate); + cal.add(Calendar.DATE, 1); + endDate = cal.getTime(); + } + + Map dateMap = new HashMap(); + dateMap.put("startDate", startDate); + dateMap.put("endDate", endDate); + dateMap.put("merchantId", wxMerchant.getId()); + dateMap.put("type", type); + + Map resultMap = new HashMap(); + + if (pageIndex == null || pageSize == null) { + List list; + list = wxOrderMapper.findListOfExpMicroPayOrderByDate(dateMap); + logger.info("find " + list.size() + " order from " + startDate + " to " + new Date()); + int total_price = 0; + for (WxOrder order : list) { + total_price = total_price + order.getPayment(); + } + resultMap.put("amount", total_price); + } else { + resultMap.put("list", PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfExpMicroPayOrderByDate(dateMap))); + } + return new ResultData(resultMap); + } + /** * 拼团数量 * diff --git a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml index 82bdaa62c..7e0e59b89 100644 --- a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml @@ -430,6 +430,69 @@ order by o.create_date desc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + o.`id`,o.`order_number`,o.`tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`, + o.`payment_type`,o.`payment`,o.`payment_time`,o.`order_status`,o.`create_date`,o.`update_date`,o.`detail`, + m.name as merchant_name, bu.name, bu.phone as bphone, + cu.phone, cu.nick_name, cubi.name c_user_name, + po.id as pay_order_id, po.transaction_id + + + +