drone-service/drone-fw/src/main/java/org/sxkj/fw/cockpit/controller/CockpitController.java
@@ -10,6 +10,7 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.BeanUtil; import org.springframework.web.bind.annotation.*; import org.sxkj.fw.cockpit.service.ICockpitService; import org.sxkj.fw.cockpit.vo.AlarmStatisticsVO; import org.sxkj.fw.cockpit.vo.DeviceStatisticsVO; import org.sxkj.fw.detection.dto.FwEffectEvalDTO; @@ -25,6 +26,7 @@ import org.sxkj.fw.record.vo.FwDroneAlarmRecordVO; import javax.validation.Valid; import java.util.List; import java.util.Objects; /** @@ -39,11 +41,7 @@ @Api(value = "驾驶舱", tags = "数据驾驶舱") public class CockpitController { private final IFwDroneAlarmRecordService fwDroneAlarmRecordService; private final IFwDeviceService fwDeviceService; private final IFwEffectEvalService fwEffectEvalService; private final ICockpitService cockpitService; /** @@ -53,7 +51,7 @@ @ApiOperationSupport(order = 1) @ApiOperation(value = "历史告警/实时告警", notes = "传入fwDroneAlarmRecord") public R<IPage<FwDroneAlarmRecordVO>> page(FwDroneAlarmRecordDTO fwDroneAlarmRecord, Query query) { IPage<FwDroneAlarmRecordVO> pages = fwDroneAlarmRecordService.selectFwDroneAlarmRecordPage(Condition.getPage(query), fwDroneAlarmRecord); IPage<FwDroneAlarmRecordVO> pages = cockpitService.selectFwDroneAlarmRecordPage(Condition.getPage(query), fwDroneAlarmRecord); return R.data(pages); } @@ -64,7 +62,7 @@ @ApiOperationSupport(order = 2) @ApiOperation(value = "设备查询", notes = "传入fwDevice") public R<IPage<FwDeviceVO>> page(FwDeviceDTO fwDevice, Query query) { IPage<FwDeviceEntity> pages = fwDeviceService.selectFwDevicePage(Condition.getPage(query), fwDevice); IPage<FwDeviceEntity> pages = cockpitService.selectFwDevicePage(Condition.getPage(query), fwDevice); return R.data(FwDeviceWrapper.build().pageVO(pages)); } @@ -73,12 +71,9 @@ */ @GetMapping("/deviceStatistics") @ApiOperationSupport(order = 3) @ApiOperation(value = "设备统计", notes = "返回设备统计、无线电、光电、雷达等数据") public R<DeviceStatisticsVO> getDeviceStatistics() { DeviceStatisticsVO statistics = new DeviceStatisticsVO(); // 假设从服务层获取统计数据,这里仅示例填充数据 statistics.setDetectCount(3); statistics.setCountermeasuresCount(4); @ApiOperation(value = "设备统计", notes = "返回侦测设备,反制设备数量") public R<List<DeviceStatisticsVO>> getDeviceStatistics() { List<DeviceStatisticsVO> statistics = cockpitService.statisticalDeviceType(); return R.data(statistics); } @@ -89,15 +84,7 @@ @ApiOperationSupport(order = 4) @ApiOperation(value = "告警记录统计", notes = "返回实时告警、设备告警、历史告警数量") public R<AlarmStatisticsVO> getAlarmStatistics() { AlarmStatisticsVO statistics = new AlarmStatisticsVO(); // 假设从服务层获取统计数据,这里仅示例填充数据 statistics.setDeviceCount(5); statistics.setRadioCount(1); statistics.setOpticalCount(2); statistics.setRadarCount(2); statistics.setRealTimeAlarmCount(5); statistics.setDeviceAlarmCount(5); statistics.setHistoryAlarmCount(5); AlarmStatisticsVO statistics = cockpitService.statisticsAlarmsAndDeviceRecords(); return R.data(statistics); } @@ -109,6 +96,6 @@ @ApiOperation(value = "信号干扰,诱导驱离", notes = "传入fwEffectEval") public R submit(@Valid @RequestBody FwEffectEvalDTO fwEffectEval) { FwEffectEvalEntity fwEffectEvalEntity = Objects.requireNonNull(BeanUtil.copy(fwEffectEval, FwEffectEvalEntity.class)); return R.status(fwEffectEvalService.saveOrUpdate(fwEffectEvalEntity)); return R.status(cockpitService.saveOrUpdate(fwEffectEvalEntity)); } } drone-service/drone-fw/src/main/java/org/sxkj/fw/cockpit/service/ICockpitService.java
New file @@ -0,0 +1,50 @@ package org.sxkj.fw.cockpit.service; import com.baomidou.mybatisplus.core.metadata.IPage; import org.sxkj.fw.cockpit.vo.AlarmStatisticsVO; import org.sxkj.fw.cockpit.vo.DeviceStatisticsVO; import org.sxkj.fw.detection.entity.FwEffectEvalEntity; import org.sxkj.fw.device.dto.FwDeviceDTO; import org.sxkj.fw.device.entity.FwDeviceEntity; import org.sxkj.fw.record.dto.FwDroneAlarmRecordDTO; import org.sxkj.fw.record.vo.FwDroneAlarmRecordVO; import java.util.List; public interface ICockpitService { /** * 告警记录分页 * @param page * @param fwDroneAlarmRecord * @return */ IPage<FwDroneAlarmRecordVO> selectFwDroneAlarmRecordPage(IPage<FwDroneAlarmRecordVO> page, FwDroneAlarmRecordDTO fwDroneAlarmRecord); /** * 设备分页 * @param page * @param fwDevice * @return */ IPage<FwDeviceEntity> selectFwDevicePage(IPage<FwDeviceEntity> page, FwDeviceDTO fwDevice); /** * 设备类型统计 * @return */ List<DeviceStatisticsVO> statisticalDeviceType(); /** * 评估结果保存 * @param fwEffectEvalEntity * @return */ boolean saveOrUpdate(FwEffectEvalEntity fwEffectEvalEntity); /** * 告警记录和设备记录统计 * @return */ AlarmStatisticsVO statisticsAlarmsAndDeviceRecords(); } drone-service/drone-fw/src/main/java/org/sxkj/fw/cockpit/service/impl/CockpitServiceImpl.java
New file @@ -0,0 +1,64 @@ package org.sxkj.fw.cockpit.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.sxkj.fw.cockpit.service.ICockpitService; import org.sxkj.fw.cockpit.vo.AlarmStatisticsVO; import org.sxkj.fw.cockpit.vo.DeviceStatisticsVO; import org.sxkj.fw.detection.entity.FwEffectEvalEntity; import org.sxkj.fw.detection.service.IFwEffectEvalService; import org.sxkj.fw.device.dto.FwDeviceDTO; import org.sxkj.fw.device.entity.FwDeviceEntity; import org.sxkj.fw.device.service.IFwDeviceService; import org.sxkj.fw.record.dto.FwDroneAlarmRecordDTO; import org.sxkj.fw.record.service.IFwDroneAlarmRecordService; import org.sxkj.fw.record.vo.FwDroneAlarmRecordVO; import javax.annotation.Resource; import java.util.List; @Service public class CockpitServiceImpl implements ICockpitService { @Resource private IFwDroneAlarmRecordService fwDroneAlarmRecordService; @Resource private IFwDeviceService fwDeviceService; @Resource private IFwEffectEvalService fwEffectEvalService; @Override public IPage<FwDroneAlarmRecordVO> selectFwDroneAlarmRecordPage(IPage<FwDroneAlarmRecordVO> page, FwDroneAlarmRecordDTO fwDroneAlarmRecord) { return fwDroneAlarmRecordService.selectFwDroneAlarmRecordPage(page, fwDroneAlarmRecord); } @Override public IPage<FwDeviceEntity> selectFwDevicePage(IPage<FwDeviceEntity> page, FwDeviceDTO fwDevice) { return fwDeviceService.selectFwDevicePage(page, fwDevice); } @Override public List<DeviceStatisticsVO> statisticalDeviceType() { return fwDeviceService.statisticalDeviceType(); } @Override public boolean saveOrUpdate(FwEffectEvalEntity fwEffectEvalEntity) { return fwEffectEvalService.saveOrUpdate(fwEffectEvalEntity); } @Override public AlarmStatisticsVO statisticsAlarmsAndDeviceRecords() { // 设备统计 AlarmStatisticsVO alarmStatisticsVO = fwDeviceService.statisticalDeviceAtt(); // 告警统计 AlarmStatisticsVO alarmStatistics = fwDroneAlarmRecordService.alarmTypeStatistics(); alarmStatisticsVO.setHistoryAlarmCount(alarmStatistics.getHistoryAlarmCount()); alarmStatisticsVO.setRealTimeAlarmCount(alarmStatistics.getRealTimeAlarmCount()); return alarmStatisticsVO; } } drone-service/drone-fw/src/main/java/org/sxkj/fw/cockpit/vo/DeviceStatisticsVO.java
@@ -15,14 +15,14 @@ /** * 侦测设备数量 */ @ApiModelProperty(value = "侦测设备数量") private Integer detectCount; @ApiModelProperty(value = "类型") private String type; /** * 反制设备数量 */ @ApiModelProperty(value = "反制设备数量") private Integer countermeasuresCount; @ApiModelProperty(value = "数量") private Integer count; } drone-service/drone-fw/src/main/java/org/sxkj/fw/device/mapper/FwDeviceMapper.java
@@ -16,6 +16,8 @@ */ package org.sxkj.fw.device.mapper; import org.sxkj.fw.cockpit.vo.AlarmStatisticsVO; import org.sxkj.fw.cockpit.vo.DeviceStatisticsVO; import org.sxkj.fw.device.dto.FwDeviceDTO; import org.sxkj.fw.device.entity.FwDeviceEntity; import org.sxkj.fw.device.vo.FwDeviceVO; @@ -52,4 +54,15 @@ */ List<FwDeviceExcel> exportFwDevice(@Param("ew") Wrapper<FwDeviceEntity> queryWrapper); /** * 设备统计 * @return */ List<DeviceStatisticsVO> statisticalDeviceType(); /** * * @return */ AlarmStatisticsVO statisticalDeviceAtt(); } drone-service/drone-fw/src/main/java/org/sxkj/fw/device/mapper/FwDeviceMapper.xml
@@ -70,4 +70,55 @@ SELECT * FROM ja_fw_device ${ew.customSqlSegment} </select> <!-- 统计设备类型(察打一体同时计入侦测和反制) --> <select id="statisticalDeviceType" resultType="org.sxkj.fw.cockpit.vo.DeviceStatisticsVO"> SELECT CASE split_device_type -- 自定义排序(可选) WHEN '1' THEN '侦测设备' WHEN '2' THEN '反制设备' ELSE '其他' END AS type, COUNT(*) AS count FROM ( -- 子查询:拆分察打一体设备为侦测/反制两类 SELECT id, CASE WHEN device_type = '3' THEN '1' -- 察打一体拆分为侦测 ELSE device_type END AS split_device_type FROM ja_fw_device WHERE is_deleted = 0 -- 排除已删除数据 UNION ALL -- 合并拆分的反制部分 SELECT id, CASE WHEN device_type = '3' THEN '2' -- 察打一体拆分为反制 ELSE device_type END AS split_device_type FROM ja_fw_device WHERE is_deleted = 0 AND device_type != '3' -- 避免普通设备重复统计 ) AS temp GROUP BY split_device_type ORDER BY split_device_type </select> <!-- 查询设备总数 + 无线电/光电/雷达设备数量 --> <select id="statisticalDeviceAtt" resultType="org.sxkj.fw.cockpit.vo.AlarmStatisticsVO"> SELECT -- 设备统计总数 (SELECT COUNT(*) FROM ja_fw_device WHERE is_deleted = 0) AS deviceCount, -- 无线电设备数量 (SELECT COUNT(*) FROM ja_fw_device WHERE is_deleted = 0 AND device_att = '1') AS radioCount, -- 光电设备数量 (SELECT COUNT(*) FROM ja_fw_device WHERE is_deleted = 0 AND device_att = '2') AS opticalCount, -- 雷达设备数量 (SELECT COUNT(*) FROM ja_fw_device WHERE is_deleted = 0 AND device_att = '3') AS radarCount, -- 设备告警 (SELECT COUNT(*) FROM ja_fw_device WHERE is_deleted = 0 AND status = '2') AS deviceAlarmCount; </select> </mapper> drone-service/drone-fw/src/main/java/org/sxkj/fw/device/service/IFwDeviceService.java
@@ -17,6 +17,8 @@ package org.sxkj.fw.device.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import org.sxkj.fw.cockpit.vo.AlarmStatisticsVO; import org.sxkj.fw.cockpit.vo.DeviceStatisticsVO; import org.sxkj.fw.device.dto.FwDeviceDTO; import org.sxkj.fw.device.entity.FwDeviceEntity; import org.sxkj.fw.device.vo.FwDeviceVO; @@ -50,4 +52,15 @@ */ List<FwDeviceExcel> exportFwDevice(Wrapper<FwDeviceEntity> queryWrapper); /** * 设备类型统计 * @return */ List<DeviceStatisticsVO> statisticalDeviceType(); /** * * @return */ AlarmStatisticsVO statisticalDeviceAtt(); } drone-service/drone-fw/src/main/java/org/sxkj/fw/device/service/impl/FwDeviceServiceImpl.java
@@ -16,6 +16,8 @@ */ package org.sxkj.fw.device.service.impl; import org.sxkj.fw.cockpit.vo.AlarmStatisticsVO; import org.sxkj.fw.cockpit.vo.DeviceStatisticsVO; import org.sxkj.fw.device.dto.FwDeviceDTO; import org.sxkj.fw.device.entity.FwDeviceEntity; import org.sxkj.fw.device.vo.FwDeviceVO; @@ -52,4 +54,17 @@ return fwDeviceList; } /** * * @return */ @Override public List<DeviceStatisticsVO> statisticalDeviceType() { return baseMapper.statisticalDeviceType(); } @Override public AlarmStatisticsVO statisticalDeviceAtt() { return baseMapper.statisticalDeviceAtt(); } } drone-service/drone-fw/src/main/java/org/sxkj/fw/device/vo/FwDeviceVO.java
@@ -25,6 +25,7 @@ import org.sxkj.system.cache.SysCache; import java.io.Serializable; import java.math.BigDecimal; /** * 设备表 视图实体类 @@ -105,6 +106,32 @@ @ApiModelProperty("运行状态(0:在线/1:离线/2:故障/3:报废)") private Integer status; /** * 电量百分比 0-100 */ @ApiModelProperty(value = "电量百分比 0-100") private Byte batteryPct; /** * 方位角 0-360° */ @ApiModelProperty(value = "方位角 0-360°") private Short azimuth; /** * 俯仰角 -90-+90° */ @ApiModelProperty(value = "俯仰角 -90-+90°") private Short elevation; /** * 侦测目标数量 */ @ApiModelProperty(value = "侦测目标数量") private Integer detectTargetCnt; /** * 有效范围 km */ @ApiModelProperty(value = "有效范围 km") private BigDecimal effectiveRangeKm; @ApiModelProperty(value = "所属部门名称") public String getBelongDeptName() { if (belongDept == null) { drone-service/drone-fw/src/main/java/org/sxkj/fw/record/dto/FwDroneAlarmRecordDTO.java
@@ -56,7 +56,7 @@ /** * 无人机类型(微型机/植保机...) */ @ApiModelProperty(value = "无人机类型(微型机/植保机...)") @ApiModelProperty(value = "无人机类型(1.微型机/2.植保机...)") private String droneType; /** * 告警类型:实时告警/历史告警 @@ -77,7 +77,7 @@ /** * 飞行状态:侦测中/反制中 */ @ApiModelProperty(value = "飞行状态:侦测中/反制中") @ApiModelProperty(value = "飞行状态:1.侦测中/2.反制中") private String flightStatus; /** * 当前经度 @@ -112,7 +112,7 @@ /** * 反制方式:信号干扰/诱导驱离/无 */ @ApiModelProperty(value = "反制方式:信号干扰/诱导驱离/无") @ApiModelProperty(value = "反制方式:1.信号干扰/2.诱导驱离/无") private String counterWay; /** * 区域id ja_fw_area_divide drone-service/drone-fw/src/main/java/org/sxkj/fw/record/mapper/FwDroneAlarmRecordMapper.java
@@ -16,6 +16,7 @@ */ package org.sxkj.fw.record.mapper; import org.sxkj.fw.cockpit.vo.AlarmStatisticsVO; import org.sxkj.fw.record.dto.FwDroneAlarmRecordDTO; import org.sxkj.fw.record.entity.FwDroneAlarmRecordEntity; import org.sxkj.fw.record.vo.FwDroneAlarmRecordVO; @@ -52,4 +53,9 @@ */ List<FwDroneAlarmRecordExcel> exportFwDroneAlarmRecord(@Param("ew") Wrapper<FwDroneAlarmRecordEntity> queryWrapper); /** * 告警类型统计 * @return */ AlarmStatisticsVO alarmTypeStatistics(); } drone-service/drone-fw/src/main/java/org/sxkj/fw/record/mapper/FwDroneAlarmRecordMapper.xml
@@ -107,4 +107,11 @@ SELECT * FROM ja_fw_drone_alarm_record ${ew.customSqlSegment} </select> <select id="alarmTypeStatistics" resultType="org.sxkj.fw.cockpit.vo.AlarmStatisticsVO"> SELECT COUNT(CASE WHEN alarm_type = 1 THEN 1 END) AS realTimeAlarmCount, COUNT(CASE WHEN alarm_type = 2 THEN 2 END) AS historyAlarmCount FROM ja_fw_drone_alarm_record WHERE is_deleted = 0 </select> </mapper> drone-service/drone-fw/src/main/java/org/sxkj/fw/record/service/IFwDroneAlarmRecordService.java
@@ -17,6 +17,7 @@ package org.sxkj.fw.record.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import org.sxkj.fw.cockpit.vo.AlarmStatisticsVO; import org.sxkj.fw.record.dto.FwDroneAlarmRecordDTO; import org.sxkj.fw.record.entity.FwDroneAlarmRecordEntity; import org.sxkj.fw.record.vo.FwDroneAlarmRecordVO; @@ -50,4 +51,9 @@ */ List<FwDroneAlarmRecordExcel> exportFwDroneAlarmRecord(Wrapper<FwDroneAlarmRecordEntity> queryWrapper); /** * * @return */ AlarmStatisticsVO alarmTypeStatistics(); } drone-service/drone-fw/src/main/java/org/sxkj/fw/record/service/impl/FwDroneAlarmRecordServiceImpl.java
@@ -16,6 +16,7 @@ */ package org.sxkj.fw.record.service.impl; import org.sxkj.fw.cockpit.vo.AlarmStatisticsVO; import org.sxkj.fw.record.dto.FwDroneAlarmRecordDTO; import org.sxkj.fw.record.entity.FwDroneAlarmRecordEntity; import org.sxkj.fw.record.vo.FwDroneAlarmRecordVO; @@ -52,4 +53,12 @@ return fwDroneAlarmRecordList; } /** * 告警类型统计 * @return */ @Override public AlarmStatisticsVO alarmTypeStatistics() { return baseMapper.alarmTypeStatistics(); } } drone-service/drone-fw/src/main/java/org/sxkj/fw/record/vo/FwDroneAlarmRecordVO.java
@@ -58,12 +58,12 @@ /** * 无人机类型(微型机/植保机...) */ @ApiModelProperty(value = "无人机类型(微型机/植保机...)") @ApiModelProperty(value = "无人机类型(1.微型机/2.植保机...)") private String droneType; /** * 告警类型:实时告警/历史告警 */ @ApiModelProperty(value = "告警类型:实时告警/历史告警") @ApiModelProperty(value = "告警类型:1.实时告警/2.历史告警") private String alarmType; /** * 告警时间 @@ -79,7 +79,7 @@ /** * 飞行状态:侦测中/反制中 */ @ApiModelProperty(value = "飞行状态:侦测中/反制中") @ApiModelProperty(value = "飞行状态:1.侦测中/2.反制中") private String flightStatus; /** * 当前经度 @@ -114,7 +114,7 @@ /** * 反制方式:信号干扰/诱导驱离/无 */ @ApiModelProperty(value = "反制方式:信号干扰/诱导驱离/无") @ApiModelProperty(value = "反制方式:1.信号干扰/2.诱导驱离/3.无") private String counterWay; /** * 区域名称 @@ -130,7 +130,7 @@ /** * 设备类型(察打一体/便捷侦测箱/反制枪) */ @ApiModelProperty(value = "设备类型(察打一体/便捷侦测箱/反制枪)") @ApiModelProperty(value = "设备类型(1.便捷侦测箱/2.反制枪/3.察打一体)") private String deviceType;