feat(sales): 重构销售退货单优惠金额计算逻辑
-移除不必要的日志输出 - 优化实退金额计算方法,考虑各种优惠类型 - 新增累加优惠金额功能,用于后续传给U8C - 在RerturnGoodsOrderSearchDetails中添加平台优惠、商家优惠、达人优惠和支付优惠字段
This commit is contained in:
parent
74b9e1314b
commit
879b05d2ac
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
}
|
}
|
Loading…
Reference in New Issue