1、健康检查增加基站/测站/设备型号
2、增加滤波结果跳变检查
This commit is contained in:
parent
62f45f3fac
commit
39caedce90
36
sec-api/src/main/java/com/imdroid/secapi/dto/EhmJoin.java
Normal file
36
sec-api/src/main/java/com/imdroid/secapi/dto/EhmJoin.java
Normal file
@ -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;
|
||||
}
|
||||
@ -1,8 +1,8 @@
|
||||
package com.imdroid.secapi.dto;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.github.yulichang.base.MPJBaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface EhmMapper extends BaseMapper<Ehm> {
|
||||
public interface EhmMapper extends MPJBaseMapper<Ehm> {
|
||||
}
|
||||
|
||||
@ -76,6 +76,8 @@ public class GnssStatusJoin {
|
||||
|
||||
@ExcelProperty("设备类型")
|
||||
Short devicetype;
|
||||
@ExcelProperty("设备型号")
|
||||
Short model;
|
||||
|
||||
@ExcelIgnore
|
||||
Integer group_id;
|
||||
|
||||
@ -19,26 +19,26 @@ public interface GnssStatusMapper extends MPJBaseMapper<GnssStatus> {
|
||||
@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<GnssStatusJoin> 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<GnssStatusJoin> 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<GnssStatusJoin> 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<GnssStatusJoin> 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();
|
||||
}
|
||||
|
||||
@ -42,6 +42,8 @@ public class WarningCfg {
|
||||
public static final String TYPE_NAME_CONT_INVALID_RESULT = "长时间无有效解";
|
||||
public static final int TYPE_INCLINE = 0x400;
|
||||
public static final String TYPE_NAME_INCLINE = "异常倾斜";
|
||||
public static final int TYPE_JUMP = 0x800;
|
||||
public static final String TYPE_NAME_JUMP = "滤波结果跳变";
|
||||
|
||||
// warning level definition
|
||||
public static final short LEVEL_0 = 0; //正常
|
||||
|
||||
@ -279,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);
|
||||
}
|
||||
}
|
||||
|
||||
// 记录本次位置,作为下次的参考
|
||||
@ -380,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);
|
||||
@ -406,4 +411,5 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService {
|
||||
deviceChannel.writeAndFlush(buf);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -71,6 +71,7 @@ public class D3F2StopIndicationMessageExecutor implements Executor<D3F2StopIndic
|
||||
gnssTrxMsg.setSatelliteinuse(device.getSatelitesInUse());
|
||||
gnssTrxMsg.setFixnum(device.getFixedNum());
|
||||
gnssTrxMsg.setFloatnum(device.getFloatNum());
|
||||
gnssTrxMsg.setJumpcount(device.getJumpCount());
|
||||
|
||||
// 储设备收发字节数统计信息
|
||||
ThreadManager.getFixedThreadPool().submit(() -> {
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
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;
|
||||
@ -22,6 +23,5 @@ public interface WarningService {
|
||||
/***
|
||||
* 检查未知报文是否较多
|
||||
*/
|
||||
void checkTrx(GnssTrxMsg msg, GnssStatus curStatus);
|
||||
|
||||
void checkFilteredResultJump(double[] latestRpos, GnssCalcData locationRecord);
|
||||
}
|
||||
|
||||
@ -28,7 +28,8 @@ public class WarningServiceImpl implements WarningService {
|
||||
WarningMsgMapper warningMsgMapper;
|
||||
@Autowired
|
||||
GnssStatusMapper gnssStatusMapper;
|
||||
|
||||
@Autowired
|
||||
GnssDeviceMapper deviceMapper;
|
||||
@Value("${warning.log.directory}")
|
||||
private String logDirectory;
|
||||
|
||||
@ -290,4 +291,39 @@ public class WarningServiceImpl implements WarningService {
|
||||
warningMsgMapper.updateById(warningMsg);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkFilteredResultJump(double[] latestRpos, GnssCalcData locationRecord){
|
||||
if(Math.abs(locationRecord.getRpose()-latestRpos[0])>2 ||
|
||||
Math.abs(locationRecord.getRposn()-latestRpos[1])>2 ||
|
||||
Math.abs(locationRecord.getRposd()-latestRpos[2])>4){
|
||||
// 停止推送
|
||||
QueryWrapper<GnssDevice> 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(WarningCfg.TYPE_JUMP);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@ 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;
|
||||
@ -15,6 +16,7 @@ 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;
|
||||
|
||||
@ -26,7 +28,8 @@ import java.util.List;
|
||||
*/
|
||||
@Controller
|
||||
@RequiredArgsConstructor
|
||||
public class GnssEhmController extends BasicController implements CommonExcelService<Ehm, Ehm> {
|
||||
public class GnssEhmController extends BasicController implements CommonExcelService<Ehm, EhmJoin> {
|
||||
final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
@Autowired
|
||||
EhmMapper ehmMapper;
|
||||
@ -47,6 +50,7 @@ public class GnssEhmController extends BasicController implements CommonExcelSer
|
||||
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";
|
||||
}
|
||||
|
||||
@ -54,7 +58,7 @@ public class GnssEhmController extends BasicController implements CommonExcelSer
|
||||
@ResponseBody
|
||||
public JSONObject listTrxMsg(HttpSession session, int page, int limit, String searchParams) {
|
||||
if(searchParams==null){
|
||||
searchParams = "{'dgt_createtime':'"+ LocalDateTime.now().minusDays(1)+"','_sorttype':'离线次数'}";
|
||||
searchParams = "{'dgt_t.createtime':'"+ LocalDateTime.now().minusDays(1)+"','_sorttype':'离线次数'}";
|
||||
}
|
||||
return this.pageList(session, page, limit, searchParams);
|
||||
}
|
||||
@ -95,8 +99,8 @@ public class GnssEhmController extends BasicController implements CommonExcelSer
|
||||
* @return 实体类的class
|
||||
*/
|
||||
@Override
|
||||
public Class<Ehm> getEntityClass() {
|
||||
return Ehm.class;
|
||||
public Class<EhmJoin> getEntityClass() {
|
||||
return EhmJoin.class;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -123,4 +127,23 @@ public class GnssEhmController extends BasicController implements CommonExcelSer
|
||||
public String getOrder() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MPJQueryWrapper<Ehm> prepareQueryWrapper() {
|
||||
return new MPJQueryWrapper<Ehm>()
|
||||
.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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -203,9 +203,9 @@ public interface CommonExcelService<T, R> {
|
||||
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)) {
|
||||
|
||||
@ -123,7 +123,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: "<div>{{d.model==0?'监测站':'基准站'}}</div>"},
|
||||
{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 +256,6 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="typeTrans">
|
||||
{{# if(d.devicetype == 1){ }}
|
||||
<span>基准站</span>
|
||||
{{# } else { }}
|
||||
<span>监测站</span>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="modeTrans">
|
||||
{{# if(d.opmode == 0){ }}
|
||||
<span class="layui-badge layui-bg-green">正常</span>
|
||||
|
||||
@ -24,6 +24,16 @@
|
||||
<input type="text" name="sl_deviceid" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">设备类型</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="n_d.devicetype" id="n_d.devicetype" lay-search="">
|
||||
<option value="-1">全部</option>
|
||||
<option value="0">监测站</option>
|
||||
<option value="1">基准站</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline" >
|
||||
<label class="layui-form-label">TopN排序</label>
|
||||
<div class="layui-input-inline">
|
||||
@ -35,10 +45,10 @@
|
||||
<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="开始日期">
|
||||
<input type="text" name="dgt_t.createtime" autocomplete="off" id="ID-laydate-start-date" class="layui-input" placeholder="开始日期" th:value="${begin_time}">
|
||||
</div>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="dlt_createtime" autocomplete="off" id="ID-laydate-end-date" class="layui-input" placeholder="结束日期">
|
||||
<input type="text" name="dlt_t.createtime" autocomplete="off" id="ID-laydate-end-date" class="layui-input" placeholder="结束日期">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
@ -63,6 +73,8 @@
|
||||
|
||||
var cfg_cols = [
|
||||
{field: 'deviceid', title: '设备号', width: 100},
|
||||
{field: 'devicetype', title: '类型', width: 80,templet: "<div>{{d.devicetype==0?'监测站':'基准站'}}</div>"},
|
||||
{field: 'model', title: '型号', width: 80,templet: "<div>{{d.model==0?'G505':'G510'}}</div>"},
|
||||
{field: 'createtime', title: '创建时间', templet: "<div>{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
|
||||
{field: 'offlinestatdays', title: '离线统计周期(天)'},
|
||||
{field: 'calcstathours', title: '数据分析周期(小时)'},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user