From 0dbeb1426548c4dec3c0bc55d2b3db07b99345b5 Mon Sep 17 00:00:00 2001 From: HH Date: Mon, 30 Jan 2023 20:41:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BB=E8=AE=A2=E5=8D=95=E7=BB=93=E7=AE=97?= =?UTF-8?q?=20=E6=8F=90=E4=BA=A4=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/OrderDetailServiceImpl.java | 26 ++++++------ .../service/impl/OrderMasterServiceImpl.java | 42 ++++++++----------- .../ghy/payment/service/AdapayService.java | 7 +++- .../com/ghy/quartz/service/OrderService.java | 2 +- .../quartz/service/impl/OrderServiceImpl.java | 14 ++++--- .../java/com/ghy/quartz/task/OrderTask.java | 2 +- 6 files changed, 45 insertions(+), 48 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 c5eb87cc..14b2f686 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 @@ -1,6 +1,5 @@ package com.ghy.order.service.impl; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ghy.common.adapay.AdapayErrorCode; import com.ghy.common.adapay.model.AdapayStatusEnum; @@ -362,7 +361,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { FinancialDetail platformFeeFD = details.get(0); FinancialDetail update = new FinancialDetail(); update.setId(platformFeeFD.getId()); - + update.setPayMoney(platformFeeFD.getPayMoney()); logger.debug("子订单[code={}]的完单流程开始", odCode); // 更新订单状态 @@ -393,18 +392,19 @@ public class OrderDetailServiceImpl implements OrderDetailService { DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), true); divMembers.add(divMember); //调用分账 - logger.info("子订单[code={}]的[改价单]的分账信息: {}", odCode, JSON.toJSONString(divMembers)); + logger.info("子订单[code={}]的[改价单]发起分账", odCode); JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), fcRecord.getRemark(), payment.getOrderNo() + "_" + System.currentTimeMillis(), AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), divMembers, null, null); if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { // 分账成功 logger.info("子订单[code={}]的[改价单]分账成功", odCode); - // 这是被扣掉的手续费 + // 这是被扣掉的手续费 按理说这里肯定大于0 String fee_amt = response.getString("fee_amt"); feeAmt = new BigDecimal(fee_amt); if (feeAmt.compareTo(platformFeeFD.getPayMoney()) < 0 && !"0.00".equals(fee_amt)) { + // 当 0.00<改价单的手续费<=平台抽成金额 时 // 用平台抽成来补偿改价单的手续费 修改平台抽成子财务单金额 - update.setPayMoney(platformFeeFD.getPayMoney().subtract(feeAmt)); + update.setPayMoney(update.getPayMoney().subtract(feeAmt)); int i = financialDetailService.updateFinancialDetail(update); compensate = i > 0; } else { @@ -461,17 +461,16 @@ public class OrderDetailServiceImpl implements OrderDetailService { DivMember feeDivMember = new DivMember("0", fee.toString(), true); divMembers.add(feeDivMember); - logger.info("子订单[code={}]分账信息: {}", odCode, JSON.toJSONString(divMembers)); + logger.info("子订单[code={}]发起分账", odCode); JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), payment.getId(), payment.getOrderNo() + "_" + System.currentTimeMillis(), fee.add(payMoney).toString(), divMembers, null, null); - logger.info("子订单[code={}]分账结果: {}", odCode, response.toJSONString()); boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")); // 如果确认支付失败 这里抛出异常 回滚订单状态 Assert.isTrue(status, response.getString("error_msg")); // 待提现金额里加入子财务单金额 dtx = dtx.add(fdPayMoney); // 修改平台抽成子财务单金额 - update.setPayMoney(platformFeeFD.getPayMoney().subtract(fee)); + update.setPayMoney(update.getPayMoney().subtract(fee)); financialDetailService.updateFinancialDetail(update); } // --------------------- 子财务单分账部分 end --------------------- @@ -482,10 +481,10 @@ public class OrderDetailServiceImpl implements OrderDetailService { if (BigDecimal.ZERO.compareTo(dtx) > -1) { logger.info("子订单[code={}] 待提现金额={} 无需提现", odCode, dtx); } + // 待提现金额 + String cashAmt = AdapayUtils.bigDecimalToString(dtx); + String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH); try { - String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH); - // 待提现金额 - String cashAmt = AdapayUtils.bigDecimalToString(dtx); JSONObject drawCashResponse = adapayService.drawCash(financialDetail.getDeptId(), orderNo, "T1", cashAmt, memberId, "订单结算", null); boolean drawCashStatus = AdapayStatusEnum.pending.code.equals(drawCashResponse.getString("status")) || @@ -495,11 +494,10 @@ public class OrderDetailServiceImpl implements OrderDetailService { logger.info("子订单[code={}]自动提现成功", odCode); } else { // 提现失败 把信息记录到error日志里 - logger.error("自动发起提现失败: 子订单code={}, deptId={}, memberId={}, amount={}, 失败信息: {}", odCode, - financialDetail.getDeptId(), memberId, cashAmt, drawCashResponse.toJSONString()); + logger.error("自动发起提现失败: 子订单code={}, deptId={} 失败信息: {}", odCode, cashAmt, drawCashResponse.toJSONString()); } } catch (Exception e) { - logger.error("自动发起提现失败: 子订单code={}, deptId={}, memberId={}", odCode, financialDetail.getDeptId(), memberId, e); + logger.error("自动发起提现失败: 子订单code={}, deptId={}, memberId={}, amount={}", odCode, financialDetail.getDeptId(), memberId, cashAmt, e); } // --------------------- 自动提现流程 end --------------------- } diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java index b33a499d..d677f410 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java @@ -1,6 +1,5 @@ package com.ghy.order.service.impl; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ghy.common.adapay.model.AdapayStatusEnum; import com.ghy.common.adapay.model.DivMember; @@ -159,6 +158,7 @@ public class OrderMasterServiceImpl implements OrderMasterService { PaymentDTO payment = financialMasterService.selectPaymentById(financialMaster.getPaymentId()); Assert.notNull(payment, String.format("主订单[id=%d]找不到支付记录", orderMasterId)); + // 修改主订单状态 updateStatus(orderMasterId, OrderStatus.FINISH_CHECK.code()); if (BigDecimal.ZERO.compareTo(financialMaster.getPayMoney()) > -1) { @@ -169,31 +169,30 @@ public class OrderMasterServiceImpl implements OrderMasterService { // 用子财务单组成分账信息 List financialDetails = financialDetailService.selectByFinancialMasterId(financialMaster.getId()); - // 校验金额 主财务单的金额减去所有子财务单的金额是否=0 - BigDecimal checkMoney = financialMaster.getPayMoney(); - // 确认支付金额 = 主财务单付款金额 - 退款金额 - 已确认金额 - BigDecimal confirmAmt = financialMaster.getPayMoney(); + // 确认支付总金额 + BigDecimal confirmAmt = BigDecimal.ZERO; // key:memberId(分账账户ID) value:分账金额 HashMap memberMap = new HashMap<>(); for (FinancialDetail financialDetail : financialDetails) { - checkMoney = checkMoney.subtract(financialDetail.getPayMoney()); String memberId; switch (financialDetail.getFinancialDetailType()) { case 0: // 上门师傅的财务单单独确认分账了 不在这里分 - // 减掉已确认金额 - confirmAmt = confirmAmt.subtract(financialDetail.getPayMoney()); break; case 1: // 大师傅/店铺提成 memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), orderMaster.getDeptId()); memberMap.merge(memberId, financialDetail.getPayMoney(), BigDecimal::add); + confirmAmt = confirmAmt.add(financialDetail.getPayMoney()); break; case 2: // 平台提成 并且是手续费承担方 + case 5: + // 订单超时罚金 归平台所有 memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add); + confirmAmt = confirmAmt.add(financialDetail.getPayMoney()); break; case 3: // 分销 @@ -206,44 +205,33 @@ public class OrderMasterServiceImpl implements OrderMasterService { // 如果没有分销人 那这笔钱就分到平台账户 memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add); } + confirmAmt = confirmAmt.add(financialDetail.getPayMoney()); break; case 4: - // 减掉退款金额 - confirmAmt = confirmAmt.subtract(financialDetail.getPayMoney()); - case 5: - // 订单超时罚金 归平台所有 - memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add); + // 退款金额 break; default: break; } } - // 这里校验一次主财务单的金额减去所有子财务单的金额是否=0 - Assert.isTrue(BigDecimal.ZERO.compareTo(checkMoney) == 0, "订单金额异常,请稍后再试"); - // 分账账户 ArrayList divMembers = new ArrayList<>(); - // 需要自动提现的账户 - ArrayList autoDrawCashMembers = new ArrayList<>(); for (Map.Entry entry : memberMap.entrySet()) { String memberId = entry.getKey(); BigDecimal money = entry.getValue(); String amount = AdapayUtils.bigDecimalToString(money); if ("0".equals(memberId)) { - // 0是平台账户 只参与分账 不自动提现 + // 0是平台账户 承担手续费 divMembers.add(new DivMember("0", amount, true)); } else { - DivMember member = new DivMember(memberId, amount, false); - divMembers.add(member); - autoDrawCashMembers.add(member); + divMembers.add(new DivMember(memberId, amount, false)); } } - logger.info("订单[code={}]分账信息: {}", orderMaster.getCode(), JSON.toJSONString(divMembers)); + logger.info("订单[code={}]发起分账", orderMaster.getCode()); JSONObject response = adapayService.paymentConfirm(orderMaster.getDeptId(), payment.getId(), payment.getOrderNo(), AdapayUtils.bigDecimalToString(confirmAmt), divMembers, null, null); - logger.info("订单[code={}]分账结果: {}", orderMaster.getCode(), response.toJSONString()); boolean status = AdapayStatusEnum.pending.code.equals(response.getString("status")) || AdapayStatusEnum.succeeded.code.equals(response.getString("status")); @@ -252,8 +240,12 @@ public class OrderMasterServiceImpl implements OrderMasterService { // 走到这里确认支付和分账都成功了 异步进入自动提现流程 logger.info("订单[code={}]开始自动提现", orderMaster.getCode()); - autoDrawCashMembers.forEach(member -> executor.execute(() -> { + divMembers.forEach(member -> executor.execute(() -> { String memberId = member.getMemberId(); + if ("0".equals(member.getMemberId())) { + // 平台的钱不用自动提现 + return; + } String amount = member.getAmount(); try { drawCash(orderMaster.getDeptId(), memberId, amount); diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java b/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java index d8129bf7..ead8a569 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java @@ -100,7 +100,10 @@ public class AdapayService { confirmParams.put("div_members", divMembers); confirmParams.put("fee_mode", feeMode); confirmParams.put("description", description); - return (JSONObject) PaymentConfirm.create(confirmParams, deptId.toString()); + logger.info("发起支付确认 dept[{}] param:{}", deptId, confirmParams.toJSONString()); + JSONObject response = (JSONObject) PaymentConfirm.create(confirmParams, deptId.toString()); + logger.info("支付确认结果 dept[{}] response:{}", deptId, response.toJSONString()); + return response; } /** @@ -255,7 +258,9 @@ public class AdapayService { cashParam.put("notify_url", adapayProperties.getNotifyUrl()); cashParam.put("remark", remark); cashParam.put("fee_mode", feeMode); + logger.info("发起提现 dept[{}] param:{}", deptId, cashParam.toJSONString()); JSONObject response = (JSONObject) Drawcash.create(cashParam, deptId.toString()); + logger.info("提现结果 dept[{}] response:{}", deptId, response.toJSONString()); drawCashCallbackService.onResponse(response); return response; } diff --git a/ghy-quartz/src/main/java/com/ghy/quartz/service/OrderService.java b/ghy-quartz/src/main/java/com/ghy/quartz/service/OrderService.java index dc3267fc..61ff8cd8 100644 --- a/ghy-quartz/src/main/java/com/ghy/quartz/service/OrderService.java +++ b/ghy-quartz/src/main/java/com/ghy/quartz/service/OrderService.java @@ -6,6 +6,6 @@ public interface OrderService { void overTimeOrder(String orderStatus); // 自动完成和分账 - void finishOrder(); + void autoFinishOrder(); } 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 a74b2526..a1a9a0a1 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 @@ -134,25 +134,27 @@ public class OrderServiceImpl implements OrderService { @Override - public void finishOrder() { + public void autoFinishOrder() { + // 子订单自动完单 // 查询出"待确认"状态的子订单 List orderDetails = orderDetailService.selectByStatus(Collections.singletonList(OrderStatus.FINISH_CHECK.code())); long now = System.currentTimeMillis(); // long day14ago = now - (60 * 60 * 1000L); long day14ago = now - 10000L; for (OrderDetail orderDetail : orderDetails) { - // 查询符合自动确认的订单 + // 筛选符合自动确认的订单 if (day14ago > orderDetail.getUpdateTime().getTime()) { - logger.info("订单自动完成[id={}, code={}]", orderDetail.getId(), orderDetail.getCode()); + logger.info("子订单自动完成[id={}, code={}]", orderDetail.getId(), orderDetail.getCode()); try { - // 完单流程(分账与提现) + // 子订单完单流程(分账与提现) orderDetailService.finish(orderDetail.getId()); } catch (Exception e) { - logger.error("订单自动完成[id={}, code={}]出错", orderDetail.getId(), orderDetail.getCode(), e); + logger.error("子订单自动完成[id={}, code={}]出错", orderDetail.getId(), orderDetail.getCode(), e); } } } + // 主订单自动完单 List orderMasters = orderMasterService.selectUnfinished(); for (OrderMaster om : orderMasters) { try { @@ -167,7 +169,7 @@ public class OrderServiceImpl implements OrderService { } // 如果已经不存在"已完成"和"已取消"以外的子订单 就把主订单也改为完成 if (allFinish) { - logger.info("主订单可以完成了[id={} code={}]", om.getId(), om.getCode()); + logger.info("主订单自动完成[id={} code={}]", om.getId(), om.getCode()); orderMasterService.finish(om.getId()); } } catch (Exception e) { diff --git a/ghy-quartz/src/main/java/com/ghy/quartz/task/OrderTask.java b/ghy-quartz/src/main/java/com/ghy/quartz/task/OrderTask.java index 6b5aa618..b2e6a0ca 100644 --- a/ghy-quartz/src/main/java/com/ghy/quartz/task/OrderTask.java +++ b/ghy-quartz/src/main/java/com/ghy/quartz/task/OrderTask.java @@ -30,7 +30,7 @@ public class OrderTask { * */ public void finishOrder(){ try { - orderService.finishOrder(); + orderService.autoFinishOrder(); }catch (Exception e){ log.error("auto finish order task error is {}", ExceptionUtil.getExceptionMessage(e)); e.printStackTrace();