From b45f2dace5d33c9902ae549a0bd6fa6b6a28095e Mon Sep 17 00:00:00 2001 From: "kuang.yife" Date: Fri, 18 Nov 2022 01:45:43 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=86=E8=B4=A6=EF=BC=8C?= =?UTF-8?q?=E5=BD=93=E5=8D=95=E5=9C=A8=E5=BE=85=E7=A1=AE=E8=AE=A4=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=BB=A11=E4=B8=AA=E5=B0=8F=E6=97=B6=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=88=86=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghy/common/utils/AdapayUtils.java | 2 +- .../service/impl/OrderDetailServiceImpl.java | 74 ++++++++++++------- .../service/FinancialDetailService.java | 2 + .../impl/FinancialDetailServiceImpl.java | 7 ++ .../quartz/service/impl/OrderServiceImpl.java | 16 +--- 5 files changed, 58 insertions(+), 43 deletions(-) diff --git a/ghy-common/src/main/java/com/ghy/common/utils/AdapayUtils.java b/ghy-common/src/main/java/com/ghy/common/utils/AdapayUtils.java index f1e170f5..324cce68 100644 --- a/ghy-common/src/main/java/com/ghy/common/utils/AdapayUtils.java +++ b/ghy-common/src/main/java/com/ghy/common/utils/AdapayUtils.java @@ -50,7 +50,7 @@ public class AdapayUtils { * @return 保留两位小数的String */ public static String bigDecimalToString(BigDecimal b) { - return b.setScale(2, RoundingMode.UNNECESSARY).toString(); + return b.setScale(2, RoundingMode.HALF_UP).toString(); } public synchronized static String createOrderNo(AdapayOrderType type) { 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 715df04d..0e0aefe9 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 @@ -301,60 +301,78 @@ public class OrderDetailServiceImpl implements OrderDetailService { Assert.notNull(financialMaster, "找不到主财务单"); PaymentDTO payment = financialMasterService.selectPaymentById(financialMaster.getPaymentId()); Assert.notNull(payment, "找不到支付记录"); - FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(orderDetailId); + List financialDetail = financialDetailService.selectListByOrderDetailId(orderDetailId); Assert.notNull(financialDetail, "找不到子财务单"); - Assert.isTrue(financialDetail.getPayStatus() == 1, "订单不是“已支付”状态"); + Assert.isTrue(financialDetail.get(0).getPayStatus() == 1, "订单不是“已支付”状态"); // 更新订单状态 orderDetailMapper.updateStatus(orderDetailId, OrderStatus.FINISH.code()); - if (BigDecimal.ZERO.compareTo(financialDetail.getPayMoney()) > -1) { - logger.info("子财务单[code={}]支付金额<=0,不需要分账", financialDetail.getCode()); - // 支付金额<=0的话 不需要走下面的流程了 - return; - } - - // 上门师傅结单 要判断一下这个单是否已退款 - if (financialDetail.getPayStatus() > 1) { - return; - } - // 分账账户ID - String memberId; // 分账账户信息 + Map divMemberMap = new HashMap<>(); ArrayList divMembers = new ArrayList<>(); - String amount = AdapayUtils.bigDecimalToString(financialDetail.getPayMoney()); - memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), orderDetail.getDeptId()); - DivMember divMember = new DivMember(memberId, amount, false); - divMembers.add(divMember); + BigDecimal feeAmount = BigDecimal.ZERO; + for (FinancialDetail detail : financialDetail) { + if (BigDecimal.ZERO.compareTo(detail.getPayMoney()) > -1) { + logger.info("子财务单[code={}]支付金额<=0,不需要分账", detail.getCode()); + // 支付金额<=0的话 不需要走下面的流程了 + continue; + } + // 重复的数据一次提现 + String memberId = AdapayUtils.getWorkerMemberId(detail.getPayeeId(), detail.getDeptId()); + DivMember divMember; + if(divMemberMap.containsKey(memberId)){ + divMember = divMemberMap.get(memberId); + divMember.setAmount(AdapayUtils.bigDecimalToString(new BigDecimal(divMember.getAmount()).add(detail.getPayMoney()))); + }else { + divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(detail.getPayMoney()), false); + divMemberMap.put(memberId, divMember); + } + feeAmount = feeAmount.add(detail.getPayMoney()); + } + for (Map.Entry entry : divMemberMap.entrySet()) { + divMembers.add(entry.getValue()); + } + BigDecimal fee = BigDecimal.ZERO; + if(feeAmount.multiply(BigDecimal.valueOf(0.004)).compareTo(BigDecimal.valueOf(0.01)) < 1){ + fee = fee.add(BigDecimal.valueOf(0.01)); + }else { + fee = feeAmount.multiply(BigDecimal.valueOf(0.004)); + } + DivMember feeDivMember = new DivMember("0", AdapayUtils.bigDecimalToString(fee), true); + divMembers.add(feeDivMember); + + BigDecimal totalMoney = feeAmount.add(fee); + // 扣除交易费用 + String sureMoney = AdapayUtils.bigDecimalToString(totalMoney); logger.info("子订单[code={}]分账信息: {}", orderDetail.getCode(), JSON.toJSONString(divMembers)); - JSONObject response = adapayService.paymentConfirm(orderDetail.getDeptId(), payment.getId(), payment.getOrderNo(), - amount, divMembers, null, null); + JSONObject response = adapayService.paymentConfirm(financialDetail.get(0).getDeptId(), payment.getId(), payment.getOrderNo() + "_" + System.currentTimeMillis(), + sureMoney, divMembers, null, null); logger.info("子订单[code={}]分账结果: {}", orderDetail.getCode(), response.toJSONString()); boolean status = AdapayStatusEnum.pending.code.equals(response.getString("status")) || AdapayStatusEnum.succeeded.code.equals(response.getString("status")); // 如果确认支付失败 这里抛出异常 回滚订单状态 Assert.isTrue(status, response.getString("error_msg")); - // 走到这里确认分账成功了 异步进入自动提现流程 logger.info("子订单[code={}]开始自动提现", orderDetail.getCode()); - divMembers.forEach(member -> executor.execute(() -> { + divMembers.forEach(member -> { try { String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH); - JSONObject drawCashResponse = adapayService.drawCash(orderDetail.getDeptId(), orderNo, "T1", - amount, memberId, "订单结算", null); + JSONObject drawCashResponse = adapayService.drawCash(financialDetail.get(0).getDeptId(), orderNo, "T1", + member.getAmount(), member.getMemberId(), "订单结算", null); boolean drawCashStatus = AdapayStatusEnum.pending.code.equals(drawCashResponse.getString("status")) || AdapayStatusEnum.succeeded.code.equals(drawCashResponse.getString("status")); if (!drawCashStatus) { //如果提现失败 把信息记录到error日志里 - logger.error("自动发起提现失败: deptId={}, memberId={}, amount={}, 失败原因:{}", orderDetail.getDeptId(), - memberId, amount, drawCashResponse.getString("error_msg")); + logger.error("自动发起提现失败: deptId={}, memberId={}, amount={}, 失败原因:{}", financialDetail.get(0).getDeptId(), + member.getMemberId(), member.getAmount(), drawCashResponse.getString("error_msg")); } } catch (BaseAdaPayException e) { - logger.error("自动发起提现失败: orderDetailId={}, memberId={}, cashAmt={}", orderDetailId, memberId, amount, e); + logger.error("自动发起提现失败: orderDetailId={}, memberId={}, cashAmt={}", orderDetailId, member.getMemberId(), member.getAmount(), e); } - })); + }); } @Override diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/FinancialDetailService.java b/ghy-payment/src/main/java/com/ghy/payment/service/FinancialDetailService.java index 41a072b3..16bcaaaa 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/FinancialDetailService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/FinancialDetailService.java @@ -25,6 +25,8 @@ public interface FinancialDetailService { */ FinancialDetail selectByOrderDetailId(Long orderDetailId); + List selectListByOrderDetailId(Long orderDetailId); + /** * @param financialDetail 财务细单属性 * @return 成功条数 diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialDetailServiceImpl.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialDetailServiceImpl.java index 61fe295e..a85bbd79 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialDetailServiceImpl.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialDetailServiceImpl.java @@ -70,6 +70,13 @@ public class FinancialDetailServiceImpl implements FinancialDetailService { return null; } + @Override + public List selectListByOrderDetailId(Long orderDetailId) { + FinancialDetail financialDetail = new FinancialDetail(); + financialDetail.setOrderDetailId(orderDetailId); + return financialDetailMapper.selectFinancialDetailList(financialDetail); + } + @Override public int insertFinancialDetail(FinancialDetail financialDetail) { return financialDetailMapper.insertFinancialDetail(financialDetail); diff --git a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java index ccef13df..18532fe8 100644 --- a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java +++ b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java @@ -137,7 +137,7 @@ public class OrderServiceImpl implements OrderService { // 查询出"待确认"状态的子订单 List orderDetails = orderDetailService.selectByStatus(Collections.singletonList(OrderStatus.FINISH_CHECK.code())); long now = System.currentTimeMillis(); - long day14ago = now - (14 * 24 * 60 * 60 * 1000L); + long day14ago = now - (60 * 60 * 1000L); for (OrderDetail orderDetail : orderDetails) { // 查询符合自动确认的订单 if (day14ago > orderDetail.getUpdateTime().getTime()) { @@ -145,22 +145,10 @@ public class OrderServiceImpl implements OrderService { try { // 完单流程(分账与提现) orderDetailService.finish(orderDetail.getId()); - } catch (BaseAdaPayException e) { + } catch (Exception e) { logger.error("订单自动完成[id={}, code={}]出错", orderDetail.getId(), orderDetail.getCode(), e); } } } - - // 当所有的子订单完成后 自动把主订单完成 - List orderMasters = orderMasterService.selectUnfinished(); - for (OrderMaster orderMaster : orderMasters) { - executor.execute(() -> { - try { - orderMasterService.finish(orderMaster.getId()); - } catch (Exception e) { - logger.error("主订单 Finish 失败", e); - } - }); - } } }