From abf1d55dab11baeed5f989a273a776abce50cfc6 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期二, 23 五月 2023 01:00:38 +0800
Subject: [PATCH] 新增订单添加功能

---
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/MongoUtils.java               |  166 ++++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/WeatherCityInfo.java             |   38 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TYouTuiDriverMapper.java               |    7 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/MapUtil.java                    |  137 +++
 management/guns-admin/pom.xml                                                                                    |   17 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/WeatherCityMapper.java                 |    7 
 management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js                                |   12 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TYouTuiDriver.java                   |   70 ++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/MapConfig.java                  |   14 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java        |  408 ++++++++++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/LocationQuery.java      |   23 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java                         |   72 ++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java   |    7 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GeodesyUtil.java                      |   63 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/WeatherUtil.java                 |  119 +++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/WeatherCityServiceImpl.java   |   11 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/Realtime.java                    |   40 +
 management/guns-admin/src/main/resources/application.yml                                                         |    9 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TYouTuiDriverMapper.xml        |   20 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITYouTuiDriverService.java         |    8 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java                          |   55 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/httpClinet/HttpResult.java            |   45 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/Location.java           |   50 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/WeatherCity.java                     |   38 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/model/District.java             |   83 ++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/OCRUtil.java                     |  269 +++++++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IWeatherCityService.java           |    7 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/WeatherCityMapper.xml          |   12 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/httpClinet/HttpClientUtil.java        |  267 +++++++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TYouTuiDriverServiceImpl.java |   17 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/GeoJson.java            |    9 
 31 files changed, 2,062 insertions(+), 38 deletions(-)

diff --git a/management/guns-admin/pom.xml b/management/guns-admin/pom.xml
index 7a85d66..d7e4acc 100644
--- a/management/guns-admin/pom.xml
+++ b/management/guns-admin/pom.xml
@@ -221,7 +221,22 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
-        <!--引入本地工行支付jar end-->
+        <!-- 计算两坐标间的直线距离 -->
+        <dependency>
+            <groupId>org.gavaghan</groupId>
+            <artifactId>geodesy</artifactId>
+            <version>1.1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.20</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
+        </dependency>
     </dependencies>
 
 
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java
index 37469de..43f2a4c 100644
--- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java
@@ -19,6 +19,7 @@
 import com.stylefeng.guns.modular.system.service.ITAppUserService;
 import com.stylefeng.guns.modular.system.service.ITCancelOrderService;
 import com.stylefeng.guns.modular.system.service.ITOrderService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
@@ -244,9 +245,9 @@
      */
     @RequestMapping(value = "/add")
     @ResponseBody
-    public Object add(TOrder tOrder) {
-
-        return SUCCESS_TIP;
+    public ResultUtil add(TOrder tOrder) {
+        ResultUtil add = tOrderService.add(tOrder);
+        return add;
     }
 
     /**
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TYouTuiDriverMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TYouTuiDriverMapper.java
new file mode 100644
index 0000000..690ebd0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TYouTuiDriverMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.TYouTuiDriver;
+
+public interface TYouTuiDriverMapper extends BaseMapper<TYouTuiDriver> {
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/WeatherCityMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/WeatherCityMapper.java
new file mode 100644
index 0000000..a174061
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/WeatherCityMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.WeatherCity;
+
+public interface WeatherCityMapper extends BaseMapper<WeatherCity> {
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TYouTuiDriverMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TYouTuiDriverMapper.xml
new file mode 100644
index 0000000..419429c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TYouTuiDriverMapper.xml
@@ -0,0 +1,20 @@
+<?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.TYouTuiDriverMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TYouTuiDriver">
+        <id column="id" property="id" />
+        <result column="driverId" property="driverId" />
+        <result column="youTuiId" property="youTuiId" />
+        <result column="integral" property="integral" />
+        <result column="type" property="type"/>
+        <result column="surplusQuantity" property="surplusQuantity"/>
+        <result column="endTime" property="endTime"/>
+        <result column="state" property="state"/>
+        <result column="failureTime" property="failureTime" />
+        <result column="createTime" property="createTime" />
+    </resultMap>
+
+
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/WeatherCityMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/WeatherCityMapper.xml
new file mode 100644
index 0000000..c80a4cb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/WeatherCityMapper.xml
@@ -0,0 +1,12 @@
+<?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.WeatherCityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.WeatherCity">
+        <id column="id" property="id" />
+        <result column="province" property="province" />
+        <result column="city" property="city" />
+        <result column="district" property="district" />
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java
index e9f32b1..0303b36 100644
--- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java
@@ -1,5 +1,6 @@
 package com.stylefeng.guns.modular.system.model;
 
+import com.baomidou.mybatisplus.annotations.TableField;
 import com.baomidou.mybatisplus.enums.IdType;
 import java.math.BigDecimal;
 import java.util.Date;
@@ -138,7 +139,16 @@
      * 添加时间
      */
     private Date createTime;
-
+    /**
+     * 预估里程
+     */
+    @TableField("estimatedMileage")
+    private Double estimatedMileage;
+    /**
+     * 预估时间
+     */
+    @TableField("estimatedTime")
+    private Integer estimatedTime;
     /**
      * 行程录音
      */
@@ -196,9 +206,18 @@
     private BigDecimal discountAmount;
     @ApiModelProperty(value = "实际里程(米)")
     private Integer actualMileage;
-
+    /**
+     * 折扣0.01
+     */
+    @TableField("discount")
+    private Double discount;
     @ApiModelProperty(value = "是否已开票 1是 0否")
     private Integer isInvoice;
+    /**
+     * 大厅订单(0=否,1=是)
+     */
+    @TableField("hallOrder")
+    private Integer hallOrder;
 
     public String getUserPhone() {
         return userPhone;
@@ -584,6 +603,38 @@
         this.createTime = createTime;
     }
 
+    public Double getEstimatedMileage() {
+        return estimatedMileage;
+    }
+
+    public void setEstimatedMileage(Double estimatedMileage) {
+        this.estimatedMileage = estimatedMileage;
+    }
+
+    public Integer getEstimatedTime() {
+        return estimatedTime;
+    }
+
+    public void setEstimatedTime(Integer estimatedTime) {
+        this.estimatedTime = estimatedTime;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Integer getHallOrder() {
+        return hallOrder;
+    }
+
+    public void setHallOrder(Integer hallOrder) {
+        this.hallOrder = hallOrder;
+    }
+
     @Override
     protected Serializable pkVal() {
         return this.id;
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TYouTuiDriver.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TYouTuiDriver.java
new file mode 100644
index 0000000..37ea449
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TYouTuiDriver.java
@@ -0,0 +1,70 @@
+package com.stylefeng.guns.modular.system.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.util.Date;
+
+/**
+* 司机优推数据
+* @author pzb
+* @Date 2023/2/22 14:01
+*/
+@Data
+@TableName("t_you_tui_driver")
+public class TYouTuiDriver {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 优推id
+     */
+    @TableField("youTuiId")
+    private Integer youTuiId;
+    /**
+     * 积分
+     */
+    @TableField("integral")
+    private Integer integral;
+    /**
+     * 优推类型(1=次数,2=小时)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 优推剩余数量
+     */
+    @TableField("surplusQuantity")
+    private Integer surplusQuantity;
+    /**
+     * 优推结束时间
+     */
+    @TableField("endTime")
+    private Date endTime;
+    /**
+     * 状态(1=未使用,2=使用中,3=已结束)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 失效时间
+     */
+    @TableField("failureTime")
+    private Date failureTime;
+    /**
+     * 添加时间
+     */
+    @TableField("createTime")
+    private Date createTime;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/WeatherCity.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/WeatherCity.java
new file mode 100644
index 0000000..7a88d78
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/WeatherCity.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.modular.system.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;
+
+/**
+* 天气相关城市
+* @author pzb
+* @Date 2023/2/25 10:56
+*/
+@Data
+@TableName("t_weather_city")
+public class WeatherCity {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.INPUT)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 省
+     */
+    @TableField("province")
+    private String province;
+    /**
+     * 市
+     */
+    @TableField("city")
+    private String city;
+    /**
+     * 区
+     */
+    @TableField("district")
+    private String district;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITYouTuiDriverService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITYouTuiDriverService.java
new file mode 100644
index 0000000..e54d1d5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITYouTuiDriverService.java
@@ -0,0 +1,8 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.TYouTuiDriver;
+
+
+public interface ITYouTuiDriverService extends IService<TYouTuiDriver> {
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IWeatherCityService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IWeatherCityService.java
new file mode 100644
index 0000000..9fa411f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IWeatherCityService.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.WeatherCity;
+
+public interface IWeatherCityService extends IService<WeatherCity> {
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java
index f86cfce..43d547b 100644
--- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java
@@ -1,6 +1,7 @@
 package com.stylefeng.guns.modular.system.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
@@ -16,15 +17,21 @@
 import com.stylefeng.guns.modular.system.dao.TDriverMapper;
 import com.stylefeng.guns.modular.system.dao.TOrderMapper;
 import com.stylefeng.guns.modular.system.enums.OrderStateEnum;
-import com.stylefeng.guns.modular.system.model.TAppUser;
-import com.stylefeng.guns.modular.system.model.TBranchOffice;
-import com.stylefeng.guns.modular.system.model.TDriver;
-import com.stylefeng.guns.modular.system.model.TOrder;
-import com.stylefeng.guns.modular.system.service.ITAppUserService;
-import com.stylefeng.guns.modular.system.service.ITOrderService;
-import com.stylefeng.guns.modular.system.util.DateUtil;
-import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
+import com.stylefeng.guns.modular.system.util.GaoDe.MapUtil;
+import com.stylefeng.guns.modular.system.util.GaoDe.model.District;
+import com.stylefeng.guns.modular.system.util.juhe.WeatherUtil;
+import com.stylefeng.guns.modular.system.util.mongodb.model.Location;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.geo.Circle;
+import org.springframework.data.geo.Distance;
+import org.springframework.data.geo.Metrics;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 import org.springframework.ui.Model;
 import org.springframework.util.CollectionUtils;
@@ -32,9 +39,12 @@
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -61,6 +71,27 @@
 
     @Autowired
     private ITAppUserService appUserService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private ITSystemConfigService systemConfigService;
+
+    @Autowired
+    private ITYouTuiDriverService youTuiDriverService;
+
+    @Resource
+    private MongoTemplate mongoTemplate;
+
+    @Autowired
+    private IWeatherCityService weatherCityService;
+
+    @Autowired
+    private PushUtil pushUtil;
+
+
+
 
     @Override
     public List<TOrderResp> getOrderList(String createTime, String code, Integer source, String userName, String userPhone, Integer state, String driverName,Integer isException) {
@@ -381,13 +412,19 @@
             tOrder.setUserId(tAppUser.getId());
         }
         JSONObject jsonObject = JSON.parseObject(startAddress);
-        tOrder.setStartAddress(jsonObject.getString("address"));
+        String address = jsonObject.getString("address");
+        address = address.replaceAll("& #40;", "(");
+        address = address.replaceAll("& #41;", ")");
+        tOrder.setStartAddress(address);
         tOrder.setStartLat(jsonObject.getString("lat"));
         tOrder.setStartLng(jsonObject.getString("lon"));
         tOrder.setSource(3);
         if(ToolUtil.isNotEmpty(endAddress)){
             jsonObject = JSON.parseObject(endAddress);
-            tOrder.setEndAddress(jsonObject.getString("address"));
+            String address1 = jsonObject.getString("address");
+            address1 = address1.replaceAll("& #40;", "(");
+            address1 = address1.replaceAll("& #41;", ")");
+            tOrder.setEndAddress(address1);
             tOrder.setEndLat(jsonObject.getString("lat"));
             tOrder.setEndLng(jsonObject.getString("lon"));
         }
@@ -399,35 +436,350 @@
                 return ResultUtil.error("获取预估距离出错", "");
             }
             d = Double.valueOf(distance.get("distance")) / 1000;
-            order.setEstimatedMileage(d);
-            order.setEstimatedTime(Integer.valueOf(distance.get("duration")) / 60);
+            tOrder.setEstimatedMileage(d);
+            tOrder.setEstimatedTime(Integer.valueOf(distance.get("duration")) / 60);
         }
         String city = "";
-        District geocode = MapUtil.geocode(order.getStartLng(), order.getStartLat());
+        District geocode = MapUtil.geocode(tOrder.getStartLng(), tOrder.getStartLat());
         if(null != geocode){
             WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>()
                     .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') "));
             city = null != weatherCity ? weatherCity.getId().toString() : "";
         }
-        order = getOrderPrice(1, d, 0, order, city);
-        order.setState(null == order.getDriverId() ? 101 : 102);
-        order.setStatus(1);
-        order.setCreateTime(new Date());
-        this.insert(order);
-        driverService.updateById(driver);
+        tOrder = getOrderPrice(1, d, 0, tOrder, city);
+        tOrder.setState(101);
+        tOrder.setStatus(1);
+        tOrder.setCreateTime(new Date());
+        this.insert(tOrder);
         //推送状态
-        if(null != order.getDriverId()){
-            pushUtil.pushOrderStatus(uid, 2, order.getId(), order.getStatus());
-        }else{
-            //开始推单
-            Order finalOrder = order;
-            new Thread(new Runnable() {
+        pushOrder(tOrder);
+        return ResultUtil.success();
+    }
+
+
+
+    /**
+     * 获取订单价格
+     * @param type          计算类型(1=预估价,2=订单费)
+     * @param distance      行驶公里
+     * @param waitTime      等待时长
+     * @param order         订单数据
+     * @param city          查询天气的城市
+     * @return
+     */
+    public TOrder getOrderPrice(Integer type, Double distance, Integer waitTime, TOrder order, String city){
+        order = getOrderInitialPrice(order);
+        TSystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<TSystemConfig>().eq("type", 5));
+        if(null == systemConfig){
+            if(type == 1){//预估金额
+                order.setEstimatedPrice(new BigDecimal(0));
+            }
+            if(type == 2){//订单金额
+                order.setOrderMoney(new BigDecimal(0));
+            }
+            return order;
+        }
+        JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
+        JSONArray chargeStandard = jsonObject.getJSONArray("ChargeStandard");
+        JSONObject extraCost = jsonObject.getJSONObject("ExtraCost");
+        Date date = new Date();
+        for (int i = 0; i < chargeStandard.size(); i++) {
+            JSONObject jsonObject1 = chargeStandard.getJSONObject(i);
+            String num1 = jsonObject1.getString("num1");
+            String num2 = jsonObject1.getString("num2");
+            Double num3 = jsonObject1.getDouble("num3");//起步里程
+            Double num4 = jsonObject1.getDouble("num4");//起步价格
+            Double num5 = jsonObject1.getDouble("num5");//超过公里
+            Double num6 = jsonObject1.getDouble("num6");//超过num3每num5公里收取num6
+            Double num7 = jsonObject1.getDouble("num7");//长途起始公里
+            Double num8 = jsonObject1.getDouble("num8");//长途结束公里
+            Double num9 = jsonObject1.getDouble("num9");//长途费
+            Double num10 = jsonObject1.getDouble("num10");//超出长途里程每num10公里
+            Double num11 = jsonObject1.getDouble("num11");//超过num8每num10公里收取num11
+
+            String[] split = num1.split(":");
+            Calendar s = Calendar.getInstance();
+            s.setTime(date);
+            s.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
+            s.set(Calendar.MINUTE, Integer.valueOf(split[1]));
+            s.set(Calendar.SECOND, 0);
+
+            split = num2.split(":");
+            Calendar e = Calendar.getInstance();
+            e.setTime(date);
+            e.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
+            e.set(Calendar.MINUTE, Integer.valueOf(split[1]));
+            e.set(Calendar.SECOND, 0);
+
+            if(date.getTime() >= s.getTimeInMillis() && date.getTime() < e.getTimeInMillis()){
+                if(num3.compareTo(distance) >= 0){//起步里程内
+                    order.setStartDistance(distance);//起步里程
+                    order.setStartPrice(new BigDecimal(num4));//起步价
+                }else{
+                    BigDecimal subtract = new BigDecimal(distance).subtract(new BigDecimal(num3));//超出起步里程
+                    BigDecimal divide = subtract.divide(new BigDecimal(num5), new MathContext(2, RoundingMode.HALF_EVEN));
+                    BigDecimal multiply = divide.multiply(new BigDecimal(num6));
+                    order.setStartDistance(num3);//起步里程
+                    order.setStartPrice(new BigDecimal(num4));//起步价
+                    order.setOverDriveDistance(subtract.doubleValue());//超出起步里程
+                    order.setOverDrivePrice(multiply);//超出起步里程费
+
+                    //计算长途费
+                    if(distance.compareTo(num7) > 0){
+                        order.setLongDistance(num7 + "-" + num8);//长途里程
+                        order.setLongDistancePrice(new BigDecimal(num9));//长途费
+                    }
+                    //计算长途里程超出的部分
+                    if(distance.compareTo(num8) > 0){
+                        BigDecimal subtract1 = new BigDecimal(distance).subtract(new BigDecimal(num8));
+                        BigDecimal divide1 = subtract1.divide(new BigDecimal(num10), new MathContext(2, RoundingMode.HALF_EVEN));
+                        BigDecimal multiply1 = divide1.multiply(new BigDecimal(num11));
+                        order.setOverLongDistance(subtract1.doubleValue());//超出长途里程
+                        order.setOverLongDistancePrice(multiply1);//超出长途里程费
+                    }
+                }
+                break;
+            }
+        }
+
+        //计算额外费用
+        Integer num1 = extraCost.getInteger("num1");//等待时长
+        Double num2 = extraCost.getDouble("num2");//等待费
+        Integer num3 = extraCost.getInteger("num3");//等待超出时长
+        Double num4 = extraCost.getDouble("num4");//等到超出时长费用单价 X/分钟
+        Double num5 = extraCost.getDouble("num5");//恶劣天气公里
+        Double num6 = extraCost.getDouble("num6");//恶劣天气费
+        Double num7 = extraCost.getDouble("num7");//恶劣天气超出公里
+        Double num8 = extraCost.getDouble("num8");//恶劣天气超出公里单价 X/公里
+        Double num9 = extraCost.getDouble("num9");//恶劣天气最高收取金额
+
+        //等待费用
+        if(waitTime.compareTo(num1) >= 0){
+            order.setWaitTime(num1);//等待时长
+            order.setWaitTimePrice(new BigDecimal(num2));//等待费用
+
+            Integer w = waitTime - num3;
+            BigDecimal multiply = new BigDecimal(w).multiply(new BigDecimal(num4));
+            order.setOutWaitTime(w);//等待时长超出分钟
+            order.setOutWaitTimePrice(multiply);//等待时长超出费用
+        }
+
+        //恶劣天气
+        systemConfig = systemConfigService.selectOne(new EntityWrapper<TSystemConfig>().eq("type", 8));
+        if(null != systemConfig) {
+            JSONObject jsonObject1 = JSON.parseObject(systemConfig.getContent());
+            Integer num11 = jsonObject1.getInteger("num1");//开启恶劣天气计价
+            if(1 == num11){
+                boolean badWeather = WeatherUtil.isBadWeather(city);
+                if(badWeather){
+                    order.setBadWeatherDistance(new BigDecimal(num5));//恶劣天气公里
+                    order.setBadWeatherPrice(new BigDecimal(num6));//恶劣天气费
+                    if(distance.compareTo(num7) > 0){
+                        BigDecimal subtract = new BigDecimal(distance).subtract(new BigDecimal(num7));
+                        BigDecimal multiply = subtract.multiply(new BigDecimal(num8));
+                        order.setOverBadWeatherDistance(subtract.doubleValue());//恶劣天气超出公里
+                        order.setOverBadWeatherPrice(multiply);//恶劣天气超出公里费
+                    }
+
+                    double add = order.getOverBadWeatherPrice().add(order.getBadWeatherPrice()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+                    if(num9.compareTo(add) < 0){//超出最高金额(重新调整金额)
+                        if(num9.compareTo(num6) < 0){//如果恶劣天气费大于最高金额
+                            order.setBadWeatherPrice(new BigDecimal(num9));//恶劣天气费
+                            order.setOverBadWeatherPrice(new BigDecimal(0));//恶劣天气超出公里费
+                        }else{
+                            BigDecimal subtract = new BigDecimal(num9).subtract(new BigDecimal(add));
+                            order.setOverBadWeatherPrice(subtract);//恶劣天气超出公里费
+                        }
+                    }
+                }
+            }
+        }
+
+
+        //计算折扣
+        if(null != order.getUserId()){
+
+        }
+
+        //计算总金额
+        BigDecimal bigDecimal = order.getStartPrice().add(order.getOverDrivePrice()).add(order.getLongDistancePrice()).add(order.getOverLongDistancePrice())
+                .add(order.getWaitTimePrice()).add(order.getOutWaitTimePrice()).add(order.getBadWeatherPrice()).add(order.getOverBadWeatherPrice()).subtract(order.getDiscountAmount()).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+
+        if(type == 1){//预估价
+            order.setEstimatedPrice(bigDecimal);
+        }
+        if(type == 2){//订单金额
+            order.setOrderMoney(bigDecimal);
+        }
+        return order;
+    }
+
+
+    /**
+     * 初始订单费用
+     * @param order
+     * @return
+     */
+    public TOrder getOrderInitialPrice(TOrder order){
+        order.setStartDistance(0D);//起步里程
+        order.setStartPrice(new BigDecimal(0));//起步价
+        order.setOverDriveDistance(0D);//超出起步里程
+        order.setOverDrivePrice(new BigDecimal(0));//超出起步里程费
+        order.setLongDistance("");//长途里程
+        order.setLongDistancePrice(new BigDecimal(0));//长途里程费
+        order.setOverLongDistance(0D);//超出长途里程
+        order.setOverLongDistancePrice(new BigDecimal(0));//超出长途里程费
+        order.setWaitTime(0);//等待时长
+        order.setWaitTimePrice(new BigDecimal(0));//等待费
+        order.setOutWaitTime(0);//超出等待时长
+        order.setOutWaitTimePrice(new BigDecimal(0));//超出等待时长费
+        order.setBadWeatherDistance(new BigDecimal(0));//恶劣天气里程
+        order.setBadWeatherPrice(new BigDecimal(0));//恶劣天气里程费
+        order.setOverBadWeatherDistance(0D);//恶劣天气超出里程
+        order.setOverBadWeatherPrice(new BigDecimal(0));//恶劣天气超出里程费
+        order.setDiscountedPrice(new BigDecimal(0));//优惠金额
+        order.setCouponId(null);//优惠券
+        order.setDiscountAmount(new BigDecimal(0));//折扣优惠金额
+        order.setDiscount(0D);//折扣
+        return order;
+    }
+
+
+
+
+    /**
+     * 订单推送逻辑
+     * @param order
+     */
+    public void pushOrder(TOrder order){
+        /**
+         * 1.先找最大推单范围内的优推司机 -》 距离最近
+         * 没有1 - 》
+         *      2.按照后台推送配置在范围内查找合适司机
+         *        合适司:积分 > 评分 > 距离
+         *      3.司机没有接单直接将订单置入大厅
+         */
+        TSystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<TSystemConfig>().eq("type", 1));
+        if(null == systemConfig){
+            return;
+        }
+        JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
+        Double num3 = jsonObject.getDouble("num3");//推单最大范围
+        Integer num4 = jsonObject.getInteger("num4");//接单时间
+        String startLat = order.getStartLat();
+        String startLng = order.getStartLng();
+
+        //1
+        //找到中心点
+        GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(startLng), Double.valueOf(startLat));
+        Double num = num3 / 1000;//范围公里
+        //构造半径
+        Distance distanceR = new Distance(num, Metrics.KILOMETERS);
+        //画圆
+        Circle circle = new Circle(geoJsonPoint, distanceR);
+        // 构造query对象
+        Query query = Query.query(Criteria.where("location").withinSphere(circle));
+        List<Location> locations = mongoTemplate.find(query, Location.class);
+        List<Integer> driverIds = locations.stream().map(Location::getDriverId).collect(Collectors.toList());
+        Integer driver = null;
+        TYouTuiDriver youTuiDriver1 = null;
+        if(driverIds.size() > 0){
+            List<TYouTuiDriver> youTuiDrivers = youTuiDriverService.selectList(new EntityWrapper<TYouTuiDriver>().in("driverId", driverIds)
+                    .eq("state", 2).last(" and (surplusQuantity > 0 or now() < endTime) and now() < failureTime"));
+            Double d = null;
+            for (TYouTuiDriver youTuiDriver : youTuiDrivers) {
+                String value = redisUtil.getValue("DRIVER" + youTuiDriver.getDriverId());
+                if(ToolUtil.isEmpty(value)){
+                    continue;
+                }
+                Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                Double wgs84 = distance.get("WGS84");
+                if(d == null || d.compareTo(wgs84) > 0){
+                    d = wgs84;
+                    driver = youTuiDriver.getDriverId();
+                    youTuiDriver1 = youTuiDriver;
+                }
+            }
+        }
+
+        if(null != youTuiDriver1 && youTuiDriver1.getType() == 1){
+            youTuiDriver1.setSurplusQuantity(youTuiDriver1.getSurplusQuantity() - 1);
+            youTuiDriverService.updateById(youTuiDriver1);
+        }
+
+        //开始范围查找
+        if(null == driver){
+            for (int i = 1; i < 4; i++) {
+                if(null != driver){
+                    break;
+                }
+                num = jsonObject.getDouble("num" + i) / 1000;//范围公里
+                //构造半径
+                distanceR = new Distance(num, Metrics.KILOMETERS);
+                //画圆
+                circle = new Circle(geoJsonPoint, distanceR);
+                // 构造query对象
+                query = Query.query(Criteria.where("location").withinSphere(circle));
+                locations = mongoTemplate.find(query, Location.class);
+
+                driverIds = locations.stream().map(Location::getDriverId).collect(Collectors.toList());
+                if(driverIds.size() > 0){
+                    List<TDriver> drivers = tDriverMapper.selectList(new EntityWrapper<TDriver>().eq("approvalStatus", 2).eq("serverStatus", 1).eq("status", 1).in("id", driverIds));
+                    if(drivers.size() == 0){
+                        continue;
+                    }
+
+                    Integer integral = null;
+                    Double score = null;
+                    Double d = null;
+                    for (TDriver driver1 : drivers) {
+                        if(integral == null || integral.compareTo(driver1.getIntegral()) < 0){//积分大
+                            integral = driver1.getIntegral();
+                            score = driver1.getScore();
+                            driver = driver1.getId();
+                            continue;
+                        }
+                        if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) < 0){//积分相同对比评分
+                            integral = driver1.getIntegral();
+                            score = driver1.getScore();
+                            driver = driver1.getId();
+                            continue;
+                        }
+                        if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) == 0){//积分相同/评分相同对比距离
+                            String value = redisUtil.getValue("DRIVER" + driver1.getId());
+                            if(ToolUtil.isEmpty(value)){
+                                continue;
+                            }
+                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                            Double wgs84 = distance.get("WGS84");
+                            if(d == null || d.compareTo(wgs84) > 0){
+                                d = wgs84;
+                                driver = driver1.getId();
+                                continue;
+                            }
+                        }
+                    }
+
+                }
+            }
+        }
+
+        if(null != driver){
+            pushUtil.pushGrabOrder(driver, 2, order.getId(), num4);
+            //创建定时任务处理订单到大厅
+            new Timer().schedule(new TimerTask() {
                 @Override
                 public void run() {
-                    pushOrder(finalOrder);
+                    TOrder order1 = TOrderServiceImpl.this.selectById(order.getId());
+                    if(order1.getState() == 101 || order1.getState() == 201){
+                        order1.setHallOrder(1);
+                        TOrderServiceImpl.this.updateById(order1);
+                    }
                 }
-            }).start();
+            }, num4 * 1000);
+        }else{
+            order.setHallOrder(1);
+            this.updateById(order);
         }
-        return ResultUtil.success(order.getState() == 102 ? order.getId() : null);
     }
 }
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TYouTuiDriverServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TYouTuiDriverServiceImpl.java
new file mode 100644
index 0000000..8f40413
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TYouTuiDriverServiceImpl.java
@@ -0,0 +1,17 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.TYouTuiDriverMapper;
+import com.stylefeng.guns.modular.system.model.TYouTuiDriver;
+import com.stylefeng.guns.modular.system.service.ITYouTuiDriverService;
+import org.springframework.stereotype.Service;
+
+
+/**
+* 用户优推数据
+* @author pzb
+* @Date 2023/2/22 14:06
+*/
+@Service
+public class TYouTuiDriverServiceImpl extends ServiceImpl<TYouTuiDriverMapper, TYouTuiDriver> implements ITYouTuiDriverService {
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/WeatherCityServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/WeatherCityServiceImpl.java
new file mode 100644
index 0000000..e6ee091
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/WeatherCityServiceImpl.java
@@ -0,0 +1,11 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.WeatherCityMapper;
+import com.stylefeng.guns.modular.system.model.WeatherCity;
+import com.stylefeng.guns.modular.system.service.IWeatherCityService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class WeatherCityServiceImpl extends ServiceImpl<WeatherCityMapper, WeatherCity> implements IWeatherCityService {
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/MapConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/MapConfig.java
new file mode 100644
index 0000000..d6a8665
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/MapConfig.java
@@ -0,0 +1,14 @@
+package com.stylefeng.guns.modular.system.util.GaoDe;
+
+/**
+* 高德地图配置
+* @author pzb
+* @Date 2023/2/16 18:52
+*/
+public interface MapConfig {
+
+    /**
+     * 高德key
+     */
+    String key = "e0370a9a4d10739045fb0b8f4742a67e";
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/MapUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/MapUtil.java
new file mode 100644
index 0000000..da19adf
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/MapUtil.java
@@ -0,0 +1,137 @@
+package com.stylefeng.guns.modular.system.util.GaoDe;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.modular.system.util.GaoDe.model.District;
+import com.stylefeng.guns.modular.system.util.httpClinet.HttpClientUtil;
+import com.stylefeng.guns.modular.system.util.httpClinet.HttpResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+* 地图工具类
+* @author pzb
+* @Date 2023/2/16 18:48
+*/
+public class MapUtil {
+
+    public static Logger logger = LoggerFactory.getLogger("ServiceLog");
+
+
+
+
+    /**
+     * 获取两点的距离
+     * @param origins       起点坐标
+     * @param destination   终点坐标
+     * @param type          计算类型:0:直线距离 1:驾车导航距离(仅支持国内坐标)。
+     * @return
+     */
+    public static Map<String, String> getDistance(String origins, String destination, Integer type){
+        try {
+            String url = "https://restapi.amap.com/v3/distance?key=" + MapConfig.key + "&origins=" + origins + "&destination=" + destination +
+                    "&type=" + type;
+            HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "json");
+            if(httpResult.getCode() != 200){
+                logger.debug(httpResult.getData());
+                return null;
+            }
+            String data = httpResult.getData();
+            JSONObject jsonObject = JSON.parseObject(data);
+            String status = jsonObject.getString("status");
+            if(status.equals("1")){
+                JSONArray results = jsonObject.getJSONArray("results");
+                JSONObject jsonObject1 = results.getJSONObject(0);
+                Map<String, String> map = new HashMap<>();
+                map.put("distance", jsonObject1.getString("distance"));//距离(米)
+                map.put("duration", jsonObject1.getString("duration"));//预计时间(秒)
+                return map;
+            }else{
+                logger.debug(data);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 地址转换经纬度
+     * @param address
+     * @return
+     */
+    public static List<String> geocoding(String address){
+        try {
+            String url = "https://restapi.amap.com/v3/geocode/geo?key=" + MapConfig.key + "&output=JSON&address=" + address;
+            HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "json");
+            if(httpResult.getCode() != 200){
+                return null;
+            }
+            JSONObject jsonObject = JSON.parseObject(httpResult.getData());
+            String status = jsonObject.getString("status");
+            List<String> list = new ArrayList<>();
+            if(status.equals("1")){
+                JSONArray geocodes = jsonObject.getJSONArray("geocodes");
+                for(int i = 0; i < geocodes.size(); i++){
+                    String location = geocodes.getJSONObject(i).getString("location");
+                    list.add(location);
+                }
+            }
+            return list;
+        }catch (Exception e){
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+
+    /**
+     * 根据经纬度获取行政区域信息
+     * @param lon
+     * @param lan
+     * @return
+     * @throws Exception
+     */
+    public static District geocode(String lon, String lan) {
+        try {
+            String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + MapConfig.key + "&location=" + lon + "," + lan;
+            HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "json");
+            if(httpResult.getCode() != 200){
+                return null;
+            }
+            JSONObject jsonObject = JSON.parseObject(httpResult.getData());
+            Map<String, String> map = new HashMap<>();
+            if(jsonObject.getString("status").equals("1")){
+                JSONObject regeocode = jsonObject.getJSONObject("regeocode");
+                JSONObject addressComponent = regeocode.getJSONObject("addressComponent");
+                String address = regeocode.getString("formatted_address");
+                map.put("address", address);
+                String code = addressComponent.getString("adcode");
+                String province = addressComponent.getString("province");
+                String city = addressComponent.getString("city");
+                String district = addressComponent.getString("district");
+                District district1 = new District();
+                district1.setProvince(province);
+                district1.setProvinceCode(code.substring(0, 2) + "0000");
+                district1.setCity(city);
+                district1.setCityCode(code.substring(0, 4) + "00");
+                district1.setDistrict(district);
+                district1.setDistrictCode(code);
+                return district1;
+            }
+            logger.debug(httpResult.getData());
+            return null;
+        }catch (Exception e){
+            e.printStackTrace();
+            return null;
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/model/District.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/model/District.java
new file mode 100644
index 0000000..08694d1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDe/model/District.java
@@ -0,0 +1,83 @@
+package com.stylefeng.guns.modular.system.util.GaoDe.model;
+
+
+/**
+* 行政区域
+* @author pzb
+* @Date 2023/2/25 11:40
+*/
+public class District {
+    /**
+     * 省名称
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 区县名称
+     */
+    private String district;
+    /**
+     * 区县编号
+     */
+    private String districtCode;
+
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getProvinceCode() {
+        return provinceCode;
+    }
+
+    public void setProvinceCode(String provinceCode) {
+        this.provinceCode = provinceCode;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getCityCode() {
+        return cityCode;
+    }
+
+    public void setCityCode(String cityCode) {
+        this.cityCode = cityCode;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getDistrictCode() {
+        return districtCode;
+    }
+
+    public void setDistrictCode(String districtCode) {
+        this.districtCode = districtCode;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GeodesyUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GeodesyUtil.java
new file mode 100644
index 0000000..e684fa1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GeodesyUtil.java
@@ -0,0 +1,63 @@
+package com.stylefeng.guns.modular.system.util;
+
+import org.gavaghan.geodesy.Ellipsoid;
+import org.gavaghan.geodesy.GeodeticCalculator;
+import org.gavaghan.geodesy.GeodeticCurve;
+import org.gavaghan.geodesy.GlobalCoordinates;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 计算两个金纬度坐标之间的直线距离
+ */
+public class GeodesyUtil {
+
+
+    /**
+     * 获取直线距离
+     * @param fromLonLat
+     * @param toLonLat
+     * @return
+     */
+    public static Map<String, Double> getDistance(String fromLonLat, String toLonLat){
+        String[] from = fromLonLat.split(",");
+        String[] to = toLonLat.split(",");
+        GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(from[1]), Double.valueOf(from[0]));
+        GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(to[1]), Double.valueOf(to[0]));
+        double Sphere = getDistanceMeter(source, target, Ellipsoid.Sphere);
+        double WGS84 = getDistanceMeter(source, target, Ellipsoid.WGS84);
+        double GRS80 = getDistanceMeter(source, target, Ellipsoid.GRS80);
+        double GRS67 = getDistanceMeter(source, target, Ellipsoid.GRS67);
+        double ANS = getDistanceMeter(source, target, Ellipsoid.ANS);
+        double WGS72 = getDistanceMeter(source, target, Ellipsoid.WGS72);
+        double Clarke1858 = getDistanceMeter(source, target, Ellipsoid.Clarke1858);
+        double Clarke1880 = getDistanceMeter(source, target, Ellipsoid.Clarke1880);
+//        System.out.println("Sphere坐标系计算结果:"+Sphere + "米");
+//        System.out.println("WGS84坐标系计算结果:"+WGS84 + "米");
+//        System.out.println("GRS80坐标系计算结果:"+GRS80 + "米");
+//        System.out.println("GRS67坐标系计算结果:"+GRS67 + "米");
+//        System.out.println("ANS坐标系计算结果:"+ANS + "米");
+//        System.out.println("WGS72坐标系计算结果:"+WGS72 + "米");
+//        System.out.println("Clarke1858坐标系计算结果:"+Clarke1858 + "米");
+//        System.out.println("Clarke1880坐标系计算结果:"+Clarke1880 + "米");
+        Map<String, Double> map = new HashMap<>();
+        map.put("Sphere", Sphere);
+        map.put("WGS84", WGS84);
+        map.put("GRS80", GRS80);
+        map.put("GRS67", GRS67);
+        map.put("ANS", ANS);
+        map.put("WGS72", WGS72);
+        map.put("Clarke1858", Clarke1858);
+        map.put("Clarke1880", Clarke1880);
+        return map;
+    }
+
+
+    private static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){
+        //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离
+        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);
+        return geoCurve.getEllipsoidalDistance();
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
new file mode 100644
index 0000000..61bb222
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
@@ -0,0 +1,72 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * socket推单处理类
+ */
+@Component
+public class PushUtil {
+
+    Logger logger = LoggerFactory.getLogger("ServiceLog");
+
+    @Autowired
+    private RestTemplate internalRestTemplate;
+
+
+
+
+
+
+    /**
+     * 系统推单推送
+     * @param id            接受对象id
+     * @param type          接受对象类型(1=用户,2=司机)
+     * @param orderId       订单id
+     * @param countdown     抢单倒计时(秒)
+     */
+    public void pushGrabOrder(Integer id, Integer type, Integer orderId, Integer countdown){
+        JSONObject msg = new JSONObject();
+        msg.put("code", 200);
+        msg.put("msg", "SUCCESS");
+        msg.put("method", "GRAB_ORDER");
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderId", orderId);
+        map.put("countdown", countdown);
+
+        msg.put("data", map);
+
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("msg", msg.toJSONString());
+        params.add("id", id.toString());
+        params.add("type", type.toString());
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class);
+        JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
+        if(jsonObject1.getIntValue("code") != 200){
+            logger.debug(jsonObject1.getString("msg"));
+            System.err.println(jsonObject1.getString("msg"));
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/httpClinet/HttpClientUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/httpClinet/HttpClientUtil.java
new file mode 100644
index 0000000..6cf2cae
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/httpClinet/HttpClientUtil.java
@@ -0,0 +1,267 @@
+package com.stylefeng.guns.modular.system.util.httpClinet;
+
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.security.KeyStore;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * http工具类
+ */
+public class HttpClientUtil {
+
+    private static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
+
+    private static PoolingHttpClientConnectionManager connectionManager;
+
+
+    {
+        //1.创建连接池管理器
+        connectionManager = new PoolingHttpClientConnectionManager(60000,
+                TimeUnit.MILLISECONDS);
+        connectionManager.setMaxTotal(1000);
+        connectionManager.setDefaultMaxPerRoute(50);
+    }
+
+    /**
+     * 创建一个httpClient对象
+     */
+    private static CloseableHttpClient getHttpCline(){
+        return  HttpClients.custom()
+                .setConnectionManager(connectionManager)
+                .disableAutomaticRetries()
+                .build();
+    }
+
+    private static RequestConfig getRequestConfig(){
+        RequestConfig.Builder builder = RequestConfig.custom();
+        builder.setSocketTimeout(60000)//3.1设置客户端等待服务端返回数据的超时时间
+                .setConnectTimeout(30000)//3.2设置客户端发起TCP连接请求的超时时间
+                .setExpectContinueEnabled(true)
+                .setConnectionRequestTimeout(30000);//3.3设置客户端从连接池获取链接的超时时间
+        return builder.build();
+    }
+
+
+
+    /**
+     * 创建一个POST请求实例
+     * @param url       请求地址
+     * @param params    请求参数
+     */
+    private static CloseableHttpResponse setPostHttpRequset(String url, Map<String, Object> params, Map<String, String> header, String contentType) throws Exception{
+        HttpPost httpPost = new HttpPost(url);
+        httpPost.setConfig(getRequestConfig());
+        if(null != header){
+            for(String key : header.keySet()){
+                httpPost.setHeader(key, header.get(key));
+            }
+        }
+        List<NameValuePair> list = new ArrayList<>();
+        if(null != params){
+            Set<String> keys = params.keySet();
+            for(String key : keys){
+                list.add(new BasicNameValuePair(key, null == params.get(key) ? null : params.get(key).toString()));
+            }
+        }
+        switch (contentType){
+            case "form":
+                httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
+                break;
+            case "json":
+                ObjectMapper objectMapper = new ObjectMapper();
+                String s =objectMapper.writeValueAsString(params);
+                httpPost.setEntity(new StringEntity(s, ContentType.create(ContentType.APPLICATION_JSON.getMimeType(), Charset.forName("UTF-8"))));
+                break;
+        }
+        return getHttpCline().execute(httpPost);
+    }
+
+
+    /**
+     * 获取get请求实例
+     * @param url       请求地址
+     * @param params    请求参数
+     */
+    private static CloseableHttpResponse setGetHttpRequset(String url, Map<String, Object> params, Map<String, String> header) throws Exception{
+        StringBuffer sb = new StringBuffer();
+        String p = "";
+        if(null != params){
+            Set<String> keys = params.keySet();
+            for(String key : keys){
+                sb.append(key + "=" + params.get(key) + "&");
+            }
+            p = "?" + sb.substring(0, sb.length() - 1);
+        }
+        HttpGet httpGet = new HttpGet(url + p);
+        httpGet.setConfig(getRequestConfig());
+        if(null != header){
+            for(String key : header.keySet()){
+                httpGet.setHeader(key, header.get(key));
+            }
+        }
+        return getHttpCline().execute(httpGet);
+    }
+
+
+    /**
+     * 发送http请求
+     * @param mothed        "GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS"
+     * @param url           请求地址
+     * @param params        请求参数
+     * @param header        请求头
+     * @param contentType   参数请求方式form/json
+     * @return
+     */
+    public static HttpResult pushHttpRequset(String mothed, String url, Map<String, Object> params, Map<String, String> header, String contentType) throws Exception{
+        String randome = UUID.randomUUID().toString();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
+        logger.info(sdf.format(new Date()) + "----(" + randome + ")请求参数:" + JSON.toJSONString(params));
+        CloseableHttpResponse httpResponse = null;
+        switch (mothed){
+            case "GET":
+                httpResponse = setGetHttpRequset(url, params, header);
+                break;
+            case "POST":
+                httpResponse = setPostHttpRequset(url, params, header, contentType);
+                break;
+        }
+        int statusCode = httpResponse.getStatusLine().getStatusCode();
+        String content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
+        logger.info(sdf.format(new Date()) + "----(" + randome + ")返回结果:" + content);
+        HttpResult httpResult = HttpResult.getHttpResult(statusCode, content);
+        close(httpResponse);
+        return httpResult;
+    }
+
+
+    /**
+     * 发送XML请求
+     * @param url       请求地址
+     * @param xml       XML数据
+     * @param header    自定义请求头
+     * @return
+     */
+    public static HttpResult pushHttpRequsetXml(String url, String xml, Map<String, String> header) throws Exception{
+        HttpPost httpPost = new HttpPost(url);
+        httpPost.setConfig(getRequestConfig());
+        for(String key : header.keySet()){
+            httpPost.setHeader(key, header.get(key));
+        }
+        httpPost.setHeader("Content-Type", "application/xml");
+        httpPost.setEntity(new StringEntity(xml, "UTF-8"));
+        CloseableHttpResponse httpResponse = getHttpCline().execute(httpPost);
+        int statusCode = httpResponse.getStatusLine().getStatusCode();
+        String content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
+        HttpResult httpResult = HttpResult.getHttpResult(statusCode, content);
+        close(httpResponse);
+        return httpResult;
+    }
+
+
+
+    /**
+     * 请求https发送XML请求
+     * @param url           接口路径
+     * @param xml           内容
+     * @param header        请求头
+     * @param certPassword      证书密码
+     * @param certPath      证书路径
+     * @param certType      证书类型
+     * @return
+     * @throws Exception
+     */
+    public String pushHttpsRequsetXml(String url, String xml, Map<String, String> header, String certPassword, String certPath, String certType) throws Exception{
+        HttpPost httpPost = new HttpPost(url);
+        for(String key : header.keySet()){
+            httpPost.setHeader(key, header.get(key));
+        }
+        httpPost.setHeader("Content-Type", "application/xml");
+        httpPost.setEntity(new StringEntity(xml, "UTF-8"));
+        CloseableHttpClient httpCline = this.initCert(certPassword, certPath, certType);
+        CloseableHttpResponse httpResponse = httpCline.execute(httpPost);
+        String content = null;
+        if(httpResponse.getStatusLine().getStatusCode() == 200){
+            content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
+        }else{
+            content = "返回状态码:" + httpResponse.getStatusLine() + "。" + EntityUtils.toString(httpResponse.getEntity());
+        }
+        this.close(httpResponse);
+        httpCline.close();
+        return content;
+    }
+
+
+    /**
+     * 初始化https对象(带证书)
+     * @param key       证书密码
+     * @param certPath  证书路径
+     * @param certType  证书类型
+     * @throws Exception
+     */
+    private CloseableHttpClient initCert(String key, String certPath, String certType) throws Exception {
+        KeyStore keyStore = KeyStore.getInstance(certType);
+        InputStream inputStream = new FileInputStream(new File(certPath));
+        try {
+            keyStore.load(inputStream, key.toCharArray());
+        } finally {
+            inputStream.close();
+        }
+        SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build();
+        SSLConnectionSocketFactory sslsf =
+                new SSLConnectionSocketFactory(sslcontext, new String[] {"TLSv1"}, null,
+                        SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+        return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+    }
+
+
+
+    /**
+     * 关闭资源
+     */
+    private static void close(CloseableHttpResponse httpResponse){
+        try {
+            if(null != httpResponse){
+                EntityUtils.consume(httpResponse.getEntity());//此处高能,通过源码分析,由EntityUtils是否回收HttpEntity
+                httpResponse.close();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }finally {
+            try {
+                if(null != httpResponse){
+                    httpResponse.close();
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/httpClinet/HttpResult.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/httpClinet/HttpResult.java
new file mode 100644
index 0000000..9b66d04
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/httpClinet/HttpResult.java
@@ -0,0 +1,45 @@
+package com.stylefeng.guns.modular.system.util.httpClinet;
+
+
+/**
+ * http请求返回封装
+ */
+public class HttpResult {
+    /**
+     * 返回状态码
+     */
+    private Integer code;
+    /**
+     * 返回结果
+     */
+    private String data;
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    /**
+     * 返回封装结果
+     * @param code
+     * @param data
+     * @return
+     */
+    public static HttpResult getHttpResult(Integer code, String data){
+        HttpResult httpResult = new HttpResult();
+        httpResult.setCode(code);
+        httpResult.setData(data);
+        return httpResult;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/OCRUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/OCRUtil.java
new file mode 100644
index 0000000..35a0ccb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/OCRUtil.java
@@ -0,0 +1,269 @@
+package com.stylefeng.guns.modular.system.util.juhe;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.modular.system.util.httpClinet.HttpClientUtil;
+import com.stylefeng.guns.modular.system.util.httpClinet.HttpResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/4/10 15:35
+ */
+public class OCRUtil {
+
+    static Logger logger = LoggerFactory.getLogger("ServiceLog");
+
+    private final static String key = "5cc9622f299335639dbc046f3812c52a";
+
+    private static HttpClientUtil httpClientUtil = new HttpClientUtil();
+
+
+    /**
+     * OCR证件识别
+     * @param cardType
+     *          "1": "一代身份证",
+     *         "2": "二代身份证正面",
+     *         "3": "二代身份证证背面",
+     *         "4": "临时身份证",
+     *         "5": "驾照",
+     *         "6": "行驶证",
+     *         "7": "军官证1998版",
+     *         "9": "中华人民共和国往来港澳通行证2005版",
+     *         "10": "台湾居民往来大陆通行证1992版-照片页",
+     *         "11": "大陆居民往来台湾通行证1992版-照片页",
+     *         "12": "签证(护照幅面)",
+     *         "13": "护照(护照幅面)",
+     *         "14": "港澳居民来往内地通行证-照片页",
+     *         "15": "港澳居民来往内地通行证-机读码页",
+     *         "16": "户口本",
+     *         "17": "银行卡",
+     *         "22": "往来港澳通行证2014版-照片页(卡式港澳通行证)",
+     *         "25": "台湾居民来往大陆通行证2015版-照片页",
+     *         "26": "台湾居民往来大陆通行证2015版-机读码页",
+     *         "28": "中国驾驶证副页",
+     *         "29": "往来台湾通行证2017版-照片页",
+     *         "30": "行驶证副页",
+     *         "31": "港澳台居民居住证正面",
+     *         "32": "港澳台居民居住证反面",
+     *         "33": "外国人永久居留身份证",
+     *         "101": "二代身份证正面背面自动分类",
+     *         "102": "驾驶证正副页自动分类",
+     *         "103": "行驶证正副页自动分类",
+     *         "104": "身份证、驾驶证、行驶证自动分类",
+     *         "1000": "居住证",
+     *         "1001": "香港永久性居民身份证",
+     *         "1002": "登机牌(拍照设备目前不支持登机牌的识别)",
+     *         "1003": "边民证(A)(照片页)",
+     *         "2008":"营业执照"
+     * @param file  图片文件
+     * @return
+     */
+    public static JSONObject certificate(Integer cardType, MultipartFile file){
+        String url = "http://v.juhe.cn/certificates/query";
+        HttpResult httpResult = null;
+        try {
+            Map<String, Object> params = new HashMap<>();
+            params.put("key", key);
+            params.put("cardType", cardType.toString());
+            params.put("pic", file);
+            httpResult = httpClientUtil.pushHttpRequset("POST", url, params, null, "form");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if(httpResult.getCode() != 200){
+            logger.debug("查询证件失败:" + httpResult.getData());
+            return null;
+        }
+        String data = httpResult.getData();
+        JSONObject jsonObject = JSON.parseObject(data);
+        Integer error_code = jsonObject.getInteger("error_code");
+        if(0 != error_code){
+            logger.debug("查询证件失败:" + jsonObject.getString("reason"));
+            return null;
+        }
+        JSONObject result = jsonObject.getJSONObject("result");
+        return result;
+    }
+
+
+    ////身份证识别返回示例
+    //{
+    //    "error_code": 0,
+    //    "reason": "操作成功",
+    //    "result": {
+    //        "住址": "武汉市江岸区永清路****",
+    //        "保留": "",
+    //        "公民身份号码": "42010619510609****",
+    //        "出生": "1951-06-09",
+    //        "头像": "",/*Base64字符串*/
+    //        "姓名": "彭*",
+    //        "性别": "男",
+    //        "民族": "汉",
+    //        "orderid":"JH1531180126114835937669",
+    //        "userid":"1234567"
+    //    }
+    //}
+    //
+    ////车牌识别返回示例
+    //{
+    //  "reason": "操作成功",
+    //  "result": {
+    //    "车牌号": "粤N0***81",
+    //    "车牌颜色": "1",
+    //    "车牌类型": "1",
+    //    "整牌可信度": "86",
+    //    "亮度评价": "215",
+    //    "车牌运动方向": "0",
+    //    "车牌位置(left_top_right_bottom)": "30_118_498_222",
+    //        "orderid":"JH1531180126114835937669",
+    //        "userid":"1234567"
+    //  },
+    //  "error_code": 0
+    //}
+    ////港澳台居民居住证正面
+    //{
+    //   "reason": "操作成功",
+    //   "result":{
+    //     "保留" : "",
+    //     "姓名" : "",
+    //     "性别" : "",
+    //     "民族" : "",
+    //     "住址" : "",
+    //     "出生" : "",
+    //     "公民身份号码" : "",
+    //     "复印件判别" : "",
+    //     "头像" : ""
+    //   }
+    //}
+    ////港澳台居民居住证反面
+    //{
+    //   "reason": "操作成功",
+    //   "result":{
+    //     "保留" : "",
+    //     "签发机关" : "",
+    //     "有效期限" : "",
+    //     "签发日期" : "",
+    //     "有效期至" : "",
+    //     "通行证号码" : ""
+    //   }
+    //}
+    ////港澳居民来往内地通行证-照片页
+    //{
+    //   "reason": "操作成功",
+    //   "result":{
+    //     "保留" : "",
+    //     "证件号码" : "",
+    //     "中文姓名" : "",
+    //     "英文姓名" : "",
+    //     "性别" : "",
+    //     "出生日期" : "",
+    //     "本证有效期至" : "",
+    //     "英文姓" : "",
+    //     "英文名" : "",
+    //    "港澳证件号码" : "",
+    //    "签发日期" : "",
+    //    "有效期限" : "",
+    //    "签发机关" : "",
+    //    "换证次数" : "",
+    //    "其他姓名" : "",
+    //    "归属地" : "",
+    //    "头像" : "",
+    //   }
+    //}
+    ////中国台湾居民来往内地通行证照片页
+    //{
+    //   "reason": "操作成功",
+    //   "result":{
+    //     "保留" : "",
+    //     "中文姓名" : "",
+    //     "英文姓名" : "",
+    //     "出生日期" : "",
+    //     "性别" : "",
+    //     "有效期限" : "",
+    //     "签发地点" : "",
+    //     "证件号码" : "",
+    //     "签发次数" : "",
+    //     "签发机关" : "",
+    //     "头像" : "",
+    //   }
+    //}
+    ////针对车牌的信息:
+    //1.车牌颜色类型:
+    //	 0 //未知车牌
+    //	 1 //蓝牌
+    //	 2 //黑牌
+    //	 3 //单排黄牌
+    //	 4 //双排黄牌(大车尾牌,农用车)
+    //	 5 //警车车牌
+    //	 6 //武警车牌
+    //	 7 //个性化车牌
+    //	 8 //单排军车
+    //	 9 //双排军车
+    //	 10 //使馆牌
+    //	 11 //香港牌
+    //	 12 //拖拉机
+    //	 13 //澳门牌
+    //	 14 //厂内牌
+    //	 15 //民航牌
+    //	 16 //领事馆车牌
+    //	 17 //新能源车牌-小型车
+    //	 18 //新能源车牌-大型车
+    //
+    //2.车牌可信度:
+    //    当前识别结果的分数,分数越高识别对的可能越大
+    //3.车牌位置:
+    //    是指车牌在图像中的坐标值
+    //4.车牌运动方向:
+    //    0 unknown, 1 left, 2 right, 3 up , 4 down
+    //
+    ////行驶证查询返回:
+    //{
+    //    "保留": "",
+    //    "号牌号码": "粤A4****",
+    //    "车辆类型": "小型轿车",
+    //    "所有人": "黄**",
+    //    "住址": "广东省从化市城郊街东风***********",
+    //    "品牌型号": "别克1B*******71801S",
+    //    "车辆识别代号": "LSGJ********44832",
+    //    "发动机号码": "T18S********C",
+    //    "注册日期": "2000-06-13",
+    //    "发证日期": "2020-07-11",
+    //    "使用性质": "非营运",
+    //        "orderid":"JH1531180126114835937669",
+    //        "userid":"1234567"
+    //}
+    ////VIN识别
+    //{
+    //    "vin": "WBAFR7103BC727722",
+    //    "orderid": "JH1531180524123006771818"
+    //}
+    ////营业执照
+    //{
+    //"reason": "操作成功",
+    //"result":{
+    //"统一社会信用代码": "91110105MA01AMC6Q",
+    //"组织机构代码": "",
+    //"税务登记证号": "",
+    //"社保登记号": "",
+    //"统计证证号": "",
+    //"名称": "北京数字传奇网络科技有限公司",
+    //"类型": "有限责任公司(自然人投资或控股)",
+    //"住所": "北京市朝阳区将台乡驼房营路8号新华科技大厦21层2106室",
+    //"法定代表人": "吴发强",
+    //"组成形式": "",
+    //"注册资本": "100万元",
+    //"成立日期": "2018年03月21日",
+    //"营业期限": "2018年03月21日至长期",
+    //"经营范围": "技术开发、技术推广、技术咨询、技术服务。(企业依法自主\n选择经营项目,开展经营活班依法须经批准的顼目,经相关\n部门批准后依批准的内容开展经营活班不得从事本市产业政\n策禁止和限制类顼目的经营活动。)",
+    //"登记机关": "",
+    //"登记日期": "",
+    //"二维码": "http://qyxy.baic.gov.cn/wap/wap/creditWapAction!qr.dhtml?id=ff8080816242f1250162463d9d3168f3",
+    //"副本": ""
+    //},
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/Realtime.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/Realtime.java
new file mode 100644
index 0000000..97db4d6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/Realtime.java
@@ -0,0 +1,40 @@
+package com.stylefeng.guns.modular.system.util.juhe;
+
+import lombok.Data;
+
+/**
+* 天气实况
+* @author pzb
+* @Date 2023/2/20 11:38
+*/
+@Data
+public class Realtime {
+    /**
+     * 天气情况,如:晴、多云
+     */
+    private String info;
+    /**
+     * 天气标识id,可参考小接口2
+     */
+    private String wid;
+    /**
+     * 温度,可能为空
+     */
+    private String temperature;
+    /**
+     * 湿度,可能为空
+     */
+    private String humidity;
+    /**
+     * 风向,可能为空
+     */
+    private String direct;
+    /**
+     * 风力,可能为空
+     */
+    private String power;
+    /**
+     * 空气质量指数,可能为空
+     */
+    private String aqi;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/WeatherCityInfo.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/WeatherCityInfo.java
new file mode 100644
index 0000000..200ff28
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/WeatherCityInfo.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.modular.system.util.juhe;
+
+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;
+
+/**
+* 天气相关城市
+* @author pzb
+* @Date 2023/2/25 10:56
+*/
+@Data
+@TableName("t_weather_city")
+public class WeatherCityInfo {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.INPUT)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 省
+     */
+    @TableField("province")
+    private String province;
+    /**
+     * 市
+     */
+    @TableField("city")
+    private String city;
+    /**
+     * 区
+     */
+    @TableField("district")
+    private String district;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/WeatherUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/WeatherUtil.java
new file mode 100644
index 0000000..772c9a3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/juhe/WeatherUtil.java
@@ -0,0 +1,119 @@
+package com.stylefeng.guns.modular.system.util.juhe;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.util.httpClinet.HttpClientUtil;
+import com.stylefeng.guns.modular.system.util.httpClinet.HttpResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+
+/**
+* 天气工具类
+* @author pzb
+* @Date 2023/2/18 16:54
+*/
+public class WeatherUtil {
+
+    static Logger logger = LoggerFactory.getLogger("ServiceLog");
+
+    private final static String weather_type = "[{\"wid\":\"00\",\"weather\":\"晴\"},{\"wid\":\"01\",\"weather\":\"多云\"},{\"wid\":\"02\",\"weather\":\"阴\"},{\"wid\":\"03\",\"weather\":\"阵雨\"},{\"wid\":\"04\",\"weather\":\"雷阵雨\"},{\"wid\":\"05\",\"weather\":\"雷阵雨伴有冰雹\"},{\"wid\":\"06\",\"weather\":\"雨夹雪\"},{\"wid\":\"07\",\"weather\":\"小雨\"},{\"wid\":\"08\",\"weather\":\"中雨\"},{\"wid\":\"09\",\"weather\":\"大雨\"},{\"wid\":\"10\",\"weather\":\"暴雨\"},{\"wid\":\"11\",\"weather\":\"大暴雨\"},{\"wid\":\"12\",\"weather\":\"特大暴雨\"},{\"wid\":\"13\",\"weather\":\"阵雪\"},{\"wid\":\"14\",\"weather\":\"小雪\"},{\"wid\":\"15\",\"weather\":\"中雪\"},{\"wid\":\"16\",\"weather\":\"大雪\"},{\"wid\":\"17\",\"weather\":\"暴雪\"},{\"wid\":\"18\",\"weather\":\"雾\"},{\"wid\":\"19\",\"weather\":\"冻雨\"},{\"wid\":\"20\",\"weather\":\"沙尘暴\"},{\"wid\":\"21\",\"weather\":\"小到中雨\"},{\"wid\":\"22\",\"weather\":\"中到大雨\"},{\"wid\":\"23\",\"weather\":\"大到暴雨\"},{\"wid\":\"24\",\"weather\":\"暴雨到大暴雨\"},{\"wid\":\"25\",\"weather\":\"大暴雨到特大暴雨\"},{\"wid\":\"26\",\"weather\":\"小到中雪\"},{\"wid\":\"27\",\"weather\":\"中到大雪\"},{\"wid\":\"28\",\"weather\":\"大到暴雪\"},{\"wid\":\"29\",\"weather\":\"浮尘\"},{\"wid\":\"30\",\"weather\":\"扬沙\"},{\"wid\":\"31\",\"weather\":\"强沙尘暴\"},{\"wid\":\"53\",\"weather\":\"霾\"}]";
+
+    private final static String bad_weather = "[{\"wid\":\"03\",\"weather\":\"阵雨\"},{\"wid\":\"04\",\"weather\":\"雷阵雨\"},{\"wid\":\"05\",\"weather\":\"雷阵雨伴有冰雹\"},{\"wid\":\"06\",\"weather\":\"雨夹雪\"},{\"wid\":\"07\",\"weather\":\"小雨\"},{\"wid\":\"08\",\"weather\":\"中雨\"},{\"wid\":\"09\",\"weather\":\"大雨\"},{\"wid\":\"10\",\"weather\":\"暴雨\"},{\"wid\":\"11\",\"weather\":\"大暴雨\"},{\"wid\":\"12\",\"weather\":\"特大暴雨\"},{\"wid\":\"13\",\"weather\":\"阵雪\"},{\"wid\":\"14\",\"weather\":\"小雪\"},{\"wid\":\"15\",\"weather\":\"中雪\"},{\"wid\":\"16\",\"weather\":\"大雪\"},{\"wid\":\"17\",\"weather\":\"暴雪\"},{\"wid\":\"19\",\"weather\":\"冻雨\"},{\"wid\":\"20\",\"weather\":\"沙尘暴\"},{\"wid\":\"21\",\"weather\":\"小到中雨\"},{\"wid\":\"22\",\"weather\":\"中到大雨\"},{\"wid\":\"23\",\"weather\":\"大到暴雨\"},{\"wid\":\"24\",\"weather\":\"暴雨到大暴雨\"},{\"wid\":\"25\",\"weather\":\"大暴雨到特大暴雨\"},{\"wid\":\"26\",\"weather\":\"小到中雪\"},{\"wid\":\"27\",\"weather\":\"中到大雪\"},{\"wid\":\"28\",\"weather\":\"大到暴雪\"},{\"wid\":\"30\",\"weather\":\"扬沙\"},{\"wid\":\"31\",\"weather\":\"强沙尘暴\"},{\"wid\":\"53\",\"weather\":\"霾\"}]";
+
+    private final static String key = "aaebb3e5c18fd371257a2ab6b5670efe";
+
+    private static HttpClientUtil httpClientUtil = new HttpClientUtil();
+
+
+    /**
+     * 获取天气实况数据
+     * @param city  要查询的城市名称/id,城市名称如:温州、上海、北京,需要utf8 urlencode
+     * @return
+     */
+    public static Realtime queryNowWeather(String city){
+        if(ToolUtil.isEmpty(city)){
+            return null;
+        }
+        String url = "http://apis.juhe.cn/simpleWeather/query?city=" + city + "&key=" + key;
+        HttpResult httpResult = null;
+        try {
+            httpResult = httpClientUtil.pushHttpRequset("GET", url, null, null, "json");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if(httpResult.getCode() != 200){
+            logger.debug("查询天气失败:" + httpResult.getData());
+            return null;
+        }
+        String data = httpResult.getData();
+        JSONObject jsonObject = JSON.parseObject(data);
+        Integer error_code = jsonObject.getInteger("error_code");
+        if(0 != error_code){
+            logger.debug("查询天气失败:" + jsonObject.getString("reason"));
+            return null;
+        }
+        Realtime realtime = jsonObject.getObject("realtime", Realtime.class);
+        return realtime;
+    }
+
+
+    /**
+     * 查询是否是恶劣天气
+     * @param city
+     * @return
+     */
+    public static boolean isBadWeather(String city){
+        if(null == city){
+            return false;
+        }
+        Realtime realtime = queryNowWeather(city);
+        if(null == realtime){
+            return false;
+        }
+        String wid = realtime.getWid();
+        JSONArray badWeather = JSON.parseArray(bad_weather);
+        for (int i = 0; i < badWeather.size(); i++) {
+            JSONObject jsonObject = badWeather.getJSONObject(i);
+            String wid1 = jsonObject.getString("wid");
+            if(wid.equals(wid1)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 获取支持城市列表
+     * @return
+     */
+    public static List<WeatherCityInfo> queryCityList(){
+        String url = "http://apis.juhe.cn/simpleWeather/cityList?key=" + key;
+        HttpResult httpResult = null;
+        try {
+            httpResult = httpClientUtil.pushHttpRequset("GET", url, null, null, "json");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if(httpResult.getCode() != 200){
+            logger.debug("查询支持城市失败:" + httpResult.getData());
+            return null;
+        }
+        String data = httpResult.getData();
+        JSONObject jsonObject = JSON.parseObject(data);
+        Integer error_code = jsonObject.getInteger("error_code");
+        if(0 != error_code){
+            logger.debug("查询支持城失败:" + jsonObject.getString("reason"));
+            return null;
+        }
+        JSONArray result = jsonObject.getJSONArray("result");
+        List<WeatherCityInfo> weatherCities = result.toJavaList(WeatherCityInfo.class);
+        return weatherCities;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/MongoUtils.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/MongoUtils.java
new file mode 100644
index 0000000..1968c98
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/MongoUtils.java
@@ -0,0 +1,166 @@
+package com.stylefeng.guns.modular.system.util.mongodb;
+
+import com.alibaba.fastjson.JSONObject;
+import com.mongodb.BasicDBObject;
+import com.mongodb.client.AggregateIterable;
+import com.mongodb.client.MongoCursor;
+import com.stylefeng.guns.modular.system.util.mongodb.model.Location;
+import com.stylefeng.guns.modular.system.util.mongodb.model.LocationQuery;
+import org.bson.Document;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.function.Supplier;
+
+
+@Component
+public class MongoUtils<T> {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    /**
+     * lambda
+     * @param data 添加数据
+     * @param collectionName 表名
+     */
+    public void insert(Supplier<T> data,String collectionName){
+        mongoTemplate.insert(data.get(),collectionName);
+    }
+
+    public void insert(Object data, String collectionName){
+        mongoTemplate.insert(data,collectionName);
+    }
+
+    /**
+     *
+     * @param sp 查询条件lambda
+     * @param sets 更新的字段
+     * @param collectionName 表名
+     */
+    public void update(Supplier<Criteria> sp, Supplier<Map<String,Object>> sets, String collectionName){
+        Query query = Query.query(sp.get());
+        Update update = new Update();
+
+        sets.get().forEach((key,value) ->{
+            //System.out.println(key);
+            //System.out.println(value);
+            update.set(key,value);
+        });
+        mongoTemplate.updateFirst(query, update, collectionName);
+    }
+
+    public void update(Criteria sp, Supplier<Map<String,Object>> sets, String collectionName){
+        Query query = Query.query(sp);
+        Update update = new Update();
+
+        sets.get().forEach((key,value) ->{
+            //System.out.println(key);
+            //System.out.println(value);
+            update.set(key,value);
+        });
+        mongoTemplate.updateFirst(query, update, collectionName);
+    }
+
+    /**lambda
+     * @param sp 查询条件lambda
+     * @param collectionName 表名
+     * @return
+     */
+    public List<T> query(Supplier<Criteria> sp, String collectionName, Class entityClass){
+        Query query = Query.query(sp.get());
+        List<T> ts = mongoTemplate.find(query,entityClass,collectionName);
+
+        return ts;
+    }
+
+    public List<T> query(Criteria sp, String collectionName, Class entityClass){
+        Query query = Query.query(sp);
+        List<T> ts = mongoTemplate.find(query,entityClass,collectionName);
+
+        return ts;
+    }
+
+    /**
+     * @param sp 查询条件lambda
+     * @param collectionName 表名
+     * @return
+     */
+    public void delete(Supplier<Criteria> sp, String collectionName){
+        Query query = Query.query(sp.get());
+        mongoTemplate.remove(query, collectionName);
+    }
+
+    public void delete(Criteria sp, String collectionName){
+        Query query = Query.query(sp);
+        mongoTemplate.remove(query, collectionName);
+    }
+    
+
+	
+	/**
+	 * 查询符合条件总条数
+	 * @return
+	 * @throws Exception
+	 */
+	public long findLogCount(HashMap<String,Object> paras,Class entityClass,String collectionName) throws Exception {
+		Query query = new Query();
+		Criteria criteria = new Criteria();
+	    if (null != paras ) {
+	    	Iterator<Entry<String, Object>> iterator = paras.entrySet().iterator();
+        	while(iterator.hasNext()) {
+        		Entry<String, Object> entry = iterator.next();
+        		String key = entry.getKey();
+        		Object value =  entry.getValue();
+        		criteria.and(key).is(value);
+        		
+        	}
+	        query.addCriteria(criteria);
+	    }
+	    long count = mongoTemplate.count(query, entityClass,collectionName);
+
+	    return count;
+	}
+
+	/**
+	 * 查询附近的对象
+	 * @param model
+	 * @return
+	 */
+	public List<Location> geoNear(LocationQuery model){
+		List<Location> resultList = new ArrayList<>();
+		try{
+			List<BasicDBObject> pipeLine = new ArrayList<>();
+			BasicDBObject aggregate = new BasicDBObject("$geoNear",
+					new BasicDBObject("near"
+							, new BasicDBObject("type", "Point")
+							.append("coordinates", model.getCoordinates()))
+							.append("distanceField", "distance")
+							.append("maxDistance", model.getDistance())
+							.append("spherical", true)
+
+			);
+
+			pipeLine.add(aggregate);
+			AggregateIterable<Document> location = mongoTemplate.getCollection("location").aggregate(pipeLine);
+			MongoCursor<Document> cursor = location.iterator();
+
+			//将查询的结果,封装成对象返回出去
+			while (cursor.hasNext()) {
+				org.bson.Document document = cursor.next();
+				Location node = JSONObject.parseObject(JSONObject.toJSONString(document),Location.class);
+				resultList.add(node);
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+		return resultList;
+	}
+    
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/GeoJson.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/GeoJson.java
new file mode 100644
index 0000000..05b3f83
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/GeoJson.java
@@ -0,0 +1,9 @@
+package com.stylefeng.guns.modular.system.util.mongodb.model;
+
+import lombok.Data;
+
+@Data
+public class GeoJson {
+    private String type;
+    private Double[] coordinates;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/Location.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/Location.java
new file mode 100644
index 0000000..c589a57
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/Location.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.modular.system.util.mongodb.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
+import org.springframework.data.mongodb.core.index.CompoundIndex;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.io.Serializable;
+
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Document(collection = "driver_location")
+@CompoundIndex(name = "location_index", def = "{'location': '2dsphere'}")
+public class Location implements Serializable {
+
+    private static final long serialVersionUID = 4508868382007529970L;
+
+    @Id
+    private String id;
+    /**
+     * 司机id
+     */
+    private Integer driverId;
+    /**
+     * x:经度 y:纬度
+     */
+    private GeoJsonPoint location;
+    /**
+     * 位置名称
+     **/
+    private String name;
+    /**
+     * 创建时间
+     */
+    private Long created;
+    /**
+     * 更新时间
+     */
+    private Long updated;
+    /**
+     * 上次更新时间
+     */
+    private Long lastUpdated;
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/LocationQuery.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/LocationQuery.java
new file mode 100644
index 0000000..caa63c4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/mongodb/model/LocationQuery.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.system.util.mongodb.model;
+
+import lombok.Data;
+
+@Data
+public class LocationQuery {
+    /**
+     * 当前经纬度[xxx,xxx]
+     **/
+    private Double[] coordinates;
+    /**
+     * 距离,如:200,500,1,3,5,10,20
+     **/
+    private Double distance;
+    /**
+     * 距离单位,如:m,km
+     **/
+    private String unit;
+    /**
+     * 位置类型:1-景点,2-加油站,3-酒店
+     **/
+    private Integer type;
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/resources/application.yml b/management/guns-admin/src/main/resources/application.yml
index 05d8180..6697fea 100644
--- a/management/guns-admin/src/main/resources/application.yml
+++ b/management/guns-admin/src/main/resources/application.yml
@@ -77,6 +77,15 @@
       - dataSourceGuns
       - dataSourceBiz
 
+
+---
+
+spring:
+  data:
+    mongodb:
+#      uri: mongodb://root:bv@_N36o+cTe1LpS@127.0.0.1:27017/admin
+      uri: mongodb://127.0.0.1:27017/admin
+
 ---
 
 filePath: /usr/local/server/app/orderPostionFile/ #存储订单轨迹文件路径
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js
index 4c98860..18f8831 100644
--- a/management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js
@@ -71,15 +71,19 @@
     }
     //提交信息
     var ajax = new $ax(Feng.ctxPath + "/tOrder/add", function(data){
-        Feng.success("添加成功!");
-        window.parent.TOrder.table.refresh();
-        TOrderInfoDlg.close();
+        if(data.code == 200){
+            Feng.success("添加成功!");
+            window.parent.TOrder.table.refresh();
+            TOrderInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
     },function(data){
         Feng.error("添加失败!" + data.responseJSON.message + "!");
     });
     ajax.set(this.tOrderInfoData);
     ajax.set('startAddress', JSON.stringify(TOrderInfoDlg.startAddress));
-    ajax.set('endAddress', null == endAddress ? "" : JSON.stringify(TOrderInfoDlg.endAddress));
+    ajax.set('endAddress', null == TOrderInfoDlg.endAddress ? "" : JSON.stringify(TOrderInfoDlg.endAddress));
     ajax.start();
 }
 

--
Gitblit v1.7.1