1、优化断点续传
This commit is contained in:
parent
a2969a5b3c
commit
6a89aea7e7
@ -34,6 +34,9 @@ public class GnssCalcData {
|
||||
@ExcelProperty("记录时间")
|
||||
LocalDateTime createtime;
|
||||
|
||||
@ExcelProperty("更新时间")
|
||||
LocalDateTime updatetime;
|
||||
|
||||
@ExcelProperty("北斗位置东")
|
||||
Double b562e;
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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(() -> {
|
||||
|
||||
@ -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>"},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user