“mitao”
2026-03-27 f15cd7be6470a4f5de2a6a5618aa62053b696b64
feat:预支付支付逻辑处理
19个文件已修改
1085 ■■■■■ 已修改文件
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/account/controller/AppOrderController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 252 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/PaymentRecordMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IPaymentRecordService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -8,14 +8,17 @@
import com.stylefeng.guns.modular.crossCity.warpper.OrderWarpper;
import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics;
import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
import com.stylefeng.guns.modular.system.dao.DriverWorkMapper;
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.ChinaMobileUtil;
import com.stylefeng.guns.modular.system.util.PayMoneyUtil;
import com.stylefeng.guns.modular.system.util.PushUtil;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.SystemException;
import com.stylefeng.guns.modular.system.warpper.*;
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
@@ -27,6 +30,8 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -66,6 +71,15 @@
    @Autowired
    private ICarService carService;
    @Autowired
    private IOrderTaxiService orderTaxiService;
    @Autowired
    private IOrderPrivateCarService orderPrivateCarService;
    @Autowired
    private PayMoneyUtil payMoneyUtil;
@@ -1043,4 +1057,44 @@
            return ResultUtil.success();
        }
    }
    /**
     * 预支付微信退款成功回调
     * @param request
     * @param response
     */
    @ResponseBody
    @PostMapping("/base/prepayRefundWXPay")
    public void prepayRefundWXPay(HttpServletRequest request, HttpServletResponse response) {
        try {
            Map<String, String> map = payMoneyUtil.wxRefundCallback(request);
            if (map == null) {
                return;
            }
            String refundId = map.get("refund_id");
            String outRefundNo = map.get("out_refund_no");
            String result = map.get("result");
            if (ToolUtil.isEmpty(outRefundNo)) {
                return;
            }
            PrintWriter out = response.getWriter();
            out.write(result);
            out.flush();
            out.close();
            String[] split = outRefundNo.split("_");
            if (split.length < 4) {
                return;
            }
            Integer orderType = Integer.valueOf(split[1]);
            Integer orderId = Integer.valueOf(split[2]);
            if (orderType == 1) {
                orderPrivateCarService.payPrepaidRefundCallback(orderId, outRefundNo, refundId);
            } else if (orderType == 2) {
                orderTaxiService.payPrepaidRefundCallback(orderId, outRefundNo, refundId);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java
@@ -434,6 +434,16 @@
     */
    @TableField("paymentMode")
    private Integer paymentMode;
    @TableField("prepayStage")
    private Integer prepayStage;
    @TableField("prepaySecondPayNo")
    private String prepaySecondPayNo;
    @TableField("prepayRefundNo")
    private String prepayRefundNo;
    @TableField("prepayRefundAmount")
    private Double prepayRefundAmount;
    @TableField("prepayRefundTime")
    private Date prepayRefundTime;
    private String waitRule;
    private String chargeRule;
@@ -1357,6 +1367,46 @@
        this.paymentMode = paymentMode;
    }
    public Integer getPrepayStage() {
        return prepayStage;
    }
    public void setPrepayStage(Integer prepayStage) {
        this.prepayStage = prepayStage;
    }
    public String getPrepaySecondPayNo() {
        return prepaySecondPayNo;
    }
    public void setPrepaySecondPayNo(String prepaySecondPayNo) {
        this.prepaySecondPayNo = prepaySecondPayNo;
    }
    public String getPrepayRefundNo() {
        return prepayRefundNo;
    }
    public void setPrepayRefundNo(String prepayRefundNo) {
        this.prepayRefundNo = prepayRefundNo;
    }
    public Double getPrepayRefundAmount() {
        return prepayRefundAmount;
    }
    public void setPrepayRefundAmount(Double prepayRefundAmount) {
        this.prepayRefundAmount = prepayRefundAmount;
    }
    public Date getPrepayRefundTime() {
        return prepayRefundTime;
    }
    public void setPrepayRefundTime(Date prepayRefundTime) {
        this.prepayRefundTime = prepayRefundTime;
    }
    @Override
    public String toString() {
        return "OrderPrivateCar{" +
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java
@@ -103,6 +103,16 @@
    /**
     * 预支付微信退款回调
     * @param orderId
     * @param refundNo
     * @param refundId
     * @throws Exception
     */
    void payPrepaidRefundCallback(Integer orderId, String refundNo, String refundId) throws Exception;
    /**
     * 获取费用明细
     * @param orderId
     * @return
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();
    }
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java
@@ -237,6 +237,16 @@
     */
    @TableField("paymentMode")
    private Integer paymentMode;
    @TableField("prepayStage")
    private Integer prepayStage;
    @TableField("prepaySecondPayNo")
    private String prepaySecondPayNo;
    @TableField("prepayRefundNo")
    private String prepayRefundNo;
    @TableField("prepayRefundAmount")
    private Double prepayRefundAmount;
    @TableField("prepayRefundTime")
    private Date prepayRefundTime;
    //感谢费
    @TableField("thankYouFee")
    private Double thankYouFee;
@@ -868,6 +878,46 @@
        this.paymentMode = paymentMode;
    }
    public Integer getPrepayStage() {
        return prepayStage;
    }
    public void setPrepayStage(Integer prepayStage) {
        this.prepayStage = prepayStage;
    }
    public String getPrepaySecondPayNo() {
        return prepaySecondPayNo;
    }
    public void setPrepaySecondPayNo(String prepaySecondPayNo) {
        this.prepaySecondPayNo = prepaySecondPayNo;
    }
    public String getPrepayRefundNo() {
        return prepayRefundNo;
    }
    public void setPrepayRefundNo(String prepayRefundNo) {
        this.prepayRefundNo = prepayRefundNo;
    }
    public Double getPrepayRefundAmount() {
        return prepayRefundAmount;
    }
    public void setPrepayRefundAmount(Double prepayRefundAmount) {
        this.prepayRefundAmount = prepayRefundAmount;
    }
    public Date getPrepayRefundTime() {
        return prepayRefundTime;
    }
    public void setPrepayRefundTime(Date prepayRefundTime) {
        this.prepayRefundTime = prepayRefundTime;
    }
    public Integer getInvoiceId() {
        return invoiceId;
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java
@@ -115,6 +115,16 @@
    /**
     * 预支付微信退款回调
     * @param orderId
     * @param refundNo
     * @param refundId
     * @throws Exception
     */
    void payPrepaidRefundCallback(Integer orderId, String refundNo, String refundId) throws Exception;
    /**
     * 确认费用(车载端)
     * @param orderId
     * @param type
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -76,6 +76,18 @@
    @Resource
    private IOpenCityService openCityService;
    @Autowired
    private IPaymentRecordService paymentRecordService;
    @Autowired
    private ITransactionDetailsService transactionDetailsService;
    @Autowired
    private IIncomeService incomeService;
    @Autowired
    private PayMoneyUtil payMoneyUtil;
@@ -585,12 +597,14 @@
                double estimateAmount = orderTaxi.getEstimateAmount() == null ? 0D : orderTaxi.getEstimateAmount();
                int compareResult = BigDecimal.valueOf(estimateAmount).compareTo(BigDecimal.valueOf(orderTaxi.getOrderMoney()));
                if (compareResult > 0) {
                    orderTaxi.setState(7);
                    orderTaxi.setPrepayStage(4);
                    handlePrepaidRefund(orderTaxi, estimateAmount - orderTaxi.getOrderMoney());
                    orderTaxi.setState(9);
                } else if (compareResult < 0) {
                    orderTaxi.setState(7);
                    orderTaxi.setPrepayStage(3);
                } else {
                    orderTaxi.setState(9);
                    finishPrepaidOrder(orderTaxi);
                }
            } else {
                orderTaxi.setState(7);
@@ -616,13 +630,106 @@
    }
    /**
     * 先付订单退款预留逻辑,后续接入真实退款接口
     * 处理预支付多退退款
     */
    private void handlePrepaidRefund(OrderTaxi orderTaxi, Double refundAmount) {
    private void handlePrepaidRefund(OrderTaxi orderTaxi, Double refundAmount) throws Exception {
        if (refundAmount == null || refundAmount <= 0) {
            return;
        }
        // TODO 对接真实退款接口,当前先保留调用入口,避免阻塞订单完成流程
        Double refundMoney = formatMoney(refundAmount);
        String refundNo = buildPrepayRefundNo(2, orderTaxi.getId());
        orderTaxi.setPrepayRefundNo(refundNo);
        orderTaxi.setPrepayRefundAmount(refundMoney);
        if (Integer.valueOf(3).equals(orderTaxi.getPayType())) {
            UserInfo userInfo = userInfoMapper.selectById(orderTaxi.getUserId());
            if (userInfo != null) {
                userInfo.setBalance(formatMoney((userInfo.getBalance() == null ? 0D : userInfo.getBalance()) + refundMoney));
                userInfoMapper.updateById(userInfo);
                finishPrepaidOrder(orderTaxi);
            }
            return;
        }
        PaymentRecord paymentRecord = paymentRecordService.query(1, orderTaxi.getUserId(), 1, orderTaxi.getId(), 2, orderTaxi.getPayType(), 2);
        if (paymentRecord == null || ToolUtil.isEmpty(paymentRecord.getCode())) {
            System.err.println("预支付退款数据异常(taxiOrderId = " + orderTaxi.getId() + ")");
            return;
        }
        if (Integer.valueOf(1).equals(orderTaxi.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(orderTaxi.getPayType())) {
            try {
                Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundMoney.toString());
                if ("10000".equals(map.get("code"))) {
                    finishPrepaidOrder(orderTaxi);
                } else {
                    System.err.println("出租车预支付退款申请失败:" + map.get("msg"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private void finishPrepaidOrder(OrderTaxi orderTaxi) throws Exception {
        boolean refunded = Integer.valueOf(4).equals(orderTaxi.getPrepayStage())
                && orderTaxi.getPrepayRefundAmount() != null
                && orderTaxi.getPrepayRefundAmount() > 0;
        if (refunded && orderTaxi.getPrepayRefundTime() == null) {
            transactionDetailsService.saveData(orderTaxi.getUserId(), "出租车预支付退款", orderTaxi.getPrepayRefundAmount(), 1, 1, 1, 2, orderTaxi.getId());
            orderTaxi.setPrepayRefundTime(new Date());
        }
        orderTaxi.setState(8);
        orderTaxi.setPrepayStage(5);
        orderTaxi.setPayMoney(formatMoney(orderTaxi.getOrderMoney()));
        if (orderTaxi.getRecoveryOrder() == null || orderTaxi.getRecoveryOrder() == 0) {
            Double orderMoney = (2 == orderTaxi.getAbnormal() && 2 == orderTaxi.getAbnormalStatus()
                    ? orderTaxi.getResponsibilityMoney().doubleValue() : orderTaxi.getOrderMoney());
            Map<String, Object> map = incomeService.saveIncome(orderTaxi.getId(), 2, orderMoney);
            orderTaxi.setSplitAllocation(JSON.toJSONString(map));
        }
        if (2 == orderTaxi.getAbnormal() && 1 == orderTaxi.getAbnormalStatus()) {
            orderTaxi.setAbnormalStatus(3);
            orderTaxi.setResponsibilityMoney(new BigDecimal(orderTaxi.getOrderMoney()));
            orderTaxi.setResponsibilityType(3);
            orderTaxi.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 {
        OrderTaxi orderTaxi = this.selectById(orderId);
        if (orderTaxi == null || !Integer.valueOf(4).equals(orderTaxi.getPrepayStage())) {
            return;
        }
        if (ToolUtil.isNotEmpty(orderTaxi.getPrepayRefundTime())) {
            return;
        }
        if (ToolUtil.isNotEmpty(orderTaxi.getPrepayRefundNo()) && !orderTaxi.getPrepayRefundNo().equals(refundNo)) {
            return;
        }
        finishPrepaidOrder(orderTaxi);
        this.updateById(orderTaxi);
        pushUtil.pushOrderState(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, orderTaxi.getState());
        pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState());
    }
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/account/controller/AppOrderController.java
@@ -236,10 +236,10 @@
                    orderLogisticsService.payOrderLogisticsCallback(orderId,",",4);
                }
                if(integer==6){
                    orderPrivateCarService.payOrderPrivateCarCallback(orderId,",",4);
                    orderPrivateCarService.payOrderPrivateCarCallback(orderId,",",4, null);
                }
                if(integer==9){
                    orderTaxiService.payOrderTaxiCallback(orderId,"",4,paymentId);
                    orderTaxiService.payOrderTaxiCallback(orderId,"",4,paymentId, null);
                }
                if(integer==1){
                    orderPrivateCarService.payCancelOrderPrivateCar(orderId,",",4);
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -1771,10 +1771,10 @@
                    Integer type = Integer.valueOf(split[1]);
                    switch (type) {
                        case 1:
                            orderPrivateCarService.payOrderPrivateCarCallback(id, order_id, 1);
                            orderPrivateCarService.payOrderPrivateCarCallback(id, order_id, 1, out_trade_no);
                            break;
                        case 2:
                            orderTaxiService.payOrderTaxiCallback(id, order_id, 1, 0);
                            orderTaxiService.payOrderTaxiCallback(id, order_id, 1, 0, out_trade_no);
                            break;
                        case 3:
                            orderCrossCityService.payOrderCrossCityCallback(id, order_id, 1, null);
@@ -1818,10 +1818,10 @@
                    Integer type = Integer.valueOf(split[1]);
                    switch (type) {
                        case 1:
                            orderPrivateCarService.payOrderPrivateCarCallback(id, order_id, 2);
                            orderPrivateCarService.payOrderPrivateCarCallback(id, order_id, 2, out_trade_no);
                            break;
                        case 2:
                            orderTaxiService.payOrderTaxiCallback(id, order_id, 2, 0);
                            orderTaxiService.payOrderTaxiCallback(id, order_id, 2, 0, out_trade_no);
                            break;
                        case 3:
                            orderCrossCityService.payOrderCrossCityCallback(id, order_id, 2, null);
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java
@@ -531,6 +531,31 @@
     */
    @TableField("paymentMode")
    private Integer paymentMode;
    /**
     * 预支付阶段(0=非预支付,1=待首付,2=已首付待结算,3=待补差,4=待退款,5=结算完成)
     */
    @TableField("prepayStage")
    private Integer prepayStage;
    /**
     * 预支付补差支付流水号
     */
    @TableField("prepaySecondPayNo")
    private String prepaySecondPayNo;
    /**
     * 预支付退款单号
     */
    @TableField("prepayRefundNo")
    private String prepayRefundNo;
    /**
     * 预支付退款金额
     */
    @TableField("prepayRefundAmount")
    private Double prepayRefundAmount;
    /**
     * 预支付退款时间
     */
    @TableField("prepayRefundTime")
    private Date prepayRefundTime;
    public Date getSuccessTime() {
        return successTime;
@@ -1412,6 +1437,46 @@
        this.paymentMode = paymentMode;
    }
    public Integer getPrepayStage() {
        return prepayStage;
    }
    public void setPrepayStage(Integer prepayStage) {
        this.prepayStage = prepayStage;
    }
    public String getPrepaySecondPayNo() {
        return prepaySecondPayNo;
    }
    public void setPrepaySecondPayNo(String prepaySecondPayNo) {
        this.prepaySecondPayNo = prepaySecondPayNo;
    }
    public String getPrepayRefundNo() {
        return prepayRefundNo;
    }
    public void setPrepayRefundNo(String prepayRefundNo) {
        this.prepayRefundNo = prepayRefundNo;
    }
    public Double getPrepayRefundAmount() {
        return prepayRefundAmount;
    }
    public void setPrepayRefundAmount(Double prepayRefundAmount) {
        this.prepayRefundAmount = prepayRefundAmount;
    }
    public Date getPrepayRefundTime() {
        return prepayRefundTime;
    }
    public void setPrepayRefundTime(Date prepayRefundTime) {
        this.prepayRefundTime = prepayRefundTime;
    }
    public String getAbnormalRemark() {
        return abnormalRemark;
    }
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java
@@ -200,7 +200,7 @@
     * @param type          1=微信,2=支付宝
     * @throws Exception
     */
    void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception;
    void payOrderPrivateCarCallback(Integer id, String order_id, Integer type, String outTradeNo) throws Exception;
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -431,6 +431,7 @@
                    orderPrivateCar.setTotalPeopleNum(peopleNum);
                    orderPrivateCar.setIsReassign(1);
                    orderPrivateCar.setIsDelete(1);
                    orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0);
                    this.insert(orderPrivateCar);
                    
                    if (orderSource == 2) {//扫码下单
@@ -506,6 +507,7 @@
                        orderPrivateCar.setTotalPeopleNum(peopleNum);
                        orderPrivateCar.setIsReassign(1);
                        orderPrivateCar.setIsDelete(1);
                        orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0);
                        this.insert(orderPrivateCar);
                        this.pushOrder(orderPrivateCar);
                    } else {
@@ -523,6 +525,7 @@
                        orderPrivateCar.setIsReassign(1);
                        orderPrivateCar.setIsDelete(1);
                        orderPrivateCar.setPid(orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid());
                        orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0);
                        this.insert(orderPrivateCar);
                        //修改总订单人数
                        OrderPrivateCar orderPrivateCar2 = new OrderPrivateCar();
@@ -743,6 +746,7 @@
                orderPrivateCar.setTotalPeopleNum(peopleNum);
                orderPrivateCar.setIsReassign(1);
                orderPrivateCar.setIsDelete(1);
                orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0);
                //判断独享,一口价,拼车
                JSONArray jsonArray = JSON.parseArray(serverCarModel);
@@ -1952,6 +1956,9 @@
        if (orderPrivateCar.getState() != 7) {
            return ResultUtil.error("订单不在待支付状态,不允许支付", "");
        }
        if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
            return ResultUtil.error("订单退款处理中,请等待退款完成", "");
        }
        Integer uid = orderPrivateCar.getUserId();
        Double orderMoney = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus() ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney());
        UserInfo userInfo = userInfoService.selectById(uid);
@@ -2007,12 +2014,14 @@
        orderMoney = orderMoney < 0 ? 0 : orderMoney;
        if (payType == 1) {//微信支付
            String app = type == 1 ? "APP" : "JSAPI";
            resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, "", 1);//添加预支付数据
            String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5);
            resultUtil = payMoneyUtil.weixinpay("完成订单", "", outTradeNo, orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, outTradeNo, 1);//添加预支付数据
        }
        if (payType == 2) {//支付宝支付
            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, "", 1);//添加预支付数据
            String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5);
            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", outTradeNo, orderMoney.toString(), "/base/aliPayOrderTaxi");
            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, outTradeNo, 1);//添加预支付数据
        }
        if (payType == 3) {//余额支付
            if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) {
@@ -2021,29 +2030,32 @@
            
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            
            boolean isPrepayFirstStage = isPrivateCarPrepayFirstStage(orderPrivateCar);
            boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar);
            if (isPrepayFirstStage) {
                handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, orderMoney, 3);
                return resultUtil;
            }
            OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
            SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(uid, "快车订单", orderMoney, 2, 1, 1, 1, orderId);
            userInfoService.updateById(userInfo);
            orderPrivateCar.setState(8);
            orderPrivateCar.setPayType(3);
            orderPrivateCar.setPayMoney(orderMoney);
            orderPrivateCar.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderPrivateCar.getPayMoney(), orderMoney) : orderMoney);
            orderPrivateCar.setPayTime(new Date());
            //处理优惠券和红包
            if (null != userCouponRecord) {
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            if (isPrepaySpreadStage) {
                orderPrivateCar.setPrepayStage(5);
                orderPrivateCar.setPrepaySecondPayNo(buildBalancePayNo(1, orderId));
            }
            if (null != query) {
                query.setState(2);
                query.setEndTime(new Date());
                userRedPacketRecordService.updateById(query);
            if (!isPrepaySpreadStage) {
                consumePrivateCarBenefits(orderPrivateCar);
            }
            //非追缴单才需要添加收入
            if(0 == orderPrivateCar.getRecoveryOrder()){
@@ -2087,6 +2099,9 @@
        }
        if (orderPrivateCar.getState() != 7) {
            return ResultUtil.error("订单不在待支付状态,不允许支付", new ArrayList<>());
        }
        if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
            return ResultUtil.error("订单退款处理中,请等待退款完成", new ArrayList<>());
        }
        Integer uid = orderPrivateCar.getUserId();
@@ -2259,8 +2274,9 @@
                return ResultUtil.error("请使用余额支付");
            }
            String app = type == 1 ? "APP" : "JSAPI";
            resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, "", 1);//添加预支付数据
            String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5);
            resultUtil = payMoneyUtil.weixinpay("完成订单", "", outTradeNo, orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, outTradeNo, 1);//添加预支付数据
            //创建定时任务查询订单支付状态
            ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
@@ -2291,8 +2307,9 @@
            if (orderMoney == 0) {
                return ResultUtil.error("请使用余额支付");
            }
            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, "", 1);//添加预支付数据
            String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5);
            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", outTradeNo, orderMoney.toString(), "/base/aliPayOrderTaxi");
            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, outTradeNo, 1);//添加预支付数据
        }
        if (payType == 3) {//余额支付
            if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) {
@@ -2300,7 +2317,14 @@
            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            boolean isPrepayFirstStage = isPrivateCarPrepayFirstStage(orderPrivateCar);
            boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar);
            if (isPrepayFirstStage) {
                handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, orderMoney, 3);
                return resultUtil;
            }
            OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
            SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
            if (null != query1) {
@@ -2313,22 +2337,15 @@
            
            orderPrivateCar.setState(8);
            orderPrivateCar.setPayType(3);
            orderPrivateCar.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderPrivateCar.getPayMoney(), orderMoney) : orderMoney);
            orderPrivateCar.setPayTime(new Date());
            //处理优惠券和红包
            if (null != userCouponRecord) {
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            if (isPrepaySpreadStage) {
                orderPrivateCar.setPrepayStage(5);
                orderPrivateCar.setPrepaySecondPayNo(buildBalancePayNo(1, orderId));
            }
            //处理打车卡
            if (null != userTaxiCard) {
                userTaxiCardService.updateById(userTaxiCard);
            }
            if (null != query) {
                query.setState(2);
                query.setEndTime(new Date());
                userRedPacketRecordService.updateById(query);
            if (!isPrepaySpreadStage) {
                consumePrivateCarBenefits(orderPrivateCar);
            }
            //非追缴单才添加收入记录
            if(0 == orderPrivateCar.getRecoveryOrder()){
@@ -2519,54 +2536,153 @@
            System.err.println("预支付数据异常(orderId = " + id + ")");
        }
    }
    private boolean isPrivateCarPrepayFirstStage(OrderPrivateCar orderPrivateCar) {
        return orderPrivateCar != null
                && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode())
                && Integer.valueOf(1).equals(orderPrivateCar.getPrepayStage());
    }
    private boolean isPrivateCarPrepaySpreadStage(OrderPrivateCar orderPrivateCar) {
        return orderPrivateCar != null
                && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode())
                && Integer.valueOf(3).equals(orderPrivateCar.getPrepayStage());
    }
    private String buildBalancePayNo(Integer orderType, Integer orderId) {
        return "BAL_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
    }
    private Double appendPayMoney(Double source, Double amount) {
        return new BigDecimal(source == null ? 0D : source)
                .add(new BigDecimal(amount == null ? 0D : amount))
                .setScale(2, BigDecimal.ROUND_HALF_EVEN)
                .doubleValue();
    }
    private void consumePrivateCarBenefits(OrderPrivateCar orderPrivateCar) throws Exception {
        if (null != orderPrivateCar.getCouponId()) {
            UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId());
            if (userCouponRecord != null) {
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
        }
        if (null != orderPrivateCar.getUserTaxiCardId()) {
            UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderPrivateCar.getUserTaxiCardId());
            if (userTaxiCard != null && (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3)) {
                JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
                jsonObject.put("time", jsonObject.getInteger("time") - 1);
                userTaxiCard.setContent(jsonObject.toJSONString());
                userTaxiCardService.updateById(userTaxiCard);
            }
        }
        if (null != orderPrivateCar.getRedPacketId()) {
            UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId());
            if (userRedPacketRecord != null) {
                userRedPacketRecord.setState(2);
                userRedPacketRecord.setEndTime(new Date());
                userRedPacketRecordService.updateById(userRedPacketRecord);
            }
        }
    }
    private void dispatchPrepayPrivateCarOrder(OrderPrivateCar orderPrivateCar) throws Exception {
        if (Integer.valueOf(3).equals(orderPrivateCar.getType()) && ToolUtil.isNotEmpty(orderPrivateCar.getServerCarModel())) {
            JSONArray jsonArray = JSON.parseArray(orderPrivateCar.getServerCarModel());
            for (int i = 0; i < jsonArray.size(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                Integer serverCarModelId = jsonObject.getInteger("serverCarModelId");
                Integer rideType = jsonObject.getInteger("rideType");
                if (serverCarModelId != null && serverCarModelId == 0) {
                    OrderTaxi orderTaxi = new OrderTaxi();
                    orderTaxi.setId(orderPrivateCar.getId());
                    orderTaxi.setState(1);
                    orderTaxi.setUserId(orderPrivateCar.getUserId());
                    orderTaxi.setStartLon(orderPrivateCar.getStartLon());
                    orderTaxi.setStartLat(orderPrivateCar.getStartLat());
                    orderTaxiService.pushOrder(orderTaxi, 3);
                    continue;
                }
                OrderPrivateCar pushOrder = new OrderPrivateCar();
                BeanUtils.copyProperties(orderPrivateCar, pushOrder);
                pushOrder.setRideType(rideType);
                pushOrder.setServerCarModelId(serverCarModelId);
                this.pushOrder(pushOrder);
            }
            return;
        }
        if (Integer.valueOf(3).equals(orderPrivateCar.getRideType())) {
            this.pushOrderPrivateCar(orderPrivateCar.getId());
            return;
        }
        this.pushOrder(orderPrivateCar);
    }
    private void handlePrivateCarPrepayFirstPaid(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double payAmount, Integer payType) throws Exception {
        OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
        SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
        if (null != query1) {
            userInfo.setIntegral(userInfo.getIntegral() + (payAmount.intValue() * query1.getIntegral()));
        }
        userInfoService.updateById(userInfo);
        consumePrivateCarBenefits(orderPrivateCar);
        transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车订单", payAmount, 2, 1, 1, 1, orderPrivateCar.getId());
        orderPrivateCar.setState(1);
        orderPrivateCar.setPayType(payType);
        orderPrivateCar.setPayMoney(payAmount);
        orderPrivateCar.setPayTime(new Date());
        orderPrivateCar.setPrepayStage(2);
        this.updateAllColumnById(orderPrivateCar);
        pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
        systemNoticeService.addSystemNotice(1, "您的快车订单已支付成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
        dispatchPrepayPrivateCarOrder(orderPrivateCar);
    }
    
    @Override
    public void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception {
    public void payOrderPrivateCarCallback(Integer id, String order_id, Integer type, String outTradeNo) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(id);
        PaymentRecord query = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, Integer.valueOf(id), 1, type, 1);
        PaymentRecord query = ToolUtil.isNotEmpty(outTradeNo) ? paymentRecordService.queryByCode(outTradeNo, 1) : null;
        if (query == null) {
            query = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, Integer.valueOf(id), 1, type, 1);
        }
        if (null != query && query.getState() == 1) {
            UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            if (isPrivateCarPrepayFirstStage(orderPrivateCar)) {
                handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, query.getAmount(), type);
                return;
            }
            //添加交易明细
            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId());
            orderPrivateCar.setState(8);
            orderPrivateCar.setPayType(type);
            orderPrivateCar.setPayMoney(query.getAmount());
            boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar);
            orderPrivateCar.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderPrivateCar.getPayMoney(), query.getAmount()) : query.getAmount());
            orderPrivateCar.setPayTime(new Date());
            UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
            if (isPrepaySpreadStage) {
                orderPrivateCar.setPrepayStage(5);
                orderPrivateCar.setPrepaySecondPayNo(order_id);
            }
            OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
            SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
            if(null != query1){
                userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
                userInfoService.updateById(userInfo);
            }
            //处理优惠券和红包
            if (null != orderPrivateCar.getCouponId()) {
                UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId());
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            if (!isPrepaySpreadStage) {
                consumePrivateCarBenefits(orderPrivateCar);
            }
            if (null != orderPrivateCar.getUserTaxiCardId()) {
                UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderPrivateCar.getUserTaxiCardId());
                if (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3) {
                    JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
                    jsonObject.put("time", jsonObject.getInteger("time") - 1);
                    userTaxiCard.setContent(jsonObject.toJSONString());
                    userTaxiCardService.updateById(userTaxiCard);
                }
            }
            if (null != orderPrivateCar.getRedPacketId()) {
                UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId());
                userRedPacketRecord.setState(2);
                userRedPacketRecord.setEndTime(new Date());
                userRedPacketRecordService.updateById(userRedPacketRecord);
            }
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            //非追缴单才需要记录收入
            if(null != orderPrivateCar.getRecoveryOrder() && 0 == orderPrivateCar.getRecoveryOrder()){
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/PaymentRecordMapper.java
@@ -20,4 +20,6 @@
                               @Param("type") Integer type, @Param("orderId") Integer orderId,
                               @Param("orderType") Integer orderType, @Param("payType") Integer payType,
                               @Param("state") Integer state);
    PaymentRecord queryByCode(@Param("code") String code, @Param("state") Integer state);
}
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/PaymentRecordMapper.xml
@@ -52,4 +52,24 @@
        </if>
        order by insertTime desc limit 0,1
    </select>
</mapper>
    <select id="queryByCode" resultType="PaymentRecord">
        select
        id as id,
        category as category,
        userId as userId,
        `type` as `type`,
        orderId as orderId,
        orderType as orderType,
        payType as payType,
        amount as amount,
        code as code,
        state as state,
        insertTime as insertTime
        from t_payment_record where code = #{code}
        <if test="null != state">
            and state = #{state}
        </if>
        order by insertTime desc limit 0,1
    </select>
</mapper>
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java
@@ -252,6 +252,31 @@
     */
    @TableField("paymentMode")
    private Integer paymentMode;
    /**
     * 预支付阶段(0=非预支付,1=待首付,2=已首付待结算,3=待补差,4=待退款,5=结算完成)
     */
    @TableField("prepayStage")
    private Integer prepayStage;
    /**
     * 预支付补差支付流水号
     */
    @TableField("prepaySecondPayNo")
    private String prepaySecondPayNo;
    /**
     * 预支付退款单号
     */
    @TableField("prepayRefundNo")
    private String prepayRefundNo;
    /**
     * 预支付退款金额
     */
    @TableField("prepayRefundAmount")
    private Double prepayRefundAmount;
    /**
     * 预支付退款时间
     */
    @TableField("prepayRefundTime")
    private Date prepayRefundTime;
    //感谢费
    @TableField("thankYouFee")
    private Double thankYouFee;
@@ -981,6 +1006,46 @@
        this.paymentMode = paymentMode;
    }
    public Integer getPrepayStage() {
        return prepayStage;
    }
    public void setPrepayStage(Integer prepayStage) {
        this.prepayStage = prepayStage;
    }
    public String getPrepaySecondPayNo() {
        return prepaySecondPayNo;
    }
    public void setPrepaySecondPayNo(String prepaySecondPayNo) {
        this.prepaySecondPayNo = prepaySecondPayNo;
    }
    public String getPrepayRefundNo() {
        return prepayRefundNo;
    }
    public void setPrepayRefundNo(String prepayRefundNo) {
        this.prepayRefundNo = prepayRefundNo;
    }
    public Double getPrepayRefundAmount() {
        return prepayRefundAmount;
    }
    public void setPrepayRefundAmount(Double prepayRefundAmount) {
        this.prepayRefundAmount = prepayRefundAmount;
    }
    public Date getPrepayRefundTime() {
        return prepayRefundTime;
    }
    public void setPrepayRefundTime(Date prepayRefundTime) {
        this.prepayRefundTime = prepayRefundTime;
    }
    public Integer getInvoiceId() {
        return invoiceId;
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java
@@ -250,7 +250,7 @@
     * @param type          1=微信,2=支付宝
     * @throws Exception
     */
    void payOrderTaxiCallback(Integer id, String order_id, Integer type,Integer paymentId) throws Exception;
    void payOrderTaxiCallback(Integer id, String order_id, Integer type, Integer paymentId, String outTradeNo) throws Exception;
    /**
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IPaymentRecordService.java
@@ -32,4 +32,6 @@
     */
    PaymentRecord query(Integer category, Integer userId, Integer type, Integer orderId, Integer orderType,
               Integer payType, Integer state) throws Exception;
    PaymentRecord queryByCode(String code, Integer state) throws Exception;
}
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -398,6 +398,7 @@
            driver.setState(3);
            driverService.updateById(driver);
        }
        orderTaxi.setPrepayStage(Integer.valueOf(1).equals(orderTaxi.getPaymentMode()) ? 1 : 0);
        
        this.insert(orderTaxi);
        
@@ -1273,6 +1274,9 @@
        if (orderTaxi.getState() != 7) {
            return ResultUtil.error("订单不在待支付状态,不允许支付", "");
        }
        if (Integer.valueOf(1).equals(orderTaxi.getPaymentMode()) && Integer.valueOf(4).equals(orderTaxi.getPrepayStage())) {
            return ResultUtil.error("订单退款处理中,请等待退款完成", "");
        }
        Integer uid = orderTaxi.getUserId();
        Double orderMoney = (2 == orderTaxi.getAbnormal() && 2 == orderTaxi.getAbnormalStatus() ? orderTaxi.getResponsibilityMoney().doubleValue() : orderTaxi.getOrderMoney());
        UserInfo userInfo = userInfoService.selectById(uid);
@@ -1327,12 +1331,14 @@
        
        if (payType == 1) {//微信支付
            String app = type == 1 ? "APP" : "JSAPI";
            resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_2_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 1, orderMoney, "", 1);//添加预支付数据
            String outTradeNo = orderId + "_2_" + UUIDUtil.getRandomCode(5);
            resultUtil = payMoneyUtil.weixinpay("完成订单", "", outTradeNo, orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 1, orderMoney, outTradeNo, 1);//添加预支付数据
        }
        if (payType == 2) {//支付宝支付
            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_2_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
            paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 2, orderMoney, "", 1);//添加预支付数据
            String outTradeNo = orderId + "_2_" + UUIDUtil.getRandomCode(5);
            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", outTradeNo, orderMoney.toString(), "/base/aliPayOrderTaxi");
            paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 2, orderMoney, outTradeNo, 1);//添加预支付数据
        }
        if (payType == 3) {//余额支付
            if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) {
@@ -1340,7 +1346,14 @@
            }
            
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            boolean isPrepayFirstStage = isTaxiPrepayFirstStage(orderTaxi);
            boolean isPrepaySpreadStage = isTaxiPrepaySpreadStage(orderTaxi);
            if (isPrepayFirstStage) {
                handleTaxiPrepayFirstPaid(orderTaxi, userInfo, orderMoney, 3);
                return resultUtil;
            }
            OpenCity openCity = openCityService.openCity1(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString());
            SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
@@ -1348,24 +1361,20 @@
            //添加交易明细
            transactionDetailsService.saveData(uid, "出租车", orderMoney, 2, 1, 1, 2, orderId);
            userInfoService.updateById(userInfo);
            orderTaxi.setState(8);
            orderTaxi.setPayType(3);
            orderTaxi.setPayMoney(orderMoney);
            orderTaxi.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderTaxi.getPayMoney(), orderMoney) : orderMoney);
            orderTaxi.setPayTime(new Date());
            //处理优惠券和红包
            if (null != userCouponRecord) {
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            if (isPrepaySpreadStage) {
                orderTaxi.setPrepayStage(5);
                orderTaxi.setPrepaySecondPayNo(buildBalancePayNo(2, orderId));
            }
            if (null != query) {
                query.setState(2);
                query.setEndTime(new Date());
                userRedPacketRecordService.updateById(query);
            if (!isPrepaySpreadStage) {
                consumeTaxiBenefits(orderTaxi);
            }
            if (Integer.valueOf(2).equals(orderTaxi.getPaymentMode())) {
            if (Integer.valueOf(2).equals(orderTaxi.getPaymentMode()) || isPrepaySpreadStage) {
                //添加收入
                Map<String, Object> map = incomeService.saveIncome(orderTaxi.getId(), 2, orderTaxi.getOrderMoney());
                orderTaxi.setSplitAllocation(JSON.toJSONString(map));
@@ -1407,6 +1416,9 @@
        }
        if (orderTaxi.getState() != 7) {
            return ResultUtil.error("订单不在待支付状态,不允许支付", "");
        }
        if (Integer.valueOf(1).equals(orderTaxi.getPaymentMode()) && Integer.valueOf(4).equals(orderTaxi.getPrepayStage())) {
            return ResultUtil.error("订单退款处理中,请等待退款完成", "");
        }
        Integer uid = orderTaxi.getUserId();
        Double orderMoney = (2 == orderTaxi.getAbnormal() && 2 == orderTaxi.getAbnormalStatus() ? orderTaxi.getResponsibilityMoney().doubleValue() : orderTaxi.getOrderMoney());
@@ -1572,16 +1584,18 @@
                return ResultUtil.error("请使用余额支付");
            }
            String app = type == 1 ? "APP" : "JSAPI";
            resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_2_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
            String outTradeNo = orderId + "_2_" + UUIDUtil.getRandomCode(5);
            resultUtil = payMoneyUtil.weixinpay("完成订单", "", outTradeNo, orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
            
            paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 1, orderMoney, "", 1);//添加预支付数据
            paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 1, orderMoney, outTradeNo, 1);//添加预支付数据
        }
        if (payType == 2) {//支付宝支付
            if (orderMoney == 0) {
                return ResultUtil.error("请使用余额支付");
            }
            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_2_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
            paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 2, orderMoney, "", 1);//添加预支付数据
            String outTradeNo = orderId + "_2_" + UUIDUtil.getRandomCode(5);
            resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", outTradeNo, orderMoney.toString(), "/base/aliPayOrderTaxi");
            paymentRecordService.saveData(1, orderTaxi.getUserId(), 1, orderId, 2, 2, orderMoney, outTradeNo, 1);//添加预支付数据
        }
        if (payType == 3) {//余额支付
            if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) {
@@ -1595,39 +1609,38 @@
//            }
            
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            boolean isPrepayFirstStage = isTaxiPrepayFirstStage(orderTaxi);
            boolean isPrepaySpreadStage = isTaxiPrepaySpreadStage(orderTaxi);
            if (isPrepayFirstStage) {
                handleTaxiPrepayFirstPaid(orderTaxi, userInfo, orderMoney, 3);
                return resultUtil;
            }
            OpenCity openCity = openCityService.openCity1(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString());
            SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
            if (null != query1) {
                userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            }
            //添加交易明细
            transactionDetailsService.saveData(uid, "出租车", orderMoney, 2, 1, 1, 2, orderId);
            userInfoService.updateById(userInfo);
            orderTaxi.setState(8);
            orderTaxi.setPayType(3);
            orderTaxi.setPayMoney(orderMoney);
            orderTaxi.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderTaxi.getPayMoney(), orderMoney) : orderMoney);
            orderTaxi.setPayTime(new Date());
            //处理优惠券和红包
            if (null != userCouponRecord) {
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            if (isPrepaySpreadStage) {
                orderTaxi.setPrepayStage(5);
                orderTaxi.setPrepaySecondPayNo(buildBalancePayNo(2, orderId));
            }
            //处理打车卡
            if (null != userTaxiCard) {
                userTaxiCardService.updateById(userTaxiCard);
            }
            if (null != query) {
                query.setState(2);
                query.setEndTime(new Date());
                userRedPacketRecordService.updateById(query);
            if (!isPrepaySpreadStage) {
                consumeTaxiBenefits(orderTaxi);
            }
            //非追缴单才添加收入记录
            if(0 == orderTaxi.getRecoveryOrder() && Integer.valueOf(2).equals(orderTaxi.getPaymentMode())){
            if(0 == orderTaxi.getRecoveryOrder() && (Integer.valueOf(2).equals(orderTaxi.getPaymentMode()) || isPrepaySpreadStage)){
                //添加收入
                Double orderMoney1 = (2 == orderTaxi.getAbnormal() && 2 == orderTaxi.getAbnormalStatus() ? orderTaxi.getResponsibilityMoney().doubleValue() : orderTaxi.getOrderMoney());
                Map<String, Object> map = incomeService.saveIncome(orderTaxi.getId(), 2, orderTaxi.getOrderMoney());
@@ -2024,6 +2037,80 @@
        }
        return ResultUtil.success();
    }
    private boolean isTaxiPrepayFirstStage(OrderTaxi orderTaxi) {
        return orderTaxi != null
                && Integer.valueOf(1).equals(orderTaxi.getPaymentMode())
                && Integer.valueOf(1).equals(orderTaxi.getPrepayStage());
    }
    private boolean isTaxiPrepaySpreadStage(OrderTaxi orderTaxi) {
        return orderTaxi != null
                && Integer.valueOf(1).equals(orderTaxi.getPaymentMode())
                && Integer.valueOf(3).equals(orderTaxi.getPrepayStage());
    }
    private String buildBalancePayNo(Integer orderType, Integer orderId) {
        return "BAL_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
    }
    private Double appendPayMoney(Double source, Double amount) {
        return new BigDecimal(source == null ? 0D : source)
                .add(new BigDecimal(amount == null ? 0D : amount))
                .setScale(2, BigDecimal.ROUND_HALF_EVEN)
                .doubleValue();
    }
    private void consumeTaxiBenefits(OrderTaxi orderTaxi) throws Exception {
        if (null != orderTaxi.getCouponId()) {
            UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderTaxi.getCouponId());
            if (userCouponRecord != null) {
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
        }
        if (null != orderTaxi.getUserTaxiCardId()) {
            UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderTaxi.getUserTaxiCardId());
            if (userTaxiCard != null && (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3)) {
                JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
                jsonObject.put("time", jsonObject.getInteger("time") - 1);
                userTaxiCard.setContent(jsonObject.toJSONString());
                userTaxiCardService.updateById(userTaxiCard);
            }
        }
        if (null != orderTaxi.getRedPacketId()) {
            UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderTaxi.getRedPacketId());
            if (userRedPacketRecord != null) {
                userRedPacketRecord.setState(2);
                userRedPacketRecord.setEndTime(new Date());
                userRedPacketRecordService.updateById(userRedPacketRecord);
            }
        }
    }
    private void handleTaxiPrepayFirstPaid(OrderTaxi orderTaxi, UserInfo userInfo, Double payAmount, Integer payType) throws Exception {
        OpenCity openCity = openCityService.openCity1(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString());
        SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
        if (null != query1) {
            userInfo.setIntegral(userInfo.getIntegral() + (payAmount.intValue() * query1.getIntegral()));
        }
        userInfoService.updateById(userInfo);
        consumeTaxiBenefits(orderTaxi);
        transactionDetailsService.saveData(orderTaxi.getUserId(), "出租车", payAmount, 2, 1, 1, 2, orderTaxi.getId());
        orderTaxi.setState(1);
        orderTaxi.setPayType(payType);
        orderTaxi.setPayMoney(payAmount);
        orderTaxi.setPayTime(new Date());
        orderTaxi.setPrepayStage(2);
        this.updateAllColumnById(orderTaxi);
        pushUtil.pushOrderState(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
        systemNoticeService.addSystemNotice(1, "您的出租车订单已支付成功,我们正在为您指派司机,请稍后!", orderTaxi.getUserId(), 1);
        this.pushOrder(orderTaxi, 1);
    }
    
    
    /**
@@ -2050,55 +2137,48 @@
     * @throws Exception
     */
    @Override
    public void payOrderTaxiCallback(Integer id, String order_id, Integer type, Integer paymentId) throws Exception {
    public void payOrderTaxiCallback(Integer id, String order_id, Integer type, Integer paymentId, String outTradeNo) throws Exception {
        OrderTaxi orderTaxi = this.selectById(id);
        PaymentRecord query = paymentRecordService.query(1, orderTaxi.getUserId(), 1, Integer.valueOf(id), 2, type, 1);
        PaymentRecord query = ToolUtil.isNotEmpty(outTradeNo) ? paymentRecordService.queryByCode(outTradeNo, 1) : null;
        if (query == null) {
            query = paymentRecordService.query(1, orderTaxi.getUserId(), 1, Integer.valueOf(id), 2, type, 1);
        }
        if (null != query && query.getState() == 1) {
            UserInfo userInfo = userInfoService.selectById(orderTaxi.getUserId());
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            if (isTaxiPrepayFirstStage(orderTaxi)) {
                handleTaxiPrepayFirstPaid(orderTaxi, userInfo, query.getAmount(), type);
                return;
            }
            //添加交易明细
            transactionDetailsService.saveData(orderTaxi.getUserId(), "出租车", query.getAmount(), 2, 1, 1, 2, query.getOrderId());
            orderTaxi.setState(8);
            orderTaxi.setPayType(type);
            orderTaxi.setPayMoney(query.getAmount());
            boolean isPrepaySpreadStage = isTaxiPrepaySpreadStage(orderTaxi);
            orderTaxi.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderTaxi.getPayMoney(), query.getAmount()) : query.getAmount());
            orderTaxi.setPayTime(new Date());
            UserInfo userInfo = userInfoService.selectById(orderTaxi.getUserId());
            if (isPrepaySpreadStage) {
                orderTaxi.setPrepayStage(5);
                orderTaxi.setPrepaySecondPayNo(order_id);
            }
            OpenCity openCity = openCityService.openCity1(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString());
            SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
            if(null != query1){
                userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
                userInfoService.updateById(userInfo);
            }
            //处理优惠券和红包
            if (null != orderTaxi.getCouponId()) {
                UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderTaxi.getCouponId());
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            if (!isPrepaySpreadStage) {
                consumeTaxiBenefits(orderTaxi);
            }
            if (null != orderTaxi.getUserTaxiCardId()) {
                UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderTaxi.getUserTaxiCardId());
                if (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3) {
                    JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
                    jsonObject.put("time", jsonObject.getInteger("time") - 1);
                    userTaxiCard.setContent(jsonObject.toJSONString());
                    userTaxiCardService.updateById(userTaxiCard);
                }
            }
            if (null != orderTaxi.getRedPacketId()) {
                UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderTaxi.getRedPacketId());
                userRedPacketRecord.setState(2);
                userRedPacketRecord.setEndTime(new Date());
                userRedPacketRecordService.updateById(userRedPacketRecord);
            }
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            
            //非追缴单才添加收入记录
            if(0 == orderTaxi.getRecoveryOrder() && Integer.valueOf(2).equals(orderTaxi.getPaymentMode())){
            if(0 == orderTaxi.getRecoveryOrder() && (Integer.valueOf(2).equals(orderTaxi.getPaymentMode()) || Integer.valueOf(5).equals(orderTaxi.getPrepayStage()))){
                //添加收入
                Double orderMoney1 = (2 == orderTaxi.getAbnormal() && 2 == orderTaxi.getAbnormalStatus() ? orderTaxi.getResponsibilityMoney().doubleValue() : orderTaxi.getOrderMoney());
                Map<String, Object> map = incomeService.saveIncome(orderTaxi.getId(), 2, orderMoney1);
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java
@@ -66,4 +66,9 @@
                                     Integer payType, Integer state) throws Exception {
        return paymentRecordMapper.query(category, userId, type, orderId, orderType, payType, state);
    }
    @Override
    public PaymentRecord queryByCode(String code, Integer state) throws Exception {
        return paymentRecordMapper.queryByCode(code, state);
    }
}