diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/ResendRecord.java b/sec-api/src/main/java/com/imdroid/secapi/dto/ResendRecord.java index 556472ee..f30cebc5 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/ResendRecord.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/ResendRecord.java @@ -15,6 +15,9 @@ import java.time.LocalDateTime; @Data @TableName(value = "resendrecords") public class ResendRecord { + static public final short STATE_FWD_OK = 0; + static public final short STATE_FWD_FAILED = 1; + static public final short STATE_BREAK_POINT = 2; @TableId(value = "id", type = IdType.AUTO) Long id; Integer tenantid; @@ -24,5 +27,6 @@ public class ResendRecord { LocalDateTime starttime; LocalDateTime endtime; String fwd_group_id; + Short state; } diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java index c6127577..670d47fb 100644 --- a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/Forwarder.java @@ -79,18 +79,18 @@ public class Forwarder { * @param sendTime:要推送的记录的时间 * @param deviceId:设备ID,如果没有指定,则推送全部 */ - boolean forwardGnssRecords(LocalDateTime sendTime, String deviceId) { + private boolean forwardGnssRecords(LocalDateTime sendTime, String deviceId, ResendRecord resendRecord) { String endTime = sendTime.format(formatter); String beginTime = sendTime.minusMinutes(fwdCycleMinutes).format(formatter); // 查找属于指定推送组的设备列表 QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("fwd_group_id", fwdGroupId) - .or() - .eq("fwd_group_id2", fwdGroupId); if(deviceId != null){ queryWrapper.eq("deviceid", deviceId); } + queryWrapper.eq("fwd_group_id", fwdGroupId) + .or() + .eq("fwd_group_id2", fwdGroupId); List gnssDeviceList = deviceMapper.selectList(queryWrapper); // 查询最近半小时的GNSS记录 @@ -104,6 +104,7 @@ public class Forwarder { gnssQueryWrapper.eq("deviceid", deviceId); } List locationRecords = gnssDataMapper.selectList(gnssQueryWrapper); + if(locationRecords.size() == 0) return false; // 构造按项目id分类的GNSS记录 ConcurrentHashMap> projects = new ConcurrentHashMap<>(); @@ -164,19 +165,30 @@ public class Forwarder { if(sendNum > 0) { totalSendNum += sendNum; fwdRecord.setResult(FwdRecord.RESULT_OK); + if(resendRecord != null){ + resendRecord.setState(ResendRecord.STATE_FWD_OK); + resendRecordMapper.updateById(resendRecord); + } } else{ fwdResult = false; fwdRecord.setResult(FwdRecord.RESULT_FAILED); // 新增重发记录 - ResendRecord resendRecord = new ResendRecord(); - resendRecord.setProjectid(projectId); - resendRecord.setTenantid(tenantId); - resendRecord.setCreatetime(LocalDateTime.now()); - resendRecord.setStarttime(sendTime); - resendRecord.setEndtime(sendTime.plusMinutes(10)); - resendRecord.setFwd_group_id(fwdGroupId); - resendRecordMapper.insert(resendRecord); + if(resendRecord == null) { + resendRecord = new ResendRecord(); + resendRecord.setProjectid(projectId); + resendRecord.setTenantid(tenantId); + resendRecord.setCreatetime(LocalDateTime.now()); + resendRecord.setStarttime(sendTime); + resendRecord.setEndtime(sendTime); + resendRecord.setFwd_group_id(fwdGroupId); + resendRecord.setState(ResendRecord.STATE_FWD_FAILED); + resendRecordMapper.insert(resendRecord); + } + else{ + resendRecord.setState(ResendRecord.STATE_FWD_FAILED); + resendRecordMapper.updateById(resendRecord); + } } fwdRecordsMapper.insert(fwdRecord); } @@ -189,11 +201,11 @@ public class Forwarder { } void forwardCurrentGnss() { - if(forwardGnssRecords(LocalDateTime.now(),null)) { + if(forwardGnssRecords(LocalDateTime.now(),null,null)) { // 推送失败记录、补发记录 ThreadManager.getScheduledThreadPool().schedule(() -> { - forwardHistoryGnss(); - },300, TimeUnit.SECONDS); + this.forwardHistoryGnss(); + },100, TimeUnit.SECONDS); } } @@ -201,28 +213,19 @@ public class Forwarder { // 1.从转发记录表里检索待补传记录时间表,含设备Id,时间段 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("fwd_group_id",fwdGroupId); + queryWrapper.ne("state",ResendRecord.STATE_FWD_OK); List resendRecordsList = resendRecordMapper.selectList(queryWrapper); // 2.检索这个这个时间段的解算结果,如果有数据则单个终端转发,标志记录为已补传 - List ids = new ArrayList<>(); for(ResendRecord record:resendRecordsList){ - ids.add(record.getId()); - forwardBatchGnssRecords( - record.getStarttime(), record.getEndtime(), record.getDeviceid()); + forwardBatchGnssRecords(record); } - resendRecordMapper.deleteBatchIds(ids); } - void forwardBatchGnssRecords(LocalDateTime beginTime, LocalDateTime endTime, String deviceId) { - LocalDateTime sendTime = beginTime; - while(sendTime.isBefore(endTime)){ - forwardGnssRecords(sendTime,deviceId); + void forwardBatchGnssRecords(ResendRecord record) { + LocalDateTime sendTime = record.getStarttime(); + while(sendTime.isBefore(record.getEndtime()) || sendTime.isEqual(record.getEndtime())){ + forwardGnssRecords(sendTime,record.getDeviceid(),record); sendTime = sendTime.plusMinutes(fwdCycleMinutes); - try { - Thread.sleep(500); - } - catch (Exception e){ - - } } } 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 75cdb630..9c8f72bd 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 @@ -101,6 +101,7 @@ public class MultiLineGNSSCalcService { ResendRecord fwdRecord = fwdRecordMap.get(deviceId); if(fwdRecord != null){ fwdRecord.setEndtime(lastDate); + fwdRecord.setState(ResendRecord.STATE_BREAK_POINT); resendRecordMapper.insert(fwdRecord); fwdRecordMap.remove(deviceId); } diff --git a/sec-beidou/src/main/resources/db/schema.sql b/sec-beidou/src/main/resources/db/schema.sql index 1f80f633..35d2e2e5 100644 --- a/sec-beidou/src/main/resources/db/schema.sql +++ b/sec-beidou/src/main/resources/db/schema.sql @@ -266,6 +266,7 @@ CREATE TABLE IF NOT EXISTS `resendrecords` ( `starttime` datetime DEFAULT NULL, `endtime` datetime DEFAULT NULL, `fwd_group_id` varchar(64) DEFAULT NULL, + `state` smallint DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*** diff --git a/sec-beidou/src/main/resources/templates/page/resend_records.html b/sec-beidou/src/main/resources/templates/page/resend_records.html index 18fc13f0..9bd2cf82 100644 --- a/sec-beidou/src/main/resources/templates/page/resend_records.html +++ b/sec-beidou/src/main/resources/templates/page/resend_records.html @@ -91,9 +91,10 @@ {field: 'project_id', title: '项目号', sort: true}, {field: 'deviceid', title: '设备号'}, {field: 'createtime', title: '推送时间', templet: "
{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}
"}, - {field: 'starttime', title: '开始时间', templet: "
{{layui.util.toDateString(d.starttime, 'yyyy-MM-dd HH:mm:ss')}}
"}, - {field: 'endtime', title: '结束时间', templet: "
{{layui.util.toDateString(d.endtime, 'yyyy-MM-dd HH:mm:ss')}}
"}, - {field: 'fwd_group_id', title: '推送组'} + {field: 'starttime', title: '数据开始时间', templet: "
{{layui.util.toDateString(d.starttime, 'yyyy-MM-dd HH:mm:ss')}}
"}, + {field: 'endtime', title: '数据结束时间', templet: "
{{layui.util.toDateString(d.endtime, 'yyyy-MM-dd HH:mm:ss')}}
"}, + {field: 'fwd_group_id', title: '推送组'}, + {field: 'state', title: '状态',templet: '#stateTrans'} ]], limit: 10, page: true, @@ -121,5 +122,15 @@ + + \ No newline at end of file