Merge remote-tracking branch 'origin/main'

This commit is contained in:
gaowdong 2025-07-24 14:12:23 +08:00
commit fff70b88a4
11 changed files with 291 additions and 9 deletions

View File

@ -77,6 +77,9 @@ public class ParamSecureHandler implements AsyncHandlerInterceptor {
"/largeScreen/deviceEnergyAnalysis/selectEnergyStatsByDateRange",
"/largeScreen/deviceEnergyAnalysis/selectDeviceEnergyByDateRange",
"/largeScreen/deviceEnergyAnalysis/selectAnomalyByDateRange",
"/largeScreen/deviceEnergyAnalysis/selectLatestAll",
};
/**

View File

@ -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.*;

View File

@ -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<String, List<List<String>>> extractTablesFromWord(@RequestParam("file") MultipartFile file) {
Map<String, List<List<String>>> 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<XWPFTable> tables = document.getTables();
for (int i = 0; i < tables.size(); i++) {
XWPFTable table = tables.get(i);
List<List<String>> tableData = new ArrayList<>();
// 处理每一行
for (XWPFTableRow row : table.getRows()) {
List<String> 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;
}
}

View File

@ -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);
}
/**
* 查询最新统计日期下的所有节能减排措施数据
* <p>
* 功能说明
* 本接口接收客户端传入的查询条件封装在 EnergySavingMeasure 实体中
* 并调用 service 层方法从数据库中获取最新统计日期对应的节能减排措施记录列表
* 通常用于前端页面展示最近一期的节能数据概览
* <p>
* 请求方式
* POST /selectLatestAll
* <p>
* 请求参数
*
* @return AjaxResult 封装的查询结果
* @RequestBody EnergySavingMeasure entity
* - 可选字段示例
* - measureName: 节能措施名称用于精确筛选
* - siteId / projectId: 工地或项目编号如表中定义
* <p>
* 响应结果
*/
@PostMapping("selectLatestAll")
public AjaxResult selectLatestAll(@RequestBody EnergySavingMeasure entity) {
return service.selectLatestAll(entity);
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<DeviceEnergyAnalysis> 查询到的异常能耗记录列表
*/
List<DeviceEnergyAnalysis> selectAnomalyByDateRange(DeviceEnergyAnalysis entity);
/**
* 查询最新统计日期下的所有节能减排措施记录
* <p>
* 功能说明
* 该方法根据传入的查询条件如项目编号设备类型等 energy_saving_measures 表中查询
* 最新统计日期stat_date 最大值对应的全部数据记录用于展示当前工地节能措施覆盖情况
* <p>
* 查询逻辑
* 1. 确定当前表中最大的 stat_date即最新的数据日期
* 2. 在该日期下筛选所有匹配查询条件的记录
* 3. 返回按条件过滤的所有记录列表
* <p>
* 示例用途
* - 首页或概览页展示最近的节能覆盖数据
* - 周期性报表数据展示
* <p>
* 参数
*
* @param entity 查询条件封装实体可包含以下字段可选
* - measureName: 按措施名称过滤
* - projectId / siteId如果扩展了这些字段按项目或施工地过滤
* <p>
* 返回值
* @return List<EnergySavingMeasure> 最新日期下的所有匹配节能措施记录列表
*/
List<EnergySavingMeasure> selectLatestAll(EnergySavingMeasure entity);
}

View File

@ -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);
/**
* 查询最新统计日期下的所有节能减排措施记录
* <p>
* 功能说明
* 该方法根据传入的查询条件如项目编号设备类型等 energy_saving_measures 表中查询
* 最新统计日期stat_date 最大值对应的全部数据记录用于展示当前工地节能措施覆盖情况
* <p>
* 查询逻辑
* 1. 确定当前表中最大的 stat_date即最新的数据日期
* 2. 在该日期下筛选所有匹配查询条件的记录
* 3. 返回按条件过滤的所有记录列表
* <p>
* 示例用途
* - 首页或概览页展示最近的节能覆盖数据
* - 周期性报表数据展示
* <p>
* 参数
*
* @param entity 查询条件封装实体可包含以下字段可选
* - measureName: 按措施名称过滤
* - projectId / siteId如果扩展了这些字段按项目或施工地过滤
* <p>
* 返回值
* @return AjaxResult 封装的查询结果
*/
AjaxResult selectLatestAll(EnergySavingMeasure entity);
}

View File

@ -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("查询能耗异常分析失败");
}
}
/**
* 查询最新统计日期下的所有节能减排措施记录
* <p>
* 功能说明
* 该方法根据传入的查询条件如项目编号设备类型等 energy_saving_measures 表中查询
* 最新统计日期stat_date 最大值对应的全部数据记录用于展示当前工地节能措施覆盖情况
* <p>
* 查询逻辑
* 1. 确定当前表中最大的 stat_date即最新的数据日期
* 2. 在该日期下筛选所有匹配查询条件的记录
* 3. 返回按条件过滤的所有记录列表
* <p>
* 示例用途
* - 首页或概览页展示最近的节能覆盖数据
* - 周期性报表数据展示
* <p>
* 参数
*
* @param entity 查询条件封装实体可包含以下字段可选
* - measureName: 按措施名称过滤
* - projectId / siteId如果扩展了这些字段按项目或施工地过滤
* <p>
* 返回值
* @return AjaxResult 封装的查询结果
*/
@Override
public AjaxResult selectLatestAll(EnergySavingMeasure entity) {
try {
List<EnergySavingMeasure> maps = mapper.selectLatestAll(entity);
return AjaxResult.success(maps);
} catch (Exception e) {
log.error("查询失败: {}", e.getMessage(), e);
return AjaxResult.error("查询失败");
}
}
}

View File

@ -44,6 +44,26 @@
stat_date ASC;
</select>
<select id="selectLatestAll" resultType="com.securitycontrol.screen.domain.EnergySavingMeasure">
SELECT esm.id AS id,
esm.measure_name AS measureName,
esm.coverage_rate AS coverageRate,
esm.stat_date AS statDate
FROM energy_saving_measures esm
INNER JOIN (SELECT measure_name,
MAX(stat_date) AS max_date,
pro_id
FROM energy_saving_measures
WHERE pro_id = #{proId}
AND stat_date BETWEEN #{startDate} AND #{endDate}
GROUP BY measure_name, pro_id) t ON esm.measure_name = t.measure_name
AND esm.stat_date = t.max_date
AND esm.pro_id = t.pro_id
WHERE esm.pro_id = #{proId}
AND esm.stat_date BETWEEN #{startDate} AND #{endDate};
</select>

View File

@ -19,6 +19,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="level" column="level" />
<result property="timestamp" column="timestamp" />
<result property="name" column="name" />
<result property="proName" column="pro_name" />
<result property="workLocation" column="work_location" />
<result property="analysisReason" column="analysis_reason" />
</resultMap>
<!--查询安全隐患集合列表-->
@ -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