Commit 2bca120b authored by 332784038@qq.com's avatar 332784038@qq.com

应收单业务汇率计算业务修改

parent a8b0fd68
...@@ -65,8 +65,21 @@ COMMIT; ...@@ -65,8 +65,21 @@ COMMIT;
ALTER TABLE `ecw_currency_rate` ADD COLUMN `source_currency_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '原币种代码' AFTER `source_id`; ALTER TABLE `ecw_currency_rate` ADD COLUMN `source_currency_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '原币种代码' AFTER `source_id`;
ALTER TABLE `ecw_currency_rate` ADD COLUMN `target_currency_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '目标种代码' AFTER `target_id`; ALTER TABLE `ecw_currency_rate` ADD COLUMN `target_currency_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '目标种代码' AFTER `target_id`;
update `ecw_currency_rate` r left join `ecw_currency` c1 on r.source_id = c1.id left join `ecw_currency` c2 on r.target_id = c2.id update `ecw_currency_rate` r left join `ecw_currency` c1 on r.source_id = c1.id left join `ecw_currency` c2 on r.target_id = c2.id
set r.`source_currency_code` = c1.fuhao, r.`target_currency_code` = c2.fuhao; set r.`source_currency_code` = c1.fuhao, r.`target_currency_code` = c2.fuhao;
\ No newline at end of file
ALTER TABLE `ecw_receivable` ADD COLUMN `source_amount` DECIMAL(14, 4) DEFAULT NULL COMMENT '原币种基准金额' AFTER `fee_type`;
ALTER TABLE `ecw_receivable` ADD COLUMN `source_currency_code` varchar(255) DEFAULT NULL COMMENT '原币种代码' AFTER `source_amount`;
ALTER TABLE `ecw_receivable` ADD COLUMN `target_amount` DECIMAL(14, 4) DEFAULT NULL COMMENT '支付币种基准金额' AFTER `source_currency_code`;
ALTER TABLE `ecw_receivable` ADD COLUMN `target_currency_code` varchar(255) DEFAULT NULL COMMENT '支付币种代码' AFTER `target_amount`;
ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_source_amount` DECIMAL(14, 4) DEFAULT NULL COMMENT '目的国币种汇兑原币种基准金额' AFTER `target_currency_code`;
ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_target_amount` DECIMAL(14, 4) DEFAULT NULL COMMENT '目的国币种支付基准金额' AFTER `dest_country_source_amount`;
ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_target_currency_code` varchar(255) DEFAULT NULL COMMENT '目的国币种代码' AFTER `dest_country_target_amount`;
ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_sub_source_amount` DECIMAL(14, 4) DEFAULT NULL COMMENT '目的国副币种汇兑原币种基准金额' AFTER `dest_country_target_currency_code`;
ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_sub_target_amount` DECIMAL(14, 4) DEFAULT NULL COMMENT '目的国副币种支付基准金额' AFTER `dest_country_sub_source_amount`;
ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_sub_target_currency_code` varchar(255) DEFAULT NULL COMMENT '目的国副币种代码' AFTER `dest_country_sub_target_amount`;
...@@ -113,6 +113,23 @@ public class CurrecyApiImpl implements CurrencyApi { ...@@ -113,6 +113,23 @@ public class CurrecyApiImpl implements CurrencyApi {
@Override @Override
public List<ExchangeRateRespDTO> getAllCurrencyRate() { public List<ExchangeRateRespDTO> getAllCurrencyRate() {
List<CurrencyRateDO> currencyRateDOS = currencyRateService.queryAll(); List<CurrencyRateDO> currencyRateDOS = currencyRateService.queryAll();
return CurrencyRateConvert.INSTANCE.convertList2(currencyRateDOS); return convertRateRespList(currencyRateDOS);
}
private List<ExchangeRateRespDTO> convertRateRespList(List<CurrencyRateDO> currencyRateDOS) {
return currencyRateDOS.stream().map(this::convertRateResp).collect(Collectors.toList());
}
private ExchangeRateRespDTO convertRateResp(CurrencyRateDO currencyRateDO) {
ExchangeRateRespDTO dto = new ExchangeRateRespDTO();
dto.setSourceCurrencyAmount(currencyRateDO.getSourceAmount());
dto.setSourceCurrencyId(currencyRateDO.getSourceId());
dto.setSourceCurrencyCode(currencyRateDO.getSourceCurrencyCode());
dto.setTargetCurrencyAmount(currencyRateDO.getTargetAmount());
dto.setTargetCurrencyId(currencyRateDO.getTargetId());
dto.setTargetCurrencyCode(currencyRateDO.getTargetCurrencyCode());
dto.setExpireDate(currencyRateDO.getExpiration());
dto.setCurrencyRate(currencyRateService.rate(currencyRateDO.getSourceAmount(), currencyRateDO.getTargetAmount()));
return dto;
} }
} }
...@@ -68,7 +68,7 @@ public interface CurrencyRateService { ...@@ -68,7 +68,7 @@ public interface CurrencyRateService {
Date now = new Date(); Date now = new Date();
if (now.compareTo(entity.getExpiration()) > 0) { if (now.compareTo(entity.getExpiration()) > 0) {
throw exception(CURRENCY_RATE_EXPIRED, String.valueOf(sourceId), String.valueOf(targetId)); throw exception(CURRENCY_RATE_EXPIRED, entity.getSourceCurrencyCode(), entity.getTargetCurrencyCode());
} }
return entity; return entity;
......
...@@ -185,4 +185,53 @@ public class ReceivableDO extends BaseDO { ...@@ -185,4 +185,53 @@ public class ReceivableDO extends BaseDO {
* 额外费用副币种汇率(用于报表,跟费用类型相关) * 额外费用副币种汇率(用于报表,跟费用类型相关)
*/ */
private BigDecimal destCountrySubRate; private BigDecimal destCountrySubRate;
/**
* 原币种基准金额
*/
private BigDecimal sourceAmount;
/**
* 原币种代码
*/
private String sourceCurrencyCode;
/**
* 支付币种基准金额
*/
private BigDecimal targetAmount;
/**
* 支付币种代码
*/
private String targetCurrencyCode;
/**
* 目的国币种汇兑原币种基准金额
*/
private BigDecimal destCountrySourceAmount;
/**
* 目的国币种支付基准金额
*/
private BigDecimal destCountryTargetAmount;
/**
* 目的国币种代码
*/
private String destCountryTargetCurrencyCode;
/**
* 目的国币副种汇兑原币种基准金额
*/
private BigDecimal destCountrySubSourceAmount;
/**
* 目的国副币种支付基准金额
*/
private BigDecimal destCountrySubTargetAmount;
/**
* 目的国副币种代码
*/
private String destCountrySubTargetCurrencyCode;
} }
...@@ -61,6 +61,7 @@ import java.util.concurrent.ExecutionException; ...@@ -61,6 +61,7 @@ import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.ecw.enums.ErrorCodeConstants.CURRENCY_RATE_EXPIRED;
import static cn.iocoder.yudao.module.wealth.enums.BoxReportConstant.*; import static cn.iocoder.yudao.module.wealth.enums.BoxReportConstant.*;
import static cn.iocoder.yudao.module.wealth.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.wealth.enums.ErrorCodeConstants.*;
...@@ -960,8 +961,8 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec ...@@ -960,8 +961,8 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec
List<ReceivableIncomeBelong> receivableIncomeBelongs = receivableIncomeBelongMap.get(boxReceivable.getId()); List<ReceivableIncomeBelong> receivableIncomeBelongs = receivableIncomeBelongMap.get(boxReceivable.getId());
BigDecimal baseCurrencyAmount; BigDecimal baseCurrencyAmount;
if (boxReceivable.getBaseAmount() == null) { if (boxReceivable.getBaseAmount() == null) {
BigDecimal exchangeRate = getExchangeRate(allCurrencyRate, boxReceivable.getCurrencyId(), boxReceivable.getBaseCurrencyId()); ExchangeRateRespDTO exchangeRate = getExchangeRate(allCurrencyRate, boxReceivable.getCurrencyId(), boxReceivable.getBaseCurrencyId());
baseCurrencyAmount = boxReceivable.getTotalAmount().multiply(exchangeRate); baseCurrencyAmount = boxReceivable.getTotalAmount().multiply(exchangeRate.getTargetCurrencyAmount()).divide(exchangeRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP);
} else { } else {
baseCurrencyAmount = boxReceivable.getBaseAmount(); baseCurrencyAmount = boxReceivable.getBaseAmount();
} }
...@@ -982,17 +983,18 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec ...@@ -982,17 +983,18 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec
if (boxReceivable.getCurrencyId().equals(receivableCurrency)) { if (boxReceivable.getCurrencyId().equals(receivableCurrency)) {
receivableBoxAmount.receivableTotalSettle.addAmount(currencyAmount.getAmount()); receivableBoxAmount.receivableTotalSettle.addAmount(currencyAmount.getAmount());
} else { } else {
receivableBoxAmount.receivableTotalSettle.addAmount(currencyAmount.getAmount().multiply(getExchangeRate(allCurrencyRate, boxReceivable.getCurrencyId(), receivableCurrency))); ExchangeRateRespDTO exchangeRate = getExchangeRate(allCurrencyRate, boxReceivable.getCurrencyId(), receivableCurrency);
receivableBoxAmount.receivableTotalSettle.addAmount(currencyAmount.getAmount().multiply(exchangeRate.getTargetCurrencyAmount()).divide(exchangeRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
} }
// 判断属于哪种费用 0运费,1 清关费,2 额外费用 // 判断属于哪种费用 0运费,1 清关费,2 额外费用
Integer feeType = this.getFeeType(boxReceivable.getFeeType()); Integer feeType = this.getFeeType(boxReceivable.getFeeType());
BigDecimal discount = boxReceivable.getDiscountTotal() == null ? BigDecimal.ZERO : boxReceivable.getDiscountTotal(); BigDecimal discount = boxReceivable.getDiscountTotal() == null ? BigDecimal.ZERO : boxReceivable.getDiscountTotal();
BigDecimal notWrittenOff = Objects.equals(boxReceivable.getWriteOffAmount(), BigDecimal.ZERO) ? currencyAmount.getAmount() : currencyAmount.getAmount().subtract(boxReceivable.getWriteOffAmount()); BigDecimal notWrittenOff = Objects.equals(boxReceivable.getWriteOffAmount(), BigDecimal.ZERO) ? currencyAmount.getAmount() : currencyAmount.getAmount().subtract(boxReceivable.getWriteOffAmount());
BigDecimal freightRate = getExchangeRate(allCurrencyRate, boxReceivable.getCurrencyId(), freightCurrency); ExchangeRateRespDTO freightRate = getExchangeRate(allCurrencyRate, boxReceivable.getCurrencyId(), freightCurrency);
BigDecimal clearanceRate = getExchangeRate(allCurrencyRate, boxReceivable.getCurrencyId(), clearanceCurrency); ExchangeRateRespDTO clearanceRate = getExchangeRate(allCurrencyRate, boxReceivable.getCurrencyId(), clearanceCurrency);
BigDecimal otherFeeRate = getExchangeRate(allCurrencyRate, boxReceivable.getCurrencyId(), otherFeeCurrency); ExchangeRateRespDTO otherFeeRate = getExchangeRate(allCurrencyRate, boxReceivable.getCurrencyId(), otherFeeCurrency);
BigDecimal otherSubRate = getExchangeRate(allCurrencyRate, freightCurrency, otherSubCurrency); ExchangeRateRespDTO otherSubRate = getExchangeRate(allCurrencyRate, freightCurrency, otherSubCurrency);
switch (feeType) { switch (feeType) {
case 0: case 0:
if (boxReceivable.getCurrencyId().equals(freightCurrency)) { if (boxReceivable.getCurrencyId().equals(freightCurrency)) {
...@@ -1000,17 +1002,31 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec ...@@ -1000,17 +1002,31 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec
receivableBoxAmount.receivableDiscountFreight.addAmount(discount); receivableBoxAmount.receivableDiscountFreight.addAmount(discount);
receivableBoxAmount.receivableUnsettledFreight.addAmount(notWrittenOff); receivableBoxAmount.receivableUnsettledFreight.addAmount(notWrittenOff);
} else { } else {
receivableBoxAmount.receivableDetailFreight.addAmount(currencyAmount.getAmount().multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : freightRate)); if (boxReceivable.getDestCountrySourceAmount() != null && boxReceivable.getDestCountryTargetAmount() != null) {
receivableBoxAmount.receivableDiscountFreight.addAmount(discount.multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : freightRate)); receivableBoxAmount.receivableDetailFreight.addAmount(currencyAmount.getAmount().multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableUnsettledFreight.addAmount(notWrittenOff.multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : freightRate)); receivableBoxAmount.receivableDiscountFreight.addAmount(discount.multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableUnsettledFreight.addAmount(notWrittenOff.multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
} else {
receivableBoxAmount.receivableDetailFreight.addAmount(currencyAmount.getAmount().multiply(freightRate.getTargetCurrencyAmount()).divide(freightRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableDiscountFreight.addAmount(discount.multiply(freightRate.getTargetCurrencyAmount()).divide(freightRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableUnsettledFreight.addAmount(notWrittenOff.multiply(freightRate.getTargetCurrencyAmount()).divide(freightRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
} }
// 计算始发国或目的国实收 // 计算始发国或目的国实收
if (receivableIncomeBelongs != null) { if (receivableIncomeBelongs != null) {
for (ReceivableIncomeBelong receivableIncomeBelong : receivableIncomeBelongs) { for (ReceivableIncomeBelong receivableIncomeBelong : receivableIncomeBelongs) {
if (receivableIncomeBelong.getIncomeBelong() == 1) { if (receivableIncomeBelong.getIncomeBelong() == 1) {
receivableBoxAmount.receivableStartCountryFreight.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : freightRate)); if (boxReceivable.getDestCountrySourceAmount() != null && boxReceivable.getDestCountryTargetAmount() != null) {
receivableBoxAmount.receivableStartCountryFreight.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
} else {
receivableBoxAmount.receivableStartCountryFreight.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(freightRate.getTargetCurrencyAmount()).divide(freightRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
} else if (receivableIncomeBelong.getIncomeBelong() == 0) { } else if (receivableIncomeBelong.getIncomeBelong() == 0) {
receivableBoxAmount.receivableDestCountryFreight.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : freightRate)); if (boxReceivable.getDestCountrySourceAmount() != null && boxReceivable.getDestCountryTargetAmount() != null) {
receivableBoxAmount.receivableDestCountryFreight.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
} else {
receivableBoxAmount.receivableDestCountryFreight.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(freightRate.getTargetCurrencyAmount()).divide(freightRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
} }
} }
} }
...@@ -1021,17 +1037,31 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec ...@@ -1021,17 +1037,31 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec
receivableBoxAmount.receivableDiscountClearance.addAmount(discount); receivableBoxAmount.receivableDiscountClearance.addAmount(discount);
receivableBoxAmount.receivableUnsettledClearance.addAmount(notWrittenOff); receivableBoxAmount.receivableUnsettledClearance.addAmount(notWrittenOff);
} else { } else {
receivableBoxAmount.receivableDetailClearance.addAmount(currencyAmount.getAmount().multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : clearanceRate)); if (boxReceivable.getDestCountrySourceAmount() != null && boxReceivable.getDestCountryTargetAmount() != null) {
receivableBoxAmount.receivableDiscountClearance.addAmount(discount.multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : clearanceRate)); receivableBoxAmount.receivableDetailClearance.addAmount(currencyAmount.getAmount().multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableUnsettledClearance.addAmount(notWrittenOff.multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : clearanceRate)); receivableBoxAmount.receivableDiscountClearance.addAmount(discount.multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableUnsettledClearance.addAmount(notWrittenOff.multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
}else {
receivableBoxAmount.receivableDetailClearance.addAmount(currencyAmount.getAmount().multiply(clearanceRate.getTargetCurrencyAmount()).divide(clearanceRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableDiscountClearance.addAmount(discount.multiply(clearanceRate.getTargetCurrencyAmount()).divide(clearanceRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableUnsettledClearance.addAmount(notWrittenOff.multiply(clearanceRate.getTargetCurrencyAmount()).divide(clearanceRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
} }
// 计算始发国或目的国实收 // 计算始发国或目的国实收
if (receivableIncomeBelongs != null) { if (receivableIncomeBelongs != null) {
for (ReceivableIncomeBelong receivableIncomeBelong : receivableIncomeBelongs) { for (ReceivableIncomeBelong receivableIncomeBelong : receivableIncomeBelongs) {
if (receivableIncomeBelong.getIncomeBelong() == 1) { if (receivableIncomeBelong.getIncomeBelong() == 1) {
receivableBoxAmount.receivableStartCountryClearance.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : clearanceRate)); if (boxReceivable.getDestCountrySourceAmount() != null && boxReceivable.getDestCountryTargetAmount() != null) {
receivableBoxAmount.receivableStartCountryClearance.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
} else {
receivableBoxAmount.receivableStartCountryClearance.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(clearanceRate.getTargetCurrencyAmount()).divide(clearanceRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
} else if (receivableIncomeBelong.getIncomeBelong() == 0) { } else if (receivableIncomeBelong.getIncomeBelong() == 0) {
receivableBoxAmount.receivableDestCountryClearance.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : clearanceRate)); if (boxReceivable.getDestCountrySourceAmount() != null && boxReceivable.getDestCountryTargetAmount() != null) {
receivableBoxAmount.receivableDestCountryClearance.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
} else {
receivableBoxAmount.receivableDestCountryClearance.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(clearanceRate.getTargetCurrencyAmount()).divide(clearanceRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
} }
} }
} }
...@@ -1042,19 +1072,41 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec ...@@ -1042,19 +1072,41 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec
receivableBoxAmount.receivableDiscountOtherFee.addAmount(discount); receivableBoxAmount.receivableDiscountOtherFee.addAmount(discount);
receivableBoxAmount.receivableUnsettledOtherFee.addAmount(notWrittenOff); receivableBoxAmount.receivableUnsettledOtherFee.addAmount(notWrittenOff);
} else { } else {
receivableBoxAmount.receivableDetailOtherFee.addAmount(currencyAmount.getAmount().multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : otherFeeRate)); if (boxReceivable.getDestCountrySourceAmount() != null && boxReceivable.getDestCountryTargetAmount() != null) {
receivableBoxAmount.receivableDiscountOtherFee.addAmount(discount.multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : otherFeeRate)); receivableBoxAmount.receivableDetailOtherFee.addAmount(currencyAmount.getAmount().multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableUnsettledOtherFee.addAmount(notWrittenOff.multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : otherFeeRate)); receivableBoxAmount.receivableDiscountOtherFee.addAmount(discount.multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableUnsettledOtherFee.addAmount(notWrittenOff.multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
}else {
receivableBoxAmount.receivableDetailOtherFee.addAmount(currencyAmount.getAmount().multiply(otherFeeRate.getTargetCurrencyAmount()).divide(otherFeeRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableDiscountOtherFee.addAmount(discount.multiply(otherFeeRate.getTargetCurrencyAmount()).divide(otherFeeRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
receivableBoxAmount.receivableUnsettledOtherFee.addAmount(notWrittenOff.multiply(otherFeeRate.getTargetCurrencyAmount()).divide(otherFeeRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
} }
// 计算始发国或目的国实收 // 计算始发国或目的国实收
if (receivableIncomeBelongs != null) { if (receivableIncomeBelongs != null) {
for (ReceivableIncomeBelong receivableIncomeBelong : receivableIncomeBelongs) { for (ReceivableIncomeBelong receivableIncomeBelong : receivableIncomeBelongs) {
if (receivableIncomeBelong.getIncomeBelong() == 1) { if (receivableIncomeBelong.getIncomeBelong() == 1) {
receivableBoxAmount.receivableStartCountryOtherFee.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : otherFeeRate)); if (boxReceivable.getDestCountrySourceAmount() != null && boxReceivable.getDestCountryTargetAmount() != null) {
receivableBoxAmount.receivableStartCountryOtherFeeSub.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountrySubRate() != null ? boxReceivable.getDestCountrySubRate() : otherSubRate)); receivableBoxAmount.receivableStartCountryOtherFee.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
} else {
receivableBoxAmount.receivableStartCountryOtherFee.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(otherFeeRate.getTargetCurrencyAmount()).divide(otherFeeRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
if (boxReceivable.getDestCountrySubSourceAmount() != null && boxReceivable.getDestCountrySubTargetAmount() != null) {
receivableBoxAmount.receivableStartCountryOtherFeeSub.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountrySubTargetAmount()).divide(boxReceivable.getDestCountrySubTargetAmount(), 2, RoundingMode.HALF_UP));
} else {
receivableBoxAmount.receivableStartCountryOtherFeeSub.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(otherSubRate.getTargetCurrencyAmount()).divide(otherSubRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
} else if (receivableIncomeBelong.getIncomeBelong() == 0) { } else if (receivableIncomeBelong.getIncomeBelong() == 0) {
receivableBoxAmount.receivableDestCountryOtherFee.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryRate() != null ? boxReceivable.getDestCountryRate() : otherFeeRate)); if (boxReceivable.getDestCountrySourceAmount() != null && boxReceivable.getDestCountryTargetAmount() != null) {
receivableBoxAmount.receivableDestCountryOtherFeeSub.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountrySubRate() != null ? boxReceivable.getDestCountrySubRate() : otherSubRate)); receivableBoxAmount.receivableDestCountryOtherFee.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountryTargetAmount()).divide(boxReceivable.getDestCountryTargetAmount(), 2, RoundingMode.HALF_UP));
} else {
receivableBoxAmount.receivableDestCountryOtherFee.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(otherFeeRate.getTargetCurrencyAmount()).divide(otherFeeRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
if (boxReceivable.getDestCountrySubSourceAmount() != null && boxReceivable.getDestCountrySubTargetAmount() != null) {
receivableBoxAmount.receivableDestCountryOtherFeeSub.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(boxReceivable.getDestCountrySubTargetAmount()).divide(boxReceivable.getDestCountrySubTargetAmount(), 2, RoundingMode.HALF_UP));
} else {
receivableBoxAmount.receivableDestCountryOtherFeeSub.addAmount(receivableIncomeBelong.getWriteOffAmount().multiply(otherSubRate.getTargetCurrencyAmount()).divide(otherSubRate.getSourceCurrencyAmount(), 2, RoundingMode.HALF_UP));
}
} }
} }
} }
...@@ -1232,19 +1284,49 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec ...@@ -1232,19 +1284,49 @@ public class ReceivableServiceImpl extends AbstractService<ReceivableMapper, Rec
return writeOffPercent; return writeOffPercent;
} }
// /**
// * 获取汇率
// */
// private BigDecimal getExchangeRate(List<ExchangeRateRespDTO> allCurrencyRate, Long sourceId, Long targetId) {
// if (sourceId.equals(targetId)) {
// return BigDecimal.ONE;
// }
// for (ExchangeRateRespDTO exchangeRateRespDTO : allCurrencyRate) {
// if (exchangeRateRespDTO.getSourceCurrencyId().equals(sourceId) && exchangeRateRespDTO.getTargetCurrencyId().equals(targetId)) {
// return exchangeRateRespDTO.getTargetCurrencyAmount().divide(exchangeRateRespDTO.getSourceCurrencyAmount(), 6, RoundingMode.HALF_UP);
// }
// }
// return BigDecimal.ONE;
// }
/** /**
* 获取汇率 * 获取汇率详情
*/ */
private BigDecimal getExchangeRate(List<ExchangeRateRespDTO> allCurrencyRate, Long sourceId, Long targetId) { private ExchangeRateRespDTO getExchangeRate(List<ExchangeRateRespDTO> allCurrencyRate, Long sourceId, Long targetId) {
if (sourceId.equals(targetId)) { if (sourceId.equals(targetId)) {
return BigDecimal.ONE; ExchangeRateRespDTO exchangeRateRespDTO = new ExchangeRateRespDTO();
exchangeRateRespDTO.setSourceCurrencyId(sourceId);
exchangeRateRespDTO.setSourceCurrencyAmount(BigDecimal.ONE);
exchangeRateRespDTO.setTargetCurrencyId(targetId);
exchangeRateRespDTO.setTargetCurrencyAmount(BigDecimal.ONE);
return exchangeRateRespDTO;
} }
for (ExchangeRateRespDTO exchangeRateRespDTO : allCurrencyRate) { for (ExchangeRateRespDTO exchangeRateRespDTO : allCurrencyRate) {
if (exchangeRateRespDTO.getSourceCurrencyId().equals(sourceId) && exchangeRateRespDTO.getTargetCurrencyId().equals(targetId)) { if (exchangeRateRespDTO.getSourceCurrencyId().equals(sourceId) && exchangeRateRespDTO.getTargetCurrencyId().equals(targetId)) {
return exchangeRateRespDTO.getTargetCurrencyAmount().divide(exchangeRateRespDTO.getSourceCurrencyAmount(), 6, RoundingMode.HALF_UP); Date now = new Date();
if (now.compareTo(exchangeRateRespDTO.getExpireDate()) > 0) {
throw exception(CURRENCY_RATE_EXPIRED, exchangeRateRespDTO.getSourceCurrencyCode(), exchangeRateRespDTO.getTargetCurrencyCode());
}
return exchangeRateRespDTO;
} }
} }
return BigDecimal.ONE; // TODO 正常来说这里不会有不存在的汇率,在前期订单生成阶段应该都有初始数据定义
ExchangeRateRespDTO exchangeRateRespDTO = new ExchangeRateRespDTO();
exchangeRateRespDTO.setSourceCurrencyId(sourceId);
exchangeRateRespDTO.setSourceCurrencyAmount(BigDecimal.ONE);
exchangeRateRespDTO.setTargetCurrencyId(targetId);
exchangeRateRespDTO.setTargetCurrencyAmount(BigDecimal.ONE);
return exchangeRateRespDTO;
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment