From dc4972749d8dc399b02a548adfd12119fc8c2bcd Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期一, 11 五月 2026 20:49:52 +0800
Subject: [PATCH] fix bugs

---
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java | 1033 ++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 838 insertions(+), 195 deletions(-)

diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
index 556a429..c869896 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -1,5 +1,6 @@
 package com.stylefeng.guns.modular.specialTrain.server.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -46,6 +47,7 @@
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -57,7 +59,7 @@
 @Service
 public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
 	
-	public static List<Integer> orderIds = new ArrayList<>();
+	public static Set<Integer> orderIds = ConcurrentHashMap.newKeySet();;
 	@Resource
 	private OrderPrivateCarMapper orderPrivateCarMapper;
 	@Resource
@@ -130,6 +132,9 @@
 	private IOrderTaxiService orderTaxiService;
 	@Autowired
 	private PayMoneyUtil payMoneyUtil;
+
+	@Autowired
+	private CbyzxOrderPayHelper cbyzxOrderPayHelper;
 	@Autowired
 	private TAbnormalPayOrderMapper abnormalPayOrderMapper;
 	@Autowired
@@ -307,6 +312,9 @@
 				if (orderSource != 2) { // 扫码下单跳过先付判断(扫码下单已有固定司机)
 					TSysPaymentMode paymentMode = tSysPaymentModeService.selectOne(
 							new EntityWrapper<TSysPaymentMode>().last("LIMIT 1"));
+					if (paymentMode != null && paymentMode.getPrivateType() != null) {
+						baseWarpper.setPaymentMode(paymentMode.getPrivateType());
+					}
 					if (paymentMode != null && Integer.valueOf(1).equals(paymentMode.getPrivateType())) {
 						// 先付模式:计算预估金额,订单状态改为7(待支付)
 						Company payCompany = companyCityService.query(geocode.get("districtCode"));
@@ -338,6 +346,7 @@
 										Double estimateMoney = Double.valueOf(amountMap.get("zongfeiyong").toString());
 										orderPrivateCar.setEstimateAmount(estimateMoney);
 										orderPrivateCar.setOrderMoney(estimateMoney);
+										baseWarpper.setEstimateAmount(estimateMoney);
 									}
 								}
 								// 先付模式:覆盖状态为7(待支付),不进行派单
@@ -429,6 +438,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) {//扫码下单
@@ -504,6 +514,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 {
@@ -521,6 +532,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();
@@ -691,6 +703,49 @@
 					orderPrivateCar.setPassengersPhone(userInfo.getPhone());
 				}
 				orderPrivateCar.setState(1);
+				if (orderSource != 2) {
+					TSysPaymentMode paymentMode = tSysPaymentModeService.selectOne(
+							new EntityWrapper<TSysPaymentMode>().last("LIMIT 1"));
+					if (paymentMode != null && paymentMode.getPrivateType() != null) {
+						baseWarpper.setPaymentMode(paymentMode.getPrivateType());
+					}
+					if (paymentMode != null && Integer.valueOf(1).equals(paymentMode.getPrivateType())) {
+						Company payCompany = companyCityService.query(geocode.get("districtCode"));
+						if (payCompany != null) {
+							try {
+								double distanceMeters = orderPrivateCar.getEstimateMileage() != null
+										? orderPrivateCar.getEstimateMileage() : 0;
+								long durationSeconds = orderPrivateCar.getEstimateTime() != null
+										? (long) (orderPrivateCar.getEstimateTime() * 60) : 0;
+								List<ServerCarModelWarpper> priceList = serverCarModelService.getPrice(
+										payCompany.getId(), distanceMeters, durationSeconds, 0L, 1, geocode);
+								Double estimateMoney = getBatchEstimateAmount(serverCarModel, priceList);
+								if (estimateMoney != null) {
+									orderPrivateCar.setEstimateAmount(estimateMoney);
+									orderPrivateCar.setOrderMoney(estimateMoney);
+									orderPrivateCar.setState(7);
+									orderPrivateCar.setCompanyId(payCompany.getId());
+									orderPrivateCar.setPaymentMode(1);
+									baseWarpper.setEstimateAmount(estimateMoney);
+								} else {
+									orderPrivateCar.setPaymentMode(2);
+								}
+							} catch (Exception e) {
+								e.printStackTrace();
+								orderPrivateCar.setPaymentMode(2);
+								orderPrivateCar.setState(1);
+							}
+						} else {
+							orderPrivateCar.setPaymentMode(1);
+						}
+					} else {
+						orderPrivateCar.setPaymentMode(
+								(paymentMode != null && paymentMode.getPrivateType() != null)
+										? paymentMode.getPrivateType()
+										: 2
+						);
+					}
+				}
 				orderPrivateCar.setInsertTime(new Date());
 				orderPrivateCar.setTravelTime(travelTime);
 				orderPrivateCar.setOrderType(reservation);
@@ -698,138 +753,126 @@
 				orderPrivateCar.setTotalPeopleNum(peopleNum);
 				orderPrivateCar.setIsReassign(1);
 				orderPrivateCar.setIsDelete(1);
+				orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0);
 
 				//判断独享,一口价,拼车
 				JSONArray jsonArray = JSON.parseArray(serverCarModel);
 				this.insert(orderPrivateCar);
 
-
-				for (int i = 0; i < jsonArray.size(); i++) {
-					JSONObject jsonObject1 = jsonArray.getJSONObject(i);
-					Integer serverCarModelId = jsonObject1.getInteger("serverCarModelId");
-					Integer rideType = jsonObject1.getInteger("rideType");
-					if (0 == serverCarModelId) {
-						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);
-					}
-					
-					if (rideType != 3) {
-						//推单操作-独享
-						this.pushOrder(orderPrivateCar.getId(), rideType, serverCarModelId, orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat());
-					} else {
-						OrderPrivateCar orderPrivateCar1 = null;
-						OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
-						TbSpellOrderRule spellOrderRule = spellOrderRuleService.selectOne(new EntityWrapper<TbSpellOrderRule>().eq("openCityId", openCity.getId()));
-						//判断是否有相同线路的拼车-有直接拼成功,或者推送拼车订单
-						List<OrderPrivateCar> orderList = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().eq("rideType", 3).in("state", "2,3,4").le("totalPeopleNum", 4 - peopleNum));
-						for (OrderPrivateCar order : orderList) {
-							if (spellOrderRule != null) {
-								JSONObject jsonObject = JSONObject.parseObject(spellOrderRule.getContent());
-								//判断时间
-								if (travelTime.getTime() >= order.getTravelTime().getTime() - jsonObject.getInteger("num5") * 60000L && travelTime.getTime() <= order.getTravelTime().getTime() + jsonObject.getInteger("num6") * 60000L) {
-									//                        Double dis1 = Double.valueOf(gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), order.getStartLon() + "," + order.getStartLat(), 1).get("distance").toString());
-									//                        Double dis2 = Double.valueOf(gdMapElectricFenceUtil.getDistance(orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), order.getEndLon() + "," + order.getEndLat(), 1).get("distance").toString());
-									// TODO: 2023/11/4  已改成计算直线距离
-									Double dis1 = geodesyUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), order.getStartLon() + "," + order.getStartLat()).get("WGS84");
-									Double dis2 = geodesyUtil.getDistance(orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), order.getEndLon() + "," + order.getEndLat()).get("WGS84");
-									//判断距离
-									if (dis1 <= jsonObject.getInteger("num1") * 1000 && dis2 <= jsonObject.getInteger("num2") * 1000) {
-										orderPrivateCar1 = order;
-										break;
-									}
-								}
-							}
+				if (orderPrivateCar.getState() != 7) {
+					for (int i = 0; i < jsonArray.size(); i++) {
+						JSONObject jsonObject1 = jsonArray.getJSONObject(i);
+						Integer serverCarModelId = jsonObject1.getInteger("serverCarModelId");
+						Integer rideType = jsonObject1.getInteger("rideType");
+						if (0 == serverCarModelId) {
+							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);
 						}
-						if (orderPrivateCar1 == null) {
-							orderList = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().eq("rideType", 3).eq("state", 5).le("totalPeopleNum", 4 - peopleNum));
+						
+						if (rideType != 3) {
+							//推单操作-独享
+							this.pushOrder(orderPrivateCar.getId(), rideType, serverCarModelId, orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat());
+						} else {
+							OrderPrivateCar orderPrivateCar1 = null;
+							OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
+							TbSpellOrderRule spellOrderRule = spellOrderRuleService.selectOne(new EntityWrapper<TbSpellOrderRule>().eq("openCityId", openCity.getId()));
+							//判断是否有相同线路的拼车-有直接拼成功,或者推送拼车订单
+							List<OrderPrivateCar> orderList = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().eq("rideType", 3).in("state", "2,3,4").le("totalPeopleNum", 4 - peopleNum));
 							for (OrderPrivateCar order : orderList) {
 								if (spellOrderRule != null) {
 									JSONObject jsonObject = JSONObject.parseObject(spellOrderRule.getContent());
 									//判断时间
 									if (travelTime.getTime() >= order.getTravelTime().getTime() - jsonObject.getInteger("num5") * 60000L && travelTime.getTime() <= order.getTravelTime().getTime() + jsonObject.getInteger("num6") * 60000L) {
-										String value = (String) redisTemplate.opsForValue().get("dache:DRIVER" + String.valueOf(order.getDriverId()));
-										//                            Double dis1 = Double.valueOf(gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 1).get("distance").toString());
-										//                            Double dis2 = Double.valueOf(gdMapElectricFenceUtil.getDistance(orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), order.getEndLon() + "," + order.getEndLat(), 1).get("distance").toString());
-										
-										// TODO: 2023/11/4  已改成计算直线距离
-										Double dis1 = geodesyUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value).get("WGS84");
+										Double dis1 = geodesyUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), order.getStartLon() + "," + order.getStartLat()).get("WGS84");
 										Double dis2 = geodesyUtil.getDistance(orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), order.getEndLon() + "," + order.getEndLat()).get("WGS84");
-										//判断距离
-										if (dis1 <= jsonObject.getInteger("num3") * 1000 && dis2 <= jsonObject.getInteger("num4") * 1000) {
+										if (dis1 <= jsonObject.getInteger("num1") * 1000 && dis2 <= jsonObject.getInteger("num2") * 1000) {
 											orderPrivateCar1 = order;
 											break;
 										}
 									}
 								}
 							}
-						}
-						if (orderPrivateCar1 == null) {
-							this.pushOrder(orderPrivateCar.getId(), rideType, serverCarModelId, orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat());
-						} else {
-							Driver driver = driverService.selectById(orderPrivateCar1.getDriverId());
-							orderPrivateCar.setDriverId(driverId);
-							orderPrivateCar.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
-									driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
-							orderPrivateCar.setState(2);
-							orderPrivateCar.setDriverId(driver.getId());
-							orderPrivateCar.setCarId(driver.getCarId());
-							CarService query1 = carServiceMapper.query(1, driver.getCarId());
-							orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
-							orderPrivateCar.setRideType(3);
-							orderPrivateCar.setSnatchOrderTime(new Date());
-							orderPrivateCar.setTotalPeopleNum(peopleNum + orderPrivateCar1.getTotalPeopleNum());
-							orderPrivateCar.setIsReassign(1);
-							orderPrivateCar.setIsDelete(1);
-							orderPrivateCar.setPid(orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid());
-
-							Integer promotion1 = isPromotion(orderPrivateCar.getUserId(), driver.getPlaceOfEmployment());
-							if(promotion1!=null){
-								orderPrivateCar.setPromotion(2);
-								Driver driver1 = driverService.selectById(promotion1);
-								orderPrivateCar.setPromotionUser(driver1.getName());
-								orderPrivateCar.setPromotionPhone(driver1.getPhone());
-								orderPrivateCar.setPromotionDriverId(promotion1);
-							}
-
-							//修改总订单人数
-							OrderPrivateCar orderPrivateCar2 = new OrderPrivateCar();
-							orderPrivateCar2.setSpellSuccess(1);
-							orderPrivateCar2.setTotalPeopleNum(peopleNum + orderPrivateCar1.getTotalPeopleNum());
-							this.update(orderPrivateCar2, new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid()).lt("state", 6));
-							this.update(orderPrivateCar2, new EntityWrapper<OrderPrivateCar>().eq("id", orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid()).lt("state", 6));
-							//
-							//调用移动的小号接口
-//							Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderPrivateCar.getPassengersPhone(), driver.getPhone(), (System.currentTimeMillis() + 86400000));
-//							if (String.valueOf(map.get("code")).equals("200")) {
-//								orderPrivateCar.setTelX(map.get("telX"));
-//								orderPrivateCar.setBindId(map.get("bindId"));
-//							}
-							new Thread(new Runnable() {
-								@Override
-								public void run() {
-									pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0);
-									pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 100, 0);
-									pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
-									
+							if (orderPrivateCar1 == null) {
+								orderList = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().eq("rideType", 3).eq("state", 5).le("totalPeopleNum", 4 - peopleNum));
+								for (OrderPrivateCar order : orderList) {
+									if (spellOrderRule != null) {
+										JSONObject jsonObject = JSONObject.parseObject(spellOrderRule.getContent());
+										if (travelTime.getTime() >= order.getTravelTime().getTime() - jsonObject.getInteger("num5") * 60000L && travelTime.getTime() <= order.getTravelTime().getTime() + jsonObject.getInteger("num6") * 60000L) {
+											String value = (String) redisTemplate.opsForValue().get("dache:DRIVER" + String.valueOf(order.getDriverId()));
+											Double dis1 = geodesyUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value).get("WGS84");
+											Double dis2 = geodesyUtil.getDistance(orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), order.getEndLon() + "," + order.getEndLat()).get("WGS84");
+											if (dis1 <= jsonObject.getInteger("num3") * 1000 && dis2 <= jsonObject.getInteger("num4") * 1000) {
+												orderPrivateCar1 = order;
+												break;
+											}
+										}
+									}
 								}
-							}).start();
-							List<OrderPrivateCar> orderList1 = this.selectList(new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar.getPid()));
-							for (OrderPrivateCar orderPrivateCar3 : orderList1) {
+							}
+							if (orderPrivateCar1 == null) {
+								this.pushOrder(orderPrivateCar.getId(), rideType, serverCarModelId, orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat());
+							} else {
+								Driver driver = driverService.selectById(orderPrivateCar1.getDriverId());
+								orderPrivateCar.setDriverId(driverId);
+								orderPrivateCar.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
+										driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
+								orderPrivateCar.setState(2);
+								orderPrivateCar.setDriverId(driver.getId());
+								orderPrivateCar.setCarId(driver.getCarId());
+								CarService query1 = carServiceMapper.query(1, driver.getCarId());
+								orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
+								orderPrivateCar.setRideType(3);
+								orderPrivateCar.setSnatchOrderTime(new Date());
+								orderPrivateCar.setTotalPeopleNum(peopleNum + orderPrivateCar1.getTotalPeopleNum());
+								orderPrivateCar.setIsReassign(1);
+								orderPrivateCar.setIsDelete(1);
+								orderPrivateCar.setPid(orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid());
+
+								Integer promotion1 = isPromotion(orderPrivateCar.getUserId(), driver.getPlaceOfEmployment());
+								if(promotion1!=null){
+									orderPrivateCar.setPromotion(2);
+									Driver driver1 = driverService.selectById(promotion1);
+									orderPrivateCar.setPromotionUser(driver1.getName());
+									orderPrivateCar.setPromotionPhone(driver1.getPhone());
+									orderPrivateCar.setPromotionDriverId(promotion1);
+								}
+
+								OrderPrivateCar orderPrivateCar2 = new OrderPrivateCar();
+								orderPrivateCar2.setSpellSuccess(1);
+								orderPrivateCar2.setTotalPeopleNum(peopleNum + orderPrivateCar1.getTotalPeopleNum());
+								this.update(orderPrivateCar2, new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid()).lt("state", 6));
+								this.update(orderPrivateCar2, new EntityWrapper<OrderPrivateCar>().eq("id", orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid()).lt("state", 6));
+								new Thread(new Runnable() {
+									@Override
+									public void run() {
+										pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0);
+										pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 100, 0);
+										pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
+										
+									}
+								}).start();
+								List<OrderPrivateCar> orderList1 = this.selectList(new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar.getPid()));
+								for (OrderPrivateCar orderPrivateCar3 : orderList1) {
+									pushUtil.pushOrderState(1, orderPrivateCar3.getUserId(), orderPrivateCar3.getId(), 1, 13, 0);
+								}
+								OrderPrivateCar orderPrivateCar3 = this.selectById(orderPrivateCar.getPid());
 								pushUtil.pushOrderState(1, orderPrivateCar3.getUserId(), orderPrivateCar3.getId(), 1, 13, 0);
 							}
-							OrderPrivateCar orderPrivateCar3 = this.selectById(orderPrivateCar.getPid());
-							pushUtil.pushOrderState(1, orderPrivateCar3.getUserId(), orderPrivateCar3.getId(), 1, 13, 0);
 						}
 					}
 				}
 				
 				//添加消息
-				systemNoticeService.addSystemNotice(1, "您的快车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
+				if (orderPrivateCar.getState() == 7) {
+					systemNoticeService.addSystemNotice(1, "您的快车订单已生成,请先完成支付。", orderPrivateCar.getUserId(), 1);
+				} else {
+					systemNoticeService.addSystemNotice(1, "您的快车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
+				}
 				baseWarpper.setId(orderPrivateCar.getId());
 			} catch (Exception e) {
 				e.printStackTrace();
@@ -840,6 +883,45 @@
 			return ResultUtil.error("系统繁忙,请稍后再试!");
 		}
 		return ResultUtil.success(baseWarpper);
+	}
+
+	private Double getBatchEstimateAmount(String serverCarModel, List<ServerCarModelWarpper> priceList) {
+		if (ToolUtil.isEmpty(serverCarModel) || priceList == null || priceList.isEmpty()) {
+			return null;
+		}
+		JSONArray jsonArray = JSON.parseArray(serverCarModel);
+		Double minEstimateAmount = null;
+		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) {
+				continue;
+			}
+			ServerCarModelWarpper matched = priceList.stream()
+					.filter(item -> item.getId() != null && item.getId().equals(serverCarModelId))
+					.findFirst()
+					.orElse(null);
+			if (matched == null) {
+				continue;
+			}
+			Map<String, Object> amountMap;
+			if (Integer.valueOf(2).equals(rideType)) {
+				amountMap = matched.getBuyNowAmount();
+			} else if (Integer.valueOf(3).equals(rideType)) {
+				amountMap = matched.getPutTogetherOneAmount();
+			} else {
+				amountMap = matched.getAmount();
+			}
+			if (amountMap == null || amountMap.get("zongfeiyong") == null) {
+				continue;
+			}
+			Double estimateAmount = Double.valueOf(amountMap.get("zongfeiyong").toString());
+			if (minEstimateAmount == null || estimateAmount < minEstimateAmount) {
+				minEstimateAmount = estimateAmount;
+			}
+		}
+		return minEstimateAmount;
 	}
 
 
@@ -1050,8 +1132,11 @@
 //        if(orderPrivateCar.getState() == 4){
 //            return ResultUtil.error("司机已到达预约点,取消会产生一定的费用");
 //        }
-		if (orderPrivateCar.getState() >= 5 && orderPrivateCar.getState() != 11) {
+		if (orderPrivateCar.getState() >= 5 && orderPrivateCar.getState() != 11 && orderPrivateCar.getCancelType() ==2) {
 			return ResultUtil.error("订单已取消,请刷新页面");
+		}
+		if (!Integer.valueOf(2).equals(orderPrivateCar.getPaymentMode())) {
+			handlePrivateCarPrepayCancelRefund(orderPrivateCar,reason);
 		}
 		Integer number1 = this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar.getPid() == null ? orderPrivateCar.getId() : orderPrivateCar.getPid()).lt("state", 6));
 		Integer number2 = this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("id", orderPrivateCar.getPid() == null ? orderPrivateCar.getId() : orderPrivateCar.getPid()).lt("state", 6));
@@ -1179,9 +1264,14 @@
 			if (payType == 1) {//微信支付
 				orderCancel.setPayType(1);
 				orderCancelService.updateById(orderCancel);
-				String app = type == 1 ? "APP" : "JSAPI";
-				resultUtil = payMoneyUtil.weixinpay("订单取消", "", id + "_1_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/wxCancelOrderTaxi", app, userInfo.getAppletsOpenId());
-				paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 1, query.getMoney(), "", 1);//添加预支付数据
+				String outTradeNo = "CANCEL_" + id + "_1_" + UUIDUtil.getRandomCode(5);
+				JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, query.getMoney());
+				if (!cbyzxOrderPayHelper.isCreateSuccess(response)) {
+					return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response);
+				}
+				String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo;
+				resultUtil = ResultUtil.success(response);
+				paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 1, query.getMoney(), paymentCode, 1);//添加预支付数据
 			}
 			if (payType == 2) {//支付宝支付
 				orderCancel.setPayType(2);
@@ -1270,6 +1360,7 @@
 		String driverId = (String) redisTemplate.opsForValue().get("DEVICE_" + map.get("driverId"));
 		map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
 		map.put("orderType", 1);
+		fillPrivateCarPrepayDisplayMoney(this.selectById(orderId), map);
 		return map;
 	}
 	
@@ -1881,6 +1972,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);
@@ -1934,14 +2028,25 @@
 			}
 		}
 		orderMoney = orderMoney < 0 ? 0 : orderMoney;
+		ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney);
+		if (prepaySettleResult != null) {
+			return prepaySettleResult;
+		}
+		orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, 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);
+			JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney);
+			if (!cbyzxOrderPayHelper.isCreateSuccess(response)) {
+				return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response);
+			}
+			String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo;
+			resultUtil = ResultUtil.success(response);
+			paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, paymentCode, 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) {
@@ -1950,29 +2055,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()){
@@ -2016,6 +2124,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();
@@ -2182,14 +2293,26 @@
 		orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
 		System.out.println("!!!" + orderMoney + "!!!!");
 		orderMoney = orderMoney < 0 ? 0 : orderMoney;
-		orderPrivateCar.setPayMoney(orderMoney);
+		ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney);
+		if (prepaySettleResult != null) {
+			return prepaySettleResult;
+		}
+		orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney);
+		if (!isPrivateCarPrepaySpreadStage(orderPrivateCar)) {
+			orderPrivateCar.setPayMoney(orderMoney);
+		}
 		if (payType == 1) {//微信支付
 			if (orderMoney == 0) {
 				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);
+			JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney);
+			if (!cbyzxOrderPayHelper.isCreateSuccess(response)) {
+				return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response);
+			}
+			String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo;
+			resultUtil = ResultUtil.success(response);
+			paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, paymentCode, 1);//添加预支付数据
 
 			//创建定时任务查询订单支付状态
 			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
@@ -2220,8 +2343,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) {
@@ -2229,7 +2353,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) {
@@ -2242,22 +2373,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()){
@@ -2448,54 +2572,551 @@
 			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 boolean isPrivateCarPrepayFinalStage(OrderPrivateCar orderPrivateCar) {
+		return orderPrivateCar != null
+				&& Integer.valueOf(7).equals(orderPrivateCar.getState());
+	}
+
+	private BigDecimal toMoney(Double amount) {
+		return new BigDecimal(String.valueOf(amount == null ? 0D : amount)).setScale(2, RoundingMode.HALF_UP);
+	}
+
+	private PaymentRecord getPrivateCarPrepayPaidRecord(OrderPrivateCar orderPrivateCar) throws Exception {
+		PaymentRecord paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, orderPrivateCar.getPayType(), 2);
+		if (paymentRecord == null) {
+			paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, null, 2);
+		}
+		if (paymentRecord == null) {
+			paymentRecord = paymentRecordService.query(1, null, null, orderPrivateCar.getId(), 1, null, 2);
+		}
+		if (paymentRecord != null && orderPrivateCar.getPayType() == null) {
+			orderPrivateCar.setPayType(paymentRecord.getPayType());
+		}
+		return paymentRecord;
+	}
+
+	private BigDecimal getPrivateCarPrepayPaidAmount(OrderPrivateCar orderPrivateCar) throws Exception {
+		PaymentRecord paymentRecord = getPrivateCarPrepayPaidRecord(orderPrivateCar);
+		if (paymentRecord != null && paymentRecord.getAmount() != null && paymentRecord.getAmount() > 0) {
+			return toMoney(paymentRecord.getAmount());
+		}
+		if ((Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) || (orderPrivateCar.getPrepayStage() != null && orderPrivateCar.getPrepayStage() > 0))
+				&& orderPrivateCar.getPayMoney() != null && orderPrivateCar.getPayMoney() > 0) {
+			return toMoney(orderPrivateCar.getPayMoney());
+		}
+		return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+	}
+
+	private Double getPrivateCarPrepayFinalPayAmount(OrderPrivateCar orderPrivateCar, Double finalAmount) throws Exception {
+		if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) {
+			return toMoney(finalAmount).doubleValue();
+		}
+		BigDecimal paidAmount = getPrivateCarPrepayPaidAmount(orderPrivateCar);
+		if (paidAmount.compareTo(BigDecimal.ZERO) <= 0) {
+			return toMoney(finalAmount).doubleValue();
+		}
+		BigDecimal spreadAmount = toMoney(finalAmount).subtract(paidAmount).setScale(2, RoundingMode.HALF_UP);
+		if (spreadAmount.compareTo(BigDecimal.ZERO) > 0) {
+			orderPrivateCar.setPrepayStage(3);
+			return spreadAmount.doubleValue();
+		}
+		return 0D;
+	}
+
+	private Double getPrivateCarPrepayDisplayPayAmount(OrderPrivateCar orderPrivateCar, Double finalAmount) {
+		if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) {
+			return toMoney(finalAmount).doubleValue();
+		}
+		try {
+			BigDecimal paidAmount = getPrivateCarPrepayPaidAmount(orderPrivateCar);
+			if (paidAmount.compareTo(BigDecimal.ZERO) <= 0) {
+				return toMoney(finalAmount).doubleValue();
+			}
+			BigDecimal displayAmount = toMoney(finalAmount).subtract(paidAmount).setScale(2, RoundingMode.HALF_UP);
+			return displayAmount.compareTo(BigDecimal.ZERO) > 0 ? displayAmount.doubleValue() : 0D;
+		} catch (Exception e) {
+			e.printStackTrace();
+			return toMoney(finalAmount).doubleValue();
+		}
+	}
+
+	private void fillPrivateCarPrepayDisplayMoney(OrderPrivateCar orderPrivateCar, Map<String, Object> map) {
+		if (map == null || orderPrivateCar == null || !isPrivateCarPrepayFinalStage(orderPrivateCar)) {
+			return;
+		}
+		Double finalAmount = null != map.get("orderMoney") ? Double.valueOf(String.valueOf(map.get("orderMoney"))) : orderPrivateCar.getOrderMoney();
+		Double displayAmount = getPrivateCarPrepayDisplayPayAmount(orderPrivateCar, finalAmount);
+		map.put("orderMoney", displayAmount);
+		map.put("payMoney", displayAmount);
+	}
+
+	private ResultUtil settlePrivateCarPrepayIfNoSecondPay(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double finalAmount) throws Exception {
+		if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) {
+			return null;
+		}
+		BigDecimal paidAmount = getPrivateCarPrepayPaidAmount(orderPrivateCar);
+		if (paidAmount.compareTo(BigDecimal.ZERO) <= 0) {
+			return null;
+		}
+		BigDecimal settleAmount = toMoney(finalAmount);
+		BigDecimal refundAmount = paidAmount.subtract(settleAmount).setScale(2, RoundingMode.HALF_UP);
+		if (refundAmount.compareTo(BigDecimal.ZERO) < 0) {
+			return null;
+		}
+		if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
+			ResultUtil refundResult = refundPrivateCarPrepayDifference(orderPrivateCar, userInfo, refundAmount.doubleValue());
+			if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) {
+				return refundResult;
+			}
+		}
+		finishPrivateCarPrepayOrder(orderPrivateCar, settleAmount.doubleValue());
+		return ResultUtil.success();
+	}
+
+	private ResultUtil refundPrivateCarPrepayDifference(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double refundAmount) throws Exception {
+		if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) {
+			userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0D)
+					.add(toMoney(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+			userInfoService.updateById(userInfo);
+			orderPrivateCar.setPrepayRefundNo("BALANCE_REFUND_1_" + orderPrivateCar.getId() + "_" + ToolUtil.getRandomString(5));
+			orderPrivateCar.setPrepayRefundAmount(refundAmount);
+			orderPrivateCar.setPrepayRefundTime(new Date());
+			transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
+			return ResultUtil.success();
+		}
+
+		PaymentRecord paymentRecord = getPrivateCarPrepayPaidRecord(orderPrivateCar);
+		if (paymentRecord == null) {
+			return ResultUtil.error("先付订单缺少已支付流水,无法退款");
+		}
+		if (Integer.valueOf(1).equals(orderPrivateCar.getPayType())) {
+			CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest();
+			request.setOutRequestNo(ToolUtil.isNotEmpty(orderPrivateCar.getPrepaySecondPayNo()) ? orderPrivateCar.getPrepaySecondPayNo() : paymentRecord.getCode());
+			request.setRefundOutRequestNo("PREPAY_DIFF_REFUND_1_" + orderPrivateCar.getId() + ToolUtil.getRandomString(5));
+			request.setRefundAmount(toFen(refundAmount));
+			request.setRefundDesc("快车先付订单多退少补退款");
+			JSONObject response = CbyzxPayUtil.closePayOrder(request);
+			if (!isPrivateCarPrepayRefundSuccess(response)) {
+				return ResultUtil.error(extractPrivateCarRefundMessage(response), response);
+			}
+			orderPrivateCar.setPrepayRefundNo(extractPrivateCarRefundNo(response));
+			orderPrivateCar.setPrepayRefundAmount(refundAmount);
+			orderPrivateCar.setPrepayRefundTime(new Date());
+			transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
+			return ResultUtil.success(response);
+		}
+		if (Integer.valueOf(2).equals(orderPrivateCar.getPayType())) {
+			Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundAmount.toString());
+			if (!"10000".equals(map.get("code"))) {
+				return ResultUtil.error(map.get("msg"));
+			}
+			orderPrivateCar.setPrepayRefundNo(map.get("trade_no"));
+			orderPrivateCar.setPrepayRefundAmount(refundAmount);
+			orderPrivateCar.setPrepayRefundTime(new Date());
+			transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
+			return ResultUtil.success(map);
+		}
+		return ResultUtil.error("先付订单支付方式不支持退款");
+	}
+
+	private void finishPrivateCarPrepayOrder(OrderPrivateCar orderPrivateCar, Double settleAmount) throws Exception {
+		orderPrivateCar.setState(8);
+		orderPrivateCar.setPayMoney(settleAmount);
+		orderPrivateCar.setPayTime(new Date());
+		orderPrivateCar.setPrepayStage(5);
+		if (orderPrivateCar.getRecoveryOrder() != null && 0 == orderPrivateCar.getRecoveryOrder()) {
+			Double incomeAmount = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus()
+					? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney());
+			Map<String, Object> map = incomeService.saveIncome(orderPrivateCar.getId(), 1, incomeAmount);
+			orderPrivateCar.setSplitAllocation(JSON.toJSONString(map));
+		}
+		this.updateAllColumnById(orderPrivateCar);
+		promotion(orderPrivateCar.getId());
+		new Thread(new Runnable() {
+			@Override
+			public void run() {
+				pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+				pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+			}
+		}).start();
+		systemNoticeService.addSystemNotice(1, "您的快车先付订单已完成结算,请注意查收。", orderPrivateCar.getUserId(), 1);
+	}
+
+	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 restorePrivateCarBenefits(OrderPrivateCar orderPrivateCar) throws Exception {
+		if (null != orderPrivateCar.getCouponId()) {
+			UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId());
+			if (userCouponRecord != null) {
+				userCouponRecord.setState(1);
+				userCouponRecord.setEndTime(null);
+				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());
+				Integer time = jsonObject.getInteger("time");
+				jsonObject.put("time", (time == null ? 0 : time) + 1);
+				userTaxiCard.setContent(jsonObject.toJSONString());
+				userTaxiCardService.updateById(userTaxiCard);
+			}
+		}
+		if (null != orderPrivateCar.getRedPacketId()) {
+			UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId());
+			if (userRedPacketRecord != null) {
+				userRedPacketRecord.setState(1);
+				userRedPacketRecord.setEndTime(null);
+				userRedPacketRecordService.updateById(userRedPacketRecord);
+			}
+		}
+	}
+
+	private boolean isPrivateCarPrepayRefundSuccess(JSONObject response) {
+		if (response == null) {
+			return false;
+		}
+		Object code = response.get("code");
+		if (code == null || !"0".equals(String.valueOf(code))) {
+			return false;
+		}
+		JSONObject data = response.getJSONObject("data");
+		return data != null && Boolean.TRUE.equals(data.getBoolean("isSuccess"));
+	}
+
+	private String extractPrivateCarRefundNo(JSONObject response) {
+		if (response == null) {
+			return null;
+		}
+		JSONObject data = response.getJSONObject("data");
+		if (data == null) {
+			return null;
+		}
+		String refundNo = data.getString("merchantRefundSerialNo");
+		if (ToolUtil.isNotEmpty(refundNo)) {
+			return refundNo;
+		}
+		refundNo = data.getString("refundId");
+		if (ToolUtil.isNotEmpty(refundNo)) {
+			return refundNo;
+		}
+		return data.getString("gatewaySerialNo");
+	}
+
+	private String extractPrivateCarRefundMessage(JSONObject response) {
+		if (response == null) {
+			return "微信先付退款失败";
+		}
+		JSONObject data = response.getJSONObject("data");
+		if (data != null && ToolUtil.isNotEmpty(data.getString("failReason"))) {
+			return data.getString("failReason");
+		}
+		String msg = response.getString("msg");
+		return ToolUtil.isNotEmpty(msg) ? msg : "微信先付退款失败";
+	}
+
+	private Integer toFen(Double amount) {
+		return new BigDecimal(String.valueOf(amount)).multiply(new BigDecimal("100")).setScale(0, RoundingMode.HALF_UP).intValue();
+	}
+
+	private String buildPrepayRefundOutNo(Integer orderId) {
+		return "PREPAY_REFUND_1_" + orderId+ToolUtil.getRandomString(5);
+	}
+
+	private boolean isPrivateCarPrepayMode(OrderPrivateCar orderPrivateCar) {
+		return orderPrivateCar != null && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode());
+	}
+
+	private void handlePrivateCarPrepayCancelRefund(OrderPrivateCar orderPrivateCar, String reason) throws Exception {
+		if (!isPrivateCarPrepayMode(orderPrivateCar)) {
+			return;
+		}
+		if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) {
+			Double refundAmount = orderPrivateCar.getPayMoney();
+			if (refundAmount == null || refundAmount <= 0) {
+				throw new RuntimeException("余额先付订单退款金额异常");
+			}
+			UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
+			if (userInfo == null) {
+				throw new RuntimeException("用户信息不存在,无法退款");
+			}
+			userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0)
+					.add(new BigDecimal(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+			userInfoService.updateById(userInfo);
+			restorePrivateCarBenefits(orderPrivateCar);
+			transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车取消订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
+			orderPrivateCar.setState(10);
+			orderPrivateCar.setPrepayStage(5);
+			orderPrivateCar.setPrepayRefundNo("BALANCE_REFUND_1_" + orderPrivateCar.getId() + "_" + ToolUtil.getRandomString(5));
+			orderPrivateCar.setPrepayRefundAmount(refundAmount);
+			orderPrivateCar.setPrepayRefundTime(new Date());
+			this.updateById(orderPrivateCar);
+			systemNoticeService.addSystemNotice(1, "您的快车余额先付订单已取消,退款已退回账户余额,请注意查收。", orderPrivateCar.getUserId(), 1);
+		} else if (Integer.valueOf(1).equals(orderPrivateCar.getPayType())){
+			String outRequestNo = orderPrivateCar.getPrepaySecondPayNo();
+			if (ToolUtil.isEmpty(outRequestNo)) {
+				throw new RuntimeException("微信先付订单缺少支付单号,无法关闭支付单");
+			}
+			Double refundAmount = orderPrivateCar.getPayMoney();
+			if (refundAmount == null || refundAmount <= 0) {
+				throw new RuntimeException("微信先付订单退款金额异常");
+			}
+			CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest();
+			request.setOutRequestNo(outRequestNo);
+			request.setRefundOutRequestNo(buildPrepayRefundOutNo(orderPrivateCar.getId()));
+			request.setRefundAmount(toFen(refundAmount));
+			request.setRefundDesc(ToolUtil.isNotEmpty(reason) ? reason : "快车订单取消退款");
+			JSONObject response = CbyzxPayUtil.closePayOrder(request);
+			if (!isPrivateCarPrepayRefundSuccess(response)) {
+				throw new RuntimeException(extractPrivateCarRefundMessage(response));
+			}
+			restorePrivateCarBenefits(orderPrivateCar);
+			transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车取消订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
+			systemNoticeService.addSystemNotice(1, "您的快车微信先付订单已取消,退款已原路退回,请注意查收。", orderPrivateCar.getUserId(), 1);
+		}
+	}
+
+	private ResultUtil handlePrivateCarPrepayCancelRefund(OrderPrivateCar orderPrivateCar, String reason, String remark, Integer uid) throws Exception {
+		System.out.println("快车退款!!!!");
+		if (!isPrivateCarPrepayMode(orderPrivateCar)) {
+			return null;
+		}
+		if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) {
+			Double refundAmount = orderPrivateCar.getPayMoney();
+			System.out.println("快车余额退款金额!!!!"+ refundAmount);
+			if (refundAmount == null || refundAmount <= 0) {
+				return ResultUtil.error("余额先付订单退款金额异常");
+			}
+			UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
+			if (userInfo == null) {
+				return ResultUtil.error("用户信息不存在,无法退款");
+			}
+			userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0)
+					.add(new BigDecimal(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+			userInfoService.updateById(userInfo);
+			restorePrivateCarBenefits(orderPrivateCar);
+			transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车取消订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
+			orderCancelService.saveData(orderPrivateCar.getId(), 1,
+					ToolUtil.isNotEmpty(reason) ? reason : "无司机接单",
+					ToolUtil.isNotEmpty(remark) ? remark : (ToolUtil.isNotEmpty(reason) ? reason : "无司机接单"),
+					1, refundAmount, 2, 1, uid);
+			orderPrivateCar.setState(10);
+			orderPrivateCar.setPrepayStage(5);
+			orderPrivateCar.setPrepayRefundNo("BALANCE_REFUND_1_" + orderPrivateCar.getId() + "_" + ToolUtil.getRandomString(5));
+			orderPrivateCar.setPrepayRefundAmount(refundAmount);
+			orderPrivateCar.setPrepayRefundTime(new Date());
+			this.updateById(orderPrivateCar);
+			if (orderPrivateCar.getDriverId() != null) {
+				this.deleteTask(orderPrivateCar.getId());
+				pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+				Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+				if (driver != null) {
+					driver.setState(2);
+					driverService.updateById(driver);
+				}
+				if (orderPrivateCar.getBindId() != null) {
+					chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(), orderPrivateCar.getTelX(), (System.currentTimeMillis() + 600000));
+				}
+			}
+			System.out.println("余额退款通知940");
+			systemNoticeService.addSystemNotice(1, "您的快车余额先付订单已取消,退款已退回账户余额,请注意查收。", orderPrivateCar.getUserId(), 1);
+			return ResultUtil.success();
+		}
+		String outRequestNo = orderPrivateCar.getPrepaySecondPayNo();
+		if (ToolUtil.isEmpty(outRequestNo)) {
+			return ResultUtil.error("微信先付订单缺少支付单号,无法关闭支付单");
+		}
+		Double refundAmount = orderPrivateCar.getPayMoney();
+		if (refundAmount == null || refundAmount <= 0) {
+			return ResultUtil.error("微信先付订单退款金额异常");
+		}
+		CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest();
+		request.setOutRequestNo(outRequestNo);
+		request.setRefundOutRequestNo(buildPrepayRefundOutNo(orderPrivateCar.getId()));
+		request.setRefundAmount(toFen(refundAmount));
+		request.setRefundDesc(ToolUtil.isNotEmpty(reason) ? reason : "快车订单取消退款");
+		JSONObject response = CbyzxPayUtil.closePayOrder(request);
+		if (!isPrivateCarPrepayRefundSuccess(response)) {
+			return ResultUtil.error(extractPrivateCarRefundMessage(response), response);
+		}
+
+		restorePrivateCarBenefits(orderPrivateCar);
+		transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车取消订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
+		orderCancelService.saveData(orderPrivateCar.getId(), 1,
+				ToolUtil.isNotEmpty(reason) ? reason : "无司机接单",
+				ToolUtil.isNotEmpty(remark) ? remark : (ToolUtil.isNotEmpty(reason) ? reason : "无司机接单"),
+				1, refundAmount, 2, 1, uid);
+		orderPrivateCar.setState(10);
+		orderPrivateCar.setPrepayStage(5);
+		orderPrivateCar.setPrepayRefundNo(extractPrivateCarRefundNo(response));
+		orderPrivateCar.setPrepayRefundAmount(refundAmount);
+		orderPrivateCar.setPrepayRefundTime(new Date());
+		this.updateById(orderPrivateCar);
+		if (orderPrivateCar.getDriverId() != null) {
+			this.deleteTask(orderPrivateCar.getId());
+			pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+			Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+			if (driver != null) {
+				driver.setState(2);
+				driverService.updateById(driver);
+			}
+			if (orderPrivateCar.getBindId() != null) {
+				chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(), orderPrivateCar.getTelX(), (System.currentTimeMillis() + 86400000));
+			}
+		}
+		systemNoticeService.addSystemNotice(1, "您的快车微信先付订单已取消,退款已原路退回,请注意查收。", orderPrivateCar.getUserId(), 1);
+		return ResultUtil.success(response);
+	}
+
+	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());
+		System.out.println("快车预付回调-------057,"+query1);
+		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);
+		}
+		System.out.println("快车预付回调-------084,"+query);
 		if (null != query && query.getState() == 1) {
+			UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
+			query.setState(2);
+			query.setCode(order_id);
+			paymentRecordService.updateById(query);
+			System.out.println("快车预付回调-------090");
+			if (isPrivateCarPrepayFirstStage(orderPrivateCar)) {
+				orderPrivateCar.setPrepaySecondPayNo(outTradeNo);
+				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()){
@@ -2624,9 +3245,14 @@
 		OrderPrivateCar orderPrivateCar = this.selectById(orderId);
 		ResultUtil resultUtil = ResultUtil.success();
 		if (payType == 1) {//微信支付
-			String app = type == 1 ? "APP" : "JSAPI";
-			resultUtil = payMoneyUtil.weixinpay("感谢费", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/wxPayThankYouFee", app, userInfo.getAppletsOpenId());
-			paymentRecordService.saveData(3, uid, 1, orderId, 1, 1, money, "", 1);//添加预支付数据
+			String outTradeNo = "THANK_" + orderId + "_1_" + UUIDUtil.getRandomCode(5);
+			JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, money);
+			if (!cbyzxOrderPayHelper.isCreateSuccess(response)) {
+				return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response);
+			}
+			String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo;
+			resultUtil = ResultUtil.success(response);
+			paymentRecordService.saveData(3, uid, 1, orderId, 1, 1, money, paymentCode, 1);//添加预支付数据
 		}
 		if (payType == 2) {//支付宝支付
 			resultUtil = payMoneyUtil.alipay("感谢费", "感谢费", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/aliPayThankYouFee");
@@ -2734,6 +3360,7 @@
 			vo.setDriverInfoWarpper(driverInfoWarpper);
 			//其余信息
 			BeanUtils.copyProperties(order, vo);
+			vo.setPayMoney(getPrivateCarPrepayDisplayPayAmount(order, order.getOrderMoney()));
 			unPayOrderVOList.add(vo);
 		}
 		
@@ -2767,7 +3394,7 @@
 							}
 							int finalI = i;
 							PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
-							System.out.println("pushOrder:" + pushOrder);
+							System.out.println("pushOrder2:" + pushOrder);
 							if (orderPrivateCar.getState() > 1) {
 								push = true;
 								break;
@@ -2807,8 +3434,11 @@
 								break;
 							}
 							if (num == 18) {
-								orderPrivateCar1.setState(10);
-								orderPrivateCarMapper.updateById(orderPrivateCar1);
+								ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar1, "无司机接单", "无司机接单", orderPrivateCar1.getUserId());
+								if (refundResult == null) {
+									orderPrivateCar1.setState(10);
+									orderPrivateCarMapper.updateById(orderPrivateCar1);
+								}
 								pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
 								orderIds.remove(orderPrivateCar.getId());
 							}
@@ -2838,6 +3468,7 @@
 			@Override
 			public void run() {
 				try {
+					System.out.println("推单推单推单!!");
 					Integer id = orderPrivateCar.getId();
 					Integer orderType = orderPrivateCar.getRideType() == 1 ? 1 : orderPrivateCar.getRideType() == 2 ? 9 : 8;
 					orderIds.add(orderPrivateCar.getId());//添加记录,防止调用接口重复提醒无人接单
@@ -2851,8 +3482,9 @@
 					// 判断是否为派单模式
 					TSysPushType sysPushType = tSysPushTypeService.selectOne(new EntityWrapper<TSysPushType>().eq("openCityId", openCity.getId()));
 					if(sysPushType!=null && sysPushType.getPushType()==2){
+						System.out.println( "派单模式");
 						OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(id);
-						if (null == orderPrivateCar && orderPrivateCar.getState() == 1) {
+						if (null != orderPrivateCar && orderPrivateCar.getState() == 1) {
 							// 固定5公里进行派单
 							List<Driver> list = driverService.queryIdleDriver(orderType, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), 5.0, null);//所有附近空闲司机
 							if (list.size() > 0) {
@@ -2945,17 +3577,20 @@
 
 							}else {
 								// 没找到车辆
-								orderPrivateCar.setState(10);
-								orderPrivateCarMapper.updateById(orderPrivateCar);
-								pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
-
-								// TODO 退款
+								Thread.sleep(5000);
+								ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar, "无司机接单", "无司机接单", orderPrivateCar.getUserId());
+								if (refundResult == null) {
+									orderPrivateCar.setState(10);
+									orderPrivateCarMapper.updateById(orderPrivateCar);
+								}
+								pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 10);
 							}
 
 
 						}
 
 					}else {
+						System.out.println( "推单模式");
 
 						List<PushOrder> querys = pushOrderService.querys(null, 1, openCity.getId());//获取需要推送的次数
 						for (int i = 1; i <= querys.size() + 15; i++) {
@@ -2965,7 +3600,7 @@
 							}
 							int finalI = i;
 							PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
-							System.out.println("pushOrder:" + pushOrder);
+							System.out.println("pushOrder1:" + pushOrder);
 							int i2 = pushOrder.getPushTime() / 10;
 							if (i2 == 0) {
 								i2 = 1;
@@ -2976,6 +3611,7 @@
 								}
 								//获取空闲司机
 								List<Driver> list = driverService.queryIdleDriver(orderType, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+								System.out.println(list.toString()+"XXXXXXXX");
 								if (list.size() > 0) {
 									double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
 									int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
@@ -3004,6 +3640,13 @@
 								if (i == querys.size() + 15 && state == 1) {
 									pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
 									orderIds.remove(orderPrivateCar.getId());
+
+									// 没找到车辆
+									ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar, "无司机接单", "无司机接单", orderPrivateCar.getUserId());
+									if (refundResult == null) {
+										orderPrivateCar.setState(10);
+										orderPrivateCarMapper.updateById(orderPrivateCar);
+									}
 								}
 							}
 						}

--
Gitblit v1.7.1