diff --git a/das/src/main/java/com/das/modules/equipment/entity/SysEquipment.java b/das/src/main/java/com/das/modules/equipment/entity/SysEquipment.java index 53f888db..8b1a83f6 100644 --- a/das/src/main/java/com/das/modules/equipment/entity/SysEquipment.java +++ b/das/src/main/java/com/das/modules/equipment/entity/SysEquipment.java @@ -137,4 +137,10 @@ public class SysEquipment extends BaseEntity { */ @TableField(value = "nominal_capacity") private Double nominalCapacity; + + /** + * 故障录波格式 + */ + @TableField(value = "fdr_format") + private String fdrFormat; } diff --git a/das/src/main/java/com/das/modules/fdr/controller/FaultRecorderController.java b/das/src/main/java/com/das/modules/fdr/controller/FaultRecorderController.java index 0aff2c33..bb87b2e4 100644 --- a/das/src/main/java/com/das/modules/fdr/controller/FaultRecorderController.java +++ b/das/src/main/java/com/das/modules/fdr/controller/FaultRecorderController.java @@ -1,16 +1,17 @@ package com.das.modules.fdr.controller; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.das.common.result.R; +import com.das.modules.equipment.entity.SysEquipment; import com.das.modules.fdr.domain.FileNode; import com.das.modules.fdr.service.FaultRecorderService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; /** * 故障录波controller @@ -24,8 +25,23 @@ public class FaultRecorderController { private FaultRecorderService faultRecorderService; @RequestMapping(value = "/files", method = RequestMethod.POST) - public R> findList(@RequestParam(required = false) String name, String startTime, String endTime) { - List result = faultRecorderService.getDirOrFileList(name,startTime,endTime); + public R> findList(@RequestBody JSONObject jsonObject) { + String code = jsonObject.getString("deviceCode"); + String startTime = jsonObject.getString("startTime"); + String endTime = jsonObject.getString("endTime"); + List result = faultRecorderService.getDirOrFileList(code,startTime,endTime); return R.success(result); } + + @RequestMapping(value = "/parseData", method = RequestMethod.POST) + public R>> parseData(@RequestBody JSONObject jsonObject) { + Map> dataCurve = faultRecorderService.getDataCurve(jsonObject.getString("url"), jsonObject.getString("deviceCode")); + return R.success(dataCurve); + } + + @RequestMapping(value = "/updateFdrConfig", method = RequestMethod.POST) + public void updateFdrConfig(@RequestBody SysEquipment sysEquipment){ + + faultRecorderService.updateFdrConfig(sysEquipment); + } } diff --git a/das/src/main/java/com/das/modules/fdr/domain/vo/FdrFormatVo.java b/das/src/main/java/com/das/modules/fdr/domain/vo/FdrFormatVo.java new file mode 100644 index 00000000..fb2e38d8 --- /dev/null +++ b/das/src/main/java/com/das/modules/fdr/domain/vo/FdrFormatVo.java @@ -0,0 +1,17 @@ +package com.das.modules.fdr.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FdrFormatVo { + + private String timeFormat; + + private String delimite; + + private Integer validStartLine; +} diff --git a/das/src/main/java/com/das/modules/fdr/service/FaultRecorderService.java b/das/src/main/java/com/das/modules/fdr/service/FaultRecorderService.java index b282c184..0012b991 100644 --- a/das/src/main/java/com/das/modules/fdr/service/FaultRecorderService.java +++ b/das/src/main/java/com/das/modules/fdr/service/FaultRecorderService.java @@ -1,19 +1,27 @@ package com.das.modules.fdr.service; +import com.das.modules.equipment.entity.SysEquipment; import com.das.modules.fdr.domain.FileNode; import org.springframework.web.multipart.MultipartFile; import java.io.OutputStream; import java.nio.file.Path; import java.util.List; +import java.util.Map; public interface FaultRecorderService { List getDirOrFileList(String name,String startTime, String endTime); + Map> getDataCurve(String url, String deviceCode); + + void updateFdrConfig(SysEquipment sysEquipment); + String upload(String parent, String folderName, MultipartFile file); void readFileToSteam(String path, OutputStream stream); void download(String path, Path tempDir); + + } 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 0c4f33f5..27f2e474 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 @@ -6,6 +6,7 @@ import com.das.modules.fdr.config.MinioProperties; import com.das.modules.fdr.domain.FileNode; import io.micrometer.common.util.StringUtils; import io.minio.*; +import io.minio.errors.*; import io.minio.messages.Item; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -14,6 +15,8 @@ import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.nio.file.Path; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -198,7 +201,6 @@ public class MinioViewsServcie { } } - // 递归方式 计算文件的大小 public long getTotalSizeOfFilesInDir(File file) { if (file.isFile()) { @@ -215,4 +217,21 @@ public class MinioViewsServcie { } return total; } + + public InputStream getFileStream(String url) throws IOException { + + InputStream inputStream = null; + try { + inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minioProperties.getBucket()).object(url).build()); + } catch (Exception e) { + log.error("获取文件失败"); + }finally { + if (inputStream != null){ + inputStream.close(); + } + } + + return inputStream; + } + } diff --git a/das/src/main/java/com/das/modules/fdr/service/impl/FaultRecorderServiceImpl.java b/das/src/main/java/com/das/modules/fdr/service/impl/FaultRecorderServiceImpl.java index 53d35767..a8240a95 100644 --- a/das/src/main/java/com/das/modules/fdr/service/impl/FaultRecorderServiceImpl.java +++ b/das/src/main/java/com/das/modules/fdr/service/impl/FaultRecorderServiceImpl.java @@ -1,36 +1,62 @@ package com.das.modules.fdr.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.das.common.constant.FileConstants; +import com.das.common.exceptions.ServiceException; +import com.das.modules.equipment.entity.SysEquipment; +import com.das.modules.equipment.mapper.SysEquipmentMapper; +import com.das.modules.fdr.config.MinioProperties; import com.das.modules.fdr.domain.FileNode; +import com.das.modules.fdr.domain.vo.FdrFormatVo; import com.das.modules.fdr.service.FaultRecorderService; import com.das.modules.fdr.service.MinioViewsServcie; +import com.fasterxml.jackson.databind.ObjectMapper; import io.micrometer.common.util.StringUtils; +import io.minio.GetObjectArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; import java.nio.file.Path; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; @Service +@Slf4j public class FaultRecorderServiceImpl implements FaultRecorderService { @Autowired private MinioViewsServcie minioViewsServcie; + @Autowired + MinioClient minioClient; + + @Autowired + private MinioProperties minioProperties; + + @Autowired + private SysEquipmentMapper sysEquipmentMapper; + @Override public List getDirOrFileList(String name, String startTime, String endTime) { List fileResult = new ArrayList<>(); List monthsBetween = getMonthsBetween(startTime, endTime); - for (String item : monthsBetween){ - String directoryName = name + FileConstants.FILE_SEPARATOR + item.substring(0,item.indexOf("-")) + FileConstants.FILE_SEPARATOR + item.substring(item.indexOf("-")+1); + for (String item : monthsBetween) { + String directoryName = name + FileConstants.FILE_SEPARATOR + item.substring(0, item.indexOf("-")) + FileConstants.FILE_SEPARATOR + item.substring(item.indexOf("-") + 1); List fileTree = minioViewsServcie.getFileTree(directoryName); fileResult.addAll(fileTree); } @@ -71,4 +97,96 @@ public class FaultRecorderServiceImpl implements FaultRecorderService { } return months; } + + @Override + public Map> getDataCurve(String url, String deviceCode) { + Map> resultMap = null; + InputStream fileStream; + try { + fileStream = minioViewsServcie.getFileStream(url); + //根据device Code查询故障录波格式 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("CODE", deviceCode); + SysEquipment sysEquipment = sysEquipmentMapper.selectOne(queryWrapper); + if (sysEquipment == null) { + throw new ServiceException("设备不存在,请选择正确设备"); + } + + FdrFormatVo fdrFormatVo = JSON.parseObject(sysEquipment.getFdrFormat(), FdrFormatVo.class); + + + // 解析文件内容 + List> parsedData = parseFile(fileStream, fdrFormatVo.getDelimite(), fdrFormatVo.getValidStartLine()); + resultMap = parseDataCurve(parsedData, fdrFormatVo.getTimeFormat()); + + } catch (Exception e) { + e.printStackTrace(); + } + return resultMap; + } + + @Override + public void updateFdrConfig(SysEquipment sysEquipment) { + sysEquipmentMapper.updateById(sysEquipment); + } + + public List> parseFile(InputStream inputStream, String delimiter, int validStartLine) { + + List> result = new ArrayList<>(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + int lineNumber = 0; + + while ((line = reader.readLine()) != null) { + lineNumber++; + // 忽略有效行之前的行 + if (lineNumber < validStartLine) { + continue; + } + + // 按照分隔符分割行数据 + String[] values = line.split(delimiter); + List lineData = new ArrayList<>(); + for (String value : values) { + lineData.add(value.trim()); + } + result.add(lineData); + } + } catch (Exception e) { + + log.error("文件解析失败"); + } + return result; + } + + public Map> parseDataCurve(List> data, String timeFormat) throws ParseException { + List listField = data.get(0); + Map> map = new HashMap<>(); + data.remove(0); + for (List item : data) { + for (int i = 0; i < item.size(); i++) { + if (map.get(listField.get(i)) == null) { + List valueList = new ArrayList<>(); + valueList.add(item.get(i)); + map.put(listField.get(i), valueList); + } else { + List valueList = map.get(listField.get(i)); + valueList.add(item.get(i)); + } + } + } + List list = map.get(listField.get(0)); + List timeList = new ArrayList<>(); + for (String item : list) { + long timestamp = convertToTimestamp(item, timeFormat); + timeList.add(String.valueOf(timestamp)); + map.put(listField.get(0), timeList); + } + return map; + } + + public long convertToTimestamp(String time, String pattern) throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + return sdf.parse(time).getTime(); + } }