订单加价扣除平台抽成和团队抽成

This commit is contained in:
Hawking 2023-07-07 22:51:51 +08:00
parent 9109c692a1
commit 44f780f15b
1 changed files with 214 additions and 158 deletions

View File

@ -13,6 +13,10 @@ import com.ghy.common.exception.base.BaseException;
import com.ghy.common.utils.AdapayUtils;
import com.ghy.common.utils.MoneyUtil;
import com.ghy.common.utils.ObjectUtils;
import com.ghy.goods.domain.DeptGoodsCategory;
import com.ghy.goods.domain.GoodsStandard;
import com.ghy.goods.service.DeptGoodsCategoryService;
import com.ghy.goods.service.GoodsStandardService;
import com.ghy.order.domain.*;
import com.ghy.order.mapper.OrderAddSubtractMapper;
import com.ghy.order.mapper.OrderDetailMapper;
@ -29,6 +33,8 @@ import com.ghy.payment.service.AdapayService;
import com.ghy.payment.service.FinancialChangeRecordService;
import com.ghy.payment.service.FinancialDetailService;
import com.ghy.payment.service.FinancialMasterService;
import com.ghy.worker.domain.Worker;
import com.ghy.worker.service.WorkerService;
import com.huifu.adapay.core.exception.BaseAdaPayException;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
@ -87,6 +93,12 @@ public class OrderDetailServiceImpl implements OrderDetailService {
private OrderFineRecordMapper orderFineRecordMapper;
@Resource
private OrderAddSubtractMapper orderAddSubtractMapper;
@Resource
private WorkerService workerService;
@Resource
private GoodsStandardService goodsStandardService;
@Resource
private DeptGoodsCategoryService deptGoodsCategoryService;
// Adapay 手续费率 默认0.008
@Value("${adapay.fee_rate:0.008}")
@ -420,8 +432,14 @@ public class OrderDetailServiceImpl implements OrderDetailService {
if (financialMaster == null) {
throw new BaseException("找不到主财务单");
}
PaymentDTO payment = financialMasterService.selectPaymentById(financialMaster.getPaymentId());
if (payment == null) {
// 大师傅
Worker workerMaster = workerService.selectById(orderMaster.getWorkerId());
// 小师傅
Worker workerSub = workerService.selectById(orderDetail.getWorkerId());
// 订单的支付信息
PaymentDTO orderPayment = financialMasterService.selectPaymentById(financialMaster.getPaymentId());
if (orderPayment == null) {
throw new BaseException("找不到支付记录");
}
// 子订单对应的子财务单只有一条 直接取出
@ -432,7 +450,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
if (financialDetail.getPayStatus() != 1) {
throw new BaseException("订单不是“已支付”状态");
}
final Long deptId = orderMaster.getDeptId();
Long financialMasterId = financialDetail.getFinancialMasterId();
// 找到 type=平台抽成 的子财务单 用来承担手续费
List<FinancialDetail> details = financialDetailService.selectByFinancialMasterIdAndType(financialMasterId, FinancialDetailType.PLATFORM_FEE.getCode());
@ -441,6 +459,15 @@ public class OrderDetailServiceImpl implements OrderDetailService {
return;
}
List<OrderGoods> orderGoods = orderGoodsService.selectByOrderDetailId(orderDetailId);
if (CollectionUtils.isEmpty(orderGoods)) {
throw new BaseException("找不到子订单对应的商品");
}
Long goodsStandardId = orderGoods.get(0).getGoodsStandardId();
GoodsStandard goodsStandard = goodsStandardService.selectById(goodsStandardId);
DeptGoodsCategory deptGoodsCategory = deptGoodsCategoryService.get(goodsStandard.getDeptGoodsCategoryId());
// 修改子订单状态为完成
updateStatus(orderDetailId, OrderStatus.FINISH.code());
@ -451,34 +478,105 @@ public class OrderDetailServiceImpl implements OrderDetailService {
fdUpdate.setPayMoney(platformFeeFD.getPayMoney());
logger.debug("子订单[{}]的完单流程开始", orderDetailId);
// 加价单手续费补偿成功与否
boolean compensate = false;
// 加价单手续费
BigDecimal feeAmt = null;
// 待提现金额
BigDecimal dtx = BigDecimal.ZERO;
// 加价金额
BigDecimal addPrice = BigDecimal.ZERO;
// 子单收款人的memberId
String memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), financialDetail.getDeptId());
String memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), deptId);
String masterMemberId = AdapayUtils.getWorkerMemberId(workerMaster.getWorkerId(), deptId);
List<OrderAddSubtract> oasList = orderAddSubtractMapper.select(new OrderAddSubtract()
.setOrderDetailId(orderDetailId).setPayStatus(PayStatus.PAID.getCode()));
// --------------------- 追加分账部分 start ---------------------
List<OrderAddSubtract> adds = oasList.stream().filter(oas -> MoneyUtil.gt0(oas.getMoney())).collect(Collectors.toList());
for (OrderAddSubtract oas : adds) {
String orderNo = payment.getOrderNo() + "_" + oas.getPaymentId() + "_" + System.currentTimeMillis();
// 大师傅提成
BigDecimal teamRete = new BigDecimal(workerMaster.getLeaderTeamRate());
teamRete = MoneyUtil.lt0(teamRete) ? BigDecimal.ZERO : teamRete;
BigDecimal teamMoney = new BigDecimal(workerSub.getLeaderTeamMoney());
teamMoney = MoneyUtil.lt0(teamMoney) ? BigDecimal.ZERO : teamMoney;
// 平台加价抽成
BigDecimal deptRate = new BigDecimal(deptGoodsCategory.getDeptRate());
deptRate = MoneyUtil.lt0(deptRate) ? BigDecimal.ZERO : deptRate;
BigDecimal deptMoney = MoneyUtil.lt0(deptGoodsCategory.getDeptMoney()) ? BigDecimal.ZERO : deptGoodsCategory.getDeptMoney();
// 平台追加抽成
BigDecimal pcDeptRate = new BigDecimal(deptGoodsCategory.getPcDeptRate());
pcDeptRate = MoneyUtil.lt0(pcDeptRate) ? BigDecimal.ZERO : pcDeptRate;
BigDecimal pcDeptMoney = MoneyUtil.lt0(deptGoodsCategory.getPcDeptMoney()) ? BigDecimal.ZERO : deptGoodsCategory.getPcDeptMoney();
// 追加金额分账
addPaymentConfirm(orderDetailId, deptId, memberId, masterMemberId, teamRete, teamMoney, pcDeptRate, pcDeptMoney);
// 改价单分账
BigDecimal changeMoney = changePaymentConfirm(orderDetailId, orderDetail.getWorkerId(), deptId, memberId, masterMemberId, teamRete, teamMoney, deptRate, deptMoney);
// --------------------- 子财务单分账部分 start ---------------------
// 子单的实际金额
BigDecimal odMoney = financialDetail.getPayMoney().subtract(changeMoney);
if (MoneyUtil.lte0(odMoney)) {
logger.info("子财务单[{}] 应支付金额={} 不需要分账", financialDetail.getId(), odMoney);
} else {
// 查询师傅的超时扣款记录
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId());
// 超时罚金
BigDecimal fineMoney = BigDecimal.ZERO;
ArrayList<Long> fineIds = new ArrayList<>();
for (OrderTimeoutRecord fineRecord : fineRecords) {
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
if (MoneyUtil.lt(fineMoney.add(fineRecord.getPayMoney()), odMoney)) {
// 加价单金额不足以抵扣罚金
break;
} else {
// 抵扣罚金
logger.info("子订单[{}]的派单金额[{}]抵扣罚金{}元", orderDetailId, odMoney, fineRecord.getPayMoney());
fineMoney = fineMoney.add(fineRecord.getPayMoney());
// 被抵扣的罚金记录ID先存下来分账成功后修改状态
fineIds.add(fineRecord.getId());
}
}
// 分账账户信息
ArrayList<DivMember> divMembers = new ArrayList<>();
divMembers.add(new DivMember(memberId, MoneyUtil.toS(oas.getMoney()), true));
//调用分账
logger.info("子订单[{}]的追加单[{}]发起分账: {}", orderDetailId, oas.getId(), JSON.toJSONString(divMembers));
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), oas.getPaymentId(),
orderNo, MoneyUtil.toS(oas.getMoney()), divMembers, null, null);
logger.info("子订单[{}]的追加单[{}]分账结果: {}", orderDetailId, oas.getId(), response.toString());
// 是否有罚金
boolean haveFine = MoneyUtil.gt0(fineMoney);
BigDecimal workerMoney = odMoney.subtract(fineMoney);
if (haveFine) { // 有罚金 从罚金里扣除手续费
// 平台的分账信息 用来承担罚金
divMembers.add(new DivMember("0", MoneyUtil.toS(fineMoney), true));
if (MoneyUtil.gt0(workerMoney)) {
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerMoney), false));
}
} else {
// 没有罚金 自己承担手续费
divMembers.add(new DivMember(memberId, MoneyUtil.toS(odMoney), true));
}
String orderNo = "OD_" + orderDetailId + "_" + System.currentTimeMillis();
logger.info("子订单[{}]发起分账: {}", orderDetailId, JSON.toJSONString(divMembers));
JSONObject response = adapayService.paymentConfirm(deptId, orderPayment.getId(), orderNo, MoneyUtil.toS(odMoney), divMembers, null, null);
logger.info("子订单[{}]的分账结果: {}", orderDetailId, response.toString());
boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
// 如果确认支付失败 这里抛出异常 回滚订单状态
Assert.isTrue(status, response.toString());
// 分账成功 把罚金状态改为已扣除
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
}
// --------------------- 追加分账部分 end ---------------------
// --------------------- 子财务单分账部分 end ---------------------
// --------------------- 改价单分账部分 start ---------------------
// 分账后自动提现去掉了 改用定时提现 2023-07-07
}
/**
* 订单改价分账
*
* @param orderDetailId 子订单ID
* @param workerId 子师傅ID
* @param deptId 企业ID
* @param memberId 子师傅ID
* @param masterMemberId 主师傅ID
* @param teamRete 团队抽成比例
* @param teamMoney 团队抽成金额
* @param deptRate 平台抽成比例
* @param deptMoney 平台抽成金额
* @return 改价金额
* @throws BaseAdaPayException AdaPay分账接口可能抛出的异常
*/
private BigDecimal changePaymentConfirm(Long orderDetailId, Long workerId, Long deptId, String memberId, String masterMemberId,
BigDecimal teamRete, BigDecimal teamMoney, BigDecimal deptRate, BigDecimal deptMoney) throws BaseAdaPayException {
BigDecimal changeMoney = BigDecimal.ZERO;
// 查询子订单的加价记录
List<FinancialChangeRecord> financialChangeRecords = financialChangeRecordService.selectByDetailIds(String.valueOf(orderDetailId));
if (CollectionUtils.isNotEmpty(financialChangeRecords)) {
@ -487,15 +585,25 @@ public class OrderDetailServiceImpl implements OrderDetailService {
boolean paid = PayStatus.PAID.getCode().equals(fcRecord.getPayStatus());
boolean payedAdd = PayStatus.PAYED_ADD.getCode().equals(fcRecord.getPayStatus());
if (paid || payedAdd) {
ArrayList<DivMember> divMembers = new ArrayList<>();
addPrice = fcRecord.getChangeMoney();
changeMoney = fcRecord.getChangeMoney();
// 平台抽成
BigDecimal platformFee = changeMoney.multiply(deptRate).add(deptMoney).setScale(2, RoundingMode.UP);
// 大师傅抽成
BigDecimal masterFee = changeMoney.multiply(teamRete).add(teamMoney).setScale(2, RoundingMode.UP);
// 如果提成>追加金额 则去掉固定提成 只计算比例提成
if (MoneyUtil.lt(masterFee.add(platformFee), changeMoney)) {
platformFee = changeMoney.multiply(deptRate).setScale(2, RoundingMode.UP);
masterFee = changeMoney.multiply(teamRete).setScale(2, RoundingMode.UP);
}
// 上门师傅的报酬
BigDecimal workerFee = changeMoney.subtract(platformFee).subtract(masterFee);
BigDecimal fineMoney = BigDecimal.ZERO;
// 查询师傅的超时扣款记录
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId());
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(workerId, deptId);
ArrayList<Long> fineIds = new ArrayList<>();
for (OrderTimeoutRecord fineRecord : fineRecords) {
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
if (fineMoney.add(fineRecord.getPayMoney()).compareTo(fcRecord.getChangeMoney()) > 0) {
if (MoneyUtil.lt(fineMoney.add(fineRecord.getPayMoney()), workerFee)) {
// 加价单金额不足以抵扣罚金
logger.info("子订单[{}]的加价单[{}]不足以抵扣罚金{}元", orderDetailId, fcRecord.getId(), fineRecord.getPayMoney());
break;
@ -507,156 +615,104 @@ public class OrderDetailServiceImpl implements OrderDetailService {
fineIds.add(fineRecord.getId());
}
}
// 是否有罚金
boolean haveFine = BigDecimal.ZERO.compareTo(fineMoney) < 0;
if (haveFine) { // 有罚金
// 扣除罚金后的加价金额
BigDecimal workerAddMoney = fcRecord.getChangeMoney().subtract(fineMoney);
// 待提现金额里加入加价金额
dtx = dtx.add(workerAddMoney);
// 这里由平台承担手续费
DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(workerAddMoney), false);
DivMember planDivMember = new DivMember("0", AdapayUtils.bigDecimalToString(fineMoney), true);
divMembers.add(divMember);
divMembers.add(planDivMember);
} else { // 没有罚金
// 待提现金额里加入加价金额
dtx = dtx.add(fcRecord.getChangeMoney());
// 这里先自己承担手续费 后面再用平台抽成来补偿
DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), true);
divMembers.add(divMember);
// 扣除罚金后的上门师傅报酬
workerFee = workerFee.subtract(fineMoney);
// 平台抽成 + 超时罚金
platformFee = platformFee.add(fineMoney);
ArrayList<DivMember> divMembers = new ArrayList<>();
// 承担手续费的标志 如果平台抽成为0则大师傅承担手续费 如果大师傅抽成也为0 则由上门师傅自己承担手续费
boolean feeFlag = false;
if (MoneyUtil.gt0(platformFee)) {
divMembers.add(new DivMember("0", MoneyUtil.toS(platformFee), true));
feeFlag = true;
}
if (MoneyUtil.gt0(masterFee)) {
divMembers.add(new DivMember(masterMemberId, MoneyUtil.toS(masterFee), !feeFlag));
feeFlag = true;
}
if (MoneyUtil.gt0(workerFee)) {
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerFee), !feeFlag));
}
String orderNo = "FCR_" + fcRecord.getId() + "_" + System.currentTimeMillis();
//调用分账
logger.info("子订单[code={}]的[改价单]发起分账", odCode);
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), fcRecord.getRemark(),
payment.getOrderNo() + "_" + System.currentTimeMillis(),
AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), divMembers, null, null);
logger.info("子订单[{}]的[改价单]发起分账", orderDetailId);
JSONObject response = adapayService.paymentConfirm(deptId, fcRecord.getPaymentId(), orderNo, MoneyUtil.toS(fcRecord.getChangeMoney()), divMembers, null, null);
logger.info("子订单[{}]的[改价单]分账结果: {}", orderDetailId, response.toString());
if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { // 分账成功
logger.info("子订单[code={}]的[改价单]分账成功", odCode);
logger.info("子订单[{}]的[改价单]分账成功", orderDetailId);
// 分账成功 把罚金状态改为已扣除
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
if (!haveFine) { // 没有罚金的情况才需要补偿手续费 有罚金的话直接在罚金里承担手续费
// 这是被扣掉的手续费 按理说这里应该大于0
String fee_amt = response.getString("fee_amt");
feeAmt = new BigDecimal(fee_amt);
// 0.00 < 改价单的手续费 < 平台抽成金额
if (MoneyUtil.gt0(feeAmt) && MoneyUtil.gt(fdUpdate.getPayMoney(), feeAmt)) {
// 用平台抽成来补偿改价单的手续费 修改平台抽成子财务单金额
fdUpdate.setPayMoney(fdUpdate.getPayMoney().subtract(feeAmt));
int i = financialDetailService.updateFinancialDetail(fdUpdate);
compensate = i > 0;
} else {
logger.warn("主订单[code={}]的平台抽成金额不足以承担子订单[code={}]的[改价单]的手续费",
orderDetail.getOrderMasterCode(), odCode);
// 平台抽成不足以承担改价单手续费了 那没办法了只能自己承担
// 待提现金额里减去改价单手续费
dtx = dtx.subtract(feeAmt);
}
}
} else { // 分账失败
if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) {
// 当前确认金额 > 支付金额 - 已支付确认金额 - 已支付撤销金额
// 这里有两种可能 1.可能是之前算错了手续费的旧订单
// 2.可能是之前执行过完单流程 改价单分账成功了 但是子财务单分账失败了
// 所以直接跳过
logger.info("子订单[code={}] 跳过[改价单]分账", odCode);
logger.info("子订单[{}] 跳过[改价单]分账 : CONFIRM_AMT_OVER_LIMIT", orderDetailId);
} else {
logger.error("子订单[code={}]的[改价单 paymentId={}]分账失败: {}", odCode, fcRecord.getRemark(), response.toJSONString());
logger.error("子订单[{}]的[改价单 paymentId={}]分账失败: {}", orderDetailId, fcRecord.getRemark(), response.toJSONString());
// 其它错误抛异常
throw new IllegalArgumentException(response.getString("error_msg"));
}
}
}
}
// --------------------- 改价单分账部分 end ---------------------
return changeMoney;
}
// --------------------- 子财务单分账部分 start ---------------------
// 分账账户信息
ArrayList<DivMember> divMembers = new ArrayList<>();
// 子单的实际金额
BigDecimal fdPayMoney = financialDetail.getPayMoney().subtract(addPrice);
// 实际要分账的金额(子单的实际金额 + 平台补偿改价单手续费)
BigDecimal payMoney;
if (compensate) {
// 平台补偿改价单手续费
payMoney = fdPayMoney.add(feeAmt);
} else {
// 平台不补偿改价单手续费
payMoney = fdPayMoney;
}
if (MoneyUtil.lte0(payMoney)) {
logger.info("子财务单[{}] 应支付金额={} 不需要分账", financialDetail.getId(), payMoney);
} else {
// 查询师傅的超时扣款记录
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId());
// 超时罚金
BigDecimal fineMoney = BigDecimal.ZERO;
ArrayList<Long> fineIds = new ArrayList<>();
for (OrderTimeoutRecord fineRecord : fineRecords) {
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
if (fineMoney.add(fineRecord.getPayMoney()).compareTo(fdPayMoney) > 0) {
// 加价单金额不足以抵扣罚金
logger.info("子订单[{}]的派单金额[{}元]不足以抵扣罚金{}元", orderDetailId, fdPayMoney, fineRecord.getPayMoney());
break;
} else {
// 抵扣罚金
logger.info("子订单[{}]的加价单[{}]抵扣罚金{}元", orderDetailId, fdPayMoney, fineRecord.getPayMoney());
fineMoney = fineMoney.add(fineRecord.getPayMoney());
// 被抵扣的罚金记录ID先存下来分账成功后修改状态
fineIds.add(fineRecord.getId());
}
/**
* 订单追加分账
*
* @param orderDetailId 子订单ID
* @param deptId 企业ID
* @param memberId 子师傅ID
* @param masterMemberId 主师傅ID
* @param teamRete 团队抽成比例
* @param teamMoney 团队抽成金额
* @param pcDeptRate 平台抽成比例
* @param pcDeptMoney 平台抽成金额
* @throws BaseAdaPayException AdaPay分账接口可能抛出的异常
*/
private void addPaymentConfirm(Long orderDetailId, Long deptId, String memberId, String masterMemberId,
BigDecimal teamRete, BigDecimal teamMoney, BigDecimal pcDeptRate, BigDecimal pcDeptMoney) throws BaseAdaPayException {
List<OrderAddSubtract> oasList = orderAddSubtractMapper.select(new OrderAddSubtract()
.setOrderDetailId(orderDetailId).setPayStatus(PayStatus.PAID.getCode()));
List<OrderAddSubtract> adds = oasList.stream().filter(oas -> MoneyUtil.gt0(oas.getMoney())).collect(Collectors.toList());
for (OrderAddSubtract oas : adds) {
BigDecimal oasMoney = oas.getMoney();
// 平台抽成
BigDecimal platformFee = oasMoney.multiply(pcDeptRate).add(pcDeptMoney).setScale(2, RoundingMode.UP);
// 大师傅抽成
BigDecimal masterFee = oasMoney.multiply(teamRete).add(teamMoney).setScale(2, RoundingMode.UP);
// 如果提成>追加金额 则去掉固定提成 只计算比例提成
if (MoneyUtil.lt(masterFee.add(platformFee), oasMoney)) {
platformFee = oasMoney.multiply(pcDeptRate).setScale(2, RoundingMode.UP);
masterFee = oasMoney.multiply(teamRete).setScale(2, RoundingMode.UP);
}
// 总分账金额
BigDecimal fee = BigDecimal.ZERO;
// 接单师傅的分账信息
String payMoneyS = AdapayUtils.bigDecimalToString(payMoney.subtract(fineMoney));
DivMember divMember = new DivMember(memberId, payMoneyS, false);
divMembers.add(divMember);
// 是否有罚金
boolean haveFine = MoneyUtil.gt0(fineMoney);
if (haveFine) { // 有罚金 从罚金里扣除手续费
// 平台的分账信息 用来承担罚金
DivMember fineDivMember = new DivMember("0", AdapayUtils.bigDecimalToString(fineMoney), true);
divMembers.add(fineDivMember);
} else { // 没有罚金 需要扣除手续费
// 计算本次分账的手续费 保留两位小数(向上取整)
fee = payMoney.multiply(new BigDecimal(feeRate)).setScale(2, RoundingMode.UP);
// 平台的分账信息 用来承担手续费
DivMember feeDivMember = new DivMember("0", fee.toString(), true);
divMembers.add(feeDivMember);
// 上门师傅的报酬
BigDecimal workerFee = oasMoney.subtract(platformFee).subtract(masterFee);
// 分账信息
ArrayList<DivMember> divMembers = new ArrayList<>();
// 承担手续费的标志 如果平台抽成为0则大师傅承担手续费 如果大师傅抽成也为0 则由上门师傅自己承担手续费
boolean feeFlag = false;
if (MoneyUtil.gt0(platformFee)) {
divMembers.add(new DivMember("0", MoneyUtil.toS(platformFee), true));
feeFlag = true;
}
logger.info("子订单[code={}]发起分账", odCode);
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), payment.getId(),
payment.getOrderNo() + "_" + System.currentTimeMillis(),
AdapayUtils.bigDecimalToString(fee.add(payMoney)), divMembers, null, null);
boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
// 如果确认支付失败 这里抛出异常 回滚订单状态
Assert.isTrue(status, response.toString());
// 分账成功 把罚金状态改为已扣除
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
// 待提现金额里加入子财务单金额
dtx = dtx.add(fdPayMoney.subtract(fineMoney));
// 修改平台抽成子财务单金额 减去手续费
fdUpdate.setPayMoney(fdUpdate.getPayMoney().subtract(fee));
financialDetailService.updateFinancialDetail(fdUpdate);
if (MoneyUtil.gt0(masterFee)) {
divMembers.add(new DivMember(masterMemberId, MoneyUtil.toS(masterFee), !feeFlag));
feeFlag = true;
}
if (MoneyUtil.gt0(workerFee)) {
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerFee), !feeFlag));
}
String orderNo = "OAS_" + oas.getId() + "_" + System.currentTimeMillis();
//调用分账
logger.info("子订单[{}]的追加单[{}]发起分账: {}", orderDetailId, oas.getId(), JSON.toJSONString(divMembers));
JSONObject response = adapayService.paymentConfirm(deptId, oas.getPaymentId(),
orderNo, MoneyUtil.toS(oasMoney), divMembers, null, null);
logger.info("子订单[{}]的追加单[{}]分账结果: {}", orderDetailId, oas.getId(), response.toString());
}
// --------------------- 子财务单分账部分 end ---------------------
// --------------------- 自动提现流程 start ---------------------
// 走到这里确认分账成功了 进入自动提现流程
logger.info("子订单[code={}]开始自动提现", odCode);
if (BigDecimal.ZERO.compareTo(dtx) > -1) {
logger.info("子订单[code={}] 待提现金额={} 无需提现", odCode, dtx);
} else {
// 待提现金额
String cashAmt = AdapayUtils.bigDecimalToString(dtx);
executor.execute(() -> drawCash(orderDetailId, financialDetail.getDeptId(), memberId, cashAmt));
}
// --------------------- 自动提现流程 end ---------------------
}
/**