砍价订单实现

This commit is contained in:
lifenlong
2021-07-20 16:18:54 +08:00
parent eef270ff9c
commit 6607506929
17 changed files with 115 additions and 66 deletions

View File

@@ -48,12 +48,15 @@ public class TradeBuilder {
*/
int[] defaultRender = {0, 1, 2, 4, 5, 6, 7};
int[] danbiRender = {0, 2, 4, 5, 6, 7};
/**
* 购物车购物车渲染
* 0-> 校验商品, 1-》 满优惠渲染, 2->渲染优惠, 5->计算价格
*/
int[] cartRender = {0, 1, 2, 5};
/**
* 构造购物车
* 购物车与结算信息不一致的地方主要是优惠券计算和运费计算,其他规则都是一致都
@@ -98,12 +101,23 @@ public class TradeBuilder {
//将购物车到sku未选择信息过滤
List<CartSkuVO> collect = tradeDTO.getSkuList().parallelStream().filter(i -> Boolean.TRUE.equals(i.getChecked())).collect(Collectors.toList());
tradeDTO.setSkuList(collect);
//按照计划进行渲染
for (int index : defaultRender) {
try {
cartRenderSteps.get(index).render(tradeDTO);
} catch (Exception e) {
log.error("购物车{}渲染异常:", cartRenderSteps.get(index).getClass(), e);
if (checkedWay.equals(CartTypeEnum.CART) || checkedWay.equals(CartTypeEnum.BUY_NOW) || checkedWay.equals(CartTypeEnum.VIRTUAL)) {
//按照计划进行渲染
for (int index : defaultRender) {
try {
cartRenderSteps.get(index).render(tradeDTO);
} catch (Exception e) {
log.error("购物车{}渲染异常:", cartRenderSteps.get(index).getClass(), e);
}
}
} else {
//按照计划进行渲染
for (int index : danbiRender) {
try {
cartRenderSteps.get(index).render(tradeDTO);
} catch (Exception e) {
log.error("购物车{}渲染异常:", cartRenderSteps.get(index).getClass(), e);
}
}
}

View File

@@ -97,7 +97,10 @@ public class CartPriceRender implements CartRenderStep {
if (Boolean.TRUE.equals(cartSkuVO.getChecked())) {
PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO();
//流水金额(入账 出帐金额) = goodsPrice + freight - discountPrice - couponPrice
double flowPrice = CurrencyUtil.sub(CurrencyUtil.add(priceDetailDTO.getGoodsPrice(), priceDetailDTO.getFreightPrice()), CurrencyUtil.add(priceDetailDTO.getDiscountPrice(), priceDetailDTO.getCouponPrice() != null ? priceDetailDTO.getCouponPrice() : 0));
double flowPrice = CurrencyUtil.sub(
CurrencyUtil.add(priceDetailDTO.getGoodsPrice(), priceDetailDTO.getFreightPrice()),
CurrencyUtil.add(priceDetailDTO.getDiscountPrice(),
priceDetailDTO.getCouponPrice() != null ? priceDetailDTO.getCouponPrice() : 0));
priceDetailDTO.setFlowPrice(flowPrice);
//最终结算金额 = flowPrice - platFormCommission - distributionCommission

View File

@@ -27,10 +27,8 @@ import cn.lili.modules.promotion.entity.dos.KanjiaActivity;
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dos.Pintuan;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.enums.*;
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivitySearchParams;
import cn.lili.modules.promotion.service.*;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
@@ -98,6 +96,8 @@ public class CartServiceImpl implements CartService {
*/
@Autowired
private KanjiaActivityService kanjiaActivityService;
@Autowired
private KanjiaActivityGoodsService kanjiaActivityGoodsService;
/**
* 交易
*/
@@ -691,25 +691,25 @@ public class CartServiceImpl implements CartService {
*/
private void checkKanjia(CartSkuVO cartSkuVO) {
List<PromotionGoods> currentPromotion = cartSkuVO.getPromotions().stream().filter(
promotionGoods -> (promotionGoods.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())))
.collect(Collectors.toList());
//根据skuId获取砍价商品
KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO=kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId());
//校验砍价活动是否满足条件
//查找当前会员的砍价商品活动
KanjiaActivitySearchParams kanjiaActivitySearchParams = new KanjiaActivitySearchParams();
kanjiaActivitySearchParams.setKanjiaActivityGoodsId(currentPromotion.get(0).getSkuId());
kanjiaActivitySearchParams.setKanjiaActivityGoodsId(kanjiaActivityGoodsDTO.getId());
kanjiaActivitySearchParams.setMemberId(UserContext.getCurrentUser().getId());
kanjiaActivitySearchParams.setStatus(KanJiaStatusEnum.SUCCESS.name());
KanjiaActivity kanjiaActivity = kanjiaActivityService.getKanjiaActivity(kanjiaActivitySearchParams);
//校验砍价活动是否满足条件
//判断发起砍价活动
if (kanjiaActivity == null) {
throw new ServiceException(ResultCode.KANJIA_ACTIVITY_NOT_FOUND_ERROR);
//判断砍价活动是否已满足条件
} else if (!KanJiaStatusEnum.SUCCESS.name().equals(kanjiaActivity.getStatus())) {
throw new ServiceException(ResultCode.KANJIA_ACTIVITY_NOT_PASS_ERROR);
//判断砍价商品数量
} else if (cartSkuVO.getNum() > 1) {
throw new ServiceException(ResultCode.KANJIA_NUM_BUY_ERROR);
}
//砍价商品默认一件货物
cartSkuVO.setNum(1);
}
}

View File

@@ -1,5 +1,6 @@
package cn.lili.modules.order.order.entity.dos;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.base.BaseEntity;
import cn.lili.common.utils.BeanUtil;
@@ -167,7 +168,7 @@ public class Order extends BaseEntity {
private Boolean needReceipt;
@ApiModelProperty(value = "是否为其他订单下的订单如果是则为依赖订单的sn否则为空")
private String parentOrderSn="";
private String parentOrderSn = "";
@ApiModelProperty(value = "是否为某订单类型的订单如果是则为订单类型的id否则为空")
private String promotionId;
@@ -215,7 +216,7 @@ public class Order extends BaseEntity {
BeanUtil.copyProperties(cartVO.getPriceDetailDTO(), this);
BeanUtil.copyProperties(cartVO, this);
//填写订单类型
this.setTradeType(cartVO,tradeDTO);
this.setTradeType(cartVO, tradeDTO);
setId(oldId);
//设置默认支付状态
@@ -253,22 +254,23 @@ public class Order extends BaseEntity {
* 2.普通订单进行区分:实物订单、虚拟订单
* 3.促销订单判断货物进行区分实物、虚拟商品。
* 4.拼团订单需要填写父订单ID
* @param cartVO 购物车VO
*
* @param cartVO 购物车VO
* @param tradeDTO 交易DTO
*/
private void setTradeType(CartVO cartVO, TradeDTO tradeDTO){
private void setTradeType(CartVO cartVO, TradeDTO tradeDTO) {
//判断是否为普通订单、促销订单
if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.CART) || tradeDTO.getCartTypeEnum().equals(CartTypeEnum.BUY_NOW)) {
this.setOrderType(OrderTypeEnum.NORMAL.name());
}else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.VIRTUAL)) {
} else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.VIRTUAL)) {
this.setOrderType(OrderTypeEnum.VIRTUAL.name());
}else{
} else {
//促销订单(拼团、积分)-判断购买的是虚拟商品还是实物商品
String goodsType=cartVO.getSkuList().get(0).getGoodsSku().getGoodsType();
if(goodsType.equals(GoodsTypeEnum.PHYSICAL_GOODS.name())){
String goodsType = cartVO.getSkuList().get(0).getGoodsSku().getGoodsType();
if (StrUtil.isEmpty(goodsType) || goodsType.equals(GoodsTypeEnum.PHYSICAL_GOODS.name())) {
this.setOrderType(OrderTypeEnum.NORMAL.name());
}else{
} else {
this.setOrderType(OrderTypeEnum.VIRTUAL.name());
}
//填写订单的促销类型

View File

@@ -27,10 +27,6 @@ public class FullDiscount extends BasePromotion {
private static final long serialVersionUID = 430433787214894166L;
@NotEmpty(message = "活动名称不能为空")
@ApiModelProperty(value = "活动名称", required = true)
private String promotionName;
@NotNull(message = "请填写优惠门槛")
@DecimalMax(value = "99999999.00", message = "优惠券门槛金额超出限制")
@ApiModelProperty(value = "优惠门槛金额", required = true)

View File

@@ -17,7 +17,7 @@ import lombok.Data;
@ApiModel(value = "砍价活动参与记录对象")
public class KanjiaActivityDTO extends KanjiaActivityLog {
@ApiModelProperty(value = "砍价金额")
@ApiModelProperty(value = "砍价商品Id")
private String kanjiaActivityGoodsId;
}

View File

@@ -16,12 +16,18 @@ import lombok.Data;
public class KanjiaActivityVO extends KanjiaActivity {
@ApiModelProperty(value = "是否可以砍价")
private Boolean help = false;
private Boolean help;
@ApiModelProperty(value = "是否已发起砍价")
private Boolean launch = false;
private Boolean launch;
@ApiModelProperty(value = "是否可购买")
private Boolean pass = false;
private Boolean pass;
public KanjiaActivityVO() {
this.setHelp(false);
this.setLaunch(false);
this.setPass(false);
}
}

View File

@@ -47,7 +47,7 @@ public interface KanjiaActivityGoodsService extends IService<KanjiaActivityGoods
* @param pageVO 分页信息
* @return 砍价商品
*/
IPage<KanjiaActivityGoodsListVO> kanJiaGoodsVOPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO);
IPage<KanjiaActivityGoodsListVO> kanjiaGoodsVOPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO);
/**
* 查询砍价活动商品
@@ -55,7 +55,14 @@ public interface KanjiaActivityGoodsService extends IService<KanjiaActivityGoods
* @param goodsId 砍价活动商品id
* @return 砍价活动商品信息
*/
KanjiaActivityGoodsDTO getKanJiaGoodsDetail(String goodsId);
KanjiaActivityGoodsDTO getKanjiaGoodsDetail(String goodsId);
/**
* 根据SkuId获取正在进行中的砍价商品
* @param skuId 商品规格Id
* @return 砍价商品
*/
KanjiaActivityGoodsDTO getKanjiaGoodsBySkuId(String skuId);
/**
* 查询砍价活动商品VO
@@ -67,10 +74,10 @@ public interface KanjiaActivityGoodsService extends IService<KanjiaActivityGoods
/**
* 修改看见商品信息
*
* @param kanJiaActivityGoodsDTO 砍价商品信息
* @param kanjiaActivityGoodsDTO 砍价商品信息
* @return 是否修改成功
*/
boolean updateKanJiaActivityGoods(KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO);
boolean updateKanjiaActivityGoods(KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO);
/**
* 删除砍价商品

View File

@@ -140,7 +140,7 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
}
@Override
public IPage<KanjiaActivityGoodsListVO> kanJiaGoodsVOPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO pageVO) {
public IPage<KanjiaActivityGoodsListVO> kanjiaGoodsVOPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO pageVO) {
return this.baseMapper.kanjiaActivityGoodsVOPage(PageUtil.initPage(pageVO),kanjiaActivityGoodsParams.wrapper());
}
@@ -225,7 +225,7 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
}
@Override
public KanjiaActivityGoodsDTO getKanJiaGoodsDetail(String goodsId) {
public KanjiaActivityGoodsDTO getKanjiaGoodsDetail(String goodsId) {
KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.mongoTemplate.findById(goodsId, KanjiaActivityGoodsDTO.class);
if (kanJiaActivityGoodsDTO == null) {
log.error("id为" + goodsId + "的砍价商品不存在!");
@@ -234,6 +234,16 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
return kanJiaActivityGoodsDTO;
}
@Override
public KanjiaActivityGoodsDTO getKanjiaGoodsBySkuId(String skuId) {
Query query = new Query();
query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name()));
query.addCriteria(Criteria.where("skuId").is(skuId));
List<KanjiaActivityGoodsDTO> kanjiaActivityGoodsDTOS = this.mongoTemplate.find(query, KanjiaActivityGoodsDTO.class);
return kanjiaActivityGoodsDTOS.get(0);
}
@Override
public KanjiaActivityGoodsVO getKanJiaGoodsVO(String id) {
@@ -252,9 +262,9 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
}
@Override
public boolean updateKanJiaActivityGoods(KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) {
public boolean updateKanjiaActivityGoods(KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) {
//校验砍价商品是否存在
KanjiaActivityGoodsDTO dbKanJiaActivityGoods = this.getKanJiaGoodsDetail(kanJiaActivityGoodsDTO.getId());
KanjiaActivityGoodsDTO dbKanJiaActivityGoods = this.getKanjiaGoodsDetail(kanJiaActivityGoodsDTO.getId());
//校验当前活动是否已经开始,只有新建的未开始的活动可以编辑
if (!dbKanJiaActivityGoods.getPromotionStatus().equals(PromotionStatusEnum.NEW.name())) {
throw new ServiceException(ResultCode.PROMOTION_UPDATE_ERROR);
@@ -297,7 +307,7 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
public boolean deleteKanJiaGoods(List<String> ids) {
List<String> skuIds = new ArrayList<>();
for (String id : ids) {
KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.getKanJiaGoodsDetail(id);
KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.getKanjiaGoodsDetail(id);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
kanJiaActivityGoodsDTO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.KANJIA.name() + kanJiaActivityGoodsDTO.getId())),
@@ -318,8 +328,8 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
public KanjiaActivityGoodsDTO getKanJiaGoodsBySku(String skuId) {
//mongo查询条件
Query query = new Query();
query.addCriteria(Criteria.where("skuId").ne(skuId))
.addCriteria(Criteria.where("promotionStatus").ne(PromotionStatusEnum.START.name()));
query.addCriteria(Criteria.where("skuId").is(skuId))
.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name()));
List<KanjiaActivityGoodsDTO> kanjiaActivityGoodsDTOList=this.mongoTemplate.find(query, KanjiaActivityGoodsDTO.class);
return kanjiaActivityGoodsDTOList.get(0);
}

View File

@@ -66,6 +66,10 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
public KanjiaActivityVO getKanjiaActivityVO(KanjiaActivitySearchParams kanJiaActivitySearchParams) {
KanjiaActivity kanjiaActivity = this.getKanjiaActivity(kanJiaActivitySearchParams);
KanjiaActivityVO kanjiaActivityVO = new KanjiaActivityVO();
//判断是否参与活动
if (kanjiaActivity == null) {
return kanjiaActivityVO;
}
BeanUtil.copyProperties(kanjiaActivity, kanjiaActivityVO);
//判断是否发起了砍价活动,如果发起可参与活动
@@ -195,6 +199,10 @@ public class KanjiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper,
return surplusPrice;
}
//如果金额相等则直接返回
if (kanjiaActivityGoods.getLowestPrice().equals(kanjiaActivityGoods.getHighestPrice())) {
return kanjiaActivityGoods.getLowestPrice();
}
//获取随机砍价金额
BigDecimal bigDecimal = RandomUtil.randomBigDecimal(Convert.toBigDecimal(kanjiaActivityGoods.getLowestPrice()),
Convert.toBigDecimal(kanjiaActivityGoods.getHighestPrice()));

View File

@@ -141,7 +141,8 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
queryWrapper.eq(MemberCoupon::getMemberId, memberId);
queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name());
queryWrapper.eq(MemberCoupon::getScopeType, CouponScopeTypeEnum.ALL.name());
queryWrapper.gt(MemberCoupon::getEndTime, new Date()).and(i -> i.in(MemberCoupon::getStoreId, storeId).or(j -> j.eq(MemberCoupon::getIsPlatform, true)));
queryWrapper.gt(MemberCoupon::getEndTime, new Date());
//queryWrapper.and(i -> i.in(MemberCoupon::getStoreId, storeId).or(j -> j.eq(MemberCoupon::getIsPlatform, true)));
return this.list(queryWrapper);
}

View File

@@ -66,7 +66,7 @@ public class PromotionPriceServiceImpl implements PromotionPriceService {
@Override
public PromotionPriceDTO calculationPromotionPrice(List<PromotionPriceParamDTO> tradeSkuList, List<MemberCoupon> memberCouponList, CartTypeEnum cartTypeEnum) {
List<GoodsSkuPromotionPriceDTO> priceDTOList=new ArrayList<>();
List<GoodsSkuPromotionPriceDTO> priceDTOList = new ArrayList<>();
//拆分出SkuId列表
List<String> skuIds = tradeSkuList.parallelStream().map(PromotionPriceParamDTO::getSkuId).collect(Collectors.toList());
@@ -75,9 +75,9 @@ public class PromotionPriceServiceImpl implements PromotionPriceService {
//判断交易类型,进行不同的处理
if (cartTypeEnum.equals(CartTypeEnum.POINTS)) {
this.pointGoodsPromotion(tradeSkuList);
priceDTOList = this.pointGoodsPromotion(tradeSkuList);
} else if (cartTypeEnum.equals(CartTypeEnum.KANJIA)) {
this.kanjiaPromotion(tradeSkuList);
priceDTOList = this.kanjiaPromotion(tradeSkuList);
} else {
//参与计算的缓存中的商品SKU列表
List<GoodsSku> goodsSkus = goodsSkuService.getGoodsSkuByIdFromCache(skuIds);
@@ -288,6 +288,8 @@ public class PromotionPriceServiceImpl implements PromotionPriceService {
goodsSkuPromotionPrice.setTotalDiscountPrice(CurrencyUtil.sub(goodsSkuPromotionPrice.getOriginalPrice(), kanjiaActivityGoodsDTO.getPurchasePrice()));
//购买价格=砍价成交金额
goodsSkuPromotionPrice.setTotalFinalePrice(kanjiaActivityGoodsDTO.getPurchasePrice());
//原价
goodsSkuPromotionPrice.setTotalOriginalPrice(goodsSkuPromotionPrice.getOriginalPrice());
priceDTOList.add(goodsSkuPromotionPrice);
return priceDTOList;
}