diff --git a/das/src/main/java/com/das/common/constant/StatisticalAnalysisConstant.java b/das/src/main/java/com/das/common/constant/StatisticalAnalysisConstant.java index a1ba8fa7..cb3e8f27 100644 --- a/das/src/main/java/com/das/common/constant/StatisticalAnalysisConstant.java +++ b/das/src/main/java/com/das/common/constant/StatisticalAnalysisConstant.java @@ -6,9 +6,9 @@ package com.das.common.constant; public interface StatisticalAnalysisConstant { - String TREND_ANALYSE = "趋势分析"; + String TREND_ANALYSE = "单机分析"; String POWER_CURVE = "功率曲线"; - String TREND_CONTRAST = "趋势对比"; + String TREND_CONTRAST = "多机对比"; } diff --git a/das/src/main/java/com/das/common/constant/StatisticalAnalysisFunctionConstant.java b/das/src/main/java/com/das/common/constant/StatisticalAnalysisFunctionConstant.java new file mode 100644 index 00000000..2501bff8 --- /dev/null +++ b/das/src/main/java/com/das/common/constant/StatisticalAnalysisFunctionConstant.java @@ -0,0 +1,16 @@ +package com.das.common.constant; + +/** + * 统计分析 + */ +public interface StatisticalAnalysisFunctionConstant { + + + String INTERPOLATION = "interpolation"; + + String AVERAGE = "average"; + + String MAX = "max"; + + String min = "min"; +} diff --git a/das/src/main/java/com/das/modules/equipment/controller/EquipmentController.java b/das/src/main/java/com/das/modules/equipment/controller/EquipmentController.java index e35f05c6..c9fdb6a9 100644 --- a/das/src/main/java/com/das/modules/equipment/controller/EquipmentController.java +++ b/das/src/main/java/com/das/modules/equipment/controller/EquipmentController.java @@ -10,6 +10,7 @@ import com.das.modules.equipment.domain.dto.SysEquipmentDto; import com.das.modules.equipment.domain.dto.SysGenExtPropsDto; import com.das.modules.equipment.domain.vo.EquipmentTypeVo; import com.das.modules.equipment.domain.vo.SysEquipmentVo; +import com.das.modules.equipment.domain.vo.SysGenExtPropsVo; import com.das.modules.equipment.entity.SysEquipmentDocs; import com.das.modules.equipment.entity.SysGenExtProps; import com.das.modules.equipment.service.SysEquipmentService; @@ -148,7 +149,7 @@ public class EquipmentController { * @return 所有附属属性 */ @PostMapping("/extProps/add") - public R addSysEquipmentExtProps(@RequestBody SysGenExtPropsDto sysGenExtPropsDto) { + public R addSysEquipmentExtProps(@RequestBody SysGenExtPropsDto sysGenExtPropsDto) { //判断是否有权限 boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); if(!hasPermission){ @@ -162,7 +163,7 @@ public class EquipmentController { * @return 所有附属属性 */ @PostMapping("/extProps/update") - public R updateSysEquipmentExtProps(@RequestBody SysGenExtPropsDto sysGenExtPropsDto) { + public R updateSysEquipmentExtProps(@RequestBody SysGenExtPropsDto sysGenExtPropsDto) { //判断是否有权限 boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); if(!hasPermission){ @@ -176,7 +177,7 @@ public class EquipmentController { * @return 所有附属属性 */ @PostMapping("/extProps/query") - public R querySysEquipmentExtProps(@RequestBody SysGenExtPropsDto sysGenExtPropsDto) { + public R querySysEquipmentExtProps(@RequestBody SysGenExtPropsDto sysGenExtPropsDto) { //判断是否有权限 boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); if(!hasPermission){ @@ -197,8 +198,8 @@ public class EquipmentController { } @RequestMapping(value = "/file/upload", method = RequestMethod.POST) - public R> addFile(Long deviceId, String component,String folderName, List fileList) throws Exception { - List upload = sysEquipmentService.upload(deviceId, component,folderName, fileList); + public R> addFile(String folderName, List fileList){ + List upload = sysEquipmentService.upload(folderName, fileList); return R.success(upload); } @@ -208,23 +209,13 @@ public class EquipmentController { return R.success(fileList); } - @RequestMapping(value = "/file/read", method = RequestMethod.POST) + @RequestMapping(value = "/file/read", method = RequestMethod.GET) public void readFile(String path, HttpServletResponse response) throws IOException { if (StringUtils.isBlank(path)){ throw new ServiceException("请输入浏览的文件路径"); } response.setContentType("application/octet-stream"); sysEquipmentService.readFileToSteam(path, response.getOutputStream()); - } - @RequestMapping(value = "/file/delete", method = RequestMethod.GET) - public void deleteFile(String path, HttpServletResponse response) throws IOException { - if (StringUtils.isBlank(path)){ - throw new ServiceException("请输入浏览的文件路径"); - } - response.setContentType("application/octet-stream"); - sysEquipmentService.readFileToSteam(path, response.getOutputStream()); - - } } diff --git a/das/src/main/java/com/das/modules/equipment/domain/dto/SysGenExtPropsDto.java b/das/src/main/java/com/das/modules/equipment/domain/dto/SysGenExtPropsDto.java index 93887550..eda8508b 100644 --- a/das/src/main/java/com/das/modules/equipment/domain/dto/SysGenExtPropsDto.java +++ b/das/src/main/java/com/das/modules/equipment/domain/dto/SysGenExtPropsDto.java @@ -4,12 +4,15 @@ 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.das.modules.equipment.entity.SysEquipmentDocs; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + @Data @NoArgsConstructor @AllArgsConstructor @@ -67,4 +70,6 @@ public class SysGenExtPropsDto { private String mainControlSystemManufacturer; private String mainControlSystemSoftwareVersion; + + private List sysEquipmentDocsList; } diff --git a/das/src/main/java/com/das/modules/equipment/domain/vo/SysGenExtPropsVo.java b/das/src/main/java/com/das/modules/equipment/domain/vo/SysGenExtPropsVo.java new file mode 100644 index 00000000..a7fb34f4 --- /dev/null +++ b/das/src/main/java/com/das/modules/equipment/domain/vo/SysGenExtPropsVo.java @@ -0,0 +1,71 @@ +package com.das.modules.equipment.domain.vo; + +import com.das.modules.equipment.entity.SysEquipmentDocs; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysGenExtPropsVo { + + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + private String pitchSystemModel; + + private String pitchSystemManufacturer; + + private String blade1Model; + + private String blade1Manufacturer; + + private String blade1BearingModel; + + private String blade1BearingManufacturer; + + private String blade2Model; + + private String blade2Manufacturer; + + private String blade2BearingModel; + + private String blade2BearingManufacturer; + + private String blade3Model; + + private String blade3Manufacturer; + + private String blade3BearingModel; + + private String blade3BearingManufacturer; + + private String mainBearingModel; + + private String mainBearingManufacturer; + + private String gearboxModel; + + private String gearboxManufacturer; + + private String generatorModel; + + private String generatorManufacturer; + + private String converterModel; + + private String converterManufacturer; + + private String mainControlSystemModel; + + private String mainControlSystemManufacturer; + + private String mainControlSystemSoftwareVersion; + + private List sysEquipmentDocsList; +} diff --git a/das/src/main/java/com/das/modules/equipment/service/SysEquipmentService.java b/das/src/main/java/com/das/modules/equipment/service/SysEquipmentService.java index 90ba395f..10ba87a4 100644 --- a/das/src/main/java/com/das/modules/equipment/service/SysEquipmentService.java +++ b/das/src/main/java/com/das/modules/equipment/service/SysEquipmentService.java @@ -4,6 +4,7 @@ import com.das.common.utils.PageDataInfo; import com.das.modules.equipment.domain.dto.SysEquipmentDto; import com.das.modules.equipment.domain.dto.SysGenExtPropsDto; import com.das.modules.equipment.domain.vo.SysEquipmentVo; +import com.das.modules.equipment.domain.vo.SysGenExtPropsVo; import com.das.modules.equipment.entity.SysEquipmentDocs; import com.das.modules.equipment.entity.SysGenExtProps; import jakarta.servlet.http.HttpServletRequest; @@ -32,19 +33,17 @@ public interface SysEquipmentService { void importSysEquipment(String parentEquipmentId,MultipartFile file) throws IOException, ParseException; - SysGenExtProps creatSysEquipmentExtProps(SysGenExtPropsDto sysGenExtPropsDto); + SysGenExtPropsVo creatSysEquipmentExtProps(SysGenExtPropsDto sysGenExtPropsDto); - SysGenExtProps updateSysEquipmentExtProps(SysGenExtPropsDto sysGenExtPropsDto); + SysGenExtPropsVo updateSysEquipmentExtProps(SysGenExtPropsDto sysGenExtPropsDto); void deleteSysEquipmentExtProps(Long id); - SysGenExtProps querySysEquipmentExtProps(Long id); + SysGenExtPropsVo querySysEquipmentExtProps(Long id); - List upload(Long deviceId, String component,String folderName, List fileList) throws Exception; + List upload(String folderName, List fileList); List getFileList(Long deviceId, String component); void readFileToSteam(String path, OutputStream stream); - - void deleteFile(String path); } diff --git a/das/src/main/java/com/das/modules/equipment/service/impl/SysEquipmentServiceImpl.java b/das/src/main/java/com/das/modules/equipment/service/impl/SysEquipmentServiceImpl.java index 0524103c..42310c57 100644 --- a/das/src/main/java/com/das/modules/equipment/service/impl/SysEquipmentServiceImpl.java +++ b/das/src/main/java/com/das/modules/equipment/service/impl/SysEquipmentServiceImpl.java @@ -9,6 +9,7 @@ import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.das.common.config.SessionUtil; import com.das.common.constant.EquipmentTypeIds; import com.das.common.constant.FileConstants; @@ -28,6 +29,7 @@ import com.das.modules.equipment.domain.dto.SysEquipmentDto; import com.das.modules.equipment.domain.dto.SysGenExtPropsDto; import com.das.modules.equipment.domain.excel.SysEquipmentExcel; import com.das.modules.equipment.domain.vo.SysEquipmentVo; +import com.das.modules.equipment.domain.vo.SysGenExtPropsVo; import com.das.modules.equipment.entity.SysEquipment; import com.das.modules.equipment.entity.SysEquipmentDocs; import com.das.modules.equipment.entity.SysGenExtProps; @@ -46,6 +48,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -65,6 +68,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; +import java.util.stream.Collectors; @Transactional(rollbackFor = Exception.class) @Service @@ -396,25 +400,69 @@ public class SysEquipmentServiceImpl implements SysEquipmentService { } @Override - public SysGenExtProps creatSysEquipmentExtProps(SysGenExtPropsDto sysGenExtPropsDto) { + public SysGenExtPropsVo creatSysEquipmentExtProps(SysGenExtPropsDto sysGenExtPropsDto) { if (sysGenExtPropsDto.getId() == null) { throw new ServiceException("设备id不能为空"); } SysGenExtProps sysEquipmentExtProps = new SysGenExtProps(); BeanCopyUtils.copy(sysGenExtPropsDto, sysEquipmentExtProps); sysGenExtPropsMapper.insert(sysEquipmentExtProps); - return sysEquipmentExtProps; + List sysEquipmentDocsList = sysGenExtPropsDto.getSysEquipmentDocsList(); + if (CollectionUtils.isNotEmpty(sysEquipmentDocsList)){ + for (SysEquipmentDocs item : sysEquipmentDocsList){ + item.setUpdateTime(new Date()); + item.setDeviceId(sysGenExtPropsDto.getId()); + sysEquipmentDocsMapper.insert(item); + } + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("deviceid",sysGenExtPropsDto.getId()); + List resultList = sysEquipmentDocsMapper.selectList(queryWrapper); + SysGenExtPropsVo sysGenExtPropsVo = new SysGenExtPropsVo(); + BeanCopyUtils.copy(sysEquipmentExtProps,sysGenExtPropsVo); + sysGenExtPropsVo.setSysEquipmentDocsList(resultList); + return sysGenExtPropsVo; } @Override - public SysGenExtProps updateSysEquipmentExtProps(SysGenExtPropsDto sysGenExtPropsDto) { + public SysGenExtPropsVo updateSysEquipmentExtProps(SysGenExtPropsDto sysGenExtPropsDto) { if (sysGenExtPropsDto.getId() == null) { throw new ServiceException("设备id不能为空"); } SysGenExtProps sysEquipmentExtProps = new SysGenExtProps(); BeanCopyUtils.copy(sysGenExtPropsDto, sysEquipmentExtProps); sysGenExtPropsMapper.updateById(sysEquipmentExtProps); - return sysEquipmentExtProps; + List sysEquipmentDocsList = sysGenExtPropsDto.getSysEquipmentDocsList(); + if (CollectionUtils.isNotEmpty(sysEquipmentDocsList)){ + List insertList = sysEquipmentDocsList.stream().filter(item -> item.getId() == null).collect(Collectors.toList()); + sysEquipmentDocsList.removeAll(insertList); + if (CollectionUtils.isNotEmpty(sysEquipmentDocsList)){ + List collect = sysEquipmentDocsList.stream().map(SysEquipmentDocs::getId).collect(Collectors.toList()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("deviceid",sysGenExtPropsDto.getId()); + List sysEquipmentDocs = sysEquipmentDocsMapper.selectList(queryWrapper); + List collectDelete = sysEquipmentDocs.stream().filter(item -> !collect.contains(item.getId())).collect(Collectors.toList()); + //删除minio文件和数据库记录 + for (SysEquipmentDocs item : collectDelete){ + sysEquipmentDocsMapper.deleteById(item.getId()); + deleteFile(item); + + } + + } + for (SysEquipmentDocs item : insertList){ + item.setUpdateTime(new Date()); + item.setDeviceId(sysGenExtPropsDto.getId()); + sysEquipmentDocsMapper.insert(item); + } + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("deviceid",sysGenExtPropsDto.getId()); + List resultList = sysEquipmentDocsMapper.selectList(queryWrapper); + SysGenExtPropsVo sysGenExtPropsVo = new SysGenExtPropsVo(); + BeanCopyUtils.copy(sysEquipmentExtProps,sysGenExtPropsVo); + sysGenExtPropsVo.setSysEquipmentDocsList(resultList); + return sysGenExtPropsVo; } @Override @@ -426,7 +474,13 @@ public class SysEquipmentServiceImpl implements SysEquipmentService { List sysEquipmentDocsList = sysEquipmentDocsMapper.selectList(queryWrapper); if (CollectionUtils.isNotEmpty(sysEquipmentDocsList)){ for (SysEquipmentDocs item : sysEquipmentDocsList){ - deleteFile(item.getUrl()); + try { + minioViewsServcie.removeFile(minioAutoProperties.getPublicBucket(),item.getUrl(),false); + } + catch (Exception e){ + log.error("删除文件失败{}",e); + } + deleteFile(item); sysEquipmentDocsMapper.deleteById(item.getId()); } @@ -434,27 +488,39 @@ public class SysEquipmentServiceImpl implements SysEquipmentService { } @Override - public SysGenExtProps querySysEquipmentExtProps(Long id) { - return sysGenExtPropsMapper.selectById(id); + public SysGenExtPropsVo querySysEquipmentExtProps(Long id) { + SysGenExtProps sysGenExtProps = sysGenExtPropsMapper.selectById(id); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("deviceid",id); + List resultList = sysEquipmentDocsMapper.selectList(queryWrapper); + SysGenExtPropsVo sysGenExtPropsVo = new SysGenExtPropsVo(); + BeanCopyUtils.copy(sysGenExtProps,sysGenExtPropsVo); + sysGenExtPropsVo.setSysEquipmentDocsList(resultList); + return sysGenExtPropsVo; } @Override - public List upload(Long deviceId, String component, String folderName, List fileList) throws Exception { + public List upload(String folderName, List fileList){ List result = new ArrayList<>(); for (MultipartFile file : fileList) { - DeviceInfoCache deviceInfoCache = equipmentCache.getDeviceInfoCacheById(deviceId); - String parent = FileConstants.FILE_SEPARATOR + "WindTurbine" + FileConstants.FILE_SEPARATOR + deviceInfoCache.getDeviceCode() + FileConstants.FILE_SEPARATOR + "pic"; + Long picId = IdWorker.getId(); + String originalFilename = file.getOriginalFilename(); + if (StringUtils.isEmpty(originalFilename)){ + throw new ServiceException("文件名不存在,请检查"); + } + String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); + String fileName = picId+suffix; + String parent = FileConstants.FILE_SEPARATOR + "WindTurbine" + FileConstants.FILE_SEPARATOR + "pic" + FileConstants.FILE_SEPARATOR + fileName; File scale = null; try { - String url = minioViewsServcie.upload(minioAutoProperties.getPublicBucket(), parent, folderName, file); + minioViewsServcie.uploadFile(minioAutoProperties.getPublicBucket(), file,parent,"application/octet-stream"); scale = scale(file); - String scaleFileName = scale.getName(); - String scaleName = scaleFileName.substring(scaleFileName.lastIndexOf("_") + 1); - String scaleParent = FileConstants.FILE_SEPARATOR + "WindTurbine" + FileConstants.FILE_SEPARATOR + deviceInfoCache.getDeviceCode() + FileConstants.FILE_SEPARATOR + "thumbnailPic" + FileConstants.FILE_SEPARATOR + scaleName; + String scaleParent = FileConstants.FILE_SEPARATOR + "WindTurbine" + FileConstants.FILE_SEPARATOR + "thumbnailPic" + FileConstants.FILE_SEPARATOR + fileName; minioViewsServcie.uploadTemFile(minioAutoProperties.getPublicBucket(), scale, scaleParent); - String fileName = url.substring(url.lastIndexOf("/") + 1); - SysEquipmentDocs sysEquipmentDocs = saveDocs(deviceId, component, fileName, url); - SysEquipmentDocs sysEquipmentDocsScale = saveDocs(deviceId, component, scaleName, scaleParent); + SysEquipmentDocs sysEquipmentDocs = new SysEquipmentDocs(); + sysEquipmentDocs.setUrl(parent); + SysEquipmentDocs sysEquipmentDocsScale = new SysEquipmentDocs(); + sysEquipmentDocsScale.setUrl(scaleParent); result.add(sysEquipmentDocs); result.add(sysEquipmentDocsScale); } catch (Exception e) { @@ -482,13 +548,10 @@ public class SysEquipmentServiceImpl implements SysEquipmentService { minioViewsServcie.readFileToStream(path, stream); } - @Override - public void deleteFile(String path) { + public void deleteFile(SysEquipmentDocs sysEquipmentDocs) { try { - minioViewsServcie.removeFile(minioAutoProperties.getPublicBucket(), path,false); - //删除缩略图 - String thumbnailPath = path.replace("pic", "thumbnailPic"); - minioViewsServcie.removeFile(minioAutoProperties.getPublicBucket(), thumbnailPath,false); + sysEquipmentDocsMapper.deleteById(sysEquipmentDocs.getId()); + minioViewsServcie.removeFile(minioAutoProperties.getPublicBucket(), sysEquipmentDocs.getUrl(),false); }catch (Exception e){ log.error("文件删除失败"); } @@ -510,20 +573,24 @@ public class SysEquipmentServiceImpl implements SysEquipmentService { // 创建临时文件,名称基于原始文件名 File tempFile = File.createTempFile("thumbnail_", "_" + originalFileName); InputStream inputStream = file.getInputStream(); + File mulFile = null; try { - File mulFile = new File(System.getProperty("java.io.tmpdir") + "/" + file.getOriginalFilename()); + mulFile = new File(System.getProperty("java.io.tmpdir") + "/" + file.getOriginalFilename()); // 将MultipartFile写入临时文件 file.transferTo(mulFile); // 生成缩略图 ImgUtil.scale(mulFile, tempFile, 700, 700, null); } finally { IoUtil.close(inputStream); + if (mulFile != null && mulFile.exists()){ + mulFile.delete(); + } } return tempFile; } - public SysEquipmentDocs saveDocs(Long deviceId, String component,String fileName,String url){ + public SysEquipmentDocs deleteDocs(Long deviceId, String component,String fileName,String url){ SysEquipmentDocs sysEquipmentDocs = new SysEquipmentDocs(); sysEquipmentDocs.setDeviceId(deviceId); sysEquipmentDocs.setName(fileName); diff --git a/das/src/main/java/com/das/modules/fdr/service/MinioViewsServcie.java b/das/src/main/java/com/das/modules/fdr/service/MinioViewsServcie.java index 2bcf8a21..a4d555ad 100644 --- a/das/src/main/java/com/das/modules/fdr/service/MinioViewsServcie.java +++ b/das/src/main/java/com/das/modules/fdr/service/MinioViewsServcie.java @@ -200,7 +200,7 @@ public class MinioViewsServcie { public void readFileToStream(String path, OutputStream stream) { try (GetObjectResponse res = minioClient.getObject( - GetObjectArgs.builder().bucket(minioProperties.getBucket()).object(path).build())) { + GetObjectArgs.builder().bucket(minioProperties.getPublicBucket()).object(path).build())) { res.transferTo(stream); } catch (Exception e) { log.error("minio读取文件失败", e); diff --git a/das/src/main/java/com/das/modules/page/controller/StatisticalAnalysisController.java b/das/src/main/java/com/das/modules/page/controller/StatisticalAnalysisController.java index 26cc5aae..a3772034 100644 --- a/das/src/main/java/com/das/modules/page/controller/StatisticalAnalysisController.java +++ b/das/src/main/java/com/das/modules/page/controller/StatisticalAnalysisController.java @@ -26,7 +26,7 @@ public class StatisticalAnalysisController { /** - * 趋势分析Excel导出 + * 趋势分析 (单机分析)Excel导出 * @param param 查询条件 */ @PostMapping("/trendAnalyseExport") @@ -45,7 +45,7 @@ public class StatisticalAnalysisController { /** - * 趋势对比Excel导出 + * 趋势对比(多机对比) Excel导出 * @param param 查询条件 */ @PostMapping("/trendContrastExport") diff --git a/das/src/main/java/com/das/modules/page/domian/dto/TrendAnalyseDto.java b/das/src/main/java/com/das/modules/page/domian/dto/TrendAnalyseDto.java index 079fe844..dbfd59cd 100644 --- a/das/src/main/java/com/das/modules/page/domian/dto/TrendAnalyseDto.java +++ b/das/src/main/java/com/das/modules/page/domian/dto/TrendAnalyseDto.java @@ -38,6 +38,7 @@ public class TrendAnalyseDto private String timeName; + /** * 设备属性列表 */ @@ -52,4 +53,11 @@ public class TrendAnalyseDto * 模型 */ private String model; + + private String calFunction; + + private String windSource; + + //是否显示曲线,0不显示,1显示 + private int displayCurve; } diff --git a/das/src/main/java/com/das/modules/page/domian/dto/TrendContrastDto.java b/das/src/main/java/com/das/modules/page/domian/dto/TrendContrastDto.java index 9bf82c14..5ba7fb6f 100644 --- a/das/src/main/java/com/das/modules/page/domian/dto/TrendContrastDto.java +++ b/das/src/main/java/com/das/modules/page/domian/dto/TrendContrastDto.java @@ -33,11 +33,12 @@ public class TrendContrastDto - /** * 设备属性列表 */ private List devices; + private String calFunction; + } diff --git a/das/src/main/java/com/das/modules/page/service/impl/StatisticalAnalysisServiceImpl.java b/das/src/main/java/com/das/modules/page/service/impl/StatisticalAnalysisServiceImpl.java index e5a4123e..22f6c198 100644 --- a/das/src/main/java/com/das/modules/page/service/impl/StatisticalAnalysisServiceImpl.java +++ b/das/src/main/java/com/das/modules/page/service/impl/StatisticalAnalysisServiceImpl.java @@ -4,15 +4,16 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.das.common.constant.StatisticalAnalysisConstant; +import com.das.common.constant.StatisticalAnalysisFunctionConstant; import com.das.common.exceptions.ServiceException; import com.das.common.utils.BeanCopyUtils; import com.das.modules.curve.domain.entity.CurveItemEntity; import com.das.modules.curve.service.TheoreticalPowerCurveService; import com.das.modules.data.domain.SnapshotValueQueryParam; import com.das.modules.data.domain.TSValueQueryParam; +import com.das.modules.data.domain.WindowValueQueryParam; import com.das.modules.data.service.DataService; import com.das.modules.equipment.entity.SysIotModelField; import com.das.modules.equipment.mapper.SysIotModelFieldMapper; @@ -22,6 +23,7 @@ import com.das.modules.page.service.StatisticalAnalysisService; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.HorizontalAlignment; @@ -33,6 +35,7 @@ import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDrawing; import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.jetbrains.annotations.NotNull; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtils; import org.jfree.chart.JFreeChart; @@ -56,7 +59,9 @@ import java.text.SimpleDateFormat; import java.util.List; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.IntStream; +@Slf4j @Service public class StatisticalAnalysisServiceImpl implements StatisticalAnalysisService { @@ -81,10 +86,19 @@ public class StatisticalAnalysisServiceImpl implements StatisticalAnalysisServic //根据条件获取历史数据 List>>> mapsList = new ArrayList<>(); for (TrendAnalyseDto trendAnalyseDto : param) { - TSValueQueryParam tsValueQueryParam = new TSValueQueryParam(); - BeanCopyUtils.copy(trendAnalyseDto,tsValueQueryParam); - Map>> resultMap = dataService.queryTimeSeriesValues(tsValueQueryParam); - mapsList.add(resultMap); + //瞬时值 + if (trendAnalyseDto.getCalFunction().equals(StatisticalAnalysisFunctionConstant.INTERPOLATION)){ + TSValueQueryParam tsValueQueryParam = new TSValueQueryParam(); + BeanCopyUtils.copy(trendAnalyseDto,tsValueQueryParam); + Map>> resultMap = dataService.queryTimeSeriesValues(tsValueQueryParam); + mapsList.add(resultMap); + }else { + //其他 + WindowValueQueryParam windowValueQueryParam = new WindowValueQueryParam(); + BeanCopyUtils.copy(trendAnalyseDto,windowValueQueryParam); + Map>> stringMapMap = dataService.queryWindowsValues(windowValueQueryParam); + mapsList.add(stringMapMap); + } } //获取Excel的列 LinkedHashMap map = getTrendColumnName(param); @@ -119,23 +133,43 @@ public class StatisticalAnalysisServiceImpl implements StatisticalAnalysisServic TSValueQueryParam tsValueQueryParam = new TSValueQueryParam(); BeanCopyUtils.copy(param,tsValueQueryParam); Map>> resultMap = dataService.queryTimeSeriesValues(tsValueQueryParam); + //显示曲线,需要计算功率的平均值 + if (param.getDisplayCurve()==1){ + try { + List windSpeedList = new ArrayList<>(); + List powerList = new ArrayList<>(); + getPowerCurveValueList(resultMap, powerList, windSpeedList); + List>> maps = calculateAverages(windSpeedList, powerList); + setPowerCurveValueList(resultMap, maps); + } catch (Exception e) { + log.error("计算功率曲线平均值失败:"+e.getMessage()); + } + } List> dataList = new ArrayList<>(); //填充功率曲线,Excel的数据集 setPowerCurveExcelValue(resultMap, dataList, curveItemEntitieList); //获取功率曲线的列 - LinkedHashMap map = getPowerCurveColumnName(); + LinkedHashMap map = getPowerCurveColumnName(param); //获取图表类别集 List chartKey = getCharKey(map); ExcelWriter writer = ExcelUtil.getWriter(RandomUtil.randomInt(100, 1000) + "statistics" + ".xlsx"); //设置Excel样式 setExcelStyle(writer, map, dataList); //生成折线图 - addChartToExcel(writer,dataList,StatisticalAnalysisConstant.POWER_CURVE,chartKey); + if (param.getDisplayCurve()==1){ + addChartToExcel(writer,dataList,StatisticalAnalysisConstant.POWER_CURVE,chartKey); + }else { + //生成散点图 + addScattersChartToExcel(writer,dataList,StatisticalAnalysisConstant.POWER_CURVE,chartKey); + } //下载Excel downloadExcel(response, writer,StatisticalAnalysisConstant.POWER_CURVE); } + + + /** * 趋势对比Excel导出 * @param param 查询条件 @@ -143,10 +177,17 @@ public class StatisticalAnalysisServiceImpl implements StatisticalAnalysisServic */ @Override public void trendContrastExport(TrendContrastDto param, HttpServletRequest request, HttpServletResponse response) { - //根据条件获取历史数据 - TSValueQueryParam tsValueQueryParam = new TSValueQueryParam(); - BeanCopyUtils.copy(param,tsValueQueryParam); - Map>> maps = dataService.queryTimeSeriesValues(tsValueQueryParam); + Map>> maps = null; + //瞬时值,历史区间数据查询 + if (param.getCalFunction().equals(StatisticalAnalysisFunctionConstant.INTERPOLATION)){ + TSValueQueryParam tsValueQueryParam = new TSValueQueryParam(); + BeanCopyUtils.copy(param,tsValueQueryParam); + maps = dataService.queryTimeSeriesValues(tsValueQueryParam); + }else { + WindowValueQueryParam windowparam = new WindowValueQueryParam(); + BeanCopyUtils.copy(param,windowparam); + maps = dataService.queryWindowsValues(windowparam); + } //自定义别名 别名的key和实体类中的名称要对应上! LinkedHashMap map = gettrendContrastColumnName(param); List> dataList = new ArrayList<>(); @@ -374,11 +415,15 @@ public class StatisticalAnalysisServiceImpl implements StatisticalAnalysisServic * 获取功率曲线的列 * @return Excel的列 */ - private LinkedHashMap getPowerCurveColumnName() { + private LinkedHashMap getPowerCurveColumnName(TrendAnalyseDto param) { LinkedHashMap map = new LinkedHashMap<>(); map.put("time", "时间"); - map.put("iWindSpeed", "风速"); - map.put("iGenPower", "功率"); + if (param.getWindSource().equals("原始风速")){ + map.put("AvgWindSpeed_10min", "原始风速"); + }else { + map.put("AvgWindSpeedCal_10min", "处理后风速"); + } + map.put("AvgActivePower_10min", "功率"); map.put("theoryIWindSpeed", "理论风速"); map.put("theoryIGenPower", "理论功率"); return map; @@ -607,6 +652,74 @@ public class StatisticalAnalysisServiceImpl implements StatisticalAnalysisServic } } + /** + * 生成散点图,并插入到 Excel 中 + * @param writer Sheet 对象 + * @param data 测点数据集合 + * @param titleText 标题 + * @param chartKey 类别数据集 + */ + private static void addScattersChartToExcel(ExcelWriter writer, List> data, + String titleText, List chartKey) { + try { + if (CollectionUtils.isEmpty(data)) { + return; + } + // 获取 Sheet 对象 + XSSFSheet sheet = (XSSFSheet) writer.getSheet(); + // 创建绘图区域 + XSSFDrawing drawing = sheet.createDrawingPatriarch(); + int columnCount = sheet.getRow(0).getPhysicalNumberOfCells() + 1; + // 图表位置,插入到最后一列+1 + ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, columnCount, 0, 15, 15); + // 创建图表 + XSSFChart xssfChart = drawing.createChart(anchor); + // 设置图表标题 + xssfChart.setTitleText(titleText); + // 创建数据系列 + XDDFChartLegend legend = xssfChart.getOrAddLegend(); + legend.setPosition(LegendPosition.TOP_RIGHT); + XDDFValueAxis bottomAxis = xssfChart.createValueAxis(AxisPosition.BOTTOM); + XDDFValueAxis leftAxis = xssfChart.createValueAxis(AxisPosition.LEFT); + leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN); + // 创建散点图数据 + XDDFScatterChartData chartData = (XDDFScatterChartData) xssfChart.createData(ChartTypes.SCATTER, bottomAxis, leftAxis); + // 遍历每个系列并添加数据 + setChartDataForScatter(data, titleText, chartKey, chartData, sheet); + // 确保散点图数据点之间不连线 + for (XDDFChartData.Series series : chartData.getSeries()) { + if (series instanceof XDDFScatterChartData.Series) { + XDDFScatterChartData.Series scatterSeries = (XDDFScatterChartData.Series) series; + scatterSeries.setSmooth(false); + scatterSeries.setMarkerStyle(MarkerStyle.CIRCLE); + } + } + xssfChart.plot(chartData); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 为散点图设置数据系列 + * @param data 测点数据集合 + * @param titleText 标题 + * @param chartKey 类别数据集 + * @param chartData 散点图数据对象 + * @param sheet Excel Sheet 对象 + */ + private static void setChartDataForScatter(List> data, String titleText, List chartKey, + XDDFScatterChartData chartData, XSSFSheet sheet) { + for (String key : chartKey) { + XDDFDataSource xAxisData = XDDFDataSourcesFactory.fromNumericCellRange(sheet, + new CellRangeAddress(1, data.size(), 0, 0)); + XDDFNumericalDataSource yAxisData = XDDFDataSourcesFactory.fromNumericCellRange(sheet, + new CellRangeAddress(1, data.size(), chartKey.indexOf(key) + 1, chartKey.indexOf(key) + 1)); + XDDFScatterChartData.Series series = (XDDFScatterChartData.Series) chartData.addSeries(xAxisData, yAxisData); + series.setTitle(key, null); + } + } + /** * 给每个类别,添加数据 * @param data 测点数据 @@ -661,5 +774,138 @@ public class StatisticalAnalysisServiceImpl implements StatisticalAnalysisServic CellRangeAddress ref = new CellRangeAddress(startRow, endRow, startCol, endCol); return XDDFDataSourcesFactory.fromNumericCellRange(sheet, ref); } + + + + /** + * 计算平均功率 + */ + public static List>> calculateAverages(List windSpeeds, List powers) { + // 找出最大的风速 + double maxWindSpeed = Double.MIN_VALUE; + for (double windSpeed : windSpeeds) { + if (windSpeed > maxWindSpeed) { + maxWindSpeed = windSpeed; + } + } + double interval = 0.5; + List>> result = new ArrayList<>(); + Map> dataMap = new HashMap<>(); + List windSpeedList = new ArrayList<>(); + List powerList = new ArrayList<>(); + // 从 0 开始,以 interval 为步长遍历风速 + for (double windSpeed = 0; windSpeed <= maxWindSpeed; windSpeed += interval) { + double sumPower = 0; + int count = 0; + + // 遍历输入列表,计算满足风速范围的功率总和和计数 + for (int i = 0; i < windSpeeds.size(); i++) { + double currentWindSpeed = windSpeeds.get(i); + double currentPower = powers.get(i); + + if (currentWindSpeed >= windSpeed && currentWindSpeed < windSpeed + interval) { + sumPower += currentPower; + count++; + } + } + + // 如果计数大于 0,计算平均值并添加到结果列表 + if (count > 0) { + double averagePower = sumPower / count; + windSpeedList.add(windSpeed + interval); + powerList.add(averagePower); + } + } + dataMap.put("windSpeed", windSpeedList); + dataMap.put("power", powerList); + result.add(dataMap); + return result; + } + + /** + * 根据size删除List value1的值 + */ + @NotNull + private static List delTimes(Map.Entry stringObjectEntry, List>> maps) { + int powerSize = maps.get(0).get("power").size(); + List value1 = (List) stringObjectEntry.getValue(); + List collect = IntStream.range(0, value1.size()) + .filter(i -> i < powerSize) + .mapToObj(value1::get) + .collect(Collectors.toList()); + return collect; + } + + private static void getPowerCurveValueList(Map>> resultMap, + List powerList, List windSpeedList) { + for (Map.Entry>> stringMapEntry : resultMap.entrySet()) { + for (Map.Entry> mapEntry : stringMapEntry.getValue().entrySet()) { + String key = mapEntry.getKey(); + Map value = mapEntry.getValue(); + //功率 + if (key.equals("AvgActivePower_10min")) { + for (Map.Entry stringObjectEntry : value.entrySet()) { + if (stringObjectEntry.getKey().equals("values")) { + List values = (List) stringObjectEntry.getValue(); + List doubleList = values.stream() + .map(Float::doubleValue) + .collect(Collectors.toList()); + powerList.addAll(doubleList); + } + } + } + if (key.equals("AvgWindSpeed_10min") || key.equals("AvgWindSpeedCal_10min")){ + for (Map.Entry stringObjectEntry : value.entrySet()) { + if (stringObjectEntry.getKey().equals("values")){ + List values = (List) stringObjectEntry.getValue(); + List doubleList = values.stream() + .map(Float::doubleValue) + .collect(Collectors.toList()); + windSpeedList.addAll(doubleList); + } + } + } + } + } + } + + private static void setPowerCurveValueList(Map>> resultMap, + List>> maps) { + if (CollectionUtils.isEmpty(maps)){ + return; + } + for (Map.Entry>> stringMapEntry : resultMap.entrySet()) { + for (Map.Entry> mapEntry : stringMapEntry.getValue().entrySet()) { + String key = mapEntry.getKey(); + Map value = mapEntry.getValue(); + //功率 + if (key.equals("AvgActivePower_10min")) { + for (Map.Entry stringObjectEntry : value.entrySet()) { + if (stringObjectEntry.getKey().equals("values")) { + stringObjectEntry.setValue(maps.get(0).get("power")); + } + if (stringObjectEntry.getKey().equals("times")){ + List collect = delTimes(stringObjectEntry, maps); + stringObjectEntry.setValue(collect); + } + } + } + if (key.equals("AvgWindSpeed_10min") || key.equals("AvgWindSpeedCal_10min")){ + for (Map.Entry stringObjectEntry : value.entrySet()) { + if (stringObjectEntry.getKey().equals("values")){ + stringObjectEntry.setValue(maps.get(0).get("windSpeed")); + } + if (stringObjectEntry.getKey().equals("times")){ + List collect = delTimes(stringObjectEntry, maps); + stringObjectEntry.setValue(collect); + } + } + } + } + } + } + + + } diff --git a/ui/dasadmin/src/api/backend/statAnalysis/request.ts b/ui/dasadmin/src/api/backend/statAnalysis/request.ts index 7073f374..f4005fe3 100644 --- a/ui/dasadmin/src/api/backend/statAnalysis/request.ts +++ b/ui/dasadmin/src/api/backend/statAnalysis/request.ts @@ -39,7 +39,7 @@ export const runAirBlowerReq = ( }) } -export const getReportTemplateListReq = (data: { category: '单机报表' | '多机报表'; pageNum: number; pageSize: number }) => { +export const getReportTemplateListReq = (data: { category: '单机报表' | '多机报表' | '统计查询'; pageNum: number; pageSize: number }) => { return createAxios< never, Promise<{ @@ -47,7 +47,7 @@ export const getReportTemplateListReq = (data: { category: '单机报表' | '多 msg: string data: { total: number - rows: { id: string; category: '单机报表' | '多机报表'; template: string }[] + rows: { id: string; category: '单机报表' | '多机报表' | '统计查询'; template: string }[] code: number msg: string } @@ -60,7 +60,7 @@ export const getReportTemplateListReq = (data: { category: '单机报表' | '多 }) } -export const addReportTemplateListReq = (data: { category: '单机报表' | '多机报表'; template: string }) => { +export const addReportTemplateListReq = (data: { category: '单机报表' | '多机报表' | '统计查询'; template: string }) => { return createAxios< never, Promise<{ diff --git a/ui/dasadmin/src/views/backend/alarms/index.vue b/ui/dasadmin/src/views/backend/alarms/index.vue index 12865d49..59666ae2 100644 --- a/ui/dasadmin/src/views/backend/alarms/index.vue +++ b/ui/dasadmin/src/views/backend/alarms/index.vue @@ -94,13 +94,16 @@ @change="getcurrentPage" > + + + @@ -511,6 +512,9 @@ $paginationHeight: 32px; justify-content: right; background-color: #fff; } + .malDialog { + height: 540px; + } } } .modelOperate { diff --git a/ui/dasadmin/src/views/backend/home/home.vue b/ui/dasadmin/src/views/backend/home/home.vue index fa2637e1..af88c841 100644 --- a/ui/dasadmin/src/views/backend/home/home.vue +++ b/ui/dasadmin/src/views/backend/home/home.vue @@ -8,7 +8,7 @@
风机矩阵
- + 全部 一期 二期 @@ -363,6 +363,9 @@ const StatusListData = () => { } }) } +const changeUpdate=()=>{ + StatusListData() +} let autoUpdateForSecondTimer: any = null diff --git a/ui/dasadmin/src/views/backend/home/windMatrixpage.vue b/ui/dasadmin/src/views/backend/home/windMatrixpage.vue index 52da39b3..0fd49d80 100644 --- a/ui/dasadmin/src/views/backend/home/windMatrixpage.vue +++ b/ui/dasadmin/src/views/backend/home/windMatrixpage.vue @@ -68,12 +68,13 @@
- + + {{ item.attributeMap.firsttriggeredcode }} - + 已锁定
diff --git a/ui/dasadmin/src/views/backend/malfunction/index.vue b/ui/dasadmin/src/views/backend/malfunction/index.vue index 417e08a2..82100c24 100644 --- a/ui/dasadmin/src/views/backend/malfunction/index.vue +++ b/ui/dasadmin/src/views/backend/malfunction/index.vue @@ -1,7 +1,7 @@