feat(alarm): 更新报警记录查询功能并增加消防设备状态统计

dev_visual_page
zhaokai 2026-07-23 10:05:56 +08:00
parent 07f618d91f
commit 153e42423f
14 changed files with 270 additions and 64 deletions

View File

@ -3,18 +3,32 @@ package com.zcloud.web;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.api.SensorDeviceServiceI;
import com.zcloud.dto.*;
import com.zcloud.dto.SensorDeviceAddCmd;
import com.zcloud.dto.SensorDeviceFireSituationQry;
import com.zcloud.dto.SensorDeviceLocationCmd;
import com.zcloud.dto.SensorDevicePageQry;
import com.zcloud.dto.SensorDeviceScreenQry;
import com.zcloud.dto.SensorDeviceThresholdCmd;
import com.zcloud.dto.SensorDeviceUpdateCmd;
import com.zcloud.dto.clientobject.SensorDeviceCO;
import com.zcloud.dto.clientobject.SensorDeviceFireSituationCO;
import com.zcloud.dto.clientobject.SensorDeviceScreenCO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* SensorDeviceController -
*
*
* @Author wangyan
* @Date 2026-04-03 00:00:00
*/
@ -23,75 +37,70 @@ import org.springframework.web.bind.annotation.*;
@RestController
@AllArgsConstructor
public class SensorDeviceController {
private final SensorDeviceServiceI sensorDeviceService;
private final SensorDeviceServiceI sensorDeviceService;
@ApiOperation("新增")
@PostMapping("/save")
// @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-add')")
public SingleResponse<String> save(@Validated @RequestBody SensorDeviceAddCmd cmd) {
return sensorDeviceService.add(cmd);
}
@ApiOperation("新增")
@PostMapping("/save")
public SingleResponse<String> save(@Validated @RequestBody SensorDeviceAddCmd cmd) {
return sensorDeviceService.add(cmd);
}
@ApiOperation("分页列表")
@PostMapping("/list")
// @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-list')")
public PageResponse<SensorDeviceCO> list(@RequestBody SensorDevicePageQry qry) {
return sensorDeviceService.listPage(qry);
}
@ApiOperation("分页列表")
@PostMapping("/list")
public PageResponse<SensorDeviceCO> list(@RequestBody SensorDevicePageQry qry) {
return sensorDeviceService.listPage(qry);
}
@ApiOperation("修改")
@PostMapping("/edit")
public SingleResponse edit(@Validated @RequestBody SensorDeviceUpdateCmd cmd) {
sensorDeviceService.edit(cmd);
return SingleResponse.buildSuccess();
}
@ApiOperation("定位")
@PostMapping("/location")
public SingleResponse location(@Validated @RequestBody SensorDeviceLocationCmd cmd) {
sensorDeviceService.location(cmd);
return SingleResponse.buildSuccess();
}
@ApiOperation("状态切换")
@PutMapping("/status")
public SingleResponse updateStatus(@RequestParam Long id, @RequestParam String status) {
sensorDeviceService.updateStatus(id, status);
return SingleResponse.buildSuccess();
}
@ApiOperation("阈值配置")
@PutMapping("/threshold")
public SingleResponse updateThreshold(@Validated @RequestBody SensorDeviceThresholdCmd cmd) {
sensorDeviceService.updateThreshold(cmd);
return SingleResponse.buildSuccess();
}
@ApiOperation("修改")
@PostMapping("/edit")
// @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-edit')")
public SingleResponse edit(@Validated @RequestBody SensorDeviceUpdateCmd cmd) {
sensorDeviceService.edit(cmd);
return SingleResponse.buildSuccess();
}
@ApiOperation("删除")
@PostMapping("/{id}")
public SingleResponse remove(@PathVariable("id") Long id) {
sensorDeviceService.remove(id);
return SingleResponse.buildSuccess();
}
@ApiOperation("定位")
@PostMapping("/location")
// @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-edit')")
public SingleResponse location(@Validated @RequestBody SensorDeviceLocationCmd cmd) {
sensorDeviceService.location(cmd);
return SingleResponse.buildSuccess();
}
@ApiOperation("状态切换")
@PutMapping("/status")
// @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-edit')")
public SingleResponse updateStatus(@RequestParam Long id, @RequestParam String status) {
sensorDeviceService.updateStatus(id, status);
return SingleResponse.buildSuccess();
}
@ApiOperation("阈值配置")
@PutMapping("/threshold")
// @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-edit')")
public SingleResponse updateThreshold(@Validated @RequestBody SensorDeviceThresholdCmd cmd) {
sensorDeviceService.updateThreshold(cmd);
return SingleResponse.buildSuccess();
}
@ApiOperation("删除")
@PostMapping("/{id}")
// @PreAuthorize("@pms.hasAnyPermission('iotalarm-sensordevice-delete')")
public SingleResponse remove(@PathVariable("id") Long id) {
sensorDeviceService.remove(id);
return SingleResponse.buildSuccess();
}
@ApiOperation("详情")
@GetMapping("/{id}")
public SingleResponse<SensorDeviceCO> info(@PathVariable("id") Long id) {
return sensorDeviceService.info(id);
}
@ApiOperation("详情")
@GetMapping("/{id}")
public SingleResponse<SensorDeviceCO> info(@PathVariable("id") Long id) {
return sensorDeviceService.info(id);
}
@ApiOperation("可视化大屏-传感器设备查询")
@PostMapping("/screenList")
public PageResponse<SensorDeviceScreenCO> screenList(@RequestBody SensorDeviceScreenQry qry) {
return sensorDeviceService.screenList(qry);
}
@ApiOperation("可视化大屏-消防设备情况")
@PostMapping("/fireSituation")
public SingleResponse<SensorDeviceFireSituationCO> fireSituation(@RequestBody SensorDeviceFireSituationQry qry) {
return sensorDeviceService.fireSituation(qry);
}
}

View File

@ -4,9 +4,13 @@ import cn.hutool.core.bean.BeanUtil;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.domain.enums.SensorDeviceStatusEnum;
import com.zcloud.dto.SensorDeviceFireSituationQry;
import com.zcloud.dto.SensorDevicePageQry;
import com.zcloud.dto.SensorDeviceScreenQry;
import com.zcloud.dto.clientobject.SensorDeviceCO;
import com.zcloud.dto.clientobject.SensorDeviceFireSituationCO;
import com.zcloud.dto.clientobject.SensorDeviceFireStatusCO;
import com.zcloud.dto.clientobject.SensorDeviceScreenCO;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import com.zcloud.persistence.dataobject.SensorDeviceDO;
@ -17,6 +21,8 @@ import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* SensorDeviceQueryExe -
@ -43,6 +49,35 @@ public class SensorDeviceQueryExe {
return PageResponse.of(pageResponse.getData(), pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
public SingleResponse<SensorDeviceFireSituationCO> fireSituation(SensorDeviceFireSituationQry qry) {
Map<String, Object> params = PageQueryHelper.toHashMap(qry);
List<SensorDeviceFireStatusCO> countList = sensorDeviceRepository.fireSituation(params);
Map<String, SensorDeviceFireStatusCO> countMap = countList.stream()
.collect(Collectors.toMap(SensorDeviceFireStatusCO::getBianma, Function.identity(), (left, right) -> left));
List<SensorDeviceFireStatusCO> statusList = java.util.Arrays.stream(SensorDeviceStatusEnum.values())
.map(item -> {
SensorDeviceFireStatusCO statusItem = new SensorDeviceFireStatusCO();
statusItem.setBianma(item.getCode());
statusItem.setName(item.getName());
SensorDeviceFireStatusCO countItem = countMap.get(item.getCode());
statusItem.setCount(countItem == null ? 0L : countItem.getCount());
return statusItem;
})
.collect(Collectors.toList());
long totalCount = countList.stream()
.map(SensorDeviceFireStatusCO::getCount)
.filter(java.util.Objects::nonNull)
.mapToLong(Long::longValue)
.sum();
SensorDeviceFireSituationCO co = new SensorDeviceFireSituationCO();
co.setTotalCount(totalCount);
co.setStatusList(statusList);
return SingleResponse.of(co);
}
public SingleResponse<SensorDeviceCO> getById(Long id) {
SensorDeviceDO d = sensorDeviceRepository.getById(id);
if (d == null || "TRUE".equals(d.getDeleteEnum())) {

View File

@ -11,6 +11,7 @@ import com.zcloud.command.query.SensorDeviceQueryExe;
import com.zcloud.command.SensorDeviceAddExe;
import com.zcloud.dto.*;
import com.zcloud.dto.clientobject.SensorDeviceCO;
import com.zcloud.dto.clientobject.SensorDeviceFireSituationCO;
import com.zcloud.dto.clientobject.SensorDeviceScreenCO;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@ -36,6 +37,11 @@ public class SensorDeviceServiceImpl implements SensorDeviceServiceI {
return sensorDeviceQueryExe.screenList(qry);
}
@Override
public SingleResponse<SensorDeviceFireSituationCO> fireSituation(SensorDeviceFireSituationQry qry) {
return sensorDeviceQueryExe.fireSituation(qry);
}
@Override
public SingleResponse add(SensorDeviceAddCmd cmd) {
sensorDeviceAddExe.execute(cmd);

View File

@ -4,6 +4,7 @@ import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.dto.*;
import com.zcloud.dto.clientobject.SensorDeviceCO;
import com.zcloud.dto.clientobject.SensorDeviceFireSituationCO;
import com.zcloud.dto.clientobject.SensorDeviceScreenCO;
/**
@ -22,6 +23,8 @@ public interface SensorDeviceServiceI {
PageResponse<SensorDeviceScreenCO> screenList(SensorDeviceScreenQry qry);
SingleResponse<SensorDeviceFireSituationCO> fireSituation(SensorDeviceFireSituationQry qry);
/**
*
* @param cmd

View File

@ -0,0 +1,20 @@
package com.zcloud.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
*
*
* @Author wangyan
* @Date 2026-07-23
*/
@Data
public class SensorDeviceFireSituationQry {
@ApiModelProperty(value = "企业id", name = "corpinfoId")
private Long corpinfoId;
@ApiModelProperty(value = "港区1:秦皇岛港区,2:秦皇岛东,3:秦皇岛西", name = "portArea")
private Integer portArea;
}

View File

@ -1,9 +1,12 @@
package com.zcloud.dto.clientobject;
import com.alibaba.cola.dto.ClientObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
*
*
@ -22,6 +25,9 @@ public class AlarmRecordScreenCO extends ClientObject {
@ApiModelProperty(value = "所属单位名称")
private String corpName;
@ApiModelProperty(value = "报警区域")
private String fireRegionName;
@ApiModelProperty(value = "报警类型")
private String alarmType;
@ -30,4 +36,14 @@ public class AlarmRecordScreenCO extends ClientObject {
@ApiModelProperty(value = "处置状态10报警中20未处置30已消警")
private Integer status;
@ApiModelProperty(value = "报警时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime alarmTime;
@ApiModelProperty(value = "设备状态")
private String sensorStatus;
@ApiModelProperty(value = "设备状态名称")
private String sensorStatusName;
}

View File

@ -0,0 +1,23 @@
package com.zcloud.dto.clientobject;
import com.alibaba.cola.dto.ClientObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
*
*
* @Author wangyan
* @Date 2026-07-23
*/
@Data
public class SensorDeviceFireSituationCO extends ClientObject {
@ApiModelProperty(value = "设备总数")
private Long totalCount;
@ApiModelProperty(value = "状态统计列表")
private List<SensorDeviceFireStatusCO> statusList;
}

View File

@ -0,0 +1,24 @@
package com.zcloud.dto.clientobject;
import com.alibaba.cola.dto.ClientObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
*
*
* @Author wangyan
* @Date 2026-07-23
*/
@Data
public class SensorDeviceFireStatusCO extends ClientObject {
@ApiModelProperty(value = "编码")
private String bianma;
@ApiModelProperty(value = "名称")
private String name;
@ApiModelProperty(value = "数量")
private Long count;
}

View File

@ -0,0 +1,31 @@
package com.zcloud.domain.enums;
import lombok.Getter;
import java.util.Arrays;
/**
*
*/
@Getter
public enum SensorDeviceStatusEnum {
NORMAL("NORMAL", "正常"),
FAULT("FAULT", "故障"),
OFFLINE("OFFLINE", "离线"),
DEACTIVATE("deactivate", "停用");
private final String code;
private final String name;
SensorDeviceStatusEnum(String code, String name) {
this.code = code;
this.name = name;
}
public static SensorDeviceStatusEnum getByCode(String code) {
return Arrays.stream(values())
.filter(item -> item.code.equals(code))
.findFirst()
.orElse(null);
}
}

View File

@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.datascope.annotation.DataScope;
import com.jjb.saas.framework.datascope.annotation.DataScopes;
import com.zcloud.dto.clientobject.SensorDeviceFireStatusCO;
import com.zcloud.dto.clientobject.SensorDeviceScreenCO;
import com.zcloud.persistence.dataobject.SensorDeviceDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
@ -26,4 +28,6 @@ public interface SensorDeviceMapper extends BaseMapper<SensorDeviceDO> {
IPage<SensorDeviceDO> listPage(IPage<SensorDeviceDO> page, @Param("params") Map<String, Object> params, @Param("menuPerms") String menuPerms);
IPage<SensorDeviceScreenCO> screenList(IPage<SensorDeviceScreenCO> page, @Param("params") Map<String, Object> params);
List<SensorDeviceFireStatusCO> fireSituation(@Param("params") Map<String, Object> params);
}

View File

@ -2,9 +2,11 @@ package com.zcloud.persistence.repository;
import com.alibaba.cola.dto.PageResponse;
import com.jjb.saas.framework.repository.repo.BaseRepository;
import com.zcloud.dto.clientobject.SensorDeviceFireStatusCO;
import com.zcloud.dto.clientobject.SensorDeviceScreenCO;
import com.zcloud.persistence.dataobject.SensorDeviceDO;
import java.util.List;
import java.util.Map;
/**
@ -17,4 +19,6 @@ public interface SensorDeviceRepository extends BaseRepository<SensorDeviceDO> {
PageResponse<SensorDeviceDO> listPage(Map<String, Object> params);
PageResponse<SensorDeviceScreenCO> screenList(Map<String, Object> params);
List<SensorDeviceFireStatusCO> fireSituation(Map<String, Object> params);
}

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jjb.saas.framework.repository.common.PageHelper;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import com.zcloud.domain.enums.MenuEnum;
import com.zcloud.dto.clientobject.SensorDeviceFireStatusCO;
import com.zcloud.dto.clientobject.SensorDeviceScreenCO;
import com.zcloud.persistence.dataobject.SensorDeviceDO;
import com.zcloud.persistence.mapper.SensorDeviceMapper;
@ -13,6 +14,7 @@ import com.zcloud.utils.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
@ -43,4 +45,9 @@ public class SensorDeviceRepositoryImpl extends BaseRepositoryImpl<SensorDeviceM
IPage<SensorDeviceScreenCO> result = sensorDeviceMapper.screenList(page, params);
return PageHelper.pageToResponse(result, result.getRecords());
}
@Override
public List<SensorDeviceFireStatusCO> fireSituation(Map<String, Object> params) {
return sensorDeviceMapper.fireSituation(params);
}
}

View File

@ -122,16 +122,22 @@
ELSE ar.alarm_source
END AS alarmSourceName,
ci.corp_name AS corpName,
fr.fire_region_name AS fireRegionName,
ar.alarm_type AS alarmType,
ar.alarm_type_name AS alarmTypeName,
ar.status AS status
ar.status AS status,
ar.alarm_time AS alarmTime,
iasd.sensor_status AS sensorStatus,
iasd.sensor_status_name AS sensorStatusName
FROM iot_alarm_record ar
LEFT JOIN corp_info ci ON ar.tenant_id = ci.id
left join iot_alarm_sensor_device iasd on iasd.sensor_device_id = ar.sensor_device_id and iasd.delete_enum='FALSE'
LEFT JOIN corp_info ci ON iasd.tenant_id = ci.id
LEFT JOIN fire_region fr ON ar.fire_region_id = fr.fire_region_id AND fr.delete_enum = 'FALSE'
<where>
ar.delete_enum = 'FALSE'
AND ar.status != 40
<if test="params.corpinfoId != null">
AND ar.corpinfo_id = #{params.corpinfoId}
AND iasd.tenant_id = #{params.corpinfoId}
</if>
</where>
ORDER BY ar.alarm_time DESC

View File

@ -57,4 +57,22 @@
</where>
ORDER BY CASE WHEN sd.sensor_status = 'NORMAL' AND sd.alarm_switch = 1 THEN 0 ELSE 1 END, sd.create_time DESC
</select>
<select id="fireSituation" resultType="com.zcloud.dto.clientobject.SensorDeviceFireStatusCO">
SELECT
sd.sensor_status AS bianma,
COUNT(1) AS count
FROM iot_alarm_sensor_device sd
LEFT JOIN corp_info ci ON sd.tenant_id = ci.id AND ci.delete_enum = 'FALSE'
<where>
sd.delete_enum = 'FALSE'
<if test="params.corpinfoId != null">
AND sd.tenant_id = #{params.corpinfoId}
</if>
<if test="params.portArea != null">
AND ci.port_area = #{params.portArea}
</if>
</where>
GROUP BY sd.sensor_status
</select>
</mapper>