From 6a89aea7e7d43a7d88c797d3f20beb13e40988c2 Mon Sep 17 00:00:00 2001 From: weidong Date: Wed, 17 Jan 2024 23:03:46 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E6=96=AD=E7=82=B9?= =?UTF-8?q?=E7=BB=AD=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/imdroid/secapi/dto/GnssCalcData.java | 3 + .../calc/MultiLineGNSSCalcService.java | 91 +++++++++++-------- .../calc/SingleLineGNSSCalcService.java | 1 + .../D3F2StopIndicationMessageExecutor.java | 3 +- .../templates/page/gnss_data_calc.html | 3 +- 5 files changed, 62 insertions(+), 39 deletions(-) diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssCalcData.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssCalcData.java index 34f29951..470bc857 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssCalcData.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssCalcData.java @@ -34,6 +34,9 @@ public class GnssCalcData { @ExcelProperty("记录时间") LocalDateTime createtime; + @ExcelProperty("更新时间") + LocalDateTime updatetime; + @ExcelProperty("北斗位置东") Double b562e; diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java index 5c6e7dfd..704eeb2f 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java @@ -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 deviceMap = new ConcurrentHashMap<>(); + private static final Map deviceMap = new ConcurrentHashMap<>(); private static final Map 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; } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java index af09c472..023af5a8 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java @@ -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 diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java index 454f788b..e5dc2f0f 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java @@ -49,7 +49,8 @@ public class D3F2StopIndicationMessageExecutor implements Executor { diff --git a/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html b/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html index b6cb3e03..aaa5c17a 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html @@ -84,7 +84,8 @@ url: '/gnss/data/list_calc', cols: [[ {field: 'deviceid', title: '设备号'}, - {field: 'createtime', title: '上报时间', width:'18%', templet: "
{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}
"}, + {field: 'createtime', title: '产生时间', width:'18%', templet: "
{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}
"}, + {field: 'updatetime', title: '上报时间', width:'18%', templet: "
{{d.updatetime==null?'':layui.util.toDateString(d.updatetime, 'yyyy-MM-dd HH:mm:ss')}}
"}, {field: 'b562e', title: '原始东', templet: "
{{d.b562e.toFixed(2)}}
"}, {field: 'b562n', title: '原始北', templet: "
{{d.b562n.toFixed(2)}}
"}, {field: 'b562d', title: '原始天', templet: "
{{d.b562d.toFixed(2)}}
"},