From 44f780f15b456ec5c1b34051428bb76e79c7f596 Mon Sep 17 00:00:00 2001 From: Hawking Date: Fri, 7 Jul 2023 22:51:51 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=8A=A0=E4=BB=B7=E6=89=A3?= =?UTF-8?q?=E9=99=A4=E5=B9=B3=E5=8F=B0=E6=8A=BD=E6=88=90=E5=92=8C=E5=9B=A2?= =?UTF-8?q?=E9=98=9F=E6=8A=BD=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/OrderDetailServiceImpl.java | 372 ++++++++++-------- 1 file changed, 214 insertions(+), 158 deletions(-) diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java index dba5d722..38a598fd 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java @@ -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 details = financialDetailService.selectByFinancialMasterIdAndType(financialMasterId, FinancialDetailType.PLATFORM_FEE.getCode()); @@ -441,6 +459,15 @@ public class OrderDetailServiceImpl implements OrderDetailService { return; } + List 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 oasList = orderAddSubtractMapper.select(new OrderAddSubtract() - .setOrderDetailId(orderDetailId).setPayStatus(PayStatus.PAID.getCode())); - // --------------------- 追加分账部分 start --------------------- - List 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 fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId()); + // 超时罚金 + BigDecimal fineMoney = BigDecimal.ZERO; + ArrayList 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 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 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 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 fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId()); + List fineRecords = orderFineRecordMapper.selectUnFine(workerId, deptId); ArrayList 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 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 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 fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId()); - // 超时罚金 - BigDecimal fineMoney = BigDecimal.ZERO; - ArrayList 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 oasList = orderAddSubtractMapper.select(new OrderAddSubtract() + .setOrderDetailId(orderDetailId).setPayStatus(PayStatus.PAID.getCode())); + List 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 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 --------------------- } /**