| @@ -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<String, WxCUser> 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. 下订单完成,发送内部消息 | |||