1、增加健康检查页面

This commit is contained in:
weidong 2025-02-17 16:00:47 +08:00
parent 2461427314
commit 706eb20398
6 changed files with 284 additions and 14 deletions

View File

@ -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;

View File

@ -32,7 +32,7 @@ public class EhmTask{
/**
* 每半小时转发GNSS解算结果
*/
@Scheduled(cron = "0 24 * * * ?") // 每30分钟执行一次
@Scheduled(cron = "0 15 7 * * ?") // 每天7点15分钟执行一次
private void check() {
// 获取健康检查配置
List<EhmConfig> 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<WarningMsg> 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<WarningMsg> warningMsgList = warningMsgMapper.selectList(queryWrapper);
if(warningMsgList==null || warningMsgList.size()==0){
@ -115,7 +115,7 @@ public class EhmTask{
// 获取过去N小时的解算数据
QueryWrapper<GnssCalcData> 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<GnssCalcData> 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<GnssTrxMsg> 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<GnssTrxMsg> 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);
}
}

View File

@ -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<Ehm, Ehm> {
@Autowired
EhmMapper ehmMapper;
final List<String> sortItems = new ArrayList<>();
final List<String> 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<Ehm> getEntityClass() {
return Ehm.class;
}
/**
* 获取实体类对应的mybatis mapper
*
* @return 实体类对应的mybatis mapper
*/
@Override
public BaseMapper<Ehm> getMapper() {
return ehmMapper;
}
@Override
public String getOrderByColumn() {
return null;
}
/**
* 获取排序方式默认降序
*
* @return 排序方式
*/
@Override
public String getOrder() {
return null;
}
}

View File

@ -119,6 +119,13 @@ public interface CommonExcelService<T, R> {
}
}
String sortSql = getSortSql(search);
if(sortSql!=null){
queryWrapper.last(sortSql);
//String sql = queryWrapper.getSqlSegment();
//System.out.println(sql);
}
// 查询
IPage<R> cs = null;
if (isJoinSelect()) {
@ -182,6 +189,7 @@ public interface CommonExcelService<T, R> {
default void checkSearchParams(JSONObject search){}
default void checkSearchParams(Enumeration<String> enu){}
default String getSortSql(JSONObject search){return null;}
/**
* 设置查询条件

View File

@ -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",

View File

@ -0,0 +1,134 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>健康检查报告</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="../lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="" id="searchFrm">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">设备号</label>
<div class="layui-input-inline">
<input type="text" name="sl_deviceid" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline" >
<label class="layui-form-label">TopN排序方法</label>
<div class="layui-input-inline">
<select name="_sorttype" id="_sorttype" lay-search="">
<option th:each="item : ${sort_items}" th:text="${item}" th:value="${item}"></option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">范围</label>
<div class="layui-input-inline">
<input type="text" name="dgt_createtime" autocomplete="off" id="ID-laydate-start-date" class="layui-input" placeholder="开始日期">
</div>
<div class="layui-input-inline">
<input type="text" name="dlt_createtime" autocomplete="off" id="ID-laydate-end-date" class="layui-input" placeholder="结束日期">
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索</button>
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-export-btn"><i class="layui-icon">&#xe67d;</i>导出</button>
</div>
</div>
</form>
</div>
</fieldset>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
</div>
</div>
<script src="../lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script th:inline="javascript">
layui.use(['form', 'table', 'laydate'], function () {
var $ = layui.$;
var form = layui.form,
table = layui.table,
laydate = layui.laydate;
var cfg_cols = [
{field: 'deviceid', title: '设备号', width: 100},
{field: 'createtime', title: '创建时间', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'offlinestatdays', title: '离线统计周期(天)'},
{field: 'calcstathours', title: '数据分析周期(小时)'},
{field: 'offlinecount', title: '离线次数'},
{field: 'offlineminutes', title: '离线分钟数'},
{field: 'stdeve', title: '东标准差'},
{field: 'stdevn', title: '北标准差'},
{field: 'stdevu', title: '天标准差'},
{field: 'fixrate', title: '固定率%'},
{field: 'validrate', title: '有效率%'},
{field: 'jumpcount', title: '周跳次数'}
];
/**
* 初始化表单,要加上,不然刷新部分组件可能会不加载
*/
form.render();
laydate.render({
elem: '#ID-laydate-start-date',
type: 'datetime'
});
laydate.render({
elem: '#ID-laydate-end-date',
type: 'datetime'
});
table.render({
elem: '#currentTableId',
url: '/gnss/ehm/list',
toolbar: '#toolbarDemo',//开启头部工具栏
defaultToolbar: ['filter'],
cols: [
cfg_cols
],
limits: [50, 100, 200, 300],
limit: 50,
page: true,
skin: 'line'
});
// 监听搜索操作
form.on('submit(data-search-btn)', function (data) {
var result = JSON.stringify(data.field);
//执行搜索重载
table.reload('currentTableId', {
page: {
curr: 1
}
, where: {
searchParams: result
}
}, 'data');
return false;
});
// 监听导出操作
form.on('submit(data-export-btn)', function (data) {
var result = $('#searchFrm').serialize();
var u = "/gnss/ehm/export?" + result;
window.open(u, "_blank");
return false;
});
});
</script>
</body>
</html>