|
|
@ -2,21 +2,23 @@ package com.bnyer.order.service.impl; |
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil; |
|
|
import cn.hutool.core.collection.CollUtil; |
|
|
import cn.hutool.core.date.DateUtil; |
|
|
import cn.hutool.core.date.DateUtil; |
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
import com.alibaba.fastjson.JSON; |
|
|
import com.alibaba.fastjson.JSON; |
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
import com.bnyer.common.core.constant.ServiceNameConstants; |
|
|
|
|
|
import com.bnyer.common.core.domain.R; |
|
|
import com.bnyer.common.core.domain.R; |
|
|
import com.bnyer.common.core.domain.VipOrder; |
|
|
import com.bnyer.common.core.domain.VipOrder; |
|
|
import com.bnyer.common.core.enums.*; |
|
|
import com.bnyer.common.core.enums.*; |
|
|
import com.bnyer.common.core.exception.ServiceException; |
|
|
import com.bnyer.common.core.exception.ServiceException; |
|
|
import com.bnyer.common.core.utils.DateUtils; |
|
|
import com.bnyer.common.core.utils.DateUtils; |
|
|
import com.bnyer.common.core.utils.OrderUtil; |
|
|
import com.bnyer.common.core.utils.OrderUtil; |
|
|
|
|
|
import com.bnyer.common.core.utils.Sm4Util; |
|
|
import com.bnyer.common.core.utils.StringUtils; |
|
|
import com.bnyer.common.core.utils.StringUtils; |
|
|
import com.bnyer.common.core.utils.bean.EntityConvertUtil; |
|
|
import com.bnyer.common.core.utils.bean.EntityConvertUtil; |
|
|
import com.bnyer.common.core.utils.uuid.IdUtils; |
|
|
|
|
|
import com.bnyer.common.core.vo.UserInfoVo; |
|
|
import com.bnyer.common.core.vo.UserInfoVo; |
|
|
|
|
|
import com.bnyer.common.redis.constant.CacheNames; |
|
|
|
|
|
import com.bnyer.common.redis.constant.OrderCacheNames; |
|
|
|
|
|
import com.bnyer.common.redis.service.RedisCacheService; |
|
|
import com.bnyer.common.rocketmq.constant.RocketMqConstant; |
|
|
import com.bnyer.common.rocketmq.constant.RocketMqConstant; |
|
|
import com.bnyer.common.rocketmq.constant.RocketMqRepeatConstant; |
|
|
|
|
|
import com.bnyer.common.rocketmq.constant.RocketMqTag; |
|
|
import com.bnyer.common.rocketmq.constant.RocketMqTag; |
|
|
import com.bnyer.common.rocketmq.constant.RocketMqTopic; |
|
|
import com.bnyer.common.rocketmq.constant.RocketMqTopic; |
|
|
import com.bnyer.common.rocketmq.domain.img.AddUserVipRecordMessage; |
|
|
import com.bnyer.common.rocketmq.domain.img.AddUserVipRecordMessage; |
|
|
@ -70,6 +72,11 @@ public class VipOrderServiceImpl implements VipOrderService { |
|
|
@Autowired |
|
|
@Autowired |
|
|
private RemoteUserVipService remoteUserVipService; |
|
|
private RemoteUserVipService remoteUserVipService; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private RedisCacheService redisCacheService; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 查询会员订单列表信息 |
|
|
* 查询会员订单列表信息 |
|
|
* @param query |
|
|
* @param query |
|
|
@ -113,22 +120,57 @@ public class VipOrderServiceImpl implements VipOrderService { |
|
|
@Override |
|
|
@Override |
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
public String addVipOrder(AddVipOrderDto addVipOrderDto) { |
|
|
public String addVipOrder(AddVipOrderDto addVipOrderDto) { |
|
|
//构建订单
|
|
|
VipOrder vipOrder = getCacheVipOrder(addVipOrderDto); |
|
|
VipOrder vipOrder = buildVipOrder(addVipOrderDto); |
|
|
String orderNo; |
|
|
vipOrderMapper.insert(vipOrder); |
|
|
if (ObjectUtil.isNull(vipOrder)){ |
|
|
String orderNo = vipOrder.getOrderNo(); |
|
|
//构建订单
|
|
|
//发送消息,如果三十分钟后没有支付,则取消订单
|
|
|
vipOrder = buildVipOrder(addVipOrderDto); |
|
|
VipOrderCancelMessage vipOrderCancelMessage = new VipOrderCancelMessage(); |
|
|
vipOrderMapper.insert(vipOrder); |
|
|
vipOrderCancelMessage.setOrderNo(orderNo); |
|
|
//缓存订单,有效期30分钟,防止用户一直创建重复的订单
|
|
|
//延时消息不走消息表,因为延时消息最少支持秒级延时,定时任务不可能对消息表进行秒级扫描,那样性能损耗太大了
|
|
|
cacheOrder(vipOrder); |
|
|
//所以确保消息一定发送成功,走同步发送,如果发送失败直接抛异常,确保本地事物回滚
|
|
|
orderNo = vipOrder.getOrderNo(); |
|
|
SendStatus sendStatus = rocketMQEnhanceTemplate.send(RocketMqTopic.ORDER_CANCEL_TOPIC, RocketMqTag.ORDER_VIP_TAG, vipOrderCancelMessage, RocketMqConstant.THIRTY_MINUTES).getSendStatus(); |
|
|
//发送消息,如果三十分钟后没有支付,则取消订单
|
|
|
if (SendStatus.SEND_OK != sendStatus){ |
|
|
VipOrderCancelMessage vipOrderCancelMessage = new VipOrderCancelMessage(); |
|
|
throw new ServiceException("下单失败,请重试"); |
|
|
vipOrderCancelMessage.setOrderNo(orderNo); |
|
|
|
|
|
//延时消息不走消息表,因为延时消息最少支持秒级延时,定时任务不可能对消息表进行秒级扫描,那样性能损耗太大了
|
|
|
|
|
|
//所以确保消息一定发送成功,走同步发送,如果发送失败直接抛异常,确保本地事物回滚
|
|
|
|
|
|
SendStatus sendStatus = rocketMQEnhanceTemplate.send(RocketMqTopic.ORDER_CANCEL_TOPIC, RocketMqTag.ORDER_VIP_TAG, vipOrderCancelMessage, RocketMqConstant.THIRTY_MINUTES).getSendStatus(); |
|
|
|
|
|
if (SendStatus.SEND_OK != sendStatus){ |
|
|
|
|
|
throw new ServiceException("下单失败,请重试"); |
|
|
|
|
|
} |
|
|
|
|
|
}else { |
|
|
|
|
|
orderNo = vipOrder.getOrderNo(); |
|
|
} |
|
|
} |
|
|
return orderNo; |
|
|
return orderNo; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 获取缓存中的订单信息 |
|
|
|
|
|
* @param addVipOrderDto |
|
|
|
|
|
* @return |
|
|
|
|
|
*/ |
|
|
|
|
|
private VipOrder getCacheVipOrder(AddVipOrderDto addVipOrderDto) { |
|
|
|
|
|
UserInfoVo userInfo = SecurityUtils.getUserInfo(); |
|
|
|
|
|
Long userId = userInfo.getId(); |
|
|
|
|
|
String code = EnumUserClientType.getCodeByType(userInfo.getUserClientType()); |
|
|
|
|
|
String key = addVipOrderDto.getVipId() + CacheNames.UNION_KEY + userId; |
|
|
|
|
|
return redisCacheService.getCache( OrderCacheNames.ORDER_PREFIX + code |
|
|
|
|
|
+ CacheNames.UNION_KEY + OrderCacheNames.VIP_ORDER_CONFIRM,key); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 缓存订单,防止用户一直创建重复的订单 |
|
|
|
|
|
* @param vipOrder |
|
|
|
|
|
*/ |
|
|
|
|
|
private void cacheOrder(VipOrder vipOrder) { |
|
|
|
|
|
UserInfoVo userInfo = SecurityUtils.getUserInfo(); |
|
|
|
|
|
Long userId = userInfo.getId(); |
|
|
|
|
|
String code = EnumUserClientType.getCodeByType(userInfo.getUserClientType()); |
|
|
|
|
|
String key = vipOrder.getVipId() + CacheNames.UNION_KEY + userId; |
|
|
|
|
|
redisCacheService.putCache( OrderCacheNames.ORDER_PREFIX + code |
|
|
|
|
|
+ CacheNames.UNION_KEY + OrderCacheNames.VIP_ORDER_CONFIRM, key, vipOrder); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 构建订单 |
|
|
* 构建订单 |
|
|
* @param addVipOrderDto |
|
|
* @param addVipOrderDto |
|
|
@ -145,13 +187,9 @@ public class VipOrderServiceImpl implements VipOrderService { |
|
|
VipOrder vipOrder = null; |
|
|
VipOrder vipOrder = null; |
|
|
EnumVipType enumVipType = EnumVipType.getVipTypeByCode(userVipVo.getVipTypeCode()); |
|
|
EnumVipType enumVipType = EnumVipType.getVipTypeByCode(userVipVo.getVipTypeCode()); |
|
|
switch (enumVipType){ |
|
|
switch (enumVipType){ |
|
|
case IMG_VIP: |
|
|
case YJ_VIP: |
|
|
vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto); |
|
|
vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto); |
|
|
break; |
|
|
break; |
|
|
case VIDEO_VIP: |
|
|
|
|
|
break; |
|
|
|
|
|
case AI_VIP: |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
default: |
|
|
throw new ServiceException("vipTypeCode 未匹配上对应分类"); |
|
|
throw new ServiceException("vipTypeCode 未匹配上对应分类"); |
|
|
} |
|
|
} |
|
|
@ -172,18 +210,13 @@ public class VipOrderServiceImpl implements VipOrderService { |
|
|
vipOrder.setVipCode(userVipVo.getVipCode()); |
|
|
vipOrder.setVipCode(userVipVo.getVipCode()); |
|
|
vipOrder.setVipName(userVipVo.getVipName()); |
|
|
vipOrder.setVipName(userVipVo.getVipName()); |
|
|
vipOrder.setVipTypeName(userVipVo.getVipTypeName()); |
|
|
vipOrder.setVipTypeName(userVipVo.getVipTypeName()); |
|
|
//// TODO: 2023/05/10 待加密
|
|
|
vipOrder.setPhone(StringUtils.isNotBlank(addVipOrderDto.getPhone())? |
|
|
vipOrder.setPhone(addVipOrderDto.getPhone()); |
|
|
Sm4Util.sm4Encryption(addVipOrderDto.getPhone()):null); |
|
|
vipOrder.setVipName(userVipVo.getVipName()); |
|
|
vipOrder.setVipName(userVipVo.getVipName()); |
|
|
vipOrder.setVipTypeName(userVipVo.getVipTypeName()); |
|
|
vipOrder.setVipTypeName(userVipVo.getVipTypeName()); |
|
|
vipOrder.setPayAmount(userVipVo.getPrice()); |
|
|
vipOrder.setPayAmount(userVipVo.getPrice()); |
|
|
vipOrder.setVipTypeName(userVipVo.getVipTypeName()); |
|
|
vipOrder.setVipTypeName(userVipVo.getVipTypeName()); |
|
|
vipOrder.setUserId(userId); |
|
|
vipOrder.setUserId(userId); |
|
|
// vipOrder.setIsDelay("0");
|
|
|
|
|
|
// vipOrder.setStartTime(nowDate);
|
|
|
|
|
|
// EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipVo.getValidTimeUnit());
|
|
|
|
|
|
// //计算会员结束时间
|
|
|
|
|
|
// vipOrder.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate, userVipVo.getValidTimeNum()));
|
|
|
|
|
|
EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipVo.getValidTimeUnit()); |
|
|
EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipVo.getValidTimeUnit()); |
|
|
//计算本次开通的天数
|
|
|
//计算本次开通的天数
|
|
|
Date nowDate = new Date(); |
|
|
Date nowDate = new Date(); |
|
|
|