分账后自动提现

This commit is contained in:
Hawking 2023-07-23 22:43:18 +08:00
parent b95dcce2b4
commit bd6dee6d8c
1 changed files with 113 additions and 87 deletions

View File

@ -510,11 +510,28 @@ public class OrderDetailServiceImpl implements OrderDetailService {
pcDeptRate = MoneyUtil.lt0(pcDeptRate) ? BigDecimal.ZERO : pcDeptRate; pcDeptRate = MoneyUtil.lt0(pcDeptRate) ? BigDecimal.ZERO : pcDeptRate;
BigDecimal pcDeptMoney = MoneyUtil.lt0(deptGoodsCategory.getPcDeptMoney()) ? BigDecimal.ZERO : deptGoodsCategory.getPcDeptMoney(); BigDecimal pcDeptMoney = MoneyUtil.lt0(deptGoodsCategory.getPcDeptMoney()) ? BigDecimal.ZERO : deptGoodsCategory.getPcDeptMoney();
BigDecimal dtx = BigDecimal.ZERO;
// 追加金额分账 // 追加金额分账
addPaymentConfirm(orderDetailId, deptId, memberId, masterMemberId, teamRete, teamMoney, pcDeptRate, pcDeptMoney); BigDecimal dtx1 = addPaymentConfirm(orderDetailId, deptId, memberId, masterMemberId, teamRete, teamMoney, pcDeptRate, pcDeptMoney);
dtx = dtx.add(dtx1);
// 改价单分账 // 改价单分账
BigDecimal changeMoney = changePaymentConfirm(orderDetailId, orderDetail.getWorkerId(), deptId, memberId, masterMemberId, teamRete, teamMoney, deptRate, deptMoney); BigDecimal changeMoney = BigDecimal.ZERO;
// 查询子订单的加价记录
List<FinancialChangeRecord> financialChangeRecords = financialChangeRecordService.selectByDetailIds(String.valueOf(orderDetailId));
if (CollectionUtils.isNotEmpty(financialChangeRecords)) {
// 改价记录只会有一条 直接取出
FinancialChangeRecord fcRecord = financialChangeRecords.get(0);
boolean paid = PayStatus.PAID.getCode().equals(fcRecord.getPayStatus());
boolean payedAdd = PayStatus.PAYED_ADD.getCode().equals(fcRecord.getPayStatus());
if (paid || payedAdd) {
changeMoney = fcRecord.getChangeMoney();
BigDecimal dtx2 = changePaymentConfirm(fcRecord, orderDetailId, orderDetail.getWorkerId(), deptId, memberId,
masterMemberId, teamRete, teamMoney, deptRate, deptMoney);
dtx = dtx.add(dtx2);
}
}
// --------------------- 子财务单分账部分 start --------------------- // --------------------- 子财务单分账部分 start ---------------------
// 子单的实际金额 // 子单的实际金额
@ -551,6 +568,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
BigDecimal workerMoney = odMoney.subtract(fineMoney); BigDecimal workerMoney = odMoney.subtract(fineMoney);
if (MoneyUtil.gt0(workerMoney)) { if (MoneyUtil.gt0(workerMoney)) {
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerMoney), false)); divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerMoney), false));
dtx = dtx.add(workerMoney);
} }
} else { } else {
// 没有罚金 自己承担手续费 // 没有罚金 自己承担手续费
@ -565,10 +583,25 @@ public class OrderDetailServiceImpl implements OrderDetailService {
Assert.isTrue(status, response.toString()); Assert.isTrue(status, response.toString());
// 分账成功 把罚金状态改为已扣除 // 分账成功 把罚金状态改为已扣除
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1)); fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
if (!haveFine) {
String feeAmt = response.getString("fee_amt");
dtx = dtx.add(odMoney).subtract(new BigDecimal(feeAmt));
}
} }
// --------------------- 子财务单分账部分 end --------------------- // --------------------- 子财务单分账部分 end ---------------------
// 分账后自动提现去掉了 改用定时提现 2023-07-07 // --------------------- 自动提现流程 start ---------------------
// 走到这里确认分账成功了 进入自动提现流程
logger.info("子订单[code={}]开始自动提现", odCode);
if (MoneyUtil.lte0(dtx)) {
logger.info("子订单[code={}] 待提现金额={} 无需提现", odCode, dtx);
} else {
// 待提现金额
String cashAmt = AdapayUtils.bigDecimalToString(dtx);
executor.execute(() -> drawCash(orderDetailId, financialDetail.getDeptId(), memberId, cashAmt));
}
// --------------------- 自动提现流程 end ---------------------
} }
/** /**
@ -586,90 +619,80 @@ public class OrderDetailServiceImpl implements OrderDetailService {
* @return 改价金额 * @return 改价金额
* @throws BaseAdaPayException AdaPay分账接口可能抛出的异常 * @throws BaseAdaPayException AdaPay分账接口可能抛出的异常
*/ */
private BigDecimal changePaymentConfirm(Long orderDetailId, Long workerId, Long deptId, String memberId, String masterMemberId, private BigDecimal changePaymentConfirm(FinancialChangeRecord fcRecord, Long orderDetailId, Long workerId, Long deptId,
BigDecimal teamRete, BigDecimal teamMoney, BigDecimal deptRate, BigDecimal deptMoney) throws BaseAdaPayException { String memberId, String masterMemberId, BigDecimal teamRete, BigDecimal teamMoney,
BigDecimal changeMoney = BigDecimal.ZERO; BigDecimal deptRate, BigDecimal deptMoney) throws BaseAdaPayException {
// 查询子订单的加价记录 BigDecimal changeMoney = fcRecord.getChangeMoney();
List<FinancialChangeRecord> financialChangeRecords = financialChangeRecordService.selectByDetailIds(String.valueOf(orderDetailId)); // 平台抽成
if (CollectionUtils.isNotEmpty(financialChangeRecords)) { BigDecimal platformFee = changeMoney.multiply(deptRate).add(deptMoney).setScale(2, RoundingMode.UP);
// 改价记录只会有一条 直接取出 // 大师傅抽成
FinancialChangeRecord fcRecord = financialChangeRecords.get(0); BigDecimal masterFee = changeMoney.multiply(teamRete).add(teamMoney).setScale(2, RoundingMode.UP);
boolean paid = PayStatus.PAID.getCode().equals(fcRecord.getPayStatus()); // 如果提成>追加金额 则去掉固定提成 只计算比例提成
boolean payedAdd = PayStatus.PAYED_ADD.getCode().equals(fcRecord.getPayStatus()); if (MoneyUtil.lt(masterFee.add(platformFee), changeMoney)) {
if (paid || payedAdd) { platformFee = changeMoney.multiply(deptRate).setScale(2, RoundingMode.UP);
changeMoney = fcRecord.getChangeMoney(); masterFee = changeMoney.multiply(teamRete).setScale(2, RoundingMode.UP);
// 平台抽成 }
BigDecimal platformFee = changeMoney.multiply(deptRate).add(deptMoney).setScale(2, RoundingMode.UP); // 上门师傅的报酬
// 大师傅抽成 BigDecimal workerFee = changeMoney.subtract(platformFee).subtract(masterFee);
BigDecimal masterFee = changeMoney.multiply(teamRete).add(teamMoney).setScale(2, RoundingMode.UP); BigDecimal fineMoney = BigDecimal.ZERO;
// 如果提成>追加金额 则去掉固定提成 只计算比例提成 // 查询师傅的超时扣款记录
if (MoneyUtil.lt(masterFee.add(platformFee), changeMoney)) { List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(workerId, deptId);
platformFee = changeMoney.multiply(deptRate).setScale(2, RoundingMode.UP); ArrayList<Long> fineIds = new ArrayList<>();
masterFee = changeMoney.multiply(teamRete).setScale(2, RoundingMode.UP); for (OrderTimeoutRecord fineRecord : fineRecords) {
} // 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
// 上门师傅的报酬 if (MoneyUtil.lt(fineMoney.add(fineRecord.getPayMoney()), workerFee)) {
BigDecimal workerFee = changeMoney.subtract(platformFee).subtract(masterFee); // 加价单金额不足以抵扣罚金
BigDecimal fineMoney = BigDecimal.ZERO; logger.info("子订单[{}]的加价单[{}]不足以抵扣罚金{}元", orderDetailId, fcRecord.getId(), fineRecord.getPayMoney());
// 查询师傅的超时扣款记录 break;
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(workerId, deptId); } else {
ArrayList<Long> fineIds = new ArrayList<>(); // 抵扣罚金
for (OrderTimeoutRecord fineRecord : fineRecords) { logger.info("子订单[{}]的加价单[{}]抵扣罚金{}元", orderDetailId, fcRecord.getId(), fineRecord.getPayMoney());
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金 fineMoney = fineMoney.add(fineRecord.getPayMoney());
if (MoneyUtil.lt(fineMoney.add(fineRecord.getPayMoney()), workerFee)) { // 被抵扣的罚金记录ID先存下来分账成功后修改状态
// 加价单金额不足以抵扣罚金 fineIds.add(fineRecord.getId());
logger.info("子订单[{}]的加价单[{}]不足以抵扣罚金{}元", orderDetailId, fcRecord.getId(), fineRecord.getPayMoney());
break;
} else {
// 抵扣罚金
logger.info("子订单[{}]的加价单[{}]抵扣罚金{}元", orderDetailId, fcRecord.getId(), fineRecord.getPayMoney());
fineMoney = fineMoney.add(fineRecord.getPayMoney());
// 被抵扣的罚金记录ID先存下来分账成功后修改状态
fineIds.add(fineRecord.getId());
}
}
// 扣除罚金后的上门师傅报酬
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("子订单[{}]的[改价单]发起分账", 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("子订单[{}]的[改价单]分账成功", orderDetailId);
// 分账成功 把罚金状态改为已扣除
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
} else { // 分账失败
if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) {
// 当前确认金额 > 支付金额 - 已支付确认金额 - 已支付撤销金额
// 这里有两种可能 1.可能是之前算错了手续费的旧订单
// 2.可能是之前执行过完单流程 改价单分账成功了 但是子财务单分账失败了
// 所以直接跳过
logger.info("子订单[{}] 跳过[改价单]分账 : CONFIRM_AMT_OVER_LIMIT", orderDetailId);
} else {
logger.error("子订单[{}]的[改价单 paymentId={}]分账失败: {}", orderDetailId, fcRecord.getRemark(), response.toJSONString());
// 其它错误抛异常
throw new IllegalArgumentException(response.getString("error_msg"));
}
}
} }
} }
return changeMoney; // 扣除罚金后的上门师傅报酬
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("子订单[{}]的[改价单]发起分账", 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("子订单[{}]的[改价单]分账成功", orderDetailId);
// 分账成功 把罚金状态改为已扣除
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
} else { // 分账失败
if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) {
// 当前确认金额 > 支付金额 - 已支付确认金额 - 已支付撤销金额
// 这里有两种可能 1.可能是之前算错了手续费的旧订单
// 2.可能是之前执行过完单流程 改价单分账成功了 但是子财务单分账失败了
// 所以直接跳过
logger.info("子订单[{}] 跳过[改价单]分账 : CONFIRM_AMT_OVER_LIMIT", orderDetailId);
} else {
logger.error("子订单[{}]的[改价单 paymentId={}]分账失败: {}", orderDetailId, fcRecord.getRemark(), response.toJSONString());
// 其它错误抛异常
throw new IllegalArgumentException(response.getString("error_msg"));
}
}
return workerFee;
} }
/** /**
@ -685,8 +708,9 @@ public class OrderDetailServiceImpl implements OrderDetailService {
* @param pcDeptMoney 平台抽成金额 * @param pcDeptMoney 平台抽成金额
* @throws BaseAdaPayException AdaPay分账接口可能抛出的异常 * @throws BaseAdaPayException AdaPay分账接口可能抛出的异常
*/ */
private void addPaymentConfirm(Long orderDetailId, Long deptId, String memberId, String masterMemberId, private BigDecimal addPaymentConfirm(Long orderDetailId, Long deptId, String memberId, String masterMemberId,
BigDecimal teamRete, BigDecimal teamMoney, BigDecimal pcDeptRate, BigDecimal pcDeptMoney) throws BaseAdaPayException { BigDecimal teamRete, BigDecimal teamMoney, BigDecimal pcDeptRate, BigDecimal pcDeptMoney) throws BaseAdaPayException {
BigDecimal dtx = BigDecimal.ZERO;
List<OrderAddSubtract> oasList = orderAddSubtractMapper.select(new OrderAddSubtract() List<OrderAddSubtract> oasList = orderAddSubtractMapper.select(new OrderAddSubtract()
.setOrderDetailId(orderDetailId).setPayStatus(PayStatus.PAID.getCode())); .setOrderDetailId(orderDetailId).setPayStatus(PayStatus.PAID.getCode()));
List<OrderAddSubtract> adds = oasList.stream().filter(oas -> MoneyUtil.gt0(oas.getMoney())).collect(Collectors.toList()); List<OrderAddSubtract> adds = oasList.stream().filter(oas -> MoneyUtil.gt0(oas.getMoney())).collect(Collectors.toList());
@ -717,6 +741,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
} }
if (MoneyUtil.gt0(workerFee)) { if (MoneyUtil.gt0(workerFee)) {
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerFee), !feeFlag)); divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerFee), !feeFlag));
dtx = dtx.add(workerFee);
} }
String orderNo = "OAS_" + oas.getId() + "_" + System.currentTimeMillis(); String orderNo = "OAS_" + oas.getId() + "_" + System.currentTimeMillis();
//调用分账 //调用分账
@ -725,6 +750,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
orderNo, MoneyUtil.toS(oasMoney), divMembers, null, null); orderNo, MoneyUtil.toS(oasMoney), divMembers, null, null);
logger.info("子订单[{}]的追加单[{}]分账结果: {}", orderDetailId, oas.getId(), response.toString()); logger.info("子订单[{}]的追加单[{}]分账结果: {}", orderDetailId, oas.getId(), response.toString());
} }
return dtx;
} }
/** /**