From 5ea0d97a1bf9030945fab70cd8e21aa6e98c7950 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期六, 24 一月 2026 09:35:14 +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/service/impl/RecordServiceImpl.java           |   21 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProblemVo.java                             |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/DeviceCountVo.java                         |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/model/AccidentBrief.java                      |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/model/Device.java                             |   95 +++++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/EntrustProjectController.java      |   14 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClientServiceImpl.java           |  142 ++++++----
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/DeviceMapper.java                      |   19 +
 ruoyi-system/src/main/resources/mapper/system/RecordMapper.xml                            |   24 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/FixedAssetDashboardVO.java                 |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ProjectController.java             |   32 ++
 /dev/null                                                                                 |  264 --------------------
 ruoyi-system/src/main/java/com/ruoyi/system/vo/MachineryStatisticsVO.java                 |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DashboardStatisticsController.java |   55 +++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkPresentationController.java    |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/model/ErrorReview.java                        |   62 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/query/EntrustDeviceListQuery.java             |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/RecordMapper.java                      |    9 
 ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java           |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/model/ClientParam.java                        |   10 
 21 files changed, 421 insertions(+), 353 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DashboardStatisticsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DashboardStatisticsController.java
index bf4ca17..1fb19a1 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DashboardStatisticsController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DashboardStatisticsController.java
@@ -23,6 +23,7 @@
 
 import java.util.HashMap;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * 数据统计面板 前端控制器
@@ -32,12 +33,10 @@
  */
 @RestController
 @RequestMapping("/dashboard-statistics")
-@Api(tags = "数据统计面板")
+@Api(tags = "首页")
 @RequiredArgsConstructor(onConstructor_ = @Lazy)
 public class DashboardStatisticsController {
 
-    @Autowired
-    private ScreenAccountService screenAccountService;
 
     @Autowired
     private TokenService tokenService;
@@ -54,6 +53,8 @@
     @Autowired
     private AccidentBriefService accidentBriefService;
 
+    @Autowired
+    private AccidentClassificationService accidentClassificationService;
 
 
     @ApiOperation("获取当前登录信息")
@@ -99,10 +100,10 @@
 
 
     @ApiOperation(value = "获取故事简讯列表",response = AccidentBrief.class)
-    @PostMapping("/getStoryList")
-    public R<Page<AccidentBrief>> getStoryList(@RequestBody StoryListQuery query) {
+    @PostMapping("/getStoryPage")
+    public R<Page<AccidentBrief>> getStoryPage(@RequestBody StoryListQuery query) {
         Page<AccidentBrief> page = new Page<>(query.getPageNum(), query.getPageSize());
-
+        List<AccidentClassification> list = accidentClassificationService.list(new LambdaQueryWrapper<AccidentClassification>().eq(AccidentClassification::getDeleted, false));
         LambdaQueryWrapper<AccidentBrief> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(AccidentBrief::getState,1);
         if(query.getCity()!=null && !query.getCity().isEmpty()){
@@ -121,6 +122,39 @@
         }
         wrapper.orderByDesc(AccidentBrief::getTime);
         Page<AccidentBrief> accidentBriefPage = accidentBriefService.page(page, wrapper);
+        accidentBriefPage.getRecords().forEach(item->{
+            item.setClassifyName(list.stream().filter(classify->classify.getId().equals(item.getClassifyId())).findFirst().get().getName());
+        });
+        return R.ok(accidentBriefPage);
+    }
+
+
+
+    @ApiOperation(value = "获取故事简讯列表-不分页",response = AccidentBrief.class)
+    @PostMapping("/getStoryList")
+    public R<List<AccidentBrief>> getStoryList(@RequestBody StoryListQuery query) {
+        List<AccidentClassification> list = accidentClassificationService.list(new LambdaQueryWrapper<AccidentClassification>().eq(AccidentClassification::getDeleted, false));
+        LambdaQueryWrapper<AccidentBrief> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(AccidentBrief::getState,1);
+        if(query.getCity()!=null && !query.getCity().isEmpty()){
+            wrapper.eq(AccidentBrief::getCity, query.getCity());
+        }
+        if(query.getClassifyId()!=null){
+            wrapper.eq(AccidentBrief::getClassifyId, query.getClassifyId());
+        }
+        if(query.getTime()!=null && !query.getTime().isEmpty()){
+            String sTime = query.getTime().split(" - ")[0]+" 00:00:00";
+            String eTime = query.getTime().split(" - ")[1]+" 23:59:59";
+            wrapper.between(AccidentBrief::getTime,sTime,eTime);
+        }
+        if(query.getContent()!=null && !query.getContent().isEmpty()){
+            wrapper.like(AccidentBrief::getContent, query.getContent());
+        }
+        wrapper.orderByDesc(AccidentBrief::getTime);
+        List<AccidentBrief> accidentBriefPage = accidentBriefService.list( wrapper);
+        accidentBriefPage.forEach(item->{
+            item.setClassifyName(list.stream().filter(classify -> classify.getId().equals(item.getClassifyId())).findFirst().orElse(new AccidentClassification()).getName());
+        });
         return R.ok(accidentBriefPage);
     }
 
@@ -132,6 +166,13 @@
         return R.ok(accidentBrief);
     }
 
+    @ApiOperation(value = "获取故事简讯详情分类",response = AccidentClassification.class)
+    @GetMapping("/getStoryClassify")
+    public R<List<AccidentClassification>> getStoryClassify() {
+        List<AccidentClassification> list = accidentClassificationService.list(new LambdaQueryWrapper<AccidentClassification>().eq(AccidentClassification::getDeleted, false));
+        return R.ok(list);
+    }
+
     /**
      * 获取委托方大屏首页统计数据
      *
@@ -139,7 +180,7 @@
      * @return 统计数据
      */
     @PostMapping("/index")
-    @ApiOperation("获取委托方大屏首页统计数据")
+    @ApiOperation(value = "获取委托方大屏首页统计数据",tags = {"委托方端"})
     public R<ClientDashboardVO> index(@RequestBody ClientDashboardQuery query) {
         ClientDashboardVO dashboard = clientService.getClientDashboard(query);
         return R.ok(dashboard);
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/EntrustProjectController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/EntrustProjectController.java
index 1982458..1d72e09 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/EntrustProjectController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/EntrustProjectController.java
@@ -179,8 +179,20 @@
         recordService.updateById(record);
         return R.ok();
     }
+//    @ApiOperation(value = "隐患详情")
+//    @GetMapping("/errorDetail")
+//    public R errorDetail(Integer id) {
+//        Record record = recordService.getById(id);
+//
+//        return R.ok();
+//    }
 
-
+    @ApiOperation(value = "获取隐患详情")
+    @GetMapping("/getHiddenDangerDetail/{problemId}")
+    public R<?> getHiddenDangerDetail(@PathVariable Integer problemId) {
+        var record = recordService.getHiddenDangerDetail(problemId);
+        return R.ok(record);
+    }
 
 
 }
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 2e78fd5..3c070fa 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
@@ -12,6 +12,8 @@
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.vo.*;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -103,6 +105,10 @@
             projectVo.setCheckTime(task.getUpdateTime());
         }
         List<DeviceCountVo> list = deviceUsageService.getProjectDeviceCount(id);
+        list.forEach(item->{
+            DeviceType value = DeviceType.values()[item.getType()];
+            item.setName(value.getDesc());
+        });
         projectVo.setDeviceCountVos(list);
         return R.ok(projectVo);
     }
@@ -163,10 +169,10 @@
     }
 
 
-    @ApiOperation(value = "获取隐患详情")
-    @GetMapping("/getHiddenDangerDetail/{problemId}")
-    public R<?> getHiddenDangerDetail(@PathVariable Integer problemId) {
-        var record = recordService.getHiddenDangerDetail(problemId);
+    @ApiOperation(value = "获取隐患详情",response = ProblemVo.class)
+    @GetMapping("/getHiddenDangerDetail/{id}")
+    public R<ProblemVo> getHiddenDangerDetail(@PathVariable Integer id) {
+        ProblemVo record = recordService.getHiddenDangerDetail(id);
         return R.ok(record);
     }
 
@@ -355,4 +361,22 @@
         return R.ok(list);
     }
 
+    @ApiOperation(value = "获取项目列表")
+    @GetMapping("/list")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "clientId", value = "委托方ID", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "projectName", value = "项目名称", dataType = "string", paramType = "query")
+    })
+    public R<List<Project>> getList(Integer clientId, String projectName) {
+        LambdaQueryWrapper<Project> wrapper = new LambdaQueryWrapper<Project>().eq(Project::getDeleted, false);
+        if(clientId!=null){
+            wrapper.eq(Project::getClientId, clientId);
+        }
+        if(projectName!=null && !projectName.isEmpty()){
+            wrapper.like(Project::getName, projectName);
+        }
+        List<Project> list = projectService.list(wrapper);
+        return R.ok(list);
+
+    }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkPresentationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkPresentationController.java
index cf271fb..ceaad79 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkPresentationController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkPresentationController.java
@@ -42,6 +42,7 @@
 
         LambdaQueryWrapper<WorkPresentation> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(WorkPresentation::getClientId,query.getClientId());
+        wrapper.eq(WorkPresentation::getState, 1);
         if(query.getType()!=null){
             wrapper.eq(WorkPresentation::getType, query.getType());
         }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java
index fe43adc..ed61520 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java
@@ -40,7 +40,7 @@
         }
         String TimeDir =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
 //        String realPath = fileUploadConfig.getLocation() + TimeDir;
-        String realPath =  "/mnt/file/" + TimeDir;
+        String realPath =  "F:\\file\\estate\\files";
         File file = new File(realPath);
         // 没有目录就创建
         if (!file.exists()) {
@@ -61,7 +61,7 @@
         mf.transferTo(targetFile);
         //拼接数据
 //        String imgstr = fileUploadConfig.getAccessPath() + TimeDir +"\\"+ filename;
-        String imgstr = TimeDir +"/"+ filename;
+        String imgstr = filename;
         return R.ok(imgstr);
     }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/enums/BizResultCode.java b/ruoyi-system/src/main/java/com/ruoyi/system/enums/BizResultCode.java
deleted file mode 100644
index f4831cb..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/enums/BizResultCode.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package com.ruoyi.system.enums;
-
-
-import lombok.Getter;
-
-/**
- * @description: 弹窗消息的定义
- * @author: code
- **/
-@Getter
-public enum BizResultCode implements ApiResultCode {
-
-    INVALID_OPERATION("无效操作"),
-    MOBILE_ALREADY_EXIST("手机号已存在"),
-    USERNAME_ALREADY_EXIST("用户名已存在"),
-    ACCOUNT_NOT_FOUND("帐号不存在"),
-    SYS_VALIDATION_FAILED_ERROR("验证失败,无效请求"),
-    APP_CLIENT_NOT_EXIST("登录客户端不存在"),
-    SESSION_EXPIRED("会话已过期"),
-    SESSION_INVALID("会话无效"),
-    NO_LOGIN_ERROR("未登录"),
-    ACCOUNT_FORBIDDEN("帐号被禁用"),
-
-    H_CAPTCHA_CODE_NULL_ERROR("图形验证码不能为空"),
-    CAPTCHA_CODE_NOT_NULL(""),
-    H_CAPTCHA_CODE_VALIDATE_ERROR("图形验证失败"),
-    VERIFICATION_CODE_INVALID("图形验证码验证失败"),
-    BIZ_PASSWORD_INVALID("密码错误"),
-
-//    BIZ_CLIENT_NOT_FOUND("委托方不存在"),
-//    BIZ_CLIENT_NAME_ALREADY_EXISTS("委托方名称已存在"),
-//    BIZ_CONTRACT_NOT_EXIST("合同不存在"),
-
-    BIZ_CAR_NOT_EXIST("车辆不存在"),
-
-    BIZ_DATE_FORMAT_ERROR("日期格式错误"),
-
-    BIZ_PROJECT_NOT_EXIST("项目不存在"),
-
-    BIZ_DEVICE_NOT_EXIST("设备不存在"),
-
-    BIZ_SCORE_WEIGHT_CAN_NOT_NULL("分数和权重不能为空"),
-
-    BIZ_HIERARCHY_SYSTEM_NOT_EXIST("体系不存在"),
-
-    BIZ_PARENT_HIERARCHY_SYSTEM_NOT_EXIST("父ID体系不存在"),
-
-    BIZ_PLAN_NOT_EXIST("计划不存在"),
-
-    BIZ_PROBLEM_NUM_CANNOT_NULL("问题数量集合不能为空"),
-
-    BIZ_PROBLEM_SCALE_CANNOT_NULL("对应规模集合不能为空"),
-
-    BIZ_REAL_RULE_NOT_EXIST("实测实量规则不存在"),
-
-    BIZ_EXPERT_NOT_EXIST("专家不存在"),
-
-    EXPERT_FUNCTIONS_MUST_ENABLE("专家功能必须启用"),
-
-    BIZ_MODEL_NOT_EXIST("模型不存在"),
-
-    BIZ_PROJECT_STATUS_NOT_MATCH("项目状态不匹配"),
-
-    BIZ_EXPERT_SCORE_SYS_NOT_EXIST("专家评分体系不存在"),
-
-    BIZ_MEMBERSHIP_DEGREE_NOT_EXIST("隐患等级不存在"),
-
-    BIZ_PROJECT_SUPERVISOR_HIS_NOT_EXIST("项目监督历史不存在"),
-
-    BIZ_PROJECT_DEVICE_NOT_EXIST("项目设备不存在"),
-
-    BIZ_REPORT_TEMPLATE_NOT_EXIST("报告模板不存在"),
-
-    BIZ_REPORT_TEMPLATE_TYPE_NOT_EXIST("报告模板类型不存在"),
-
-    BIZ_ARCHIVE_NOT_EXIST("档案不存在"),
-
-    BIZ_PROJECT_NOT_CLOSED("项目未关闭"),
-
-    BIZ_PROJECT_ALREADY_CLOSED("项目已关闭"),
-
-    BIZ_PLAN_CLIENT_EXIST("该委托方对应的计划已存在"),
-
-    BIZ_PLAN_PROJECT_RELATION_NOT_EXIST("计划项目关系不存在"),
-
-    BIZ_PROJECT_NAME_EXIST("同一个委托方下已存在相同名称的项目"),
-    HIERARCHY_PARENT_NOT_FOUND("父级体系不存在"),
-    HIERARCHY_NODE_NOT_FOUND("节点不存在"),
-    HIERARCHY_NODE_NAME_ALREADY_EXISTS("节点名称已存在"),
-    BIZ_MODEL_NOT_FOUND("模型不存在"),
-    DRIVER_CAR_NOT_MATCH("司机和车辆数量不匹配"),
-    PARAM_ERROR("参数错误"),
-    CAR_NOT_EXIST("车辆不存在"),
-    PROBLEM_NOT_EXIST("问题不存在"),
-    ID_CANNOT_NULL("ID不能为空"),
-    MODEL_NOT_FOUND("模型不存在"),
-    PROJECT_INFO_NOT_EXIST("项目信息不存在"),
-    DEVICE_NOT_FOUND("设备不存在"),
-    DEVICE_IS_BUSY("设备正在使用中"),
-    PLAN_NOT_EXIST("计划不存在"),
-    ARCHIVE_NOT_EXIST("档案不存在"),
-    ENTITY_NOT_FOUND("实体不存在"),
-    ENTITY_NAME_ALREADY_EXISTS("实体名称已存在"),
-    ENTITY_CANNOT_NULL("实体不能为空"),
-    MODEL_PUBLISHED_CANNOT_MODIFY("已发布的模型不可修改"),
-    ACCOUNT_ALREADY_EXISTS("登录账号已存在"),
-    //无权修改他人信息
-    NO_PERMISSION_MODIFY_OTHERS_INFO("无权修改他人信息"),
-    DEVICE_USAGE_NOT_FOUND("设备使用记录不存在"),
-    MEMBERSHIP_MATRIX_LOAD_ERROR("隶属度矩阵加载失败"),
-    TASK_NOT_FOUND("任务不存在"),
-    TASK_ALREADY_EXIST("任务已存在"),
-    TASK_STATUS_ERROR("任务状态错误"),
-    NUMBER_FACTOR_NOT_EXIST("问题数量集合不存在"),
-    NUMBER_FACTOR_INDEX_ERROR("问题数量索引错误"),
-    SCALE_FACTOR_NOT_EXIST("对应规模集合不存在"),
-    SCALE_FACTOR_INDEX_ERROR("对应规模索引错误"),
-    INDEX_COLS_EMPTY("索引列为空"),
-    COMPARE_MATRIX_EMPTY("比较矩阵为空"),
-    MATRIX_SIZE_ERROR("矩阵大小错误"),
-    MATRIX_ERROR("所有的数字都应该是正数,且沿着主对角线对称的元素应该是彼此的相反数"),
-    NUMBER_NON_NEGATIVE("所有的数字都应该是非负数"),
-    INDEX_RANGE_ERROR("索引范围错误"),
-    MEMBERSHIP_MATRIX_ERROR("隶属度矩阵每一行的和应该等于1"),
-    SIGN_RECORD_EXIST("重复签到"),
-    PLAN_NAME_EXIST("计划名称已存在"),
-    CAR_LICENSE_NO_EXIST("车牌号已存在"),
-    HIERARCHY_NOT_FOUND("体系数据不存在"),
-    PLAN_NOT_FOUND("计划不存在"),
-    RECORD_NOT_FOUND("问题记录不存在"),
-    RECORD_REVIEW_EXISTED("问题已经复核"),
-    REVIEW_ALREADY_REFORMED("问题已经整改,无须复查"),
-    UPLOAD_FILE_FAILED("上传文件失败"),
-    UPLOAD_FILE_CONTAINS_ILLEGAL_CHARACTERS("上传文件名包含非法字符"),
-    FILE_NOT_FOUND("文件不存在"),
-    EVAL_FUZZY_RESULT_NOT_EXIST("模糊评价结果不存在"),
-    EVAL_SCORE_RESULT_NOT_EXIST("评分评价结果不存在"),
-    USER_IS_DISABLE("用户已被禁用"),
-    EXPERT_MODEL_NOT_EXIST("专家对应的模型不存在"),
-    MEMBERSHIP_MATRIX_NOT_EXIST("隶属度矩阵不存在"),
-    EXPERT_NOT_FOUND("专家不存在"),
-    MOBILE_FORMAT_ERROR("手机号格式错误"),
-    HIERARCHY_NOT_EXIST("体系不存在"),
-    PlAN_MODEL_EXPERT_SHOULD_PAIRED("计划模型和专家模型不匹配"),
-    PLAN_SYSTEM_MODEL_NOT_EXIST("综合体系模型不存在"),
-    PLAN_DEVICE_MODEL_NOT_EXIST("设备体系模型不存在"),
-    REVIEW_TASK_NOT_EXIST("复核任务不存在"),
-    ERROR_RECORD_ALL_REVIEWD("问题已全部复核"),
-    PROJECT_INFO_EXISTS("检查任务对应的项目信息已存在"),
-    IMPORT_DATA_EMPTY("导入数据为空"),
-    IMPORT_DATA_COLUMN_COUNT("导入数据列数不正确"),
-    CLIENT_NOT_FOUND("委托方不存在"),
-    DEVICE_ALREADY_EXISTS("设备名称已存在"),
-    ROLE_NOT_FOUND("角色不存在"),
-    CHECK_TASK_NOT_EXIST("检查任务不存在"),
-    DEVICE_USAGE_NOT_EXISTED("设备使用记录不存在"),
-    PASSWORD_ERROR("密码输入错误"),
-    PASSWORD_FORMAT_ERROR("密码需要6到16位长度"),
-
-    // License相关错误码
-    LICENSE_NOT_CONFIGURED("License密钥未配置"),
-    LICENSE_INVALID_FORMAT("License格式错误"),
-    LICENSE_SIGNATURE_INVALID("License签名验证失败"),
-    LICENSE_EXPIRED("License已过期"),
-    LICENSE_VALIDATION_FAILED("License验证失败"),
-
-    // 报告生成相关错误码
-    BIZ_REPORT_GENERATE_FAILED("报告生成失败");
-
-    private final String errorMsg;
-
-    BizResultCode(String errorMsg) {
-        this.errorMsg = errorMsg;
-    }
-
-    /**
-     * 得到 message 的值.
-     *
-     * @return 属性 message 的值.
-     */
-    @Override
-    public String getErrorMsg() {
-        return errorMsg + "(" + getAppId() + ")";
-    }
-
-    /**
-     * @return 当前服务的AppId
-     */
-    @Override
-    public String getAppId() {
-        return "1001";
-    }
-
-    /**
-     * 校验方法
-     *
-     * @param expect
-     */
-    public void check(boolean expect) {
-        if (expect) {
-            throw new BizException(this.errorMsg);
-        }
-    }
-
-    /**
-     * 校验方法
-     * @param expect
-     * @param code
-     */
-    public void check(boolean expect, String code) {
-        if (expect) {
-            throw new BizException(code);
-        }
-    }
-
-    /**
-     * 校验方法
-     * @param expect
-     * @param code
-     * @param message
-     */
-    public void check(boolean expect, String code, String message) {
-        if (expect) {
-            throw new BizException(message);
-        }
-    }
-}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DeviceMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DeviceMapper.java
new file mode 100644
index 0000000..e6c617c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DeviceMapper.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.Device;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 设备 Mapper 接口
+ * </p>
+ *
+ * @author administrator
+ * @since 2026-01-22
+ */
+@Mapper
+public interface DeviceMapper extends BaseMapper<Device> {
+    // 继承 BaseMapper 提供基础 CRUD 方法
+    // 批量查询使用 selectBatchIds 方法
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RecordMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RecordMapper.java
index 5a44497..ba83d7e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RecordMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RecordMapper.java
@@ -3,6 +3,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.system.model.ErrorReview;
 import com.ruoyi.system.model.Record;
 import com.ruoyi.system.query.HiddenDangerListQuery;
 import com.ruoyi.system.vo.HiddenDangerListVo;
@@ -25,7 +26,13 @@
     List<HiddenDangerListVo> getHiddenDangerList(@Param("page") Page<HiddenDangerListVo> page, @Param("query") HiddenDangerListQuery query, @Param("taskIds") List<Integer> taskIds);
 
     ProblemVo getHiddenDangerDetail(@Param("problemId") Integer problemId);
-    
 
 
+    ErrorReview getErrorReview(@Param("errorReviewId") Integer errorReviewId);
+
+    List<String> findReviewImg(@Param("errorReviewId") Integer errorReviewId);
+
+
+    String getProjectName(@Param("checkTaskId") Integer checkTaskId);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AccidentBrief.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AccidentBrief.java
index b95006b..c99a8b2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AccidentBrief.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AccidentBrief.java
@@ -85,5 +85,9 @@
     @TableField("create_time")
     private LocalDateTime createTime;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "类别名称")
+    private String classifyName;
+
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/ClientParam.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/ClientParam.java
index efde24e..8f06b80 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/ClientParam.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/ClientParam.java
@@ -59,9 +59,13 @@
     @TableField("device_template_id")
     private Integer deviceTemplateId;
 
-    @ApiModelProperty(value = "项目总数")
-    @TableField("project_num")
-    private Integer projectNum;
+    @ApiModelProperty(value = "房建项目总数")
+    @TableField("housing_project_num")
+    private Integer housingProjectNum;
+
+    @ApiModelProperty(value = "市政项目总数")
+    @TableField("municipal_project_num")
+    private Integer municipalProjectNum;
 
     @ApiModelProperty(value = "在建项目json")
     @TableField("under_construction_project")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/Device.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/Device.java
new file mode 100644
index 0000000..d6c65d2
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/Device.java
@@ -0,0 +1,95 @@
+package com.ruoyi.system.model;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.ruoyi.system.enums.DeviceType;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 设备实体类
+ * </p>
+ *
+ * @author administrator
+ * @since 2026-01-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("device")
+@Slf4j
+public class Device extends Model<Device> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    private Boolean deleted;
+
+    /**
+     * 设备编号
+     */
+    private String name;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 设备是否正在使用中
+     */
+    private Boolean busy;
+
+    /**
+     * 出厂编号
+     */
+    @TableField("manufacturer_number")
+    private String manufacturerNumber;
+
+    /**
+     * 设备详细信息(JSON格式)
+     */
+    private String properties;
+
+    /**
+     * 设备类型(数据库存储值:1-10)
+     * 1-塔式起重机 2-施工升降机 3-物料提升机 4-桥式起重机
+     * 5-附着式升降脚手架 6-流动式起重机 7-高处作业吊篮
+     * 8-门式起重机 9-架桥机 10-其他
+     *
+     * 需要通过 getDeviceType() 方法转换为 DeviceType 枚举
+     */
+    private Integer type;
+
+    @TableField("creator_id")
+    private Integer creatorId;
+
+    /**
+     * 获取设备类型枚举
+     * <p>
+     * 数据库 type 值范围:1-10
+     * DeviceType 枚举序号:0-9
+     * 转换公式:DeviceType.values()[type - 1]
+     * </p>
+     *
+     * @return DeviceType 枚举,如果 type 无效则返回 OTHER
+     */
+    public DeviceType getDeviceType() {
+        // 数据库值减1得到枚举序号
+        DeviceType value = DeviceType.values()[type ];
+        return value;
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/ErrorReview.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/ErrorReview.java
new file mode 100644
index 0000000..b6d71e1
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/ErrorReview.java
@@ -0,0 +1,62 @@
+package com.ruoyi.system.model;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author administrator
+ * @since 2026-01-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("error_review")
+public class ErrorReview extends Model<ErrorReview> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    @TableField("create_time")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+    private Boolean deleted;
+    @ApiModelProperty(value = "名称")
+    private String name;
+    @TableField("update_time")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+    @ApiModelProperty(value = "复核内容")
+    private String content;
+    @ApiModelProperty(value = "0未整改  1部分整改  2已整改")
+    private Integer state;
+    @TableField("creator_id")
+    private Integer creatorId;
+
+    @ApiModelProperty(value = "复核人")
+    private String  creator;
+
+
+    @ApiModelProperty(value = "图片 没有前缀")
+    private List<String> img;
+
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/EntrustDeviceListQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/EntrustDeviceListQuery.java
index b8ac3e6..d392dee 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/EntrustDeviceListQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/EntrustDeviceListQuery.java
@@ -12,7 +12,6 @@
 public class EntrustDeviceListQuery extends BasePage {
 
     @ApiModelProperty("项目id")
-    @NotNull(message = "项目id不能为空")
     private Integer projectId;
     @ApiModelProperty("整改情况 true已整改 false未整改")
     private Boolean reformed;
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 9272541..2f84239 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
@@ -24,7 +24,7 @@
 
     List<HiddenDangerListVo> getHiddenDangerList(Page<HiddenDangerListVo> page, @Valid HiddenDangerListQuery query, List<Integer> taskIds);
 
-    ProblemVo getHiddenDangerDetail(Integer problemId);
+    ProblemVo getHiddenDangerDetail(Integer id);
 
 
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClientServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClientServiceImpl.java
index 45264b2..80c1689 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClientServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClientServiceImpl.java
@@ -6,20 +6,10 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.system.mapper.CheckMapper;
-import com.ruoyi.system.mapper.ClientMapper;
-import com.ruoyi.system.mapper.DeviceUsageMapper;
-import com.ruoyi.system.mapper.PlanMapper;
-import com.ruoyi.system.mapper.ProjectMapper;
-import com.ruoyi.system.mapper.RecordMapper;
-import com.ruoyi.system.mapper.TaskMapper;
-import com.ruoyi.system.model.Check;
-import com.ruoyi.system.model.Client;
-import com.ruoyi.system.model.DeviceUsage;
-import com.ruoyi.system.model.Plan;
-import com.ruoyi.system.model.Project;
+import com.ruoyi.system.enums.DeviceType;
+import com.ruoyi.system.mapper.*;
+import com.ruoyi.system.model.*;
 import com.ruoyi.system.model.Record;
-import com.ruoyi.system.model.Task;
 import com.ruoyi.system.service.ClientService;
 import com.ruoyi.system.service.ProjectCategoryCalculator;
 import com.ruoyi.system.vo.*;
@@ -55,6 +45,8 @@
     private final DeviceUsageMapper deviceUsageMapper;
     private final RecordMapper recordMapper;
     private final ProjectCategoryCalculator projectCategoryCalculator;
+    private final ClientParamMapper clientParamMapper;
+    private final DeviceMapper deviceMapper;
 
     @Override
     public ClientDashboardVO getClientDashboard(ClientDashboardQuery query) {
@@ -145,6 +137,15 @@
                         .distinct()
                         .toList();
 
+                // 查询配置的项目总数
+                ClientParam clientParam = null;
+                if (clientId != null) {
+                    clientParam = clientParamMapper.selectOne(
+                        new LambdaQueryWrapper<ClientParam>()
+                            .eq(ClientParam::getClientId, clientId.intValue())
+                    );
+                }
+
                 // 房建检查覆盖率
                 List<Integer> housingProjectIds = projects.stream()
                         .filter(p -> p.getType() != null && p.getType() == 0)
@@ -153,8 +154,13 @@
                 long checkedHousingCount = checkedProjectIds.stream()
                         .filter(housingProjectIds::contains)
                         .count();
+
+                // 使用配置的房建项目总数,如果没有配置则使用实际数量
+                int configuredHousingNum = (clientParam != null && clientParam.getHousingProjectNum() != null)
+                        ? clientParam.getHousingProjectNum()
+                        : (int) housingCount;
                 vo.setHousingInspectionCoverage(
-                        housingCount > 0 ? (int) Math.round(checkedHousingCount * 100.0 / housingCount) : 0
+                        configuredHousingNum > 0 ? (int) Math.round(checkedHousingCount * 100.0 / configuredHousingNum) : 0
                 );
 
                 // 市政检查覆盖率
@@ -165,8 +171,13 @@
                 long checkedMunicipalCount = checkedProjectIds.stream()
                         .filter(municipalProjectIds::contains)
                         .count();
+
+                // 使用配置的市政项目总数,如果没有配置则使用实际数量
+                int configuredMunicipalNum = (clientParam != null && clientParam.getMunicipalProjectNum() != null)
+                        ? clientParam.getMunicipalProjectNum()
+                        : (int) municipalCount;
                 vo.setMunicipalInspectionCoverage(
-                        municipalCount > 0 ? (int) Math.round(checkedMunicipalCount * 100.0 / municipalCount) : 0
+                        configuredMunicipalNum > 0 ? (int) Math.round(checkedMunicipalCount * 100.0 / configuredMunicipalNum) : 0
                 );
             } else {
                 vo.setHousingInspectionCoverage(0);
@@ -234,47 +245,7 @@
         // 1. 统计项目总数
         vo.setProjectTotal(projects.size());
 
-        // 计算检查覆盖率
         List<Integer> projectIds = projects.stream().map(Project::getId).collect(Collectors.toList());
-        if (!projectIds.isEmpty()) {
-            // 1. 先查询符合条件的 Task
-            LambdaQueryWrapper<Task> taskWrapper = new LambdaQueryWrapper<>();
-            taskWrapper.in(Task::getProjectId, projectIds)
-                    .eq(Task::getDeleted, false);
-            List<Task> tasks = taskMapper.selectList(taskWrapper);
-
-            if (!tasks.isEmpty()) {
-                // 2. 获取 Task ID 列表
-                List<Integer> taskIds = tasks.stream().map(Task::getId).collect(Collectors.toList());
-
-                // 3. 建立 Task ID 到 Project ID 的映射
-                Map<Integer, Integer> taskToProjectMap = tasks.stream()
-                        .collect(Collectors.toMap(Task::getId, Task::getProjectId));
-
-                // 4. 查询 record 表中 record_type='error' 且 device_id 为 null 的记录(项目检查)
-                LambdaQueryWrapper<Record> recordWrapper = new LambdaQueryWrapper<>();
-                recordWrapper.eq(Record::getRecordType, "error")
-                        .isNull(Record::getDeviceId)
-                        .in(Record::getCheckTaskId, taskIds)
-                        .eq(Record::getDeleted, false);
-                List<Record> projectRecords = recordMapper.selectList(recordWrapper);
-
-                // 5. 通过 Task 映射获取有检查记录的项目 ID
-                long checkedProjectCount = projectRecords.stream()
-                        .map(Record::getCheckTaskId)
-                        .map(taskToProjectMap::get)
-                        .filter(Objects::nonNull)
-                        .distinct()
-                        .count();
-                vo.setInspectionCoverage(
-                        projects.size() > 0 ? (int) Math.round(checkedProjectCount * 100.0 / projects.size()) : 0
-                );
-            } else {
-                vo.setInspectionCoverage(0);
-            }
-        } else {
-            vo.setInspectionCoverage(0);
-        }
 
         // 2. 统计本月检查情况
         calculateMonthlyInspectionForFixed(vo, projects, projectIds, monthStart, monthEnd);
@@ -433,19 +404,54 @@
                 .in(DeviceUsage::getProjectId, projectIds);
         List<DeviceUsage> devices = deviceUsageMapper.selectList(deviceWrapper);
 
-        // 按设备名称分组统计
+        // 批量查询 Device 信息
+        List<Integer> deviceIds = devices.stream()
+                .map(DeviceUsage::getDeviceId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+
+        Map<Integer, Device> deviceMap = new HashMap<>();
+        if (!deviceIds.isEmpty()) {
+            List<Device> deviceList = deviceMapper.selectBatchIds(deviceIds);
+            deviceMap = deviceList.stream()
+                    .collect(Collectors.toMap(Device::getId, d -> d));
+            log.debug("批量查询到 {} 个设备信息", deviceMap.size());
+
+            // 检查是否有设备信息查询失败
+            if (deviceIds.size() != deviceMap.size()) {
+                log.warn("部分设备信息查询失败,期望 {} 个,实际查询到 {} 个",
+                         deviceIds.size(), deviceMap.size());
+            }
+        }
+
+        // 按设备类型名称分组统计
+        final Map<Integer, Device> finalDeviceMap = deviceMap;
         Map<String, List<DeviceUsage>> deviceGroupMap = devices.stream()
-                .filter(d -> d.getName() != null && !d.getName().isEmpty())
-                .collect(Collectors.groupingBy(DeviceUsage::getName));
+                .filter(d -> d.getDeviceId() != null)
+                .filter(d -> finalDeviceMap.containsKey(d.getDeviceId()))
+                .collect(Collectors.groupingBy(d -> {
+                    try {
+                        Device device = finalDeviceMap.get(d.getDeviceId());
+                        return device.getDeviceType().getDesc();
+                    } catch (Exception e) {
+                        log.error("获取设备类型失败,deviceId: {}", d.getDeviceId(), e);
+                        return DeviceType.OTHER.getDesc();
+                    }
+                }));
+
+        log.debug("设备按类型分组完成,共 {} 种类型", deviceGroupMap.size());
 
         // 查询设备检查记录
-        List<Integer> deviceIds = devices.stream().map(DeviceUsage::getId).collect(Collectors.toList());
+        List<Integer> deviceUsageIds = devices.stream()
+                .map(DeviceUsage::getId)
+                .collect(Collectors.toList());
         Map<Integer, Boolean> deviceInspectionMap = new HashMap<>();
-        if (!deviceIds.isEmpty()) {
+        if (!deviceUsageIds.isEmpty()) {
             LambdaQueryWrapper<Record> recordWrapper = new LambdaQueryWrapper<>();
             recordWrapper.eq(Record::getRecordType, "error")
                     .isNotNull(Record::getDeviceId)
-                    .in(Record::getDeviceId, deviceIds)
+                    .in(Record::getDeviceId, deviceUsageIds)
                     .eq(Record::getDeleted, false);
             List<Record> records = recordMapper.selectList(recordWrapper);
 
@@ -453,8 +459,8 @@
                     .map(Record::getDeviceId)
                     .collect(Collectors.toSet());
 
-            for (Integer deviceId : deviceIds) {
-                deviceInspectionMap.put(deviceId, inspectedDeviceIds.contains(deviceId));
+            for (Integer deviceUsageId : deviceUsageIds) {
+                deviceInspectionMap.put(deviceUsageId, inspectedDeviceIds.contains(deviceUsageId));
             }
         }
 
@@ -465,6 +471,16 @@
             vo.setName(entry.getKey());
             vo.setTotal(entry.getValue().size());
 
+            // 设置设备类型字段
+            // 从当前分组的第一个设备使用记录中获取设备类型
+            if (!entry.getValue().isEmpty()) {
+                DeviceUsage firstUsage = entry.getValue().get(0);
+                Device device = finalDeviceMap.get(firstUsage.getDeviceId());
+                if (device != null && device.getType() != null) {
+                    vo.setType(device.getType());
+                }
+            }
+
             long inspectedCount = entry.getValue().stream()
                     .filter(d -> deviceInspectionMap.getOrDefault(d.getId(), false))
                     .count();
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RecordServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RecordServiceImpl.java
index 278922e..dca8ae0 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RecordServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RecordServiceImpl.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.system.mapper.RecordImageMapper;
 import com.ruoyi.system.mapper.RecordMapper;
+import com.ruoyi.system.model.ErrorReview;
 import com.ruoyi.system.model.Record;
 import com.ruoyi.system.model.RecordImage;
 import com.ruoyi.system.model.UserFile;
@@ -70,9 +71,14 @@
     }
 
     @Override
-    public ProblemVo getHiddenDangerDetail(Integer problemId) {
+    public ProblemVo getHiddenDangerDetail(Integer id) {
+        // 根据id找到记录
+        Record record = baseMapper.selectById(id);
         // 直接查询并返回,让前端处理JSON字符串解析
-        ProblemVo hiddenDangerDetail = baseMapper.getHiddenDangerDetail(problemId);
+        ProblemVo hiddenDangerDetail = baseMapper.getHiddenDangerDetail(record.getProblemId());
+        String projectName =baseMapper.getProjectName(record.getCheckTaskId());
+        hiddenDangerDetail.setProjectName(projectName);
+
         if(hiddenDangerDetail!=null){
             if (hiddenDangerDetail.getSpecificTermsStr()!=null && !hiddenDangerDetail.getSpecificTermsStr().isEmpty()) {
                 String specificTermsStr = hiddenDangerDetail.getSpecificTermsStr();
@@ -89,6 +95,17 @@
                 hiddenDangerDetail.setNumberFactors(JSON.parseArray(numberFactorsStr, String.class));
             }
         }
+        Integer errorReviewId = record.getErrorReviewId();
+        if(errorReviewId!=null){
+            ErrorReview errorReview = baseMapper.getErrorReview(errorReviewId);
+            if(errorReview!=null){
+                // 查询图片
+                List<String> img = baseMapper.findReviewImg(errorReviewId);
+                errorReview.setImg(img);
+                hiddenDangerDetail.setErrorReview(errorReview);
+            }
+        }
+
         return hiddenDangerDetail;
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ReportServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ReportServiceImpl.java
deleted file mode 100644
index 30054c9..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ReportServiceImpl.java
+++ /dev/null
@@ -1,264 +0,0 @@
-package com.ruoyi.system.service.impl;
-
-
-import com.alibaba.fastjson2.JSONObject;
-import com.ruoyi.system.enums.BizResultCode;
-import com.ruoyi.system.model.ReportTemplate;
-import com.ruoyi.system.service.*;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.io.ByteArrayInputStream;
-import java.io.OutputStream;
-
-/**
- * 报告数据服务实现类
- **/
-@Slf4j
-@Service
-public class ReportServiceImpl implements ReportService {
-
-    @Resource
-    private ReportTemplateService reportTemplateService;
-
-    @Resource
-    private ProjectInfoService projectInfoService;
-
-    @Resource
-    private DeviceUsageService deviceUsageService;
-
-    @Resource
-    private EvalFuzzyService evalFuzzyService;
-
-    @Resource
-    private EvalScoreService evalScoreService;
-
-    @Resource
-    private ErrorRecordService errorRecordService;
-
-    @Resource
-    private DeviceService deviceService;
-
-    @Resource
-    private UserFileService userFileService;
-
-    @Override
-    public JSONObject fuzzyReportData(Integer checkTaskId, Integer templateId) {
-        var evalFuzzyResult = evalFuzzyService.getByCheckTaskId(checkTaskId);
-        BizResultCode.EVAL_FUZZY_RESULT_NOT_EXIST.check(evalFuzzyResult == null);
-
-        var evalScoreResult =  evalScoreService.getByCheckTaskId(checkTaskId);
-        BizResultCode.EVAL_SCORE_RESULT_NOT_EXIST.check(evalScoreResult == null);
-
-        var reportTemplate = reportTemplateService.get(templateId);
-        BizResultCode.BIZ_REPORT_TEMPLATE_NOT_EXIST.check(reportTemplate == null);
-
-        switch (reportTemplate.getType()) {
-            case ThirdPartyReport:
-                return buildFuzzySystemReportData(evalFuzzyResult, evalScoreResult, reportTemplate);
-            case DeviceReport:
-                return buildFuzzyDeviceReportData(evalFuzzyResult, evalScoreResult, reportTemplate);
-            default:
-                throw new BizException(BizResultCode.BIZ_REPORT_TEMPLATE_TYPE_NOT_EXIST);
-        }
-    }
-
-    @Override
-    public JSONObject scoreReportData(Integer checkTaskId, Integer templateId) {
-        var evalFuzzyResult = evalFuzzyService.getByCheckTaskId(checkTaskId);
-        BizResultCode.EVAL_FUZZY_RESULT_NOT_EXIST.check(evalFuzzyResult == null);
-
-        var evalScoreResult =  evalScoreService.getByCheckTaskId(checkTaskId);
-        BizResultCode.EVAL_SCORE_RESULT_NOT_EXIST.check(evalScoreResult == null);
-
-        var reportTemplate = reportTemplateService.get(templateId);
-        BizResultCode.BIZ_REPORT_TEMPLATE_NOT_EXIST.check(reportTemplate == null);
-
-        switch (reportTemplate.getType()) {
-            case ThirdPartyReport:
-                return buildScoreSystemReportData(evalFuzzyResult, evalScoreResult, reportTemplate);
-            case DeviceReport:
-                return buildScoreDeviceReportData(evalFuzzyResult, evalScoreResult, reportTemplate);
-            default:
-                throw new BizException(BizResultCode.BIZ_REPORT_TEMPLATE_TYPE_NOT_EXIST);
-        }
-    }
-
-    @Override
-    public XWPFTemplate fuzzyReport(Integer checkTaskId, Integer templateId) {
-        var reportData = fuzzyReportData(checkTaskId, templateId);
-        var builder = getReportBuilder(templateId);
-        var template = reportTemplateService.get(templateId);
-
-        // reportData to JSONObject
-        return builder.buildReport(reportData, template.getConfig());
-    }
-
-    @Override
-    public XWPFTemplate scoreReport(Integer checkTaskId, Integer templateId) {
-        var reportData = scoreReportData(checkTaskId, templateId);
-        var builder = getReportBuilder(templateId);
-        var template = reportTemplateService.get(templateId);
-
-        // reportData to JSONObject
-        return builder.buildReport(reportData, template.getConfig());
-    }
-
-    @Override
-    public void fuzzyReportPdf(Integer checkTaskId, Integer templateId, OutputStream outputStream) {
-        try (var doc = fuzzyReport(checkTaskId, templateId)) {
-            convertToPdf(doc, outputStream);
-        } catch (Exception e) {
-            log.error("生成模糊评价PDF报告失败", e);
-            throw new BizException("生成模糊评价PDF报告失败");
-        }
-    }
-
-    @Override
-    public void scoreReportPdf(Integer checkTaskId, Integer templateId, OutputStream outputStream) {
-        try (var doc = scoreReport(checkTaskId, templateId)) {
-            convertToPdf(doc, outputStream);
-        } catch (Exception e) {
-            log.error("生成打分评价PDF报告失败", e);
-            throw new BizException("生成打分评价PDF报告失败");
-        }
-    }
-
-    /**
-     * 将Word文档转换为PDF
-     * @param template Word模板
-     * @param outputStream 输出流
-     */
-    private void convertToPdf(XWPFTemplate template, OutputStream outputStream) throws Exception {
-        // 先将Word模板写入字节数组
-        ByteArrayOutputStream docOutputStream = new ByteArrayOutputStream();
-        template.write(docOutputStream);
-
-        // 从字节数组读取Word文档
-        ByteArrayInputStream docInputStream = new ByteArrayInputStream(docOutputStream.toByteArray());
-        org.apache.poi.xwpf.usermodel.XWPFDocument document = new org.apache.poi.xwpf.usermodel.XWPFDocument(docInputStream);
-
-        // 转换为PDF
-        PdfOptions options = PdfOptions.create();
-        PdfConverter.getInstance().convert(document, outputStream, options);
-
-        // 关闭资源
-        document.close();
-        docInputStream.close();
-        docOutputStream.close();
-    }
-
-    private ReportBuilderBase getReportBuilder(Integer templateId) {
-        var reportTemplate = reportTemplateService.get(templateId);
-        BizResultCode.BIZ_REPORT_TEMPLATE_NOT_EXIST.check(reportTemplate == null);
-        switch (reportTemplate.getType()) {
-            case ThirdPartyReport:
-                return new SystemReportBuilder(userFileService);
-            case DeviceReport:
-                return new DeviceReportBuilder(userFileService);
-            default:
-                throw new BizException(BizResultCode.BIZ_REPORT_TEMPLATE_TYPE_NOT_EXIST);
-        }
-    }
-
-    private JSONObject buildFuzzySystemReportData(EvalFuzzyResult evalFuzzyResult, EvalScoreResult scoreResult, ReportTemplate reportTemplate) {
-        // 查询必须要的数据
-        var records = errorRecordService.listSystemErrors(evalFuzzyResult.getTask().getId());
-        var project = evalFuzzyResult.getProject();
-        var projectInfo = evalFuzzyResult.getTask().getProjectInfo();
-//        var projectInfo = projectInfoService.getByCheckTaskId(evalFuzzyResult.getTask().getId());
-        var deviceUsages = deviceUsageService.listUsages(project.getId(), null);
-        var devices= deviceUsages.stream().map(DeviceUsage::getDevice).toList();
-        var hierarchy = evalFuzzyResult.getPlan().getSystemScoreExpert().getModel().getHierarchy().getContent();
-
-        // 生成报告数据
-        return SystemFuzzyReportData.builder()
-                .reportId(evalFuzzyResult.getId())
-                .systemHierarchy(hierarchy)
-                .sysResult(evalFuzzyResult.getSystemRes())
-                .scoreResult(scoreResult.getSystemRes())
-                .template(reportTemplate)
-                .project(project)
-                .projectInfo(projectInfo)
-                .devices(devices)
-                .records(records)
-                .build()
-                .generate();
-    }
-
-    private JSONObject buildScoreSystemReportData(EvalFuzzyResult evalFuzzyResult, EvalScoreResult scoreResult, ReportTemplate reportTemplate) {
-        // 查询必须要的数据
-        var records = errorRecordService.listSystemErrors(evalFuzzyResult.getTask().getId());
-        var project = evalFuzzyResult.getProject();
-//        var projectInfo = projectInfoService.latest(evalFuzzyResult.getProject().getId());
-        var projectInfo = evalFuzzyResult.getTask().getProjectInfo();
-        var deviceUsages = deviceUsageService.listUsages(project.getId(), null);
-        var devices= deviceUsages.stream().map(DeviceUsage::getDevice).toList();
-        var hierarchy = evalFuzzyResult.getPlan().getSystemScoreExpert().getModel().getHierarchy().getContent();
-
-        // 生成报告数据
-        return SystemScoreReportData.builder()
-                .reportId(evalFuzzyResult.getId())
-                .systemHierarchy(hierarchy)
-                .sysResult(evalFuzzyResult.getSystemRes())
-                .scoreResult(scoreResult.getSystemRes())
-                .template(reportTemplate)
-                .project(project)
-                .projectInfo(projectInfo)
-                .devices(devices)
-                .records(records)
-                .build()
-                .generate();
-    }
-
-    private JSONObject buildFuzzyDeviceReportData(EvalFuzzyResult evalFuzzyResult, EvalScoreResult scoreResult,  ReportTemplate reportTemplate) {
-        var records = errorRecordService.listDeviceErrors(evalFuzzyResult.getTask().getId());
-        var project = evalFuzzyResult.getProject();
-        var projectInfo = evalFuzzyResult.getTask().getProjectInfo();
-//        var projectInfo = projectInfoService.getByCheckTaskId(evalFuzzyResult.getTask().getId());
-        var deviceIds = evalFuzzyResult.getDeviceResMap().keySet();
-        var devices = deviceService.findAllById(deviceIds);
-        var hierarchy = evalFuzzyResult.getPlan().getDeviceScoreExpert().getModel().getHierarchy().getContent();
-
-        // 生成报告数据
-        return DeviceFuzzyReportData.builder()
-                .reportId(evalFuzzyResult.getId())
-                .deviceResMap(evalFuzzyResult.getDeviceResMap())
-                .deviceHierarchy(hierarchy)
-                .template(reportTemplate)
-                .project(project)
-                .projectInfo(projectInfo)
-                .devices(devices)
-                .records(records)
-                .build()
-                .generate();
-    }
-
-    private JSONObject buildScoreDeviceReportData(EvalFuzzyResult evalFuzzyResult, EvalScoreResult evalScoreResult, ReportTemplate reportTemplate) {
-        var records = errorRecordService.listDeviceErrors(evalFuzzyResult.getTask().getId());
-        var project = evalFuzzyResult.getProject();
-//        var projectInfo = projectInfoService.getByCheckTaskId(evalFuzzyResult.getTask().getId());
-        var projectInfo = evalFuzzyResult.getTask().getProjectInfo();
-        var deviceIds = evalFuzzyResult.getDeviceResMap().keySet();
-        var devices = deviceService.findAllById(deviceIds);
-        var hierarchy = evalFuzzyResult.getPlan().getDeviceScoreExpert().getModel().getHierarchy().getContent();
-
-        // 生成报告数据
-        return DeviceScoreReportData.builder()
-                .reportId(evalFuzzyResult.getId())
-                .deviceResMap(evalFuzzyResult.getDeviceResMap())
-                .deviceScoreResMap(evalScoreResult.getDeviceResMap())
-                .deviceHierarchy(hierarchy)
-                .template(reportTemplate)
-                .project(project)
-                .projectInfo(projectInfo)
-                .devices(devices)
-                .records(records)
-                .build()
-                .generate();
-    }
-
-
-
-}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeviceCountVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeviceCountVo.java
index f7c1bd8..8a48664 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeviceCountVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeviceCountVo.java
@@ -12,4 +12,7 @@
 
     @ApiModelProperty("设备类型")
     private Integer type;
+
+    @ApiModelProperty("设备名称")
+    private String name;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FixedAssetDashboardVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FixedAssetDashboardVO.java
index 4ca1ba5..38079b8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FixedAssetDashboardVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FixedAssetDashboardVO.java
@@ -20,9 +20,6 @@
     @ApiModelProperty("项目总数")
     private Integer projectTotal;
 
-    @ApiModelProperty("检查覆盖率(百分比,如:77 表示 77%)")
-    private Integer inspectionCoverage;
-
     // ==================== 本月检查情况 ====================
     @ApiModelProperty("已检查项目数")
     private Integer inspectedCount;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/MachineryStatisticsVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/MachineryStatisticsVO.java
index 28ae4fa..b5a6c75 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/MachineryStatisticsVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/MachineryStatisticsVO.java
@@ -13,6 +13,8 @@
 @Data
 @ApiModel("机械设备统计数据")
 public class MachineryStatisticsVO {
+    @ApiModelProperty("设备类型")
+    private Integer type;
 
     @ApiModelProperty("设备名称")
     private String name;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProblemVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProblemVo.java
index 77af953..60a9e97 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProblemVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProblemVo.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.vo;
 
 
+import com.ruoyi.system.model.ErrorReview;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Builder;
@@ -68,4 +69,10 @@
 
     @ApiModelProperty(value = "问题数量集合")
     List<String> numberFactors;
+
+    @ApiModelProperty(value = "复核信息")
+    ErrorReview errorReview;
+
+    @ApiModelProperty(value = "项目名称")
+    String projectName;
 }
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/RecordMapper.xml b/ruoyi-system/src/main/resources/mapper/system/RecordMapper.xml
index b359e23..196b13b 100644
--- a/ruoyi-system/src/main/resources/mapper/system/RecordMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/RecordMapper.xml
@@ -60,7 +60,7 @@
             and t1.create_time between #{query.startTime} and #{query.endTime}
         </if>
 
-        ) as o
+        ) as o where 1=1
         <if test="query.type != null">
             and o.type = #{query.type}
         </if>
@@ -72,5 +72,27 @@
         from problem
         where id = #{problemId}
     </select>
+    <select id="getErrorReview" resultType="com.ruoyi.system.model.ErrorReview">
+        select t1.id, t1.create_time,
+            t1.deleted,
+            t1.name,
+            t1.update_time,
+            t1.content,
+            t1.state,
+            t1.creator_id, t2.name creator
+        from error_review t1
+                 left join user t2 on t1.creator_id = t2.id
+        where t1.id = #{errorReviewId}
+
+    </select>
+    <select id="findReviewImg" resultType="java.lang.String">
+        select CONCAT(t2.name, '.', t2.extension) from error_review_image t1
+                 left join user_file t2 on t1.user_file_id = t2.id
+        where t1.error_review_id = #{errorReviewId}
+    </select>
+    <select id="getProjectName" resultType="java.lang.String">
+        select t2.name from task t1 left join project t2 on t1.project_id = t2.id
+                    where t1.id = #{checkTaskId}
+    </select>
 
 </mapper>

--
Gitblit v1.7.1