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-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..ab3e7161 --- /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 = "ehmconfig") +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/EhmJoin.java b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmJoin.java new file mode 100644 index 00000000..2126e212 --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmJoin.java @@ -0,0 +1,36 @@ +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 EhmJoin { + @TableId(value = "id", type = IdType.AUTO) + private Long id; + private Integer tenantid; + private String deviceid; + private Short devicetype; + private Short model; + 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/EhmMapper.java b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmMapper.java new file mode 100644 index 00000000..141f3d17 --- /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.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface EhmMapper extends MPJBaseMapper { +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroup.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroup.java index 75d87a28..12ac9235 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroup.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssGroup.java @@ -25,6 +25,7 @@ public class GnssGroup implements Serializable { Short rs_adv; // reference station only Short power_mode; Integer device_num; + Short gnss_sample_s; public String getConfigCmd(GnssDevice device){ String cmd = "D3110009"; @@ -33,7 +34,8 @@ public class GnssGroup implements Serializable { +HexUtil.Byte2HexString((byte) active_time.intValue()) +HexUtil.Byte2HexString((byte) active_offset.intValue()) +((device.getDevicetype() == GnssDevice.TYPE_ROVER)?"00":HexUtil.Byte2HexString((byte) rs_adv.shortValue())) - +HexUtil.Byte2HexString((byte) power_mode.shortValue()); + +HexUtil.Byte2HexString((byte) power_mode.shortValue()) + +HexUtil.Byte2HexString((byte) gnss_sample_s.shortValue()); return cmd; } diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusJoin.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusJoin.java index 171ac194..8f9aece9 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusJoin.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusJoin.java @@ -76,6 +76,8 @@ public class GnssStatusJoin { @ExcelProperty("设备类型") Short devicetype; + @ExcelProperty("设备型号") + Short model; @ExcelIgnore Integer group_id; diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusMapper.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusMapper.java index b2bcdeef..ad3f42e0 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusMapper.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssStatusMapper.java @@ -19,26 +19,26 @@ public interface GnssStatusMapper extends MPJBaseMapper { @Update({"update gnssstatus set state=0,warning=#{warning},warningcode=#{warningcode} where deviceid=#{deviceid}"}) int setOfflineByDeviceId(GnssStatusJoin status); - @Select({"select s.*, d.devicetype, d.group_id, d.name from gnssstatus s ,gnssdevices d where s.deviceid=d.deviceid and s.state <> 0"}) + @Select({"select s.*, d.devicetype, d.model, d.group_id, d.name, d.project_id from gnssstatus s ,gnssdevices d where s.deviceid=d.deviceid and s.state <> 0"}) List queryOnline(); - @Select({"select s.*, d.devicetype, d.group_id, d.name from gnssstatus s ,gnssdevices d where " + + @Select({"select s.*, d.devicetype, d.model, d.group_id, d.name, d.project_id from gnssstatus s ,gnssdevices d where " + "s.deviceid=d.deviceid and d.tenantid<>0 and d.opmode=0"}) List queryDeployed(); - @Select({"select s.*, d.devicetype, d.group_id, d.name, d.project_id from gnssstatus s ,gnssdevices d where " + + @Select({"select s.*, d.devicetype, d.model, d.group_id, d.name, d.project_id from gnssstatus s ,gnssdevices d where " + "s.deviceid=d.deviceid and d.tenantid = #{tenantid} and d.opmode=0"}) List queryDeployedByTenant(int tenantid); //多个入参要用Param注解 - @Select({"select s.*, d.devicetype, d.group_id, d.name, d.project_id from gnssstatus s ,gnssdevices d where " + + @Select({"select s.*, d.devicetype, d.model, d.group_id, d.name, d.project_id from gnssstatus s ,gnssdevices d where " + "s.deviceid=d.deviceid and d.tenantid = #{tenantid} and d.opmode=0 and d.project_id = #{projectName}"}) List queryDeployedByProject(@Param("tenantid") int tenantid, @Param("projectName") String projectName); // 需要关联设备类型 - @Select({"select s.*, d.devicetype from gnssstatus s ,gnssdevices d where s.deviceid=d.deviceid and s.deviceid = #{deviceId}"}) + @Select({"select s.*, d.devicetype, d.model, d.group_id, d.name, d.project_id from gnssstatus s ,gnssdevices d where s.deviceid=d.deviceid and s.deviceid = #{deviceId}"}) GnssStatusJoin queryByDeviceId(String deviceId); - @Select({"select s.*, d.devicetype from gnssstatus s ,gnssdevices d where s.deviceid=d.deviceid"}) + @Select({"select s.*, d.devicetype, d.model, d.group_id, d.name, d.project_id from gnssstatus s ,gnssdevices d where s.deviceid=d.deviceid"}) GnssStatusJoin queryAll(); } 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-api/src/main/java/com/imdroid/secapi/dto/WarningCfg.java b/sec-api/src/main/java/com/imdroid/secapi/dto/WarningCfg.java index b4d67056..07efbf29 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/WarningCfg.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/WarningCfg.java @@ -44,8 +44,13 @@ public class WarningCfg { public static final String TYPE_NAME_INCLINE = "异常倾斜"; public static final int TYPE_SIM_STATUS_ABNORMAL = 0x800; public static final String TYPE_NAME_SIM_STATUS_ABNORMAL = "流量卡状态异常"; - public static final int TYPE_SIM_LOW_TRAFFIC = 0x900; + public static final int TYPE_SIM_LOW_TRAFFIC = 0x1000; public static final String TYPE_NAME_SIM_LOW_TRAFFIC = "流量卡流量不足"; + public static final int TYPE_XY_JUMP = 0x2000; + public static final String TYPE_NAME_XY_JUMP = "滤波结果水平跳变"; + public static final int TYPE_Z_JUMP = 0x4000; + public static final String TYPE_NAME_Z_JUMP = "滤波结果高程跳变"; + // warning level definition public static final short LEVEL_0 = 0; //正常 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..2728b2f1 --- /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 15 7 * * ?") // 每天7点15分钟执行一次 + 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.insert(ehmConfig); + } + 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.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){ + 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.ge("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) 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.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){ + 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*100/d341Count)); + ehm.setJumpcount(jumpCount); + } +} 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 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..d1260ed8 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); } } @@ -278,11 +279,15 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { } } + // 如果本次结果有跳变,则停止推送并产生严重告警 //更新有效解时间 if(locationRecord.getEnabled()){ if(device.getLastValidCalcDataTime()==null || device.getLastValidCalcDataTime().isBefore(resultTime)){ device.setLastValidCalcDataTime(resultTime); } + if(latestRpos!=null){ + warningService.checkFilteredResultJump(latestRpos, locationRecord); + } } // 记录本次位置,作为下次的参考 @@ -379,6 +384,7 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { queryWrapper.eq("deviceid",deviceId); queryWrapper.ge("createtime",LocalDateTime.now().minusHours(12)); queryWrapper.isNotNull("rpose"); + queryWrapper.eq("enabled",true); queryWrapper.orderByDesc("createtime"); queryWrapper.last("limit 1"); GnssCalcData gnssCalcData = dataMapper.selectOne(queryWrapper); @@ -405,4 +411,5 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { deviceChannel.writeAndFlush(buf); } } + } 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..1f0faa83 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,9 +67,11 @@ public class D3F2StopIndicationMessageExecutor implements Executor { diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java index 4f3e86de..10b3c97c 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java @@ -56,6 +56,7 @@ public class Device { int d341In42Count = 0; int satelitesInUse = 0;//平均卫星数 int sataStatCount = 0; + int jumpCount = 0; Double latitude; Double longitude; @@ -150,6 +151,7 @@ public class Device { satelitesInUse = 0; fixedNum = 0; floatNum = 0; + jumpCount = 0; } public void clearD342Stat(){ diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningService.java index cbeefd98..40be0eca 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningService.java @@ -1,8 +1,8 @@ package com.imdroid.sideslope.service; +import com.imdroid.secapi.dto.GnssCalcData; import com.imdroid.secapi.dto.GnssStatus; import com.imdroid.secapi.dto.GnssStatusMsg; -import com.imdroid.secapi.dto.GnssTrxMsg; import com.imdroid.sideslope.sal.Device; public interface WarningService { @@ -22,6 +22,5 @@ public interface WarningService { /*** * 检查未知报文是否较多 */ - void checkTrx(GnssTrxMsg msg, GnssStatus curStatus); - + void checkFilteredResultJump(double[] latestRpos, GnssCalcData locationRecord); } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java index 469daeb3..f8aa4316 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java @@ -30,7 +30,8 @@ public class WarningServiceImpl implements WarningService { WarningMsgMapper warningMsgMapper; @Autowired GnssStatusMapper gnssStatusMapper; - + @Autowired + GnssDeviceMapper deviceMapper; @Value("${warning.log.directory}") private String logDirectory; @@ -224,14 +225,6 @@ public class WarningServiceImpl implements WarningService { return isUpdated; } - /*** - * 检查未知报文是否较多 - */ - @Override - public void checkTrx(GnssTrxMsg msg, GnssStatus curStatus){ - - } - public short getWarningLevel(int warningCode){ if(warningCode == 0) return WarningCfg.LEVEL_0; else if((warningCode & warningLevel2Code) !=0 ) return WarningCfg.LEVEL_2; @@ -268,7 +261,80 @@ public class WarningServiceImpl implements WarningService { } } } +/* + // 检查SIM卡状态 + public void checkSimCardStatus(Device device, SimCard simCard) { + GnssStatus status = gnssStatusMapper.getByDeviceId(device.getDeviceId()); + if (status == null) return; + boolean isUpdated = false; + + // 检查SIM卡状态是否异常(停机、注销、失效) + if (simCard.getStatus() == SimCard.STATUS_SUSPENDED || + simCard.getStatus() == SimCard.STATUS_CANCELLED || + simCard.getStatus() == SimCard.STATUS_INVALID) { + + String statusDesc; + switch(simCard.getStatus()) { + case SimCard.STATUS_SUSPENDED: + statusDesc = "停机"; + break; + case SimCard.STATUS_CANCELLED: + statusDesc = "注销"; + break; + case SimCard.STATUS_INVALID: + statusDesc = "失效"; + break; + default: + statusDesc = "未知状态"; + } + + if (check(status, WarningCfg.TYPE_SIM_STATUS_ABNORMAL, + WarningCfg.TYPE_NAME_SIM_STATUS_ABNORMAL, false, + simCard.getStatus(), null, + "SIM卡状态: " + statusDesc)) { + isUpdated = true; + } + } else if (simCard.getStatus() == SimCard.STATUS_ACTIVATED) { + // 状态正常(已激活),清除告警 + if ((status.getWarningcode() & WarningCfg.TYPE_SIM_STATUS_ABNORMAL) != 0) { + clearWarning(status, WarningCfg.TYPE_SIM_STATUS_ABNORMAL); + isUpdated = true; + } + } + + if (isUpdated) { + status.setWarning(getWarningLevel(status.getWarningcode())); + gnssStatusMapper.updateById(status); + } + } + + public void checkSimCardTraffic(Device device, SimCard simCard) { + GnssStatus status = gnssStatusMapper.getByDeviceId(device.getDeviceId()); + if (status == null) return; + + boolean isUpdated = false; + + BigDecimal usedPercentage = simCard.getUsed() + .divide(simCard.getTotal(), 4, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)); + + // 检查流量使用情况 + if (check(status, WarningCfg.TYPE_SIM_LOW_TRAFFIC, + WarningCfg.TYPE_NAME_SIM_LOW_TRAFFIC, + false, // 大于等于流量门限值,那么就报警 + usedPercentage.intValue(), + null, + String.format("流量已使用 %.2f%%", usedPercentage.doubleValue()))) { + isUpdated = true; + } + + if (isUpdated) { + status.setWarning(getWarningLevel(status.getWarningcode())); + gnssStatusMapper.updateById(status); + } + } +*/ // 检查SIM卡状态 public void checkSimCardStatus(Device device, SimCard simCard) { GnssStatus status = gnssStatusMapper.getByDeviceId(device.getDeviceId()); @@ -365,4 +431,52 @@ public class WarningServiceImpl implements WarningService { warningMsgMapper.updateById(warningMsg); } } + + @Override + public void checkFilteredResultJump(double[] latestRpos, GnssCalcData locationRecord){ + int[] warningValuesXY = cfgMap.get(WarningCfg.TYPE_XY_JUMP); + int[] warningValuesZ = cfgMap.get(WarningCfg.TYPE_Z_JUMP); + int warningCode = 0; + if(warningValuesXY!=null){ + if(Math.abs(locationRecord.getRpose()-latestRpos[0])>warningValuesXY[1] || + Math.abs(locationRecord.getRposn()-latestRpos[1])>warningValuesXY[1]){ + warningCode = WarningCfg.TYPE_XY_JUMP; + } + } + if(warningCode==0 && warningValuesZ!=null){ + if(Math.abs(locationRecord.getRposd()-latestRpos[2])>warningValuesZ[1]){ + warningCode = WarningCfg.TYPE_Z_JUMP; + } + } + + if(warningCode!=0){ + // 停止推送 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("deviceid",locationRecord.getDeviceid()); + queryWrapper.last("limit 1"); + GnssDevice device = deviceMapper.selectOne(queryWrapper); + String unFwdGroupName = "不推送"; + if(device != null){ + if(device.getTenantid() != Tenant.SAAS_PROVIDER_ID && + !unFwdGroupName.equals(device.getFwd_group_id())){ + device.setFwd_group_id(unFwdGroupName); + device.setFwd_group_id2(unFwdGroupName); + //deviceMapper.updateById(device); + // 产生告警 + WarningMsg warningMsg = new WarningMsg(); + warningMsg.setDeviceid(device.getDeviceid()); + warningMsg.setTenantid(device.getTenantid()); + warningMsg.setCreatetime(LocalDateTime.now()); + warningMsg.setCode(warningCode); + warningMsg.setLevel(WarningCfg.LEVEL_2); + double deltaE = locationRecord.getRpose()-latestRpos[0]; + double deltaN = locationRecord.getRposn()-latestRpos[1]; + double deltaU = locationRecord.getRposd()-latestRpos[2]; + warningMsg.setInfo("滤波结果跳变:"+deltaE+", "+deltaN+", "+deltaU); + warningMsg.setDevicetype(WarningCfg.TYPE_GNSS); + warningMsgMapper.insert(warningMsg); + } + } + } + } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/task/AbnormalDeviceProcessor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/task/AbnormalDeviceProcessor.java index 0f8ba076..c9068ec1 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/task/AbnormalDeviceProcessor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/task/AbnormalDeviceProcessor.java @@ -159,13 +159,14 @@ public class AbnormalDeviceProcessor{ void checkNotGoodDevice(String deviceId, String refDeviceId1){ LocalDateTime validTime = LocalDateTime.now().minusMinutes(10); // 待修改的点 - List calcDataList = getLastTwo(deviceId,0); + List calcDataList = getLastTwo(deviceId,12); if(calcDataList.size() < 2) return; - if(calcDataList.get(0).getCreatetime().isBefore(validTime)) return; + //if(calcDataList.get(0).getCreatetime().isBefore(validTime)) return; // 参考点 double deltaU = (Math.random()*2-1)/10; List calcDataList1 = getLastTwo(refDeviceId1,12); if(calcDataList1.size()==2){ + // 如果参考点的解算结果不是最新的就不要用,否则可能会导致delta值不变 if(calcDataList1.get(0).getCreatetime().isAfter(validTime)){ deltaU = calcDataList1.get(0).getRposd() - calcDataList1.get(1).getRposd(); } 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"); diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java index c457a80b..b6ad50e1 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java @@ -123,7 +123,9 @@ public class GnssDeviceController extends BasicController{ //所属组织 String tenantname = search.getString("tenantname"); if (StringUtils.hasText(tenantname)) { - queryWrapper.like("tenantname", tenantname); + if(tenantname.startsWith("非SAAS")) + queryWrapper.ne("tenantname",Tenant.SAAS_PROVIDER_NAME); + else queryWrapper.like("tenantname", tenantname); } //设备类型 Integer devicetype = search.getInteger("devicetype"); 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..0ed4abc7 --- /dev/null +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssEhmController.java @@ -0,0 +1,149 @@ +package com.imdroid.beidou.controller; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.github.yulichang.query.MPJQueryWrapper; +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.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +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 { + final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @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); + m.addAttribute("begin_time",LocalDateTime.now().minusDays(1).format(dateFormatter)); + return "/page/gnss_ehm"; + } + + @RequestMapping("/gnss/ehm/list") + @ResponseBody + public JSONObject listTrxMsg(HttpSession session, int page, int limit, String searchParams) { + if(searchParams==null){ + searchParams = "{'dgt_t.createtime':'"+ LocalDateTime.now().minusDays(1)+"','_sorttype':'离线次数'}"; + } + 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 EhmJoin.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; + } + + @Override + public MPJQueryWrapper prepareQueryWrapper() { + return new MPJQueryWrapper() + .selectAll(Ehm.class) + .select("d.devicetype as devicetype,d.model as model") + .leftJoin("gnssdevices d on t.deviceid = d.deviceid"); + } + + /** + * 是否联表查询 + * + * @return 是否联表查询 + */ + @Override + public boolean isJoinSelect() { + return true; + } + +} diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/WarningController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/WarningController.java index 9284ace3..73583370 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/WarningController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/WarningController.java @@ -51,6 +51,10 @@ public class WarningController extends BasicController implements CommonExcelSer warningMap.put(WarningCfg.TYPE_SIM_STATUS_ABNORMAL, WarningCfg.TYPE_NAME_SIM_STATUS_ABNORMAL); + warningMap.put(WarningCfg.TYPE_SIM_LOW_TRAFFIC, WarningCfg.TYPE_NAME_SIM_LOW_TRAFFIC); + warningMap.put(WarningCfg.TYPE_SIM_STATUS_ABNORMAL, WarningCfg.TYPE_NAME_SIM_STATUS_ABNORMAL); + warningMap.put(WarningCfg.TYPE_XY_JUMP, WarningCfg.TYPE_NAME_XY_JUMP); + warningMap.put(WarningCfg.TYPE_Z_JUMP, WarningCfg.TYPE_NAME_Z_JUMP); } /**** 推送页面 *****/ 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..e4ea3b89 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;} /** * 设置查询条件 @@ -195,9 +203,9 @@ public interface CommonExcelService { if (paraName.startsWith("s") && StringUtils.hasText((String)paraValue)) { addStringQueryWrapper(queryWrapper, paraName, paraValue); } - // Number + // Number,-1表示全部 else if (paraName.startsWith("n") && StringUtils.hasText((String)paraValue)) { - addNumberQueryWrapper(queryWrapper, paraName, paraValue); + if(!paraValue.equals("-1")) addNumberQueryWrapper(queryWrapper, paraName, paraValue); } // Date & Time else if (paraName.startsWith("d") && StringUtils.hasText((String)paraValue)) { diff --git a/sec-beidou/src/main/resources/db/schema.sql b/sec-beidou/src/main/resources/db/schema.sql index 901d785d..3ec8425d 100644 --- a/sec-beidou/src/main/resources/db/schema.sql +++ b/sec-beidou/src/main/resources/db/schema.sql @@ -79,6 +79,7 @@ CREATE TABLE IF NOT EXISTS `gnssgroup` ( `active_time` int DEFAULT 6, `active_offset` int DEFAULT 0, `rs_adv` smallint DEFAULT 0, + `gnss_sample_s` smallint DEFAULT 1, `power_mode` smallint DEFAULT 0, `device_num` int DEFAULT 0, PRIMARY KEY (`id`) @@ -219,6 +220,7 @@ CREATE TABLE IF NOT EXISTS `gnsstrxmsg` ( `satelliteinuse` int DEFAULT 0, `fixnum` int DEFAULT NULL, `floatnum` int DEFAULT NULL, + `jumpcount` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; @@ -361,4 +363,31 @@ CREATE TABLE IF NOT EXISTS `simcards` ( UNIQUE KEY `uk_msisd` (`msisd`), INDEX `idx_deviceid` (`deviceid`), INDEX `idx_status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SIM卡信息表'; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SIM卡信息表'; + +CREATE TABLE IF NOT EXISTS `ehm` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenantid` int DEFAULT 0, + `deviceid` varchar(64) NOT NULL COMMENT '设备ID', + `createtime` datetime(3) NOT NULL COMMENT '创建时间', + `offlinestatdays` smallint DEFAULT NULL COMMENT '离线统计周期', + `offlinecount` int DEFAULT NULL COMMENT '离线统计周期内的离线次数', + `offlineminutes` int DEFAULT NULL COMMENT '离线统计周期内的离线时长', + `calcstathours` int DEFAULT NULL COMMENT '数据分析周期', + `stdeve` float DEFAULT NULL COMMENT '标准差', + `stdevn` float DEFAULT NULL COMMENT '标准差', + `stdevu` float DEFAULT NULL COMMENT '标准差', + `fixrate` float DEFAULT NULL COMMENT '固定率', + `validrate` float DEFAULT NULL COMMENT '有效解比例', + `jumpcount` int DEFAULT NULL COMMENT '周跳次数', + PRIMARY KEY (`id`), + KEY `idx_deviceid_createtime` (`deviceid`,`createtime`), + KEY `idx_createtime` (`createtime`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `ehmconfig` ( + `updatetime` datetime(3) NOT NULL COMMENT '更新时间', + `offlinestatdays` smallint DEFAULT NULL COMMENT '离线统计周期', + `calcstathours` int DEFAULT NULL COMMENT '数据分析周期', + PRIMARY KEY (`updatetime`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; 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 b8bf9bcb..c50fc81f 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_dev_cfg.html b/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html index dc065381..cb248163 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html @@ -41,6 +41,7 @@
@@ -123,7 +124,7 @@ {field: 'project_id', title: '项目号', width: 120, sort: true}, {field: 'sector', title: '桩号', width: 120, sort: true}, {field: 'name', title: '监测点号', width: 80}, - {field: 'devicetype', title: '类型', width: 80,templet: '#typeTrans'}, + {field: 'devicetype', title: '类型', width: 80,templet: "
{{d.devicetype==0?'监测站':'基准站'}}
"}, {field: 'group_id', title: '基本参数组', width: 60, sort: true}, {field: 'calc_group_id', title: '解算参数组', width: 60, sort: true}, {field: 'parentid', title: '基站编号', width: 80, sort: true}, @@ -256,14 +257,6 @@ } - - + + + + \ No newline at end of file diff --git a/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html b/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html index 0fc825fc..4d0158b3 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html @@ -54,6 +54,7 @@ {field: 'active_time', title: '激活时长(分钟)'}, {field: 'active_offset', title: '偏置(分钟)'}, {field: 'rs_adv', title: '基准站提前时间(分钟)'}, + {field: 'gnss_sample_s', title: 'GNSS上报(秒)'}, {field: 'power_mode', title: '功耗模式',templet: "
{{d.power_mode==0?'低功耗':'普通'}}
"}, {field: 'device_num', title: '关联设备数'}, {title: '操作', toolbar: '#currentTableBar', align: "center"} diff --git a/sec-beidou/src/main/resources/templates/page/table/gnss_add_group.html b/sec-beidou/src/main/resources/templates/page/table/gnss_add_group.html index 74c36702..b0805d6e 100644 --- a/sec-beidou/src/main/resources/templates/page/table/gnss_add_group.html +++ b/sec-beidou/src/main/resources/templates/page/table/gnss_add_group.html @@ -47,6 +47,12 @@ +
+ +
+ +
+
@@ -111,6 +117,7 @@ $('#rs_adv').val(data.rs_adv); $('#power_mode').val(data.power_mode); $('#name').val(data.name); + $('#gnss_sample_s').val(data.gnss_sample_s); form.render(); } diff --git a/sec-beidou/src/main/resources/templates/page/warning.html b/sec-beidou/src/main/resources/templates/page/warning.html index 5927b850..918b65cd 100644 --- a/sec-beidou/src/main/resources/templates/page/warning.html +++ b/sec-beidou/src/main/resources/templates/page/warning.html @@ -34,6 +34,12 @@
+
+ +
+ +
+