Sfoglia il codice sorgente

1.添加IHD采集点导出

wangxiaofei 2 mesi fa
parent
commit
b3b49a7826

+ 47 - 0
taphole-l2/src/main/java/com/sckj/l2/service/impl/TL2DataServiceImpl.java

@@ -65,12 +65,57 @@ public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
         for (TL2Data item : iPage.getRecords()) {
         for (TL2Data item : iPage.getRecords()) {
             TL2DataListedVo vo = new TL2DataListedVo();
             TL2DataListedVo vo = new TL2DataListedVo();
             BeanUtils.copyProperties(item, vo);
             BeanUtils.copyProperties(item, vo);
+            vo.setIronStarttime(formatPartialDateString(vo.getIronStarttime()));
+            vo.setIronEndtime(formatPartialDateString(vo.getIronEndtime()));
             list.add(vo);
             list.add(vo);
         }
         }
 
 
         return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list);
         return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list);
     }
     }
 
 
+    public static String formatPartialDateString(String input) {
+        if (input == null || input.isEmpty()) {
+            return "";
+        }
+
+        StringBuilder result = new StringBuilder();
+        int len = input.length();
+
+        // 年 (yyyy)
+        if (len >= 4) {
+            result.append(input.substring(0, 4));
+        } else {
+            return input; // 不足4位直接返回原字符串
+        }
+
+        // 月 (MM)
+        if (len >= 6) {
+            result.append("-").append(input.substring(4, 6));
+        }
+
+        // 日 (dd)
+        if (len >= 8) {
+            result.append("-").append(input.substring(6, 8));
+        }
+
+        // 时 (HH)
+        if (len >= 10) {
+            result.append(" ").append(input.substring(8, 10));
+        }
+
+        // 分 (mm)
+        if (len >= 12) {
+            result.append(":").append(input.substring(10, 12));
+        }
+
+        // 秒 (ss)
+        if (len >= 14) {
+            result.append(":").append(input.substring(12, 14));
+        }
+
+        return result.toString();
+    }
+
     /**
     /**
      * 出铁数据详情
      * 出铁数据详情
      *
      *
@@ -88,6 +133,8 @@ public class TL2DataServiceImpl extends ServiceImpl<TL2DataMapper, TL2Data> {
 
 
         TL2DataDetailVo vo = new TL2DataDetailVo();
         TL2DataDetailVo vo = new TL2DataDetailVo();
         BeanUtils.copyProperties(model, vo);
         BeanUtils.copyProperties(model, vo);
+        vo.setIronStarttime(formatPartialDateString(vo.getIronStarttime()));
+        vo.setIronEndtime(formatPartialDateString(vo.getIronEndtime()));
         return vo;
         return vo;
     }
     }
 
 

+ 6 - 0
taphole-l2/src/main/java/com/sckj/l2/vo/TL2DataDetailVo.java

@@ -69,4 +69,10 @@ public class TL2DataDetailVo implements Serializable {
     @ApiModelProperty(value = "钛")
     @ApiModelProperty(value = "钛")
     private String elementTi;
     private String elementTi;
 
 
+    @ApiModelProperty(value = "铁口区域编号")
+    private String tapholeId;
+
+    @ApiModelProperty(value = "所属高炉")
+    private String boilerId;
+
 }
 }

+ 5 - 0
taphole-l2/src/main/java/com/sckj/l2/vo/TL2DataListedVo.java

@@ -69,5 +69,10 @@ public class TL2DataListedVo implements Serializable {
     @ApiModelProperty(value = "钛")
     @ApiModelProperty(value = "钛")
     private String elementTi;
     private String elementTi;
 
 
+    @ApiModelProperty(value = "铁口区域编号")
+    private String tapholeId;
+
+    @ApiModelProperty(value = "所属高炉")
+    private String boilerId;
 
 
 }
 }

+ 19 - 9
taphole-opc/src/main/java/com/sckj/opc/controller/THdTagController.java

@@ -10,6 +10,7 @@ import com.sckj.common.enums.ErrorEnum;
 import com.sckj.common.validate.commons.LongIdValidate;
 import com.sckj.common.validate.commons.LongIdValidate;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.common.validate.commons.PageValidate;
 import com.sckj.opc.dataservice.HDServiceImpl;
 import com.sckj.opc.dataservice.HDServiceImpl;
+import com.sckj.opc.dto.TagHisRawRecordsDTO;
 import com.sckj.opc.entity.OPCServer;
 import com.sckj.opc.entity.OPCServer;
 import com.sckj.opc.entity.THdTag;
 import com.sckj.opc.entity.THdTag;
 import com.sckj.opc.service.THdTagServiceImpl;
 import com.sckj.opc.service.THdTagServiceImpl;
@@ -24,6 +25,8 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 
 @RestController
 @RestController
 @RequestMapping("api/tag")
 @RequestMapping("api/tag")
@@ -63,7 +66,7 @@ public class THdTagController {
     @PostMapping("/edit")
     @PostMapping("/edit")
     @ApiOperation(value = "标记编辑")
     @ApiOperation(value = "标记编辑")
     public AjaxResult<Object> edit(@Validated @RequestBody THdTagUpdateValidate updateValidate) {
     public AjaxResult<Object> edit(@Validated @RequestBody THdTagUpdateValidate updateValidate) {
-        THdTag tag =  iTHdTagService.edit(updateValidate);
+        THdTag tag = iTHdTagService.edit(updateValidate);
         // 新增:如果已订阅,先取消再重新订阅
         // 新增:如果已订阅,先取消再重新订阅
         if (hdService.isSubscribed(tag.getTagName())) {
         if (hdService.isSubscribed(tag.getTagName())) {
             hdService.unsubscribe(tag);
             hdService.unsubscribe(tag);
@@ -149,7 +152,7 @@ public class THdTagController {
     @ResponseBody
     @ResponseBody
     @NotLogin
     @NotLogin
     @ApiOperation(value = "订阅")
     @ApiOperation(value = "订阅")
-    public AjaxResult subscribe( @RequestBody THdTag hdTag) {
+    public AjaxResult subscribe(@RequestBody THdTag hdTag) {
         try {
         try {
             hdService.subscribe(hdTag);
             hdService.subscribe(hdTag);
             return AjaxResult.success();
             return AjaxResult.success();
@@ -245,7 +248,7 @@ public class THdTagController {
     @ApiOperation(value = "IHD查询时间段内的记录总数")
     @ApiOperation(value = "IHD查询时间段内的记录总数")
     public AjaxResult getRawRecordsCount(int tagID, String startTime, String endTime) {
     public AjaxResult getRawRecordsCount(int tagID, String startTime, String endTime) {
         try {
         try {
-            return AjaxResult.success(ErrorEnum.SUCCESS.getCode(), ErrorEnum.SUCCESS.getMsg(),hdService.getRawRecordsCount(tagID, startTime, endTime));
+            return AjaxResult.success(ErrorEnum.SUCCESS.getCode(), ErrorEnum.SUCCESS.getMsg(), hdService.getRawRecordsCount(tagID, startTime, endTime));
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
             return AjaxResult.failed(e.getMessage());
             return AjaxResult.failed(e.getMessage());
@@ -288,6 +291,7 @@ public class THdTagController {
             return AjaxResult.failed(e.getMessage());
             return AjaxResult.failed(e.getMessage());
         }
         }
     }
     }
+
     /**
     /**
      * @return
      * @return
      * @MethodName: getBasicTagByName
      * @MethodName: getBasicTagByName
@@ -297,7 +301,7 @@ public class THdTagController {
     @ResponseBody
     @ResponseBody
     @NotLogin
     @NotLogin
     @ApiOperation(value = "IHD根据不同插值类型,查询Tag点的历史插值记录,查询结果按时间倒序返回")
     @ApiOperation(value = "IHD根据不同插值类型,查询Tag点的历史插值记录,查询结果按时间倒序返回")
-    public AjaxResult queryTagHisInterRecordsByMode(int tagID, String startTime, String endTime, long seconds,@RequestParam("mode") HDInterpolationMode mode) {
+    public AjaxResult queryTagHisInterRecordsByMode(int tagID, String startTime, String endTime, long seconds, @RequestParam("mode") HDInterpolationMode mode) {
         HDErrcode errCode = new HDErrcode();
         HDErrcode errCode = new HDErrcode();
         try {
         try {
             return AjaxResult.success(hdService.queryTagHisInterRecordsByMode(tagID, startTime, endTime, seconds * 1000, mode, errCode));
             return AjaxResult.success(hdService.queryTagHisInterRecordsByMode(tagID, startTime, endTime, seconds * 1000, mode, errCode));
@@ -316,7 +320,7 @@ public class THdTagController {
     @ResponseBody
     @ResponseBody
     @NotLogin
     @NotLogin
     @ApiOperation(value = "IHD以不同插值算法,查询Tag点的历史插值记录,查询结果按时间正序返回")
     @ApiOperation(value = "IHD以不同插值算法,查询Tag点的历史插值记录,查询结果按时间正序返回")
-    public AjaxResult queryTagHisInterRecordsByModeAscending(int tagID, String startTime, String endTime, long seconds,@RequestParam("mode")  HDInterpolationMode mode) {
+    public AjaxResult queryTagHisInterRecordsByModeAscending(int tagID, String startTime, String endTime, long seconds, @RequestParam("mode") HDInterpolationMode mode) {
         HDErrcode errCode = new HDErrcode();
         HDErrcode errCode = new HDErrcode();
         try {
         try {
             return AjaxResult.success(hdService.queryTagHisInterRecordsByModeAscending(tagID, startTime, endTime, seconds * 1000, mode, errCode));
             return AjaxResult.success(hdService.queryTagHisInterRecordsByModeAscending(tagID, startTime, endTime, seconds * 1000, mode, errCode));
@@ -346,10 +350,16 @@ public class THdTagController {
     }
     }
 
 
 
 
-
-
-
-
+    /**
+     * @return
+     * @MethodName: getBasicTagByName
+     * @Description: 查询Tag点在某时间段内的原始记录
+     */
+    @PostMapping("/exportTagHisRawRecords")
+    @ApiOperation(value = "导出Tag点在某时间段内的原始记录")
+    public void exportTagHisRawRecords(@RequestBody TagHisRawRecordsDTO tagHisRawRecordsDTO, HttpServletResponse response) throws IOException {
+        hdService.exportTagHisRawRecords(tagHisRawRecordsDTO.getTagID(), tagHisRawRecordsDTO.getStartTime(), tagHisRawRecordsDTO.getEndTime(), response);
+    }
 
 
 
 
 }
 }

+ 49 - 13
taphole-opc/src/main/java/com/sckj/opc/dataservice/HDServiceImpl.java

@@ -15,6 +15,8 @@ import com.baosight.hdsdk.exception.HDSdkException;
 import com.google.common.eventbus.AsyncEventBus;
 import com.google.common.eventbus.AsyncEventBus;
 import com.sckj.common.exception.OperateException;
 import com.sckj.common.exception.OperateException;
 import com.sckj.common.manager.ScheduledTaskManager;
 import com.sckj.common.manager.ScheduledTaskManager;
+import com.sckj.common.util.ExcelUtils;
+import com.sckj.opc.dto.HDRecordExport;
 import com.sckj.opc.dto.HdTagDTO;
 import com.sckj.opc.dto.HdTagDTO;
 import com.sckj.opc.entity.OPCData;
 import com.sckj.opc.entity.OPCData;
 import com.sckj.opc.entity.OPCServer;
 import com.sckj.opc.entity.OPCServer;
@@ -27,24 +29,21 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.math.NumberUtils;
 import org.apache.commons.lang3.math.NumberUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.expression.ExpressionParser;
 import org.springframework.expression.ExpressionParser;
 import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 
 import javax.annotation.PreDestroy;
 import javax.annotation.PreDestroy;
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.text.DecimalFormat;
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
+import java.util.concurrent.*;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
 
 
 @Service
 @Service
@@ -269,7 +268,7 @@ public class HDServiceImpl {
         });
         });
     }
     }
 
 
-    private void createSubscription(OPCServer opcServer,final THdTag hdTag) {
+    private void createSubscription(OPCServer opcServer, final THdTag hdTag) {
         if (ObjectUtils.isEmpty(opcServer) || ObjectUtils.isEmpty(hdTag)) {
         if (ObjectUtils.isEmpty(opcServer) || ObjectUtils.isEmpty(hdTag)) {
             throw new OperateException("未获取到服务器或标记信息");
             throw new OperateException("未获取到服务器或标记信息");
         }
         }
@@ -358,7 +357,7 @@ public class HDServiceImpl {
                                     // 复杂逻辑表达式,使用Spring SpEL
                                     // 复杂逻辑表达式,使用Spring SpEL
                                     try {
                                     try {
                                         StandardEvaluationContext context = new StandardEvaluationContext();
                                         StandardEvaluationContext context = new StandardEvaluationContext();
-                                        context.setVariable("val", data instanceof Number ? ((Number)data).doubleValue() : data);
+                                        context.setVariable("val", data instanceof Number ? ((Number) data).doubleValue() : data);
                                         ExpressionParser parser = new SpelExpressionParser();
                                         ExpressionParser parser = new SpelExpressionParser();
                                         condValid = parser.parseExpression(cond).getValue(context, Boolean.class);
                                         condValid = parser.parseExpression(cond).getValue(context, Boolean.class);
                                     } catch (Exception e) {
                                     } catch (Exception e) {
@@ -777,9 +776,9 @@ public class HDServiceImpl {
                         List<HDRecord> tempRawRecordList = dp.queryTagHisRawRecords(tagID, st, et);
                         List<HDRecord> tempRawRecordList = dp.queryTagHisRawRecords(tagID, st, et);
                         rawRecordsList.addAll(tempRawRecordList);
                         rawRecordsList.addAll(tempRawRecordList);
                         // 限制最大返回条数
                         // 限制最大返回条数
-                        if (rawRecordsList.size() >= MAX_RECORD_COUNT) {
-                            return rawRecordsList.subList(0, MAX_RECORD_COUNT);
-                        }
+//                        if (rawRecordsList.size() >= MAX_RECORD_COUNT) {
+//                            return rawRecordsList.subList(0, MAX_RECORD_COUNT);
+//                        }
                         if (tempRawRecordList.size() == 65535) { // 时间范围内记录条数超出65535,以最后一条记录的timestamp作为endTime继续查询
                         if (tempRawRecordList.size() == 65535) { // 时间范围内记录条数超出65535,以最后一条记录的timestamp作为endTime继续查询
                             et = dateFormat.parse(rawRecordsList.get(65534).getTimeStampStr());
                             et = dateFormat.parse(rawRecordsList.get(65534).getTimeStampStr());
                         } else {
                         } else {
@@ -916,6 +915,43 @@ public class HDServiceImpl {
         }
         }
     }
     }
 
 
+
+    public void exportTagHisRawRecords(int tagID, String startTime, String endTime, HttpServletResponse response) throws IOException {
+        THdTag hdTag = new THdTag();
+        hdTag.setTagId(tagID);
+        HdTagDTO opcPointDTO = hdTagService.selectInfoWithServer(hdTag);
+        if (ObjectUtils.isEmpty(opcPointDTO)) {
+            throw new OperateException("未查询到数据");
+        }
+
+        List<HDRecordExport> hdRecordExportList = new ArrayList<>();
+
+        List<HDRecord> hdRecords = queryTagHisRawRecords(tagID, startTime, endTime);
+        if (ObjectUtils.isNotEmpty(hdRecords)) {
+            for (HDRecord hdRecord : hdRecords) {
+                hdRecordExportList.add(
+                        HDRecordExport.builder()
+                                .data(hdRecord.getValueStr())
+                                .sourceTime(hdRecord.getTimeStampStr())
+                                .belongTagID(hdRecord.getBelongTagID())
+                                .build());
+            }
+            ExcelUtils.exportExcel(hdRecordExportList, HDRecordExport.class, opcPointDTO.getTagName(), sanitizeFileName(opcPointDTO.getTagDesc(), System.getProperty("os.name").toLowerCase().contains("windows")), response);
+        }
+
+    }
+
+    public static String sanitizeFileName(String input, boolean isWindows) {
+        if (isWindows) {
+            // 移除Windows非法字符
+            return input.replaceAll("[<>:\"/\\\\|?*]", "");
+        } else {
+            // 移除Linux非法字符(主要是斜杠)
+            return input.replaceAll("/", "");
+        }
+    }
+
+
     // 判断tagName是否已被订阅
     // 判断tagName是否已被订阅
     public boolean isSubscribed(String tagName) {
     public boolean isSubscribed(String tagName) {
         return taskNameSet.contains(tagName);
         return taskNameSet.contains(tagName);

+ 40 - 0
taphole-opc/src/main/java/com/sckj/opc/dto/HDRecordExport.java

@@ -0,0 +1,40 @@
+package com.sckj.opc.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadStyle;
+import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@HeadStyle(fillPatternType = FillPatternTypeEnum.NO_FILL,fillForegroundColor = -1)
+@HeadFontStyle(fontHeightInPoints = 16)
+@HeadRowHeight(40)
+public class HDRecordExport  implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ExcelProperty(value = "数据",index = 0)
+    @ColumnWidth(25)
+    private String data;
+
+    @ExcelProperty(value = "采集时间点",index = 1)
+    @ColumnWidth(100)
+    private String sourceTime;
+
+    @ExcelProperty(value = "编号",index = 2)
+    @ColumnWidth(25)
+    private Integer belongTagID;
+
+
+
+}

+ 10 - 0
taphole-opc/src/main/java/com/sckj/opc/dto/TagHisRawRecordsDTO.java

@@ -0,0 +1,10 @@
+package com.sckj.opc.dto;
+
+import lombok.Data;
+
+@Data
+public class TagHisRawRecordsDTO {
+    private int tagID;
+    private String startTime;
+    private String endTime;
+}