提交 d2cb1303 authored 作者: 刘海泉's avatar 刘海泉

修改车辆司机轨迹切分逻辑

上级 df16d8fb
......@@ -22,6 +22,8 @@ public class DriverTraceVO {
private BigDecimal speed;
@ApiModelProperty(value = "停留时长(min)", example = "12.3")
private BigDecimal stayTime=BigDecimal.ZERO;
@ApiModelProperty(value = "停留结束时间")
private String stayEndTime;
@ApiModelProperty(value = "车辆状态:1空车 2重车", example = "1")
private Integer truckStatus;
}
......@@ -26,6 +26,8 @@ public class DriverTruckTraceVO {
private BigDecimal latitude;
@ApiModelProperty(value = "GPS 时间")
private String gpsTime;
@ApiModelProperty(value = "停留结束时间")
private String stayEndTime;
@ApiModelProperty(value = "停留时长(min)", example = "12.3")
private BigDecimal stayTime=BigDecimal.ZERO;
@ApiModelProperty(value = "车辆状态:1空车 2重车", example = "1")
......
package com.clx.performance.service.impl.trace;
import com.alibaba.fastjson.JSON;
import com.clx.order.enums.ResultEnum;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.enums.DriverTruckEnum;
......@@ -16,12 +15,10 @@ import com.msl.common.exception.ServiceSystemException;
import com.msl.common.utils.DateUtils;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
......@@ -34,9 +31,9 @@ public class TraceMonitorServiceImpl implements TraceMonitorService {
private final OrderChildDao orderChildDao;
//private final TruckFeign truckFeign;
private final int TRACE_DAY_MAX = 7;
private final int TRACE_DAY_MAX = 3;
private final static long stopMinutes = 5;
@Override
public OrderChildTraceVO getOrderChildTrace(QueryTraceParam param) {
if(StringUtils.isBlank(param.getChildNo())){
......@@ -61,8 +58,8 @@ public class TraceMonitorServiceImpl implements TraceMonitorService {
List<DriverTraceVO> driverTrace = truckTraceService.listDriverTraceByTime(child.getDriverUserNo(),param.getBeginTime(),param.getEndTime());
OrderChildTraceVO result = new OrderChildTraceVO();
result.setDriverTraceList(splitDriverTrace(driverTrace));
result.setTruckTraceList(splitTruckTrace(truckTrace));
result.setDriverTraceList(truckTraceService.splitDriverTrace(driverTrace));
result.setTruckTraceList(truckTraceService.splitTruckTrace(truckTrace));
return result;
}
......@@ -87,109 +84,12 @@ public class TraceMonitorServiceImpl implements TraceMonitorService {
List<DriverTruckTraceVO> truckTrace = truckTraceService.listTruckTraceByTime(truckNo,beginTime,endTime);
if(Objects.nonNull(userNo)){
List<DriverTraceVO> driverTrace = truckTraceService.listDriverTraceByTime(userNo,beginTime,endTime);
result.setDriverTraceList(splitDriverTrace(driverTrace));
}
result.setTruckTraceList(splitTruckTrace(truckTrace));
return result;
}
//如果停留时间超过指定时间,则切分轨迹信息为多段
public static List<List<DriverTruckTraceVO>> splitTruckTrace(List<DriverTruckTraceVO> traceList){
List<List<DriverTruckTraceVO>> result = new ArrayList<>();
if(CollectionUtils.isNotEmpty(traceList)){
if(traceList.size() == 1){
result.add(traceList);
return result;
}else{
List<DriverTruckTraceVO> temp = new ArrayList<>();
temp.add(traceList.get(0));
for(int i = 1; i< traceList.size(); i ++){
DriverTruckTraceVO current = traceList.get(i);
DriverTruckTraceVO prev = traceList.get(i-1);
long minutes = LocalDateTimeUtils.betweenMin(DateUtils.parseDateTime(prev.getGpsTime()).get(),
DateUtils.parseDateTime(current.getGpsTime()).get());
//如果两个坐标停留的时间超过指定时间,则为新的一段路线。
if(minutes > stopMinutes){
result.add(temp);
temp = new ArrayList<>();
temp.add(current);
}else{
temp.add(current);
}
}
result.add(temp);
}
}
return result;
}
//如果停留时间超过指定时间,则切分轨迹信息为多段
public static List<List<DriverTraceVO>> splitDriverTrace(List<DriverTraceVO> driverTraceList){
List<List<DriverTraceVO>> result = new ArrayList<>();
if(CollectionUtils.isNotEmpty(driverTraceList)){
if(driverTraceList.size() == 1){
result.add(driverTraceList);
return result;
}else{
List<DriverTraceVO> temp = new ArrayList<>();
temp.add(driverTraceList.get(0));
for(int i = 1; i< driverTraceList.size(); i ++){
DriverTraceVO current = driverTraceList.get(i);
DriverTraceVO prev = driverTraceList.get(i-1);
long minutes = LocalDateTimeUtils.betweenMin(DateUtils.parseDateTime(prev.getGpsTime()).get(),
DateUtils.parseDateTime(current.getGpsTime()).get());
//如果两个坐标停留的时间超过指定时间,则为新的一段路线。
if(minutes > stopMinutes){
result.add(temp);
temp = new ArrayList<>();
temp.add(current);
}else{
temp.add(current);
}
}
result.add(temp);
}
result.setDriverTraceList(truckTraceService.splitDriverTrace(driverTrace));
}
result.setTruckTraceList(truckTraceService.splitTruckTrace(truckTrace));
return result;
}
public static void main(String[] args) {
List<DriverTruckTraceVO> traceList = new ArrayList<>();
int minStart =10;
for (int i = 0; i < 20; i++) {
DriverTruckTraceVO v1 = new DriverTruckTraceVO();
if(i == 10){
minStart = minStart + 6;
v1.setGpsTime("2021-01-01 10:"+minStart+":00");
}else if(i == 13){
minStart = minStart + 8;
v1.setGpsTime("2021-01-01 10:"+minStart+":00");
}else if(i == 19){
minStart = minStart + 7;
v1.setGpsTime("2021-01-01 10:"+minStart+":00");
}else{
minStart = minStart + 1;
v1.setGpsTime("2021-01-01 10:"+minStart+":00");
}
traceList.add(v1);
}
List<List<DriverTruckTraceVO>> lists = splitTruckTrace(traceList);
for(List<DriverTruckTraceVO> item : lists){
System.out.println(JSON.toJSONString(item));
}
}
public void checkParam(QueryTraceParam param){
LocalDateTime beginTime = DateUtils.parseDateTime(param.getBeginTime()).get();
LocalDateTime endTime = DateUtils.parseDateTime(param.getEndTime()).get();
......
......@@ -12,6 +12,7 @@ import com.clx.performance.struct.trace.TruckTraceStruct;
import com.clx.performance.utils.LocalDateTimeUtils;
import com.clx.performance.vo.pc.trace.DriverTraceVO;
import com.clx.performance.vo.pc.trace.DriverTruckTraceVO;
import com.msl.common.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
......@@ -41,6 +42,8 @@ public class TruckTraceServiceImpl implements TruckTraceService {
@Autowired
private DriverTraceStruct driverTraceStruct;
private final static long stopMinutes = 5;
@Override
public List<DriverTruckTraceVO> listTruckTraceByTime(String truckNo, String beginTime, String endTime) {
List<TruckTraceESPlus> list = truckTraceESPlusMapper.selectList(new LambdaEsQueryWrapper<TruckTraceESPlus>()
......@@ -49,9 +52,11 @@ public class TruckTraceServiceImpl implements TruckTraceService {
.le(TruckTraceESPlus::getGpsTime, endTime)
.orderByAsc("gpsTime")
);
return truckTraceStruct.convert(list);
}
List<DriverTruckTraceVO> traceList = truckTraceStruct.convert(list);
//计算车辆的停留结束时间
public List<DriverTruckTraceVO> calcTruckStayTime(List<DriverTruckTraceVO> traceList){
// 停留时长计算
Integer parkIdx = null;
for (int i=0; i<traceList.size(); i++){
......@@ -64,6 +69,7 @@ public class TruckTraceServiceImpl implements TruckTraceService {
if (parkIdx == null) {continue;}
long stayTime = Duration.between(LocalDateTimeUtils.parseTime(traceList.get(parkIdx).getGpsTime()), LocalDateTimeUtils.parseTime(traceList.get(i).getGpsTime())).getSeconds();
traceList.get(parkIdx).setStayTime(new BigDecimal(stayTime).divide(new BigDecimal(60), 1, RoundingMode.HALF_UP));
traceList.get(parkIdx).setStayEndTime(traceList.get(i).getGpsTime());
parkIdx = null;
}
}
......@@ -71,22 +77,14 @@ public class TruckTraceServiceImpl implements TruckTraceService {
if (parkIdx!=null && parkIdx < traceList.size()-1){
long stayTime = Duration.between(LocalDateTimeUtils.parseTime(traceList.get(parkIdx).getGpsTime()), LocalDateTimeUtils.parseTime(traceList.get(traceList.size()-1).getGpsTime())).getSeconds();
traceList.get(parkIdx).setStayTime(new BigDecimal(stayTime).divide(new BigDecimal(60), 1, RoundingMode.HALF_UP));
traceList.get(parkIdx).setStayEndTime(traceList.get(traceList.size()-1).getGpsTime());
}
return traceList;
}
@Override
public List<DriverTraceVO> listDriverTraceByTime(Long userNo, String beginTime, String endTime) {
List<DriverTraceESPlus> list = driverTraceESPlusMapper.selectList(new LambdaEsQueryWrapper<DriverTraceESPlus>()
.eq(DriverTraceESPlus::getUserNo, userNo)
.ge(DriverTraceESPlus::getPositionTime, beginTime)
.le(DriverTraceESPlus::getPositionTime, endTime)
.orderByAsc("positionTime")
);
List<DriverTraceVO> traceList = driverTraceStruct.convert(list);
//计算司机的停留结束时间
public List<DriverTraceVO> calcDriverStayTime(List<DriverTraceVO> traceList){
// 停留时长计算
Integer parkIdx = null;
for (int i=0; i<traceList.size(); i++){
......@@ -99,6 +97,7 @@ public class TruckTraceServiceImpl implements TruckTraceService {
if (parkIdx == null) {continue;}
long stayTime = Duration.between(LocalDateTimeUtils.parseTime(traceList.get(parkIdx).getGpsTime()), LocalDateTimeUtils.parseTime(traceList.get(i).getGpsTime())).getSeconds();
traceList.get(parkIdx).setStayTime(new BigDecimal(stayTime).divide(new BigDecimal(60), 1, RoundingMode.HALF_UP));
traceList.get(parkIdx).setStayEndTime(traceList.get(i).getGpsTime());
parkIdx = null;
}
}
......@@ -106,11 +105,94 @@ public class TruckTraceServiceImpl implements TruckTraceService {
if (parkIdx!=null && parkIdx < traceList.size()-1){
long stayTime = Duration.between(LocalDateTimeUtils.parseTime(traceList.get(parkIdx).getGpsTime()), LocalDateTimeUtils.parseTime(traceList.get(traceList.size()-1).getGpsTime())).getSeconds();
traceList.get(parkIdx).setStayTime(new BigDecimal(stayTime).divide(new BigDecimal(60), 1, RoundingMode.HALF_UP));
traceList.get(parkIdx).setStayEndTime(traceList.get(traceList.size()-1).getGpsTime());
}
return traceList;
}
//如果停留时间超过指定时间,则切分轨迹信息为多段
public List<List<DriverTruckTraceVO>> splitTruckTrace(List<DriverTruckTraceVO> traceList){
List<List<DriverTruckTraceVO>> result = new ArrayList<>();
if(CollectionUtils.isNotEmpty(traceList)){
if(traceList.size() == 1){
result.add(traceList);
return result;
}else{
List<DriverTruckTraceVO> temp = new ArrayList<>();
temp.add(traceList.get(0));
for(int i = 1; i< traceList.size(); i ++){
DriverTruckTraceVO current = traceList.get(i);
DriverTruckTraceVO prev = traceList.get(i-1);
long minutes = LocalDateTimeUtils.betweenMin(DateUtils.parseDateTime(prev.getGpsTime()).get(),
DateUtils.parseDateTime(current.getGpsTime()).get());
//如果两个坐标停留的时间超过指定时间,则为新的一段路线。
if(minutes > stopMinutes){
result.add(temp);
temp = new ArrayList<>();
temp.add(current);
}else{
temp.add(current);
}
}
result.add(temp);
}
}
for (List<DriverTruckTraceVO> list : result) {
calcTruckStayTime(list);
}
return result;
}
//如果停留时间超过指定时间,则切分轨迹信息为多段
public List<List<DriverTraceVO>> splitDriverTrace(List<DriverTraceVO> driverTraceList){
List<List<DriverTraceVO>> result = new ArrayList<>();
if(CollectionUtils.isNotEmpty(driverTraceList)){
if(driverTraceList.size() == 1){
result.add(driverTraceList);
return result;
}else{
List<DriverTraceVO> temp = new ArrayList<>();
temp.add(driverTraceList.get(0));
for(int i = 1; i< driverTraceList.size(); i ++){
DriverTraceVO current = driverTraceList.get(i);
DriverTraceVO prev = driverTraceList.get(i-1);
long minutes = LocalDateTimeUtils.betweenMin(DateUtils.parseDateTime(prev.getGpsTime()).get(),
DateUtils.parseDateTime(current.getGpsTime()).get());
//如果两个坐标停留的时间超过指定时间,则为新的一段路线。
if(minutes > stopMinutes){
result.add(temp);
temp = new ArrayList<>();
temp.add(current);
}else{
temp.add(current);
}
}
result.add(temp);
}
}
for (List<DriverTraceVO> list : result) {
calcDriverStayTime(list);
}
return result;
}
@Override
public List<DriverTraceVO> listDriverTraceByTime(Long userNo, String beginTime, String endTime) {
List<DriverTraceESPlus> list = driverTraceESPlusMapper.selectList(new LambdaEsQueryWrapper<DriverTraceESPlus>()
.eq(DriverTraceESPlus::getUserNo, userNo)
.ge(DriverTraceESPlus::getPositionTime, beginTime)
.le(DriverTraceESPlus::getPositionTime, endTime)
.orderByAsc("positionTime")
);
return driverTraceStruct.convert(list);
}
@Override
public void truckTraceSave(TruckTraceAddParam param){
......
......@@ -23,4 +23,10 @@ public interface TruckTraceService {
BigDecimal[] getCurrentTruckPosition(String truckNo);
List<List<DriverTraceVO>> splitDriverTrace(List<DriverTraceVO> driverTraceList);
List<List<DriverTruckTraceVO>> splitTruckTrace(List<DriverTruckTraceVO> traceList);
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论