From f70402587d267bf67e7157ed13b8fa4d56513e84 Mon Sep 17 00:00:00 2001 From: lzh Date: Thu, 5 Mar 2026 20:13:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(ops):=20=E5=B7=A1=E6=A3=80=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=8E=A5=E5=8F=A3=EF=BC=88=E5=90=88=E6=A0=BC=E7=8E=87?= =?UTF-8?q?=E3=80=81=E4=B8=8D=E5=90=88=E6=A0=BC=E7=83=AD=E7=82=B9=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=20TOP10=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- .../inspection/vo/InspectionStatsReqVO.java | 22 +++++++ .../inspection/vo/InspectionStatsRespVO.java | 48 +++++++++++++++ .../inspection/InspectionRecordService.java | 10 ++++ .../InspectionRecordServiceImpl.java | 58 +++++++++++++++++++ .../inspection/InspectionController.java | 7 +++ 5 files changed, 145 insertions(+) create mode 100644 viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionStatsReqVO.java create mode 100644 viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionStatsRespVO.java diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionStatsReqVO.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionStatsReqVO.java new file mode 100644 index 0000000..4b66130 --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionStatsReqVO.java @@ -0,0 +1,22 @@ +package com.viewsh.module.ops.environment.controller.admin.inspection.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.viewsh.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 巡检统计查询 Request VO") +@Data +public class InspectionStatsReqVO { + + @Schema(description = "区域ID(可选,不传则统计全部区域)", example = "1") + private Long areaId; + + @Schema(description = "时间范围") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionStatsRespVO.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionStatsRespVO.java new file mode 100644 index 0000000..5ac394c --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionStatsRespVO.java @@ -0,0 +1,48 @@ +package com.viewsh.module.ops.environment.controller.admin.inspection.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Schema(description = "管理后台 - 巡检统计 Response VO") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InspectionStatsRespVO { + + @Schema(description = "总巡检次数", example = "100") + private Long totalCount; + + @Schema(description = "合格次数", example = "85") + private Long passedCount; + + @Schema(description = "不合格次数", example = "15") + private Long failedCount; + + @Schema(description = "合格率(百分比)", example = "85.00") + private Double passRate; + + @Schema(description = "不合格热点区域(按不合格次数降序)") + private List hotSpotAreas; + + @Schema(description = "区域不合格统计") + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class AreaFailStat { + + @Schema(description = "区域ID", example = "1") + private Long areaId; + + @Schema(description = "不合格次数", example = "5") + private Long failedCount; + + } + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionRecordService.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionRecordService.java index a5c39c7..b92876a 100644 --- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionRecordService.java +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionRecordService.java @@ -2,6 +2,8 @@ package com.viewsh.module.ops.environment.service.inspection; import com.viewsh.framework.common.pojo.PageResult; import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionRecordPageReqVO; +import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionStatsReqVO; +import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionStatsRespVO; import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionSubmitReqVO; import com.viewsh.module.ops.environment.dal.dataobject.inspection.OpsInspectionRecordDO; @@ -27,4 +29,12 @@ public interface InspectionRecordService { */ PageResult getRecordPage(InspectionRecordPageReqVO pageReqVO); + /** + * 获得巡检统计(合格率、不合格热点区域) + * + * @param reqVO 统计查询条件 + * @return 巡检统计 + */ + InspectionStatsRespVO getInspectionStats(InspectionStatsReqVO reqVO); + } diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionRecordServiceImpl.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionRecordServiceImpl.java index 82bb7e0..f2f109e 100644 --- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionRecordServiceImpl.java +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionRecordServiceImpl.java @@ -1,8 +1,11 @@ package com.viewsh.module.ops.environment.service.inspection; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.viewsh.framework.common.pojo.PageResult; import com.viewsh.framework.mybatis.core.query.LambdaQueryWrapperX; import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionRecordPageReqVO; +import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionStatsReqVO; +import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionStatsRespVO; import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionSubmitItemVO; import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionSubmitReqVO; import com.viewsh.module.ops.environment.dal.dataobject.inspection.OpsInspectionRecordDO; @@ -17,7 +20,10 @@ import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.validation.annotation.Validated; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; +import java.util.Map; /** * 巡检记录 Service 实现 @@ -95,4 +101,56 @@ public class InspectionRecordServiceImpl implements InspectionRecordService { .orderByDesc(OpsInspectionRecordDO::getId)); } + @Override + public InspectionStatsRespVO getInspectionStats(InspectionStatsReqVO reqVO) { + // 1. 构建基础查询条件 + LambdaQueryWrapperX baseWrapper = new LambdaQueryWrapperX() + .eqIfPresent(OpsInspectionRecordDO::getAreaId, reqVO.getAreaId()) + .betweenIfPresent(OpsInspectionRecordDO::getCreateTime, reqVO.getCreateTime()); + + // 2. 总数 & 合格数 + long totalCount = inspectionRecordMapper.selectCount(baseWrapper); + long passedCount = inspectionRecordMapper.selectCount(new LambdaQueryWrapperX() + .eqIfPresent(OpsInspectionRecordDO::getAreaId, reqVO.getAreaId()) + .betweenIfPresent(OpsInspectionRecordDO::getCreateTime, reqVO.getCreateTime()) + .eq(OpsInspectionRecordDO::getResultStatus, RESULT_STATUS_PASSED)); + long failedCount = totalCount - passedCount; + + // 3. 合格率 + double passRate = totalCount > 0 + ? BigDecimal.valueOf(passedCount * 100.0 / totalCount).setScale(2, RoundingMode.HALF_UP).doubleValue() + : 0.0; + + // 4. 不合格热点区域(按不合格次数降序,取前10) + QueryWrapper groupWrapper = new QueryWrapper<>(); + groupWrapper.select("area_id AS areaId", "COUNT(*) AS failedCount"); + groupWrapper.eq("result_status", RESULT_STATUS_FAILED); + groupWrapper.eq("deleted", false); + if (reqVO.getAreaId() != null) { + groupWrapper.eq("area_id", reqVO.getAreaId()); + } + if (reqVO.getCreateTime() != null && reqVO.getCreateTime().length == 2) { + groupWrapper.between("create_time", reqVO.getCreateTime()[0], reqVO.getCreateTime()[1]); + } + groupWrapper.groupBy("area_id"); + groupWrapper.orderByDesc("failedCount"); + groupWrapper.last("LIMIT 10"); + + List> maps = inspectionRecordMapper.selectMaps(groupWrapper); + List hotSpots = maps.stream() + .map(m -> InspectionStatsRespVO.AreaFailStat.builder() + .areaId(((Number) m.get("areaId")).longValue()) + .failedCount(((Number) m.get("failedCount")).longValue()) + .build()) + .toList(); + + return InspectionStatsRespVO.builder() + .totalCount(totalCount) + .passedCount(passedCount) + .failedCount(failedCount) + .passRate(passRate) + .hotSpotAreas(hotSpots) + .build(); + } + } diff --git a/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/inspection/InspectionController.java b/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/inspection/InspectionController.java index 8ad3991..40eebcf 100644 --- a/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/inspection/InspectionController.java +++ b/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/inspection/InspectionController.java @@ -62,4 +62,11 @@ public class InspectionController { return success(BeanUtils.toBean(pageResult, InspectionRecordRespVO.class)); } + @GetMapping("/record/stats") + @Operation(summary = "获得巡检统计(合格率、不合格热点区域)") + @PreAuthorize("@ss.hasPermission('ops:inspection:query')") + public CommonResult getInspectionStats(@Valid InspectionStatsReqVO reqVO) { + return success(inspectionRecordService.getInspectionStats(reqVO)); + } + }