Commit 24a738b6 by jianan

分期出账优化、应收款应付款金额精度4

parent fa350536
......@@ -851,30 +851,31 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
List<FortuneSplitDto> splitList = fortuneSplitRequest.getFortuneSplitDtoList();
BigDecimal originalRuleAmount = originalFortune.getRuleAmount();
// 分期出账按财务习惯的「原币种金额」originalAmount 守恒(其他接口仍以 ruleAmount 为锚,不在此改动)。
BigDecimal baseOriginalAmount = originalFortune.getOriginalAmount();
int lastIndex = splitList.size() - 1;
// 3. 保单币金额守恒:Σ各期 ruleAmount 必须等于原锚。
// 各期金额由财务人工维护,系统不判断各期该填多少;总平不上时只给出末期找平金额,帮其通过校验。
BigDecimal totalRuleAmount = splitList.stream()
.map(FortuneSplitDto::getRuleAmount)
// 3. 原币种金额守恒:Σ各期 originalAmount 必须等于原记录 originalAmount。
// 各期金额由财务人工维护;总平不上时只给出末期找平金额,帮其通过校验。
BigDecimal totalOriginalAmount = splitList.stream()
.map(FortuneSplitDto::getOriginalAmount)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (totalRuleAmount.compareTo(originalRuleAmount) != 0) {
if (totalOriginalAmount.compareTo(baseOriginalAmount) != 0) {
BigDecimal sumBeforeLast = BigDecimal.ZERO;
for (int i = 0; i < lastIndex; i++) {
if (splitList.get(i).getRuleAmount() != null) {
sumBeforeLast = sumBeforeLast.add(splitList.get(i).getRuleAmount());
if (splitList.get(i).getOriginalAmount() != null) {
sumBeforeLast = sumBeforeLast.add(splitList.get(i).getOriginalAmount());
}
}
// 末期找平金额 = 原锚 - Σ前n-1期(精确到2位,填此值必能过校验)
BigDecimal lastLevelAmount = originalRuleAmount.subtract(sumBeforeLast)
// 末期找平金额 = 原记录原币种金额 - Σ前n-1期(精确到2位,填此值必能过校验)
BigDecimal lastLevelAmount = baseOriginalAmount.subtract(sumBeforeLast)
.setScale(2, RoundingMode.HALF_UP);
String tip = lastLevelAmount.signum() >= 0
? String.format("「保单币种金额」不平:各期合计 %s,应等于 %s。请将最后一期(第%d期)的「保单币种金额」改为 %s 后提交",
totalRuleAmount, originalRuleAmount, splitList.size(), lastLevelAmount.toPlainString())
: String.format("前%d期「保单币种金额」合计 %s,已超过应发金额 %s,请调减前期金额后提交",
lastIndex, sumBeforeLast, originalRuleAmount);
? String.format("「原币种金额」不平:各期合计 %s,应等于 %s。请将最后一期(第%d期)的「原币种金额」改为 %s 后提交",
totalOriginalAmount, baseOriginalAmount, splitList.size(), lastLevelAmount.toPlainString())
: String.format("前%d期「原币种金额」合计 %s,已超过应发金额 %s,请调减前期金额后提交",
lastIndex, sumBeforeLast, baseOriginalAmount);
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), tip);
}
......
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