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

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

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