报警统计相关接口

master
aosodo_4812 2026-09-02 17:46:52 +08:00
parent a0d2ac0215
commit 2e8c7daea6
13 changed files with 383 additions and 0 deletions

View File

@ -0,0 +1,38 @@
package com.zcloud.gbs.edgeguard.web;
import com.alibaba.cola.dto.PageResponse;
import com.zcloud.gbs.edgeguard.api.AlarmStatisticServiceI;
import com.zcloud.gbs.edgeguard.dto.AlarmCorpStatisticQry;
import com.zcloud.gbs.edgeguard.dto.AlarmRegionStatisticQry;
import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmCorpStatisticCo;
import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmRegionStatisticCo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "报警统计")
@RestController
@RequestMapping("/edgeguard/alarm-statistics")
@RequiredArgsConstructor
public class AlarmStatisticController {
private final AlarmStatisticServiceI statisticService;
@ApiOperation("按企业统计报警")
@PostMapping("/corporations")
public PageResponse<AlarmCorpStatisticCo> corporations(
@Validated @RequestBody AlarmCorpStatisticQry qry) {
return statisticService.corporations(qry);
}
@ApiOperation("按区域统计报警")
@PostMapping("/regions")
public PageResponse<AlarmRegionStatisticCo> regions(
@Validated @RequestBody AlarmRegionStatisticQry qry) {
return statisticService.regions(qry);
}
}

View File

@ -0,0 +1,81 @@
package com.zcloud.gbs.edgeguard.command.query;
import com.alibaba.cola.dto.PageResponse;
import com.zcloud.gbs.edgeguard.command.RegionAccessService;
import com.zcloud.gbs.edgeguard.domain.gateway.AlarmStatisticGateway;
import com.zcloud.gbs.edgeguard.domain.model.AlarmStatisticE;
import com.zcloud.gbs.edgeguard.domain.model.CorpE;
import com.zcloud.gbs.edgeguard.dto.AlarmCorpStatisticQry;
import com.zcloud.gbs.edgeguard.dto.AlarmRegionStatisticQry;
import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmCorpStatisticCo;
import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmRegionStatisticCo;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Component
@RequiredArgsConstructor
public class AlarmStatisticQueryExe {
private final AlarmStatisticGateway statisticGateway;
private final RegionAccessService accessService;
public PageResponse<AlarmCorpStatisticCo> corporations(AlarmCorpStatisticQry qry) {
List<CorpE> accessibleCorps = accessService.accessibleCorps();
if (qry.getCorpId() != null) {
CorpE corp = accessService.requireAccessibleCorp(qry.getCorpId());
accessibleCorps = Collections.singletonList(corp);
}
if (accessibleCorps.isEmpty()) {
return PageResponse.of(Collections.emptyList(), 0, pageSize(qry.getPageSize()), pageIndex(qry.getPageIndex()));
}
Map<Long, CorpE> corpMap = accessibleCorps.stream()
.collect(Collectors.toMap(CorpE::getId, Function.identity()));
List<Long> corpIds = accessibleCorps.stream().map(CorpE::getId).collect(Collectors.toList());
int pageIndex = pageIndex(qry.getPageIndex());
int pageSize = pageSize(qry.getPageSize());
List<AlarmCorpStatisticCo> records = statisticGateway.pageByCorp(
corpIds, qry.getAlarmTimeStart(), qry.getAlarmTimeEnd(), (pageIndex - 1) * pageSize, pageSize)
.stream().map(row -> toCorpCo(row, corpMap.get(row.getCorpId()))).collect(Collectors.toList());
long total = statisticGateway.countCorp(corpIds, qry.getAlarmTimeStart(), qry.getAlarmTimeEnd());
return PageResponse.of(records, Math.toIntExact(total), pageSize, pageIndex);
}
public PageResponse<AlarmRegionStatisticCo> regions(AlarmRegionStatisticQry qry) {
accessService.requireAccessibleCorp(qry.getCorpId());
int pageIndex = pageIndex(qry.getPageIndex());
int pageSize = pageSize(qry.getPageSize());
List<AlarmRegionStatisticCo> records = statisticGateway.pageByRegion(
qry.getCorpId(), qry.getRegionName(), qry.getAlarmTimeStart(), qry.getAlarmTimeEnd(),
(pageIndex - 1) * pageSize, pageSize)
.stream().map(this::toRegionCo).collect(Collectors.toList());
long total = statisticGateway.countRegion(qry.getCorpId(), qry.getRegionName());
return PageResponse.of(records, Math.toIntExact(total), pageSize, pageIndex);
}
private AlarmCorpStatisticCo toCorpCo(AlarmStatisticE source, CorpE corp) {
AlarmCorpStatisticCo target = new AlarmCorpStatisticCo();
BeanUtils.copyProperties(source, target);
target.setCorpName(corp == null ? null : corp.getCorpName());
return target;
}
private AlarmRegionStatisticCo toRegionCo(AlarmStatisticE source) {
AlarmRegionStatisticCo target = new AlarmRegionStatisticCo();
BeanUtils.copyProperties(source, target);
return target;
}
private int pageIndex(int pageIndex) {
return pageIndex <= 0 ? 1 : pageIndex;
}
private int pageSize(int pageSize) {
return pageSize <= 0 ? 10 : Math.min(pageSize, 200);
}
}

View File

@ -0,0 +1,27 @@
package com.zcloud.gbs.edgeguard.service;
import com.alibaba.cola.dto.PageResponse;
import com.zcloud.gbs.edgeguard.api.AlarmStatisticServiceI;
import com.zcloud.gbs.edgeguard.command.query.AlarmStatisticQueryExe;
import com.zcloud.gbs.edgeguard.dto.AlarmCorpStatisticQry;
import com.zcloud.gbs.edgeguard.dto.AlarmRegionStatisticQry;
import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmCorpStatisticCo;
import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmRegionStatisticCo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class AlarmStatisticServiceImpl implements AlarmStatisticServiceI {
private final AlarmStatisticQueryExe queryExe;
@Override
public PageResponse<AlarmCorpStatisticCo> corporations(AlarmCorpStatisticQry qry) {
return queryExe.corporations(qry);
}
@Override
public PageResponse<AlarmRegionStatisticCo> regions(AlarmRegionStatisticQry qry) {
return queryExe.regions(qry);
}
}

View File

@ -0,0 +1,13 @@
package com.zcloud.gbs.edgeguard.api;
import com.alibaba.cola.dto.PageResponse;
import com.zcloud.gbs.edgeguard.dto.AlarmCorpStatisticQry;
import com.zcloud.gbs.edgeguard.dto.AlarmRegionStatisticQry;
import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmCorpStatisticCo;
import com.zcloud.gbs.edgeguard.dto.clientobject.AlarmRegionStatisticCo;
public interface AlarmStatisticServiceI {
PageResponse<AlarmCorpStatisticCo> corporations(AlarmCorpStatisticQry qry);
PageResponse<AlarmRegionStatisticCo> regions(AlarmRegionStatisticQry qry);
}

View File

@ -0,0 +1,15 @@
package com.zcloud.gbs.edgeguard.dto;
import com.alibaba.cola.dto.PageQuery;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
public class AlarmCorpStatisticQry extends PageQuery {
private Long corpId;
private Date alarmTimeStart;
private Date alarmTimeEnd;
}

View File

@ -0,0 +1,18 @@
package com.zcloud.gbs.edgeguard.dto;
import com.alibaba.cola.dto.PageQuery;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
public class AlarmRegionStatisticQry extends PageQuery {
@NotNull(message = "企业ID不能为空")
private Long corpId;
private String regionName;
private Date alarmTimeStart;
private Date alarmTimeEnd;
}

View File

@ -0,0 +1,14 @@
package com.zcloud.gbs.edgeguard.dto.clientobject;
import com.alibaba.cola.dto.ClientObject;
import lombok.Data;
@Data
public class AlarmCorpStatisticCo extends ClientObject {
private Long corpId;
private String corpName;
private Long totalCount;
private Long pendingCount;
private Long hiddenHandlingCount;
private Long disposedCount;
}

View File

@ -0,0 +1,16 @@
package com.zcloud.gbs.edgeguard.dto.clientobject;
import com.alibaba.cola.dto.ClientObject;
import lombok.Data;
@Data
public class AlarmRegionStatisticCo extends ClientObject {
private Long regionId;
private String regionCode;
private String regionName;
private Long corpId;
private Long totalCount;
private Long pendingCount;
private Long hiddenHandlingCount;
private Long disposedCount;
}

View File

@ -0,0 +1,18 @@
package com.zcloud.gbs.edgeguard.domain.gateway;
import com.zcloud.gbs.edgeguard.domain.model.AlarmStatisticE;
import java.util.Date;
import java.util.Collection;
import java.util.List;
public interface AlarmStatisticGateway {
List<AlarmStatisticE> pageByCorp(Collection<Long> corpIds, Date start, Date end, int offset, int pageSize);
long countCorp(Collection<Long> corpIds, Date start, Date end);
List<AlarmStatisticE> pageByRegion(Long corpId, String regionName, Date start, Date end,
int offset, int pageSize);
long countRegion(Long corpId, String regionName);
}

View File

@ -0,0 +1,15 @@
package com.zcloud.gbs.edgeguard.domain.model;
import lombok.Data;
@Data
public class AlarmStatisticE {
private Long corpId;
private Long regionId;
private String regionCode;
private String regionName;
private Long totalCount;
private Long pendingCount;
private Long hiddenHandlingCount;
private Long disposedCount;
}

View File

@ -0,0 +1,38 @@
package com.zcloud.gbs.edgeguard.gatewayimpl;
import com.zcloud.gbs.edgeguard.domain.gateway.AlarmStatisticGateway;
import com.zcloud.gbs.edgeguard.domain.model.AlarmStatisticE;
import com.zcloud.gbs.edgeguard.persistence.mapper.AlarmMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Collection;
import java.util.List;
@Service
@RequiredArgsConstructor
public class AlarmStatisticGatewayImpl implements AlarmStatisticGateway {
private final AlarmMapper alarmMapper;
@Override
public List<AlarmStatisticE> pageByCorp(Collection<Long> corpIds, Date start, Date end, int offset, int pageSize) {
return alarmMapper.pageStatisticByCorp(corpIds, start, end, offset, pageSize);
}
@Override
public long countCorp(Collection<Long> corpIds, Date start, Date end) {
return alarmMapper.countStatisticCorp(corpIds, start, end);
}
@Override
public List<AlarmStatisticE> pageByRegion(Long corpId, String regionName, Date start, Date end,
int offset, int pageSize) {
return alarmMapper.pageStatisticByRegion(corpId, regionName, start, end, offset, pageSize);
}
@Override
public long countRegion(Long corpId, String regionName) {
return alarmMapper.countStatisticRegion(corpId, regionName);
}
}

View File

@ -2,6 +2,31 @@ package com.zcloud.gbs.edgeguard.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zcloud.gbs.edgeguard.persistence.dataobject.AlarmDO; import com.zcloud.gbs.edgeguard.persistence.dataobject.AlarmDO;
import com.zcloud.gbs.edgeguard.domain.model.AlarmStatisticE;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.Collection;
import java.util.List;
public interface AlarmMapper extends BaseMapper<AlarmDO> { public interface AlarmMapper extends BaseMapper<AlarmDO> {
List<AlarmStatisticE> pageStatisticByCorp(@Param("corpIds") Collection<Long> corpIds,
@Param("start") Date start,
@Param("end") Date end,
@Param("offset") int offset,
@Param("pageSize") int pageSize);
long countStatisticCorp(@Param("corpIds") Collection<Long> corpIds,
@Param("start") Date start,
@Param("end") Date end);
List<AlarmStatisticE> pageStatisticByRegion(@Param("corpId") Long corpId,
@Param("regionName") String regionName,
@Param("start") Date start,
@Param("end") Date end,
@Param("offset") int offset,
@Param("pageSize") int pageSize);
long countStatisticRegion(@Param("corpId") Long corpId,
@Param("regionName") String regionName);
} }

View File

@ -1,4 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zcloud.gbs.edgeguard.persistence.mapper.AlarmMapper"> <mapper namespace="com.zcloud.gbs.edgeguard.persistence.mapper.AlarmMapper">
<sql id="alarmTimeCondition">
<if test="start != null">AND alarm_time <![CDATA[>=]]> #{start}</if>
<if test="end != null">AND alarm_time <![CDATA[<=]]> #{end}</if>
</sql>
<select id="pageStatisticByCorp" resultType="com.zcloud.gbs.edgeguard.domain.model.AlarmStatisticE">
SELECT corp_id AS corpId,
COUNT(*) AS totalCount,
SUM(disposal_status = 'PENDING') AS pendingCount,
SUM(disposal_status = 'HIDDEN_HANDLING') AS hiddenHandlingCount,
SUM(disposal_status = 'DISPOSED') AS disposedCount
FROM edgeguard_alarm
WHERE COALESCE(delete_enum, 'false') != 'true'
AND corp_id IN
<foreach collection="corpIds" item="corpId" open="(" separator="," close=")">#{corpId}</foreach>
<include refid="alarmTimeCondition"/>
GROUP BY corp_id
ORDER BY corp_id
LIMIT #{offset}, #{pageSize}
</select>
<select id="countStatisticCorp" resultType="long">
SELECT COUNT(DISTINCT corp_id)
FROM edgeguard_alarm
WHERE COALESCE(delete_enum, 'false') != 'true'
AND corp_id IN
<foreach collection="corpIds" item="corpId" open="(" separator="," close=")">#{corpId}</foreach>
<include refid="alarmTimeCondition"/>
</select>
<select id="pageStatisticByRegion" resultType="com.zcloud.gbs.edgeguard.domain.model.AlarmStatisticE">
SELECT region.id AS regionId,
region.region_code AS regionCode,
region.region_name AS regionName,
region.corp_id AS corpId,
COUNT(alarm.id) AS totalCount,
COALESCE(SUM(alarm.disposal_status = 'PENDING'), 0) AS pendingCount,
COALESCE(SUM(alarm.disposal_status = 'HIDDEN_HANDLING'), 0) AS hiddenHandlingCount,
COALESCE(SUM(alarm.disposal_status = 'DISPOSED'), 0) AS disposedCount
FROM edgeguard_region region
LEFT JOIN edgeguard_alarm alarm ON alarm.region_id = region.id
AND COALESCE(alarm.delete_enum, 'false') != 'true'
<if test="start != null">AND alarm.alarm_time <![CDATA[>=]]> #{start}</if>
<if test="end != null">AND alarm.alarm_time <![CDATA[<=]]> #{end}</if>
WHERE COALESCE(region.delete_enum, 'false') != 'true'
AND region.region_status = 'ENABLED'
AND region.corp_id = #{corpId}
<if test="regionName != null and regionName != ''">
AND region.region_name LIKE CONCAT('%', #{regionName}, '%')
</if>
GROUP BY region.id, region.region_code, region.region_name, region.corp_id, region.sort_no
ORDER BY region.sort_no, region.id
LIMIT #{offset}, #{pageSize}
</select>
<select id="countStatisticRegion" resultType="long">
SELECT COUNT(*)
FROM edgeguard_region region
WHERE COALESCE(region.delete_enum, 'false') != 'true'
AND region.region_status = 'ENABLED'
AND region.corp_id = #{corpId}
<if test="regionName != null and regionName != ''">
AND region.region_name LIKE CONCAT('%', #{regionName}, '%')
</if>
</select>
</mapper> </mapper>