From 3cacd68ddbd71ba5e762896211b751adc0d19b7c Mon Sep 17 00:00:00 2001 From: Gitea Date: Fri, 10 Apr 2020 10:53:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=85=8D=E8=B4=B9=E5=88=B8?= =?UTF-8?q?=E4=B8=8B=E5=8D=95=E9=80=BB=E8=BE=91=EF=BC=8C=E9=99=90=E5=88=B6?= =?UTF-8?q?1=E7=A7=92=E5=86=85=E9=87=8D=E5=A4=8D=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/WxOrderServiceImpl.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) 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 3ec347313..ac8ed391b 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -1,5 +1,6 @@ package com.iformall.service.impl; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; @@ -19,9 +20,12 @@ import com.iformall.mapper.*; import com.iformall.mq.MqBaseProducer; import com.iformall.service.*; import com.iformall.utils.*; +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.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -32,6 +36,7 @@ import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Service @@ -660,7 +665,7 @@ public class WxOrderServiceImpl implements WxOrderService { } record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); record.setPayment(payment); - record.setTotalPayment(payment); + record.setTotalPayment(payment); record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); record.setDetail(bodyStr); record.setCreateDate(curr); @@ -697,7 +702,7 @@ public class WxOrderServiceImpl implements WxOrderService { record.setCUserId(cUserId); record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); record.setPayment(payment); - record.setTotalPayment(payment); + record.setTotalPayment(payment); record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); record.setDetail(bodyStr); record.setCreateDate(curr); @@ -1618,11 +1623,26 @@ public class WxOrderServiceImpl implements WxOrderService { wxOrderMapper.updateStatusByPressCouponId(updateOrder); } + @Autowired + @Qualifier("cuserTokenRedisTemplate") + RedisTemplate cUserTokenRedisTemplate; + @Override public WxOrder saveOrderForCoupon(WxCUser user, WxCoupon coupon, OrderSaveDto orderSaveDto, boolean isPress) { WxOrder order = null; + // 防止同一用户重复抽奖(一分钟内) + // 1. 订单保存时 加入redis缓存,key --> action:userId:couponId , 时间1000ms + // 2. 如果存在,说明该用户正在下单,返回异常提示 + // 3. 方法结束时清除 key if (checkCouponIsFree(coupon)) { // 免费券 + String key = StringUtils.join("action", ":", user.getId(), coupon.getId()); + boolean hasKey = cUserTokenRedisTemplate.hasKey(key); + if (hasKey) { + logger.error("用户正在下单,请求异常返回,user: {} " + JSON.toJSONString(user)); + throw new MallinkException(ErrorCode.SYS_REPEAT_SUBMIT_EXCEPTION); + } + cUserTokenRedisTemplate.opsForValue().set(key, user, 1000, TimeUnit.MILLISECONDS); order = saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId(), null); if (order != null) { // 6. 下订单完成,发送内部消息