package com.supersavedriving.driver.modular.system.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.supersavedriving.driver.modular.system.service.IOrderPositionService;
|
import com.supersavedriving.driver.core.util.ToolUtil;
|
import com.supersavedriving.driver.modular.system.model.Order;
|
import com.supersavedriving.driver.modular.system.service.IOrderService;
|
import com.supersavedriving.driver.modular.system.util.GeodesyUtil;
|
import com.supersavedriving.driver.modular.system.util.RedisUtil;
|
import com.supersavedriving.driver.modular.system.warpper.DriverPositionWarpper;
|
import com.supersavedriving.driver.modular.system.warpper.OrderPositionWarpper;
|
import com.supersavedriving.driver.modular.system.warpper.ProcessOperationsWarpper;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
|
import java.io.*;
|
import java.util.*;
|
|
/**
|
* 订单轨迹逻辑类
|
*/
|
@Service
|
public class OrderPositionServiceImpl implements IOrderPositionService {
|
|
@Value("${filePath}")
|
private String filePath;
|
|
@Autowired
|
private RedisUtil redisUtil;
|
|
@Autowired
|
private IOrderService orderService;
|
|
private Map<String, Integer> map = new HashMap<>();
|
|
|
|
|
|
/**
|
* 保存订单最新坐标
|
* @param driverPositionWarpper
|
* @throws Exception
|
*/
|
@Override
|
public void saveOrderPosition(DriverPositionWarpper driverPositionWarpper) throws Exception {
|
Integer orderId = driverPositionWarpper.getOrderId();
|
Order order = orderService.selectById(orderId);
|
if(order.getState() != 105 && order.getState() != 401){
|
return;
|
}
|
Integer orderType = driverPositionWarpper.getOrderType();
|
File file = new File(filePath + orderId + ".json");
|
if(!file.exists()){
|
file.getParentFile().mkdirs();
|
file.createNewFile();
|
}
|
List<OrderPositionWarpper> orderPositionWarppers = queryPosition(orderId, orderType);
|
if(orderPositionWarppers.size() > 0){
|
OrderPositionWarpper orderPositionWarpper = orderPositionWarppers.get(orderPositionWarppers.size() - 1);
|
saveOrderMileage(driverPositionWarpper, orderPositionWarpper);
|
}
|
//大于100米才存储有效定位数据
|
if(orderPositionWarppers.size() > 0){
|
OrderPositionWarpper orderPositionWarpper1 = orderPositionWarppers.get(orderPositionWarppers.size() - 1);
|
String fromLonLat = driverPositionWarpper.getLon() + "," + driverPositionWarpper.getLat();
|
String toLonLat = orderPositionWarpper1.getLon() + "," + orderPositionWarpper1.getLat();
|
Map<String, Double> distance = GeodesyUtil.getDistance(fromLonLat, toLonLat);
|
Double wgs84 = distance.get("WGS84");
|
|
// long timeMillis = System.currentTimeMillis();
|
// long time = orderPositionWarpper1.getInsertTime().getTime();
|
// long t = timeMillis - time;
|
// if(wgs84 >= 200 && t <= 8){//排除位置漂移
|
// return;
|
// }
|
|
if(wgs84 >= 50){//5秒165米
|
OrderPositionWarpper orderPositionWarpper = new OrderPositionWarpper();
|
BeanUtils.copyProperties(driverPositionWarpper, orderPositionWarpper);
|
orderPositionWarpper.setInsertTime(new Date());
|
orderPositionWarppers.add(orderPositionWarpper);
|
}
|
}else{
|
OrderPositionWarpper orderPositionWarpper = new OrderPositionWarpper();
|
BeanUtils.copyProperties(driverPositionWarpper, orderPositionWarpper);
|
orderPositionWarpper.setInsertTime(new Date());
|
orderPositionWarppers.add(orderPositionWarpper);
|
}
|
|
//写入相应的文件
|
PrintWriter out = new PrintWriter(new FileWriter(file));
|
out.write(JSON.toJSONString(orderPositionWarppers));
|
out.flush();
|
out.close();
|
}
|
|
|
/**
|
* 保存行驶里程
|
* @param driverPositionWarpper
|
* @param orderPositionWarpper
|
*/
|
public void saveOrderMileage(DriverPositionWarpper driverPositionWarpper, OrderPositionWarpper orderPositionWarpper){
|
String fromLonLat = driverPositionWarpper.getLon() + "," + driverPositionWarpper.getLat();
|
String toLonLat = orderPositionWarpper.getLon() + "," + orderPositionWarpper.getLat();
|
Map<String, Double> distance = GeodesyUtil.getDistance(fromLonLat, toLonLat);
|
Order order = orderService.selectById(driverPositionWarpper.getOrderId());
|
Double wgs84 = distance.get("WGS84");
|
Integer num = map.get(order.getId().toString());
|
|
// long timeMillis = System.currentTimeMillis();
|
// long time = orderPositionWarpper.getInsertTime().getTime();
|
// long t = timeMillis - time;
|
// if(wgs84 >= 200 && t <= 8){//排除位置漂移
|
// return;
|
// }
|
|
if(50 < wgs84){//5秒165米
|
order.setActualMileage(order.getActualMileage() + wgs84.intValue());
|
orderService.updateById(order);
|
map.put(order.getId().toString(), 0);
|
|
if(order.getState() == 401){//定位变动,自动开始服务
|
ProcessOperationsWarpper processOperationsWarpper = new ProcessOperationsWarpper();
|
processOperationsWarpper.setOrderId(order.getId());
|
processOperationsWarpper.setState(105);
|
try {
|
orderService.driverProcessOperations(order.getDriverId(), processOperationsWarpper);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
if(50 >= wgs84 && 3 <= (null == num ? 0 : num)){//20秒(5秒上传一次数据)
|
Integer integer = map.get(order.getId().toString());
|
map.put(order.getId().toString(), null == integer ? 0 : integer + 1);
|
//进入等待状态
|
if(order.getState() == 401){
|
return;
|
}
|
ProcessOperationsWarpper processOperationsWarpper = new ProcessOperationsWarpper();
|
processOperationsWarpper.setOrderId(order.getId());
|
processOperationsWarpper.setState(401);
|
try {
|
orderService.driverProcessOperations(order.getDriverId(), processOperationsWarpper);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
if(50 >= wgs84 && 3 > (null == num ? 0 : num)){
|
Integer integer = map.get(order.getId().toString());
|
map.put(order.getId().toString(), null == integer ? 0 : integer + 1);
|
}
|
}
|
|
|
|
|
/**
|
* 获取订单坐标数据
|
* @param orderId
|
* @param orderType
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public List<OrderPositionWarpper> queryPosition(Integer orderId, Integer orderType) throws Exception {
|
//将数据存储到文件中
|
File file = new File(filePath + orderId + ".json");
|
if(!file.exists()){
|
System.err.println("不存在");
|
return new ArrayList<>();
|
}
|
//读取文件(字符流)
|
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
|
//循环取出数据
|
String str = null;
|
StringBuffer sb = new StringBuffer();
|
while ((str = in.readLine()) != null) {
|
sb.append(str);
|
}
|
List<OrderPositionWarpper> list = new ArrayList<>();
|
if(ToolUtil.isNotEmpty(sb.toString())){
|
list = JSONArray.parseArray(sb.toString(), OrderPositionWarpper.class);
|
}
|
return list;
|
}
|
|
|
@Override
|
public void initMap(Long orderId) throws Exception {
|
map.put(orderId.toString(), 0);
|
}
|
|
}
|