订单平台佣金bug修复,价格计算相关优化
This commit is contained in:
@@ -58,6 +58,14 @@ public interface GoodsService extends IService<Goods> {
|
||||
*/
|
||||
GoodsVO getGoodsVO(String goodsId);
|
||||
|
||||
/**
|
||||
* 数据库查询商品VO
|
||||
*
|
||||
* @param goodsId 商品id
|
||||
* @return 商品VO
|
||||
*/
|
||||
GoodsVO getGoodsVOFromDB(String goodsId);
|
||||
|
||||
/**
|
||||
* 商品查询
|
||||
*
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user