“mitao”
2026-03-27 f15cd7be6470a4f5de2a6a5618aa62053b696b64
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -109,6 +109,18 @@
    @Resource
    private IOpenCityService openCityService;
    @Autowired
    private IPaymentRecordService paymentRecordService;
    @Autowired
    private ITransactionDetailsService transactionDetailsService;
    @Autowired
    private IIncomeService incomeService;
    @Autowired
    private PayMoneyUtil payMoneyUtil;
    /**
     * 获取司机端首页订单列表
@@ -789,12 +801,14 @@
            double estimateAmount = orderPrivateCar.getEstimateAmount() == null ? 0D : orderPrivateCar.getEstimateAmount();
            int compareResult = BigDecimal.valueOf(estimateAmount).compareTo(BigDecimal.valueOf(orderPrivateCar.getOrderMoney()));
            if (compareResult > 0) {
                orderPrivateCar.setState(7);
                orderPrivateCar.setPrepayStage(4);
                handlePrepaidRefund(orderPrivateCar, estimateAmount - orderPrivateCar.getOrderMoney());
                orderPrivateCar.setState(9);
            } else if (compareResult < 0) {
                orderPrivateCar.setState(7);
                orderPrivateCar.setPrepayStage(3);
            } else {
                orderPrivateCar.setState(9);
                finishPrepaidOrder(orderPrivateCar);
            }
        } else {
            orderPrivateCar.setState(7);
@@ -846,6 +860,17 @@
            }
        }).start();
        if (Integer.valueOf(8).equals(orderPrivateCar.getState()) && Integer.valueOf(5).equals(orderPrivateCar.getPrepayStage())) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    if (pushMinistryOfTransport) {
                        pushMinistryOfTransportUtil.operatePay(orderId);
                    }
                }
            }).start();
        }
        OrderPrivateCar finalOrderPrivateCar = orderPrivateCar;
        new Thread(new Runnable() {
            @Override
@@ -862,13 +887,115 @@
    }
    /**
     * 先付订单退款预留逻辑,后续接入真实退款接口
     * 处理预支付多退退款
     */
    private void handlePrepaidRefund(OrderPrivateCar orderPrivateCar, Double refundAmount) {
    private void handlePrepaidRefund(OrderPrivateCar orderPrivateCar, Double refundAmount) throws Exception {
        if (refundAmount == null || refundAmount <= 0) {
            return;
        }
        // TODO 对接真实退款接口,当前先保留调用入口,避免阻塞订单完成流程
        Double refundMoney = formatMoney(refundAmount);
        String refundNo = buildPrepayRefundNo(1, orderPrivateCar.getId());
        orderPrivateCar.setPrepayRefundNo(refundNo);
        orderPrivateCar.setPrepayRefundAmount(refundMoney);
        if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) {
            UserInfo userInfo = userInfoMapper.selectById(orderPrivateCar.getUserId());
            if (userInfo != null) {
                userInfo.setBalance(formatMoney((userInfo.getBalance() == null ? 0D : userInfo.getBalance()) + refundMoney));
                userInfoMapper.updateById(userInfo);
                finishPrepaidOrder(orderPrivateCar);
            }
            return;
        }
        PaymentRecord paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, orderPrivateCar.getPayType(), 2);
        if (paymentRecord == null || ToolUtil.isEmpty(paymentRecord.getCode())) {
            System.err.println("预支付退款数据异常(privateCarOrderId = " + orderPrivateCar.getId() + ")");
            return;
        }
        if (Integer.valueOf(1).equals(orderPrivateCar.getPayType())) {
            Map<String, String> map = payMoneyUtil.wxRefund(paymentRecord.getCode(), refundNo, paymentRecord.getAmount().toString(), refundMoney.toString(), "/base/prepayRefundWXPay");
            if (!"SUCCESS".equals(map.get("return_code"))) {
                System.err.println("专车预支付退款申请失败:" + map.get("return_msg"));
            }
            return;
        }
        if (Integer.valueOf(2).equals(orderPrivateCar.getPayType())) {
            try {
                Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundMoney.toString());
                if ("10000".equals(map.get("code"))) {
                    finishPrepaidOrder(orderPrivateCar);
                } else {
                    System.err.println("专车预支付退款申请失败:" + map.get("msg"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private void finishPrepaidOrder(OrderPrivateCar orderPrivateCar) throws Exception {
        boolean refunded = Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())
                && orderPrivateCar.getPrepayRefundAmount() != null
                && orderPrivateCar.getPrepayRefundAmount() > 0;
        if (refunded && orderPrivateCar.getPrepayRefundTime() == null) {
            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车预支付退款", orderPrivateCar.getPrepayRefundAmount(), 1, 1, 1, 1, orderPrivateCar.getId());
            orderPrivateCar.setPrepayRefundTime(new Date());
        }
        orderPrivateCar.setState(8);
        orderPrivateCar.setPrepayStage(5);
        orderPrivateCar.setPayMoney(formatMoney(orderPrivateCar.getOrderMoney()));
        if (orderPrivateCar.getRecoveryOrder() == null || orderPrivateCar.getRecoveryOrder() == 0) {
            Double orderMoney = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus()
                    ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney());
            Map<String, Object> map = incomeService.saveIncome(orderPrivateCar.getId(), 1, orderMoney);
            orderPrivateCar.setSplitAllocation(JSON.toJSONString(map));
        }
        if (orderPrivateCar.getAbnormal() != null && orderPrivateCar.getAbnormal() == 2
                && orderPrivateCar.getAbnormalStatus() != null && orderPrivateCar.getAbnormalStatus() == 1) {
            orderPrivateCar.setAbnormalStatus(3);
            orderPrivateCar.setResponsibilityMoney(new BigDecimal(orderPrivateCar.getOrderMoney()));
            orderPrivateCar.setResponsibilityType(3);
            orderPrivateCar.setAbnormalRemark("乘客已完成预支付订单结算,申诉已自动关闭");
        }
    }
    private String buildPrepayRefundNo(Integer orderType, Integer orderId) {
        return "PRF_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
    }
    private Double formatMoney(Double money) {
        return new BigDecimal(money == null ? 0D : money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
    }
    @Override
    public void payPrepaidRefundCallback(Integer orderId, String refundNo, String refundId) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
        if (orderPrivateCar == null || !Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
            return;
        }
        if (ToolUtil.isNotEmpty(orderPrivateCar.getPrepayRefundTime())) {
            return;
        }
        if (ToolUtil.isNotEmpty(orderPrivateCar.getPrepayRefundNo()) && !orderPrivateCar.getPrepayRefundNo().equals(refundNo)) {
            return;
        }
        finishPrepaidOrder(orderPrivateCar);
        this.updateById(orderPrivateCar);
        pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState());
        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState());
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (pushMinistryOfTransport) {
                    pushMinistryOfTransportUtil.operatePay(orderId);
                }
            }
        }).start();
    }