fllmoyu пре 4 година
родитељ
комит
e155dda762
44 измењених фајлова са 1629 додато и 59 уклоњено
  1. 6 0
      common/pom.xml
  2. 12 0
      common/src/main/java/com/jpsoft/bus/config/GpsParamConfig.java
  3. 104 0
      common/src/main/java/com/jpsoft/bus/modules/bus/callback/GpsDataCallbackImpl.java
  4. 2 0
      common/src/main/java/com/jpsoft/bus/modules/bus/dao/DriverInfoDAO.java
  5. 20 0
      common/src/main/java/com/jpsoft/bus/modules/bus/dao/GpsDataInfoDAO.java
  6. 2 0
      common/src/main/java/com/jpsoft/bus/modules/bus/dao/ShiftInfoDAO.java
  7. 2 0
      common/src/main/java/com/jpsoft/bus/modules/bus/dao/UserInfoDAO.java
  8. 4 0
      common/src/main/java/com/jpsoft/bus/modules/bus/dao/VehicleInfoDAO.java
  9. 66 0
      common/src/main/java/com/jpsoft/bus/modules/bus/entity/GpsDataInfo.java
  10. 28 25
      common/src/main/java/com/jpsoft/bus/modules/bus/entity/VehicleInfo.java
  11. 2 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/DriverInfoService.java
  12. 19 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/GpsDataInfoService.java
  13. 15 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/GpsService.java
  14. 2 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/ShiftInfoService.java
  15. 2 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/UserInfoService.java
  16. 5 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/VehicleInfoService.java
  17. 11 6
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/DriverInfoServiceImpl.java
  18. 75 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/GpsDataInfoServiceImpl.java
  19. 237 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/GpsServiceImpl.java
  20. 11 6
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/ShiftInfoServiceImpl.java
  21. 11 6
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/UserInfoServiceImpl.java
  22. 20 6
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/VehicleInfoServiceImpl.java
  23. 3 1
      common/src/main/java/com/jpsoft/bus/modules/common/utils/StringUtils.java
  24. 10 2
      common/src/main/resources/mapper/bus/DriverInfo.xml
  25. 112 0
      common/src/main/resources/mapper/bus/GpsDataInfo.xml
  26. 9 1
      common/src/main/resources/mapper/bus/ShiftInfo.xml
  27. 9 1
      common/src/main/resources/mapper/bus/UserInfo.xml
  28. 39 4
      common/src/main/resources/mapper/bus/VehicleInfo.xml
  29. 66 0
      gps/pom.xml
  30. 64 0
      gps/src/main/java/com/jpsoft/gps/GpsServer.java
  31. 5 0
      gps/src/main/java/com/jpsoft/gps/callback/GpsDataCallback.java
  32. 39 0
      gps/src/main/java/com/jpsoft/gps/codec/CustomDecoder.java
  33. 26 0
      gps/src/main/java/com/jpsoft/gps/handler/ActivateHandler.java
  34. 45 0
      gps/src/main/java/com/jpsoft/gps/handler/ProcessHandler.java
  35. 8 0
      gps/src/main/java/com/jpsoft/gps/manager/GPSAttrKeys.java
  36. 207 0
      gps/src/main/java/com/jpsoft/gps/utils/GPSUtil.java
  37. 1 0
      pom.xml
  38. 13 0
      web/src/main/java/com/jpsoft/bus/config/GpsServerConfig.java
  39. 4 0
      web/src/main/java/com/jpsoft/bus/config/WebMvcConfig.java
  40. 46 0
      web/src/main/java/com/jpsoft/bus/listener/GPSWebListener.java
  41. 0 1
      web/src/main/java/com/jpsoft/bus/modules/bus/controller/UserInfoController.java
  42. 123 0
      web/src/main/java/com/jpsoft/bus/modules/driver/controller/DriverApiController.java
  43. 139 0
      web/src/main/java/com/jpsoft/bus/modules/mobile/controller/PassengerApiController.java
  44. 5 0
      web/src/main/resources/application.yml

+ 6 - 0
common/pom.xml

@@ -248,6 +248,12 @@
             <artifactId>joda-time</artifactId>
             <version>2.6</version>
         </dependency>
+        <!--gps-->
+        <dependency>
+            <groupId>com.jpsoft</groupId>
+            <artifactId>gps</artifactId>
+            <version>1.0.0</version>
+        </dependency>
     </dependencies>
 
 

+ 12 - 0
common/src/main/java/com/jpsoft/bus/config/GpsParamConfig.java

@@ -0,0 +1,12 @@
+package com.jpsoft.bus.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "gps")
+@Data
+public class GpsParamConfig {
+    private String key;
+}

+ 104 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/callback/GpsDataCallbackImpl.java

@@ -0,0 +1,104 @@
+package com.jpsoft.bus.modules.bus.callback;
+
+import cn.hutool.core.lang.UUID;
+import com.jpsoft.gps.callback.GpsDataCallback;
+import com.jpsoft.gps.utils.GPSUtil;
+import com.jpsoft.bus.config.GpsParamConfig;
+import com.jpsoft.bus.modules.bus.entity.GpsDataInfo;
+import com.jpsoft.bus.modules.bus.entity.VehicleInfo;
+import com.jpsoft.bus.modules.bus.service.GpsDataInfoService;
+import com.jpsoft.bus.modules.bus.service.VehicleInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
+import org.joda.time.Minutes;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Component
+public class GpsDataCallbackImpl implements GpsDataCallback {
+    @Autowired
+    private ValueOperations<String, Object> valueOperations;
+
+    @Autowired
+    private GpsDataInfoService gpsDataInfoService;
+
+    @Autowired
+    private VehicleInfoService vehicleInfoService;
+
+    @Autowired
+    private GpsParamConfig gpsParamConfig;
+
+    @Override
+    public void receive(String deviceNo, String longitude, String latitude) {
+        log.warn("保存实时数据:{},{},{}", deviceNo, longitude, latitude);
+
+        valueOperations.set(deviceNo + "_gps", longitude + "," + latitude, 1, TimeUnit.HOURS);
+
+        if (Double.valueOf(longitude) > 0 && Double.valueOf(latitude) > 0) {
+            String histKey = deviceNo+"_history_time";
+            int intervalMinutes = 1;
+
+            Long time = (Long)valueOperations.get(histKey);
+
+            boolean allowInsert = false;
+
+            if (time==null){
+                allowInsert = true;
+            }
+            else{
+                DateTime createTime = new DateTime(time);
+
+                int minutes = Minutes.minutesBetween(createTime, DateTime.now()).getMinutes();
+
+                if (minutes>=intervalMinutes){
+                    allowInsert = true;
+                }
+            }
+
+            if(allowInsert) {
+                log.warn("保存历史数据:{}", deviceNo);
+                GpsDataInfo gpsDataInfo = new GpsDataInfo();
+                gpsDataInfo.setId(UUID.randomUUID().toString());
+                gpsDataInfo.setDeviceNo(deviceNo);
+                gpsDataInfo.setCreateTime(new Date());
+                gpsDataInfo.setLatitude(latitude);
+                gpsDataInfo.setLongitude(longitude);
+                gpsDataInfo.setDelFlag(false);
+
+                gpsDataInfoService.insert(gpsDataInfo);
+
+                valueOperations.set(histKey, (new Date()).getTime(), 1, TimeUnit.HOURS);
+            }
+
+            //更新车辆经纬度
+            VehicleInfo v = vehicleInfoService.findByGpsDeviceNo(deviceNo);
+
+            if (v != null) {
+                log.warn("更新车辆经纬度:{}->({},{})", v.getLicensePlateNumber(), longitude, latitude);
+
+                String lbsKey = "lbs_" + deviceNo;
+
+                String address = (String) valueOperations.get(lbsKey);
+
+                //10分钟进行一次逆向地址解析
+                if (StringUtils.isEmpty(address)) {
+                    address = GPSUtil.regeo(longitude, latitude, gpsParamConfig.getKey());
+                    valueOperations.set(lbsKey, address, 10, TimeUnit.MINUTES);
+                }
+
+                v.setLatestAddress(address);
+
+                v.setLongitude(longitude);//经度
+                v.setLatitude(latitude);//纬度
+
+                vehicleInfoService.updateGps(v);
+            }
+        }
+    }
+}

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/dao/DriverInfoDAO.java

@@ -15,4 +15,6 @@ public interface DriverInfoDAO {
 	int delete(String id);
 	List<DriverInfo> list();
 	List<DriverInfo> search(Map<String, Object> searchParams, List<Sort> sortList);
+
+    DriverInfo findByPhone(String phone);
 }

+ 20 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/dao/GpsDataInfoDAO.java

@@ -0,0 +1,20 @@
+package com.jpsoft.bus.modules.bus.dao;
+
+import com.jpsoft.bus.modules.bus.entity.GpsDataInfo;
+import com.jpsoft.bus.modules.common.dto.Sort;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public interface GpsDataInfoDAO {
+	int insert(GpsDataInfo entity);
+	int update(GpsDataInfo entity);
+	int exist(String id);
+	GpsDataInfo get(String id);
+	int delete(String id);
+	List<GpsDataInfo> list();
+	List<GpsDataInfo> search(Map<String, Object> searchParams, List<Sort> sortList);
+    GpsDataInfo findLast(String deviceNo);
+}

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/dao/ShiftInfoDAO.java

@@ -15,4 +15,6 @@ public interface ShiftInfoDAO {
 	int delete(String id);
 	List<ShiftInfo> list();
 	List<ShiftInfo> search(Map<String,Object> searchParams,List<Sort> sortList);
+
+    List<ShiftInfo> findByDriverIdAndStatus(Long driverId, String status);
 }

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/dao/UserInfoDAO.java

@@ -15,4 +15,6 @@ public interface UserInfoDAO {
 	int delete(String id);
 	List<UserInfo> list();
 	List<UserInfo> search(Map<String,Object> searchParams,List<Sort> sortList);
+
+    UserInfo findByPhone(String phone);
 }

+ 4 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/dao/VehicleInfoDAO.java

@@ -15,4 +15,8 @@ public interface VehicleInfoDAO {
 	int delete(String id);
 	List<VehicleInfo> list();
 	List<VehicleInfo> search(Map<String, Object> searchParams, List<Sort> sortList);
+
+    VehicleInfo findByCodeAndCarNum(String activationCode, String carNum);
+	VehicleInfo findByGpsDeviceNo(String gpsDeviceNo);
+	int updateGps(VehicleInfo entity);
 }

+ 66 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/entity/GpsDataInfo.java

@@ -0,0 +1,66 @@
+package com.jpsoft.bus.modules.bus.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 描述:bus_gps_data_info的实体类
+ */
+@Data
+@ApiModel(value = "bus_gps_data_info的实体类")
+public class GpsDataInfo {
+    /**
+     * 主键
+     */
+    @ApiModelProperty(value = "主键")
+    private String id;
+    /**
+     * 设备编号
+     */
+    @ApiModelProperty(value = "设备编号")
+    private String deviceNo;
+    /**
+     * 经度
+     */
+    @ApiModelProperty(value = "经度")
+    private String longitude;
+    /**
+     * 纬度
+     */
+    @ApiModelProperty(value = "纬度")
+    private String latitude;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 创建时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+    /**
+     * 更新时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+    /**
+     * 是否删除
+     */
+    @ApiModelProperty(value = "是否删除")
+    private Boolean delFlag;
+}

+ 28 - 25
common/src/main/java/com/jpsoft/bus/modules/bus/entity/VehicleInfo.java

@@ -4,6 +4,7 @@ import java.io.Serializable;
 import java.util.Date;
 import java.text.SimpleDateFormat;
 import java.math.BigDecimal;
+
 import org.springframework.format.annotation.DateTimeFormat;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
@@ -11,53 +12,55 @@ import io.swagger.annotations.ApiModel;
 import lombok.Data;
 
 /**
-  描述:bus_vehicle_info的实体类
+ * 描述:bus_vehicle_info的实体类
  */
 @Data
 @ApiModel(value = "bus_vehicle_info的实体类")
 public class VehicleInfo {
-        @ApiModelProperty(value = "uuid")
+    @ApiModelProperty(value = "uuid")
     private String id;
-        @ApiModelProperty(value = "运行线路id")
+    @ApiModelProperty(value = "运行线路id")
     private String routeId;
-        @ApiModelProperty(value = "车牌号")
+    @ApiModelProperty(value = "车牌号")
     private String licensePlateNumber;
-        @ApiModelProperty(value = "gps设备编号")
+    @ApiModelProperty(value = "激活码")
+    private String activationCode;
+    @ApiModelProperty(value = "gps设备编号")
     private String gpsDeviceNo;
-        @ApiModelProperty(value = "门禁设备编号")
+    @ApiModelProperty(value = "门禁设备编号")
     private String deviceNo;
-        @ApiModelProperty(value = "车辆照片")
+    @ApiModelProperty(value = "车辆照片")
     private String picture;
-        @ApiModelProperty(value = "荷载人数")
+    @ApiModelProperty(value = "荷载人数")
     private Integer loadNumber;
-        @ApiModelProperty(value = "最新的经度")
+    @ApiModelProperty(value = "最新的经度")
     private String longitude;
-        @ApiModelProperty(value = "最新的纬度")
+    @ApiModelProperty(value = "最新的纬度")
     private String latitude;
-        @ApiModelProperty(value = "状态(1-正常,2-异常)")
+    @ApiModelProperty(value = "状态(1-激活,2-未激活)")
     private String status;
-        @ApiModelProperty(value = "创建人")
+    @ApiModelProperty(value = "创建人")
     private String createBy;
-        @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone ="GMT+8")
-	    @ApiModelProperty(value = "创建时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
     private Date createTime;
-        @ApiModelProperty(value = "更新人")
+    @ApiModelProperty(value = "更新人")
     private String updateBy;
-        @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone ="GMT+8")
-	    @ApiModelProperty(value = "更新时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    @ApiModelProperty(value = "更新时间")
     private Date updateTime;
-        @ApiModelProperty(value = "是否删除")
+    @ApiModelProperty(value = "是否删除")
     private Boolean delFlag;
-        @ApiModelProperty(value = "所属单位编号")
+    @ApiModelProperty(value = "所属单位编号")
     private String companyId;
-        @ApiModelProperty(value = "是否运行(0-停车,1-行驶中)")
+    @ApiModelProperty(value = "是否运行(0-停车,1-行驶中)")
     private Boolean running;
-        @ApiModelProperty(value = "ACC状态")
+    @ApiModelProperty(value = "ACC状态")
     private Boolean acc;
-        @ApiModelProperty(value = "在线状态")
+    @ApiModelProperty(value = "在线状态")
     private Boolean online;
-        @ApiModelProperty(value = "最后所在位置")
+    @ApiModelProperty(value = "最后所在位置")
     private String latestAddress;
 }

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/DriverInfoService.java

@@ -14,4 +14,6 @@ public interface DriverInfoService {
 	int delete(String id);
 	List<DriverInfo> list();
 	Page<DriverInfo> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, boolean count, List<Sort> sortList);
+
+    DriverInfo findByPhone(String phone);
 }

+ 19 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/GpsDataInfoService.java

@@ -0,0 +1,19 @@
+package com.jpsoft.bus.modules.bus.service;
+
+import com.github.pagehelper.Page;
+import com.jpsoft.bus.modules.bus.entity.GpsDataInfo;
+import com.jpsoft.bus.modules.common.dto.Sort;
+
+import java.util.List;
+import java.util.Map;
+
+public interface GpsDataInfoService {
+	GpsDataInfo get(String id);
+	boolean exist(String id);
+	int insert(GpsDataInfo model);
+	int update(GpsDataInfo model);
+	int delete(String id);
+	List<GpsDataInfo> list();
+	Page<GpsDataInfo> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, boolean count, List<Sort> sortList);
+    GpsDataInfo findLast(String deviceNo);
+}

+ 15 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/GpsService.java

@@ -0,0 +1,15 @@
+package com.jpsoft.bus.modules.bus.service;
+
+import com.jpsoft.bus.modules.bus.entity.VehicleInfo;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface GpsService {
+    List<Map<String,String>> queryLatestVehicleGps(List<VehicleInfo> vList);
+    List<Map<String,String>> getVehicleGpsList(VehicleInfo v, Date st, Date et);
+    boolean isVehicleOnline(VehicleInfo v);
+    List<Map<String,String>> queryVehicleOnlineInfo(List<VehicleInfo> vList);
+    List<Map<String,String>> queryVehicleAccInfo(List<VehicleInfo> vList);
+}

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/ShiftInfoService.java

@@ -14,4 +14,6 @@ public interface ShiftInfoService {
 	int delete(String id);
 	List<ShiftInfo> list();
 	Page<ShiftInfo> pageSearch(Map<String, Object> searchParams,int pageNum,int pageSize,boolean count,List<Sort> sortList);
+
+    List<ShiftInfo> findByDriverIdAndStatus(Long driverId, String status);
 }

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/UserInfoService.java

@@ -14,4 +14,6 @@ public interface UserInfoService {
 	int delete(String id);
 	List<UserInfo> list();
 	Page<UserInfo> pageSearch(Map<String, Object> searchParams,int pageNum,int pageSize,boolean count,List<Sort> sortList);
+
+    UserInfo findByPhone(String phone);
 }

+ 5 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/VehicleInfoService.java

@@ -14,4 +14,9 @@ public interface VehicleInfoService {
 	int delete(String id);
 	List<VehicleInfo> list();
 	Page<VehicleInfo> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, boolean count, List<Sort> sortList);
+
+    VehicleInfo findByCodeAndCarNum(String activationCode, String carNum);
+
+	VehicleInfo findByGpsDeviceNo(String deviceNo);
+	void updateGps(VehicleInfo v);
 }

+ 11 - 6
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/DriverInfoServiceImpl.java

@@ -29,14 +29,14 @@ public class DriverInfoServiceImpl implements DriverInfoService {
 	public int insert(DriverInfo model) {
 		// TODO Auto-generated method stub
 		//model.setId(UUID.randomUUID().toString());
-		
+
 		return driverInfoDAO.insert(model);
 	}
 
 	@Override
 	public int update(DriverInfo model) {
 		// TODO Auto-generated method stub
-		return driverInfoDAO.update(model);		
+		return driverInfoDAO.update(model);
 	}
 
 	@Override
@@ -49,22 +49,27 @@ public class DriverInfoServiceImpl implements DriverInfoService {
 	public boolean exist(String id) {
 		// TODO Auto-generated method stub
 		int count = driverInfoDAO.exist(id);
-		
+
 		return count > 0 ? true : false;
 	}
-	
+
 	@Override
 	public List<DriverInfo> list() {
 		// TODO Auto-generated method stub
 		return driverInfoDAO.list();
 	}
-		
+
 	@Override
 	public Page<DriverInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
         Page<DriverInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
             driverInfoDAO.search(searchParams,sortList);
         });
-        
+
         return page;
 	}
+
+	@Override
+	public DriverInfo findByPhone(String phone) {
+		return driverInfoDAO.findByPhone(phone);
+	}
 }

+ 75 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/GpsDataInfoServiceImpl.java

@@ -0,0 +1,75 @@
+package com.jpsoft.bus.modules.bus.service.impl;
+
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import com.jpsoft.bus.modules.bus.dao.GpsDataInfoDAO;
+import com.jpsoft.bus.modules.bus.entity.GpsDataInfo;
+import com.jpsoft.bus.modules.bus.service.GpsDataInfoService;
+import com.jpsoft.bus.modules.common.dto.Sort;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@Transactional
+@Component(value="gpsDataInfoService")
+public class GpsDataInfoServiceImpl implements GpsDataInfoService {
+	@Resource(name="gpsDataInfoDAO")
+	private GpsDataInfoDAO gpsDataInfoDAO;
+
+	@Override
+	public GpsDataInfo get(String id) {
+		// TODO Auto-generated method stub
+		return gpsDataInfoDAO.get(id);
+	}
+
+	@Override
+	public int insert(GpsDataInfo model) {
+		// TODO Auto-generated method stub
+		//model.setId(UUID.randomUUID().toString());
+
+		return gpsDataInfoDAO.insert(model);
+	}
+
+	@Override
+	public int update(GpsDataInfo model) {
+		// TODO Auto-generated method stub
+		return gpsDataInfoDAO.update(model);
+	}
+
+	@Override
+	public int delete(String id) {
+		// TODO Auto-generated method stub
+		return gpsDataInfoDAO.delete(id);
+	}
+
+	@Override
+	public boolean exist(String id) {
+		// TODO Auto-generated method stub
+		int count = gpsDataInfoDAO.exist(id);
+
+		return count > 0 ? true : false;
+	}
+
+	@Override
+	public List<GpsDataInfo> list() {
+		// TODO Auto-generated method stub
+		return gpsDataInfoDAO.list();
+	}
+
+	@Override
+	public Page<GpsDataInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
+        Page<GpsDataInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
+            gpsDataInfoDAO.search(searchParams,sortList);
+        });
+
+        return page;
+	}
+
+	@Override
+	public GpsDataInfo findLast(String deviceNo) {
+		return gpsDataInfoDAO.findLast(deviceNo);
+	}
+}

+ 237 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/GpsServiceImpl.java

@@ -0,0 +1,237 @@
+package com.jpsoft.bus.modules.bus.service.impl;
+
+import com.jpsoft.bus.modules.bus.service.GpsDataInfoService;
+import com.jpsoft.gps.utils.GPSUtil;
+import com.jpsoft.bus.config.GpsParamConfig;
+import com.jpsoft.bus.modules.bus.dao.VehicleInfoDAO;
+import com.jpsoft.bus.modules.bus.entity.GpsDataInfo;
+import com.jpsoft.bus.modules.bus.entity.VehicleInfo;
+import com.jpsoft.bus.modules.bus.service.GpsService;
+import com.jpsoft.bus.modules.common.dto.Sort;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.annotations.Mapper;
+import org.joda.time.DateTime;
+import org.joda.time.Minutes;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+@Mapper
+@Component(value="gpsService")
+@Slf4j
+public class GpsServiceImpl implements GpsService {
+    @Resource(name="vehicleInfoDAO")
+    private VehicleInfoDAO vehicleInfoDAO;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private GpsParamConfig gpsParamConfig;
+
+    @Autowired
+    private ValueOperations<String,Object> valueOperations;
+
+    @Autowired
+    private GpsDataInfoService gpsDataInfoService;
+
+    /*
+     * 批量实时更新车辆定位
+     * @param vList 车辆实体列表
+     * */
+    @Override
+    public List<Map<String,String>> queryLatestVehicleGps(List<VehicleInfo> vList) {
+        // TODO Auto-generated method stub
+        List<Map<String, String>> coordinateList = new ArrayList<Map<String, String>>();
+
+        for (VehicleInfo v : vList) {
+            Map<String, String> coordinate = new HashMap<String, String>();
+
+            String gps = (String) valueOperations.get(v.getGpsDeviceNo() + "_gps");
+
+            if (StringUtils.isNotEmpty(gps)) {
+                String licenseNo = v.getLicensePlateNumber();
+
+                String[] arr = gps.split(",");
+                String longitude = arr[0];
+                String latitude = arr[1];
+
+                coordinate.put("jd", arr[0]);
+                coordinate.put("wd", arr[1]);
+
+                String address = "";
+
+                if(Double.valueOf(longitude)>0 && Double.valueOf(latitude)>0) {
+                    String key = "lbs_" + longitude + "," + latitude;
+
+                    address = (String) valueOperations.get(key);
+
+                    if (StringUtils.isEmpty(address)) {
+                        address = GPSUtil.regeo(longitude, latitude , gpsParamConfig.getKey());
+                        valueOperations.set(key, address, 1, TimeUnit.DAYS);
+                    }
+
+                    v.setLatestAddress(address);
+                }
+
+                coordinate.put("address", address);
+
+                coordinate.put("licensePlateNumber", licenseNo);//车牌号
+                coordinateList.add(coordinate);
+            }
+        }
+
+        return coordinateList;
+    }
+
+    /*
+    * 获取车辆轨迹
+    * @param v 车辆实体
+    * @param st 开始时间
+    * @param et 结束时间
+    * */
+    @Override
+    public List<Map<String,String>> getVehicleGpsList(VehicleInfo v,Date st,Date et) {
+        // TODO Auto-generated method stub
+        //开始时间不得大于结束时间,并且查询天数不得大于7天。
+        List<Map<String,String>> gpsList = new ArrayList<Map<String,String>>();
+        long day1 = st.getTime();
+        long day2 = et.getTime();
+
+        if(day1>day2){
+            log.warn("查询车辆轨迹时开始时间大于结束时间");
+            return null;
+        }
+        if(day2-day1>=7*1000*3600*24){
+            log.warn("查询车辆轨迹时天数超过7天");
+            return null;
+        }
+
+        Map<String,Object> searchParams = new HashMap<>();
+        searchParams.put("deviceNo", v.getGpsDeviceNo());
+        searchParams.put("startTime", st);
+        searchParams.put("endTime", et);
+
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("create_time","asc"));
+
+        List<GpsDataInfo> dataList = gpsDataInfoService.pageSearch(searchParams,1,1000,false,sortList);
+
+        for (GpsDataInfo data : dataList) {
+            Map<String,String> map=new HashMap<String,String>();
+
+            map.put("lat",data.getLatitude());//纬度
+            map.put("lng",data.getLongitude());//经度
+
+            gpsList.add(map);
+        }
+
+        return gpsList;
+    }
+
+    /*
+     * 判断车辆是否在线,true:在线;false:熄火
+     * @param v 车辆实体
+     * */
+    @Override
+    public boolean isVehicleOnline(VehicleInfo v){
+        //最后一次上传经纬度时间是否超过5分钟
+        GpsDataInfo gpsDataInfo = gpsDataInfoService.findLast(v.getGpsDeviceNo());
+
+        if(gpsDataInfo!=null) {
+            DateTime lastTime = new DateTime(gpsDataInfo.getCreateTime());
+
+            long minutes = Minutes.minutesBetween(lastTime, DateTime.now()).getMinutes();
+
+            return minutes < 5;
+        }
+        else{
+            return false;
+        }
+    }
+
+    @Override
+    public List<Map<String,String>> queryVehicleOnlineInfo(List<VehicleInfo> vList) {
+        // TODO Auto-generated method stub
+        //单次查询,车牌号查询
+        List<Map<String,String>> onlineList = new ArrayList<>();
+
+        for(VehicleInfo v : vList){
+            Map<String,String> olmap = new HashMap<String,String>();
+
+            boolean online = isVehicleOnline(v);
+
+            if(online){
+                olmap.put("online","1");
+            }else{
+                olmap.put("online","0");
+            }
+
+            olmap.put("licensePlateNumber",v.getLicensePlateNumber());//车牌号
+            onlineList.add(olmap);
+        }
+
+        return onlineList;
+    }
+
+    /*
+     * 查询车辆ACC状态,0表示ACC关闭1表示ACC开启。
+     * @param vList 车辆实体列表
+     * */
+    @Override
+    public List<Map<String,String>> queryVehicleAccInfo(List<VehicleInfo> vList) {
+        // TODO Auto-generated method stub
+        List<Map<String,String>> accList = new ArrayList<Map<String,String>>();
+
+        for(VehicleInfo v : vList){
+            Map<String,String> olmap = new HashMap<String,String>();
+
+            boolean online = isVehicleOnline(v);
+
+            if(online){
+                olmap.put("acc","1");
+            }else{
+                olmap.put("acc","0");
+            }
+
+            olmap.put("licensePlateNumber",v.getLicensePlateNumber());//车牌号
+            accList.add(olmap);
+        }
+
+        return accList;
+    }
+
+    public String encode(String text){
+        try {
+            text=URLEncoder.encode(text,"UTF-8");
+        }
+        catch(NumberFormatException | UnsupportedEncodingException e) {
+            System.out.println(e);
+        }
+
+        return text;
+    }
+
+    public static void main(String[] args) {
+        int s1 = -2147480189;
+
+        System.out.println(Integer.toBinaryString(s1));
+
+        int pos = 2;
+        int value = 1 << (pos-1);
+
+        System.out.println(value);
+
+        if((s1 & value)==value){
+            System.out.println("ACC开启");
+        }
+    }
+}

+ 11 - 6
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/ShiftInfoServiceImpl.java

@@ -29,14 +29,14 @@ public class ShiftInfoServiceImpl implements ShiftInfoService {
 	public int insert(ShiftInfo model) {
 		// TODO Auto-generated method stub
 		//model.setId(UUID.randomUUID().toString());
-		
+
 		return shiftInfoDAO.insert(model);
 	}
 
 	@Override
 	public int update(ShiftInfo model) {
 		// TODO Auto-generated method stub
-		return shiftInfoDAO.update(model);		
+		return shiftInfoDAO.update(model);
 	}
 
 	@Override
@@ -49,22 +49,27 @@ public class ShiftInfoServiceImpl implements ShiftInfoService {
 	public boolean exist(String id) {
 		// TODO Auto-generated method stub
 		int count = shiftInfoDAO.exist(id);
-		
+
 		return count > 0 ? true : false;
 	}
-	
+
 	@Override
 	public List<ShiftInfo> list() {
 		// TODO Auto-generated method stub
 		return shiftInfoDAO.list();
 	}
-		
+
 	@Override
 	public Page<ShiftInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
         Page<ShiftInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
             shiftInfoDAO.search(searchParams,sortList);
         });
-        
+
         return page;
 	}
+
+	@Override
+	public List<ShiftInfo> findByDriverIdAndStatus(Long driverId, String status) {
+		return shiftInfoDAO.findByDriverIdAndStatus(driverId,status);
+	}
 }

+ 11 - 6
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/UserInfoServiceImpl.java

@@ -29,14 +29,14 @@ public class UserInfoServiceImpl implements UserInfoService {
 	public int insert(UserInfo model) {
 		// TODO Auto-generated method stub
 		//model.setId(UUID.randomUUID().toString());
-		
+
 		return userInfoDAO.insert(model);
 	}
 
 	@Override
 	public int update(UserInfo model) {
 		// TODO Auto-generated method stub
-		return userInfoDAO.update(model);		
+		return userInfoDAO.update(model);
 	}
 
 	@Override
@@ -49,22 +49,27 @@ public class UserInfoServiceImpl implements UserInfoService {
 	public boolean exist(String id) {
 		// TODO Auto-generated method stub
 		int count = userInfoDAO.exist(id);
-		
+
 		return count > 0 ? true : false;
 	}
-	
+
 	@Override
 	public List<UserInfo> list() {
 		// TODO Auto-generated method stub
 		return userInfoDAO.list();
 	}
-		
+
 	@Override
 	public Page<UserInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
         Page<UserInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
             userInfoDAO.search(searchParams,sortList);
         });
-        
+
         return page;
 	}
+
+	@Override
+	public UserInfo findByPhone(String phone) {
+		return userInfoDAO.findByPhone(phone);
+	}
 }

+ 20 - 6
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/VehicleInfoServiceImpl.java

@@ -29,14 +29,14 @@ public class VehicleInfoServiceImpl implements VehicleInfoService {
 	public int insert(VehicleInfo model) {
 		// TODO Auto-generated method stub
 		//model.setId(UUID.randomUUID().toString());
-		
+
 		return vehicleInfoDAO.insert(model);
 	}
 
 	@Override
 	public int update(VehicleInfo model) {
 		// TODO Auto-generated method stub
-		return vehicleInfoDAO.update(model);		
+		return vehicleInfoDAO.update(model);
 	}
 
 	@Override
@@ -49,22 +49,36 @@ public class VehicleInfoServiceImpl implements VehicleInfoService {
 	public boolean exist(String id) {
 		// TODO Auto-generated method stub
 		int count = vehicleInfoDAO.exist(id);
-		
+
 		return count > 0 ? true : false;
 	}
-	
+
 	@Override
 	public List<VehicleInfo> list() {
 		// TODO Auto-generated method stub
 		return vehicleInfoDAO.list();
 	}
-		
+
 	@Override
 	public Page<VehicleInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
         Page<VehicleInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
             vehicleInfoDAO.search(searchParams,sortList);
         });
-        
+
         return page;
 	}
+
+	@Override
+	public VehicleInfo findByCodeAndCarNum(String activationCode, String carNum) {
+		return vehicleInfoDAO.findByCodeAndCarNum(activationCode,carNum);
+	}
+
+	@Override
+	public VehicleInfo findByGpsDeviceNo(String gpsDeviceNo) {
+		return vehicleInfoDAO.findByGpsDeviceNo(gpsDeviceNo);
+	}
+	@Override
+	public void updateGps(VehicleInfo v) {
+		vehicleInfoDAO.updateGps(v);
+	}
 }

+ 3 - 1
common/src/main/java/com/jpsoft/bus/modules/common/utils/StringUtils.java

@@ -56,6 +56,7 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils {
 		return key;
 	}
 
+
 	/**
 	 * 提现单号。
 	 * @return {String}
@@ -203,6 +204,7 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils {
 
 
 	public static void main(String[] args) {
-		System.out.println(random(32, RandomType.ALL));
+
+		System.out.println(random(8,RandomType.ALL));
 	}
 }

+ 10 - 2
common/src/main/resources/mapper/bus/DriverInfo.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!-- namespace必须指向DAO接口 -->
 <mapper namespace="com.jpsoft.bus.modules.bus.dao.DriverInfoDAO">
@@ -85,7 +85,7 @@
 	where id_=#{id}
 	</update>
 	<select id="get" parameterType="string" resultMap="DriverInfoMap">
-		select 
+		select
 id_,company_id,name_,id_card,phone_,face_image,remark_,create_by,create_time,update_by,update_time,del_flag		from bus_driver_info where id_=#{0}
 	</select>
 	<select id="exist" parameterType="string" resultType="int">
@@ -117,4 +117,12 @@ id_,company_id,name_,id_card,phone_,face_image,remark_,create_by,create_time,upd
 	        ${sort.name} ${sort.order}
 	 	</foreach>
 	</select>
+	<select id="findByPhone" resultMap="DriverInfoMap">
+		<![CDATA[
+		select * from bus_driver_info
+		where del_flag = 0
+		and phone_ = #{phone}
+		limit 1
+		]]>
+	</select>
 </mapper>

+ 112 - 0
common/src/main/resources/mapper/bus/GpsDataInfo.xml

@@ -0,0 +1,112 @@
+<?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">
+<!-- namespace必须指向DAO接口 -->
+<mapper namespace="com.jpsoft.bus.modules.bus.dao.GpsDataInfoDAO">
+    <resultMap id="GpsDataInfoMap" type="com.jpsoft.bus.modules.bus.entity.GpsDataInfo">
+        <id property="id" column="id_"/>
+        <result property="deviceNo" column="device_no"/>
+        <result property="longitude" column="longitude"/>
+        <result property="latitude" column="latitude"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="delFlag" column="del_flag"/>
+    </resultMap>
+    <insert id="insert" parameterType="com.jpsoft.bus.modules.bus.entity.GpsDataInfo">
+        <!--
+        <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
+            select sys_guid() from dual
+        </selectKey>
+        -->
+        <![CDATA[
+		insert into bus_gps_data_info
+	    (id_,device_no,longitude,latitude,create_by,create_time,update_by,update_time,del_flag)
+		values
+		(
+            #{id,jdbcType=VARCHAR}
+            ,#{deviceNo,jdbcType=VARCHAR}
+            ,#{longitude,jdbcType=VARCHAR}
+            ,#{latitude,jdbcType=VARCHAR}
+            ,#{createBy,jdbcType=VARCHAR}
+            ,#{createTime,jdbcType= TIMESTAMP }
+            ,#{updateBy,jdbcType=VARCHAR}
+            ,#{updateTime,jdbcType= TIMESTAMP }
+            ,#{delFlag,jdbcType= NUMERIC }
+		)
+	]]>
+    </insert>
+    <delete id="delete" parameterType="string">
+        delete from bus_gps_data_info where id_=#{id,jdbcType=VARCHAR}
+    </delete>
+    <update id="update" parameterType="com.jpsoft.bus.modules.bus.entity.GpsDataInfo">
+        update bus_gps_data_info
+        <set>
+            <if test="deviceNo!=null">
+                device_no=#{deviceNo,jdbcType=VARCHAR},
+            </if>
+            <if test="longitude!=null">
+                longitude=#{longitude,jdbcType=VARCHAR},
+            </if>
+            <if test="latitude!=null">
+                latitude=#{latitude,jdbcType=VARCHAR},
+            </if>
+            <if test="createBy!=null">
+                create_by=#{createBy,jdbcType=VARCHAR},
+            </if>
+            <if test="createTime!=null">
+                create_time=#{createTime,jdbcType= TIMESTAMP },
+            </if>
+            <if test="updateBy!=null">
+                update_by=#{updateBy,jdbcType=VARCHAR},
+            </if>
+            <if test="updateTime!=null">
+                update_time=#{updateTime,jdbcType= TIMESTAMP },
+            </if>
+            <if test="delFlag!=null">
+                del_flag=#{delFlag,jdbcType= NUMERIC },
+            </if>
+        </set>
+        where id_=#{id}
+    </update>
+    <select id="get" parameterType="string" resultMap="GpsDataInfoMap">
+        select id_,device_no,longitude,latitude,create_by,create_time,update_by,update_time,del_flag
+        from bus_gps_data_info where id_=#{0}
+    </select>
+    <select id="exist" parameterType="string" resultType="int">
+        select count(*) from bus_gps_data_info where id_=#{0}
+    </select>
+    <select id="list" resultMap="GpsDataInfoMap">
+        select * from bus_gps_data_info
+    </select>
+    <select id="search" parameterType="hashmap" resultMap="GpsDataInfoMap">
+        <![CDATA[
+			select * from bus_gps_data_info
+		]]>
+        <where>
+            del_flag=0
+            <if test="searchParams.deviceNo != null">
+                and device_no = #{searchParams.deviceNo}
+            </if>
+            <if test="searchParams.startTime != null">
+                <![CDATA[
+					and create_time >= #{searchParams.startTime}
+				]]>
+            </if>
+            <if test="searchParams.endTime != null">
+                <![CDATA[
+					and create_time <= #{searchParams.endTime}
+				]]>
+            </if>
+        </where>
+        <foreach item="sort" collection="sortList" open="order by" separator=",">
+            ${sort.name} ${sort.order}
+        </foreach>
+    </select>
+    <select id="findLast" resultMap="GpsDataInfoMap">
+        select * from bus_gps_data_info
+        where device_no=#{deviceNo}
+        order by create_time desc limit 1
+    </select>
+</mapper>

+ 9 - 1
common/src/main/resources/mapper/bus/ShiftInfo.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!-- namespace必须指向DAO接口 -->
 <mapper namespace="com.jpsoft.bus.modules.bus.dao.ShiftInfoDAO">
@@ -118,4 +118,12 @@
 	        ${sort.name} ${sort.order}
 	 	</foreach>
 	</select>
+	<select id="findByDriverIdAndStatus" resultMap="ShiftInfoMap">
+		<![CDATA[
+		select * from bus_shift_info
+		where del_flag = 0
+		and driver_id = #{driverId}
+		and status_ = #{status}
+		]]>
+	</select>
 </mapper>

+ 9 - 1
common/src/main/resources/mapper/bus/UserInfo.xml

@@ -29,7 +29,7 @@
 	    (name_,phone_,password_,face_image,accept_message,create_by,create_time,update_by,update_time,del_flag,remark_,open_id)
 		values
 		(
-,#{name,jdbcType=VARCHAR}
+#{name,jdbcType=VARCHAR}
 ,#{phone,jdbcType=VARCHAR}
 ,#{password,jdbcType=VARCHAR}
 ,#{faceImage,jdbcType=VARCHAR}
@@ -112,4 +112,12 @@
 	        ${sort.name} ${sort.order}
 	 	</foreach>
 	</select>
+
+	<select id="findByPhone" resultMap="UserInfoMap">
+		<![CDATA[
+		select * from bus_user_info
+		where del_flag = 0
+		and phone_ = #{phone}
+		]]>
+	</select>
 </mapper>

+ 39 - 4
common/src/main/resources/mapper/bus/VehicleInfo.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!-- namespace必须指向DAO接口 -->
 <mapper namespace="com.jpsoft.bus.modules.bus.dao.VehicleInfoDAO">
@@ -7,6 +7,7 @@
 		<id property="id" column="id_" />
 			<result property="routeId" column="route_id" />
 			<result property="licensePlateNumber" column="license_plate_number" />
+			<result property="activationCode" column="activation_code"/>
 			<result property="gpsDeviceNo" column="gps_device_no" />
 			<result property="deviceNo" column="device_no" />
 			<result property="picture" column="picture_" />
@@ -33,12 +34,13 @@
 	-->
 	<![CDATA[
 		insert into bus_vehicle_info
-	    (id_,route_id,license_plate_number,gps_device_no,device_no,picture_,load_number,longitude_,latitude_,status_,create_by,create_time,update_by,update_time,del_flag,company_id,running_,acc_,online_,latest_address)
+	    (id_,route_id,license_plate_number,activation_code,gps_device_no,device_no,picture_,load_number,longitude_,latitude_,status_,create_by,create_time,update_by,update_time,del_flag,company_id,running_,acc_,online_,latest_address)
 		values
 		(
 #{id,jdbcType=VARCHAR}
 ,#{routeId,jdbcType=VARCHAR}
 ,#{licensePlateNumber,jdbcType=VARCHAR}
+,#{activationCode,jdbcType=VARCHAR}
 ,#{gpsDeviceNo,jdbcType=VARCHAR}
 ,#{deviceNo,jdbcType=VARCHAR}
 ,#{picture,jdbcType=VARCHAR}
@@ -71,6 +73,9 @@
 				<if test="licensePlateNumber!=null">
 		license_plate_number=#{licensePlateNumber,jdbcType=VARCHAR},
 		</if>
+			<if test="activationCode!=null">
+				activation_code=#{activationCode,jdbcType=VARCHAR},
+			</if>
 				<if test="gpsDeviceNo!=null">
 		gps_device_no=#{gpsDeviceNo,jdbcType=VARCHAR},
 		</if>
@@ -126,8 +131,7 @@
 	where id_=#{id}
 	</update>
 	<select id="get" parameterType="string" resultMap="VehicleInfoMap">
-		select 
-id_,route_id,license_plate_number,gps_device_no,device_no,picture_,load_number,longitude_,latitude_,status_,create_by,create_time,update_by,update_time,del_flag,company_id,running_,acc_,online_,latest_address		from bus_vehicle_info where id_=#{0}
+		select * from bus_vehicle_info where id_=#{0}
 	</select>
 	<select id="exist" parameterType="string" resultType="int">
 		select count(*) from bus_vehicle_info where id_=#{0}
@@ -148,4 +152,35 @@ id_,route_id,license_plate_number,gps_device_no,device_no,picture_,load_number,l
 	        ${sort.name} ${sort.order}
 	 	</foreach>
 	</select>
+
+	<select id="findByCodeAndCarNum" resultMap="VehicleInfoMap">
+		<![CDATA[
+		select * from bus_vehicle_info
+		where del_flag = 0
+		and license_plate_number = #{carNum}
+		and activation_code = #{activationCode}
+		]]>
+	</select>
+
+	<select id="findByGpsDeviceNo" resultMap="VehicleInfoMap">
+		select * from bus_vehicle_info where del_flag=0 and gps_device_no=#{0}
+		order by create_time desc limit 1
+	</select>
+
+	<update id="updateGps" parameterType="com.jpsoft.bus.modules.bus.entity.VehicleInfo">
+		update bus_vehicle_info
+		<set>
+			update_time=now(),
+			<if test="longitude!=null">
+				longitude_=#{longitude,jdbcType=VARCHAR},
+			</if>
+			<if test="latitude!=null">
+				latitude_=#{latitude,jdbcType=VARCHAR},
+			</if>
+			<if test="latestAddress!=null">
+				latest_address=#{latestAddress,jdbcType=VARCHAR},
+			</if>
+		</set>
+		where id_=#{id}
+	</update>
 </mapper>

+ 66 - 0
gps/pom.xml

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>parent</artifactId>
+        <groupId>com.jpsoft.bus</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>gps</artifactId>
+    <version>1.0.0</version>
+
+    <properties>
+        <netty-all.version>4.1.6.Final</netty-all.version>
+        <fastjson.version>1.2.29</fastjson.version>
+        <lombok.version>1.16.12</lombok.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.10</version>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+            <version>${netty-all.version}</version>
+        </dependency>
+        <!--json start-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.30</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.0.6</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 64 - 0
gps/src/main/java/com/jpsoft/gps/GpsServer.java

@@ -0,0 +1,64 @@
+package com.jpsoft.gps;
+
+import com.jpsoft.gps.callback.GpsDataCallback;
+import com.jpsoft.gps.codec.CustomDecoder;
+import com.jpsoft.gps.handler.ActivateHandler;
+import com.jpsoft.gps.handler.ProcessHandler;
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.timeout.ReadTimeoutHandler;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class GpsServer {
+    private Channel serverChannel;
+    private final int READ_TIME_OUT = 300;
+
+    public void start(int port, GpsDataCallback callback){
+        /**
+         * NioEventLoop是非守护线程。
+         * NioEventLoop运行之后,不会主动退出。
+         * 只有调用shutdown系列方法,NioEventLoop才会退出。
+         * Netty是一个异步非阻塞框架
+         **/
+        NioEventLoopGroup bossGroup = new NioEventLoopGroup();
+        NioEventLoopGroup workerGroup = new NioEventLoopGroup();
+
+        ServerBootstrap b = new ServerBootstrap();
+
+        b.group(bossGroup,workerGroup)
+                .channel(NioServerSocketChannel.class)
+                .childHandler(new ChannelInitializer(){
+                    @Override
+                    protected void initChannel(Channel channel) throws Exception {
+                        channel.pipeline().addLast(new ReadTimeoutHandler(READ_TIME_OUT));
+
+                        channel.pipeline().addLast(new ActivateHandler());
+                        channel.pipeline().addLast(new CustomDecoder());
+                        channel.pipeline().addLast(new ProcessHandler(callback));
+                    }
+                });
+
+        ChannelFuture channelFuture = b.bind("0.0.0.0",port);
+        serverChannel = channelFuture.channel();
+
+        channelFuture.addListener((future)-> {
+            if(future.isSuccess()){
+                log.warn(String.format("gps server 已监听%d端口",port));
+            }
+            else{
+                log.error(String.format("gps server 已监听%d端口",port));
+            }
+        });
+    }
+
+    public void stop() {
+        if (serverChannel!=null && serverChannel.isOpen()){
+            serverChannel.close();
+        }
+    }
+}

+ 5 - 0
gps/src/main/java/com/jpsoft/gps/callback/GpsDataCallback.java

@@ -0,0 +1,5 @@
+package com.jpsoft.gps.callback;
+
+public interface GpsDataCallback {
+    void receive(String deviceNo,String longitude,String latitude);
+}

+ 39 - 0
gps/src/main/java/com/jpsoft/gps/codec/CustomDecoder.java

@@ -0,0 +1,39 @@
+package com.jpsoft.gps.codec;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.ByteToMessageDecoder;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.charset.Charset;
+import java.util.List;
+
+@Slf4j
+public class CustomDecoder extends ByteToMessageDecoder {
+    @Override
+    protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> out) throws Exception {
+        String str = byteBuf.toString(Charset.forName("utf-8"));
+        log.warn("收到:" + str);
+
+        String prefix = "#";
+        String suffix = "\n";
+
+        int start = str.indexOf(prefix);
+        int end = str.indexOf(suffix);
+
+        if (start>=0 && end>start) {
+            String data = str.substring(start+1, end);
+
+            log.warn("解析数据:" + data);
+
+            out.add(data);
+
+            //清除已有数据
+            byteBuf.skipBytes(byteBuf.readableBytes());
+        }
+        else if (byteBuf.readableBytes()>1024){
+            //清除无效数据
+            byteBuf.skipBytes(byteBuf.readableBytes());
+        }
+    }
+}

+ 26 - 0
gps/src/main/java/com/jpsoft/gps/handler/ActivateHandler.java

@@ -0,0 +1,26 @@
+package com.jpsoft.gps.handler;
+
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@ChannelHandler.Sharable
+public class ActivateHandler extends ChannelInboundHandlerAdapter {
+    @Override
+    public void channelActive(ChannelHandlerContext ctx) throws Exception {
+        String remoteAddress = ctx.channel().remoteAddress().toString();
+
+        log.warn("远程主机:" + remoteAddress + "已连接!");
+    }
+
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+        super.channelInactive(ctx);
+
+        String remoteAddress = ctx.channel().remoteAddress().toString();
+
+        log.warn("远程主机:" + remoteAddress + "已断开连接!");
+    }
+}

+ 45 - 0
gps/src/main/java/com/jpsoft/gps/handler/ProcessHandler.java

@@ -0,0 +1,45 @@
+package com.jpsoft.gps.handler;
+
+import com.jpsoft.gps.callback.GpsDataCallback;
+import com.jpsoft.gps.utils.GPSUtil;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import lombok.extern.slf4j.Slf4j;
+import java.text.DecimalFormat;
+
+@Slf4j
+public class ProcessHandler extends SimpleChannelInboundHandler<String> {
+    private GpsDataCallback callback;
+
+    public ProcessHandler(GpsDataCallback callback){
+        this.callback = callback;
+    }
+
+    @Override
+    public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
+        //#20201021+30.309052;112.270986+\n
+
+        String[] arr = msg.split("\\+");
+
+        if (arr.length>=2) {
+            String deviceNo = arr[0];
+            String[] subArr = arr[1].split(";");
+
+            double wd = Double.valueOf(subArr[0]);
+            double jd = Double.valueOf(subArr[1]);
+
+            DecimalFormat df = new DecimalFormat("#.######");
+
+            if (wd > 0 && jd > 0) {
+                //高德地图坐标系 gcj02
+                double[] gcj = GPSUtil.gps84_To_Gcj02(wd, jd);//坐标转换
+
+                System.out.println(deviceNo + "," + df.format(gcj[1]) + "," + df.format(gcj[0]));
+
+                if (this.callback != null) {
+                    this.callback.receive(deviceNo, df.format(gcj[1]), df.format(gcj[0]));
+                }
+            }
+        }
+    }
+}

+ 8 - 0
gps/src/main/java/com/jpsoft/gps/manager/GPSAttrKeys.java

@@ -0,0 +1,8 @@
+package com.jpsoft.gps.manager;
+
+import io.netty.util.AttributeKey;
+
+public class GPSAttrKeys {
+    //linux中name不能重复
+    public static final AttributeKey<String> DEVICE_NO = AttributeKey.newInstance("gpsDeviceNo");
+}

+ 207 - 0
gps/src/main/java/com/jpsoft/gps/utils/GPSUtil.java

@@ -0,0 +1,207 @@
+package com.jpsoft.gps.utils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.text.DecimalFormat;
+
+public class GPSUtil {
+    public static double pi = 3.1415926535897932384626;  
+    public static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;  
+    public static double a = 6378245.0;  
+    public static double ee = 0.00669342162296594323;  
+
+    public static double transformLat(double x, double y) {  
+        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y  
+                + 0.2 * Math.sqrt(Math.abs(x));  
+        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;  
+        ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;  
+        ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;  
+        return ret;  
+    }  
+
+    public static double transformLon(double x, double y) {  
+        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1  
+                * Math.sqrt(Math.abs(x));  
+        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;  
+        ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;  
+        ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0  
+                * pi)) * 2.0 / 3.0;  
+        return ret;  
+    }  
+    public static double[] transform(double lat, double lon) {  
+        if (outOfChina(lat, lon)) {  
+            return new double[]{lat,lon};  
+        }  
+        double dLat = transformLat(lon - 105.0, lat - 35.0);  
+        double dLon = transformLon(lon - 105.0, lat - 35.0);  
+        double radLat = lat / 180.0 * pi;  
+        double magic = Math.sin(radLat);  
+        magic = 1 - ee * magic * magic;  
+        double sqrtMagic = Math.sqrt(magic);  
+        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);  
+        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);  
+        double mgLat = lat + dLat;  
+        double mgLon = lon + dLon;  
+        return new double[]{mgLat,mgLon};  
+    }  
+    public static boolean outOfChina(double lat, double lon) {  
+        if (lon < 72.004 || lon > 137.8347) {
+            return true;
+        }
+
+        if (lat < 0.8293 || lat > 55.8271) {
+            return true;
+        }
+
+        return false;  
+    }  
+    /** 
+     * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System 
+     * 
+     * @param lat 
+     * @param lon 
+     * @return 
+     */  
+    public static double[] gps84_To_Gcj02(double lat, double lon) {  
+        if (outOfChina(lat, lon)) {  
+            return new double[]{lat,lon};  
+        }  
+        double dLat = transformLat(lon - 105.0, lat - 35.0);  
+        double dLon = transformLon(lon - 105.0, lat - 35.0);  
+        double radLat = lat / 180.0 * pi;  
+        double magic = Math.sin(radLat);  
+        magic = 1 - ee * magic * magic;  
+        double sqrtMagic = Math.sqrt(magic);  
+        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);  
+        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);  
+        double mgLat = lat + dLat;  
+        double mgLon = lon + dLon;  
+        return new double[]{mgLat, mgLon};  
+    }  
+
+    /** 
+     * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return 
+     * */  
+    public static double[] gcj02_To_Gps84(double lat, double lon) {  
+        double[] gps = transform(lat, lon);  
+        double lontitude = lon * 2 - gps[1];  
+        double latitude = lat * 2 - gps[0];  
+        return new double[]{latitude, lontitude};  
+    }  
+    /** 
+     * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 
+     * 
+     * @param lat 
+     * @param lon 
+     */  
+    public static double[] gcj02_To_Bd09(double lat, double lon) {  
+        double x = lon, y = lat;  
+        double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);  
+        double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);  
+        double tempLon = z * Math.cos(theta) + 0.0065;  
+        double tempLat = z * Math.sin(theta) + 0.006;  
+        double[] gps = {tempLat,tempLon};  
+        return gps;  
+    }  
+
+    /** 
+     * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param 
+     * bd_lat * @param bd_lon * @return 
+     */  
+    public static double[] bd09_To_Gcj02(double lat, double lon) {  
+        double x = lon - 0.0065, y = lat - 0.006;  
+        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);  
+        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);  
+        double tempLon = z * Math.cos(theta);  
+        double tempLat = z * Math.sin(theta);  
+        double[] gps = {tempLat,tempLon};  
+        return gps;  
+    }  
+
+    /**将gps84转为bd09 
+     * @param lat 
+     * @param lon 
+     * @return 
+     */  
+    public static double[] gps84_To_bd09(double lat,double lon){  
+        double[] gcj02 = gps84_To_Gcj02(lat,lon);  
+        double[] bd09 = gcj02_To_Bd09(gcj02[0],gcj02[1]);  
+        return bd09;  
+    }  
+    public static double[] bd09_To_gps84(double lat,double lon){  
+        double[] gcj02 = bd09_To_Gcj02(lat, lon);  
+        double[] gps84 = gcj02_To_Gps84(gcj02[0], gcj02[1]);  
+        //保留小数点后六位  
+        gps84[0] = retain6(gps84[0]);  
+        gps84[1] = retain6(gps84[1]);  
+        return gps84;  
+    }  
+
+    /**保留小数点后六位 
+     * @param num 
+     * @return 
+     */  
+    private static double retain6(double num){  
+        String result = String .format("%.6f", num);  
+        return Double.valueOf(result);  
+    }
+
+    public static String regeo(String longitude,String latitude,String key) {
+        StringBuffer json = new StringBuffer();
+
+        //09abadb2e35fc61fd84042c518e9aebf
+        try {
+            URL u = new URL(String.format("https://restapi.amap.com/v3/geocode/regeo?location=%s,%s&key=%s",
+                    longitude,latitude,key));
+
+            URLConnection yc = u.openConnection();
+            //读取返回的数据
+            BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(),"UTF-8"));
+            String inputline = null;
+
+            while((inputline=in.readLine())!=null){
+                json.append(inputline);
+            }
+
+            in.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        String jsonStr = json.toString();
+
+        System.out.println(jsonStr);
+
+        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
+
+        JSONObject regeocode = jsonObject.getJSONObject("regeocode");
+
+        //判断输入的位置点是否存在
+        if(regeocode!=null) {
+            return regeocode.getString("formatted_address");
+        }
+        else {
+            return null;
+        }
+    }
+
+    public static void main(String[] args) {
+        double[] points = GPSUtil.bd09_To_Gcj02(30.308866F,112.270896F);
+
+        DecimalFormat df = new DecimalFormat("#.######");
+
+        String longitude = df.format(points[1]);
+        String latitude = df.format(points[0]);
+
+        System.out.println(longitude + "," + latitude);
+
+        String address = GPSUtil.regeo(longitude,latitude,"a71a4fa458ed085246ea75ebe096bbea");
+
+        System.out.println(address);
+    }
+}

+ 1 - 0
pom.xml

@@ -6,6 +6,7 @@
     <modules>
         <module>common</module>
         <module>web</module>
+        <module>gps</module>
     </modules>
     <parent>
         <groupId>org.springframework.boot</groupId>

+ 13 - 0
web/src/main/java/com/jpsoft/bus/config/GpsServerConfig.java

@@ -0,0 +1,13 @@
+package com.jpsoft.bus.config;
+
+import com.jpsoft.gps.GpsServer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class GpsServerConfig {
+    @Bean
+    public GpsServer gpsServer(){
+        return new GpsServer();
+    }
+}

+ 4 - 0
web/src/main/java/com/jpsoft/bus/config/WebMvcConfig.java

@@ -53,6 +53,10 @@ public class WebMvcConfig implements WebMvcConfigurer {
 						"/doc.html",
                         "/v2/**",
                         "/mobileApi/**")
+				.excludePathPatterns("/mobile/passengerApi/getVerifyCode")
+				.excludePathPatterns("/mobile/passengerApi/validateCode")
+				.excludePathPatterns("/mobile/driverApi/carActivation")
+				.excludePathPatterns("/mobile/driverApi/findByPhone")
 				;
 	}
 }

+ 46 - 0
web/src/main/java/com/jpsoft/bus/listener/GPSWebListener.java

@@ -0,0 +1,46 @@
+package com.jpsoft.bus.listener;
+
+import com.jpsoft.gps.GpsServer;
+import com.jpsoft.gps.callback.GpsDataCallback;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+
+@WebListener
+@Component
+@Profile({"dev","test","production"})
+public class GPSWebListener implements ServletContextListener {
+    @Autowired
+    private GpsServer gpsServer;
+
+    @Value("${gps.port}")
+    private Integer port;
+
+    @Autowired
+    private GpsDataCallback gpsDataCallback;
+
+    @Override
+    public void contextDestroyed(ServletContextEvent arg0) {
+        // TODO Auto-generated method stub
+        System.out.println("gps应用销毁");
+
+        if (gpsServer!=null){
+            gpsServer.stop();
+        }
+    }
+
+    @Override
+    public void contextInitialized(ServletContextEvent arg0) {
+        // TODO Auto-generated method stub
+        System.out.println("gps应用初始化");
+
+        if (gpsServer!=null){
+            gpsServer.start(port,gpsDataCallback);
+        }
+    }
+}

+ 0 - 1
web/src/main/java/com/jpsoft/bus/modules/bus/controller/UserInfoController.java

@@ -65,7 +65,6 @@ public class UserInfoController {
         }
         catch(Exception ex){
             logger.error(ex.getMessage(),ex);
-
             msgResult.setResult(false);
             msgResult.setMessage(ex.getMessage());
         }

+ 123 - 0
web/src/main/java/com/jpsoft/bus/modules/driver/controller/DriverApiController.java

@@ -0,0 +1,123 @@
+package com.jpsoft.bus.modules.driver.controller;
+
+import com.jpsoft.bus.modules.bus.entity.DriverInfo;
+import com.jpsoft.bus.modules.bus.entity.ShiftInfo;
+import com.jpsoft.bus.modules.bus.entity.VehicleInfo;
+import com.jpsoft.bus.modules.bus.service.DriverInfoService;
+import com.jpsoft.bus.modules.bus.service.ShiftInfoService;
+import com.jpsoft.bus.modules.bus.service.VehicleInfoService;
+import com.jpsoft.bus.modules.common.dto.MessageResult;
+import com.jpsoft.bus.modules.common.utils.JwtUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.bouncycastle.crypto.signers.ECDSASigner;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2021-4-2 14:45
+ */
+@RestController
+@RequestMapping("/mobile/driverApi")
+@Api(value = "driverApi")
+@Slf4j
+public class DriverApiController {
+
+    @Value("${jwt.secret}")
+    private String jwtSecret;
+
+    @Autowired
+    private ShiftInfoService shiftInfoService;
+
+    @Autowired
+    private DriverInfoService driverInfoService;
+
+    @Autowired
+    private VehicleInfoService vehicleInfoService;
+
+    @PostMapping("carActivation")
+    @ApiOperation(value = "司机端激活")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "activationCode", value = "激活码", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "carNum", value = "车牌号", required = true, paramType = "form")
+    })
+    public MessageResult<Map> carActivation(String activationCode,String carNum){
+
+        MessageResult<Map> messageResult = new MessageResult<>();
+        try{
+            VehicleInfo vehicleInfo = vehicleInfoService.findByCodeAndCarNum(activationCode,carNum);
+            if (vehicleInfo == null){
+                throw new Exception("车牌号或激活码错误");
+            }
+            if ("1".equals(vehicleInfo.getStatus())){
+                throw new Exception("此车辆已被激活");
+            }
+            vehicleInfo.setStatus("1");
+            vehicleInfoService.update(vehicleInfo);
+
+            String token = JwtUtil.createToken(jwtSecret, vehicleInfo.getId(), DateTime.now().plusHours(6).toDate());
+
+            Map<String,Object> map = new HashMap<>();
+            map.put("token",token);
+            messageResult.setResult(true);
+            messageResult.setCode(200);
+            messageResult.setData(map);
+
+        }catch (Exception ex){
+            log.error(ex.getMessage(),ex);
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+
+    }
+
+    @PostMapping("findByPhone")
+    @ApiOperation(value = "手机号查询司机信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "phone", value = "手机号", required = true, paramType = "query")
+    })
+    public MessageResult<DriverInfo> findByPhone(String phone){
+
+        MessageResult<DriverInfo> messageResult = new MessageResult<>();
+        try{
+
+            DriverInfo driverInfo = driverInfoService.findByPhone(phone);
+
+
+            if (driverInfo == null){
+                throw new Exception("司机不存在");
+            }
+            List<ShiftInfo> shiftInfo = shiftInfoService.findByDriverIdAndStatus(driverInfo.getId(),"1");
+            if (shiftInfo.size()>0){
+                throw new Exception("此司机有正在运行的班次,请核对后输入");
+            }
+            messageResult.setResult(true);
+            messageResult.setCode(200);
+            messageResult.setData(driverInfo);
+
+        }catch (Exception ex){
+            log.error(ex.getMessage(),ex);
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+
+    }
+
+}

+ 139 - 0
web/src/main/java/com/jpsoft/bus/modules/mobile/controller/PassengerApiController.java

@@ -1,16 +1,33 @@
 package com.jpsoft.bus.modules.mobile.controller;
 
+import cn.hutool.crypto.symmetric.DES;
+import com.alibaba.fastjson.JSONObject;
+import com.jpsoft.bus.modules.bus.entity.UserInfo;
+import com.jpsoft.bus.modules.bus.service.UserInfoService;
 import com.jpsoft.bus.modules.common.dto.MessageResult;
+import com.jpsoft.bus.modules.common.utils.DES3;
+import com.jpsoft.bus.modules.common.utils.JwtUtil;
+import com.jpsoft.bus.modules.common.utils.SMSUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestAttribute;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import sun.security.krb5.internal.crypto.Des3;
+
+import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author 墨鱼_mo
@@ -22,6 +39,15 @@ import java.util.Map;
 @Slf4j
 public class PassengerApiController {
 
+    @Value("${jwt.secret}")
+    private String jwtSecret;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    @Autowired
+    private UserInfoService userInfoService;
+
 
     @PostMapping
     @ApiOperation(value = "通过车牌号查询详情")
@@ -44,4 +70,117 @@ public class PassengerApiController {
         return messageResult;
 
     }
+
+
+    @PostMapping("getVerifyCode")
+    @ApiOperation(value = "获取短信验证码(公开接口)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "phone", value = "电话", required = true, paramType = "form")
+    })
+    public MessageResult<String> getVerifyCode(String phone) {
+        MessageResult<String> messageResult = new MessageResult<>();
+
+        try {
+
+            String key = "SMS_" + phone;
+
+            String verifyCode = (String) redisTemplate.opsForValue().get(key);
+
+            if (StringUtils.isEmpty(verifyCode)) {
+                verifyCode = SMSUtil.generateNumberString(6);
+                JSONObject verifyCodeJSON = new JSONObject();
+                verifyCodeJSON.put("code", verifyCode);
+
+                messageResult = SMSUtil.send(phone, "SMS_49390047", verifyCodeJSON.toString());
+
+                //设置当前用户的验证码,5分钟内有效
+                redisTemplate.opsForValue().set(key, verifyCode, 5, TimeUnit.MINUTES);
+            }
+
+            messageResult.setResult(true);
+            messageResult.setCode(200);
+        } catch (Exception ex) {
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
+
+    @PostMapping("validateCode")
+    @ApiOperation(value = "验证短信验证码(公开接口)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "phone", value = "手机号", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "verifyCode", value = "验证码", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "openId", value = "微信openId", paramType = "form")
+    })
+    public MessageResult<Map> validateCode(String phone, String verifyCode, String openId) {
+        MessageResult<Map> messageResult = new MessageResult<>();
+
+        try {
+            String smsKey = "SMS_" + phone;
+
+            String beforeVerifyCode = (String) redisTemplate.opsForValue().get(smsKey);
+
+            if (StringUtils.isBlank(openId)){
+                throw new Exception("用户标识为空");
+            }
+
+            if (StringUtils.isEmpty(beforeVerifyCode)) {
+                throw new Exception("验证码已过期!");
+            }
+
+            if (!beforeVerifyCode.equals(verifyCode)) {
+                throw new Exception("验证码错误!");
+            }
+
+            DES3 des3 = new DES3();
+
+            String token;
+            Long userId;
+
+            UserInfo userInfo = userInfoService.findByPhone(phone);
+            if (userInfo == null){
+                UserInfo userInfo1 = new UserInfo();
+                userInfo1.setName("乘客_"+ com.jpsoft.bus.modules.common.utils.StringUtils.random(8, com.jpsoft.bus.modules.common.utils.StringUtils.RandomType.ALL));
+                userInfo1.setPhone(phone);
+                userInfo1.setPassword(des3.encrypt(jwtSecret,phone));
+                userInfo1.setAcceptMessage(false);
+                userInfo1.setCreateTime(new Date());
+                userInfo1.setDelFlag(false);
+                userInfo1.setOpenId(openId);
+                userInfoService.insert(userInfo1);
+                userId = userInfo1.getId();
+                userInfo = userInfo1;
+            }else {
+                userInfo.setOpenId(openId);
+                userInfoService.update(userInfo);
+                userId = userInfo.getId();
+            }
+
+
+            token = JwtUtil.createToken(jwtSecret, String.valueOf(userId), DateTime.now().plusHours(6).toDate());
+
+
+
+
+
+
+
+
+            Map<String, Object> map = new HashMap<>();
+            map.put("token", token);
+            map.put("userInfo", userInfo);
+
+            messageResult.setData(map);
+            messageResult.setResult(true);
+            messageResult.setCode(200);
+        } catch (Exception ex) {
+            log.error(ex.getMessage());
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
 }

+ 5 - 0
web/src/main/resources/application.yml

@@ -164,3 +164,8 @@ oss:
 #  urlPrefix: http://rccs.oss-cn-hangzhou.aliyuncs.com
   urlPrefix: http://oss.xiaoxinda.com
   objectPre: bus
+
+
+gps:
+  port: 8866
+  key: "a71a4fa458ed085246ea75ebe096bbea"