From a2a660099c895234fa359b824cfc26dfffbbcef9 Mon Sep 17 00:00:00 2001 From: weidong Date: Sun, 16 Feb 2025 09:49:55 +0800 Subject: [PATCH 01/13] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E5=81=A5?= =?UTF-8?q?=E5=BA=B7=E6=A3=80=E6=9F=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/imdroid/secapi/dto/Ehm.java | 34 ++++ .../com/imdroid/secapi/dto/EhmConfig.java | 19 ++ .../imdroid/secapi/dto/EhmConfigMapper.java | 8 + .../com/imdroid/secapi/dto/EhmMapper.java | 8 + .../com/imdroid/secapi/dto/GnssTrxMsg.java | 4 + sec-beidou-ehm/pom.xml | 107 +++++++++++ .../com/imdroid/beidou_ehm/BeidouEhmApp.java | 22 +++ .../com/imdroid/beidou_ehm/task/EhmTask.java | 171 ++++++++++++++++++ .../calc/SingleLineGNSSCalcService.java | 1 + .../D3F2StopIndicationMessageExecutor.java | 1 + .../com/imdroid/sideslope/sal/Device.java | 2 + sec-beidou/src/main/resources/db/schema.sql | 31 +++- 12 files changed, 407 insertions(+), 1 deletion(-) create mode 100644 sec-api/src/main/java/com/imdroid/secapi/dto/Ehm.java create mode 100644 sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfig.java create mode 100644 sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfigMapper.java create mode 100644 sec-api/src/main/java/com/imdroid/secapi/dto/EhmMapper.java create mode 100644 sec-beidou-ehm/pom.xml create mode 100644 sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/BeidouEhmApp.java create mode 100644 sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/task/EhmTask.java diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/Ehm.java b/sec-api/src/main/java/com/imdroid/secapi/dto/Ehm.java new file mode 100644 index 00000000..d5471a2f --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/Ehm.java @@ -0,0 +1,34 @@ +package com.imdroid.secapi.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * GNSS设备配置数据 + * + * @author LiGang + */ +@Data +@TableName(value = "ehm") +public class Ehm { + @TableId(value = "id", type = IdType.AUTO) + private Long id; + private Integer tenantid; + private String deviceid; + private LocalDateTime createtime; + private Short offlinestatdays; + private Integer offlinecount; + private Integer offlineminutes; + private Integer calcstathours; + private Float stdeve; + private Float stdevn; + private Float stdevu; + private Float fixrate; + private Float validrate; + + private Integer jumpcount; +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfig.java b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfig.java new file mode 100644 index 00000000..6a7c205a --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfig.java @@ -0,0 +1,19 @@ +package com.imdroid.secapi.dto; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * GNSS设备配置数据 + * + * @author LiGang + */ +@Data +@TableName(value = "ehm") +public class EhmConfig { + private LocalDateTime updatetime; + private Short offlinestatdays; + private Integer calcstathours; +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfigMapper.java b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfigMapper.java new file mode 100644 index 00000000..5aef32a5 --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfigMapper.java @@ -0,0 +1,8 @@ +package com.imdroid.secapi.dto; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface EhmConfigMapper extends BaseMapper { +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/EhmMapper.java b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmMapper.java new file mode 100644 index 00000000..edb9657a --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmMapper.java @@ -0,0 +1,8 @@ +package com.imdroid.secapi.dto; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface EhmMapper extends BaseMapper { +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssTrxMsg.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssTrxMsg.java index 412bd15f..9fbbd415 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssTrxMsg.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssTrxMsg.java @@ -56,6 +56,8 @@ public class GnssTrxMsg { // 这里的收发都是服务端统计的,终端收发详细统计在msg_trx表里 @ExcelProperty("B562") Integer b562bytes; + @ExcelProperty("B562Count") + Integer b562count; @ExcelProperty("D3XX") Integer d3xxbytes; @@ -69,4 +71,6 @@ public class GnssTrxMsg { Integer floatnum; @ExcelProperty("备注") String remark; + @ExcelProperty("JumpCount") + Integer jumpcount; } diff --git a/sec-beidou-ehm/pom.xml b/sec-beidou-ehm/pom.xml new file mode 100644 index 00000000..ccfcca28 --- /dev/null +++ b/sec-beidou-ehm/pom.xml @@ -0,0 +1,107 @@ + + + 4.0.0 + + com.imdroid + security-monitor + 1.0-SNAPSHOT + + + sec-beidou-ehm + + + 8 + 8 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-devtools + true + + + + mysql + mysql-connector-java + 8.0.11 + + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.2 + + + + com.imdroid + sec-api + 1.0-SNAPSHOT + + + com.imdroid + sec-common + 1.0-SNAPSHOT + + + + org.projectlombok + lombok + true + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + + + + central + ali-mirror + https://maven.aliyun.com/repository/central + + true + + + true + + + + + \ No newline at end of file diff --git a/sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/BeidouEhmApp.java b/sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/BeidouEhmApp.java new file mode 100644 index 00000000..856c808a --- /dev/null +++ b/sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/BeidouEhmApp.java @@ -0,0 +1,22 @@ +package com.imdroid.beidou_ehm; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; + + +/** + * @author Layton + * @date 2023/1/31 20:33 + */ +@SpringBootApplication(scanBasePackages = {"com.imdroid"}) +@MapperScan({"com.imdroid.secapi","com.imdroid.beidou.entity"}) +@ComponentScan({"com.imdroid.*"}) +@EntityScan({"com.imdroid.*"}) +public class BeidouEhmApp { + public static void main(String[] args) { + SpringApplication.run(BeidouEhmApp.class, args); + } +} diff --git a/sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/task/EhmTask.java b/sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/task/EhmTask.java new file mode 100644 index 00000000..2dc0ff38 --- /dev/null +++ b/sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/task/EhmTask.java @@ -0,0 +1,171 @@ +package com.imdroid.beidou_ehm.task; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.imdroid.secapi.dto.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.Iterator; +import java.util.List; + +@Component +@Configuration +@EnableScheduling +public class EhmTask{ + @Autowired + GnssStatusMapper statusMapper; + @Autowired + EhmMapper ehmMapper; + @Autowired + EhmConfigMapper ehmConfigMapper; + @Autowired + WarningMsgMapper warningMsgMapper; + @Autowired + GnssCalcDataMapper gnssCalcDataMapper; + @Autowired + GnssTrxMsgMapper gnssTrxMsgMapper; + /** + * 每半小时转发GNSS解算结果 + */ + @Scheduled(cron = "0 24 * * * ?") // 每30分钟执行一次 + private void check() { + // 获取健康检查配置 + List ehmConfigList = ehmConfigMapper.selectList(null); + EhmConfig ehmConfig; + if(ehmConfigList==null || ehmConfigList.size()==0){ + ehmConfig = new EhmConfig(); + ehmConfig.setUpdatetime(LocalDateTime.now()); + ehmConfig.setCalcstathours(24); + ehmConfig.setOfflinestatdays((short) 7); + ehmConfigMapper.update(ehmConfig,null); + } + else{ + ehmConfig = ehmConfigList.get(0); + } + // 获取所有已部署的设备 + List deviceList= statusMapper.queryDeployed(); + Iterator iterator = deviceList.iterator(); + while(iterator.hasNext()) { + GnssStatusJoin status=iterator.next(); + Ehm ehm = new Ehm(); + ehm.setDeviceid(status.getDeviceid()); + ehm.setTenantid(status.getTenantid()); + ehm.setCreatetime(LocalDateTime.now()); + ehm.setOfflinestatdays(ehmConfig.getOfflinestatdays()); + ehm.setCalcstathours(ehmConfig.getCalcstathours()); + + // 检查过去N天离线次数和时长 + checkOffline(ehm, status.getState()==GnssStatus.STATE_OFFLINE); + // 计算过去N小时标准差 + // 计算过去N小时有效解比例 + // 计算过去N小时固定解比例 + checkCalcResults(ehm); + ehmMapper.insert(ehm); + } + } + + private void checkOffline(Ehm ehm, boolean isOffline){ + LocalDateTime now = ehm.getCreatetime(); + // 从告警消息里查询离线记录 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("deviceid",ehm.getDeviceid()); + queryWrapper.le("createtime",now.minusDays(ehm.getOfflinestatdays())); + queryWrapper.eq("code",WarningCfg.TYPE_DEVICE_OFF_LINE); + List warningMsgList = warningMsgMapper.selectList(queryWrapper); + if(warningMsgList==null || warningMsgList.size()==0){ + if(isOffline){ + ehm.setOfflinecount(1); + ehm.setOfflineminutes(ehm.getOfflinestatdays()*24*60); + } + else{ + ehm.setOfflinecount(0); + ehm.setOfflineminutes(0); + } + } + else{ + ehm.setOfflinecount(warningMsgList.size()); + int offlineMinutes = 0; + LocalDateTime offlineEnd = null; + LocalDateTime offlineBegin = null; + for(WarningMsg warningMsg:warningMsgList){ + // 读下一条纪录时才计算上一条的时间差,因为cleartime有可能没有 + if(offlineEnd==null) offlineEnd=warningMsg.getCreatetime(); + if(offlineBegin!=null){ + Duration duration = Duration.between(offlineBegin,offlineEnd); + offlineMinutes+=duration.toMinutes(); + } + offlineBegin = warningMsg.getCreatetime(); + offlineEnd = warningMsg.getCleartime(); + } + if(offlineEnd==null) offlineEnd=now; + if(offlineBegin!=null){ + Duration duration = Duration.between(offlineBegin,offlineEnd); + offlineMinutes+=duration.toMinutes(); + } + ehm.setOfflineminutes(offlineMinutes); + } + } + + private void checkCalcResults(Ehm ehm){ + // 获取过去N小时的解算数据 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("deviceid", ehm.getDeviceid()); + queryWrapper.le("createtime", ehm.getCreatetime().minusHours(ehm.getCalcstathours())); + List gnssCalcDataList = gnssCalcDataMapper.selectList(queryWrapper); + // 计算过去N小时标准差,不含有效值 + // 计算过去N小时有效解比例 + double avgE = 0; + double avgN = 0; + double avgU = 0; + double sedevE = 0; + double sedevN = 0; + double sedevU = 0; + int validCount = 0; + for(GnssCalcData gnssCalcData:gnssCalcDataList){ + if(gnssCalcData.getEnabled()){ + avgE += gnssCalcData.getB562e(); + avgN += gnssCalcData.getB562n(); + avgU += gnssCalcData.getB562d(); + validCount++; + } + } + if(validCount>0){ + avgE = avgE/validCount; + avgN = avgN/validCount; + avgU = avgU/validCount; + for(GnssCalcData gnssCalcData:gnssCalcDataList){ + if(gnssCalcData.getEnabled()){ + sedevE += Math.pow(gnssCalcData.getB562e()-avgE,2); + sedevN += Math.pow(gnssCalcData.getB562n()-avgN,2); + sedevU += Math.pow(gnssCalcData.getB562d()-avgU,2); + } + } + ehm.setStdeve((float) (sedevE/validCount)); + ehm.setStdevn((float) (sedevN/validCount)); + ehm.setStdevu((float) (sedevU/validCount)); + ehm.setValidrate((float) (validCount/gnssCalcDataList.size())); + } + + + // 计算过去N小时固定解比例 + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("deviceid",ehm.getDeviceid()); + queryWrapper1.le("createtime", ehm.getCreatetime().minusHours(ehm.getCalcstathours())); + List gnssTrxMsgList = gnssTrxMsgMapper.selectList(queryWrapper1); + int fixCount = 0; + int d341Count = 0; + int jumpCount = 0; + for(GnssTrxMsg gnssTrxMsg:gnssTrxMsgList){ + fixCount += gnssTrxMsg.getFixnum(); + d341Count += gnssTrxMsg.getB562count(); + jumpCount += gnssTrxMsg.getJumpcount(); + } + if(d341Count>0) ehm.setFixrate((float) (fixCount/d341Count)); + ehm.setJumpcount(jumpCount); + } +} 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 e9f745a5..7e72baac 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 @@ -145,6 +145,7 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { if(groupCalc.getVer() == 3 && focusCalculator.isJump()){ logger.info("{}发生周跳",deviceId); hardResetDevice(deviceId); + device.setJumpCount(device.getJumpCount()+1); } } 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 989aff20..180b9e52 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 @@ -67,6 +67,7 @@ public class D3F2StopIndicationMessageExecutor implements Executor Date: Sun, 16 Feb 2025 10:16:35 +0800 Subject: [PATCH 02/13] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=BC=93=E5=AD=98device=E4=BF=A1=E6=81=AF=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../imdroid/sideslope/web/ApiController.java | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java index 39413ae5..a844f494 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/web/ApiController.java @@ -140,24 +140,7 @@ public class ApiController { Device device = localDeviceService.findByDeviceId(deviceId); if(device!=null){ resp.setResponseMessage("set OK."); - if(paras.length>=3){ - if(paras[2].equals("type")) { - if (paras[1].equals("channel1")) { - if (device.getDataChannelType()==Device.CHANNEL_TYPE_TCP) { - resp.setResponseMessage(paras[1]+" tcp"); - } - else resp.setResponseMessage(paras[1]+" udp"); - } else if (paras[1].equals("channel0")) { - if (device.getCfgChannelType()==Device.CHANNEL_TYPE_TCP) { - resp.setResponseMessage(paras[1]+" tcp"); - } - else resp.setResponseMessage(paras[1]+" udp"); - } - } - } - else{ - status.put("paras", "error"); - } + resp.setResponseMessage(device.toString()); } else { status.put("status", "Offline"); From 706eb20398b3bde274e39247d6ce511c7ab33cbf Mon Sep 17 00:00:00 2001 From: weidong Date: Mon, 17 Feb 2025 16:00:47 +0800 Subject: [PATCH 03/13] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E5=81=A5?= =?UTF-8?q?=E5=BA=B7=E6=A3=80=E6=9F=A5=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/imdroid/secapi/dto/EhmConfig.java | 2 +- .../com/imdroid/beidou_ehm/task/EhmTask.java | 26 ++-- .../beidou/controller/GnssEhmController.java | 122 ++++++++++++++++ .../beidou/service/CommonExcelService.java | 8 ++ .../static/api/init_super_admin.json | 6 + .../resources/templates/page/gnss_ehm.html | 134 ++++++++++++++++++ 6 files changed, 284 insertions(+), 14 deletions(-) create mode 100644 sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssEhmController.java create mode 100644 sec-beidou/src/main/resources/templates/page/gnss_ehm.html diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfig.java b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfig.java index 6a7c205a..ab3e7161 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfig.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmConfig.java @@ -11,7 +11,7 @@ import java.time.LocalDateTime; * @author LiGang */ @Data -@TableName(value = "ehm") +@TableName(value = "ehmconfig") public class EhmConfig { private LocalDateTime updatetime; private Short offlinestatdays; diff --git a/sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/task/EhmTask.java b/sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/task/EhmTask.java index 2dc0ff38..2728b2f1 100644 --- a/sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/task/EhmTask.java +++ b/sec-beidou-ehm/src/main/java/com/imdroid/beidou_ehm/task/EhmTask.java @@ -32,7 +32,7 @@ public class EhmTask{ /** * 每半小时转发GNSS解算结果 */ - @Scheduled(cron = "0 24 * * * ?") // 每30分钟执行一次 + @Scheduled(cron = "0 15 7 * * ?") // 每天7点15分钟执行一次 private void check() { // 获取健康检查配置 List ehmConfigList = ehmConfigMapper.selectList(null); @@ -42,7 +42,7 @@ public class EhmTask{ ehmConfig.setUpdatetime(LocalDateTime.now()); ehmConfig.setCalcstathours(24); ehmConfig.setOfflinestatdays((short) 7); - ehmConfigMapper.update(ehmConfig,null); + ehmConfigMapper.insert(ehmConfig); } else{ ehmConfig = ehmConfigList.get(0); @@ -74,7 +74,7 @@ public class EhmTask{ // 从告警消息里查询离线记录 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("deviceid",ehm.getDeviceid()); - queryWrapper.le("createtime",now.minusDays(ehm.getOfflinestatdays())); + queryWrapper.ge("createtime",now.minusDays(ehm.getOfflinestatdays())); queryWrapper.eq("code",WarningCfg.TYPE_DEVICE_OFF_LINE); List warningMsgList = warningMsgMapper.selectList(queryWrapper); if(warningMsgList==null || warningMsgList.size()==0){ @@ -115,7 +115,7 @@ public class EhmTask{ // 获取过去N小时的解算数据 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("deviceid", ehm.getDeviceid()); - queryWrapper.le("createtime", ehm.getCreatetime().minusHours(ehm.getCalcstathours())); + queryWrapper.ge("createtime", ehm.getCreatetime().minusHours(ehm.getCalcstathours())); List gnssCalcDataList = gnssCalcDataMapper.selectList(queryWrapper); // 计算过去N小时标准差,不含有效值 // 计算过去N小时有效解比例 @@ -145,27 +145,27 @@ public class EhmTask{ sedevU += Math.pow(gnssCalcData.getB562d()-avgU,2); } } - ehm.setStdeve((float) (sedevE/validCount)); - ehm.setStdevn((float) (sedevN/validCount)); - ehm.setStdevu((float) (sedevU/validCount)); - ehm.setValidrate((float) (validCount/gnssCalcDataList.size())); + ehm.setStdeve((float) Math.sqrt(sedevE/validCount)); + ehm.setStdevn((float) Math.sqrt(sedevN/validCount)); + ehm.setStdevu((float) Math.sqrt(sedevU/validCount)); + ehm.setValidrate((float) (validCount*100/gnssCalcDataList.size())); } // 计算过去N小时固定解比例 QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.eq("deviceid",ehm.getDeviceid()); - queryWrapper1.le("createtime", ehm.getCreatetime().minusHours(ehm.getCalcstathours())); + queryWrapper1.ge("createtime", ehm.getCreatetime().minusHours(ehm.getCalcstathours())); List gnssTrxMsgList = gnssTrxMsgMapper.selectList(queryWrapper1); int fixCount = 0; int d341Count = 0; int jumpCount = 0; for(GnssTrxMsg gnssTrxMsg:gnssTrxMsgList){ - fixCount += gnssTrxMsg.getFixnum(); - d341Count += gnssTrxMsg.getB562count(); - jumpCount += gnssTrxMsg.getJumpcount(); + if(gnssTrxMsg.getFixnum()!=null) fixCount += gnssTrxMsg.getFixnum(); + if(gnssTrxMsg.getB562count()!=null) d341Count += gnssTrxMsg.getB562count(); + if(gnssTrxMsg.getJumpcount()!=null) jumpCount += gnssTrxMsg.getJumpcount(); } - if(d341Count>0) ehm.setFixrate((float) (fixCount/d341Count)); + if(d341Count>0) ehm.setFixrate((float) (fixCount*100/d341Count)); ehm.setJumpcount(jumpCount); } } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssEhmController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssEhmController.java new file mode 100644 index 00000000..f0c23933 --- /dev/null +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssEhmController.java @@ -0,0 +1,122 @@ +package com.imdroid.beidou.controller; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.imdroid.beidou.service.CommonExcelService; +import com.imdroid.secapi.dto.*; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.util.ArrayList; +import java.util.List; + +/** + * gnss统计消息 控制器 + * + * @author LiGang + * @date 2024/1/6 15:29 + */ +@Controller +@RequiredArgsConstructor +public class GnssEhmController extends BasicController implements CommonExcelService { + + @Autowired + EhmMapper ehmMapper; + + final List sortItems = new ArrayList<>(); + final List sortSqls = new ArrayList<>(); + @RequestMapping("/page/gnss_ehm") + public String gnssTrxMsg(Model m, HttpSession session) { + initModel(m, session); + if(sortItems.size()==0) { + sortItems.add("离线次数");sortSqls.add("order by offlinecount desc"); + sortItems.add("离线时长");sortSqls.add("order by offlineminutes desc"); + sortItems.add("东标准差");sortSqls.add("order by stdeve desc"); + sortItems.add("北标准差");sortSqls.add("order by stdevn desc"); + sortItems.add("天标准差");sortSqls.add("order by stdevu desc"); + sortItems.add("有效率");sortSqls.add("order by validrate"); + sortItems.add("固定率");sortSqls.add("order by fixrate"); + sortItems.add("周跳次数");sortSqls.add("order by jumpcount desc"); + } + m.addAttribute("sort_items", sortItems); + return "/page/gnss_ehm"; + } + + @RequestMapping("/gnss/ehm/list") + @ResponseBody + public JSONObject listTrxMsg(HttpSession session, int page, int limit, String searchParams) { + return this.pageList(session, page, limit, searchParams); + } + + @Override + public String getSortSql(JSONObject search){ + if(search != null) { + String sortItem = search.getString("_sorttype"); + int id = 0; + for(String item:sortItems){ + if(item.equals(sortItem)){ + return sortSqls.get(id); + } + id++; + } + } + return null; + } + + + /** + * 导出excel + * + * @param session HttpSession + * @param request HttpServletRequest + * @param response HttpServletResponse + * @throws Exception + */ + @RequestMapping("/gnss/ehm/export") + @ResponseBody + public void exportData(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws Exception { + this.export(session, request, response); + } + + /** + * 获取实体类的class + * + * @return 实体类的class + */ + @Override + public Class getEntityClass() { + return Ehm.class; + } + + /** + * 获取实体类对应的mybatis mapper + * + * @return 实体类对应的mybatis mapper + */ + @Override + public BaseMapper getMapper() { + return ehmMapper; + } + + @Override + public String getOrderByColumn() { + return null; + } + + /** + * 获取排序方式,默认降序 + * + * @return 排序方式 + */ + @Override + public String getOrder() { + return null; + } +} diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/service/CommonExcelService.java b/sec-beidou/src/main/java/com/imdroid/beidou/service/CommonExcelService.java index 7bc8300c..514dc118 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/service/CommonExcelService.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/service/CommonExcelService.java @@ -119,6 +119,13 @@ public interface CommonExcelService { } } + String sortSql = getSortSql(search); + if(sortSql!=null){ + queryWrapper.last(sortSql); + //String sql = queryWrapper.getSqlSegment(); + //System.out.println(sql); + } + // 查询 IPage cs = null; if (isJoinSelect()) { @@ -182,6 +189,7 @@ public interface CommonExcelService { default void checkSearchParams(JSONObject search){} default void checkSearchParams(Enumeration enu){} + default String getSortSql(JSONObject search){return null;} /** * 设置查询条件 diff --git a/sec-beidou/src/main/resources/static/api/init_super_admin.json b/sec-beidou/src/main/resources/static/api/init_super_admin.json index d9252f57..89b13842 100644 --- a/sec-beidou/src/main/resources/static/api/init_super_admin.json +++ b/sec-beidou/src/main/resources/static/api/init_super_admin.json @@ -21,6 +21,12 @@ "icon": "fa fa-home", "target": "_self" }, + { + "title": "健康检查报告", + "href": "page/gnss_ehm", + "icon": "fa fa-tachometer", + "target": "_self" + }, { "title": "运行状态", "href": "page/gnss_status", diff --git a/sec-beidou/src/main/resources/templates/page/gnss_ehm.html b/sec-beidou/src/main/resources/templates/page/gnss_ehm.html new file mode 100644 index 00000000..7ab97b36 --- /dev/null +++ b/sec-beidou/src/main/resources/templates/page/gnss_ehm.html @@ -0,0 +1,134 @@ + + + + + 健康检查报告 + + + + + + + +
+
+ +
+ 搜索信息 +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file From f0c4767215bd4b3511876c7ecd0bce48f9de43e7 Mon Sep 17 00:00:00 2001 From: weidong Date: Mon, 17 Feb 2025 16:14:17 +0800 Subject: [PATCH 04/13] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E5=81=A5?= =?UTF-8?q?=E5=BA=B7=E6=A3=80=E6=9F=A5=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + .../src/main/resources/application.properties | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 sec-beidou-ehm/src/main/resources/application.properties diff --git a/pom.xml b/pom.xml index 5d3c2ac6..25480f6c 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,7 @@ sec-test-device sec-ntrip-proxy sec-exapi + sec-beidou-ehm diff --git a/sec-beidou-ehm/src/main/resources/application.properties b/sec-beidou-ehm/src/main/resources/application.properties new file mode 100644 index 00000000..ace2f1f3 --- /dev/null +++ b/sec-beidou-ehm/src/main/resources/application.properties @@ -0,0 +1,21 @@ +server.port=9912 +spring.application.name=beidou-ehm +spring.application.build=20250213 + +spring.jpa.show-sql = true +spring.jpa.hibernate.ddl-auto = none +spring.jpa.database-platform = org.hibernate.dialect.MySQLDialect +#spring.datasource.url = jdbc:mysql://localhost:3306/beidou?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai +spring.datasource.url=jdbc:mysql://139.9.51.237:3306/beidou?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai +spring.datasource.username = radmin +spring.datasource.password = DBMgr_2022 +spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver + +spring.jackson.dateFormat = yyyy-MM-dd HH:mm:ss +spring.jackson.time-zone = GMT+8 + +app.format.date = yyyy-MM-dd +app.format.time = HH:mm:ss +app.format.datetime = yyyy-MM-dd HH:mm:ss + +mybatis-plus.configuration.map-underscore-to-camel-case=false From 62f45f3fac011daebb8128577d7e80b3242b8f0d Mon Sep 17 00:00:00 2001 From: weidong Date: Mon, 17 Feb 2025 16:37:03 +0800 Subject: [PATCH 05/13] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E5=81=A5?= =?UTF-8?q?=E5=BA=B7=E6=A3=80=E6=9F=A5=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/imdroid/beidou/controller/GnssEhmController.java | 4 ++++ sec-beidou/src/main/resources/templates/page/gnss_ehm.html | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssEhmController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssEhmController.java index f0c23933..5e315112 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssEhmController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssEhmController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -52,6 +53,9 @@ public class GnssEhmController extends BasicController implements CommonExcelSer @RequestMapping("/gnss/ehm/list") @ResponseBody public JSONObject listTrxMsg(HttpSession session, int page, int limit, String searchParams) { + if(searchParams==null){ + searchParams = "{'dgt_createtime':'"+ LocalDateTime.now().minusDays(1)+"','_sorttype':'离线次数'}"; + } return this.pageList(session, page, limit, searchParams); } diff --git a/sec-beidou/src/main/resources/templates/page/gnss_ehm.html b/sec-beidou/src/main/resources/templates/page/gnss_ehm.html index 7ab97b36..ce8f2891 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_ehm.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_ehm.html @@ -25,7 +25,7 @@
- +