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