diff --git a/das/src/main/java/com/das/modules/equipment/domain/vo/SysEquipmentVo.java b/das/src/main/java/com/das/modules/equipment/domain/vo/SysEquipmentVo.java index 2332196c..d874dead 100644 --- a/das/src/main/java/com/das/modules/equipment/domain/vo/SysEquipmentVo.java +++ b/das/src/main/java/com/das/modules/equipment/domain/vo/SysEquipmentVo.java @@ -119,4 +119,9 @@ public class SysEquipmentVo implements Serializable { */ private Double nominalCapacity; + /** + * 解析文件配置 + */ + private String options; + } 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 a4195929..a94e629e 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 @@ -108,12 +108,12 @@ public class FaultRecorderServiceImpl implements FaultRecorderService { } if (StringUtils.isBlank(sysEquipment.getOptions())){ - throw new ServerException("请添加设备文件解析配置"); + throw new ServiceException("请添加设备文件解析配置"); } FileParseConfig fileParseConfig = JSON.parseObject(sysEquipment.getOptions(), FileParseConfig.class); FdrFormatVo fdrFormatVo = fileParseConfig.getFdrFormat(); if (fdrFormatVo == null){ - throw new ServerException("请添加故障录波配置"); + throw new ServiceException("请添加故障录波配置"); } // 解析文件内容 resultMap = parseFile(fileStream, fdrFormatVo.getTimeFormat(), fdrFormatVo.getDelimiter(), fdrFormatVo.getValidStartLine()); diff --git a/das/src/main/java/com/das/modules/plc/controller/PlcLogsController.java b/das/src/main/java/com/das/modules/plc/controller/PlcLogsController.java new file mode 100644 index 00000000..cc80f312 --- /dev/null +++ b/das/src/main/java/com/das/modules/plc/controller/PlcLogsController.java @@ -0,0 +1,59 @@ +package com.das.modules.plc.controller; + +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.domain.dto.FileDownloadDto; +import com.das.modules.fdr.service.FaultRecorderService; +import com.das.modules.plc.service.PlcLogService; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * 故障录波controller + */ +@Slf4j +@RequestMapping("/api/plc") +@RestController +public class PlcLogsController { + + @Autowired + private PlcLogService plcLogService; + + @RequestMapping(value = "/files", method = RequestMethod.POST) + public R> findList(@RequestBody JSONObject jsonObject) { + String code = jsonObject.getString("deviceCode"); + String startTime = jsonObject.getString("startTime"); + String endTime = jsonObject.getString("endTime"); + List result = plcLogService.getDirOrFileList("日志",code,startTime,endTime); + return R.success(result); + } + + @RequestMapping(value = "/parseData", method = RequestMethod.POST) + public R>> parseData(@RequestBody JSONObject jsonObject) throws IOException { + Map> dataCurve = plcLogService.getDataCurve(jsonObject.getString("url"), jsonObject.getString("deviceCode")); + return R.success(dataCurve); + } + + @RequestMapping(value = "/updatePlcLogConfig", method = RequestMethod.POST) + public R updateFdrConfig(@RequestBody SysEquipment sysEquipment){ + plcLogService.updatePlcConfig(sysEquipment); + return R.success(); + } + + @RequestMapping(value = "/download", method = RequestMethod.POST) + public void downloadFdrFile(@RequestBody FileDownloadDto fileDownloadDto, HttpServletResponse httpServletResponse) throws IOException { + + plcLogService.download(fileDownloadDto.getUrl(),httpServletResponse); + } +} diff --git a/das/src/main/java/com/das/modules/plc/service/PlcLogService.java b/das/src/main/java/com/das/modules/plc/service/PlcLogService.java new file mode 100644 index 00000000..f5f59426 --- /dev/null +++ b/das/src/main/java/com/das/modules/plc/service/PlcLogService.java @@ -0,0 +1,20 @@ +package com.das.modules.plc.service; + +import com.das.modules.equipment.entity.SysEquipment; +import com.das.modules.fdr.domain.FileNode; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +public interface PlcLogService { + + List getDirOrFileList(String fileType, String name, String startTime, String endTime); + + Map> getDataCurve(String url, String deviceCode) throws IOException; + + void updatePlcConfig(SysEquipment sysEquipment); + + void download(String path, HttpServletResponse httpServletResponse) throws IOException; +} diff --git a/das/src/main/java/com/das/modules/plc/service/impl/PlcLogsServiceImpl.java b/das/src/main/java/com/das/modules/plc/service/impl/PlcLogsServiceImpl.java new file mode 100644 index 00000000..ccadf233 --- /dev/null +++ b/das/src/main/java/com/das/modules/plc/service/impl/PlcLogsServiceImpl.java @@ -0,0 +1,158 @@ +package com.das.modules.plc.service.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.domain.FileNode; +import com.das.modules.fdr.domain.vo.FdrFormatVo; +import com.das.modules.fdr.domain.vo.FileParseConfig; +import com.das.modules.fdr.service.FaultRecorderService; +import com.das.modules.fdr.service.MinioViewsServcie; +import com.das.modules.plc.service.PlcLogService; +import io.micrometer.common.util.StringUtils; +import io.minio.MinioClient; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.*; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service +@Slf4j +public class PlcLogsServiceImpl implements PlcLogService { + + @Autowired + private MinioViewsServcie minioViewsServcie; + + @Autowired + MinioClient minioClient; + + @Autowired + private FaultRecorderService faultRecorderService; + + @Autowired + private SysEquipmentMapper sysEquipmentMapper; + + + @Override + public List getDirOrFileList(String fileType, String name, String startTime, String endTime) { + return faultRecorderService.getDirOrFileList(fileType, name, startTime, endTime); + } + + @Override + public Map> getDataCurve(String url, String deviceCode) throws IOException { + Map> resultMap = null; + try (InputStream 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("设备不存在,请选择正确设备"); + } + + if (StringUtils.isBlank(sysEquipment.getOptions())){ + throw new ServiceException("请添加设备文件解析配置"); + } + FileParseConfig fileParseConfig = JSON.parseObject(sysEquipment.getOptions(), FileParseConfig.class); + FdrFormatVo fdrFormatVo = fileParseConfig.getPlcFormat(); + if (fdrFormatVo == null){ + throw new ServiceException("请添加plclog配置"); + } + // 解析文件内容 + resultMap = parseFile(fileStream, fdrFormatVo.getTimeFormat(), fdrFormatVo.getDelimiter(), fdrFormatVo.getValidStartLine()); + + } catch (Exception e) { + e.printStackTrace(); + } + return resultMap; + } + + @Override + public void updatePlcConfig(SysEquipment sysEquipment) { + String options = sysEquipment.getOptions(); + FileParseConfig fdrConfig = JSON.parseObject(options, FileParseConfig.class); + SysEquipment equipment = sysEquipmentMapper.selectById(sysEquipment.getId()); + //合并配置 + if (StringUtils.isNotEmpty(equipment.getOptions())){ + FileParseConfig allConfig = JSON.parseObject(equipment.getOptions(), FileParseConfig.class); + allConfig.setPlcFormat(fdrConfig.getPlcFormat()); + sysEquipment.setOptions(JSON.toJSONString(allConfig)); + } + sysEquipmentMapper.updateById(sysEquipment); + } + + @Override + public void download(String path, HttpServletResponse httpServletResponse) throws IOException { + faultRecorderService.download(path,httpServletResponse); + } + + public Map> parseFile(InputStream inputStream, String timeFormat, String delimiter, int validStartLine) { + List> result = new ArrayList<>(); + Map> stringListMap = null; + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + int lineNumber = 0; + + while ((line = reader.readLine()) != null) { + lineNumber++; + // 忽略有效行之前的行 + if (lineNumber < validStartLine) { + continue; + } + // 按照分隔符分割行数据 + List lineData = Arrays.stream(line.split(delimiter)).toList(); + result.add(lineData); + } + stringListMap = parseDataCurve(result, timeFormat); + } catch (Exception e) { + log.error("文件解析失败{}", e); + } + return stringListMap; + } + + 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) { + if (i == 0){ + List timeList = new ArrayList<>(); + long timestamp = convertToTimestamp(item.get(i), timeFormat); + timeList.add(timestamp); + map.put(listField.get(i),timeList); + }else { + List valueList = new ArrayList<>(); + valueList.add(Double.valueOf(item.get(i))); + map.put(listField.get(i), valueList); + } + + } else { + List valueList = map.get(listField.get(i)); + if (i == 0){ + valueList.add(convertToTimestamp(item.get(i),timeFormat)); + + } + else { + valueList.add(Double.valueOf(item.get(i))); + } + + } + } + } + return map; + } + + public long convertToTimestamp(String time, String pattern) throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + return sdf.parse(time).getTime(); + } +}