From 34e22679dfe43d9b24aa865292484b31d7511efd Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期三, 21 一月 2026 21:06:35 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/RecordService.java                   |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/DeviceDetailCheckListVo.java              |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/query/ProjectDangerousSourceListQuery.java   |   25 ++
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerTrendVo.java           |   22 ++
 ruoyi-system/src/main/java/com/ruoyi/system/enums/DeviceType.java                        |   70 +++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/IOptionVo.java                       |   17 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectVo.java                            |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/query/ProjectHiddenDangerTrendListQuery.java |   29 +++
 ruoyi-system/src/main/java/com/ruoyi/system/model/Record.java                            |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/model/SelectOptionVo.java                    |   46 +++++
 ruoyi-system/src/main/resources/mapper/system/RecordMapper.xml                           |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ProjectInfoService.java              |   10 +
 ruoyi-system/src/main/resources/mapper/system/DeviceUsageMapper.xml                      |    4 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ProjectController.java            |   68 +++++++
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerNextList.java          |   16 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProjectInfoMapper.java                |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/model/ProjectInfo.java                       |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerList.java              |   20 ++
 ruoyi-system/src/main/resources/mapper/system/ProjectInfoMapper.xml                      |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProjectInfoServiceImpl.java     |  152 ++++++++++++++++
 ruoyi-system/src/main/resources/mapper/system/ProjectMapper.xml                          |    5 
 21 files changed, 506 insertions(+), 7 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ProjectController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ProjectController.java
index 46d7bd1..34c6365 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ProjectController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ProjectController.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.system.dto.EditHiddenDangerResponsiblePersonDto;
+import com.ruoyi.system.enums.DeviceType;
 import com.ruoyi.system.model.*;
 import com.ruoyi.system.model.Record;
 import com.ruoyi.system.query.*;
@@ -21,6 +22,7 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -73,7 +75,7 @@
         List<String> properties = deviceUsageService.getDeviceUsageList(id);
         projectVo.setProperties( properties);
 
-        ProjectInfo projectInfo = projectInfoService.getOne(new LambdaUpdateWrapper<ProjectInfo>().eq(ProjectInfo::getProjectId, id));
+        ProjectInfo projectInfo = projectInfoService.getOne(new LambdaUpdateWrapper<ProjectInfo>().eq(ProjectInfo::getProjectId, id).eq(ProjectInfo::getDeleted,false).orderByDesc(ProjectInfo::getCreateTime).last("limit 1"));
         if(projectInfo!=null){
             projectVo.setProgress(projectInfo.getProgress());
         }
@@ -242,4 +244,68 @@
         return R.ok(vo);
     }
 
+
+    @ApiOperation(value = "获取项目大屏最新重大风险源",response = ProjectInfo.class)
+    @GetMapping("/getProjectDangerousSource")
+    public R<ProjectInfo> getProjectDangerousSource(@RequestParam Integer projectId) {
+        ProjectInfo projectInfo = projectInfoService.getOne(new LambdaQueryWrapper<ProjectInfo>().eq(ProjectInfo::getProjectId,projectId).eq(ProjectInfo::getDeleted, false).orderByDesc(ProjectInfo::getCreateTime).last("limit 1"));
+        return R.ok(projectInfo);
+    }
+
+
+
+    @ApiOperation(value = "获取项目重大风险源列表")
+    @PostMapping("/getProjectDangerousSourceList")
+    public R<Page<ProjectInfo>> getProjectDangerousSourceList(@RequestBody @Valid ProjectDangerousSourceListQuery query) {
+        Page<ProjectInfo> page = new Page<>(query.getPageNum(), query.getPageSize());
+        LambdaQueryWrapper<ProjectInfo> wrapper = new LambdaQueryWrapper<ProjectInfo>().eq(ProjectInfo::getProjectId, query.getProjectId()).eq(ProjectInfo::getDeleted, false);
+        if(query.getStartTime()!=null && !query.getStartTime().isEmpty()){
+            wrapper.ge(ProjectInfo::getCreateTime, query.getStartTime());
+        }
+        if(query.getEndTime()!=null && !query.getEndTime().isEmpty()){
+            wrapper.le(ProjectInfo::getCreateTime, query.getEndTime());
+        }
+        if(query.getContent()!=null && !query.getContent().isEmpty()){
+            wrapper.like(ProjectInfo::getDetail, query.getContent());
+        }
+        Page<ProjectInfo> list = projectInfoService.page(page,wrapper);
+        return R.ok(list);
+    }
+
+    @ApiOperation(value = "设备类型")
+    @GetMapping("/deviceTypes")
+    public R<?> deviceTypeOptions(@RequestParam(value = "title", required = false) String title) {
+        return R.ok(SelectOptionVo.buildOptions(title, DeviceType.values()));
+    }
+
+
+    @ApiOperation(value = "各分项隐患趋势")
+    @GetMapping("/getProjectHiddenDangerTrend")
+    public R<List<ProjectHiddenDangerTrendVo>> getProjectHiddenDangerTrend(@RequestParam Integer projectId,@RequestParam(value = "desc", required = true) Boolean desc,@RequestParam(value = "type", required = true)Integer type) {
+        List<ProjectHiddenDangerTrendVo> list = projectInfoService.getProjectHiddenDangerTrend(projectId);
+        if(type==1){
+            if(desc){
+                list = list.stream().sorted(Comparator.comparingInt(ProjectHiddenDangerTrendVo::getThisMonth).reversed()).toList();
+            }else {
+                list = list.stream().sorted(Comparator.comparingInt(ProjectHiddenDangerTrendVo::getThisMonth)).toList();
+            }
+        }else {
+            if(desc){
+                list = list.stream().sorted(Comparator.comparingDouble(ProjectHiddenDangerTrendVo::getRate).reversed()).toList();
+            }else {
+                list = list.stream().sorted(Comparator.comparingDouble(ProjectHiddenDangerTrendVo::getRate)).toList();
+            }
+        }
+
+        return R.ok(list);
+    }
+
+
+    @ApiOperation(value = "各分项隐患趋势列表")
+    @PostMapping("/getProjectHiddenDangerTrendList")
+    public R<List<ProjectHiddenDangerList>> getProjectHiddenDangerTrendList(@RequestBody @Valid ProjectHiddenDangerTrendListQuery query) {
+        List<ProjectHiddenDangerList> list = projectInfoService.getProjectHiddenDangerTrendList(query);
+        return  R.ok(list);
+    }
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/enums/DeviceType.java b/ruoyi-system/src/main/java/com/ruoyi/system/enums/DeviceType.java
new file mode 100644
index 0000000..7527076
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/enums/DeviceType.java
@@ -0,0 +1,70 @@
+package com.ruoyi.system.enums;
+
+
+import com.ruoyi.system.service.IOptionVo;
+import lombok.Getter;
+
+@Getter
+public enum DeviceType implements IOptionVo {
+    TOWER_CRANE("塔式起重机"),
+    CONSTRUCTION_LIFT("施工升降机"),
+    MATERIAL_HOIST("物料提升机"),
+    BRIDGE_CRANE("桥式起重机"),
+    SUSPENDED_SCAFFOLDING("附着式升降脚手架"),
+    MOBILE_CRANE("流动式起重机"),
+    HIGH_ALTITUDE_BASKET("高处作业吊篮"),
+    GANTRY_CRANE("门式起重机"),
+    GANTRY_TROLLEY_CRANE("架桥机"),
+    OTHER("其他类型");
+
+    private final String desc;
+
+    DeviceType(String desc) {
+        this.desc = desc;
+    }
+
+    public static DeviceType getByDescription(String description) {
+        for (DeviceType deviceType : DeviceType.values()) {
+            if (deviceType.desc.equals(description)) {
+                return deviceType;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String getOptionCode() {
+        return name();
+    }
+
+    @Override
+    public String getOptionName() {
+        return desc;
+    }
+
+    public String hierarchyPath() {
+        switch (this) {
+            case TOWER_CRANE:
+                return "/0";
+            case CONSTRUCTION_LIFT:
+                return "/1";
+            case MATERIAL_HOIST:
+                return "/5";
+            case BRIDGE_CRANE:
+                return "/3";
+            case SUSPENDED_SCAFFOLDING:
+                return "/7";
+            case MOBILE_CRANE:
+                return "/4";
+            case HIGH_ALTITUDE_BASKET:
+                return "/8";
+            case GANTRY_CRANE:
+                return "/6";
+            case GANTRY_TROLLEY_CRANE:
+                return "/2";
+            case OTHER:
+            default:
+                return "/";
+        }
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProjectInfoMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProjectInfoMapper.java
index 89f331e..35a938d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProjectInfoMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProjectInfoMapper.java
@@ -2,6 +2,10 @@
 
 import com.ruoyi.system.model.ProjectInfo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.Record;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,6 @@
  */
 public interface ProjectInfoMapper extends BaseMapper<ProjectInfo> {
 
+    List<Record> getProjectHiddenDangerTrend(@Param("projectId") Integer projectId, @Param("startTime") String startTime, @Param("endTime") String endTime);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/ProjectInfo.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/ProjectInfo.java
index a166802..6e2bc82 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/ProjectInfo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/ProjectInfo.java
@@ -44,6 +44,7 @@
     private LocalDateTime updateTime;
 
     @TableField("dangerous_options")
+    @ApiModelProperty(value = "危大工程")
     private String dangerousOptions;
 
     @TableField("detail")
@@ -56,6 +57,7 @@
     private String progressThisSeason;
 
     @TableField("super_dangerous_options")
+    @ApiModelProperty(value = "超危大工程")
     private String superDangerousOptions;
 
     @ApiModelProperty(value = "风险源")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/Record.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/Record.java
index caa3c69..554b119 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/Record.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/Record.java
@@ -10,6 +10,7 @@
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -32,7 +33,7 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
     @TableField("create_time")
-    private Date createTime;
+    private LocalDateTime createTime;
     private Boolean deleted;
     private String name;
     @TableField("update_time")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/SelectOptionVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/SelectOptionVo.java
new file mode 100644
index 0000000..b256780
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/SelectOptionVo.java
@@ -0,0 +1,46 @@
+package com.ruoyi.system.model;
+
+import com.ruoyi.system.service.IOptionVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName SelectOptionBo
+ * @Description
+ * @Author daisyli
+ * @Date 2023/9/11
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(value = "下拉框选项")
+public class SelectOptionVo {
+
+    @ApiModelProperty(value = "编码")
+    String code;
+
+    @ApiModelProperty(value = "名称")
+    String name;
+
+    public static <T> List<SelectOptionVo> buildOptions(String title, T[] list)
+    {
+        return buildOptions(title, Arrays.asList(list));
+    }
+
+    public static <T> List<SelectOptionVo> buildOptions(String title, List<T> list)  {
+        List<SelectOptionVo> data = list.stream().map(item ->
+                new SelectOptionVo(((IOptionVo)item).getOptionCode(),
+                        ((IOptionVo)item).getOptionName())).collect(Collectors.toList());
+        if(StringUtils.isNotBlank(title))
+            data.add(0, new SelectOptionVo("", title));
+        return data;
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/ProjectDangerousSourceListQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/ProjectDangerousSourceListQuery.java
new file mode 100644
index 0000000..97971b0
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/ProjectDangerousSourceListQuery.java
@@ -0,0 +1,25 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("项目大屏最新重大风险源列表查询参数")
+public class ProjectDangerousSourceListQuery extends BasePage {
+    @ApiModelProperty("项目id")
+    @NotNull(message = "项目id不能为空")
+    private Integer projectId;
+
+    @ApiModelProperty("开始时间")
+    private String startTime;
+
+    @ApiModelProperty("结束时间")
+    private String endTime;
+
+    @ApiModelProperty("搜索内容")
+    private String content;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/ProjectHiddenDangerTrendListQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/ProjectHiddenDangerTrendListQuery.java
new file mode 100644
index 0000000..24c0cd7
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/ProjectHiddenDangerTrendListQuery.java
@@ -0,0 +1,29 @@
+package com.ruoyi.system.query;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("项目隐患趋势列表查询参数")
+public class ProjectHiddenDangerTrendListQuery {
+
+    @ApiModelProperty("项目id")
+    @NotNull(message = "项目id不能为空")
+    private Integer projectId;
+
+    @ApiModelProperty("开始时间")
+    @NotBlank(message = "开始时间不能为空")
+    private String startTime;
+
+    @ApiModelProperty("结束时间")
+    @NotBlank(message = "结束时间不能为空")
+    private String endTime;
+
+    @ApiModelProperty("内容")
+    private String content;
+}
+
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IOptionVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IOptionVo.java
new file mode 100644
index 0000000..a45961e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IOptionVo.java
@@ -0,0 +1,17 @@
+package com.ruoyi.system.service;
+
+public interface IOptionVo {
+
+    /**
+     * 获取选项编码
+     * @return
+     */
+    String getOptionCode();
+
+    /**
+     * 获取选项名称
+     * @return
+     */
+    String getOptionName();
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ProjectInfoService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ProjectInfoService.java
index d3b3c76..91ce556 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ProjectInfoService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ProjectInfoService.java
@@ -2,6 +2,12 @@
 
 import com.ruoyi.system.model.ProjectInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.query.ProjectHiddenDangerTrendListQuery;
+import com.ruoyi.system.vo.ProjectHiddenDangerList;
+import com.ruoyi.system.vo.ProjectHiddenDangerTrendVo;
+
+import javax.validation.Valid;
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +19,8 @@
  */
 public interface ProjectInfoService extends IService<ProjectInfo> {
 
+    List<ProjectHiddenDangerTrendVo> getProjectHiddenDangerTrend(Integer projectId);
+
+    List<ProjectHiddenDangerList> getProjectHiddenDangerTrendList(@Valid ProjectHiddenDangerTrendListQuery query);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/RecordService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/RecordService.java
index 3607e4e..9272541 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/RecordService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/RecordService.java
@@ -27,4 +27,6 @@
     ProblemVo getHiddenDangerDetail(Integer problemId);
 
 
+
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProjectInfoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProjectInfoServiceImpl.java
index a285864..ae0efc4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProjectInfoServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProjectInfoServiceImpl.java
@@ -1,10 +1,33 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson2.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.system.model.ProjectInfo;
 import com.ruoyi.system.mapper.ProjectInfoMapper;
+import com.ruoyi.system.model.Record;
+import com.ruoyi.system.query.ProjectHiddenDangerTrendListQuery;
 import com.ruoyi.system.service.ProjectInfoService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.service.RecordService;
+import com.ruoyi.system.vo.ProjectHiddenDangerList;
+import com.ruoyi.system.vo.ProjectHiddenDangerNextList;
+import com.ruoyi.system.vo.ProjectHiddenDangerTrendVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static java.util.stream.Collectors.groupingBy;
 
 /**
  * <p>
@@ -17,4 +40,133 @@
 @Service
 public class ProjectInfoServiceImpl extends ServiceImpl<ProjectInfoMapper, ProjectInfo> implements ProjectInfoService {
 
+
+    @Override
+    public List<ProjectHiddenDangerTrendVo> getProjectHiddenDangerTrend(Integer projectId) {
+        // 获取上月第一天的时间
+        LocalDate lastMonth = LocalDate.now().minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
+        List<Record> list = this.baseMapper.getProjectHiddenDangerTrend(projectId,lastMonth+" 00:00:00",LocalDate.now()+" 23:59:59");
+        for (Record record : list) {
+            String hierarchyNames = record.getHierarchyNames();
+            JSONArray jsonArray = JSONArray.parseArray(hierarchyNames);
+            // 取出倒数第4个
+            String name = jsonArray.getString(jsonArray.size()-4);
+            record.setHierarchyName( name);
+        }
+
+        LocalDate thisMonth = LocalDate.now().minusMonths(0).with(TemporalAdjusters.firstDayOfMonth());
+        Map<String, List<Record>> map = list.stream().collect(groupingBy(Record::getHierarchyName));
+        List<ProjectHiddenDangerTrendVo> resultList = map.entrySet().stream().map(entry -> {
+            ProjectHiddenDangerTrendVo vo = new ProjectHiddenDangerTrendVo();
+            vo.setName(entry.getKey());
+            List<Record> value = entry.getValue();
+            long count = value.stream().filter(record -> record.getCreateTime().isAfter(thisMonth.atStartOfDay())).count();
+            // 根据value集合中的createTime 选出本月的数据
+            vo.setThisMonth((int) count);
+            vo.setLastMonth(value.size()-(int) count);
+
+            int num = vo.getThisMonth() - vo.getLastMonth();
+            if (num != 0) {
+                if(vo.getLastMonth()>0){
+                    Double rate = BigDecimal.valueOf(num).divide(BigDecimal.valueOf(vo.getLastMonth()), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue();
+                    vo.setRate(rate);
+                }else {
+                    vo.setRate(100.00d);
+                }
+            }else {
+                vo.setRate(0.00d);
+            }
+            return vo;
+        }).toList();
+
+
+        return resultList;
+    }
+
+    @Override
+    public List<ProjectHiddenDangerList> getProjectHiddenDangerTrendList(ProjectHiddenDangerTrendListQuery query) {
+        List<Record> list = this.baseMapper.getProjectHiddenDangerTrend(query.getProjectId(),getMonthBoundaries(query.getStartTime(),true)+" 00:00:00",getMonthBoundaries(query.getEndTime(),false)+" 23:59:59");
+        for (Record record : list) {
+            String hierarchyNames = record.getHierarchyNames();
+            JSONArray jsonArray = JSONArray.parseArray(hierarchyNames);
+            // 取出倒数第4个
+            String name = jsonArray.getString(jsonArray.size()-4);
+            record.setHierarchyName( name);
+        }
+
+        // 算出跨度几个月
+        int months = calculateMonthsBetween(query.getStartTime(),query.getEndTime());
+
+
+        ArrayList<ProjectHiddenDangerList> projectHiddenDangerLists = new ArrayList<>();
+
+        Map<String, List<Record>> map = list.stream().collect(groupingBy(Record::getHierarchyName));
+        for (Map.Entry<String, List<Record>> stringListEntry : map.entrySet()) {
+            String key = stringListEntry.getKey();
+            if(query.getContent()!=null && !query.getContent().isEmpty()){
+                if(!key.contains( query.getContent())){
+                    continue;
+                }
+            }
+
+            List<Record> value = stringListEntry.getValue();
+            ProjectHiddenDangerList projectHiddenDangerList1 = new ProjectHiddenDangerList();
+            projectHiddenDangerList1.setName(key);
+            ArrayList<ProjectHiddenDangerNextList> projectHiddenDangerNextLists = new ArrayList<>();
+            for (int i = 0; i < months; i++) {
+                ProjectHiddenDangerNextList projectHiddenDangerNextList = new ProjectHiddenDangerNextList();
+                LocalDate localDate = getMonthBoundaries(query.getStartTime(), true).plusMonths(i);
+                String dateStr = localDate.toString().substring(0, 7);
+                long count = value.stream().filter(record -> record.getCreateTime().toString().contains(dateStr)).count();
+                ProjectHiddenDangerList projectHiddenDangerList = new ProjectHiddenDangerList();
+                projectHiddenDangerList.setName(key);
+                projectHiddenDangerNextList.setTime(dateStr);
+                projectHiddenDangerNextList.setNum((int) count);
+                projectHiddenDangerNextLists.add(projectHiddenDangerNextList);
+            }
+            projectHiddenDangerList1.setList(projectHiddenDangerNextLists);
+            projectHiddenDangerLists.add(projectHiddenDangerList1);
+        }
+
+        return projectHiddenDangerLists;
+
+    }
+
+
+    public static LocalDate getMonthBoundaries(String yearMonthStr,boolean isInclusive) {
+        // 解析字符串为YearMonth
+        YearMonth yearMonth = YearMonth.parse(yearMonthStr);
+        if(isInclusive){
+            // 获取第一天
+            LocalDate firstDay = yearMonth.atDay(1);
+            return firstDay;
+        }else {
+            // 获取最后一天
+            LocalDate lastDay = yearMonth.atEndOfMonth();
+            return lastDay;
+        }
+    }
+
+
+
+    public static int calculateMonthsBetween(String startYearMonth, String endYearMonth) {
+        YearMonth start = YearMonth.parse(startYearMonth);
+        YearMonth end = YearMonth.parse(endYearMonth);
+
+        // 计算月份差 + 1(包含结束月份)
+        return (int) ChronoUnit.MONTHS.between(start, end) + 1;
+    }
+    public static void main(String[] args) {
+        LocalDate monthBoundaries = getMonthBoundaries("2025-03", true);
+        System.out.println(monthBoundaries);
+        System.out.println(getMonthBoundaries("2025-02",false));
+
+        System.out.println(calculateMonthsBetween("2025-03", "2026-01"));
+
+        for (int count = 0; count < 11; count++) {
+            // 根据2025-03 根据循环获取下一个月的时间
+            LocalDate monthBoundaries1 = getMonthBoundaries("2025-03", true).plusMonths(count);
+            System.out.println(monthBoundaries1.toString().substring(0,7));
+        }
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeviceDetailCheckListVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeviceDetailCheckListVo.java
index 7a7b26e..7ad7afc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeviceDetailCheckListVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeviceDetailCheckListVo.java
@@ -36,4 +36,10 @@
     private Integer commentType=1;
 
 
+    @ApiModelProperty("设备报告 1有 0无")
+    private Integer containDeviceRes;
+
+    @ApiModelProperty("安全报告 1有 0无")
+    private Integer containSystemRes;
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerList.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerList.java
new file mode 100644
index 0000000..c637d30
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerList.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("项目隐患列表")
+public class ProjectHiddenDangerList {
+
+    @ApiModelProperty("名称")
+    private String name;
+
+
+    @ApiModelProperty("数量集合")
+    private List<ProjectHiddenDangerNextList> list;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerNextList.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerNextList.java
new file mode 100644
index 0000000..91312a0
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerNextList.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("项目隐患二级列表")
+public class ProjectHiddenDangerNextList {
+    @ApiModelProperty("数量")
+    private Integer num;
+
+
+    @ApiModelProperty("时间")
+    private String time;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerTrendVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerTrendVo.java
new file mode 100644
index 0000000..63a04b1
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectHiddenDangerTrendVo.java
@@ -0,0 +1,22 @@
+package com.ruoyi.system.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("项目各分享隐患趋势Vo")
+public class ProjectHiddenDangerTrendVo {
+
+    @ApiModelProperty("隐患名称")
+    private String name;
+
+    @ApiModelProperty("本月数量")
+    private Integer thisMonth;
+
+    @ApiModelProperty("上月数量")
+    private Integer lastMonth;
+
+    @ApiModelProperty("环比趋势")
+    private Double rate;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectVo.java
index b8e26db..0f7914e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProjectVo.java
@@ -12,6 +12,7 @@
 import java.util.Date;
 import java.util.List;
 
+
 @Data
 @ApiModel("项目信息")
 public class ProjectVo {
diff --git a/ruoyi-system/src/main/resources/mapper/system/DeviceUsageMapper.xml b/ruoyi-system/src/main/resources/mapper/system/DeviceUsageMapper.xml
index 05596bb..f887013 100644
--- a/ruoyi-system/src/main/resources/mapper/system/DeviceUsageMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/DeviceUsageMapper.xml
@@ -16,7 +16,7 @@
         <result column="disabled" property="disabled" />
     </resultMap>
     <select id="getDeviceUsageList" resultType="java.lang.String">
-        select t3.properties from device_usage t1
+        select t2.properties from device_usage t1
         left join device t2 on t1.device_id = t2.id
         where t1.project_id =#{id}
     </select>
@@ -52,7 +52,7 @@
         from device t1
             left join device_usage t2
         on t1.id = t2.device_id
-        where t2.project_id = #{projectId} and t2.deleted = 0
+        where t2.project_id = #{id} and t2.deleted = 0
         group by t1.type
     </select>
 
diff --git a/ruoyi-system/src/main/resources/mapper/system/ProjectInfoMapper.xml b/ruoyi-system/src/main/resources/mapper/system/ProjectInfoMapper.xml
index 020177b..66b87da 100644
--- a/ruoyi-system/src/main/resources/mapper/system/ProjectInfoMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/ProjectInfoMapper.xml
@@ -26,5 +26,12 @@
     <sql id="Base_Column_List">
         id, create_time, deleted, name, update_time, dangerous_options, detail, progress, progress_this_season, super_dangerous_options, hazard_source, update_date, creator_id, check_task_id, project_id, hazard_source_types
     </sql>
+    <select id="getProjectHiddenDangerTrend" resultType="com.ruoyi.system.model.Record"
+          >
+        select t2.id,t2.hierarchy_names,t2.create_time from task t1
+        left join record t2 on t1.id=t2.check_task_id
+        where t1.project_id=#{projectId} and t1.deleted=0
+        and t2.create_time between #{startTime} and #{endTime}
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/ProjectMapper.xml b/ruoyi-system/src/main/resources/mapper/system/ProjectMapper.xml
index 11f3bff..11859e2 100644
--- a/ruoyi-system/src/main/resources/mapper/system/ProjectMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/ProjectMapper.xml
@@ -22,10 +22,11 @@
         <result column="usage_type" property="usageType" />
         <result column="creator_id" property="creatorId" />
         <result column="client_id" property="clientId" />
-        <result column="premission" property="premission" />
+        <result column="permission" property="permission" />
     </resultMap>
     <select id="getDeviceDetailCheckList" resultType="com.ruoyi.system.vo.DeviceDetailCheckListVo">
-            select t1.id,t2.name planName,t2.type planType,t1.date checkTime,t2.system_fuzzy fuzzyScore,t2.system_score score,t3.risk_level riskLevel
+            select t1.id,t2.name planName,t2.type planType,t1.date checkTime,t1.system_fuzzy fuzzyScore,t1.system_score score,t3.risk_level riskLevel,
+                   t3.contain_device_res ,t3.contain_system_res
             from task t1
             left join plan t2 on t1.plan_id = t2.id
             left join eval_result t3 on t1.id = t3.check_task_id
diff --git a/ruoyi-system/src/main/resources/mapper/system/RecordMapper.xml b/ruoyi-system/src/main/resources/mapper/system/RecordMapper.xml
index bd677ae..b359e23 100644
--- a/ruoyi-system/src/main/resources/mapper/system/RecordMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/RecordMapper.xml
@@ -42,7 +42,7 @@
         left join problem t2 on t1.problem_id = t2.id
         left join task t3 on t1.check_task_id = t3.id
         left join plan t4 on t3.plan_id = t4.id
-        where t1.deleted = 0
+        where t1.deleted = 0 and t1.level is not null
         and t1.check_task_id in
         <foreach item="item" index="index" collection="taskIds" open="(" separator="," close=")">
             #{item}

--
Gitblit v1.7.1