订单平台佣金bug修复,价格计算相关优化

This commit is contained in:
Chopper
2021-08-02 18:44:05 +08:00
parent 083b90a04a
commit 644de06172
20 changed files with 110 additions and 321 deletions

View File

@@ -58,6 +58,14 @@ public interface GoodsService extends IService<Goods> {
*/
GoodsVO getGoodsVO(String goodsId);
/**
* 数据库查询商品VO
*
* @param goodsId 商品id
* @return 商品VO
*/
GoodsVO getGoodsVOFromDB(String goodsId);
/**
* 商品查询
*

View File

@@ -224,6 +224,11 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
return goodsVO;
}
@Override
public GoodsVO getGoodsVOFromDB(String goodsId) {
return getGoodsVO(goodsId);
}
@Override
public IPage<Goods> queryByParams(GoodsSearchParams goodsSearchParams) {
return this.page(PageUtil.initPage(goodsSearchParams), goodsSearchParams.queryWrapper());

View File

@@ -73,6 +73,8 @@ public class CartPriceRender implements CartRenderStep {
if (cart.getStoreId().equals(sku.getStoreId()) && !cart.getSkuList().contains(sku)) {
cart.getSkuList().add(sku);
}
//写入初始价格
sku.getPriceDetailDTO().setGoodsPrice(CurrencyUtil.mul(sku.getPurchasePrice(), sku.getNum()));
}
}
}
@@ -105,55 +107,40 @@ public class CartPriceRender implements CartRenderStep {
//计算购物车价格
for (CartVO cart : cartVOS) {
List<CartSkuVO> cartSkuVOS = map.get(cart.getStoreId());
//累加价格
List<PriceDetailDTO> priceDetailDTOS = new ArrayList<>();
//购物车选中
if (Boolean.TRUE.equals(cart.getChecked())) {
//累加价格
for (CartSkuVO cartSkuVO : cartSkuVOS) {
//sku选中
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));
priceDetailDTO.setFlowPrice(flowPrice);
//平台佣金根据分类计算
String categoryId = cartSkuVO.getGoodsSku().getCategoryPath()
.substring(cartSkuVO.getGoodsSku().getCategoryPath().lastIndexOf(",") + 1);
if (StrUtil.isNotEmpty(categoryId)) {
Double commissionRate = categoryService.getById(categoryId).getCommissionRate();
priceDetailDTO.setCommission(commissionRate);
}
//如果积分订单 计算金额
//如果积分订单 积分订单,单独操作订单结算金额和商家结算字段
if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) {
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(cartSkuVO.getGoodsSku().getId());
priceDetailDTO.setBillPrice(pointsGoodsVO.getSettlementPrice());
priceDetailDTO.setSettlementPrice(pointsGoodsVO.getSettlementPrice());
}
//如果砍价订单 计算金额
//如果砍价订单 计算金额,单独操作订单结算金额和商家结算字段
else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA)) {
KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanJiaGoodsBySku(cartSkuVO.getGoodsSku().getId());
priceDetailDTO.setBillPrice(kanjiaActivityGoodsDTO.getSettlementPrice());
priceDetailDTO.setSettlementPrice(kanjiaActivityGoodsDTO.getSettlementPrice());
}
//兜底普通计算
else {
//如果是普通订单最终结算金额 = flowPrice - platFormCommission - distributionCommission
double billPrice = CurrencyUtil.sub(
CurrencyUtil.sub(
flowPrice, priceDetailDTO.getPlatFormCommission()), priceDetailDTO.getDistributionCommission());
priceDetailDTO.setBillPrice(billPrice);
}
//平台佣金
String categoryId = cartSkuVO.getGoodsSku().getCategoryPath().substring(
cartSkuVO.getGoodsSku().getCategoryPath().lastIndexOf(",") + 1
);
//平台佣金=订单金额 * 分类佣金百分比
if (StrUtil.isNotEmpty(categoryId)) {
Double platFormCommission = CurrencyUtil.div(CurrencyUtil.mul(flowPrice, categoryService.getById(categoryId).getCommissionRate()), 100);
priceDetailDTO.setPlatFormCommission(platFormCommission);
}
priceDetailDTOS.add(priceDetailDTO);
}
}
cart.setPriceDetailDTO(PriceDetailDTO.accumulationPriceDTO(priceDetailDTOS, cart.getPriceDetailDTO()));
cart.getPriceDetailDTO().accumulationPriceDTO(priceDetailDTOS);
}
}
}
@@ -172,7 +159,7 @@ public class CartPriceRender implements CartRenderStep {
for (CartVO cart : cartVOS) {
priceDetailDTOS.add(cart.getPriceDetailDTO());
}
tradeDTO.setPriceDetailDTO(PriceDetailDTO.accumulationPriceDTO(priceDetailDTOS, tradeDTO.getPriceDetailDTO()));
tradeDTO.getPriceDetailDTO().accumulationPriceDTO(priceDetailDTOS);
}
}

View File

@@ -5,7 +5,6 @@ import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
@@ -109,8 +108,6 @@ public class CheckDataRender implements CartRenderStep {
//设置失效消息
cartSkuVO.setErrorMessage("商品库存不足,现有库存数量[" + dataSku.getQuantity() + "]");
}
//写入初始价格
cartSkuVO.getPriceDetailDTO().setGoodsPrice(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum()));
}
}

View File

@@ -94,6 +94,13 @@ public class PriceDetailDTO implements Serializable {
private List<BasePromotion> joinPromotion;
public Double getOriginalPrice() {
if (originalPrice == null) {
return flowPrice;
}
return originalPrice;
}
public PriceDetailDTO() {
goodsPrice = 0d;
freightPrice = 0d;
@@ -116,13 +123,50 @@ public class PriceDetailDTO implements Serializable {
joinPromotion = new ArrayList<>();
}
/**
* 写入修改金额,自动计算订单各个金额
*
* @param updatePrice 修改后的订单金额
*/
public void setUpdatePrice(Double updatePrice) {
this.updatePrice = updatePrice;
}
/**
* 写入佣金比例,计算结算金额
*
* @param commission 佣金比例
*/
public void setCommission(Double commission) {
//流水金额(入账 出帐金额) = goodsPrice + freight - discountPrice + couponPrice
this.flowPrice = CurrencyUtil.sub(
CurrencyUtil.add(goodsPrice, freightPrice),
CurrencyUtil.add(discountPrice,
couponPrice != null ? couponPrice : 0));
//计算平台佣金 流水金额*平台佣金比例
if (commission != null && commission > 0) {
platFormCommission = CurrencyUtil.div(CurrencyUtil.mul(flowPrice, commission), 100);
}
countBill();
}
public void countBill() {
//如果是普通订单最终结算金额 = flowPrice - platFormCommission - distributionCommission
billPrice = CurrencyUtil.sub(CurrencyUtil.sub(flowPrice, platFormCommission), distributionCommission);
}
/**
* 累加
*
* @param priceDetailDTOS
* @return
*/
public static PriceDetailDTO accumulationPriceDTO(List<PriceDetailDTO> priceDetailDTOS, PriceDetailDTO originPriceDetail) {
public void accumulationPriceDTO(List<PriceDetailDTO> priceDetailDTOS) {
double goodsPrice = 0d;
@@ -164,23 +208,21 @@ public class PriceDetailDTO implements Serializable {
billPrice = CurrencyUtil.add(billPrice, price.getBillPrice());
}
originPriceDetail.setGoodsPrice(goodsPrice);
originPriceDetail.setFreightPrice(freightPrice);
originPriceDetail.setPayPoint(payPoint);
originPriceDetail.setUpdatePrice(updatePrice);
originPriceDetail.setDiscountPrice(discountPrice);
this.setGoodsPrice(goodsPrice);
this.setFreightPrice(freightPrice);
this.setPayPoint(payPoint);
this.setUpdatePrice(updatePrice);
this.setDiscountPrice(discountPrice);
originPriceDetail.setDistributionCommission(distributionCommission);
originPriceDetail.setPlatFormCommission(platFormCommission);
this.setDistributionCommission(distributionCommission);
this.setPlatFormCommission(platFormCommission);
originPriceDetail.setSiteCouponPrice(siteCouponPrice);
originPriceDetail.setSiteCouponPoint(siteCouponPoint);
originPriceDetail.setSiteCouponCommission(siteCouponCommission);
this.setSiteCouponPrice(siteCouponPrice);
this.setSiteCouponPoint(siteCouponPoint);
this.setSiteCouponCommission(siteCouponCommission);
originPriceDetail.setFlowPrice(flowPrice);
originPriceDetail.setBillPrice(billPrice);
return originPriceDetail;
this.setFlowPrice(flowPrice);
this.setBillPrice(billPrice);
}
/**
@@ -203,11 +245,4 @@ public class PriceDetailDTO implements Serializable {
return goodsPrice;
}
/**
* 自身计价
*/
public void count() {
this.flowPrice = CurrencyUtil.sub(CurrencyUtil.add(goodsPrice, freightPrice), discountPrice);
//this.billPrice = CurrencyUtil.sub(CurrencyUtil.sub(CurrencyUtil.sub(flowPrice, platFormCommission)), distributionCommission);
}
}

View File

@@ -1,11 +1,9 @@
package cn.lili.modules.order.order.serviceimpl;
import cn.hutool.json.JSONUtil;
import cn.lili.modules.system.aspect.annotation.SystemLogPoint;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.modules.system.utils.OperationalJudgment;
import cn.lili.modules.goods.service.CategoryService;
import cn.lili.modules.order.order.aop.OrderLogPoint;
import cn.lili.modules.order.order.entity.dos.Order;
@@ -20,6 +18,8 @@ import cn.lili.modules.order.order.service.OrderPriceService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.payment.kit.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.plugin.bank.BankTransferPlugin;
import cn.lili.modules.system.aspect.annotation.SystemLogPoint;
import cn.lili.modules.system.utils.OperationalJudgment;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -27,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* 订单价格业务层实现
@@ -122,16 +123,21 @@ public class OrderPriceServiceImpl implements OrderPriceService {
//获取订单价格信息
PriceDetailDTO orderPriceDetailDTO = order.getPriceDetailDTO();
//如果未修改过金额则记录订单原始价格
if (orderPriceDetailDTO.getOriginalPrice() == null) {
orderPriceDetailDTO.setOriginalPrice(order.getFlowPrice());
}
//修改订单价格
order.setFlowPrice(orderPrice);
//订单修改金额=使用订单原始金额-修改后金额
orderPriceDetailDTO.setUpdatePrice(CurrencyUtil.sub(orderPriceDetailDTO.getOriginalPrice(), orderPrice));
orderPriceDetailDTO.setFlowPrice(orderPrice);
List<OrderItem> orderItems = updateOrderItemPrice(order);
//这里如果直接赋予订单金额,则累加可能会出现小数点,最后无法累加回去,所以用一个零时变量累加后,将平台佣金赋予对象
PriceDetailDTO tempPriceDetail = new PriceDetailDTO();
tempPriceDetail.accumulationPriceDTO(orderItems.stream().map(OrderItem::getPriceDetailDTO).collect(Collectors.toList()));
orderPriceDetailDTO.setPlatFormCommission(tempPriceDetail.getPlatFormCommission());
orderPriceDetailDTO.countBill();
//修改订单
order.setPriceDetail(JSONUtil.toJsonStr(orderPriceDetailDTO));
orderService.updateById(order);
@@ -148,19 +154,14 @@ public class OrderPriceServiceImpl implements OrderPriceService {
*
* @param order 订单
*/
private void updateOrderItemPrice(Order order) {
private List<OrderItem> updateOrderItemPrice(Order order) {
List<OrderItem> orderItems = orderItemService.getByOrderSn(order.getSn());
for (OrderItem orderItem : orderItems) {
//获取订单货物价格信息
PriceDetailDTO priceDetailDTO = orderItem.getPriceDetailDTO();
//如果未修改过金额则记录订单原始价格
if (priceDetailDTO.getOriginalPrice() == null) {
priceDetailDTO.setOriginalPrice(orderItem.getFlowPrice());
}
//获取订单货物占订单金额的百分比
//SKU占总订单 金额的百分比
Double priceFluctuationRatio = CurrencyUtil.div(priceDetailDTO.getOriginalPrice(), order.getPriceDetailDTO().getOriginalPrice());
//计算修改后的订单货物金额
@@ -168,22 +169,22 @@ public class OrderPriceServiceImpl implements OrderPriceService {
//记录修改金额
priceDetailDTO.setUpdatePrice(CurrencyUtil.sub(priceDetailDTO.getOriginalPrice(), flowPrice));
priceDetailDTO.setFlowPrice(flowPrice);
//计算平台佣金=交易金额*分类佣金比例/100
Double platFormCommission = CurrencyUtil.div(CurrencyUtil.mul(flowPrice, categoryService.getById(orderItem.getCategoryId()).getCommissionRate()), 100);
priceDetailDTO.setPlatFormCommission(platFormCommission);
//最终结算金额 = 流水金额-平台佣金-分销提佣
double billPrice = CurrencyUtil.sub(CurrencyUtil.sub(priceDetailDTO.getFlowPrice(), priceDetailDTO.getPlatFormCommission()),
priceDetailDTO.getDistributionCommission());
priceDetailDTO.setBillPrice(billPrice);
//修改订单货物金额
orderItem.setFlowPrice(flowPrice);
priceDetailDTO.countBill();
orderItem.setPriceDetail(JSONUtil.toJsonStr(priceDetailDTO));
orderItemService.update(orderItem, new LambdaUpdateWrapper<OrderItem>().eq(OrderItem::getId, orderItem.getId()));
}
return orderItems;
}
}

View File

@@ -17,7 +17,6 @@ import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.order.cart.entity.vo.CartSkuVO;
import cn.lili.modules.order.cart.entity.vo.FullDiscountVO;
import cn.lili.modules.promotion.entity.dos.PointsGoods;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dos.SeckillApply;
import cn.lili.modules.promotion.entity.dto.BasePromotion;