allen před 7 měsíci
rodič
revize
6a59864bb3
41 změnil soubory, kde provedl 5773 přidání a 159 odebrání
  1. 2 2
      meas-admin/src/main/resources/application.yml
  2. 25 0
      meas-common/src/main/java/com/meas/common/core/domain/TreeSelect.java
  3. 1 0
      meas-framework/src/main/java/com/meas/framework/config/SecurityConfig.java
  4. 29 0
      meas-system/src/main/java/com/meas/system/controller/MeasConfigController.java
  5. 121 0
      meas-system/src/main/java/com/meas/system/controller/MeasEnvDataController.java
  6. 45 2
      meas-system/src/main/java/com/meas/system/domain/MeasEnvData.java
  7. 108 0
      meas-system/src/main/java/com/meas/system/domain/MeasSpectralRadiation.java
  8. 8 0
      meas-system/src/main/java/com/meas/system/mapper/MeasDataResultsMapper.java
  9. 25 0
      meas-system/src/main/java/com/meas/system/mapper/MeasEnvDataMapper.java
  10. 8 0
      meas-system/src/main/java/com/meas/system/mapper/MeasSpectralRadiationMapper.java
  11. 8 0
      meas-system/src/main/java/com/meas/system/mapper/MeasTransmissionRateMapper.java
  12. 16 0
      meas-system/src/main/java/com/meas/system/service/IMeasEnvDataService.java
  13. 152 0
      meas-system/src/main/java/com/meas/system/service/impl/MeasEnvDataServiceImpl.java
  14. 18 0
      meas-system/src/main/resources/mapper/meas/MeasDataResultsMapper.xml
  15. 55 2
      meas-system/src/main/resources/mapper/meas/MeasEnvDataMapper.xml
  16. 108 0
      meas-system/src/main/resources/mapper/meas/MeasSpectralRadiationMapper.xml
  17. 18 0
      meas-system/src/main/resources/mapper/meas/MeasTransmissionRateMapper.xml
  18. 1 0
      meas_web/.gitignore
  19. 18 0
      meas_web/src/api/meas/envData.js
  20. 9 0
      meas_web/src/api/meas/measBatch.js
  21. 9 0
      meas_web/src/api/system/config.js
  22. 13 1
      meas_web/src/assets/styles/element-ui.scss
  23. 1 0
      meas_web/src/components/Pagination/index.vue
  24. 1 1
      meas_web/src/layout/components/Sidebar/Logo.vue
  25. 8 2
      meas_web/src/permission.js
  26. 14 0
      meas_web/src/router/index.js
  27. 2 1
      meas_web/src/views/login.vue
  28. 305 44
      meas_web/src/views/meas/components/dialogContent.vue
  29. 83 0
      meas_web/src/views/meas/env/ECharts.vue
  30. 443 0
      meas_web/src/views/meas/env/data.vue
  31. 149 31
      meas_web/src/views/meas/envData/ECharts.vue
  32. 83 0
      meas_web/src/views/meas/envData/TxtECharts.vue
  33. 191 67
      meas_web/src/views/meas/envData/index.vue
  34. 10 1
      meas_web/src/views/meas/radiation/index.vue
  35. 3 1
      meas_web/src/views/meas/thermalImagerTesDdata/index.vue
  36. 1 1
      meas_web/src/views/register.vue
  37. 1 0
      meas_web/src/views/system/user/index.vue
  38. 4 3
      meas_web/vue.config.js
  39. 1141 0
      sql/meas20241029.sql
  40. 1179 0
      sql/meas20241106.sql
  41. 1357 0
      sql/meas20241126.sql

+ 2 - 2
meas-admin/src/main/resources/application.yml

@@ -57,9 +57,9 @@ spring:
   servlet:
     multipart:
       # 单个文件大小
-      max-file-size: 10MB
+      max-file-size: 100MB
       # 设置总上传的文件大小
-      max-request-size: 20MB
+      max-request-size: 200MB
   # 服务模块
   devtools:
     restart:

+ 25 - 0
meas-common/src/main/java/com/meas/common/core/domain/TreeSelect.java

@@ -26,6 +26,16 @@ public class TreeSelect implements Serializable {
      */
     private String label;
 
+    /**
+     * 节点层级
+     */
+    private int levle;
+
+    /**
+     * 父节点
+     */
+    private String parentId;
+
     /**
      * 子节点
      */
@@ -64,6 +74,21 @@ public class TreeSelect implements Serializable {
         this.label = label;
     }
 
+    public int getLevle() {
+        return levle;
+    }
+
+    public void setLevle(int levle) {
+        this.levle = levle;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
     public List<TreeSelect> getChildren() {
         return children;
     }

+ 1 - 0
meas-framework/src/main/java/com/meas/framework/config/SecurityConfig.java

@@ -109,6 +109,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
                 .antMatchers("/login", "/register", "/captchaImage").permitAll()
+                .antMatchers("/meas/config/**").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 29 - 0
meas-system/src/main/java/com/meas/system/controller/MeasConfigController.java

@@ -0,0 +1,29 @@
+package com.meas.system.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.meas.common.core.controller.BaseController;
+import com.meas.system.service.ISysConfigService;
+
+/**
+ *
+ * @author Allen
+ * @date 2024-07-24
+ */
+@RestController
+@RequestMapping("/meas/config")
+public class MeasConfigController extends BaseController {
+    @Autowired
+    private ISysConfigService configService;
+
+
+    /**
+     * 根据参数键名查询参数值
+     */
+    @GetMapping(value = "/configKey")
+    public String getConfigKey(String configKey) {
+        return configService.selectConfigByKey(configKey);
+    }
+}

+ 121 - 0
meas-system/src/main/java/com/meas/system/controller/MeasEnvDataController.java

@@ -1,6 +1,24 @@
 package com.meas.system.controller;
 
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+
 import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -14,8 +32,10 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import com.meas.common.annotation.Log;
+import com.meas.common.config.RuoYiConfig;
 import com.meas.common.core.controller.BaseController;
 import com.meas.common.core.domain.AjaxResult;
+import com.meas.common.core.domain.entity.SysDept;
 import com.meas.common.enums.BusinessType;
 import com.meas.system.domain.MeasEnvData;
 import com.meas.system.service.IMeasEnvDataService;
@@ -100,4 +120,105 @@ public class MeasEnvDataController extends BaseController {
     public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(measEnvDataService.deleteMeasEnvDataByIds(ids));
     }
+
+    /**
+     * 查询测量环境数据树结构信息
+     */
+    @PreAuthorize("@ss.hasPermi('meas:envData:list')")
+    @GetMapping("/measEnvDataTree")
+    public AjaxResult measEnvDataTree(String measurementBatch) {
+        return success(measEnvDataService.selectMeasEnvDataTreeList(measurementBatch));
+    }
+    
+//    public static void main(String[] args) {
+//    	readZip("/profile/upload/2024/11/05/1_20241105133400A002.zip");
+//	}
+
+    /**
+     * 获取zip包中文件url
+     */
+    @GetMapping("/readZip")
+    public List<String> readZip(String zipUrl) {
+    	String zipFilePath = RuoYiConfig.getProfile()+zipUrl.replace("/profile", ""); // 替换为你的zip文件路径
+        System.out.println("zipFilePath: " + zipFilePath);
+		String destDirectory = zipFilePath.split(".zip")[0];
+        System.out.println("destDirectory: " + destDirectory);
+		File destDir = new File(destDirectory);
+	    deleteFolder(destDir);
+	    if (!destDir.exists()) {
+	        destDir.mkdir();
+	    }
+	    try (ZipFile zipFile = new ZipFile(zipFilePath,Charset.forName("GBK"))) {
+	        
+	        Enumeration<? extends ZipEntry> entries = zipFile.entries();
+	        while (entries.hasMoreElements()) {
+	            ZipEntry entry = entries.nextElement();
+	            String filePath = destDirectory + File.separator + entry.getName();
+	            if (!entry.isDirectory()) {
+	                extractFile(zipFile, entry, filePath);
+	            } else {
+	                File dir = new File(filePath);
+	                dir.mkdir();
+	            }
+	        }
+	    } catch (ZipException e) {
+	        System.err.println("Not a valid ZIP file.");
+	    } catch (IOException e) {
+	        System.err.println("I/O error.");
+	    }
+	    
+		// 创建文件夹对象
+	    File folder = new File(destDirectory);
+	
+	    // 获取文件夹中的文件列表
+	    File[] listOfFiles = folder.listFiles();
+	
+	    List<String> list = new ArrayList<String>();
+	    // 确保文件数组不为空
+	    if (listOfFiles != null) {
+	        // 对文件数组进行排序
+	        Arrays.sort(listOfFiles);
+	
+	        // 遍历并打印文件名
+	        for (File file : listOfFiles) {
+	            if (file.isFile()) {
+	            	list.add(zipUrl.split(".zip")[0]+"/"+file.getName());
+	                System.out.println("File: " + zipUrl.split(".zip")[0]+"/"+file.getName());
+	            }
+	        }
+	    }
+		return list;
+    }
+    
+    public static void deleteFolder(File folder) {
+        if (folder.isDirectory()) {
+            File[] files = folder.listFiles();
+            if (files != null) {
+                for (File file : files) {
+                    deleteFolder(file);
+                }
+            }
+        }
+        folder.delete();
+    }
+    
+    private static void extractFile(ZipFile zipFile, ZipEntry entry, String filePath) throws IOException {
+        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath))) {
+            byte[] buffer = new byte[1024];
+            int length;
+            InputStream inputStream = zipFile.getInputStream(entry);
+            while ((length = inputStream.read(buffer)) > 0) {
+                bos.write(buffer, 0, length);
+            }
+            inputStream.close();
+        }
+    }
+
+    /**
+     * 获取数据对比列表
+     */
+    @GetMapping("/contrastDataList")
+    public List<Map<String, String>> contrastDataList(Long[] batchIds,Integer contrastType) {
+		return measEnvDataService.selectContrastDataList(batchIds, contrastType);
+    }
 }

+ 45 - 2
meas-system/src/main/java/com/meas/system/domain/MeasEnvData.java

@@ -3,8 +3,6 @@ package com.meas.system.domain;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.meas.common.annotation.Excel;
 import com.meas.common.core.domain.BaseEntity;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -29,6 +27,18 @@ public class MeasEnvData extends BaseEntity {
     @Excel(name = "测量批次id")
     private Long measurementBatchId;
 
+    /**
+     * 发动机状态id
+     */
+    @Excel(name = "发动机状态id")
+    private Long engineStatusId;
+
+    /**
+     * 角度id
+     */
+    @Excel(name = "角度id")
+    private Long angleId;
+
 //  测量批次号
     private String measurementBatch;
 //  发动机号
@@ -111,6 +121,12 @@ public class MeasEnvData extends BaseEntity {
     @Excel(name = "浓度")
     private BigDecimal concentration;
 
+    /**
+     * 能见度
+     */
+    @Excel(name = "能见度")
+    private BigDecimal visibility;
+
     public Long getId() {
         return id;
     }
@@ -127,6 +143,22 @@ public class MeasEnvData extends BaseEntity {
         this.measurementBatchId = measurementBatchId;
     }
 
+    public Long getEngineStatusId() {
+        return engineStatusId;
+    }
+
+    public void setEngineStatusId(Long engineStatusId) {
+        this.engineStatusId = engineStatusId;
+    }
+
+    public Long getAngleId() {
+        return angleId;
+    }
+
+    public void setAngleId(Long angleId) {
+        this.angleId = angleId;
+    }
+
     public String getEngineStatus() {
         return engineStatus;
     }
@@ -215,6 +247,14 @@ public class MeasEnvData extends BaseEntity {
         this.concentration = concentration;
     }
 
+    public BigDecimal getVisibility() {
+        return visibility;
+    }
+
+    public void setVisibility(BigDecimal visibility) {
+        this.visibility = visibility;
+    }
+
     public String getMeasurementBatch() {
         return measurementBatch;
     }
@@ -252,6 +292,8 @@ public class MeasEnvData extends BaseEntity {
         return "MeasEnvData{" +
                 "id=" + id +
                 ", measurementBatchId=" + measurementBatchId +
+                ", engineStatusId=" + engineStatusId +
+                ", angleId=" + angleId +
                 ", measurementBatch='" + measurementBatch + '\'' +
                 ", engineModel='" + engineModel + '\'' +
                 ", geometryFiles='" + geometryFiles + '\'' +
@@ -267,6 +309,7 @@ public class MeasEnvData extends BaseEntity {
                 ", windSpeed=" + windSpeed +
                 ", humidity=" + humidity +
                 ", concentration=" + concentration +
+                ", visibility=" + visibility +
                 '}';
     }
 }

+ 108 - 0
meas-system/src/main/java/com/meas/system/domain/MeasSpectralRadiation.java

@@ -111,6 +111,42 @@ public class MeasSpectralRadiation extends BaseEntity {
     @Excel(name = "辐射亮度", readConverterExp = "8=~14μm")
     private String radiance2;
 
+    /** 标定温度 */
+    @Excel(name = "标定温度")
+    private String calTempEk;
+
+    /** 原始目标(3~5μm) */
+    @Excel(name = "原始目标(3~5μm)", readConverterExp = "3=~5μm")
+    private String rawTarget1;
+
+    /** 原始目标(8~14μm) */
+    @Excel(name = "原始目标(8~14μm)", readConverterExp = "8=~14μm")
+    private String rawTarget2;
+
+    /** 原始背景(3~5μm) */
+    @Excel(name = "原始背景(3~5μm)", readConverterExp = "3=~5μm")
+    private String rawBackground1;
+
+    /** 原始背景(8~14μm) */
+    @Excel(name = "原始背景(8~14μm)", readConverterExp = "8=~14μm")
+    private String rawBackground2;
+
+    /** 处理后目标(3~5μm) */
+    @Excel(name = "处理后目标(3~5μm)", readConverterExp = "3=~5μm")
+    private String tackleTarget1;
+
+    /** 处理后目标(8~14μm) */
+    @Excel(name = "处理后目标(8~14μm)", readConverterExp = "8=~14μm")
+    private String tackleTarget2;
+
+    /** 处理后背景(3~5μm) */
+    @Excel(name = "处理后背景(3~5μm)", readConverterExp = "3=~5μm")
+    private String tackleBackground1;
+
+    /** 处理后背景(8~14μm) */
+    @Excel(name = "处理后背景(8~14μm)", readConverterExp = "8=~14μm")
+    private String tackleBackground2;
+
     public Long getId() {
         return id;
     }
@@ -246,6 +282,69 @@ public class MeasSpectralRadiation extends BaseEntity {
     public void setRadiance2(String radiance2) {
         this.radiance2 = radiance2;
     }
+    public void setCalTempEk(String calTempEk) {
+        this.calTempEk = calTempEk;
+    }
+
+    public String getCalTempEk() {
+        return calTempEk;
+    }
+    public void setRawTarget1(String rawTarget1) {
+        this.rawTarget1 = rawTarget1;
+    }
+
+    public String getRawTarget1() {
+        return rawTarget1;
+    }
+    public void setRawTarget2(String rawTarget2) {
+        this.rawTarget2 = rawTarget2;
+    }
+
+    public String getRawTarget2() {
+        return rawTarget2;
+    }
+    public void setRawBackground1(String rawBackground1) {
+        this.rawBackground1 = rawBackground1;
+    }
+
+    public String getRawBackground1() {
+        return rawBackground1;
+    }
+    public void setRawBackground2(String rawBackground2) {
+        this.rawBackground2 = rawBackground2;
+    }
+
+    public String getRawBackground2() {
+        return rawBackground2;
+    }
+    public void setTackleTarget1(String tackleTarget1) {
+        this.tackleTarget1 = tackleTarget1;
+    }
+
+    public String getTackleTarget1() {
+        return tackleTarget1;
+    }
+    public void setTackleTarget2(String tackleTarget2) {
+        this.tackleTarget2 = tackleTarget2;
+    }
+
+    public String getTackleTarget2() {
+        return tackleTarget2;
+    }
+    public void setTackleBackground1(String tackleBackground1) {
+        this.tackleBackground1 = tackleBackground1;
+    }
+
+    public String getTackleBackground1() {
+        return tackleBackground1;
+    }
+    public void setTackleBackground2(String tackleBackground2) {
+        this.tackleBackground2 = tackleBackground2;
+    }
+
+    public String getTackleBackground2() {
+        return tackleBackground2;
+    }
 
     @Override
     public String toString() {
@@ -267,6 +366,15 @@ public class MeasSpectralRadiation extends BaseEntity {
                 ", rawData='" + rawData + '\'' +
                 ", radiance1='" + radiance1 + '\'' +
                 ", radiance2='" + radiance2 + '\'' +
+                ", calTempEk='" + calTempEk + '\'' +
+                ", rawTarget1='" + rawTarget1 + '\'' +
+                ", rawTarget2='" + rawTarget2 + '\'' +
+                ", rawBackground1='" + rawBackground1 + '\'' +
+                ", rawBackground2='" + rawBackground2 + '\'' +
+                ", tackleTarget1='" + tackleTarget1 + '\'' +
+                ", tackleTarget2='" + tackleTarget2 + '\'' +
+                ", tackleBackground1='" + tackleBackground1 + '\'' +
+                ", tackleBackground2='" + tackleBackground2 + '\'' +
                 '}';
     }
 }

+ 8 - 0
meas-system/src/main/java/com/meas/system/mapper/MeasDataResultsMapper.java

@@ -60,4 +60,12 @@ public interface MeasDataResultsMapper {
     public int deleteMeasDataResultsByIds(Long[] ids);
 
     MeasDataResults selectMeasDataResultsByEnvDataId(Long envDataId);
+
+    /**
+     * 查询数据对比列表
+     *
+     * @param batchIds 批次ID
+     * @return 数据结果集合
+     */
+    public List<MeasDataResults> selectContrastDataList(Long[] batchIds);
 }

+ 25 - 0
meas-system/src/main/java/com/meas/system/mapper/MeasEnvDataMapper.java

@@ -4,6 +4,8 @@ import com.meas.system.domain.MeasEnvData;
 
 import java.util.List;
 
+import org.apache.ibatis.annotations.Param;
+
 /**
  * 测量环境数据Mapper接口
  *
@@ -58,4 +60,27 @@ public interface MeasEnvDataMapper {
      * @return 结果
      */
     public int deleteMeasEnvDataByIds(Long[] ids);
+    
+    /**
+     * 分组查询测量批次
+     *
+     * @return 测量环境数据
+     */
+    public List<MeasEnvData> selectMeasurementBatchTree(@Param("measurementBatch")String measurementBatch, @Param("pageSize")Integer pageSize);
+    
+    /**
+     * 根据测量批次id查询测量环境数据
+     *
+     * @param measurementBatchId 测量批次id
+     * @return 测量环境数据
+     */
+    public List<MeasEnvData> selectEngineStatusTree(Long measurementBatchId);
+    
+    /**
+     * 根据发动机状态id查询测量环境数据
+     *
+     * @param engineStatusId 发动机状态id
+     * @return 测量环境数据
+     */
+    public List<MeasEnvData> selectAngleTree(@Param("measurementBatchId")Long measurementBatchId,@Param("engineStatusId")Long engineStatusId);
 }

+ 8 - 0
meas-system/src/main/java/com/meas/system/mapper/MeasSpectralRadiationMapper.java

@@ -60,4 +60,12 @@ public interface MeasSpectralRadiationMapper {
     public int deleteMeasSpectralRadiationByIds(Long[] ids);
 
     MeasSpectralRadiation selectResultsByEnvDataId(Long envDataId);
+
+    /**
+     * 查询数据对比列表
+     *
+     * @param batchIds 批次ID
+     * @return 光谱辐射集合
+     */
+    public List<MeasSpectralRadiation> selectContrastDataList(Long[] batchIds);
 }

+ 8 - 0
meas-system/src/main/java/com/meas/system/mapper/MeasTransmissionRateMapper.java

@@ -60,4 +60,12 @@ public interface MeasTransmissionRateMapper {
     public int deleteMeasTransmissionRateByIds(Long[] ids);
 
     MeasTransmissionRate selectResultsByEnvDataId(Long envDataId);
+
+    /**
+     * 查询数据对比列表
+     *
+     * @param batchIds 批次ID
+     * @return 透过率集合
+     */
+    public List<MeasTransmissionRate> selectContrastDataList(Long[] batchIds);
 }

+ 16 - 0
meas-system/src/main/java/com/meas/system/service/IMeasEnvDataService.java

@@ -1,7 +1,9 @@
 package com.meas.system.service;
 
 import java.util.List;
+import java.util.Map;
 
+import com.meas.common.core.domain.TreeSelect;
 import com.meas.system.domain.MeasEnvData;
 
 /**
@@ -58,4 +60,18 @@ public interface IMeasEnvDataService {
      * @return 结果
      */
     public int deleteMeasEnvDataById(Long id);
+
+    /**
+     * 查询测量环境数据树结构信息
+     *
+     * @return 测量环境数据树信息集合
+     */
+    public List<TreeSelect> selectMeasEnvDataTreeList(String measurementBatch);
+
+
+    /**
+     * 获取数据对比列表
+     *
+     */
+    public List<Map<String, String>> selectContrastDataList(Long[] batchIds,Integer contrastType);
 }

+ 152 - 0
meas-system/src/main/java/com/meas/system/service/impl/MeasEnvDataServiceImpl.java

@@ -1,13 +1,29 @@
 package com.meas.system.service.impl;
 
+import com.meas.common.core.domain.TreeSelect;
 import com.meas.common.utils.DateUtils;
+import com.meas.system.domain.MeasAngle;
+import com.meas.system.domain.MeasDataResults;
 import com.meas.system.domain.MeasEnvData;
+import com.meas.system.domain.MeasSpectralRadiation;
+import com.meas.system.domain.MeasStatus;
+import com.meas.system.domain.MeasTransmissionRate;
+import com.meas.system.mapper.MeasAngleMapper;
+import com.meas.system.mapper.MeasDataResultsMapper;
 import com.meas.system.mapper.MeasEnvDataMapper;
+import com.meas.system.mapper.MeasSpectralRadiationMapper;
+import com.meas.system.mapper.MeasStatusMapper;
+import com.meas.system.mapper.MeasTransmissionRateMapper;
 import com.meas.system.service.IMeasEnvDataService;
+import com.meas.system.service.ISysConfigService;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 测量环境数据Service业务层处理
@@ -19,6 +35,18 @@ import java.util.List;
 public class MeasEnvDataServiceImpl implements IMeasEnvDataService {
     @Autowired
     private MeasEnvDataMapper measEnvDataMapper;
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private MeasSpectralRadiationMapper measSpectralRadiationMapper;
+    @Autowired
+    private MeasDataResultsMapper measDataResultsMapper;
+    @Autowired
+    private MeasTransmissionRateMapper measTransmissionRateMapper;
+    @Autowired
+    private MeasStatusMapper measStatusMapper;
+    @Autowired
+    private MeasAngleMapper measAngleMapper;
 
     /**
      * 查询测量环境数据
@@ -51,6 +79,18 @@ public class MeasEnvDataServiceImpl implements IMeasEnvDataService {
     @Override
     public MeasEnvData insertMeasEnvData(MeasEnvData measEnvData) {
         measEnvData.setCreateTime(DateUtils.getNowDate());
+        MeasStatus measStatus = new MeasStatus();
+        measStatus.setStatus(measEnvData.getEngineStatus());
+        List<MeasStatus> list = measStatusMapper.selectMeasStatusList(measStatus);
+        if(list.size() > 0) {
+        	measEnvData.setEngineStatusId(list.get(0).getId());
+        }
+        MeasAngle measAngle = new MeasAngle();
+        measAngle.setAngle(Long.valueOf(measEnvData.getAngle()));
+        List<MeasAngle> list1 = measAngleMapper.selectMeasAngleList(measAngle);
+        if(list1.size() > 0) {
+        	measEnvData.setAngleId(list1.get(0).getId());
+        }
         int i = measEnvDataMapper.insertMeasEnvData(measEnvData);
         if (i > 0) {
             return measEnvData;
@@ -68,6 +108,18 @@ public class MeasEnvDataServiceImpl implements IMeasEnvDataService {
     @Override
     public int updateMeasEnvData(MeasEnvData measEnvData) {
         measEnvData.setUpdateTime(DateUtils.getNowDate());
+        MeasStatus measStatus = new MeasStatus();
+        measStatus.setStatus(measEnvData.getEngineStatus());
+        List<MeasStatus> list = measStatusMapper.selectMeasStatusList(measStatus);
+        if(list.size() > 0) {
+        	measEnvData.setEngineStatusId(list.get(0).getId());
+        }
+        MeasAngle measAngle = new MeasAngle();
+        measAngle.setAngle(Long.valueOf(measEnvData.getAngle()));
+        List<MeasAngle> list1 = measAngleMapper.selectMeasAngleList(measAngle);
+        if(list1.size() > 0) {
+        	measEnvData.setAngleId(list1.get(0).getId());
+        }
         return measEnvDataMapper.updateMeasEnvData(measEnvData);
     }
 
@@ -92,4 +144,104 @@ public class MeasEnvDataServiceImpl implements IMeasEnvDataService {
     public int deleteMeasEnvDataById(Long id) {
         return measEnvDataMapper.deleteMeasEnvDataById(id);
     }
+
+    /**
+     * 查询测量环境数据树结构信息
+     *
+     * @return 测量环境数据树信息集合
+     */
+    public List<TreeSelect> selectMeasEnvDataTreeList(String measurementBatch){
+        String pageSize = configService.selectConfigByKey("meas_batch_pageSize");
+    	List<MeasEnvData> list1 = measEnvDataMapper.selectMeasurementBatchTree(measurementBatch,Integer.valueOf(pageSize));
+    	List<TreeSelect> treeList1 = new ArrayList<TreeSelect>();
+    	for (MeasEnvData measEnvData1 : list1) {
+    		TreeSelect treeSelect1 = new TreeSelect();
+    		treeSelect1.setId(measEnvData1.getMeasurementBatchId());
+    		treeSelect1.setLabel(measEnvData1.getMeasurementBatch());
+    		treeSelect1.setLevle(1);
+    		treeSelect1.setParentId("0");
+        	List<MeasEnvData> list2 = measEnvDataMapper.selectEngineStatusTree(measEnvData1.getMeasurementBatchId());
+        	List<TreeSelect> treeList2 = new ArrayList<TreeSelect>();
+        	for (MeasEnvData measEnvData2 : list2) {
+        		TreeSelect treeSelect2 = new TreeSelect();
+        		treeSelect2.setId(measEnvData2.getEngineStatusId());
+        		treeSelect2.setLabel(measEnvData2.getEngineStatus());
+        		treeSelect2.setLevle(2);
+        		treeSelect2.setParentId(measEnvData1.getMeasurementBatchId().toString());
+            	List<MeasEnvData> list3 = measEnvDataMapper.selectAngleTree(measEnvData1.getMeasurementBatchId(),measEnvData2.getEngineStatusId());
+            	List<TreeSelect> treeList3 = new ArrayList<TreeSelect>();
+            	for (MeasEnvData measEnvData3 : list3) {
+            		TreeSelect treeSelect3 = new TreeSelect();
+            		treeSelect3.setId(measEnvData3.getAngleId());
+            		treeSelect3.setLabel(measEnvData3.getAngle());
+            		treeSelect3.setLevle(3);
+            		treeSelect3.setParentId(measEnvData1.getMeasurementBatchId().toString()+","+measEnvData2.getEngineStatusId());
+            		treeList3.add(treeSelect3);
+            	}
+            	treeSelect2.setChildren(treeList3);
+        		treeList2.add(treeSelect2);
+        	}
+        	treeSelect1.setChildren(treeList2);
+    		treeList1.add(treeSelect1);
+		}
+		return treeList1;
+    }
+
+    /**
+     * 获取数据对比列表
+     *
+     */
+    public List<Map<String, String>> selectContrastDataList(Long[] batchIds,Integer contrastType){
+    	List<Map<String, String>> contrastList = new ArrayList<Map<String, String>>();
+    	if(contrastType == 1 || contrastType == 2) {
+    		List<MeasSpectralRadiation> list = measSpectralRadiationMapper.selectContrastDataList(batchIds);
+    		for (MeasSpectralRadiation measSpectralRadiation : list) {
+    	    	Map<String, String> map = new HashMap<String, String>();
+    			if(measSpectralRadiation != null) {
+    				if(contrastType == 1 && measSpectralRadiation.getTackleTarget1() != null && !measSpectralRadiation.getTackleTarget1().equals("")) {
+    					map.put("name", measSpectralRadiation.getMeasurementBatch()+"-"+measSpectralRadiation.getEngineStatus()+"-"+measSpectralRadiation.getAngle());
+    					map.put("url", measSpectralRadiation.getTackleTarget1());
+    					contrastList.add(map);
+    				}else if(contrastType == 2 && measSpectralRadiation.getTackleTarget2() != null && !measSpectralRadiation.getTackleTarget2().equals("")) {
+    					map.put("name", measSpectralRadiation.getMeasurementBatch()+"-"+measSpectralRadiation.getEngineStatus()+"-"+measSpectralRadiation.getAngle());
+    					map.put("url", measSpectralRadiation.getTackleTarget2());
+    					contrastList.add(map);
+    				}
+    			}
+			}
+    	}else if(contrastType == 3 || contrastType == 4) {
+    		List<MeasDataResults> list = measDataResultsMapper.selectContrastDataList(batchIds);
+    		for (MeasDataResults measDataResults : list) {
+    	    	Map<String, String> map = new HashMap<String, String>();
+    			if(measDataResults != null) {
+    				if(contrastType == 3 && measDataResults.getSpecIrr1() != null && !measDataResults.getSpecIrr1().equals("")) {
+    					map.put("name", measDataResults.getMeasurementBatch()+"-"+measDataResults.getEngineStatus()+"-"+measDataResults.getAngle());
+    					map.put("url", measDataResults.getSpecIrr1());
+    					contrastList.add(map);
+    				}else if(contrastType == 4 && measDataResults.getSpecIrr2() != null && !measDataResults.getSpecIrr2().equals("")) {
+    					map.put("name", measDataResults.getMeasurementBatch()+"-"+measDataResults.getEngineStatus()+"-"+measDataResults.getAngle());
+    					map.put("url", measDataResults.getSpecIrr2());
+    					contrastList.add(map);
+    				}
+    			}
+			}
+    	}else if(contrastType == 5 || contrastType == 6) {
+    		List<MeasTransmissionRate> list = measTransmissionRateMapper.selectContrastDataList(batchIds);
+    		for (MeasTransmissionRate measTransmissionRate : list) {
+    	    	Map<String, String> map = new HashMap<String, String>();
+    			if(measTransmissionRate != null) {
+    				if(contrastType == 5 && measTransmissionRate.getCurve1() != null && !measTransmissionRate.getCurve1().equals("")) {
+    					map.put("name", measTransmissionRate.getMeasurementBatch()+"-"+measTransmissionRate.getEngineStatus()+"-"+measTransmissionRate.getAngle());
+    					map.put("url", measTransmissionRate.getCurve1());
+    					contrastList.add(map);
+    				}else if(contrastType == 6 && measTransmissionRate.getCurve2() != null && !measTransmissionRate.getCurve2().equals("")) {
+    					map.put("name", measTransmissionRate.getMeasurementBatch()+"-"+measTransmissionRate.getEngineStatus()+"-"+measTransmissionRate.getAngle());
+    					map.put("url", measTransmissionRate.getCurve2());
+    					contrastList.add(map);
+    				}
+    			}
+			}
+    	}
+    	return contrastList;
+    }
 }

+ 18 - 0
meas-system/src/main/resources/mapper/meas/MeasDataResultsMapper.xml

@@ -69,6 +69,24 @@
         where mdr.id = #{id}
     </select>
 
+    <select id="selectContrastDataList" parameterType="String" resultMap="MeasDataResultsResult">
+        SELECT 
+            med.id measurement_batch_id,
+            mb.measurement_batch,
+            med.engine_status,
+            med.angle,
+	        mdr.spec_irr_1,
+	        mdr.spec_irr_2
+        FROM meas_env_data med
+        LEFT JOIN meas_data_results mdr ON mdr.measurement_batch_id = med.id
+        LEFT JOIN meas_batch mb ON med.measurement_batch_id = mb.id
+        LEFT JOIN meas_engine_model mem ON mb.engine_id = mem.id
+        WHERE med.id IN 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
     <insert id="insertMeasDataResults" parameterType="MeasDataResults" useGeneratedKeys="true" keyProperty="id">
         insert into meas_data_results
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 55 - 2
meas-system/src/main/resources/mapper/meas/MeasEnvDataMapper.xml

@@ -7,6 +7,8 @@
     <resultMap type="MeasEnvData" id="MeasEnvDataResult">
         <result property="id" column="id"/>
         <result property="measurementBatchId" column="measurement_batch_id"/>
+        <result property="engineStatusId" column="engine_status_id"/>
+        <result property="angleId" column="angle_id"/>
         <result property="measurementBatch" column="measurement_batch"/>
         <result property="engineModel" column="engine_model"/>
         <result property="geometryFiles" column="geometry_files"/>
@@ -22,6 +24,7 @@
         <result property="windSpeed" column="wind_speed"/>
         <result property="humidity" column="humidity"/>
         <result property="concentration" column="concentration"/>
+        <result property="visibility" column="visibility"/>
         <result property="createBy" column="create_by"/>
         <result property="createTime" column="create_time"/>
         <result property="updateBy" column="update_by"/>
@@ -32,6 +35,8 @@
         SELECT
             med.id,
             med.measurement_batch_id,
+            med.engine_status_id,
+            med.angle_id,
             mb.measurement_batch,
             mem.model engine_model,
             mem.geometry_files,
@@ -47,6 +52,7 @@
             med.wind_speed,
             med.humidity,
             med.concentration,
+            med.visibility,
             med.create_by,
             med.create_time,
             med.update_by,
@@ -61,8 +67,10 @@
         <include refid="selectMeasEnvDataVo"/>
         <where>
             <if test="measurementBatchId != null ">and measurement_batch_id = #{measurementBatchId}</if>
-            <if test="measurementBatch != null  and measurementBatch != ''">and mb.measurement_batch = #{measurementBatch}</if>
-            <if test="engineModel != null  and engineModel != ''">and mem.model = #{engineModel}</if>
+            <if test="engineStatusId != null ">and engine_status_id = #{engineStatusId}</if>
+            <if test="angleId != null ">and angle_id = #{angleId}</if>
+            <if test="measurementBatch != null  and measurementBatch != ''">and mb.measurement_batch like concat('%', #{measurementBatch}, '%')</if>
+            <if test="engineModel != null  and engineModel != ''">and mem.model like concat('%', #{engineModel}, '%')</if>
             <if test="engineStatus != null and engineStatus != ''">and engine_status = #{engineStatus}</if>
             <if test="angle != null  and angle != ''">and angle = #{angle}</if>
             <if test="turbinePostTemp != null ">and turbine_post_temp = #{turbinePostTemp}</if>
@@ -74,6 +82,7 @@
             <if test="windSpeed != null ">and wind_speed = #{windSpeed}</if>
             <if test="humidity != null ">and humidity = #{humidity}</if>
             <if test="concentration != null ">and concentration = #{concentration}</if>
+            <if test="visibility != null ">and visibility = #{visibility}</if>
         </where>
         order by med.create_time desc
     </select>
@@ -83,11 +92,48 @@
         where med.id = #{id}
     </select>
 
+    <select id="selectMeasurementBatchTree" resultMap="MeasEnvDataResult">
+        SELECT 
+        	med.measurement_batch_id,
+        	mb.measurement_batch 
+        FROM meas_env_data AS med 
+        LEFT JOIN meas_batch AS mb ON med.measurement_batch_id = mb.id 
+        <where>
+            <if test="measurementBatch != null  and measurementBatch != ''">AND mb.measurement_batch like concat('%', #{measurementBatch}, '%')</if>
+        </where>
+        GROUP BY med.measurement_batch_id
+        ORDER BY mb.create_time DESC 
+        LIMIT #{pageSize}
+    </select>
+
+    <select id="selectEngineStatusTree" parameterType="Long" resultMap="MeasEnvDataResult">
+        SELECT 
+        	med.engine_status_id,
+        	ms.status as engine_status
+       	FROM meas_env_data AS med 
+       	LEFT JOIN meas_status AS ms ON med.engine_status_id = ms.id  
+       	WHERE med.measurement_batch_id = #{measurementBatchId}
+        GROUP BY med.engine_status_id
+    </select>
+
+    <select id="selectAngleTree" parameterType="Long" resultMap="MeasEnvDataResult">
+        SELECT 
+        	med.angle_id,
+        	ma.angle 
+       	FROM meas_env_data AS med 
+       	LEFT JOIN meas_angle AS ma ON med.angle_id = ma.id 
+       	WHERE med.measurement_batch_id = #{measurementBatchId}
+       	AND med.engine_status_id = #{engineStatusId}
+        GROUP BY med.angle_id
+    </select>
+
     <insert id="insertMeasEnvData" parameterType="MeasEnvData" useGeneratedKeys="true" keyProperty="id">
         insert into meas_env_data
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="id != null">id,</if>
             <if test="measurementBatchId != null">measurement_batch_id,</if>
+            <if test="engineStatusId != null">engine_status_id,</if>
+            <if test="angleId != null">angle_id,</if>
             <if test="engineStatus != null and engineStatus != ''">engine_status,</if>
             <if test="angle != null">angle,</if>
             <if test="turbinePostTemp != null">turbine_post_temp,</if>
@@ -99,6 +145,7 @@
             <if test="windSpeed != null">wind_speed,</if>
             <if test="humidity != null">humidity,</if>
             <if test="concentration != null">concentration,</if>
+            <if test="visibility != null">visibility,</if>
             <if test="createBy != null">create_by,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateBy != null">update_by,</if>
@@ -107,6 +154,8 @@
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
             <if test="measurementBatchId != null">#{measurementBatchId},</if>
+            <if test="engineStatusId != null">#{engineStatusId},</if>
+            <if test="angleId != null">#{angleId},</if>
             <if test="engineStatus != null and engineStatus != ''">#{engineStatus},</if>
             <if test="angle != null">#{angle},</if>
             <if test="turbinePostTemp != null">#{turbinePostTemp},</if>
@@ -118,6 +167,7 @@
             <if test="windSpeed != null">#{windSpeed},</if>
             <if test="humidity != null">#{humidity},</if>
             <if test="concentration != null">#{concentration},</if>
+            <if test="visibility != null">#{visibility},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateBy != null">#{updateBy},</if>
@@ -129,6 +179,8 @@
         update meas_env_data
         <trim prefix="SET" suffixOverrides=",">
             <if test="measurementBatchId != null">measurement_batch_id = #{measurementBatchId},</if>
+            <if test="engineStatusId != null">engine_status_id = #{engineStatusId},</if>
+            <if test="angleId != null">angle_id = #{angleId},</if>
             <if test="engineStatus != null and engineStatus != ''">engine_status = #{engineStatus},</if>
             <if test="angle != null">angle = #{angle},</if>
             <if test="turbinePostTemp != null">turbine_post_temp = #{turbinePostTemp},</if>
@@ -140,6 +192,7 @@
             <if test="windSpeed != null">wind_speed = #{windSpeed},</if>
             <if test="humidity != null">humidity = #{humidity},</if>
             <if test="concentration != null">concentration = #{concentration},</if>
+            <if test="visibility != null">visibility = #{visibility},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>

+ 108 - 0
meas-system/src/main/resources/mapper/meas/MeasSpectralRadiationMapper.xml

@@ -22,6 +22,15 @@
         <result property="rawData" column="raw_data"/>
         <result property="radiance1" column="radiance_1"/>
         <result property="radiance2" column="radiance_2"/>
+        <result property="calTempEk" column="cal_temp_ek"/>
+        <result property="rawTarget1" column="raw_target_1"/>
+        <result property="rawTarget2" column="raw_target_2"/>
+        <result property="rawBackground1" column="raw_background_1"/>
+        <result property="rawBackground2" column="raw_background_2"/>
+        <result property="tackleTarget1" column="tackle_target_1"/>
+        <result property="tackleTarget2" column="tackle_target_2"/>
+        <result property="tackleBackground1" column="tackle_background_1"/>
+        <result property="tackleBackground2" column="tackle_background_2"/>
         <result property="createBy" column="create_by"/>
         <result property="createTime" column="create_time"/>
         <result property="updateBy" column="update_by"/>
@@ -47,6 +56,15 @@
             msr.raw_data,
             msr.radiance_1,
             msr.radiance_2,
+            msr.cal_temp_ek, 
+            msr.raw_target_1, 
+            msr.raw_target_2, 
+            msr.raw_background_1, 
+            msr.raw_background_2, 
+            msr.tackle_target_1, 
+            msr.tackle_target_2, 
+            msr.tackle_background_1, 
+            msr.tackle_background_2,
             msr.create_by,
             msr.create_time,
             msr.update_by,
@@ -79,6 +97,33 @@
             <if test="rawData != null  and rawData != ''">and raw_data = #{rawData}</if>
             <if test="radiance1 != null  and radiance1 != ''">and radiance_1 = #{radiance1}</if>
             <if test="radiance2 != null  and radiance2 != ''">and radiance_2 = #{radiance2}</if>
+            <if test="calTempEk != null  and calTempEk != ''">
+                and cal_temp_ek = #{calTempEk}
+            </if>
+            <if test="rawTarget1 != null  and rawTarget1 != ''">
+                and raw_target_1 = #{rawTarget1}
+            </if>
+            <if test="rawTarget2 != null  and rawTarget2 != ''">
+                and raw_target_2 = #{rawTarget2}
+            </if>
+            <if test="rawBackground1 != null  and rawBackground1 != ''">
+                and raw_background_1 = #{rawBackground1}
+            </if>
+            <if test="rawBackground2 != null  and rawBackground2 != ''">
+                and raw_background_2 = #{rawBackground2}
+            </if>
+            <if test="tackleTarget1 != null  and tackleTarget1 != ''">
+                and tackle_target_1 = #{tackleTarget1}
+            </if>
+            <if test="tackleTarget2 != null  and tackleTarget2 != ''">
+                and tackle_target_2 = #{tackleTarget2}
+            </if>
+            <if test="tackleBackground1 != null  and tackleBackground1 != ''">
+                and tackle_background_1 = #{tackleBackground1}
+            </if>
+            <if test="tackleBackground2 != null  and tackleBackground2 != ''">
+                and tackle_background_2 = #{tackleBackground2}
+            </if>
         </where>
         order by med.create_time desc
     </select>
@@ -88,6 +133,24 @@
         where msr.id = #{id}
     </select>
 
+    <select id="selectContrastDataList" parameterType="String" resultMap="MeasSpectralRadiationResult">
+        SELECT 
+            med.id measurement_batch_id,
+            mb.measurement_batch,
+            med.engine_status,
+            med.angle,
+	        msr.tackle_target_1,
+	        msr.tackle_target_2
+        FROM meas_env_data med
+        LEFT JOIN meas_spectral_radiation msr ON msr.measurement_batch_id = med.id
+        LEFT JOIN meas_batch mb ON med.measurement_batch_id = mb.id
+        LEFT JOIN meas_engine_model mem ON mb.engine_id = mem.id
+        WHERE med.id IN 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
     <insert id="insertMeasSpectralRadiation" parameterType="MeasSpectralRadiation" useGeneratedKeys="true" keyProperty="id">
         insert into meas_spectral_radiation
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -102,6 +165,15 @@
             <if test="rawData != null">raw_data,</if>
             <if test="radiance1 != null">radiance_1,</if>
             <if test="radiance2 != null">radiance_2,</if>
+            <if test="calTempEk != null">cal_temp_ek,</if>
+            <if test="rawTarget1 != null">raw_target_1,</if>
+            <if test="rawTarget2 != null">raw_target_2,</if>
+            <if test="rawBackground1 != null">raw_background_1,</if>
+            <if test="rawBackground2 != null">raw_background_2,</if>
+            <if test="tackleTarget1 != null">tackle_target_1,</if>
+            <if test="tackleTarget2 != null">tackle_target_2,</if>
+            <if test="tackleBackground1 != null">tackle_background_1,</if>
+            <if test="tackleBackground2 != null">tackle_background_2,</if>
             <if test="createBy != null">create_by,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateBy != null">update_by,</if>
@@ -119,6 +191,15 @@
             <if test="rawData != null">#{rawData},</if>
             <if test="radiance1 != null">#{radiance1},</if>
             <if test="radiance2 != null">#{radiance2},</if>
+            <if test="calTempEk != null">#{calTempEk},</if>
+            <if test="rawTarget1 != null">#{rawTarget1},</if>
+            <if test="rawTarget2 != null">#{rawTarget2},</if>
+            <if test="rawBackground1 != null">#{rawBackground1},</if>
+            <if test="rawBackground2 != null">#{rawBackground2},</if>
+            <if test="tackleTarget1 != null">#{tackleTarget1},</if>
+            <if test="tackleTarget2 != null">#{tackleTarget2},</if>
+            <if test="tackleBackground1 != null">#{tackleBackground1},</if>
+            <if test="tackleBackground2 != null">#{tackleBackground2},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateBy != null">#{updateBy},</if>
@@ -139,6 +220,33 @@
             <if test="rawData != null">raw_data = #{rawData},</if>
             <if test="radiance1 != null">radiance_1 = #{radiance1},</if>
             <if test="radiance2 != null">radiance_2 = #{radiance2},</if>
+            <if test="calTempEk != null">cal_temp_ek =
+                #{calTempEk},
+            </if>
+            <if test="rawTarget1 != null">raw_target_1 =
+                #{rawTarget1},
+            </if>
+            <if test="rawTarget2 != null">raw_target_2 =
+                #{rawTarget2},
+            </if>
+            <if test="rawBackground1 != null">raw_background_1 =
+                #{rawBackground1},
+            </if>
+            <if test="rawBackground2 != null">raw_background_2 =
+                #{rawBackground2},
+            </if>
+            <if test="tackleTarget1 != null">tackle_target_1 =
+                #{tackleTarget1},
+            </if>
+            <if test="tackleTarget2 != null">tackle_target_2 =
+                #{tackleTarget2},
+            </if>
+            <if test="tackleBackground1 != null">tackle_background_1 =
+                #{tackleBackground1},
+            </if>
+            <if test="tackleBackground2 != null">tackle_background_2 =
+                #{tackleBackground2},
+            </if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>

+ 18 - 0
meas-system/src/main/resources/mapper/meas/MeasTransmissionRateMapper.xml

@@ -69,6 +69,24 @@
         where mtr.id = #{id}
     </select>
 
+    <select id="selectContrastDataList" parameterType="String" resultMap="MeasTransmissionRateResult">
+        SELECT 
+            med.id measurement_batch_id,
+            mb.measurement_batch,
+            med.engine_status,
+            med.angle,
+            mtr.curve_1,
+            mtr.curve_2
+        FROM meas_env_data med
+        LEFT JOIN meas_transmission_rate mtr ON mtr.measurement_batch_id = med.id
+        LEFT JOIN meas_batch mb ON med.measurement_batch_id = mb.id
+        LEFT JOIN meas_engine_model mem ON mb.engine_id = mem.id
+        WHERE med.id IN 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
     <insert id="insertMeasTransmissionRate" parameterType="MeasTransmissionRate" useGeneratedKeys="true" keyProperty="id">
         insert into meas_transmission_rate
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 1 - 0
meas_web/.gitignore

@@ -21,3 +21,4 @@ selenium-debug.log
 
 package-lock.json
 yarn.lock
+/pnpm-lock.yaml

+ 18 - 0
meas_web/src/api/meas/envData.js

@@ -42,3 +42,21 @@ export function delEnvData(id) {
     method: 'delete'
   })
 }
+
+// 查询测量环境数据树结构信息
+export function measEnvDataTree(query) {
+  return request({
+    url: '/meas/envData/measEnvDataTree',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询对比数据
+export function compareData(query) {
+  return request({
+    url: '/meas/envData/contrastDataList',
+    method: 'get',
+    params: query
+  })
+}

+ 9 - 0
meas_web/src/api/meas/measBatch.js

@@ -42,3 +42,12 @@ export function delMeasBatch(id) {
     method: 'delete'
   })
 }
+
+// 查询zip包
+export function getZipInfo(query) {
+  return request({
+    url: '/meas/envData/readZip',
+    method: 'get',
+    params: query
+  })
+}

+ 9 - 0
meas_web/src/api/system/config.js

@@ -58,3 +58,12 @@ export function refreshCache() {
     method: 'delete'
   })
 }
+
+
+// 获取页面标题
+export function getPageTitle() {
+  return request({
+    url: '/meas/config/configKey?configKey=system_name',
+    method: 'get'
+  })
+}

+ 13 - 1
meas_web/src/assets/styles/element-ui.scss

@@ -89,4 +89,16 @@
   > .el-submenu__title
   .el-submenu__icon-arrow {
   display: none;
-}
+}
+
+// 树状结构样式修改
+.el-tree-node__content {
+  height: 40px;
+}
+.el-tree-node__label {
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
+  color: #1890ff;
+}

+ 1 - 0
meas_web/src/components/Pagination/index.vue

@@ -36,6 +36,7 @@ export default {
     pageSizes: {
       type: Array,
       default() {
+        // return [10, 20, 30, 50]
         return [10, 20, 30, 50]
       }
     },

+ 1 - 1
meas_web/src/layout/components/Sidebar/Logo.vue

@@ -35,7 +35,7 @@ export default {
   },
   data() {
     return {
-      title: process.env.VUE_APP_TITLE,
+      title: this.$store.state.settings.title,
       logo: logoImg
     }
   }

+ 8 - 2
meas_web/src/permission.js

@@ -5,15 +5,21 @@ import NProgress from 'nprogress'
 import 'nprogress/nprogress.css'
 import { getToken } from '@/utils/auth'
 import { isRelogin } from '@/utils/request'
+import { getPageTitle } from '@/api/system/config'
 
 NProgress.configure({ showSpinner: false })
 
 const whiteList = ['/login', '/register']
 
-router.beforeEach((to, from, next) => {
+router.beforeEach(async (to, from, next) => {
   NProgress.start()
+  if(!store.state.settings.title) {
+    const res = await getPageTitle();
+    store.dispatch('settings/setTitle', res)
+    window.document.title = res;
+  }
   if (getToken()) {
-    to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
+    // to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
     /* has token*/
     if (to.path === '/login') {
       next({ path: '/' })

+ 14 - 0
meas_web/src/router/index.js

@@ -87,6 +87,20 @@ export const constantRoutes = [
         meta: { title: '个人中心', icon: 'user' }
       }
     ]
+  },
+  {
+      path: '/meas',
+      component: Layout,
+      hidden: true,
+      redirect: 'noredirect',
+      children: [
+      {
+        path: 'env/data',
+        component: () => import('@/views/meas/env/data'),
+        name: 'EnvData',
+        meta: { title: '数据对比', icon: 'data' }
+      }
+    ]
   }
 ]
 

+ 2 - 1
meas_web/src/views/login.vue

@@ -6,7 +6,7 @@
       :rules="loginRules"
       class="login-form"
     >
-      <h3 class="title">某测量数据管理系统</h3>
+      <h3 class="title" v-text="title"></h3>
       <el-form-item prop="username">
         <el-input
           v-model="loginForm.username"
@@ -116,6 +116,7 @@ export default {
       // 注册开关
       register: false,
       redirect: undefined,
+      title: this.$store.state.settings.title,
     };
   },
   watch: {

+ 305 - 44
meas_web/src/views/meas/components/dialogContent.vue

@@ -36,19 +36,22 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item>
-          <div style="width: 200px;"></div>
+        <el-form-item label="地点" prop="location">
+          <el-input v-model="formData.location" placeholder="请输入地点" />
         </el-form-item>
+        <!--<el-form-item>
+          <div style="width: 200px;"></div>
+        </el-form-item>-->
         <el-form-item>
           <div style="width: 200px;"></div>
         </el-form-item>
       </el-row>
     </el-form>
     <!-- <el-form ref="formData" :disabled="checkShow" :model="formData" :rules="formRules" size="mini" label-width="80px">
-      
+
     </el-form> -->
     <div class="box">
-      <span class="title">环境参数</span>
+      <span></span>
       <el-form :disabled="checkShow" :rules="formRules" @submit-form="submitForm" :inline-message="true" :form="form"
         @cancel="cancel" ref="formRef" :model="formData" size="mini" label-width="80px"
         :validate-on-rule-change="false">
@@ -63,6 +66,15 @@
               </el-option>
             </el-select>
           </el-form-item>
+          <el-form-item label="涡轮后温度" prop="turbinePostTemp" label-width="90px">
+            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']"
+              v-model="formData.turbinePostTemp" />
+          </el-form-item>
+          <el-form-item>
+            <div style="width: 200px;"></div>
+          </el-form-item>
+        </el-row>
+        <el-row type="flex" justify="space-around">
           <el-form-item label="角度" prop="angle">
             <el-select filterable v-model="formData.angle" placeholder="请输入角度">
               <el-option v-for="item in angleOptions" :key="item" :label="item" :value="item">
@@ -73,12 +85,6 @@
               </el-option>
             </el-select>
           </el-form-item>
-          <el-form-item label="涡轮后温度" prop="turbinePostTemp" label-width="90px">
-            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']"
-              v-model="formData.turbinePostTemp" />
-          </el-form-item>
-        </el-row>
-        <el-row type="flex" justify="space-around">
           <el-form-item label="测试距离" prop="testDistance">
             <el-input v-model="formData.testDistance" placeholder="请输入测试距离"><template
                 slot="append">m</template></el-input>
@@ -88,10 +94,12 @@
               format="yyyy-MM-dd HH:mm" placeholder="请选择时间">
             </el-date-picker>
           </el-form-item>
-          <el-form-item label="地点" prop="location">
+          <!-- <el-form-item label="地点" prop="location">
             <el-input v-model="formData.location" placeholder="请输入地点" />
-          </el-form-item>
+          </el-form-item> -->
         </el-row>
+		<div class="box" style="margin-bottom: 15px">
+	      <span class="title">环境参数</span>
         <el-row type="flex" justify="space-around">
           <el-form-item label="大气压" prop="atmosPress">
             <el-input v-model="formData.atmosPress" placeholder="请输入大气压"><template
@@ -112,12 +120,21 @@
             <el-input v-model="formData.concentration" placeholder="请输入浓度"><template
                 slot="append">mol</template></el-input>
           </el-form-item>
+          <!-- lhp_start -->
+          <el-form-item label="能见度" prop="visibility">
+            <el-input v-model="formData.visibility" placeholder="请输入浓度"><template
+                slot="append">km</template></el-input>
+          </el-form-item>
+          <!-- lhp_end -->
+        </el-row>
+        <el-row type="flex" justify="space-around" v-if="addBtn">
           <el-form-item>
             <div style="width: 200px;">
-              <el-button v-if="addBtn" type="primary" size="mini" @click="envDataSave">保 存</el-button>
+              <el-button type="primary" size="mini" @click="envDataSave">保 存</el-button>
             </div>
           </el-form-item>
         </el-row>
+		</div>
       </el-form>
     </div>
     <div class="box" v-if="radiationData && Object.keys(radiationData).length > 0">
@@ -138,7 +155,87 @@
                 slot="append">x</template></el-input>
           </el-form-item>
         </el-row>
-        <el-row type="flex" justify="space-around">
+
+        <!-- lhp_start -->
+        <div class="box" style="margin-bottom: 15px">
+          <span class="title">辐射亮度标定</span>
+          <el-form ref="radiationRef" :disabled="checkShow || addBtn" size="mini" :rules="radiationRules"
+            :validate-on-rule-change="false" :model="radiationData" label-width="80px">
+            <el-row type="flex" justify="space-around">
+              <el-form-item label="标定温度" prop="calTempEk">
+                <file-upload :isCheck="isCheck" :fileSize="0" :limit="5" :fileType="['lgm']"
+                  v-model="radiationData.calTempEk" />
+              </el-form-item>
+              <el-form-item label="标定曲线" prop="calCurve">
+                <file-upload :isCheck="isCheck" :fileSize="0" :limit="5" :fileType="['txt']" :isShowViev="true"
+                  v-model="radiationData.calCurve" v-on:fileView="fileView" />
+              </el-form-item>
+            </el-row>
+          </el-form>
+        </div>
+        <div class="box" style="margin-bottom: 15px">
+          <span class="title">原始数据</span>
+          <el-form ref="radiationRef" :disabled="checkShow || addBtn" size="mini" :rules="radiationRules"
+            :validate-on-rule-change="false" :model="radiationData" label-width="80px">
+            <el-row type="flex" justify="space-around">
+              <el-form-item label="目标">
+              </el-form-item>
+              <el-form-item label="3~5μm" prop="rawTarget1">
+                <file-upload :isCheck="isCheck" :fileSize="0" :limit="10" :fileType="['lgm']"
+                  v-model="radiationData.rawTarget1" />
+              </el-form-item>
+              <el-form-item label="8~14μm" prop="rawTarget2">
+                <file-upload :isCheck="isCheck" :fileSize="0" :limit="10" :fileType="['lgm']"
+                  v-model="radiationData.rawTarget2" />
+              </el-form-item>
+            </el-row>
+            <el-row type="flex" justify="space-around">
+              <el-form-item label="背景">
+              </el-form-item>
+              <el-form-item label="3~5μm" prop="rawBackground1">
+                <file-upload :isCheck="isCheck" :fileSize="0" :limit="10" :fileType="['lgm']"
+                  v-model="radiationData.rawBackground1" />
+              </el-form-item>
+              <el-form-item label="8~14μm" prop="rawBackground2">
+                <file-upload :isCheck="isCheck" :fileSize="0" :limit="10" :fileType="['lgm']"
+                  v-model="radiationData.rawBackground2" />
+              </el-form-item>
+            </el-row>
+          </el-form>
+        </div>
+        <div class="box" style="margin-bottom: 15px">
+          <span class="title">处理后数据</span>
+          <el-form ref="radiationRef" :disabled="checkShow || addBtn" size="mini" :rules="radiationRules"
+            :validate-on-rule-change="false" :model="radiationData" label-width="80px">
+            <el-row type="flex" justify="space-around">
+              <el-form-item label="目标">
+              </el-form-item>
+              <el-form-item label="3~5μm" prop="tackleTarget1">
+                <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']" :isShowViev="true" 
+                  v-model="radiationData.tackleTarget1" v-on:fileView="fileView"/>
+              </el-form-item>
+              <el-form-item label="8~14μm" prop="tackleTarget2">
+                <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']" :isShowViev="true"
+                  v-model="radiationData.tackleTarget2" v-on:fileView="fileView" />
+              </el-form-item>
+            </el-row>
+            <el-row type="flex" justify="space-around">
+              <el-form-item label="背景">
+              </el-form-item>
+              <el-form-item label="3~5μm" prop="tackleBackground1">
+                <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']"
+                  v-model="radiationData.tackleBackground1" />
+              </el-form-item>
+              <el-form-item label="8~14μm" prop="tackleBackground2">
+                <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']"
+                  v-model="radiationData.tackleBackground2" />
+              </el-form-item>
+            </el-row>
+          </el-form>
+        </div>
+        <!-- lhp_end -->
+
+        <!-- <el-row type="flex" justify="space-around">
           <el-form-item label="背景数据" prop="backgroundData">
             <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['lgm']"
               v-model="radiationData.backgroundData" />
@@ -174,9 +271,9 @@
             <i style="font-size: 1.5rem;margin-top: 10px;" class="el-icon-circle-plus-outline" @click="addCalTemp"
               v-if="!(checkShow || addBtn)"></i>
           </el-form-item>
-        </el-row>
+        </el-row> -->
       </el-form>
-      <div class="box" style="margin-bottom: 15px">
+      <!-- <div class="box" style="margin-bottom: 15px">
         <span class="title">目标数据</span>
         <el-form ref="radiationRef" :disabled="checkShow || addBtn" size="mini" :rules="radiationRules"
           :validate-on-rule-change="false" :model="radiationData" label-width="80px">
@@ -195,7 +292,7 @@
             </el-form-item>
           </el-row>
         </el-form>
-      </div>
+      </div> -->
     </div>
     <div class="box" v-if="TIData && Object.keys(TIData).length > 0">
       <span class="title">热像仪测量数据</span>
@@ -222,26 +319,58 @@
           </el-form-item>
           <el-form-item label="积分时间" prop="integrationTime">
             <el-input v-model.number="TIData.integrationTime" placeholder="请输入积分时间"><template
-                slot="append">s</template></el-input>
+                slot="append">ms</template></el-input>
           </el-form-item>
         </el-row>
-        <el-row type="flex" justify="space-around">
+
+        <el-row style="margin-left: 2%;" class="calTempTabel" type="flex">
           <el-form-item label="温度标定" prop="tempCal">
-            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']" v-model="TIData.tempCal" />
+            <el-table :data="tempCalData" size="mini" border style="width: 600px">
+              <el-table-column prop="temp" label="温度" width="100px" align="center">
+              </el-table-column>
+              <el-table-column prop="tempCalFile" label="文件" align="center">
+                <template slot-scope="scope">
+                  <el-link @click="$download.resource(scope.row.tempCalFile,false)"  :underline="false">
+                    <span class="el-icon-document"> {{ getFileName(scope.row.tempCalFile) }} </span>
+                  </el-link>
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" width="100px" align="center" class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                  <el-button size="mini" type="text" icon="el-icon-delete" @click="delTempCal(scope.row)">删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
           </el-form-item>
+          <el-form-item label="" label-width="10px">
+            <i style="font-size: 1.5rem;margin-top: 10px;" class="el-icon-circle-plus-outline" @click="addTempCal"
+              v-if="!(checkShow || addBtn)"></i>
+          </el-form-item>
+        </el-row>
+
+        <el-row type="flex" justify="space-around">
+          <!-- <el-form-item label="温度标定" prop="tempCal">
+            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']" v-model="TIData.tempCal" />
+          </el-form-item> -->
           <el-form-item label="辐射亮度" prop="radiance">
-            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']" v-model="TIData.radiance"
-              :isShowViev="true" v-on:fileView="fileView2" />
+            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['zip']" v-model="TIData.radiance"
+              :isShowViev="true" v-on:fileView="fileViewZipL" />
           </el-form-item>
           <el-form-item label="辐射照度" prop="radIllumination">
-            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']"
-              v-model="TIData.radIllumination" :isShowViev="true" v-on:fileView="fileView" />
+            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['zip']"
+              v-model="TIData.radIllumination"
+              :isShowViev="true"
+              v-on:fileView="fileViewZipZ" />
+          </el-form-item>
+          <el-form-item label="辐射温度" prop="radTemp">
+            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['zip']" v-model="TIData.radTemp"
+              :isShowViev="true" v-on:fileView="fileViewZipW" />
           </el-form-item>
         </el-row>
-        <el-row type="flex" justify="space-around">
+        <!-- <el-row type="flex" justify="space-around">
           <el-form-item label="辐射温度" prop="radTemp">
-            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['txt']" v-model="TIData.radTemp"
-              :isShowViev="true" v-on:fileView="fileView" />
+            <file-upload :isCheck="isCheck" :fileSize="0" :limit="1" :fileType="['zip']" v-model="TIData.radTemp"
+              :isShowViev="true" v-on:fileView="fileViewZipW" />
           </el-form-item>
           <el-form-item>
             <div style="width: 200px;"></div>
@@ -249,7 +378,7 @@
           <el-form-item>
             <div style="width: 200px;"></div>
           </el-form-item>
-        </el-row>
+        </el-row> -->
       </el-form>
     </div>
     <div class="box" v-if="TransmittanceData">
@@ -258,7 +387,7 @@
         :validate-on-rule-change="false">
         <el-row type="flex" justify="space-around">
           <el-form-item label="原始数据" prop="rawData">
-            <file-upload :fileSize="0" :limit="1" :isCheck="isCheck" :fileType="['txt']"
+            <file-upload :fileSize="0" :limit="1" :isCheck="isCheck" :fileType="['xls', 'xlsx']"
               v-model="TransmittanceData.rawData" />
           </el-form-item>
           <el-form-item label="透过率曲线3~5μm" label-width="130px" prop="curve1">
@@ -319,6 +448,24 @@
         <el-button @click="cancelCalTemp">取 消</el-button>
       </div>
     </el-dialog>
+
+    <el-dialog :close-on-click-modal="false" title="增加标定温度" :visible.sync="addTempCalVisible" width="500px"
+      append-to-body>
+      <el-form ref="tempCalFormRef" :model="tempCalForm" label-width="60px">
+        <el-form-item label="温度" prop="temp">
+          <el-input type="number" v-model.number="tempCalForm.temp" placeholder="请输入温度(只能输入数字)" />
+        </el-form-item>
+        <el-form-item label="文件" prop="tempCalFile">
+          <file-upload :fileSize="0" :limit="1" :isCheck="isCheck" :fileType="['txt']"
+            v-model="tempCalForm.tempCalFile" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitTempCal">确 定</el-button>
+        <el-button @click="cancelTempCal">取 消</el-button>
+      </div>
+    </el-dialog>
+
     <el-dialog :close-on-click-modal="false" title="增加发动机型号" :visible.sync="addDialogVisible" width="400px"
       append-to-body>
       <el-form ref="addEngineFormRef" :model="addEngineForm" :disabled="isCheck" :rules="rules" label-width="100px">
@@ -383,8 +530,9 @@
         <el-button @click="addAngleVisible = false">取 消</el-button>
       </div>
     </el-dialog>
-    <el-dialog :close-on-click-modal="false" title="数据可视化" :visible.sync="fileVisible" width="70%" append-to-body>
-      <ECharts class="chartShow" :chartData="chartData" :width="chartType === 'heatmap' ? '400px' :'100%'" />
+    <el-dialog :close-on-click-modal="false" :destroy-on-close="true" title="数据可视化" :visible.sync="fileVisible" width="80%" append-to-body :before-close="handleClose">
+      <ECharts v-if="EChartsScroll" class="chartShow" :chartData="chartData" :width="chartType === 'heatmap' ? 'calc(60vh)' :'100%'" @get-value="getChildValue" />
+      <TxtECharts v-if="!EChartsScroll" class="chartShow" :chartData="chartData" :width="chartType === 'heatmap'? 'calc(70vh)' :'100%'" @get-value="getChildValue" />
     </el-dialog>
   </div>
 </template>
@@ -393,11 +541,12 @@
 import { listEngineModel, addEngineModel } from "@/api/meas/engineModel";
 import { angleOption, addAngle } from "@/api/meas/angle";
 import { statusOption, addStatus } from "@/api/meas/status";
-import { listMeasBatch, addMeasBatch } from "@/api/meas/measBatch";
+import { listMeasBatch, addMeasBatch, getZipInfo } from "@/api/meas/measBatch";
 import ECharts from "@/views/meas/envData/ECharts.vue";
+import TxtECharts from "@/views/meas/envData/TxtECharts.vue";
 export default {
   name: "dialogContent",
-  components: { ECharts },
+  components: { ECharts, TxtECharts },
   props: {
     form: {
       type: Object,
@@ -438,6 +587,8 @@ export default {
   },
   data() {
     return {
+      // 是否有滚动效果
+      EChartsScroll: false,
       baseUrl: process.env.VUE_APP_BASE_API,
       // 热像仪测试
       lensFViewOptions: [],
@@ -512,6 +663,13 @@ export default {
             trigger: "blur",
           },
         ],
+        visibility: [
+          {
+            pattern: /^(0(\.\d{1,2})?|[1-9]\d{0,2}(\.\d{0,2})?|1000(\.00?)?)$/,
+            message: "请输入0.00-1000.00之间的数字,最多可保留两位小数",
+            trigger: "blur",
+          },
+        ],
       },
       radiationRules: {
         model: [
@@ -571,10 +729,16 @@ export default {
         temp: null,
         calTempFile: null,
       },
+      addTempCalVisible: false,
+      tempCalData: [],
+      tempCalForm: {
+        temp: null,
+        tempCalFile: null,
+      },
       changeFlag: [],
       chartType: "",
       fileVisible: false,
-      chartData: {},
+      chartData: [],
       addMeasBatchForm: {
         engineId: null,
         measurementBatch: null,
@@ -599,6 +763,8 @@ export default {
       addMeasVisible: false,
       addStatusVisible: false,
       addAngleVisible: false,
+      childValue: null,
+      percentNum: 0,
     };
   },
   created() {
@@ -666,6 +832,11 @@ export default {
     },
   },
   methods: {
+    getChildValue(value) {
+      this.childValue = value;
+      console.log(this.childValue)
+      // this.dialogVisible = false;
+    },
     getFileName(name) {
       if (name.lastIndexOf("/") > -1) {
         const newName = name.slice(name.lastIndexOf("/") + 1)
@@ -781,6 +952,16 @@ export default {
         this.calTempData = []
       }
     },
+    handleCloseBeforeTI() {
+      this.tempCalData = []
+    },
+    getTempCalData(val) {
+      if (val) {
+        this.tempCalData = JSON.parse(val)
+      } else {
+        this.tempCalData = []
+      }
+    },
     onClickBtn(type) {
       if (type === "engine") this.addDialogVisible = true;
       else if (type === "measBatch") {
@@ -850,6 +1031,31 @@ export default {
         return item !== row
       });
     },
+    addTempCal() {
+      this.resetTempCalForm()
+      this.addTempCalVisible = true
+    },
+    submitTempCal() {
+      console.log("this.tempCalData", this.tempCalData);
+      this.tempCalData.push(this.tempCalForm)
+      this.addTempCalVisible = false
+      this.resetTempCalForm()
+    },
+    cancelTempCal() {
+      this.addTempCalVisible = false
+      this.resetTempCalForm()
+    },
+    resetTempCalForm() {
+      this.tempCalForm = {
+        temp: null,
+        tempCalFile: null,
+      }
+    },
+    delTempCal(row) {
+      this.tempCalData = this.tempCalData.filter(item => {
+        return item !== row
+      });
+    },
     // 环境参数保存
     envDataSave() {
       this.validateAll()
@@ -879,6 +1085,10 @@ export default {
             this.radiationForm.calTemp = this.calTempData.length > 0 ? JSON.stringify(this.calTempData) : null;
             this.calTempData = []
           }
+          if (this.TIData) {
+            this.TIData.tempCal = this.tempCalData.length > 0 ? JSON.stringify(this.tempCalData) : null;
+            this.tempCalData = []
+          }
           this.$emit('submit-form');
         })
         .catch((err) => {
@@ -910,33 +1120,82 @@ export default {
     cancel() {
       this.$emit('cancel')
     },
+    handleClose(){
+      this.chartData = [];
+      clearInterval(this.childValue);
+      this.fileVisible = false;
+    },
     // 查看文件可视化
     fileView(url1) {
+      this.EChartsScroll = false;
       const url = `${process.env.VUE_APP_BASE_API}${url1}`;
       this.fetchLogFile(url)
         .then((text) => {
           this.fileShowData = text.split("\r\n");
           this.handleLineChart(this.fileShowData);
-          this.fileVisible = true;
         })
         .catch((error) => {
           console.error("Failed to fetch the log file:", error);
-          this.$modal.msgSuccess("文件读取错误");
+          this.$modal.msgError("文件读取错误");
         });
     },
-    fileView2(url1) {
-      const url = `${process.env.VUE_APP_BASE_API}${url1}`;
+    // 单独热力图
+    fileViewTxt(fileUrl) {
+      this.EChartsScroll = false;
+      const url = `${process.env.VUE_APP_BASE_API}${fileUrl}`;
       this.fetchLogFile(url)
         .then((text) => {
-          this.fileShowData = text.split("\r\n");
-          this.handleHeatmapChart(this.fileShowData);
+          this.chartData = this.handleHeatmapChart(text.split("\r\n"));
           this.fileVisible = true;
         })
         .catch((error) => {
           console.error("Failed to fetch the log file:", error);
-          this.$modal.msgSuccess("文件读取错误");
+          this.$modal.msgError("文件读取错误");
         });
     },
+    // 辐射亮度
+    fileViewZipL(fileUrl) {
+      this.fileViewZip(fileUrl, '辐射亮度');
+    },
+    // 辐射照度
+    fileViewZipZ(fileUrl) {
+      this.fileViewZip(fileUrl, '辐射照度');
+    },
+    // 辐射温度
+    fileViewZipW(fileUrl) {
+      this.fileViewZip(fileUrl, '辐射温度');
+    },
+    // 动态热力图
+    async fileViewZip(fileUrl, name) {
+      this.EChartsScroll = true;
+      const loading = this.$loading({
+        lock: true,
+        text: '文件读取中',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      });
+      const response = await getZipInfo({ zipUrl: fileUrl });
+      const chartData = [];
+      response?.forEach((item) => {
+        const url = `${process.env.VUE_APP_BASE_API}${item}`;
+        this.fetchLogFile(url)
+          .then((text) => {
+            const textInfo = this.handleHeatmapChart(text.split("\r\n"), name);
+            chartData.push(textInfo);
+            this.percentNum = Math.floor((chartData.length / response.length) * 100);
+            loading.setText('文件读取'+this.percentNum+"%");
+            if(chartData.length === response.length) {
+              loading.close();
+              this.chartData = JSON.parse(JSON.stringify(chartData));
+              this.fileVisible = true;
+            }
+          })
+          .catch((error) => {
+            console.error("Failed to fetch the log file:", error);
+            this.$modal.msgSuccess("文件读取错误");
+          });
+      })
+    },
     // 读取文件内容
     async fetchLogFile(url) {
       try {
@@ -1008,8 +1267,10 @@ export default {
         series: series,
       };
       this.chartData = JSON.parse(JSON.stringify(chartData))
+      this.fileVisible = true;
     },
-    handleHeatmapChart(data) {
+    // 热力图
+    handleHeatmapChart(data, name) {
       this.chartType = "heatmap";
       let dataSet = [],
         xData = [],
@@ -1054,7 +1315,7 @@ export default {
         },
         series: [
           {
-            name: "辐射亮度",
+            name: name,
             type: "heatmap",
             data: dataSet,
             emphasis: {
@@ -1068,7 +1329,7 @@ export default {
           },
         ],
       };
-      this.chartData = JSON.parse(JSON.stringify(chartData))
+      return JSON.parse(JSON.stringify(chartData))
     },
   },
 };

+ 83 - 0
meas_web/src/views/meas/env/ECharts.vue

@@ -0,0 +1,83 @@
+<template>
+  <div>
+    <div ref="echarts" :class="className" :style="{height:height,width:width}" style="margin: auto"  />
+  </div>
+
+</template>
+
+<script>
+import * as echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  name: "ECharts",
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: 'calc(70vh)'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true,
+      default: null
+    }
+  },
+  data() {
+    return {
+      chart: null,
+    }
+  },
+  mounted() {
+    this.initChart()
+  },
+  watch: {
+    chartData: {
+      handler() {
+        if (this.chart) {
+          this.chart.dispose();
+          this.chart = null;
+        }
+        this.$nextTick(() => {
+          this.initChart()
+        })
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  beforeDestroy() {
+    if (this.chart) {
+      this.chart.dispose()
+      this.chart = null
+    }
+  },
+  methods: {
+    initChart() {
+      if(this.chart != null && this.chart !== "" && this.chart !== undefined){
+        this.chart.dispose();//解决echarts dom已经加载的报错
+      }
+      this.chart = echarts.init(this.$refs.echarts, 'macarons');
+      this.setOptions(this.chartData)
+    },
+    setOptions(chartData) {
+      if(this.chart) {
+        this.chart.setOption(chartData)
+      }
+    }
+  }
+}
+</script>

+ 443 - 0
meas_web/src/views/meas/env/data.vue

@@ -0,0 +1,443 @@
+<template>
+  <div class="mod">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
+      <el-row>
+        <el-form-item label="对比数据选择" label-width="120px">
+          <el-radio-group v-model="contrastType">
+            <el-radio :label="1">光谱辐射处理后目标3~5</el-radio>
+            <el-radio :label="2">光谱辐射处理后目标8~14</el-radio>
+            <el-radio :label="3">光谱辐射计算后数据3~5</el-radio>
+            <el-radio :label="4">光谱辐射计算后数据8~14</el-radio>
+            <el-radio :label="5">透过率曲线3~5</el-radio>
+            <el-radio :label="6">透过率曲线8~14</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <div class="mod-bd" style="float: right;padding-bottom: 10px;">
+          <el-button type="primary" @click="subCompareData" :disabled="envDataRightList.length === 0">对比</el-button>
+        </div>
+      </el-row>
+    </el-form>
+    <div class="mod-hd">
+      <div class="panel" style="overflow: auto;height: calc(80vh);">
+        <div class="panel-hd">
+          <span>选择区域</span>
+          <span>{{ ids.length }}/{{ total }}</span>
+        </div>
+        <div class="panel-bd">
+          <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
+            <el-form-item label="测量批次" prop="measurementBatch" label-width="90px">
+              <el-input v-model="queryParams.measurementBatch" placeholder="请输入测量批次" clearable
+                        @keyup.enter.native="handleQuery" />
+            </el-form-item>
+            <el-form-item label="发动机型号" prop="engineModel" label-width="90px">
+              <el-input v-model="queryParams.engineModel" placeholder="请输入发动机型号" clearable
+                        @keyup.enter.native="handleQuery" />
+            </el-form-item>
+            <el-form-item label="发动机状态" prop="engineStatus" label-width="90px">
+              <el-select v-model="queryParams.engineStatus" placeholder="请选择发动机状态" clearable>
+                <el-option v-for="(item, index) in engineStatusOptions" :key="index" :label="item" :value="item" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="角度" prop="angle">
+              <el-select v-model="queryParams.angle" placeholder="请选择角度" clearable>
+                <el-option v-for="item in angleOptions" :key="item" :label="item" :value="item" />
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+          <el-table v-loading="loading" :data="envDataList" @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="55" align="center" />
+            <el-table-column label="批次" width="180" align="center" prop="measurementBatch" />
+            <el-table-column label="发动机型号" width="100" align="center" prop="engineModel" />
+            <el-table-column label="发动机状态" width="100" align="center" prop="engineStatus" />
+            <el-table-column label="角度" align="center" prop="angle" />
+            <el-table-column label="测试距离" align="center" prop="testDistance" />
+            <el-table-column label="时间" width="150" align="center" prop="time" />
+            <el-table-column label="大气压" align="center" prop="atmosPress" />
+            <el-table-column label="温度" align="center" prop="temperature" />
+            <el-table-column label="风速" align="center" prop="windSpeed" />
+            <el-table-column label="湿度" align="center" prop="humidity" />
+            <el-table-column label="CO2浓度" align="center" prop="concentration" />
+          </el-table>
+          <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+                      @pagination="getList" :pageSizes="[50, 100, 200]" />
+        </div>
+      </div>
+      <div class="mod-hd__center">
+        <el-button-group style="display: grid;">
+          <el-button type="primary" icon="el-icon-arrow-left" :disabled="idsRight.length === 0" @click="delRight" style="border-radius: 5px;"></el-button>
+          <el-button type="primary" icon="el-icon-arrow-right" :disabled="ids.length === 0" @click="addRight" style="margin-top: 5px;border-radius: 5px;"></el-button>
+        </el-button-group>
+      </div>
+      <div class="panel" style="overflow: auto;height: calc(80vh);">
+        <!-- <div class="panel-hd">
+          <span>已选择数据</span>
+          <span>{{ idsRight.length }}</span>
+        </div> -->
+        <div class="panel-bd">
+          <el-table v-loading="loading" :data="envDataRightList" @selection-change="handleSelectionChangeRight">
+            <el-table-column type="selection" width="55" align="center" />
+            <el-table-column label="批次" width="180" align="center" prop="measurementBatch" />
+            <el-table-column label="发动机型号" width="100" align="center" prop="engineModel" />
+            <el-table-column label="发动机状态" width="100" align="center" prop="engineStatus" />
+            <el-table-column label="角度" align="center" prop="angle" />
+            <el-table-column label="测试距离" align="center" prop="testDistance" />
+            <el-table-column label="时间" width="150" align="center" prop="time" />
+            <el-table-column label="大气压" align="center" prop="atmosPress" />
+            <el-table-column label="温度" align="center" prop="temperature" />
+            <el-table-column label="风速" align="center" prop="windSpeed" />
+            <el-table-column label="湿度" align="center" prop="humidity" />
+            <el-table-column label="CO2浓度" align="center" prop="concentration" />
+          </el-table>
+        </div>
+      </div>
+    </div>
+    <el-dialog :close-on-click-modal="false" :destroy-on-close="true" title="数据可视化" :visible.sync="fileVisible" width="80%" append-to-body :before-close="handleClose">
+      <ECharts class="chartShow" :chartData="chartData" width="100%" />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { statusOption } from '@/api/meas/status'
+import { angleOption } from '@/api/meas/angle'
+import { compareData, listEnvData } from '@/api/meas/envData'
+import ECharts from './ECharts.vue'
+
+export default {
+  components: { ECharts },
+  data() {
+    return {
+      // 文件读取百分比
+      percentNum: 0,
+      // 图表数据
+      chartData: null,
+      // 图表显示
+      fileVisible: false,
+      // 定时器
+      childValue: null,
+      // 选中数组
+      ids: [],
+      // 右侧选中数组
+      idsRight: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 总条数
+      total: 0,
+      // 测量环境数据表格数据
+      envDataList: [],
+      // 右侧表格数据
+      envDataRightList: [],
+      // 遮罩层
+      loading: true,
+      // 发动机状态
+      engineStatusOptions: [],
+      // 发动机角度
+      angleOptions: [],
+      contrastType: 1,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 50,
+        measurementBatch: null,
+        engineModel: null,
+        engineStatus: null,
+        angle: null,
+        measurementBatchId: null,
+        engineStatusId: null,
+        angleId: null,
+      },
+    };
+  },
+  created() {
+    this.getList();
+    this.getAngleOption();
+    this.getStatusOption();
+  },
+  methods: {
+    // 获取状态Option
+    getStatusOption() {
+      this.loading = true;
+      statusOption().then((response) => {
+        this.engineStatusOptions = response.data;
+        this.loading = false;
+      });
+    },
+    // 获取角度Option
+    getAngleOption() {
+      this.loading = true;
+      angleOption().then((response) => {
+        this.angleOptions = response.data;
+        this.loading = false;
+      });
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.measurementBatchId = null;
+      this.queryParams.engineStatusId = null;
+      this.queryParams.angleId = null;
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    // 右侧多选框选中数据
+    handleSelectionChangeRight(selection) {
+      this.idsRight = selection.map((item) => item.id);
+    },
+    // 左侧删除
+    delRight() {
+      const keys = [];
+      this.envDataRightList.forEach((item, key) => {
+        if (this.idsRight.includes(item.id)) {
+          keys.push(key);
+        }
+      })
+       // 保留索引不在需要删除的索引数组中的元素
+      this.envDataRightList = this.envDataRightList.filter((_, index) => !keys.includes(index));
+    },
+    // 右侧添加
+    addRight() {
+      const ids = [];
+      this.envDataRightList.forEach((item) => {
+        ids.push(item.id);
+      })
+      var num = this.envDataRightList.length;
+      this.envDataList.forEach((item) => {
+        if (this.ids.includes(item.id) && !ids.includes(item.id)) {
+          num = Number(num) + 1; 
+        }
+      })
+      if(num <= 20){
+        this.envDataList.forEach((item) => {
+          if (this.ids.includes(item.id) && !ids.includes(item.id)) {
+            this.envDataRightList.push(item);
+          }
+        })
+      }else{
+        this.$modal.msgWarning("数据最多可对比20条!");
+      }
+    },
+    /** 查询测量环境数据列表 */
+    getList() {
+      this.loading = true;
+      listEnvData(this.queryParams).then((response) => {
+        this.envDataList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 对比数据 */
+    async subCompareData() {
+      const ids = [];
+      this.envDataRightList.forEach((item, key) => {
+        ids.push(item.id)
+      })
+      // const ids = this.ids;
+      // const ids = this.idsRight;
+      const response = await compareData({
+        batchIds: ids.toString(),
+        contrastType: this.contrastType,
+      });
+      if(response.length === 0) {
+        this.$modal.msgWarning("文件为空");
+        return false;
+      }
+      const loading = this.$loading({
+        lock: true,
+        text: '文件读取中',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      });
+      const chartData = [];
+      const chartName = [];
+      const chartNamejq = [];
+      response?.forEach((item) => {
+        const url = `${process.env.VUE_APP_BASE_API}${item.url}`;
+        chartName.push(item.name);
+        console.log(item.name.length > 15)
+        if(item.name.length > 15){
+          console.log(item.name.substring(0, 15))
+          chartNamejq.push(item.name.substring(0, 15));
+        }else{
+          chartNamejq.push(item.name);
+        }
+        console.log(chartNamejq)
+        this.fetchLogFile(url)
+          .then((text) => {
+            chartData.push(text.split("\r\n"));
+            this.percentNum = Math.floor((chartData.length / response.length) * 100);
+            loading.setText('文件读取'+this.percentNum+"%");
+            if(chartData.length === response.length) {
+              loading.close();
+              this.chartData = this.handleLineChart(chartData,chartName,chartNamejq);
+              this.fileVisible = true;
+            }
+          })
+          .catch((error) => {
+            loading.close();
+            console.error("Failed to fetch the log file:", error);
+            this.$modal.msgError("文件读取错误");
+          });
+      })
+    },
+    // 读取文件内容
+    async fetchLogFile(url) {
+      try {
+        const response = await fetch(url, { method: "GET" });
+        if (!response.ok) {
+          throw new Error(`HTTP error! status: ${response.status}`);
+        }
+        return await response.text();
+      } catch (error) {
+        throw error;
+      }
+    },
+    handleClose(){
+      this.fileVisible = false;
+    },
+    // echarts数据
+    handleLineChart(dataArr,nameArr,chartNamejq) {
+      console.log(dataArr)
+      let yAxis = null, xAxis = null, series = [];
+      var num = 0;
+      dataArr.forEach((items) => {
+        const data = items[0].replace(/\s+/g, " ").split(" ")
+        const customName = data.map(label => ({ [label + 'Data']: [] }))
+        if(!xAxis) {
+          xAxis = {
+            type: "category",
+            name: data[0],
+            axisTick: {
+              alignWithLabel: true,
+            },
+            axisLine: {
+              show: true,
+            },
+            data: [],
+          }
+        }
+        for (let i = 1; i < items.length; i++) {
+          let row = items[i].split("\t");
+          customName.forEach((item, index) => {
+            for (let key in item) {
+              item[key].push(parseFloat(row[index]))
+            }
+          })
+        }
+        customName.forEach((item, index) => {
+          if (index === 0) return
+          if(!yAxis) {
+            yAxis = {
+              type: "value",
+              name: data[index],
+              position: 'left',
+              alignTicks: true,
+              axisLine: {
+                show: true,
+              },
+            }
+          }
+          if(!series) {
+            series = {
+              name: data[index],
+              type: "line",
+              data: [],
+            }
+          }
+          series.push({
+            // name: data[index],
+            name: nameArr[num],
+            type: "line",
+            data: item[Object.keys(item)[0]],
+          })
+          num++;
+        })
+        xAxis.data = Object.values(customName[0])[0];
+      })
+      return {
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "cross",
+          },
+        },
+        xAxis: xAxis,
+        yAxis: yAxis,
+        series: series,
+        legend: {
+          // type: 'scroll',
+          orient: 'vertical',
+          left: 'right',
+          top: 'center',
+        // bottom: 20,
+          data: nameArr,
+          formatter: function (name) {
+            if (name.length > 15) {
+                return name.substring(0, 15) + '...';
+            } else {
+                return name;
+            }
+        }
+        },
+      };
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+  .mod {
+    padding: 30px;
+    &-hd {
+      display: flex;
+      &__center {
+        width: 6%;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+      }
+    }
+    &-bd {
+      padding-bottom: 20px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+  .panel {
+    width: 47%;
+    border: 1px solid #ebeef5;
+    &-hd {
+      height: 40px;
+      line-height: 40px;
+      background: #f5f7fa;
+      margin: 0;
+      padding: 0 20px;
+      border: 1px solid #ebeef5;
+      box-sizing: border-box;
+      color: #606266;
+      display: flex;
+      justify-content: space-between;
+    }
+    &-bd {
+      padding: 10px;
+    }
+  }
+  .chartShow {
+    margin: 0 auto;
+  }
+</style>
+

+ 149 - 31
meas_web/src/views/meas/envData/ECharts.vue

@@ -1,12 +1,42 @@
 <template>
-  <div :class="className" :style="{height:height,width:width}" />
+  <div >
+    <div>
+      <el-form :inline="true" :model="echartsForm" class="demo-form-inline">
+        <el-form-item label="帧数">
+          <el-select v-model="echartsForm.num" placeholder="请选择帧数" @change="changeNum">
+            <el-option label="500" :value="500"></el-option>
+            <el-option label="1000" :value="1000"></el-option>
+            <el-option label="2000" :value="2000"></el-option>
+            <el-option label="50000" :value="50000"></el-option>
+            <el-option label="10000" :value="10000"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="changeEchartsStop">{{ echartsForm.echartsStop ? '播放' : '暂停' }}</el-button>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="prevEcharts">上一页</el-button>
+          <el-button type="primary" @click="nextEcharts">下一页</el-button>
+        </el-form-item>
+      </el-form>
+      <div>
+        <div ref="echarts" :class="className" :style="{height:height,width:width}" style="margin: auto" />
+      </div>
+    </div>
+    <el-slider
+      v-model="sliderValue"
+      :step="sliderNum"
+      :show-tooltip="false"
+      @change="changeSlider"
+      show-stops>
+    </el-slider>
+  </div>
 </template>
-  
+
   <script>
   import * as echarts from 'echarts'
   require('echarts/theme/macarons') // echarts theme
   import resize from '../../dashboard/mixins/resize'
-  var chart
 
   export default {
     name: "ECharts",
@@ -22,63 +52,151 @@
       },
       height: {
         type: String,
-        default: '400px'
+        default: 'calc(60vh)'
       },
       autoResize: {
         type: Boolean,
         default: true
       },
       chartData: {
-        type: Object,
+        type: Array,
         required: true,
         default: null
-      }
+      },
     },
     data() {
       return {
-        // chart: null
+        sliderValue: 0,
+        sliderNum: 100,
+        chart: null,
+        echartsForm: {
+          currentIndex: 0,
+          timeId: null,
+          num: 2000,
+          echartsStop: false,
+        }
       }
     },
-    mounted() {
-      this.$nextTick(() => {
-        this.initChart()
-      })
-    },
+    computed: {},
     watch: {
       chartData: {
         handler(val) {
-          if (chart) { 
-            chart.dispose();
-            chart = null;
+          if (this.chart) {
+            this.chart.dispose();
+            this.chart = null;
+          }
+          if(val.length > 0) {
+            this.$nextTick(() => {
+              console.log('初始化echarts', val)
+              this.initChart()
+            })
           }
-          this.$nextTick(() => {
-            this.initChart()
-            console.log("width",this.width);
-            // this.setOptions(val)
-          })
         },
         deep: true,
         immediate: true
-      }
+      },
     },
     beforeDestroy() {
-      if (chart) {
-        chart.dispose()
-        chart = null
+      if (this.chart) {
+        this.chart.dispose()
+        this.chart = null
+      }
+      if(this.echartsForm.timeId) {
+        console.log(this.echartsForm.timeId, '销毁定时器')
+        clearInterval(this.echartsForm.timeId);
+        this.echartsForm.timeId = null;
       }
     },
     methods: {
+      changeSlider() {
+        this.changeEchartsStop();
+        this.echartsForm.currentIndex = Math.round((this.chartData.length - 1) * this.sliderValue / 100);
+        this.setOptions(this.chartData[this.echartsForm.currentIndex]);
+        this.$nextTick(() => {
+          this.changeEchartsStop();
+        });
+      },
+      changeNum() {
+        this.changeEchartsStop();
+        this.$nextTick(() => {
+          this.changeEchartsStop();
+        });
+      },
+      // 上一页
+      prevEcharts() {
+        this.changeEchartsStop();
+        if(this.echartsForm.currentIndex > 0) {
+          this.echartsForm.currentIndex--;
+          this.sliderValue = this.echartsForm.currentIndex * 100 / (this.chartData.length - 1);
+          this.setOptions(this.chartData[this.echartsForm.currentIndex]);
+          this.changeEchartsStop();
+        } else {
+          this.echartsForm.currentIndex = this.chartData.length - 1;
+          this.sliderValue = this.echartsForm.currentIndex * 100 / (this.chartData.length - 1);
+          this.setOptions(this.chartData[this.echartsForm.currentIndex]);
+          this.changeEchartsStop();
+        }
+      },
+      nextEcharts() {
+        this.changeEchartsStop();
+        if(this.echartsForm.currentIndex === (this.chartData.length - 1)) {
+          this.echartsForm.currentIndex = 0;
+          this.sliderValue = this.echartsForm.currentIndex * 100 / (this.chartData.length - 1);
+          this.setOptions(this.chartData[this.echartsForm.currentIndex]);
+          this.changeEchartsStop();
+        } else {
+          this.echartsForm.currentIndex++;
+          this.sliderValue = this.echartsForm.currentIndex * 100 / (this.chartData.length - 1);
+          this.setOptions(this.chartData[this.echartsForm.currentIndex]);
+          this.changeEchartsStop();
+        }
+      },
+      // 图表初始化
       initChart() {
-        if(chart != null && chart != "" && chart != undefined){
-        	chart.dispose();//解决echarts dom已经加载的报错
+        if(this.chart != null && this.chart !== "" && this.chart !== undefined){
+          this.chart.dispose();//解决echarts dom已经加载的报错
         }
-        chart = echarts.init(this.$el, 'macarons')
-        this.setOptions(this.chartData)
+        this.chart = echarts.init(this.$refs.echarts, 'macarons');
+        this.setOptions(this.chartData[this.echartsForm.currentIndex]);
+        this.creatStopInterval();
       },
+      creatStopInterval() {
+        if(this.echartsForm.echartsStop) {
+          if(this.echartsForm.timeId) {
+            clearInterval(this.echartsForm.timeId);
+            this.echartsForm.timeId = null;
+          }
+        } else {
+          if(this.echartsForm.timeId) {
+            clearInterval(this.echartsForm.timeId);
+            this.echartsForm.timeId = null;
+          }
+          this.sliderNum = 100 / (this.chartData.length - 1);
+          // 开始自动播放
+          this.echartsForm.timeId = setInterval(() => {
+            console.log('定时器执行了', this.echartsForm.timeId)
+            if(this.echartsForm.currentIndex === (this.chartData.length - 1)) {
+              this.echartsForm.currentIndex = 0;
+            } else {
+              this.echartsForm.currentIndex++;
+            }
+            this.sliderValue = this.echartsForm.currentIndex * 100 / (this.chartData.length - 1);
+            this.setOptions(this.chartData[this.echartsForm.currentIndex]);
+          }, this.echartsForm.num); // 切换一次热图
+          this.$emit('get-value', this.echartsForm.timeId);
+        }
+      },
+      // 设置图表信息
       setOptions(chartData) {
-        chart.setOption(chartData)
+        if(this.chart) {
+          this.chart.setOption(chartData)
+        }
+      },
+      // 播放暂停
+      changeEchartsStop() {
+        this.echartsForm.echartsStop = !this.echartsForm.echartsStop;
+        this.creatStopInterval();
       }
-    }
+    },
   }
 </script>
-  

+ 83 - 0
meas_web/src/views/meas/envData/TxtECharts.vue

@@ -0,0 +1,83 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+  <script>
+  import * as echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+  var chart
+
+  export default {
+    name: "ECharts",
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: 'calc(70vh)'
+      },
+      autoResize: {
+        type: Boolean,
+        default: true
+      },
+      chartData: {
+        type: Object,
+        required: true,
+        default: null
+      }
+    },
+    data() {
+      return {
+        // chart: null
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    watch: {
+      chartData: {
+        handler(val) {
+          if (chart) {
+            chart.dispose();
+            chart = null;
+          }
+          this.$nextTick(() => {
+            this.initChart()
+            console.log("width",this.width);
+            // this.setOptions(val)
+          })
+        },
+        deep: true,
+        immediate: true
+      }
+    },
+    beforeDestroy() {
+      if (chart) {
+        chart.dispose()
+        chart = null
+      }
+    },
+    methods: {
+      initChart() {
+        if(chart != null && chart != "" && chart != undefined){
+        	chart.dispose();//解决echarts dom已经加载的报错
+        }
+        chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions(chartData) {
+        chart.setOption(chartData)
+      }
+    }
+  }
+</script>

+ 191 - 67
meas_web/src/views/meas/envData/index.vue

@@ -1,78 +1,117 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="测量批次" prop="measurementBatch" label-width="90px">
-        <el-input v-model="queryParams.measurementBatch" placeholder="请输入测量批次" clearable
-          @keyup.enter.native="handleQuery" />
-      </el-form-item>
-      <el-form-item label="发动机型号" prop="engineModel" label-width="90px">
-        <el-input v-model="queryParams.engineModel" placeholder="请输入发动机型号" clearable
-          @keyup.enter.native="handleQuery" />
-      </el-form-item>
-      <el-form-item label="发动机状态" prop="engineStatus" label-width="90px">
-        <el-select v-model="queryParams.engineStatus" placeholder="请选择发动机状态" clearable>
-          <el-option v-for="(item, index) in engineStatusOptions" :key="index" :label="item" :value="item" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="角度" prop="angle">
-        <el-select v-model="queryParams.angle" placeholder="请选择角度" clearable>
-          <el-option v-for="item in angleOptions" :key="item" :label="item" :value="item" />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
-          v-hasPermi="['meas:envData:add']">新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
-          v-hasPermi="['meas:envData:edit']">修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
-          v-hasPermi="['meas:envData:remove']">删除</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
-          v-hasPermi="['meas:envData:export']">导出</el-button>
+    <el-row :gutter="20">
+      <!--部门数据-->
+      <el-col :span="4" :xs="24" class="tree">
+        <div class="head-container">
+          <el-input
+            v-model="measurementBatch"
+            @change="handleEnter"
+            placeholder="请输入批次"
+            clearable
+            size="small"
+            prefix-icon="el-icon-search"
+            style="margin-bottom: 20px"
+          />
+        </div>
+        <div class="head-container">
+          <el-tree
+            :data="deptOptions"
+            :props="defaultProps"
+            :expand-on-click-node="false"
+            :filter-node-method="filterNode"
+            ref="tree"
+            node-key="id"
+            highlight-current
+            @node-click="handleNodeClick"
+          />
+        </div>
       </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
+      <el-col :span="20" :xs="24" class="table">
+        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+          <el-form-item label="测量批次" prop="measurementBatch" label-width="90px">
+            <el-input v-model="queryParams.measurementBatch" placeholder="请输入测量批次" clearable
+              @keyup.enter.native="handleQuery" />
+          </el-form-item>
+          <el-form-item label="发动机型号" prop="engineModel" label-width="90px">
+            <el-input v-model="queryParams.engineModel" placeholder="请输入发动机型号" clearable
+              @keyup.enter.native="handleQuery" />
+          </el-form-item>
+          <el-form-item label="发动机状态" prop="engineStatus" label-width="90px">
+            <el-select v-model="queryParams.engineStatus" placeholder="请选择发动机状态" clearable>
+              <el-option v-for="(item, index) in engineStatusOptions" :key="index" :label="item" :value="item" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="角度" prop="angle">
+            <el-select v-model="queryParams.angle" placeholder="请选择角度" clearable>
+              <el-option v-for="item in angleOptions" :key="item" :label="item" :value="item" />
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
 
-    <el-table v-loading="loading" :data="envDataList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="测量批次" align="center" prop="measurementBatch" />
-      <el-table-column label="发动机型号" align="center" prop="engineModel" />
-      <el-table-column label="发动机状态" align="center" prop="engineStatus" />
-      <el-table-column label="发动机角度" align="center" prop="angle" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button size="mini" type="text" icon="el-icon-view" @click="checkView(scope.row)"
-            v-hasPermi="['meas:envData:edit']">查看</el-button>
-          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
-            v-hasPermi="['meas:envData:edit']">修改</el-button>
-          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
-            v-hasPermi="['meas:envData:remove']">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+              v-hasPermi="['meas:envData:add']">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
+              v-hasPermi="['meas:envData:edit']">修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
+              v-hasPermi="['meas:envData:remove']">删除</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+              v-hasPermi="['meas:envData:export']">导出</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain size="mini" @click="handleDui"
+                       v-hasPermi="['meas:envData:edit']">数据对比</el-button>
+          </el-col>
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
 
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
-      @pagination="getList" />
+        <el-table v-loading="loading" :data="envDataList" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="55" align="center" />
+          <el-table-column label="批次" align="center" prop="measurementBatch" :show-overflow-tooltip="true" />
+          <el-table-column label="发动机型号" align="center" prop="engineModel" :show-overflow-tooltip="true" />
+          <el-table-column label="发动机状态" align="center" prop="engineStatus" :show-overflow-tooltip="true" />
+          <el-table-column label="角度" align="center" prop="angle" />
+          <el-table-column label="测试距离" align="center" prop="testDistance" />
+          <el-table-column label="时间" align="center" prop="time" :show-overflow-tooltip="true" />
+          <el-table-column label="大气压" align="center" prop="atmosPress" />
+          <el-table-column label="温度" align="center" prop="temperature" />
+          <el-table-column label="风速" align="center" prop="windSpeed" />
+          <el-table-column label="湿度" align="center" prop="humidity" />
+          <el-table-column label="CO2浓度" align="center" prop="concentration" />
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150">
+            <template slot-scope="scope">
+              <el-button size="mini" type="text" icon="el-icon-view" @click="checkView(scope.row)"
+                v-hasPermi="['meas:envData:edit']">查看</el-button>
+              <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                v-hasPermi="['meas:envData:edit']">修改</el-button>
+              <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                v-hasPermi="['meas:envData:remove']">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
 
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+          @pagination="getList" :pageSizes="[50, 100, 200]" />
+      </el-col>
+    </el-row>
     <!-- 添加或修改测量环境数据对话框 -->
     <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="70%" append-to-body :before-close="handleClose">
       <dialogContent ref="dialogContentRef" :form="form" :TIForm="TIForm" :TransmittanceForm="TransmittanceForm"
         :envSaveBtn="true" :radiationForm="radiationForm" :isCheck="isCheck" :addFlag="addFlag" :footShow="footShow" @env-data-save="envDataSave"
         @submit-form="submitForm" @cancel="cancel" />
     </el-dialog>
-
   </div>
 </template>
 
@@ -83,6 +122,7 @@ import {
   delEnvData,
   addEnvData,
   updateEnvData,
+  measEnvDataTree,
 } from "@/api/meas/envData";
 import {
   addRadiation,
@@ -101,7 +141,7 @@ import {
 } from "@/api/meas/transmissionRate";
 import { angleOption } from "@/api/meas/angle";
 import { statusOption } from "@/api/meas/status";
-
+import router from "@/router";
 import dialogContent from "@/views/meas/components/dialogContent";
 
 export default {
@@ -130,11 +170,14 @@ export default {
       // 查询参数
       queryParams: {
         pageNum: 1,
-        pageSize: 10,
+        pageSize: 50,
         measurementBatch: null,
         engineModel: null,
         engineStatus: null,
         angle: null,
+        measurementBatchId: null,
+        engineStatusId: null,
+        angleId: null,
       },
       isCheck: false,
       // 表单参数
@@ -159,15 +202,68 @@ export default {
       disabled: false,
       addFlag: false,
       formIsChange: false,
-      footShow:true
+      footShow:true,
+      // 部门树选项
+      deptOptions: undefined,
+      defaultProps: {
+        children: "children",
+        label: "label"
+      },
+      measurementBatch: undefined,
     };
   },
+  // watch: {
+  //   // 根据名称筛选部门树
+  //   measurementBatch(val) {
+  //     console.log(val);
+  //     this.$refs.tree.filter(val);
+  //   }
+  // },
   created() {
+    this.getDeptTree({ measurementBatch: "" });
     this.getList();
     this.getAngleOption();
     this.getStatusOption();
   },
   methods: {
+    handleEnter() {
+      console.log('回车键被按下了');
+      console.log(this.measurementBatch);
+      this.getDeptTree({ measurementBatch: this.measurementBatch });
+      // 在这里执行你的逻辑
+    },
+
+    /** 查询部门下拉树结构 */
+    getDeptTree(query) {
+      measEnvDataTree(query).then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      console.log(data)
+      if(data.levle == 1){
+        this.queryParams.measurementBatchId = data.id;
+        this.queryParams.engineStatusId = null;
+        this.queryParams.angleId = null;
+      }else if(data.levle == 2){
+        this.queryParams.measurementBatchId = data.parentId;
+        this.queryParams.engineStatusId = data.id;
+        this.queryParams.angleId = null;
+      }else if(data.levle == 3){
+        this.queryParams.measurementBatchId = data.parentId.split(',')[0];
+        this.queryParams.engineStatusId = data.parentId.split(',')[1];
+        this.queryParams.angleId = data.id;
+      }
+      // this.queryParams.deptId = data.id;
+      this.handleQuery();
+    },
+
     /** 查询测量环境数据列表 */
     getList() {
       this.loading = true;
@@ -200,6 +296,7 @@ export default {
     },
     handleClose(){
       this.$refs.dialogContentRef?.handleCloseBefore()
+      this.$refs.dialogContentRef?.handleCloseBeforeTI()
       this.cancel()
     },
     // 保存环境参数
@@ -260,7 +357,11 @@ export default {
         temperature: null,
         windSpeed: null,
         humidity: null,
-        concentration: null
+        concentration: null,
+        visibility: null,
+        measurementBatchId: null,
+        engineStatusId: null,
+        angleId: null,
       }
       this.resetForm("form");
     },
@@ -313,6 +414,10 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.queryParams.measurementBatchId = null;
+      this.queryParams.engineStatusId = null;
+      this.queryParams.angleId = null;
+      this.$refs.tree.setCurrentKey(null);
       this.handleQuery();
     },
     // 多选框选中数据
@@ -357,6 +462,7 @@ export default {
       });
       getTIDataByEnvData(id).then((response) => {
         if (response.data) {
+          this.$refs.dialogContentRef?.getTempCalData(response.data.tempCal)
           this.TIForm = response.data;
         } else {
           this.TIFormReset()
@@ -381,6 +487,10 @@ export default {
         }
       });
     },
+    /** 数据对比操作 */
+    handleDui() {
+      router.push('/meas/env/data');
+    },
     /** 提交按钮 */
     submitForm() {
       const promises = [];
@@ -464,6 +574,9 @@ export default {
 };
 </script>
 <style scoped lang="scss">
+.app-container {
+  padding: 0 20px 0 20px;
+}
 .box {
   border: 1px solid #dcdfe6;
   border-radius: 10px;
@@ -480,4 +593,15 @@ export default {
     font-size: 1rem;
   }
 }
+.tree {
+  padding-top: 20px;
+  overflow: auto;
+  height: calc(100vh - 85px);
+}
+.table {
+  padding-top: 20px;
+  overflow: auto;
+  height: calc(100vh - 85px);
+  border-left: 1px solid #DCDFE6;
+}
 </style>

+ 10 - 1
meas_web/src/views/meas/radiation/index.vue

@@ -183,7 +183,16 @@ export default {
         calCurve: null,
         rawData: null,
         radiance1: null,
-        radiance2: null
+        radiance2: null,
+        calTempEk: null,
+        rawTarget1: null,
+        rawTarget2: null,
+        rawBackground1: null,
+        rawBackground2: null,
+        tackleTarget1: null,
+        tackleTarget2: null,
+        tackleBackground1: null,
+        tackleBackground2: null
       };
       this.resetForm("radiationForm");
     },

+ 3 - 1
meas_web/src/views/meas/thermalImagerTesDdata/index.vue

@@ -103,7 +103,7 @@
 
     <!-- 添加或修改热像仪测试数据对话框 -->
     <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="70%" append-to-body>
-      <dialogContent :TIForm="TIForm" :form="form" @submit-form="submitForm" :isCheck="isCheck" @cancel="cancel"/>
+      <dialogContent ref="TIRef" :TIForm="TIForm" :form="form" @submit-form="submitForm" :isCheck="isCheck" @cancel="cancel"/>
     </el-dialog>
   </div>
 </template>
@@ -188,6 +188,7 @@ export default {
     },
     // 取消按钮
     cancel() {
+      this.$refs.TIRef?.handleCloseBeforeTI()
       this.open = false;
       this.reset();
     },
@@ -257,6 +258,7 @@ export default {
       getTIDataByEnvData(id).then(response => {
         this.TIForm = response.data;
         this.open = true;
+        this.$refs.TIRef?.getTempCalData(response.data.tempCal)
         this.title = this.isCheck?'查看热像仪测试数据':"修改热像仪测试数据";
       });
     },

+ 1 - 1
meas_web/src/views/register.vue

@@ -6,7 +6,7 @@
       :rules="registerRules"
       class="register-form"
     >
-      <h3 class="title">某测量数据管理系统</h3>
+      <h3 class="title">某测量数据管理系统111</h3>
       <el-form-item prop="username">
         <el-input
           v-model="registerForm.username"

+ 1 - 0
meas_web/src/views/system/user/index.vue

@@ -456,6 +456,7 @@ export default {
   watch: {
     // 根据名称筛选部门树
     deptName(val) {
+      console.log(val);
       this.$refs.tree.filter(val);
     }
   },

+ 4 - 3
meas_web/vue.config.js

@@ -7,9 +7,9 @@ function resolve(dir) {
 
 const CompressionPlugin = require("compression-webpack-plugin");
 
-const name = process.env.VUE_APP_TITLE || "某测量数据管理系统"; // 网页标题
+const name = process.env.VUE_APP_TITLE; // 网页标题
 
-const port = process.env.port || process.env.npm_config_port || 80; // 端口
+const port = process.env.port || process.env.npm_config_port || 81; // 端口
 
 // vue.config.js 配置说明
 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
@@ -35,7 +35,8 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target: `http://localhost:8080`,
+        // http://8.210.105.62:8080
+        target: `http://8.210.105.62:8080`,
         changeOrigin: true,
         pathRewrite: {
           ["^" + process.env.VUE_APP_BASE_API]: "",

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1141 - 0
sql/meas20241029.sql


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1179 - 0
sql/meas20241106.sql


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1357 - 0
sql/meas20241126.sql


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů