From 62a2a8e5fafec9cde437c00a5721253501451c33 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期三, 18 三月 2026 17:46:45 +0800
Subject: [PATCH] 派单模式 新增

---
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemPriceMapper.xml                 |   24 ++
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysPushTypeServiceImpl.java         |   21 +
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java |  209 ++++++++++++++---
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysPushTypeMapper.java                       |   17 +
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysPushTypeMapper.xml                |    6 
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java                                 |   12 +
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java               |    1 
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java              |  224 ++++++++++++++----
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysPushTypeService.java                 |   16 +
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java             |   75 ++++++
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemPriceMapper.java                        |   10 
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysPushType.java                           |   49 ++++
 12 files changed, 575 insertions(+), 89 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 b5634e1..b344ddf 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
@@ -144,6 +144,9 @@
 	private IUserTaxiCardService userTaxiCardService;
 	@Autowired
 	private IRegionService regionService;
+	@Autowired
+	private ITSysPushTypeService tSysPushTypeService;
+
 	@Value("${callbackPath}")
 	private String callbackPath;
 	
@@ -349,6 +352,13 @@
 					driver.setState(3);
 					driverService.updateById(driver);
 				}
+
+
+
+
+
+
+
 				//判断独享,一口价,拼车
 				if (orderPrivateCar.getRideType() != 3) {
 					orderPrivateCar.setTotalPeopleNum(peopleNum);
@@ -371,6 +381,7 @@
 					if (orderPrivateCar.getState() == 1) {
 						this.pushOrder(orderPrivateCar);
 					}
+
 				} else {
 
 
@@ -2756,6 +2767,8 @@
 	 * @throws Exception
 	 */
 	public void pushOrder(OrderPrivateCar orderPrivateCar) throws Exception {
+
+
 		new Thread(new Runnable() {
 			@Override
 			public void run() {
@@ -2769,56 +2782,168 @@
 						integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
 					}
 					OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
-					List<PushOrder> querys = pushOrderService.querys(null, 1, openCity.getId());//获取需要推送的次数
-					for (int i = 1; i <= querys.size() + 15; i++) {
+
+					// 判断是否为派单模式
+					TSysPushType sysPushType = tSysPushTypeService.selectOne(new EntityWrapper<TSysPushType>().eq("openCityId", openCity.getId()));
+					if(sysPushType!=null && sysPushType.getPushType()==2){
 						OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(id);
-						if (null == orderPrivateCar || orderPrivateCar.getState() > 1) {
-							break;
-						}
-						int finalI = i;
-						PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
-						System.out.println("pushOrder:" + pushOrder);
-						int i2 = pushOrder.getPushTime() / 10;
-						if (i2 == 0) {
-							i2 = 1;
-						}
-						for (int i1 = 0; i1 < i2; i1++) {
-							if (orderPrivateCar.getState() > 1) {
-								break;
-							}
-							//获取空闲司机
-							List<Driver> list = driverService.queryIdleDriver(orderType, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+						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) {
-								double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
-								int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
-								lastIndex = lastIndex == 0 ? list.size() : lastIndex;
-								list = list.subList(0, lastIndex);//获取空闲司机中占比数据
-								for (Driver driver : list) {//开始进行推送
-									boolean bo = false;
-									for (Integer integer : integers) {
-										if (integer.compareTo(driver.getId()) == 0) {
-											bo = true;
-											break;
+								Driver driver1 = list.stream().sorted(Comparator.comparingDouble(Driver::getDistance).reversed()).findFirst().get();
+								if(orderPrivateCar.getType() == 3){
+									//批量订单
+									CarService carService = new CarService();
+									carService.setCarId(driver1.getCarId());
+									carService.setType(1);
+									CarService carService1 = carServiceMapper.selectOne(carService);
+									orderPrivateCar.setServerCarModelId(carService1.getServerCarModelId());
+									//1=独享,2=一口价
+									String serverCarModel = orderPrivateCar.getServerCarModel();
+									JSONArray jsonArray = JSON.parseArray(serverCarModel);
+									Integer rideType1 = 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.equals(carService1.getServerCarModelId())){
+											rideType1 = rideType;
+											if(rideType == 1){
+												break;
+											}
 										}
 									}
-									if (bo) {
-										continue;
-									}
-									pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime());
+									orderPrivateCar.setRideType(rideType1);
 								}
-							}
-							Thread.sleep(10000);//设置等待时间
-							Integer state = orderPrivateCar.getState();
-							if (state > 1) {
-								orderIds.remove(orderPrivateCar.getId());
-								return;
-							}
-							if (i == querys.size() + 15 && state == 1) {
+								orderPrivateCar.setDriverId(driver1.getId());
+								orderPrivateCar.setCarId(driver1.getCarId());
+								orderPrivateCar.setCompanyId(driver1.getFranchiseeId() != null && driver1.getFranchiseeId() != 0 ? driver1.getFranchiseeId() : (
+										driver1.getCompanyId() != null && driver1.getCompanyId() != 0 ? driver1.getCompanyId() : 1));
+								orderPrivateCar.setState(2);
+								orderPrivateCar.setSnatchOrderTime(new Date());
+
+								// 是否推广订单
+								Integer promotion = isPromotion(orderPrivateCar.getUserId(), driver1.getPlaceOfEmployment());
+								if(null != promotion){
+									orderPrivateCar.setPromotion(2);
+									driver1 = driverService.selectById(promotion);
+									orderPrivateCar.setPromotionUser(driver1.getName());
+									orderPrivateCar.setPromotionPhone(driver1.getPhone());
+									orderPrivateCar.setPromotionDriverId(promotion);
+								}else{
+									orderPrivateCar.setPromotion(1);
+								}
+								orderPrivateCarMapper.updateById(orderPrivateCar);
+
+								//如果是预约单,则不修改司机为服务中
+								if(orderPrivateCar.getOrderType() != 2 || (orderPrivateCar.getOrderType() == 2 && orderPrivateCar.getTravelTime().getTime() < System.currentTimeMillis() + 600000)){
+									//修改司机为服务中
+									driver1.setState(3);
+									driverService.updateById(driver1);
+								}
+
+								//推送相关代码------------------start----------------
+								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);
+											if(orderPrivateCar.getType() == 2){
+												pushUtil.pushFerryOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 2);
+											}
+
+									}
+								}).start();
+
+								new Thread(new Runnable() {
+									@Override
+									public void run() {
+										pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
+									}
+								}).start();
+
+								systemNoticeService.addSystemNotice(2, "已为您派得快车订单,请及时联系客户!", orderPrivateCar.getDriverId(), 1);
+								systemNoticeService.addSystemNotice(1, "您的订单已指派给" + driver1.getName().substring(0, 1) + "师傅,请保持电话畅通!", orderPrivateCar.getUserId(), 1);
+
+								if(pushMinistryOfTransport){
+									new Thread(new Runnable() {
+										@Override
+										public void run() {
+											//上传数据
+											pushMinistryOfTransportUtil.orderCreate(orderPrivateCar.getId());
+											pushMinistryOfTransportUtil.orderMatch(orderPrivateCar.getId());
+										}
+									}).start();
+								}
+
+
+							}else {
+								// 没找到车辆
+								orderPrivateCar.setState(10);
+								orderPrivateCarMapper.updateById(orderPrivateCar);
 								pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
-								orderIds.remove(orderPrivateCar.getId());
+
+								// TODO 退款
+							}
+
+
+						}
+
+					}else {
+
+						List<PushOrder> querys = pushOrderService.querys(null, 1, openCity.getId());//获取需要推送的次数
+						for (int i = 1; i <= querys.size() + 15; i++) {
+							OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(id);
+							if (null == orderPrivateCar || orderPrivateCar.getState() > 1) {
+								break;
+							}
+							int finalI = i;
+							PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
+							System.out.println("pushOrder:" + pushOrder);
+							int i2 = pushOrder.getPushTime() / 10;
+							if (i2 == 0) {
+								i2 = 1;
+							}
+							for (int i1 = 0; i1 < i2; i1++) {
+								if (orderPrivateCar.getState() > 1) {
+									break;
+								}
+								//获取空闲司机
+								List<Driver> list = driverService.queryIdleDriver(orderType, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+								if (list.size() > 0) {
+									double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
+									int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
+									lastIndex = lastIndex == 0 ? list.size() : lastIndex;
+									list = list.subList(0, lastIndex);//获取空闲司机中占比数据
+									for (Driver driver : list) {//开始进行推送
+										boolean bo = false;
+										for (Integer integer : integers) {
+											if (integer.compareTo(driver.getId()) == 0) {
+												bo = true;
+												break;
+											}
+										}
+										if (bo) {
+											continue;
+										}
+										pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime());
+									}
+								}
+								Thread.sleep(10000);//设置等待时间
+								Integer state = orderPrivateCar.getState();
+								if (state > 1) {
+									orderIds.remove(orderPrivateCar.getId());
+									return;
+								}
+								if (i == querys.size() + 15 && state == 1) {
+									pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
+									orderIds.remove(orderPrivateCar.getId());
+								}
 							}
 						}
 					}
+
 				} catch (Exception e) {
 					e.printStackTrace();
 				}
@@ -2890,4 +3015,6 @@
 		}
 		return maps;
 	}
+
+
 }
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemPriceMapper.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemPriceMapper.java
index 7c7c8a1..9cf2b45 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemPriceMapper.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SystemPriceMapper.java
@@ -18,4 +18,14 @@
      */
     Map<String, Object> query(@Param("companyId") Integer companyId, @Param("type") Integer type,
                               @Param("serverCarModelId") Integer serverCarModelId, @Param("systemPriceCityId") Integer systemPriceCityId);
+
+
+    /**
+     * 获取价格
+     * @param systemPriceCityId
+     * @param type
+     * @return
+     */
+    Map<String, Object> query1(@Param("systemPriceCityId") Integer systemPriceCityId, @Param("type") Integer type,
+                              @Param("serverCarModelId") Integer serverCarModelId);
 }
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysPushTypeMapper.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysPushTypeMapper.java
new file mode 100644
index 0000000..1a8239a
--- /dev/null
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysPushTypeMapper.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.dao;
+
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.TSysPushType;
+
+/**
+ * <p>
+ * 系统设置-推单 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TSysPushTypeMapper extends BaseMapper<TSysPushType> {
+
+}
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemPriceMapper.xml b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemPriceMapper.xml
index b4ee5e6..789f861 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemPriceMapper.xml
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SystemPriceMapper.xml
@@ -37,4 +37,28 @@
             and systemPriceCityId = #{systemPriceCityId}
         </if>
     </select>
+
+
+
+    <select id="query1" resultType="map">
+        select
+        id as id,
+        content as content,
+        contentPutOne as contentPutOne,
+        contentNotOne as contentNotOne,
+        contentPutTwo as contentPutTwo,
+        contentNotTwo as contentNotTwo,
+        contentPutThree as contentPutThree,
+        contentNotThree as contentNotThree,
+        contentExclusive as contentExclusive,
+        contentPrice as contentPrice,
+        isOpen as isOpen
+        from t_system_price where state = 1 and systemPriceCityId = #{systemPriceCityId}
+        <if test="null != type">
+            and `type` = #{type}
+        </if>
+        <if test="null != serverCarModelId">
+            and serverCarModelId = #{serverCarModelId}
+        </if>
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysPushTypeMapper.xml b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysPushTypeMapper.xml
new file mode 100644
index 0000000..65fc718
--- /dev/null
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysPushTypeMapper.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSysPushTypeMapper">
+
+
+</mapper>
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java
index 3b92e0c..97a6be5 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Driver.java
@@ -351,6 +351,18 @@
     @TableField("entercode")
     private String entercode;
 
+
+    @TableField(exist = false)
+    private Double distance=0.0;
+
+    public Double getDistance() {
+        return distance;
+    }
+
+    public void setDistance(Double distance) {
+        this.distance = distance;
+    }
+
     public String getQrCode() {
         return qrCode;
     }
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysPushType.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysPushType.java
new file mode 100644
index 0000000..681e790
--- /dev/null
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysPushType.java
@@ -0,0 +1,49 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-推单模式
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_sys_push_type")
+@Data
+public class TSysPushType extends Model<TSysPushType> {
+	
+	private static final long serialVersionUID = 1L;
+	
+	/**
+	 * 主键id
+	 */
+	@TableId(value = "id", type = IdType.AUTO)
+	private Integer id;
+	/**
+	 * 企业id
+	 */
+	private Integer companyId;
+	/**
+	 * 开通城市id
+	 */
+	@TableField("openCityId")
+	private Integer openCityId;
+	/**
+	 * 1推单 2派单
+	 */
+	private Integer pushType;
+
+	@Override
+	protected Serializable pkVal() {
+		return null;
+	}
+}
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysPushTypeService.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysPushTypeService.java
new file mode 100644
index 0000000..4663040
--- /dev/null
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysPushTypeService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.TSysPushType;
+
+/**
+ * <p>
+ * 系统设置-推单 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITSysPushTypeService extends IService<TSysPushType> {
+
+}
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
index 0eea5e9..1427f22 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -95,6 +95,7 @@
                 Map<String, Double> distance1 = geodesyUtil.getDistance(lon + "," + lat, value);
                 double d = Double.valueOf(distance1.get("WGS84")).doubleValue();
                 if(d < (distance * 1000)){
+                    driver.setDistance(d);
                     list.add(driver);
                 }
             }
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysPushTypeServiceImpl.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysPushTypeServiceImpl.java
new file mode 100644
index 0000000..cb915f7
--- /dev/null
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysPushTypeServiceImpl.java
@@ -0,0 +1,21 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.TSysPushTypeMapper;
+import com.stylefeng.guns.modular.system.model.TSysPushType;
+import com.stylefeng.guns.modular.system.service.ITSysPushTypeService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置-推单 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TSysPushTypeServiceImpl extends ServiceImpl<TSysPushTypeMapper, TSysPushType> implements ITSysPushTypeService {
+
+}
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java
index b149ee8..47f70ab 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java
@@ -13,6 +13,7 @@
 import com.stylefeng.guns.modular.system.service.*;
 import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -24,6 +25,7 @@
  */
 @Component
 public class PushMinistryOfTransportUtil {
+
 
     @Autowired
     private IUserInfoService userInfoService;
@@ -63,6 +65,10 @@
 
     @Autowired
     private IOrderEvaluateService orderEvaluateService;
+
+
+    @Resource
+    private RedisTemplate<String, Object> redisTemplate;
 
     private String path = "http://120.77.11.218:8868/";
 
@@ -433,4 +439,73 @@
         map.put("amount3", amount3);
         return map;
     }
+
+
+    /**
+     * 订单发起接口
+     * @param orderId
+     */
+    public void orderCreate(Integer orderId){
+        OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+        Map<String, Object> query = systemPriceMapper.query1(orderPrivateCar.getCompanyId(), 1, orderPrivateCar.getServerCarModelId());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", 450204);//发起第行政区划代码
+        jsonObject.put("OrderId", orderPrivateCar.getOrderNum());//订单编号
+        jsonObject.put("DepartTime", orderPrivateCar.getTravelTime());//预计用车时间YYYYMMDDhhmmss
+        jsonObject.put("OrderTime", orderPrivateCar.getInsertTime());//订单发起时间YYYYMMDDhhmmss
+        jsonObject.put("PassengerNote", "");//乘客备注
+        jsonObject.put("Departure", orderPrivateCar.getStartAddress());//预计出发地点详细地址
+        jsonObject.put("DepLongitude", orderPrivateCar.getStartLon());//预计出发地点经度
+        jsonObject.put("DepLatitude", orderPrivateCar.getStartLat());//预计出发地点纬度
+        jsonObject.put("Destination", orderPrivateCar.getEndAddress());//预计目的地
+        jsonObject.put("DestLongitude", orderPrivateCar.getEndLon());//预计目的地经度
+        jsonObject.put("DestLatitude", orderPrivateCar.getEndLat());//预计目的地纬度
+        jsonObject.put("Encrypt", 1);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("FareType", query.get("id").toString());//运价类型编码
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderCreate", jsonObject.toJSONString());
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Connection", "keep-alive");
+        header.put("Content-Type", "application/x-www-form-urlencoded");
+        header.put("Accept", "*/*");
+        header.put("Accept-Encoding", "gzip");
+        header.put("Accept-Charset", "utf-8");
+        String result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/orderCreate", map, header,"form");
+        System.err.println("---------------------------订单发起接口----------------------:" + result);
+    }
+
+
+    /**
+     * 订单成功接口
+     * @param orderId
+     */
+    public void orderMatch(Integer orderId){
+        OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+        Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+        Car car = carMapper.selectById(orderPrivateCar.getCarId());
+        String value = (String) redisTemplate.opsForValue().get("dache:DRIVER" + orderPrivateCar.getDriverId());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", 450204);//发起地行政区划代码
+        jsonObject.put("OrderId", orderPrivateCar.getOrderNum());//订单编号
+        jsonObject.put("Longitude", Double.valueOf(value.split(",")[0]));//车辆经度
+        jsonObject.put("Latitude", Double.valueOf(value.split(",")[1]));//车辆纬度
+        jsonObject.put("Encrypt", 1);//坐标加密标识(1:GCJ-02测绘局标准,2:WGS84 GPS标准,3:BD-09百度标准,4:CGCS2000北斗标准,0:其他)
+        jsonObject.put("LicenseId", driver.getDriveCard());//机动车驾驶证编号
+        jsonObject.put("DriverPhone", driver.getPhone());//驾驶员手机号
+        jsonObject.put("VehicleNo", car.getCarLicensePlate());//车辆号牌
+        jsonObject.put("DistributeTime", new Date());//派单成功时间YYYYMMDDhhmmss
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderMatch", jsonObject.toJSONString());
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Connection", "keep-alive");
+        header.put("Content-Type", "application/x-www-form-urlencoded");
+        header.put("Accept", "*/*");
+        header.put("Accept-Encoding", "gzip");
+        header.put("Accept-Charset", "utf-8");
+        String result = httpClientUtil.pushHttpRequset("POST", path + "ministryOfTransport/orderMatch", map, header,"form");
+        System.err.println("--------------------------------订单成功接口---------------------------:" + result);
+    }
+
 }
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
index cd38b4e..3d27663 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -179,6 +179,9 @@
 	
 	@Autowired
 	private IRegionService regionService;
+
+	@Autowired
+	private ITSysPushTypeService tSysPushTypeService;
 	
 	public static List<Integer> orderIds = new ArrayList<>();
 	
@@ -2166,61 +2169,173 @@
 					}
 					
 					OpenCity openCity = openCityService.openCity1(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString());
-					List<PushOrder> querys = pushOrderService.querys(null, 2, openCity.getId());//获取需要推送的次数
-					//整轮派单结束,若无司机接单,系统自动增加派单5轮,若增加5轮后任无司机接单,则系统结束派单,乘客端显示无司机接单、是否再次打车
-					int num = 0;
-					for (int j = 0; j < 6; j++) {
-						Boolean push = false;
-						for (int i = 1; i <= querys.size(); i++) {
-							num++;
-							int finalI = i;
-							PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
-							System.out.println("pushOrder:" + pushOrder);
-							//获取空闲司机
-							List<Driver> list = driverService.queryIdleDriver(2, orderTaxi.getStartLon(), orderTaxi.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
-							//随机排序
-							Collections.shuffle(list);
-							if (list.size() > 0) {
-								double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
-								int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
-								lastIndex = lastIndex == 0 ? list.size() : lastIndex;
-								list = list.subList(0, lastIndex);//获取空闲司机中占比数据
-								for (Driver driver : list) {//开始进行推送
-									//查询是否在限制推单范围内
-									boolean bo = false;
-									for (Integer integer : integers) {
-										if (integer.compareTo(driver.getId()) == 0) {
-											bo = true;
-											break;
+
+					// 判断是否为派单模式
+					TSysPushType sysPushType = tSysPushTypeService.selectOne(new EntityWrapper<TSysPushType>().eq("openCityId", openCity.getId()));
+					if(sysPushType!=null && sysPushType.getPushType()==2){
+						OrderTaxi orderTaxi1 = orderTaxiMapper.selectById(orderTaxi.getId());
+						if (null == orderTaxi1 && orderTaxi1.getState() == 1) {
+							// 固定5公里进行派单
+							List<Driver> listDriver = driverService.queryIdleDriver(2, orderTaxi1.getStartLon(), orderTaxi1.getStartLat(), 5.0, null);//所有附近空闲司机
+							if (listDriver.size() > 0) {
+								Driver driver1 = listDriver.stream().sorted(Comparator.comparingDouble(Driver::getDistance).reversed()).findFirst().get();
+
+								orderTaxi1.setDriverId(driver1.getId());
+								orderTaxi1.setCarId(driver1.getCarId());
+								orderTaxi1.setCompanyId(driver1.getFranchiseeId() != null && driver1.getFranchiseeId() != 0 ? driver1.getFranchiseeId() : (
+										driver1.getCompanyId() != null && driver1.getCompanyId() != 0 ? driver1.getCompanyId() : 1));
+								orderTaxi1.setState(2);
+								orderTaxi1.setSnatchOrderTime(new Date());
+
+								// 是否推广订单
+								Integer promotion = isPromotion(orderTaxi1.getUserId(), driver1.getPlaceOfEmployment());
+								if(promotion!=null){
+									orderTaxi1.setPromotion(2);
+									orderTaxi1.setPromotionUser(driver1.getName());
+									orderTaxi1.setPromotionPhone(driver1.getPhone());
+									orderTaxi1.setPromotionDriverId(promotion);
+								}else{
+									orderTaxi1.setPromotion(1);
+								}
+								orderTaxiMapper.updateById(orderTaxi1);
+
+
+								if(orderTaxi.getType() == 2){
+									List<OrderTaxi> list = orderTaxiMapper.selectList(
+											new EntityWrapper<OrderTaxi>()
+													.eq("type", 2)
+													.eq("userId", orderTaxi.getUserId())
+													.ne("state", 1)
+													.eq("crossCityOrderId", orderTaxi.getCrossCityOrderId())
+													.eq("place", orderTaxi.getPlace()).ne("id", orderTaxi.getId())
+									);
+									List<OrderPrivateCar> list1 = orderPrivateCarService.selectList(
+											new EntityWrapper<OrderPrivateCar>()
+													.eq("type", 2)
+													.eq("userId", orderTaxi.getUserId())
+													.ne("state", 1)
+													.eq("crossCityOrderId", orderTaxi.getCrossCityOrderId())
+													.eq("place", orderTaxi.getPlace())
+									);
+									for(OrderTaxi orderTaxi2 : list){
+										orderTaxi2.setState(10);
+										orderTaxiMapper.updateById(orderTaxi2);
+									}
+									for(OrderPrivateCar orderPrivateCar : list1){
+										orderPrivateCar.setState(10);
+										orderPrivateCarService.updateById(orderPrivateCar);
+									}
+								}
+
+
+								//如果是预约单,则不修改司机为服务中
+								if(orderTaxi1.getOrderType() != 2 || (orderTaxi1.getOrderType() == 2 && orderTaxi1.getTravelTime().getTime() < System.currentTimeMillis() + 600000)){
+									//修改司机为服务中
+									driver1.setState(3);
+									driverService.updateById(driver1);
+								}
+
+								//推送相关代码------------------start----------------
+								OrderTaxi finalOrderTaxi = orderTaxi1;
+								new Thread(new Runnable() {
+									@Override
+									public void run() {
+											pushUtil.pushOrderState(1, finalOrderTaxi.getUserId(), finalOrderTaxi.getId(), 2, finalOrderTaxi.getState(),0);
+											pushUtil.pushOrderState(2, finalOrderTaxi.getDriverId(), finalOrderTaxi.getId(), 2, finalOrderTaxi.getState(),0);
+											if(finalOrderTaxi.getType() == 2){
+												pushUtil.pushFerryOrderState(1, finalOrderTaxi.getUserId(), finalOrderTaxi.getId(), 2, 2);
+												System.err.println("----------------------------------推送摆渡订单-----------------------------");
+											}
+
+									}
+								}).start();
+
+								new Thread(new Runnable() {
+									@Override
+									public void run() {
+										pushUtil.pushDriverPosition(finalOrderTaxi.getId(), 2);
+									}
+								}).start();
+
+								systemNoticeService.addSystemNotice(2, "以为您派得出租车订单,请及时联系客户!", orderTaxi.getDriverId(), 1);
+								systemNoticeService.addSystemNotice(1, "您的订单已指派给" + driver1.getName().substring(0, 1) + "师傅,请保持电话畅通!", orderTaxi.getUserId(), 1);
+
+
+							}else {
+								// 没找到车辆
+								OrderTaxi orderTaxi2 = orderTaxiMapper.selectById(orderTaxi.getId());
+								orderTaxi2.setState(10);
+								orderTaxiMapper.updateById(orderTaxi2);
+								pushUtil.pushEndPush(1, orderTaxi2.getUserId(), orderTaxi2.getId(), 2, 1);
+
+								// TODO 退款
+							}
+
+
+						}
+
+					}else {
+
+						List<PushOrder> querys = pushOrderService.querys(null, 2, openCity.getId());//获取需要推送的次数
+						//整轮派单结束,若无司机接单,系统自动增加派单5轮,若增加5轮后任无司机接单,则系统结束派单,乘客端显示无司机接单、是否再次打车
+						int num = 0;
+						for (int j = 0; j < 6; j++) {
+							Boolean push = false;
+							for (int i = 1; i <= querys.size(); i++) {
+								num++;
+								int finalI = i;
+								PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
+								System.out.println("pushOrder:" + pushOrder);
+								//获取空闲司机
+								List<Driver> list = driverService.queryIdleDriver(2, orderTaxi.getStartLon(), orderTaxi.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+								//随机排序
+								Collections.shuffle(list);
+								if (list.size() > 0) {
+									double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
+									int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
+									lastIndex = lastIndex == 0 ? list.size() : lastIndex;
+									list = list.subList(0, lastIndex);//获取空闲司机中占比数据
+									for (Driver driver : list) {//开始进行推送
+										//查询是否在限制推单范围内
+										boolean bo = false;
+										for (Integer integer : integers) {
+											if (integer.compareTo(driver.getId()) == 0) {
+												bo = true;
+												break;
+											}
 										}
+										if (bo) {
+											continue;
+										}
+										pushUtil.pushOrderState(2, driver.getId(), orderTaxi.getId(), 2, orderTaxi.getState(), pushOrder.getPushTime());
 									}
-									if (bo) {
-										continue;
-									}
-									pushUtil.pushOrderState(2, driver.getId(), orderTaxi.getId(), 2, orderTaxi.getState(), pushOrder.getPushTime());
+								}
+								Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
+								OrderPrivateCar orderTaxi1 = orderPrivateCarService.selectById(orderTaxi.getId());
+								if(null == orderTaxi1){
+									break;
+								}
+								Integer state = orderTaxi1.getState();
+								if (state != 1) {
+									push = true;
+									break;
+								}
+								if (num == 18 && state == 1) {
+									orderTaxi1.setState(10);
+									orderPrivateCarService.updateById(orderTaxi1);
+									pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, 1);
+									orderIds.remove(orderTaxi.getId());
 								}
 							}
-							Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
-							OrderPrivateCar orderTaxi1 = orderPrivateCarService.selectById(orderTaxi.getId());
-							if(null == orderTaxi1){
+							if(push){
 								break;
 							}
-							Integer state = orderTaxi1.getState();
-							if (state != 1) {
-								push = true;
-								break;
-							}
-							if (num == 18 && state == 1) {
-								orderTaxi1.setState(10);
-								orderPrivateCarService.updateById(orderTaxi1);
-								pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, 1);
-								orderIds.remove(orderTaxi.getId());
-							}
-						}
-						if(push){
-							break;
 						}
 					}
+
+
+
+
 
 				} catch (Exception e) {
 					e.printStackTrace();
@@ -2228,7 +2343,20 @@
 			}
 		}).start();
 	}
-	
+
+
+	private Integer isPromotion(Integer userId, String code){
+		UserInfo userInfo = userInfoService.selectById(userId);
+		if(userInfo.getBindDriverId()!=null && userInfo.getBindExpireDate().getTime()>=System.currentTimeMillis()){
+			TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("districtCode", code)
+					.eq("state",1).le("startTime", new Date()).ge("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1"));
+			if(tDriverPromotionActivity!=null){
+				return userInfo.getBindDriverId();
+			}
+		}
+		return null;
+
+	}
 	
 	@Override
 	public synchronized String getOrderNum() throws Exception {

--
Gitblit v1.7.1