diff --git a/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/ParamSecureHandler.java b/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/ParamSecureHandler.java index 78d4417..71d1e41 100644 --- a/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/ParamSecureHandler.java +++ b/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/ParamSecureHandler.java @@ -77,6 +77,9 @@ public class ParamSecureHandler implements AsyncHandlerInterceptor { "/largeScreen/deviceEnergyAnalysis/selectEnergyStatsByDateRange", "/largeScreen/deviceEnergyAnalysis/selectDeviceEnergyByDateRange", "/largeScreen/deviceEnergyAnalysis/selectAnomalyByDateRange", + "/largeScreen/deviceEnergyAnalysis/selectLatestAll", + + }; /** diff --git a/securitycontrol-model/securitycontrol-files/src/main/java/com/securitycontrol/files/controller/FileUploadController.java b/securitycontrol-model/securitycontrol-files/src/main/java/com/securitycontrol/files/controller/FileUploadController.java index 6768dd9..3e46587 100644 --- a/securitycontrol-model/securitycontrol-files/src/main/java/com/securitycontrol/files/controller/FileUploadController.java +++ b/securitycontrol-model/securitycontrol-files/src/main/java/com/securitycontrol/files/controller/FileUploadController.java @@ -9,6 +9,10 @@ import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFTable; +import org.apache.poi.xwpf.usermodel.XWPFTableCell; +import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; diff --git a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/controller/DataAnalysisController.java b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/controller/DataAnalysisController.java index 0f5d80b..7ee172f 100644 --- a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/controller/DataAnalysisController.java +++ b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/controller/DataAnalysisController.java @@ -1,26 +1,27 @@ package com.securitycontrol.screen.controller; -import com.securitycontrol.common.core.utils.aes.StringHelper; import com.securitycontrol.common.core.web.controller.BaseController; import com.securitycontrol.common.core.web.domain.AjaxResult; import com.securitycontrol.common.core.web.page.TableDataInfo; -import com.securitycontrol.common.log.annotation.Log; -import com.securitycontrol.common.log.enums.OperationType; -import com.securitycontrol.entity.screen.dto.AccessMgeDto; import com.securitycontrol.entity.screen.dto.ScreenParamDto; -import com.securitycontrol.entity.screen.vo.AccessMgeVo; import com.securitycontrol.entity.screen.vo.DataAnalysisDetailVo; import com.securitycontrol.entity.screen.vo.ProjectQualityVo; import com.securitycontrol.screen.service.DataAnalysisService; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFTable; +import org.apache.poi.xwpf.usermodel.XWPFTableCell; +import org.apache.poi.xwpf.usermodel.XWPFTableRow; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.ByteArrayInputStream; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @className:DataAnalysisController @@ -79,4 +80,50 @@ public class DataAnalysisController extends BaseController { } return AjaxResult.success(list); } + + @PostMapping("uploadProQuality") + public Map>> extractTablesFromWord(@RequestParam("file") MultipartFile file) { + Map>> result = new HashMap<>(); + + try { + // 验证文件类型 + if (!file.getOriginalFilename().endsWith(".docx")) { + throw new IllegalArgumentException("仅支持.docx格式的文件"); + } + + // 将文件内容读取到字节数组 + byte[] fileBytes = file.getBytes(); + + // 从字节数组创建输入流 + try (ByteArrayInputStream bis = new ByteArrayInputStream(fileBytes); + XWPFDocument document = new XWPFDocument(bis)) { + + // 提取所有表格 + List tables = document.getTables(); + + for (int i = 0; i < tables.size(); i++) { + XWPFTable table = tables.get(i); + List> tableData = new ArrayList<>(); + + // 处理每一行 + for (XWPFTableRow row : table.getRows()) { + List rowData = new ArrayList<>(); + + // 处理每个单元格 + for (XWPFTableCell cell : row.getTableCells()) { + rowData.add(cell.getText()); + } + + tableData.add(rowData); + } + + result.put("表格" + (i + 1), tableData); + } + } + } catch (Exception e) { + throw new RuntimeException("处理Word文档时出错: " + e.getMessage(), e); + } + + return result; + } } diff --git a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/controller/DeviceEnergyAnalysisController.java b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/controller/DeviceEnergyAnalysisController.java index 3d461b9..e3ecf37 100644 --- a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/controller/DeviceEnergyAnalysisController.java +++ b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/controller/DeviceEnergyAnalysisController.java @@ -2,6 +2,7 @@ package com.securitycontrol.screen.controller; import com.securitycontrol.common.core.web.domain.AjaxResult; import com.securitycontrol.screen.domain.DeviceEnergyAnalysis; +import com.securitycontrol.screen.domain.EnergySavingMeasure; import com.securitycontrol.screen.service.DeviceEnergyAnalysisService; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -63,4 +64,31 @@ public class DeviceEnergyAnalysisController { public AjaxResult selectAnomalyByDateRange(@RequestBody DeviceEnergyAnalysis entity) { return service.selectAnomalyByDateRange(entity); } + + /** + * 查询最新统计日期下的所有节能减排措施数据。 + *

+ * 功能说明: + * 本接口接收客户端传入的查询条件(封装在 EnergySavingMeasure 实体中), + * 并调用 service 层方法,从数据库中获取“最新统计日期”对应的节能减排措施记录列表。 + * 通常用于前端页面展示最近一期的节能数据概览。 + *

+ * 请求方式: + * POST /selectLatestAll + *

+ * 请求参数: + * + * @return AjaxResult 封装的查询结果: + * @RequestBody EnergySavingMeasure entity + * - 可选字段示例: + * - measureName: 节能措施名称(用于精确筛选) + * - siteId / projectId: 工地或项目编号(如表中定义) + *

+ * 响应结果: + */ + @PostMapping("selectLatestAll") + public AjaxResult selectLatestAll(@RequestBody EnergySavingMeasure entity) { + return service.selectLatestAll(entity); + } + } diff --git a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/domain/EnergySavingMeasure.java b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/domain/EnergySavingMeasure.java new file mode 100644 index 0000000..a960c96 --- /dev/null +++ b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/domain/EnergySavingMeasure.java @@ -0,0 +1,68 @@ +package com.securitycontrol.screen.domain; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * EnergySavingMeasure 类表示某个统计周期下的节能减排措施信息。 + * 用于记录措施名称、覆盖率、统计日期等信息,并追踪创建与更新时间。 + * 可用于节能数据展示、趋势分析、覆盖率评估等场景。 + */ +@Data +public class EnergySavingMeasure { + + /** + * 主键ID,自增唯一标识符。 + */ + private Long id; + + /** + * 节能减排措施名称,例如 "照明节能"、"空调温控"、"智能设备管控" 等。 + * 用于识别该措施的类型。 + */ + private String measureName; + + /** + * 覆盖率(coverage rate),表示该措施在工地范围内的实施比例。 + * 取值范围为 0~1,通常以百分比展示(例如 0.85 表示 85%)。 + */ + private BigDecimal coverageRate; + + /** + * 统计日期,表示该数据记录对应的时间周期(如某天、某周、某月)。 + * 一般按日为单位进行统计。 + */ + private LocalDate statDate; + + /** + * 创建时间,表示该数据记录的创建时间戳。 + * 由系统自动生成,用于数据追踪。 + */ + private LocalDateTime createdAt; + + /** + * 更新时间,表示该数据记录的最近一次更新时间戳。 + * 由系统自动维护,用于记录数据变动历史。 + */ + private LocalDateTime updatedAt; + + /** + * 查询条件:开始时间(非数据库字段) + * 用于按时间段筛选数据 + */ + private String startDate; + + /** + * 查询条件:结束时间(非数据库字段) + * 用于按时间段筛选数据 + */ + private String endDate; + /** + * 工程ID(项目标识) + * 用于区分所属工程,可作为查询过滤条件 + */ + private String proId; +} diff --git a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/domain/EngineeringSafetyAnalysis.java b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/domain/EngineeringSafetyAnalysis.java index 0f8505d..ba26758 100644 --- a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/domain/EngineeringSafetyAnalysis.java +++ b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/domain/EngineeringSafetyAnalysis.java @@ -76,4 +76,16 @@ public class EngineeringSafetyAnalysis extends BaseEntity { @ApiModelProperty(value = "数量") private String count; + /** 工程名称 */ + @ApiModelProperty(value = "工程名称") + private String proName; + + /** 作业地点 */ + @ApiModelProperty(value = "作业地点") + private String workLocation; + + /** 分析原因 */ + @ApiModelProperty(value = "分析原因") + private String analysisReason; + } diff --git a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/mapper/DeviceEnergyAnalysisMapper.java b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/mapper/DeviceEnergyAnalysisMapper.java index 654155c..ae68acd 100644 --- a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/mapper/DeviceEnergyAnalysisMapper.java +++ b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/mapper/DeviceEnergyAnalysisMapper.java @@ -1,6 +1,7 @@ package com.securitycontrol.screen.mapper; import com.securitycontrol.screen.domain.DeviceEnergyAnalysis; +import com.securitycontrol.screen.domain.EnergySavingMeasure; import org.apache.ibatis.annotations.MapKey; import org.springframework.stereotype.Repository; @@ -74,4 +75,31 @@ public interface DeviceEnergyAnalysisMapper { * @return List 查询到的异常能耗记录列表 */ List selectAnomalyByDateRange(DeviceEnergyAnalysis entity); + + /** + * 查询最新统计日期下的所有节能减排措施记录。 + *

+ * 功能说明: + * 该方法根据传入的查询条件(如项目编号、设备类型等),从 energy_saving_measures 表中查询 + * 最新统计日期(stat_date 最大值)对应的全部数据记录,用于展示当前工地节能措施覆盖情况。 + *

+ * 查询逻辑: + * 1. 确定当前表中最大的 stat_date(即最新的数据日期); + * 2. 在该日期下筛选所有匹配查询条件的记录; + * 3. 返回按条件过滤的所有记录列表。 + *

+ * 示例用途: + * - 首页或概览页展示最近的节能覆盖数据; + * - 周期性报表数据展示; + *

+ * 参数: + * + * @param entity 查询条件封装实体,可包含以下字段(可选): + * - measureName: 按措施名称过滤; + * - projectId / siteId(如果扩展了这些字段):按项目或施工地过滤; + *

+ * 返回值: + * @return List 最新日期下的所有匹配节能措施记录列表。 + */ + List selectLatestAll(EnergySavingMeasure entity); } diff --git a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/service/DeviceEnergyAnalysisService.java b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/service/DeviceEnergyAnalysisService.java index 9f58d80..1559ce2 100644 --- a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/service/DeviceEnergyAnalysisService.java +++ b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/service/DeviceEnergyAnalysisService.java @@ -2,6 +2,7 @@ package com.securitycontrol.screen.service; import com.securitycontrol.common.core.web.domain.AjaxResult; import com.securitycontrol.screen.domain.DeviceEnergyAnalysis; +import com.securitycontrol.screen.domain.EnergySavingMeasure; import java.util.List; @@ -44,4 +45,31 @@ public interface DeviceEnergyAnalysisService { * @return AjaxResult 封装的查询结果: */ AjaxResult selectAnomalyByDateRange(DeviceEnergyAnalysis entity); + + /** + * 查询最新统计日期下的所有节能减排措施记录。 + *

+ * 功能说明: + * 该方法根据传入的查询条件(如项目编号、设备类型等),从 energy_saving_measures 表中查询 + * 最新统计日期(stat_date 最大值)对应的全部数据记录,用于展示当前工地节能措施覆盖情况。 + *

+ * 查询逻辑: + * 1. 确定当前表中最大的 stat_date(即最新的数据日期); + * 2. 在该日期下筛选所有匹配查询条件的记录; + * 3. 返回按条件过滤的所有记录列表。 + *

+ * 示例用途: + * - 首页或概览页展示最近的节能覆盖数据; + * - 周期性报表数据展示; + *

+ * 参数: + * + * @param entity 查询条件封装实体,可包含以下字段(可选): + * - measureName: 按措施名称过滤; + * - projectId / siteId(如果扩展了这些字段):按项目或施工地过滤; + *

+ * 返回值: + * @return AjaxResult 封装的查询结果: + */ + AjaxResult selectLatestAll(EnergySavingMeasure entity); } diff --git a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/service/impl/DeviceEnergyAnalysisServiceImpl.java b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/service/impl/DeviceEnergyAnalysisServiceImpl.java index da66386..8c888d4 100644 --- a/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/service/impl/DeviceEnergyAnalysisServiceImpl.java +++ b/securitycontrol-model/securitycontrol-screen/src/main/java/com/securitycontrol/screen/service/impl/DeviceEnergyAnalysisServiceImpl.java @@ -2,6 +2,7 @@ package com.securitycontrol.screen.service.impl; import com.securitycontrol.common.core.web.domain.AjaxResult; import com.securitycontrol.screen.domain.DeviceEnergyAnalysis; +import com.securitycontrol.screen.domain.EnergySavingMeasure; import com.securitycontrol.screen.mapper.DeviceEnergyAnalysisMapper; import com.securitycontrol.screen.service.DeviceEnergyAnalysisService; import lombok.extern.slf4j.Slf4j; @@ -80,4 +81,40 @@ public class DeviceEnergyAnalysisServiceImpl implements DeviceEnergyAnalysisServ return AjaxResult.error("查询能耗异常分析失败"); } } + + /** + * 查询最新统计日期下的所有节能减排措施记录。 + *

+ * 功能说明: + * 该方法根据传入的查询条件(如项目编号、设备类型等),从 energy_saving_measures 表中查询 + * 最新统计日期(stat_date 最大值)对应的全部数据记录,用于展示当前工地节能措施覆盖情况。 + *

+ * 查询逻辑: + * 1. 确定当前表中最大的 stat_date(即最新的数据日期); + * 2. 在该日期下筛选所有匹配查询条件的记录; + * 3. 返回按条件过滤的所有记录列表。 + *

+ * 示例用途: + * - 首页或概览页展示最近的节能覆盖数据; + * - 周期性报表数据展示; + *

+ * 参数: + * + * @param entity 查询条件封装实体,可包含以下字段(可选): + * - measureName: 按措施名称过滤; + * - projectId / siteId(如果扩展了这些字段):按项目或施工地过滤; + *

+ * 返回值: + * @return AjaxResult 封装的查询结果: + */ + @Override + public AjaxResult selectLatestAll(EnergySavingMeasure entity) { + try { + List maps = mapper.selectLatestAll(entity); + return AjaxResult.success(maps); + } catch (Exception e) { + log.error("查询失败: {}", e.getMessage(), e); + return AjaxResult.error("查询失败"); + } + } } diff --git a/securitycontrol-model/securitycontrol-screen/src/main/resources/mapper/DeviceEnergyAnalysisMapper.xml b/securitycontrol-model/securitycontrol-screen/src/main/resources/mapper/DeviceEnergyAnalysisMapper.xml index fbab46c..ca13586 100644 --- a/securitycontrol-model/securitycontrol-screen/src/main/resources/mapper/DeviceEnergyAnalysisMapper.xml +++ b/securitycontrol-model/securitycontrol-screen/src/main/resources/mapper/DeviceEnergyAnalysisMapper.xml @@ -44,6 +44,26 @@ stat_date ASC; + + diff --git a/securitycontrol-model/securitycontrol-screen/src/main/resources/mapper/EngineeringSafetyAnalysisMapper.xml b/securitycontrol-model/securitycontrol-screen/src/main/resources/mapper/EngineeringSafetyAnalysisMapper.xml index 251817a..92ff280 100644 --- a/securitycontrol-model/securitycontrol-screen/src/main/resources/mapper/EngineeringSafetyAnalysisMapper.xml +++ b/securitycontrol-model/securitycontrol-screen/src/main/resources/mapper/EngineeringSafetyAnalysisMapper.xml @@ -19,6 +19,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + @@ -34,9 +37,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" COALESCE(ale.avg_temperature, '-') AS temperature, COALESCE(ale.avg_humidity, '-') AS humidity, COALESCE(ale.avg_wind_speed, '-') AS wind_speed, - COALESCE(ale.avg_gas_value, '-') AS gas_value + COALESCE(ale.avg_gas_value, '-') AS gas_value, + pro.pro_name , + h.work_location, + h.analysis_reason FROM hazards h + LEFT JOIN tb_project_new pro on h.bid_code = pro.bid_code LEFT JOIN monitoring_points mp ON h.bid_code = mp.bid_code LEFT JOIN