Просмотр исходного кода

- 添加 预警信息-处置时效分析 接口

Kazerin 1 месяц назад
Родитель
Сommit
4b47422456

+ 142 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/warning/EarlyWarningDisposeEfficiencyController.java

@@ -0,0 +1,142 @@
+package com.zksy.web.controller.warning;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.warning.service.IEarlyWarningDisposeEfficiencyService;
+import com.zksy.common.core.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 预警统计-处置时效分析接口
+ */
+@RestController
+@RequestMapping("/api/warning/disposeEfficiency")
+@Api(tags = "预警信息-处置时效分析模块")
+public class EarlyWarningDisposeEfficiencyController {
+
+    private static final Logger log = LoggerFactory.getLogger(EarlyWarningDisposeEfficiencyController.class);
+
+    @Autowired
+    private IEarlyWarningDisposeEfficiencyService efficiencyService;
+
+    @GetMapping("/overview")
+    @ApiOperation(value = "处置时效概览统计", notes = "返回平均、最长、最短处置时长及总数量核心指标")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "统计成功", response = AjaxResult.class),
+            @ApiResponse(code = 500, message = "统计异常", response = AjaxResult.class)
+    })
+    public AjaxResult getOverview(
+            @ApiParam(value = "发布开始时间 yyyy-MM-dd HH:mm:ss", example = "2026-01-01 00:00:00")
+            @RequestParam(required = false)
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
+
+            @ApiParam(value = "发布结束时间 yyyy-MM-dd HH:mm:ss", example = "2026-06-01 23:59:59")
+            @RequestParam(required = false)
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime,
+
+            @ApiParam(value = "预警专项", example = "管网压力专项")
+            @RequestParam(required = false) String warningSpecial) {
+        try {
+            Map<String, Object> result = efficiencyService.getEfficiencyOverview(startTime, endTime, warningSpecial);
+            return AjaxResult.success("概览统计查询成功", result);
+        } catch (Exception e) {
+            log.error("处置时效概览统计异常", e);
+            return AjaxResult.error("统计失败:" + e.getMessage());
+        }
+    }
+
+    @GetMapping("/range")
+    @ApiOperation(value = "处置时效区间分布", notes = "按时长区间统计预警数量,适配柱状图展示")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "统计成功", response = AjaxResult.class),
+            @ApiResponse(code = 500, message = "统计异常", response = AjaxResult.class)
+    })
+    public AjaxResult getRange(
+            @ApiParam(value = "发布开始时间 yyyy-MM-dd HH:mm:ss", example = "2026-01-01 00:00:00")
+            @RequestParam(required = false)
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
+
+            @ApiParam(value = "发布结束时间 yyyy-MM-dd HH:mm:ss", example = "2026-06-01 23:59:59")
+            @RequestParam(required = false)
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime,
+
+            @ApiParam(value = "预警专项", example = "管网压力专项")
+            @RequestParam(required = false) String warningSpecial) {
+        try {
+            List<Map<String, Object>> result = efficiencyService.getEfficiencyRange(startTime, endTime, warningSpecial);
+            return AjaxResult.success("区间分布统计查询成功", result);
+        } catch (Exception e) {
+            log.error("处置时效区间统计异常", e);
+            return AjaxResult.error("统计失败:" + e.getMessage());
+        }
+    }
+
+    @GetMapping("/special")
+    @ApiOperation(value = "按专项统计处置时效", notes = "按预警专项维度统计平均处置时长,从高到低排序")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "统计成功", response = AjaxResult.class),
+            @ApiResponse(code = 500, message = "统计异常", response = AjaxResult.class)
+    })
+    public AjaxResult getBySpecial(
+            @ApiParam(value = "发布开始时间 yyyy-MM-dd HH:mm:ss", example = "2026-01-01 00:00:00")
+            @RequestParam(required = false)
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
+
+            @ApiParam(value = "发布结束时间 yyyy-MM-dd HH:mm:ss", example = "2026-06-01 23:59:59")
+            @RequestParam(required = false)
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {
+        try {
+            List<Map<String, Object>> result = efficiencyService.getEfficiencyBySpecial(startTime, endTime);
+            return AjaxResult.success("专项时效统计查询成功", result);
+        } catch (Exception e) {
+            log.error("专项处置时效统计异常", e);
+            return AjaxResult.error("统计失败:" + e.getMessage());
+        }
+    }
+
+    @GetMapping("/page")
+    @ApiOperation(value = "处置时效明细列表", notes = "分页查询预警处置时效明细,支持按时长排序,定位低效案例")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "查询成功", response = AjaxResult.class),
+            @ApiResponse(code = 500, message = "查询异常", response = AjaxResult.class)
+    })
+    public AjaxResult queryPage(
+            @ApiParam(value = "页码", defaultValue = "1") @RequestParam(defaultValue = "1") Integer pageNum,
+            @ApiParam(value = "每页大小", defaultValue = "10") @RequestParam(defaultValue = "10") Integer pageSize,
+
+            @ApiParam(value = "发布开始时间 yyyy-MM-dd HH:mm:ss", example = "2026-01-01 00:00:00")
+            @RequestParam(required = false)
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
+
+            @ApiParam(value = "发布结束时间 yyyy-MM-dd HH:mm:ss", example = "2026-06-01 23:59:59")
+            @RequestParam(required = false)
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime,
+
+            @ApiParam(value = "预警专项", example = "管网压力专项")
+            @RequestParam(required = false) String warningSpecial,
+
+            @ApiParam(value = "排序方式", allowableValues = "asc,desc", example = "desc")
+            @RequestParam(defaultValue = "desc") String sortType) {
+        try {
+            Page<Map<String, Object>> page = new Page<>(pageNum, pageSize);
+            IPage<Map<String, Object>> resultPage = efficiencyService.queryEfficiencyPage(page, startTime, endTime, warningSpecial, sortType);
+            return AjaxResult.success("明细查询成功", resultPage);
+        } catch (Exception e) {
+            log.error("处置时效明细查询异常", e);
+            return AjaxResult.error("查询失败:" + e.getMessage());
+        }
+    }
+}

+ 48 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/warning/mapper/EarlyWarningMapper.java

@@ -73,4 +73,52 @@ public interface EarlyWarningMapper extends BaseMapper<EarlyWarning> {
             @Param("startTime") LocalDateTime startTime,
             @Param("endTime") LocalDateTime endTime,
             @Param("warningSpecial") String warningSpecial);
+
+    /**
+     * 处置时效分析-概览指标统计
+     * @param startTime 发布开始时间
+     * @param endTime 发布结束时间
+     * @param warningSpecial 预警专项(可选)
+     * @return 平均/最长/最短处置时长 + 总数
+     */
+    Map<String, Object> selectDisposeEfficiencyOverview(
+            @Param("startTime") LocalDateTime startTime,
+            @Param("endTime") LocalDateTime endTime,
+            @Param("warningSpecial") String warningSpecial);
+
+    /**
+     * 处置时效分析-时效区间分布统计
+     * @param startTime 发布开始时间
+     * @param endTime 发布结束时间
+     * @param warningSpecial 预警专项(可选)
+     * @return 各时长区间预警数量
+     */
+    List<Map<String, Object>> selectDisposeEfficiencyRange(
+            @Param("startTime") LocalDateTime startTime,
+            @Param("endTime") LocalDateTime endTime,
+            @Param("warningSpecial") String warningSpecial);
+
+    /**
+     * 处置时效分析-按预警专项统计平均时效
+     * @param startTime 发布开始时间
+     * @param endTime 发布结束时间
+     * @return 各专项平均处置时长
+     */
+    List<Map<String, Object>> selectDisposeEfficiencyBySpecial(
+            @Param("startTime") LocalDateTime startTime,
+            @Param("endTime") LocalDateTime endTime);
+
+    /**
+     * 处置时效分析-明细列表
+     * @param startTime 发布开始时间
+     * @param endTime 发布结束时间
+     * @param warningSpecial 预警专项(可选)
+     * @param sortType 排序方式 asc-时效从短到长 desc-时效从长到短
+     * @return 预警时效明细
+     */
+    List<Map<String, Object>> selectDisposeEfficiencyList(
+            @Param("startTime") LocalDateTime startTime,
+            @Param("endTime") LocalDateTime endTime,
+            @Param("warningSpecial") String warningSpecial,
+            @Param("sortType") String sortType);
 }

+ 35 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/warning/service/IEarlyWarningDisposeEfficiencyService.java

@@ -0,0 +1,35 @@
+package com.zksy.base.warning.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+public interface IEarlyWarningDisposeEfficiencyService {
+
+    /**
+     * 获取处置时效概览指标
+     */
+    Map<String, Object> getEfficiencyOverview(LocalDateTime startTime, LocalDateTime endTime, String warningSpecial);
+
+    /**
+     * 获取处置时效区间分布
+     */
+    List<Map<String, Object>> getEfficiencyRange(LocalDateTime startTime, LocalDateTime endTime, String warningSpecial);
+
+    /**
+     * 按预警专项统计平均处置时效
+     */
+    List<Map<String, Object>> getEfficiencyBySpecial(LocalDateTime startTime, LocalDateTime endTime);
+
+    /**
+     * 分页查询处置时效明细列表
+     */
+    IPage<Map<String, Object>> queryEfficiencyPage(Page<Map<String, Object>> page,
+                                                   LocalDateTime startTime,
+                                                   LocalDateTime endTime,
+                                                   String warningSpecial,
+                                                   String sortType);
+}

+ 46 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/warning/service/impl/EarlyWarningDisposeEfficiencyServiceImpl.java

@@ -0,0 +1,46 @@
+package com.zksy.base.warning.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.warning.mapper.EarlyWarningMapper;
+import com.zksy.base.warning.service.IEarlyWarningDisposeEfficiencyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class EarlyWarningDisposeEfficiencyServiceImpl implements IEarlyWarningDisposeEfficiencyService {
+
+    @Autowired
+    private EarlyWarningMapper earlyWarningMapper;
+
+    @Override
+    public Map<String, Object> getEfficiencyOverview(LocalDateTime startTime, LocalDateTime endTime, String warningSpecial) {
+        return earlyWarningMapper.selectDisposeEfficiencyOverview(startTime, endTime, warningSpecial);
+    }
+
+    @Override
+    public List<Map<String, Object>> getEfficiencyRange(LocalDateTime startTime, LocalDateTime endTime, String warningSpecial) {
+        return earlyWarningMapper.selectDisposeEfficiencyRange(startTime, endTime, warningSpecial);
+    }
+
+    @Override
+    public List<Map<String, Object>> getEfficiencyBySpecial(LocalDateTime startTime, LocalDateTime endTime) {
+        return earlyWarningMapper.selectDisposeEfficiencyBySpecial(startTime, endTime);
+    }
+
+    @Override
+    public IPage<Map<String, Object>> queryEfficiencyPage(Page<Map<String, Object>> page,
+                                                          LocalDateTime startTime,
+                                                          LocalDateTime endTime,
+                                                          String warningSpecial,
+                                                          String sortType) {
+        List<Map<String, Object>> list = earlyWarningMapper.selectDisposeEfficiencyList(startTime, endTime, warningSpecial, sortType);
+        page.setRecords(list);
+        page.setTotal(list.size());
+        return page;
+    }
+}

+ 125 - 0
pipe-network-service/zksy-system/src/main/resources/mapper/warning/EarlyWarningMapper.xml

@@ -123,6 +123,131 @@
         ORDER BY status_count DESC
     </select>
 
+    <!-- 处置时效分析-概览指标统计 -->
+    <select id="selectDisposeEfficiencyOverview" resultType="java.util.Map">
+        SELECT
+        ROUND(AVG(dispose_hours), 2) AS avg_hours,
+        ROUND(MAX(dispose_hours), 2) AS max_hours,
+        ROUND(MIN(dispose_hours), 2) AS min_hours,
+        COUNT(*) AS total_count
+        FROM (
+        SELECT
+        TIMESTAMPDIFF(SECOND, w.publish_time, MAX(d.create_time)) / 3600 AS dispose_hours
+        FROM early_warning w
+        LEFT JOIN warning_disposal d ON w.warning_id = d.warning_id
+        WHERE w.status IN ('HANDLED', 'CLOSED')
+        <if test="startTime != null">
+            AND w.publish_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null">
+            AND w.publish_time &lt; #{endTime}
+        </if>
+        <if test="warningSpecial != null and warningSpecial != ''">
+            AND w.warning_special = #{warningSpecial}
+        </if>
+        GROUP BY w.warning_id
+        HAVING dispose_hours IS NOT NULL
+        ) AS temp
+    </select>
+
+    <!-- 处置时效分析-时效区间分布统计 -->
+    <select id="selectDisposeEfficiencyRange" resultType="java.util.Map">
+        SELECT
+        CASE
+        WHEN dispose_hours &lt;= 2 THEN '0-2小时'
+        WHEN dispose_hours &lt;= 6 THEN '2-6小时'
+        WHEN dispose_hours &lt;= 24 THEN '6-24小时'
+        ELSE '24小时以上'
+        END AS time_range,
+        COUNT(*) AS warning_count
+        FROM (
+        SELECT
+        TIMESTAMPDIFF(SECOND, w.publish_time, MAX(d.create_time)) / 3600 AS dispose_hours
+        FROM early_warning w
+        LEFT JOIN warning_disposal d ON w.warning_id = d.warning_id
+        WHERE w.status IN ('HANDLED', 'CLOSED')
+        <if test="startTime != null">
+            AND w.publish_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null">
+            AND w.publish_time &lt; #{endTime}
+        </if>
+        <if test="warningSpecial != null and warningSpecial != ''">
+            AND w.warning_special = #{warningSpecial}
+        </if>
+        GROUP BY w.warning_id
+        HAVING dispose_hours IS NOT NULL
+        ) AS temp
+        GROUP BY time_range
+        ORDER BY
+        CASE time_range
+        WHEN '0-2小时' THEN 1
+        WHEN '2-6小时' THEN 2
+        WHEN '6-24小时' THEN 3
+        ELSE 4
+        END ASC
+    </select>
+
+    <!-- 处置时效分析-按预警专项统计平均时效 -->
+    <select id="selectDisposeEfficiencyBySpecial" resultType="java.util.Map">
+        SELECT
+        IFNULL(warning_special, '其他') AS warning_special,
+        COUNT(*) AS warning_count,
+        ROUND(AVG(dispose_hours), 2) AS avg_dispose_hours
+        FROM (
+        SELECT
+        w.warning_special,
+        TIMESTAMPDIFF(SECOND, w.publish_time, MAX(d.create_time)) / 3600 AS dispose_hours
+        FROM early_warning w
+        LEFT JOIN warning_disposal d ON w.warning_id = d.warning_id
+        WHERE w.status IN ('HANDLED', 'CLOSED')
+        <if test="startTime != null">
+            AND w.publish_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null">
+            AND w.publish_time &lt; #{endTime}
+        </if>
+        GROUP BY w.warning_id
+        HAVING dispose_hours IS NOT NULL
+        ) AS temp
+        GROUP BY warning_special
+        ORDER BY avg_dispose_hours DESC
+    </select>
+
+    <!-- 处置时效分析-明细列表 -->
+    <select id="selectDisposeEfficiencyList" resultType="java.util.Map">
+        SELECT
+        w.warning_id,
+        w.warning_no,
+        w.warning_name,
+        IFNULL(w.warning_special, '其他') AS warning_special,
+        w.publish_time,
+        MAX(d.create_time) AS dispose_time,
+        ROUND(TIMESTAMPDIFF(SECOND, w.publish_time, MAX(d.create_time)) / 3600, 2) AS dispose_hours,
+        w.status
+        FROM early_warning w
+        LEFT JOIN warning_disposal d ON w.warning_id = d.warning_id
+        WHERE w.status IN ('HANDLED', 'CLOSED')
+        <if test="startTime != null">
+            AND w.publish_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null">
+            AND w.publish_time &lt; #{endTime}
+        </if>
+        <if test="warningSpecial != null and warningSpecial != ''">
+            AND w.warning_special = #{warningSpecial}
+        </if>
+        GROUP BY w.warning_id
+        HAVING dispose_hours IS NOT NULL
+        ORDER BY dispose_hours
+        <if test="sortType != null and sortType == 'desc'">
+            DESC
+        </if>
+        <if test="sortType == null or sortType == 'asc'">
+            ASC
+        </if>
+    </select>
+
     <!--  -->
 
     <select id="selectWarningList" resultType="java.util.Map">