1、优化断点续传

This commit is contained in:
weidong 2024-01-17 23:03:46 +08:00
parent a2969a5b3c
commit 6a89aea7e7
5 changed files with 62 additions and 39 deletions

View File

@ -34,6 +34,9 @@ public class GnssCalcData {
@ExcelProperty("记录时间") @ExcelProperty("记录时间")
LocalDateTime createtime; LocalDateTime createtime;
@ExcelProperty("更新时间")
LocalDateTime updatetime;
@ExcelProperty("北斗位置东") @ExcelProperty("北斗位置东")
Double b562e; Double b562e;

View File

@ -1,10 +1,7 @@
package com.imdroid.sideslope.calc; package com.imdroid.sideslope.calc;
import com.imdroid.secapi.client.BeidouClient; import com.imdroid.secapi.client.BeidouClient;
import com.imdroid.secapi.dto.FwdRecord; import com.imdroid.secapi.dto.*;
import com.imdroid.secapi.dto.FwdRecordMapper;
import com.imdroid.secapi.dto.GnssGroupFwd;
import com.imdroid.secapi.dto.GnssStatus;
import com.imdroid.sideslope.message.BaseMessage; import com.imdroid.sideslope.message.BaseMessage;
import com.imdroid.sideslope.message.D341LocationMessage; import com.imdroid.sideslope.message.D341LocationMessage;
import com.imdroid.sideslope.message.D342LocationMessage; import com.imdroid.sideslope.message.D342LocationMessage;
@ -20,8 +17,13 @@ import java.util.concurrent.ConcurrentHashMap;
@Service @Service
public class MultiLineGNSSCalcService { public class MultiLineGNSSCalcService {
static class D342Time{
LocalDateTime createTime;
LocalDateTime uploadTime;
}
private static final Logger logger = LoggerFactory.getLogger(SingleLineGNSSCalcService.class); private static final Logger logger = LoggerFactory.getLogger(SingleLineGNSSCalcService.class);
private static final Map<String, LocalDateTime> deviceMap = new ConcurrentHashMap<>(); private static final Map<String, D342Time> deviceMap = new ConcurrentHashMap<>();
private static final Map<String, FwdRecord> fwdRecordMap = new ConcurrentHashMap<>(); private static final Map<String, FwdRecord> fwdRecordMap = new ConcurrentHashMap<>();
@Autowired @Autowired
@ -38,7 +40,7 @@ public class MultiLineGNSSCalcService {
public void calc(D342LocationMessage d342Message){ public void calc(D342LocationMessage d342Message){
// 如果时间跨度大于1分钟或者不含d341则计算平滑值 // 如果时间跨度大于1分钟或者不含d341则计算平滑值
String deviceId = d342Message.getId(); String deviceId = d342Message.getId();
LocalDateTime lastDate = deviceMap.get(deviceId); D342Time lastD342Time = deviceMap.get(deviceId);
LocalDateTime msgTime = d342Message.getOriginalTime(); LocalDateTime msgTime = d342Message.getOriginalTime();
int d341Count = d342Message.getMessageList().size(); int d341Count = d342Message.getMessageList().size();
if(msgTime!=null) logger.info(deviceId + " proc D342: "+msgTime+" seq:"+d342Message.getSeq()+" D341 num: "+d341Count); if(msgTime!=null) logger.info(deviceId + " proc D342: "+msgTime+" seq:"+d342Message.getSeq()+" D341 num: "+d341Count);
@ -49,16 +51,18 @@ public class MultiLineGNSSCalcService {
return; return;
} }
if(lastDate != null) { if(lastD342Time != null) {
logger.info(deviceId + " last D342: " + lastDate); logger.info(deviceId + " last D342: " + lastD342Time.createTime);
if (msgTime.isAfter(lastDate.plusMinutes(4))) { if (msgTime.isAfter(lastD342Time.createTime.plusMinutes(4))) {
logger.info(deviceId + " d341 cycle done!"); logger.info(deviceId + " d341 cycle done!");
// 计算上轮结果 // 计算上轮结果
calcService.calSingleDone(deviceId, d342Message.getTenantId(), lastDate); calcService.calSingleDone(deviceId, d342Message.getTenantId(), lastD342Time.createTime);
} }
} }
else{ else{
logger.info(deviceId + " D342 session begin!"); logger.info(deviceId + " D342 session begin!");
lastD342Time = new D342Time();
deviceMap.put(deviceId, lastD342Time);
// 产生断点补传通知 // 产生断点补传通知
beidouClient.onGnssUpload(deviceId, d342Message.getTenantId(), msgTime); beidouClient.onGnssUpload(deviceId, d342Message.getTenantId(), msgTime);
GnssStatus gnssStatus = dataPersistService.getDeviceState(deviceId); GnssStatus gnssStatus = dataPersistService.getDeviceState(deviceId);
@ -72,17 +76,24 @@ public class MultiLineGNSSCalcService {
} }
// 处理d341 // 处理d341
deviceMap.put(deviceId, msgTime); lastD342Time.createTime = msgTime;
lastD342Time.uploadTime = LocalDateTime.now();
for(BaseMessage message: d342Message.getMessageList()){ for(BaseMessage message: d342Message.getMessageList()){
D341LocationMessage d341Message = (D341LocationMessage)message; D341LocationMessage d341Message = (D341LocationMessage)message;
calcService.calcSingle(d341Message, false); calcService.calcSingle(d341Message, false);
} }
} }
else if(lastDate != null){ else if(lastD342Time != null){
d342SessionDone(deviceId, d342Message.getTenantId(), lastD342Time.createTime);
}
}
void d342SessionDone(String deviceId, Integer tenantId, LocalDateTime lastDate){
//补传结束指示 //补传结束指示
logger.info(deviceId + " d342 session done!"); logger.info(deviceId + " d342 session done!");
// 计算上轮结果 // 计算上轮结果
calcService.calSingleDone(deviceId, d342Message.getTenantId(),lastDate); calcService.calSingleDone(deviceId, tenantId, lastDate);
// 重算最近的 // 重算最近的
lastDate = gnssCalcFilterService.updateRb562(deviceId,lastDate); lastDate = gnssCalcFilterService.updateRb562(deviceId,lastDate);
// 记录转发表更新为upload done // 记录转发表更新为upload done
@ -95,7 +106,7 @@ public class MultiLineGNSSCalcService {
} }
// 移除记录发完成指示更新设备状态 // 移除记录发完成指示更新设备状态
deviceMap.remove(deviceId); deviceMap.remove(deviceId);
beidouClient.onGnssUploadComplete(deviceId,d342Message.getTenantId()); beidouClient.onGnssUploadComplete(deviceId,tenantId);
GnssStatus gnssStatus = dataPersistService.getDeviceState(deviceId); GnssStatus gnssStatus = dataPersistService.getDeviceState(deviceId);
if(gnssStatus!=null){ if(gnssStatus!=null){
gnssStatus.setState(GnssStatus.STATE_IDLE); gnssStatus.setState(GnssStatus.STATE_IDLE);
@ -103,8 +114,6 @@ public class MultiLineGNSSCalcService {
} }
} }
}
void createFwdReord(D342LocationMessage d342Message){ void createFwdReord(D342LocationMessage d342Message){
String deviceId = d342Message.getId(); String deviceId = d342Message.getId();
// 查找这个设备是否有项目号 // 查找这个设备是否有项目号
@ -124,10 +133,18 @@ public class MultiLineGNSSCalcService {
} }
/** /**
* 周期结束通知 * 进入休眠周期检查正在上传的终端是否长时间没有再收到数据
* @param deviceId 设备id * @param deviceId 设备id
*/ */
public LocalDateTime getUploadTime(String deviceId){ public LocalDateTime checkUploadTime(String deviceId, Integer tenantId){
return deviceMap.get(deviceId); D342Time lastD342Time = deviceMap.get(deviceId);
if(lastD342Time != null){
LocalDateTime nowTime = LocalDateTime.now();
if(lastD342Time.uploadTime.isBefore(nowTime.minusMinutes(30))){
d342SessionDone(deviceId,tenantId,lastD342Time.createTime);
return null;
}
}
return lastD342Time.createTime;
} }
} }

View File

@ -150,6 +150,7 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService {
LocalDateTime resultTime, int delay, boolean isShocked) { LocalDateTime resultTime, int delay, boolean isShocked) {
GnssCalcData locationRecord = new GnssCalcData(); GnssCalcData locationRecord = new GnssCalcData();
locationRecord.setCreatetime(resultTime); locationRecord.setCreatetime(resultTime);
locationRecord.setUpdatetime(LocalDateTime.now()); //通过这里可以区分补传记录
locationRecord.setDeviceid(deviceId); locationRecord.setDeviceid(deviceId);
// 调用这个函数之前已判断是否为null // 调用这个函数之前已判断是否为null

View File

@ -49,7 +49,8 @@ public class D3F2StopIndicationMessageExecutor implements Executor<D3F2StopIndic
gnssTrxMsg.setD3xxbytes(device.getD3xxbytes()); gnssTrxMsg.setD3xxbytes(device.getD3xxbytes());
gnssTrxMsg.setB562bytes(device.getB562bytes()); gnssTrxMsg.setB562bytes(device.getB562bytes());
LocalDateTime uploadTime = multiLineGNSSCalcService.getUploadTime(device.getDeviceId()); LocalDateTime uploadTime = multiLineGNSSCalcService.checkUploadTime(
device.getDeviceId(), device.getTenantId());
// 储设备收发字节数统计信息 // 储设备收发字节数统计信息
ThreadManager.getFixedThreadPool().submit(() -> { ThreadManager.getFixedThreadPool().submit(() -> {

View File

@ -84,7 +84,8 @@
url: '/gnss/data/list_calc', url: '/gnss/data/list_calc',
cols: [[ cols: [[
{field: 'deviceid', title: '设备号'}, {field: 'deviceid', title: '设备号'},
{field: 'createtime', title: '上报时间', width:'18%', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"}, {field: 'createtime', title: '产生时间', width:'18%', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'updatetime', title: '上报时间', width:'18%', templet: "<div>{{d.updatetime==null?'':layui.util.toDateString(d.updatetime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'b562e', title: '原始东', templet: "<div>{{d.b562e.toFixed(2)}}</div>"}, {field: 'b562e', title: '原始东', templet: "<div>{{d.b562e.toFixed(2)}}</div>"},
{field: 'b562n', title: '原始北', templet: "<div>{{d.b562n.toFixed(2)}}</div>"}, {field: 'b562n', title: '原始北', templet: "<div>{{d.b562n.toFixed(2)}}</div>"},
{field: 'b562d', title: '原始天', templet: "<div>{{d.b562d.toFixed(2)}}</div>"}, {field: 'b562d', title: '原始天', templet: "<div>{{d.b562d.toFixed(2)}}</div>"},