提交 27dc73a6 authored 作者: 艾庆国's avatar 艾庆国

运单预警

上级 0e63db6b
......@@ -31,6 +31,8 @@ public class DriverTraceAddParam {
private BigDecimal[] location;
@ApiModelProperty(value = "时间")
private String gpsTime;
@ApiModelProperty(value = "速度", example = "12.34")
private BigDecimal speed;
}
}
......@@ -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")
......
......@@ -12,7 +12,9 @@ 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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -40,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>()
......@@ -48,9 +52,12 @@ public class TruckTraceServiceImpl implements TruckTraceService {
.le(TruckTraceESPlus::getGpsTime, endTime)
.orderByAsc("gpsTime")
);
return truckTraceStruct.convert(list);
}
List<DriverTruckTraceVO> traceList = truckTraceStruct.convert(list);
//计算车辆的停留结束时间
@Override
public List<DriverTruckTraceVO> calcTruckStayTime(List<DriverTruckTraceVO> traceList){
// 停留时长计算
Integer parkIdx = null;
for (int i=0; i<traceList.size(); i++){
......@@ -63,6 +70,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;
}
}
......@@ -70,22 +78,15 @@ 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++){
......@@ -98,6 +99,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;
}
}
......@@ -105,11 +107,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){
......@@ -134,14 +219,16 @@ public class TruckTraceServiceImpl implements TruckTraceService {
public void driverTraceSave(DriverTraceAddParam param){
List<DriverTraceESPlus> list = new ArrayList<>();
DriverTraceESPlus es = null;
for (DriverTraceAddParam.DriverTraceItem item : param.getTraceList()) {
DriverTraceESPlus es = new DriverTraceESPlus();
es = new DriverTraceESPlus();
es.setUserNo(item.getUserNo());
es.setDataType(item.getDataType());
es.setLocation(item.getLocation());
es.setPositionTime(item.getGpsTime());
es.setCreateTime(LocalDateTimeUtils.formatTime());
es.setModifiedTime(es.getCreateTime());
es.setSpeed(item.getSpeed());
list.add(es);
}
......@@ -230,4 +317,25 @@ public class TruckTraceServiceImpl implements TruckTraceService {
return 0;
}
@Override
public BigDecimal[] getCurrentTruckPosition(String truckNo) {
String beginTime = LocalDateTimeUtils.formatTime(LocalDateTime.now().minusMinutes(5));
String endTime = LocalDateTimeUtils.formatTime();
// 车辆
List<TruckTraceESPlus> list = truckTraceESPlusMapper.selectList(new LambdaEsQueryWrapper<TruckTraceESPlus>()
.eq(TruckTraceESPlus::getTruckNo, truckNo)
.ge(TruckTraceESPlus::getGpsTime, beginTime)
.le(TruckTraceESPlus::getGpsTime, endTime)
.orderByDesc("gpsTime")
.limit(1)
);
if (CollectionUtils.isNotEmpty(list)){
return list.get(0).getLocation();
}
return null;
}
}
......@@ -113,8 +113,8 @@ public class VehicleWarnInfoServiceImpl implements VehicleWarnInfoService {
if (orderChild.getFinishTime() != null) {endTime = orderChild.getFinishTime();}
if (endTime.isAfter(beginTime.plusDays(TRUCK_TRACE_DAY_MAX))) {endTime = beginTime.plusDays(TRUCK_TRACE_DAY_MAX);} //最多查询3天
List<DriverTruckTraceVO> truckTraceList = truckTraceService.listTruckTraceByTime(vehicleWarnInfo.getTruckNo(), LocalDateTimeUtils.formatTime(beginTime), LocalDateTimeUtils.formatTime(endTime));
List<DriverTraceVO> driverTraceList = truckTraceService.listDriverTraceByTime(vehicleWarnInfo.getDriverUserNo(), LocalDateTimeUtils.formatTime(beginTime), LocalDateTimeUtils.formatTime(endTime));
List<DriverTruckTraceVO> truckTraceList = truckTraceService.calcTruckStayTime(truckTraceService.listTruckTraceByTime(vehicleWarnInfo.getTruckNo(), LocalDateTimeUtils.formatTime(beginTime), LocalDateTimeUtils.formatTime(endTime)));
List<DriverTraceVO> driverTraceList = truckTraceService.calcDriverStayTime(truckTraceService.listDriverTraceByTime(vehicleWarnInfo.getDriverUserNo(), LocalDateTimeUtils.formatTime(beginTime), LocalDateTimeUtils.formatTime(endTime)));
// 接单重车、卸车空车
for (DriverTruckTraceVO item : truckTraceList) {
......
......@@ -73,7 +73,7 @@ public class VehicleWarnParkWarnServiceImpl implements VehicleWarnParkWarnServic
}
private void doParkTimeout(OrderChild orderChild, VehicleWarnChild vehicleWarnChild, VehicleWarnConfig vehicleWarnConfig, int parkTimee){
private void doParkTimeout(OrderChild orderChild, VehicleWarnChild vehicleWarnChild, VehicleWarnConfig vehicleWarnConfig, int parkTime){
VehicleWarnInfo vehicleWarnInfo = vehicleWarnInfoDao.findByChildNoAndWarnConfigId(vehicleWarnChild.getChildNo(), vehicleWarnConfig.getId()).orNull();
if (vehicleWarnInfo != null && Objects.equals(vehicleWarnInfo.getStatus(), VehicleWarnInfoEnum.Status.RESOLVE.getCode())){
return;
......@@ -85,7 +85,7 @@ public class VehicleWarnParkWarnServiceImpl implements VehicleWarnParkWarnServic
// 超时判断
int time = vehicleWarnConfig.getTimeoutRatio().multiply(new BigDecimal(MIN_FER_HOUR)).intValue();
if (parkTimee > time){return;}
if (parkTime > time){return;}
// 更新
vehicleWarnCommonService.vehicleWarnInfoUpdate(orderChild, vehicleWarnInfo, vehicleWarnConfig);
......
......@@ -20,4 +20,19 @@ public interface TruckTraceService {
BigDecimal[] getCurrentPosition(String truckNo, Long userNo);
int getParkTime(String truckNo, Long userNo);
BigDecimal[] getCurrentTruckPosition(String truckNo);
List<List<DriverTraceVO>> splitDriverTrace(List<DriverTraceVO> driverTraceList);
//计算车辆的停留结束时间
List<DriverTruckTraceVO> calcTruckStayTime(List<DriverTruckTraceVO> traceList);
//计算司机的停留结束时间
List<DriverTraceVO> calcDriverStayTime(List<DriverTraceVO> traceList);
List<List<DriverTruckTraceVO>> splitTruckTrace(List<DriverTruckTraceVO> traceList);
}
......@@ -409,4 +409,9 @@ public class LocalDateTimeUtils {
Duration duration = Duration.between(startTime, endTime);
return duration.getSeconds();
}
public static long betweenMin(LocalDateTime startTime, LocalDateTime endTime){
Duration duration = Duration.between(startTime, endTime);
return duration.toMinutes();
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论