feat(sales): 重构销售退货单优惠金额计算逻辑

-移除不必要的日志输出
- 优化实退金额计算方法,考虑各种优惠类型
- 新增累加优惠金额功能,用于后续传给U8C
- 在RerturnGoodsOrderSearchDetails中添加平台优惠、商家优惠、达人优惠和支付优惠字段
This commit is contained in:
liuy 2024-11-02 15:12:50 +08:00
parent 74b9e1314b
commit 879b05d2ac
3 changed files with 164 additions and 7 deletions

View File

@ -1718,7 +1718,7 @@ public class SoSaleOutPluginInitializerToC extends PluginBaseEntity {
accumulatedDiscountAmountDef(sonDetailsDtoList); accumulatedDiscountAmountDef(sonDetailsDtoList);
//累加各类优惠 //累加各类优惠
logger.info("{}个明细行发生了合并!", sonDetailsDtoList.size()); // logger.info("{}个明细行发生了合并!", sonDetailsDtoList.size());
return sonDetailsDto; return sonDetailsDto;
} else { } else {
logger.error("sonDetailsDtoList集合是空的"); logger.error("sonDetailsDtoList集合是空的");
@ -3356,7 +3356,7 @@ public class SoSaleOutPluginInitializerToC extends PluginBaseEntity {
} }
/** /**
* 累加优惠金额放在自定义项里 * 累加优惠金额放在自定义项里最后传给U8C
* *
* @param sonDetailsDtoList OFS销售出库单明细行(按纬度汇总好的) * @param sonDetailsDtoList OFS销售出库单明细行(按纬度汇总好的)
* @author liuyang * @author liuyang

View File

@ -1110,7 +1110,7 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity {
List<com.hzya.frame.ttxofs.dto.ofssalesordersearch.HeaderDetailsDto> headerDetailsDtos = queryBatchOfsOrder(returnGoodHeaderDetailsDataDtoList1); List<com.hzya.frame.ttxofs.dto.ofssalesordersearch.HeaderDetailsDto> headerDetailsDtos = queryBatchOfsOrder(returnGoodHeaderDetailsDataDtoList1);
findOfsOrder(headerDetailsDtos, returnGoodHeaderDetailsDataDtoList1); findOfsOrder(headerDetailsDtos, returnGoodHeaderDetailsDataDtoList1);
//计算OFS销售订单优惠金额分摊到明细行 //计算OFS销售订单优惠金额分摊到明细行
ofsOrderAfterSalesAmountAllocationUtil.batchTocSalesAmountAllocation(rerturnGoodsOrderSearchData); // ofsOrderAfterSalesAmountAllocationUtil.batchTocSalesAmountAllocation(rerturnGoodsOrderSearchData);
//初始化公司档案对照关系 //初始化公司档案对照关系
Map<String, String> comparisonCompanyArchives = queryU8CEntityUtil.queryBdDefDocByPkDefDocAll(); Map<String, String> comparisonCompanyArchives = queryU8CEntityUtil.queryBdDefDocByPkDefDocAll();
@ -1502,8 +1502,9 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity {
String totalAmount = getFloorPrice(isCheckShopChoose, bdInvmandocEntity, header, goodsRertunSonDetailsDto, mapList); String totalAmount = getFloorPrice(isCheckShopChoose, bdInvmandocEntity, header, goodsRertunSonDetailsDto, mapList);
if (totalAmount == null) { if (totalAmount == null) {
//取O实退金额 //取O实退金额
RerturnGoodsOrderSearchDetails afterSalesOrder = findAfterSalesOrderV2(goodsRertunSonDetailsDto, rerturnGoodsOrderSearchData); // RerturnGoodsOrderSearchDetails afterSalesOrder = findAfterSalesOrderV2(goodsRertunSonDetailsDto, rerturnGoodsOrderSearchData);
totalAmount = afterSalesOrder.getTotalAmount(); // totalAmount = afterSalesOrder.getTotalAmount();
totalAmount = accumulatedDiscounts(goodsRertunSonDetailsDto, rerturnGoodsOrderSearchData);
} }
//实付金额/实发数量 //实付金额/实发数量
@ -1520,9 +1521,10 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity {
goodsRertunSonDetailsDto.setGroupTotalPayAmount(groupTotalPayAmount); goodsRertunSonDetailsDto.setGroupTotalPayAmount(groupTotalPayAmount);
//累加优惠金额 //累加优惠金额
accumulationDiscountAmount(sonDetailsDtoList); // accumulationDiscountAmount(sonDetailsDtoList);
accumulatedDiscountAmountDef(sonDetailsDtoList);
logger.info("TOB{}个明细行发生了合并!", sonDetailsDtoList.size()); // logger.info("TOB{}个明细行发生了合并!", sonDetailsDtoList.size());
return goodsRertunSonDetailsDto; return goodsRertunSonDetailsDto;
} else { } else {
logger.info("sonDetailsDtoList集合是空的"); logger.info("sonDetailsDtoList集合是空的");
@ -2573,4 +2575,150 @@ public class SoSaleReturnPluginInitializerToC extends PluginBaseEntity {
} }
return totalPayAmount; return totalPayAmount;
} }
/**
* 累加应收金额=实退金额+达人优惠+支付优惠+平台优惠
*
* @param goodsRertunSonDetailsDto OFS售后入库单明细行
* @param rerturnGoodsOrderSearchData OFS售后订单
* @author liuyang
*/
private String accumulatedDiscounts(GoodsRertunSonDetailsDto goodsRertunSonDetailsDto, RerturnGoodsOrderSearchData rerturnGoodsOrderSearchData) throws Exception {
Assert.notNull(goodsRertunSonDetailsDto, "goodsRertunSonDetailsDto OFS售后入库单明细行不能为空");
Assert.notNull(rerturnGoodsOrderSearchData, "rerturnGoodsOrderSearchData OFS售后订单不能为空");
//O售后入库单表头
StockinOrderSearchResponse.StockinOrder.StockinH header1 = goodsRertunSonDetailsDto.getHeader();
//O售后订单表头+明细行
RerturnGoodsOrderSearchHeader header = rerturnGoodsOrderSearchData.getHeader();
List<RerturnGoodsOrderSearchDetails> details = rerturnGoodsOrderSearchData.getDetails();
//根据入库单明细匹配售后订单明细行
RerturnGoodsOrderSearchDetails targetDetails = null;
for (int i = 0; i < details.size(); i++) {
RerturnGoodsOrderSearchDetails rerturnGoodsOrderSearchDetails = details.get(i);
if (goodsRertunSonDetailsDto.getRefOrderDetailId() != null && rerturnGoodsOrderSearchDetails.getId() != null) {
if (rerturnGoodsOrderSearchDetails.getId().equals(goodsRertunSonDetailsDto.getRefOrderDetailId())) {
targetDetails = rerturnGoodsOrderSearchDetails;
}
}
}
Assert.notNull(targetDetails, "根据OFS售后入库单细行(refOrderDetailId)无法匹配售后订单明细行", goodsRertunSonDetailsDto.getRefOrderDetailId());
//售后订单明细行-退货金额
String totalAmount = targetDetails.getTotalAmount();
Assert.notNull(totalAmount, "售后订单:{} 存货明细行:{} 退货金额不能为空!", header.getCode(), targetDetails.getSkuCode());
Assert.state(!"".equals(totalAmount), "售后订单:{} 存货明细行:{} 退货金额不能为空!", header.getCode(), targetDetails.getSkuCode());
//售后订单明细行-请求数量
//实退数量存在可能为0的情况如果用退货金额/实退数量可能会抛出异常
String requestQty = targetDetails.getRequestQty();
Assert.notNull(requestQty, "售后订单:{} 存货明细行:{} 请求数量不能为空!", header.getCode(), targetDetails.getSkuCode());
Assert.state(!"".equals(requestQty), "售后订单:{} 存货明细行:{} 请求数量不能为空!", header.getCode(), targetDetails.getSkuCode());
//通过退货金额/请求数量=含税单价
BigDecimal unitPriceIncludingTax = new BigDecimal(totalAmount).divide(new BigDecimal(requestQty), 20, BigDecimal.ROUND_HALF_UP);
//含税单价*O售后入库单实退数量=实退金额
BigDecimal actualRefundAmount = unitPriceIncludingTax.multiply(new BigDecimal(requestQty)).setScale(4, BigDecimal.ROUND_HALF_UP);
//出库对应的实退=含税单价(actualRefundAmount)*出库单实退数量
String receivedQty = goodsRertunSonDetailsDto.getReceivedQty();
Assert.notNull(receivedQty, "售后入库单号:{} 售后入库单明细行主键:{} 实收数量不能为空receivedQty", header1.getCode(), goodsRertunSonDetailsDto.getId());
BigDecimal actualRefundAmountBigDecimal = new BigDecimal(receivedQty).multiply(actualRefundAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
//商家优惠不处理仅保存
String merchantDiscounts = targetDetails.getMerchantDiscounts();
//达人优惠
String expertDiscounts = targetDetails.getExpertDiscounts();
//支付优惠
String payDiscounts = targetDetails.getPayDiscounts();
//平台优惠
String platformDiscounts = targetDetails.getPlatformDiscounts();
BigDecimal totalBigDecimal = new BigDecimal("0");//相加总和
BigDecimal totalPayAmountBigDecimal = new BigDecimal("0");//实退金额
BigDecimal expertDiscountsBigDecimal = new BigDecimal("0");//达人优惠
BigDecimal payDiscountsBigDecimal = new BigDecimal("0");//支付优惠
BigDecimal platformDiscountsBigDecimal = new BigDecimal("0");//平台优惠
if (actualRefundAmountBigDecimal != null) {
totalPayAmountBigDecimal = actualRefundAmountBigDecimal;
}
if (expertDiscounts != null && !"".equals(expertDiscounts)) {
expertDiscountsBigDecimal = new BigDecimal(expertDiscounts);
}
if (payDiscounts != null && !"".equals(payDiscounts)) {
payDiscountsBigDecimal = new BigDecimal(payDiscounts);
}
if (platformDiscounts != null && !"".equals(platformDiscounts)) {
platformDiscountsBigDecimal = new BigDecimal(platformDiscounts);
}
//总和累加
totalBigDecimal = totalBigDecimal.add(totalPayAmountBigDecimal);
totalBigDecimal = totalBigDecimal.add(expertDiscountsBigDecimal);
totalBigDecimal = totalBigDecimal.add(payDiscountsBigDecimal);
totalBigDecimal = totalBigDecimal.add(platformDiscountsBigDecimal);
return totalBigDecimal.stripTrailingZeros().toPlainString();
}
/**
* 累加优惠金额放在自定义项里最后传给U8C
*
* @param sonDetailsDtoList OFS售后入库单明细行List集合(按纬度汇总好的)
* @author liuyang
*/
private void accumulatedDiscountAmountDef(List<GoodsRertunSonDetailsDto> sonDetailsDtoList) {
Assert.notNull(sonDetailsDtoList, "sonDetailsDtoList不能为空");
if (sonDetailsDtoList.size() > 0) {
BigDecimal platformDiscountsBigDecimal = new BigDecimal("0");//平台
BigDecimal merchantDiscountsBigDecimal = new BigDecimal("0");//商家
BigDecimal expertDiscountsBigDecimal = new BigDecimal("0");//达人
BigDecimal payDiscountsBigDecimal = new BigDecimal("0");//支付
for (int i = 0; i < sonDetailsDtoList.size(); i++) {
GoodsRertunSonDetailsDto goodsRertunSonDetailsDto = sonDetailsDtoList.get(i);
StockinOrderSearchResponse.StockinOrder.StockinH header = goodsRertunSonDetailsDto.getHeader();//O售后入库单表头
RerturnGoodsOrderSearchData rerturnGoodsOrderSearchData = header.getRerturnGoodsOrderSearchData();//OFS售后订单
Assert.notNull(rerturnGoodsOrderSearchData, "O售后订单不能为空 O售后入库单编码{}", header.getCode());
List<RerturnGoodsOrderSearchDetails> details = rerturnGoodsOrderSearchData.getDetails();//OFS售后订单明细行
if (details != null && details.size() > 0) {
for (int j = 0; j < details.size(); j++) {
RerturnGoodsOrderSearchDetails rerturnGoodsOrderSearchDetails = details.get(j);
if (goodsRertunSonDetailsDto.getRefOrderDetailId() != null && rerturnGoodsOrderSearchDetails.getId() != null) {
if (goodsRertunSonDetailsDto.getRefOrderDetailId().equals(rerturnGoodsOrderSearchDetails.getId())) {
//累加优惠
String platformDiscounts = rerturnGoodsOrderSearchDetails.getPlatformDiscounts();
String merchantDiscounts = rerturnGoodsOrderSearchDetails.getMerchantDiscounts();
String expertDiscounts = rerturnGoodsOrderSearchDetails.getExpertDiscounts();
String payDiscounts = rerturnGoodsOrderSearchDetails.getPayDiscounts();
if (platformDiscounts == null || "".equals(platformDiscounts.trim())) {
platformDiscounts = "0";
}
if (merchantDiscounts == null || "".equals(merchantDiscounts.trim())) {
merchantDiscounts = "0";
}
if (expertDiscounts == null || "".equals(expertDiscounts.trim())) {
expertDiscounts = "0";
}
if (payDiscounts == null || "".equals(payDiscounts.trim())) {
payDiscounts = "0";
}
platformDiscountsBigDecimal = platformDiscountsBigDecimal.add(new BigDecimal(platformDiscounts));
merchantDiscountsBigDecimal = merchantDiscountsBigDecimal.add(new BigDecimal(merchantDiscounts));
expertDiscountsBigDecimal = expertDiscountsBigDecimal.add(new BigDecimal(expertDiscounts));
payDiscountsBigDecimal = payDiscountsBigDecimal.add(new BigDecimal(payDiscounts));
}
}
}
}
}
sonDetailsDtoList.get(0).setVdef4(platformDiscountsBigDecimal);
sonDetailsDtoList.get(0).setVdef5(payDiscountsBigDecimal);
sonDetailsDtoList.get(0).setVdef6(expertDiscountsBigDecimal);
sonDetailsDtoList.get(0).setVdef7(merchantDiscountsBigDecimal);
}
}
} }

View File

@ -65,4 +65,13 @@ public class RerturnGoodsOrderSearchDetails {
private BigDecimal shareTargetExpertDiscounts; private BigDecimal shareTargetExpertDiscounts;
//分摊支付优惠 //分摊支付优惠
private BigDecimal shareTargetPayDiscounts; private BigDecimal shareTargetPayDiscounts;
//平台优惠
private String platformDiscounts;
//商家优惠
private String merchantDiscounts;
//达人优惠
private String expertDiscounts;
//支付优惠
private String payDiscounts;
} }