!2 修复优惠券价格分摊不对问题

Merge pull request !2 from OceansDeep/feature/pg
This commit is contained in:
OceansDeep 2021-05-24 22:37:03 +08:00 committed by Gitee
commit 75608555ff
10 changed files with 71 additions and 26 deletions

View File

@ -36,7 +36,7 @@ public abstract class AbstractDelayQueueMachineFactory {
instance.add(Calendar.SECOND, time); instance.add(Calendar.SECOND, time);
long delaySeconds = instance.getTimeInMillis() / 1000; long delaySeconds = instance.getTimeInMillis() / 1000;
boolean result = redisUtil.zadd(setDelayQueueName(), delaySeconds, jobId); boolean result = redisUtil.zadd(setDelayQueueName(), delaySeconds, jobId);
log.info("redis add delay, key {}, delay time {}", setDelayQueueName(), delaySeconds); log.info("redis add delay, key {}, delay time {}", setDelayQueueName(), time);
return result; return result;
} }

View File

@ -24,6 +24,7 @@ import cn.lili.modules.order.cart.render.TradeBuilder;
import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.dos.Trade;
import cn.lili.modules.order.order.entity.vo.ReceiptVO; import cn.lili.modules.order.order.entity.vo.ReceiptVO;
import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum; import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum;
@ -43,6 +44,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -137,6 +139,9 @@ public class CartServiceImpl implements CartService {
cartSkuVOS.add(cartSkuVO); cartSkuVOS.add(cartSkuVO);
} }
tradeDTO.setCartTypeEnum(cartTypeEnum); tradeDTO.setCartTypeEnum(cartTypeEnum);
// 如购物车发生更改则重置优惠券
tradeDTO.setStoreCoupons(null);
tradeDTO.setPlatformCoupon(null);
this.resetTradeDTO(tradeDTO); this.resetTradeDTO(tradeDTO);
} catch (Exception e) { } catch (Exception e) {
log.error("购物车渲染异常", e); log.error("购物车渲染异常", e);
@ -294,7 +299,7 @@ public class CartServiceImpl implements CartService {
@Override @Override
public TradeDTO getCheckedTradeDTO(CartTypeEnum way) { public TradeDTO getCheckedTradeDTO(CartTypeEnum way) {
return this.readDTO(way); return tradeBuilder.buildTrade(way);
} }
/** /**
@ -474,7 +479,7 @@ public class CartServiceImpl implements CartService {
} }
//使用优惠券 与否 //使用优惠券 与否
if (use && checkCoupon(memberCoupon, tradeDTO)) { if (use && checkCoupon(memberCoupon, tradeDTO)) {
this.useCoupon(tradeDTO, memberCoupon); this.useCoupon(tradeDTO, memberCoupon, cartTypeEnum);
} else if (!use) { } else if (!use) {
if (Boolean.TRUE.equals(memberCoupon.getIsPlatform())) { if (Boolean.TRUE.equals(memberCoupon.getIsPlatform())) {
tradeDTO.setPlatformCoupon(null); tradeDTO.setPlatformCoupon(null);
@ -563,10 +568,23 @@ public class CartServiceImpl implements CartService {
return cartTypeEnum; return cartTypeEnum;
} }
private void useCoupon(TradeDTO tradeDTO, MemberCoupon memberCoupon) { private void useCoupon(TradeDTO tradeDTO, MemberCoupon memberCoupon, CartTypeEnum cartTypeEnum) {
//如果是平台优惠券 //如果是平台优惠券
if (Boolean.TRUE.equals(memberCoupon.getIsPlatform())) { if (Boolean.TRUE.equals(memberCoupon.getIsPlatform())) {
if (memberCoupon.getConsumeThreshold() <= tradeDTO.getPriceDetailDTO().getGoodsPrice()) { // 购物车价格
Double cartPrice = 0d;
for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) {
// 获取商品的促销信息
Optional<PromotionGoods> promotionOptional = cartSkuVO.getPromotions().parallelStream().filter(i -> (i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name()) && cartTypeEnum.equals(CartTypeEnum.PINTUAN))
|| i.getPromotionType().equals(PromotionTypeEnum.SECKILL.name())).findAny();
if (promotionOptional.isPresent()) {
cartPrice += CurrencyUtil.mul(promotionOptional.get().getPrice(), cartSkuVO.getNum());
} else {
cartPrice += CurrencyUtil.mul(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getNum());
}
}
if (memberCoupon.getConsumeThreshold() <= cartPrice) {
tradeDTO.setPlatformCoupon(new MemberCouponDTO(memberCoupon)); tradeDTO.setPlatformCoupon(new MemberCouponDTO(memberCoupon));
tradeDTO.setStoreCoupons(new HashMap<>()); tradeDTO.setStoreCoupons(new HashMap<>());
} }

View File

@ -33,4 +33,23 @@ public interface PromotionGoodsMapper extends BaseMapper<PromotionGoods> {
@Param("skuId") String skuId, @Param("skuId") String skuId,
@Param("startTime") Date startTime, @Param("startTime") Date startTime,
@Param("endTime") Date endTime); @Param("endTime") Date endTime);
/**
* 查询参加活动促销商品是否同时参加指定类型的活动
*
* @param promotionType 促销类型
* @param skuId skuId
* @param startTime 开始时间
* @param endTime 结束时间
* @return 共参加了几种活动
*/
@Select("select count(0) from li_promotion_goods where promotion_type = #{promotionType} and sku_id = #{skuId} and (" +
"( start_time < #{startTime} && end_time > #{startTime} ) || ( start_time < #{endTime} && end_time > #{endTime} ) || " +
"( start_time < #{startTime} && end_time > #{endTime} ) || ( start_time > #{startTime} && end_time < #{endTime} )" +
" || promotion_status = 'START' ) and promotion_id != #{promotionId}")
Integer selectInnerOverlapPromotionGoodsWithout(@Param("promotionType") String promotionType,
@Param("skuId") String skuId,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime,
@Param("promotionId") String promotionId);
} }

View File

@ -106,9 +106,10 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
* @param skuId skuId * @param skuId skuId
* @param startTime 开始时间 * @param startTime 开始时间
* @param endTime 结束时间 * @param endTime 结束时间
* @param promotionId 促销活动id(是否排除当前活动如排除则填写没有的话为null)
* @return 共参加了几种活动 * @return 共参加了几种活动
*/ */
Integer findInnerOverlapPromotionGoods(String promotionType, String skuId, Date startTime, Date endTime); Integer findInnerOverlapPromotionGoods(String promotionType, String skuId, Date startTime, Date endTime, String promotionId);
/** /**

View File

@ -20,11 +20,11 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -59,7 +59,7 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
throw new ServiceException("优惠券剩余领取数量不足"); throw new ServiceException("优惠券剩余领取数量不足");
} }
if (haveCoupons >= coupon.getCouponLimitNum()) { if (haveCoupons >= coupon.getCouponLimitNum()) {
throw new ServiceException("此优惠券最多领取" + coupon.getCouponLimitNum()+""); throw new ServiceException("此优惠券最多领取" + coupon.getCouponLimitNum() + "");
} }
} }
@ -96,7 +96,9 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
@Override @Override
public IPage<MemberCoupon> getMemberCouponsByCanUse(CouponSearchParams param, Double totalPrice, PageVO pageVo) { public IPage<MemberCoupon> getMemberCouponsByCanUse(CouponSearchParams param, Double totalPrice, PageVO pageVo) {
LambdaQueryWrapper<MemberCoupon> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<MemberCoupon> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(MemberCoupon::getStoreId, Arrays.asList(param.getStoreId(), "platform")); List<String> storeIds = new ArrayList<>(Arrays.asList(param.getStoreId().split(",")));
storeIds.add("platform");
queryWrapper.in(MemberCoupon::getStoreId, storeIds);
queryWrapper.eq(MemberCoupon::getMemberId, param.getMemberId()); queryWrapper.eq(MemberCoupon::getMemberId, param.getMemberId());
queryWrapper.and( queryWrapper.and(
i -> i.like(MemberCoupon::getScopeId, param.getScopeId()) i -> i.like(MemberCoupon::getScopeId, param.getScopeId())

View File

@ -504,9 +504,9 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
throw new ServiceException(); throw new ServiceException();
} }
// 查询是否在同一时间段参与了拼团活动 // 查询是否在同一时间段参与了拼团活动
Integer count = promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime()); Integer count = promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime(), pintuan.getId());
// 查询是否在同一时间段参与了限时抢购活动 // 查询是否在同一时间段参与了限时抢购活动
count += promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.PINTUAN.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime()); count += promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.PINTUAN.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime(), pintuan.getId());
if (count > 0) { if (count > 0) {
log.error("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了限时抢购或拼团活动,不能参加拼团活动"); log.error("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了限时抢购或拼团活动,不能参加拼团活动");
throw new ServiceException("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了限时抢购或拼团活动,不能参加拼团活动"); throw new ServiceException("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了限时抢购或拼团活动,不能参加拼团活动");

View File

@ -113,7 +113,7 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
if (pointsGoods != null) { if (pointsGoods != null) {
cartSkuVO.setPoint(pointsGoods.getPoints().intValue()); cartSkuVO.setPoint(pointsGoods.getPoints().intValue());
} }
DistributionGoods distributionGoods=distributionGoodsService.distributionGoodsVOBySkuId(cartSkuVO.getGoodsSku().getId()); DistributionGoods distributionGoods = distributionGoodsService.distributionGoodsVOBySkuId(cartSkuVO.getGoodsSku().getId());
if (distributionGoods != null) { if (distributionGoods != null) {
cartSkuVO.setDistributionGoods(distributionGoods); cartSkuVO.setDistributionGoods(distributionGoods);
} }
@ -246,9 +246,13 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
@Override @Override
public Integer findInnerOverlapPromotionGoods(String promotionType, String skuId, Date startTime, Date endTime) { public Integer findInnerOverlapPromotionGoods(String promotionType, String skuId, Date startTime, Date endTime, String promotionId) {
if (promotionId != null) {
return this.baseMapper.selectInnerOverlapPromotionGoodsWithout(promotionType, skuId, startTime, endTime, promotionId);
} else {
return this.baseMapper.selectInnerOverlapPromotionGoods(promotionType, skuId, startTime, endTime); return this.baseMapper.selectInnerOverlapPromotionGoods(promotionType, skuId, startTime, endTime);
} }
}
/** /**
* 获取促销活动商品库存 * 获取促销活动商品库存

View File

@ -292,7 +292,7 @@ public class PromotionPriceServiceImpl implements PromotionPriceService {
private double calculationSingleCoupon(MemberCoupon coupon, List<GoodsSkuPromotionPriceDTO> conformCollect) { private double calculationSingleCoupon(MemberCoupon coupon, List<GoodsSkuPromotionPriceDTO> conformCollect) {
double couponTotalPrice = 0; double couponTotalPrice = 0;
// 合计优惠券范围内的所有商品的原价 // 合计优惠券范围内的所有商品的原价
double totalPrice = conformCollect.parallelStream().mapToDouble(GoodsSkuPromotionPriceDTO::getOriginalPrice).sum(); double totalPrice = conformCollect.parallelStream().mapToDouble(GoodsSkuPromotionPriceDTO::getTotalFinalePrice).sum();
// 根据优惠券优惠类型判断是否满足条件 // 根据优惠券优惠类型判断是否满足条件
if (CouponTypeEnum.PRICE.name().equals(coupon.getCouponType()) && coupon.getConsumeThreshold() <= totalPrice) { if (CouponTypeEnum.PRICE.name().equals(coupon.getCouponType()) && coupon.getConsumeThreshold() <= totalPrice) {
@ -314,14 +314,14 @@ public class PromotionPriceServiceImpl implements PromotionPriceService {
// 分配到每个商品的优惠券金额 // 分配到每个商品的优惠券金额
for (GoodsSkuPromotionPriceDTO goodsSkuPromotionPriceDTO : conformCollect) { for (GoodsSkuPromotionPriceDTO goodsSkuPromotionPriceDTO : conformCollect) {
double rate = CurrencyUtil.div(goodsSkuPromotionPriceDTO.getFinalePrice(), totalPrice, 5); double rate = CurrencyUtil.div(goodsSkuPromotionPriceDTO.getTotalFinalePrice(), totalPrice, 5);
double distributeCouponPrice = CurrencyUtil.mul(couponTotalPrice, rate); double distributeCouponPrice = CurrencyUtil.div(CurrencyUtil.mul(couponTotalPrice, rate), goodsSkuPromotionPriceDTO.getNumber());
if (goodsSkuPromotionPriceDTO.getFinalePrice() != null) { if (goodsSkuPromotionPriceDTO.getFinalePrice() != null) {
goodsSkuPromotionPriceDTO.setFinalePrice(CurrencyUtil.sub(goodsSkuPromotionPriceDTO.getFinalePrice(), distributeCouponPrice)); goodsSkuPromotionPriceDTO.setFinalePrice(CurrencyUtil.sub(goodsSkuPromotionPriceDTO.getFinalePrice(), distributeCouponPrice));
} else { } else {
goodsSkuPromotionPriceDTO.setFinalePrice(CurrencyUtil.sub(goodsSkuPromotionPriceDTO.getOriginalPrice(), distributeCouponPrice)); goodsSkuPromotionPriceDTO.setFinalePrice(CurrencyUtil.sub(goodsSkuPromotionPriceDTO.getOriginalPrice(), distributeCouponPrice));
} }
goodsSkuPromotionPriceDTO.setCouponPrice(distributeCouponPrice); goodsSkuPromotionPriceDTO.setCouponPrice(CurrencyUtil.mul(distributeCouponPrice, goodsSkuPromotionPriceDTO.getNumber()));
goodsSkuPromotionPriceDTO.setTotalFinalePrice(CurrencyUtil.mul(goodsSkuPromotionPriceDTO.getFinalePrice(), goodsSkuPromotionPriceDTO.getNumber())); goodsSkuPromotionPriceDTO.setTotalFinalePrice(CurrencyUtil.mul(goodsSkuPromotionPriceDTO.getFinalePrice(), goodsSkuPromotionPriceDTO.getNumber()));
BasePromotion basePromotion = new BasePromotion(); BasePromotion basePromotion = new BasePromotion();
basePromotion.setId(coupon.getId()); basePromotion.setId(coupon.getId());

View File

@ -132,12 +132,14 @@ public class PromotionServiceImpl implements PromotionService {
pintuanVO.setPromotionStatus(promotionMessage.getPromotionStatus()); pintuanVO.setPromotionStatus(promotionMessage.getPromotionStatus());
result = this.pintuanService.update(promotionMessage.updateWrapper()); result = this.pintuanService.update(promotionMessage.updateWrapper());
this.promotionGoodsService.updateBatchById(pintuanVO.getPromotionGoodsList()); this.promotionGoodsService.updateBatchById(pintuanVO.getPromotionGoodsList());
if (pintuanVO.getPromotionGoodsList() != null) {
List<PromotionGoods> promotionGoodsList = pintuanVO.getPromotionGoodsList(); List<PromotionGoods> promotionGoodsList = pintuanVO.getPromotionGoodsList();
// 更新促销商品索引 // 更新促销商品索引
for (PromotionGoods promotionGoods : promotionGoodsList) { for (PromotionGoods promotionGoods : promotionGoodsList) {
Pintuan pintuan1 = JSONUtil.toBean(JSONUtil.toJsonStr(pintuanVO), Pintuan.class); Pintuan pintuan1 = JSONUtil.toBean(JSONUtil.toJsonStr(pintuanVO), Pintuan.class);
this.goodsIndexService.updateEsGoodsIndex(promotionGoods.getSkuId(), pintuan1, esPromotionKey, promotionGoods.getPrice()); this.goodsIndexService.updateEsGoodsIndex(promotionGoods.getSkuId(), pintuan1, esPromotionKey, promotionGoods.getPrice());
} }
}
this.mongoTemplate.save(pintuanVO); this.mongoTemplate.save(pintuanVO);
break; break;
//优惠券 //优惠券

View File

@ -32,7 +32,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
@ -256,9 +255,9 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
String endTimeStr = DateUtil.toString(seckill.getStartTime(), "yyyy-MM-dd") + " 23:59:59"; String endTimeStr = DateUtil.toString(seckill.getStartTime(), "yyyy-MM-dd") + " 23:59:59";
// 查询是否在同一时间段参与了拼团活动 // 查询是否在同一时间段参与了拼团活动
Integer count = promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.PINTUAN.name(), goodsSku.getId(), DateUtil.toDate(startTimeStr, DateUtil.STANDARD_FORMAT), DateUtil.toDate(endTimeStr, DateUtil.STANDARD_FORMAT)); Integer count = promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.PINTUAN.name(), goodsSku.getId(), DateUtil.toDate(startTimeStr, DateUtil.STANDARD_FORMAT), DateUtil.toDate(endTimeStr, DateUtil.STANDARD_FORMAT), seckillId);
// 查询是否在同一时间段参与了限时抢购活动 // 查询是否在同一时间段参与了限时抢购活动
count += promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), goodsSku.getId(), DateUtil.toDate(startTimeStr, DateUtil.STANDARD_FORMAT), DateUtil.toDate(endTimeStr, DateUtil.STANDARD_FORMAT)); count += promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), goodsSku.getId(), DateUtil.toDate(startTimeStr, DateUtil.STANDARD_FORMAT), DateUtil.toDate(endTimeStr, DateUtil.STANDARD_FORMAT), seckillId);
if (count > 0) { if (count > 0) {
throw new ServiceException("商品[" + goodsSku.getGoodsName() + "]已经在重叠的时间段参加了团购或限时抢购活动,不能参加限时抢购活动"); throw new ServiceException("商品[" + goodsSku.getGoodsName() + "]已经在重叠的时间段参加了团购或限时抢购活动,不能参加限时抢购活动");
} }