分账后自动提现
This commit is contained in:
parent
b95dcce2b4
commit
bd6dee6d8c
|
|
@ -510,11 +510,28 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
pcDeptRate = MoneyUtil.lt0(pcDeptRate) ? BigDecimal.ZERO : pcDeptRate;
|
||||
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 ---------------------
|
||||
// 子单的实际金额
|
||||
|
|
@ -551,6 +568,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
BigDecimal workerMoney = odMoney.subtract(fineMoney);
|
||||
if (MoneyUtil.gt0(workerMoney)) {
|
||||
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerMoney), false));
|
||||
dtx = dtx.add(workerMoney);
|
||||
}
|
||||
} else {
|
||||
// 没有罚金 自己承担手续费
|
||||
|
|
@ -565,10 +583,25 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
Assert.isTrue(status, response.toString());
|
||||
// 分账成功 把罚金状态改为已扣除
|
||||
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
|
||||
|
||||
if (!haveFine) {
|
||||
String feeAmt = response.getString("fee_amt");
|
||||
dtx = dtx.add(odMoney).subtract(new BigDecimal(feeAmt));
|
||||
}
|
||||
}
|
||||
// --------------------- 子财务单分账部分 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 改价金额
|
||||
* @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)) {
|
||||
// 改价记录只会有一条 直接取出
|
||||
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 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(workerId, deptId);
|
||||
ArrayList<Long> fineIds = new ArrayList<>();
|
||||
for (OrderTimeoutRecord fineRecord : fineRecords) {
|
||||
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
|
||||
if (MoneyUtil.lt(fineMoney.add(fineRecord.getPayMoney()), workerFee)) {
|
||||
// 加价单金额不足以抵扣罚金
|
||||
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"));
|
||||
}
|
||||
}
|
||||
private BigDecimal changePaymentConfirm(FinancialChangeRecord fcRecord, Long orderDetailId, Long workerId, Long deptId,
|
||||
String memberId, String masterMemberId, BigDecimal teamRete, BigDecimal teamMoney,
|
||||
BigDecimal deptRate, BigDecimal deptMoney) throws BaseAdaPayException {
|
||||
BigDecimal 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(workerId, deptId);
|
||||
ArrayList<Long> fineIds = new ArrayList<>();
|
||||
for (OrderTimeoutRecord fineRecord : fineRecords) {
|
||||
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
|
||||
if (MoneyUtil.lt(fineMoney.add(fineRecord.getPayMoney()), workerFee)) {
|
||||
// 加价单金额不足以抵扣罚金
|
||||
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());
|
||||
}
|
||||
}
|
||||
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 平台抽成金额
|
||||
* @throws BaseAdaPayException AdaPay分账接口可能抛出的异常
|
||||
*/
|
||||
private void addPaymentConfirm(Long orderDetailId, Long deptId, String memberId, String masterMemberId,
|
||||
BigDecimal teamRete, BigDecimal teamMoney, BigDecimal pcDeptRate, BigDecimal pcDeptMoney) throws BaseAdaPayException {
|
||||
private BigDecimal addPaymentConfirm(Long orderDetailId, Long deptId, String memberId, String masterMemberId,
|
||||
BigDecimal teamRete, BigDecimal teamMoney, BigDecimal pcDeptRate, BigDecimal pcDeptMoney) throws BaseAdaPayException {
|
||||
BigDecimal dtx = BigDecimal.ZERO;
|
||||
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());
|
||||
|
|
@ -717,6 +741,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
}
|
||||
if (MoneyUtil.gt0(workerFee)) {
|
||||
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerFee), !feeFlag));
|
||||
dtx = dtx.add(workerFee);
|
||||
}
|
||||
String orderNo = "OAS_" + oas.getId() + "_" + System.currentTimeMillis();
|
||||
//调用分账
|
||||
|
|
@ -725,6 +750,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
orderNo, MoneyUtil.toS(oasMoney), divMembers, null, null);
|
||||
logger.info("子订单[{}]的追加单[{}]分账结果: {}", orderDetailId, oas.getId(), response.toString());
|
||||
}
|
||||
return dtx;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue