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 7a25e627..9950a90b 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 @@ -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 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 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 fineRecords = orderFineRecordMapper.selectUnFine(workerId, deptId); - ArrayList 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 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 fineRecords = orderFineRecordMapper.selectUnFine(workerId, deptId); + ArrayList 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 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 oasList = orderAddSubtractMapper.select(new OrderAddSubtract() .setOrderDetailId(orderDetailId).setPayStatus(PayStatus.PAID.getCode())); List 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; } /**