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("记录时间")
LocalDateTime createtime;
@ExcelProperty("更新时间")
LocalDateTime updatetime;
@ExcelProperty("北斗位置东")
Double b562e;

View File

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

View File

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

View File

@ -84,7 +84,8 @@
url: '/gnss/data/list_calc',
cols: [[
{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: 'b562n', title: '原始北', templet: "<div>{{d.b562n.toFixed(2)}}</div>"},
{field: 'b562d', title: '原始天', templet: "<div>{{d.b562d.toFixed(2)}}</div>"},