1、增加健康检查页面
This commit is contained in:
parent
2461427314
commit
706eb20398
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;}
|
||||
|
||||
/**
|
||||
* 设置查询条件
|
||||
|
||||
@ -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",
|
||||
|
||||
134
sec-beidou/src/main/resources/templates/page/gnss_ehm.html
Normal file
134
sec-beidou/src/main/resources/templates/page/gnss_ehm.html
Normal 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"></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>
|
||||
Loading…
x
Reference in New Issue
Block a user