From 39caedce902f8441dde5dc205508da90280d93f3 Mon Sep 17 00:00:00 2001 From: weidong Date: Tue, 18 Feb 2025 12:33:23 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=81=A5=E5=BA=B7=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9F=BA=E7=AB=99/=E6=B5=8B=E7=AB=99/?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=9E=8B=E5=8F=B7=202=E3=80=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=BB=A4=E6=B3=A2=E7=BB=93=E6=9E=9C=E8=B7=B3=E5=8F=98?= =?UTF-8?q?=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/imdroid/secapi/dto/EhmJoin.java | 36 ++++++++++++++++++ .../com/imdroid/secapi/dto/EhmMapper.java | 4 +- .../imdroid/secapi/dto/GnssStatusJoin.java | 2 + .../imdroid/secapi/dto/GnssStatusMapper.java | 12 +++--- .../com/imdroid/secapi/dto/WarningCfg.java | 2 + .../calc/SingleLineGNSSCalcService.java | 6 +++ .../D3F2StopIndicationMessageExecutor.java | 1 + .../sideslope/service/WarningService.java | 4 +- .../sideslope/service/WarningServiceImpl.java | 38 ++++++++++++++++++- .../beidou/controller/GnssEhmController.java | 31 +++++++++++++-- .../beidou/service/CommonExcelService.java | 4 +- .../templates/page/gnss_dev_cfg.html | 10 +---- .../resources/templates/page/gnss_ehm.html | 16 +++++++- 13 files changed, 138 insertions(+), 28 deletions(-) create mode 100644 sec-api/src/main/java/com/imdroid/secapi/dto/EhmJoin.java 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 index edb9657a..141f3d17 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/EhmMapper.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/EhmMapper.java @@ -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 { +public interface EhmMapper extends MPJBaseMapper { } 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/WarningCfg.java b/sec-api/src/main/java/com/imdroid/secapi/dto/WarningCfg.java index 2b4970fb..375d97a4 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 @@ -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; //正常 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 7e72baac..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 @@ -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); } } + } 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 180b9e52..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 @@ -71,6 +71,7 @@ public class D3F2StopIndicationMessageExecutor implements Executor { 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..63e81d4a 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,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); } 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 f676fb88..ad676c56 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 @@ -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 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); + } + } + } + } } 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 5e315112..0ed4abc7 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 @@ -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 { +public class GnssEhmController extends BasicController implements CommonExcelService { + 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 getEntityClass() { - return Ehm.class; + public Class getEntityClass() { + return EhmJoin.class; } /** @@ -123,4 +127,23 @@ public class GnssEhmController extends BasicController implements CommonExcelSer 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/service/CommonExcelService.java b/sec-beidou/src/main/java/com/imdroid/beidou/service/CommonExcelService.java index 514dc118..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 @@ -203,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/templates/page/gnss_dev_cfg.html b/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html index dc065381..fa00929c 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 @@ -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: "
{{d.model==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 +256,6 @@ } - -