确认分账时合并同一个账户的多个子财务单

This commit is contained in:
HH 2022-07-21 16:33:27 +08:00
parent 67621c8250
commit 40222ba239
1 changed files with 28 additions and 19 deletions

View File

@ -29,9 +29,7 @@ import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
/**
@ -145,41 +143,33 @@ public class OrderMasterServiceImpl implements OrderMasterService {
// 用子财务单组成分账信息
List<FinancialDetail> financialDetails = financialDetailService.selectByFinancialMasterId(financialMaster.getId());
// 分账账户
ArrayList<DivMember> divMembers = new ArrayList<>();
// 需要自动提现的账户
ArrayList<DivMember> autoDrawCashMembers = new ArrayList<>();
// 校验金额 主财务单的金额减去所有子财务单的金额是否=0
BigDecimal checkMoney = financialMaster.getPayMoney();
// 确认支付金额 = 主财务单付款金额 - 退款金额
BigDecimal confirmAmt = financialMaster.getPayMoney();
// key:memberId(分账账户ID) value:分账金额
HashMap<String, BigDecimal> memberMap = new HashMap<>();
for (FinancialDetail financialDetail : financialDetails) {
checkMoney = checkMoney.subtract(financialDetail.getPayMoney());
String memberId, amount;
DivMember member;
String memberId;
switch (financialDetail.getFinancialDetailType()) {
case 0:
// 上门师傅结单 分账同下
case 1:
// 大师傅/店铺提成
memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), orderMaster.getDeptId());
amount = AdapayUtils.bigDecimalToString(financialDetail.getPayMoney());
member = new DivMember(memberId, amount, false);
divMembers.add(member);
autoDrawCashMembers.add(member);
memberMap.merge(memberId, financialDetail.getPayMoney(), BigDecimal::add);
break;
case 2:
// 平台提成 并且是手续费承担方
amount = AdapayUtils.bigDecimalToString(financialDetail.getPayMoney());
divMembers.add(new DivMember("0", amount, true));
memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add);
break;
case 3:
// 分销
memberId = AdapayUtils.getCustomerMemberId(financialDetail.getPayeeId(), orderMaster.getDeptId());
amount = AdapayUtils.bigDecimalToString(financialDetail.getPayMoney());
member = new DivMember(memberId, amount, false);
divMembers.add(member);
autoDrawCashMembers.add(member);
memberMap.merge(memberId, financialDetail.getPayMoney(), BigDecimal::add);
break;
case 4:
// 退款
@ -192,6 +182,25 @@ public class OrderMasterServiceImpl implements OrderMasterService {
// 这里校验一次主财务单的金额减去所有子财务单的金额是否=0
Assert.isTrue(BigDecimal.ZERO.compareTo(checkMoney) == 0, "订单异常,请稍后再试");
// 分账账户
ArrayList<DivMember> divMembers = new ArrayList<>();
// 需要自动提现的账户
ArrayList<DivMember> autoDrawCashMembers = new ArrayList<>();
for (Map.Entry<String, BigDecimal> entry : memberMap.entrySet()) {
String memberId = entry.getKey();
BigDecimal money = entry.getValue();
String amount = AdapayUtils.bigDecimalToString(money);
if ("0".equals(memberId)) {
// 0是平台账户 只参与分账 不自动提现
divMembers.add(new DivMember("0", amount, true));
} else {
DivMember member = new DivMember(memberId, amount, false);
divMembers.add(member);
autoDrawCashMembers.add(member);
}
}
JSONObject response = adapayService.paymentConfirm(orderMaster.getDeptId(), payment.getId(), payment.getOrderNo(),
AdapayUtils.bigDecimalToString(confirmAmt), divMembers, null, null);
logger.info("订单[code={}]分账结果: {}", orderMaster.getCode(), response.toJSONString());