Parcourir la source

裂解炉炉管测压 - FVP趋势分析折线图

wangggziwen il y a 1 an
Parent
commit
458f386dbc

+ 471 - 5
master/src/main/java/com/ruoyi/project/production/controller/TFurnancePressureController.java

@@ -3,13 +3,13 @@ package com.ruoyi.project.production.controller;
 import java.text.DecimalFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.project.production.controller.vo.FurnancePressureFvpVO;
 import com.ruoyi.project.production.controller.vo.FurnancePressureVO;
+import com.ruoyi.project.production.controller.vo.FvpAnalysisQueryVO;
+import com.ruoyi.project.production.mapper.TFurnancePressureMapper;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -29,6 +29,7 @@ import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.page.TableDataInfo;
 
+
 /**
  * 裂解炉炉管测压Controller
  *
@@ -42,11 +43,476 @@ public class TFurnancePressureController extends BaseController
     @Autowired
     private ITFurnancePressureService tFurnancePressureService;
 
+    @Autowired
+    private TFurnancePressureMapper tFurnancePressureMapper;
+
+    /**
+     * 获取裂解炉炉管测压fvp分析数据
+     */
+    @PostMapping("/getFvpAnalysis")
+    public AjaxResult getFvpAnalysis(@RequestBody FvpAnalysisQueryVO fvpAnalysisQueryVO) {
+        String furnanceName = fvpAnalysisQueryVO.getFurnanceName();
+        furnanceName = furnanceName.replace("-", "").replace("A", "").replace("B", "");
+        Date startDate = new Date(fvpAnalysisQueryVO.getRecordTime().getTime());
+        startDate.setMonth(startDate.getMonth() - 3);
+        Date endDate = new Date(fvpAnalysisQueryVO.getRecordTime().getTime());
+        endDate.setDate(endDate.getDate() + 1);
+        TFurnancePressure pressure = new TFurnancePressure();
+        pressure.setFurnanceName(furnanceName);
+        pressure.setStartDate(startDate);
+        pressure.setEndDate(endDate);
+        List<TFurnancePressure> tFurnancePressures = tFurnancePressureMapper.selectTFurnancePressureAnalysis(pressure);
+        LinkedHashMap<Date, Double> resultMap = new LinkedHashMap<>();
+        switch (fvpAnalysisQueryVO.getFurnanceName()) {
+            case "H-110":
+            case "H-111":
+            case "H-112":
+            case "H-113":
+            case "H-114":
+            case "H-115":
+            case "H-116":
+            case "H-117":
+            case "H-118":
+                resultMap = this.calcAnalysis(tFurnancePressures, fvpAnalysisQueryVO.getPass());
+                break;
+            case "H-130":
+                resultMap = this.calcAnalysis130(tFurnancePressures, fvpAnalysisQueryVO.getPass());
+                break;
+            case "H-109A":
+                resultMap = this.calcAnalysis109A(tFurnancePressures, fvpAnalysisQueryVO.getPass());
+                break;
+            case "H-109B":
+                resultMap = this.calcAnalysis109B(tFurnancePressures, fvpAnalysisQueryVO.getPass());
+                break;
+        }
+        return AjaxResult.success(resultMap);
+    }
+    private LinkedHashMap<Date, Double> calcAnalysis(List<TFurnancePressure> tFurnancePressures, String pass) {
+        LinkedHashMap<Date, Double> map = new LinkedHashMap<>();
+        if (tFurnancePressures != null && tFurnancePressures.size() != 0) {
+            // pass max inlet
+            double pass1Inlet = 0;
+            double pass2Inlet = 0;
+            double pass3Inlet = 0;
+            double pass4Inlet = 0;
+            double pass5Inlet = 0;
+            double pass6Inlet = 0;
+            double pass7Inlet = 0;
+            double pass8Inlet = 0;
+            // pass max outlet
+            double pass1Out = 0;
+            double pass2Out = 0;
+            double pass3Out = 0;
+            double pass4Out = 0;
+            double pass5Out = 0;
+            double pass6Out = 0;
+            double pass7Out = 0;
+            double pass8Out = 0;
+            // pass ratio
+            double pass1Ratio = 0;
+            double pass2Ratio = 0;
+            double pass3Ratio = 0;
+            double pass4Ratio = 0;
+            double pass5Ratio = 0;
+            double pass6Ratio = 0;
+            double pass7Ratio = 0;
+            double pass8Ratio = 0;
+            for (TFurnancePressure tFurnancePressure : tFurnancePressures) {
+                String pass1Array = tFurnancePressure.getPass1();
+                String pass2Array = tFurnancePressure.getPass2();
+                String pass3Array = tFurnancePressure.getPass3();
+                String pass4Array = tFurnancePressure.getPass4();
+                String pass5Array = tFurnancePressure.getPass5();
+                String pass6Array = tFurnancePressure.getPass6();
+                String pass7Array = tFurnancePressure.getPass7();
+                String pass8Array = tFurnancePressure.getPass8();
+                if (StringUtils.isNotEmpty(pass1Array)) {
+                    pass1Inlet = Double.parseDouble(pass1Array.substring(pass1Array.lastIndexOf(",")+1));
+                    pass1Out = this.getMaxValue(pass1Array.substring(0, pass1Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass2Array)) {
+                    pass2Inlet = Double.parseDouble(pass2Array.substring(pass2Array.lastIndexOf(",")+1));
+                    pass2Out = this.getMaxValue(pass2Array.substring(0, pass2Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass3Array)) {
+                    pass3Inlet = Double.parseDouble(pass3Array.substring(pass3Array.lastIndexOf(",")+1));
+                    pass3Out = this.getMaxValue(pass3Array.substring(0, pass3Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass4Array)) {
+                    pass4Inlet = Double.parseDouble(pass4Array.substring(pass4Array.lastIndexOf(",")+1));
+                    pass4Out = this.getMaxValue(pass4Array.substring(0, pass4Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass5Array)) {
+                    pass5Inlet = Double.parseDouble(pass5Array.substring(pass5Array.lastIndexOf(",")+1));
+                    pass5Out = this.getMaxValue(pass5Array.substring(0, pass5Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass6Array)) {
+                    pass6Inlet = Double.parseDouble(pass6Array.substring(pass6Array.lastIndexOf(",")+1));
+                    pass6Out = this.getMaxValue(pass6Array.substring(0, pass6Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass7Array)) {
+                    pass7Inlet = Double.parseDouble(pass7Array.substring(pass7Array.lastIndexOf(",")+1));
+                    pass7Out = this.getMaxValue(pass7Array.substring(0, pass7Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass8Array)) {
+                    pass8Inlet = Double.parseDouble(pass8Array.substring(pass8Array.lastIndexOf(",")+1));
+                    pass8Out = this.getMaxValue(pass8Array.substring(0, pass8Array.indexOf(",")));
+                }
+                DecimalFormat df = new DecimalFormat("#.00");
+                if (pass1Inlet != 0 && pass1Out != 0) { pass1Ratio = Double.parseDouble(df.format(pass1Out / pass1Inlet)); }
+                if (pass2Inlet != 0 && pass2Out != 0) { pass2Ratio = Double.parseDouble(df.format(pass2Out / pass2Inlet)); }
+                if (pass3Inlet != 0 && pass3Out != 0) { pass3Ratio = Double.parseDouble(df.format(pass3Out / pass3Inlet)); }
+                if (pass4Inlet != 0 && pass4Out != 0) { pass4Ratio = Double.parseDouble(df.format(pass4Out / pass4Inlet)); }
+                if (pass5Inlet != 0 && pass5Out != 0) { pass5Ratio = Double.parseDouble(df.format(pass5Out / pass5Inlet)); }
+                if (pass6Inlet != 0 && pass6Out != 0) { pass6Ratio = Double.parseDouble(df.format(pass6Out / pass6Inlet)); }
+                if (pass7Inlet != 0 && pass7Out != 0) { pass7Ratio = Double.parseDouble(df.format(pass7Out / pass7Inlet)); }
+                if (pass8Inlet != 0 && pass8Out != 0) { pass8Ratio = Double.parseDouble(df.format(pass8Out / pass8Inlet)); }
+                Date recordTime = tFurnancePressure.getRecordTime();
+                double ratio = 0;
+                switch (pass) {
+                    case "pass1":
+                        ratio = pass1Ratio;
+                        break;
+                    case "pass2":
+                        ratio = pass2Ratio;
+                        break;
+                    case "pass3":
+                        ratio = pass3Ratio;
+                        break;
+                    case "pass4":
+                        ratio = pass4Ratio;
+                        break;
+                    case "pass5":
+                        ratio = pass5Ratio;
+                        break;
+                    case "pass6":
+                        ratio = pass6Ratio;
+                        break;
+                    case "pass7":
+                        ratio = pass7Ratio;
+                        break;
+                    case "pass8":
+                        ratio = pass8Ratio;
+                        break;
+                    case "passAll":
+                        ratio = this.getMaxDouble(new double[] {pass1Ratio,pass2Ratio,pass3Ratio,pass4Ratio,pass5Ratio,pass6Ratio,pass7Ratio,pass8Ratio});
+                        break;
+                }
+                map.put(recordTime, ratio);
+            }
+            return map;
+        }
+        return null;
+    }
+    private LinkedHashMap<Date, Double> calcAnalysis109A(List<TFurnancePressure> tFurnancePressures, String pass) {
+        LinkedHashMap<Date, Double> map = new LinkedHashMap<>();
+        if (tFurnancePressures != null && tFurnancePressures.size() != 0) {
+            // pass max inlet
+            double pass1Inlet = 0;
+            double pass2Inlet = 0;
+            double pass3Inlet = 0;
+            double pass4Inlet = 0;
+            double pass5Inlet = 0;
+            double pass6Inlet = 0;
+            double pass7Inlet = 0;
+            double pass8Inlet = 0;
+            // pass max outlet
+            double pass1Out = 0;
+            double pass2Out = 0;
+            double pass3Out = 0;
+            double pass4Out = 0;
+            double pass5Out = 0;
+            double pass6Out = 0;
+            double pass7Out = 0;
+            double pass8Out = 0;
+            // pass ratio
+            double pass1Ratio = 0;
+            double pass2Ratio = 0;
+            double pass3Ratio = 0;
+            double pass4Ratio = 0;
+            double pass5Ratio = 0;
+            double pass6Ratio = 0;
+            double pass7Ratio = 0;
+            double pass8Ratio = 0;
+            for (TFurnancePressure tFurnancePressure : tFurnancePressures) {
+                String pass1Array = tFurnancePressure.getPass1();
+                String pass2Array = tFurnancePressure.getPass3();
+                String pass3Array = tFurnancePressure.getPass5();
+                String pass4Array = tFurnancePressure.getPass7();
+                String pass5Array = tFurnancePressure.getPass9();
+                String pass6Array = tFurnancePressure.getPass11();
+                String pass7Array = tFurnancePressure.getPass13();
+                String pass8Array = tFurnancePressure.getPass15();
+                if (StringUtils.isNotEmpty(pass1Array)) {
+                    pass1Inlet = Double.parseDouble(pass1Array.substring(pass1Array.lastIndexOf(",")+1));
+                    pass1Out = this.getMaxValue(pass1Array.substring(0, pass1Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass2Array)) {
+                    pass2Inlet = Double.parseDouble(pass2Array.substring(pass2Array.lastIndexOf(",")+1));
+                    pass2Out = this.getMaxValue(pass2Array.substring(0, pass2Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass3Array)) {
+                    pass3Inlet = Double.parseDouble(pass3Array.substring(pass3Array.lastIndexOf(",")+1));
+                    pass3Out = this.getMaxValue(pass3Array.substring(0, pass3Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass4Array)) {
+                    pass4Inlet = Double.parseDouble(pass4Array.substring(pass4Array.lastIndexOf(",")+1));
+                    pass4Out = this.getMaxValue(pass4Array.substring(0, pass4Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass5Array)) {
+                    pass5Inlet = Double.parseDouble(pass5Array.substring(pass5Array.lastIndexOf(",")+1));
+                    pass5Out = this.getMaxValue(pass5Array.substring(0, pass5Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass6Array)) {
+                    pass6Inlet = Double.parseDouble(pass6Array.substring(pass6Array.lastIndexOf(",")+1));
+                    pass6Out = this.getMaxValue(pass6Array.substring(0, pass6Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass7Array)) {
+                    pass7Inlet = Double.parseDouble(pass7Array.substring(pass7Array.lastIndexOf(",")+1));
+                    pass7Out = this.getMaxValue(pass7Array.substring(0, pass7Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass8Array)) {
+                    pass8Inlet = Double.parseDouble(pass8Array.substring(pass8Array.lastIndexOf(",")+1));
+                    pass8Out = this.getMaxValue(pass8Array.substring(0, pass8Array.indexOf(",")));
+                }
+                DecimalFormat df = new DecimalFormat("#.00");
+                if (pass1Inlet != 0 && pass1Out != 0) { pass1Ratio = Double.parseDouble(df.format(pass1Out / pass1Inlet)); }
+                if (pass2Inlet != 0 && pass2Out != 0) { pass2Ratio = Double.parseDouble(df.format(pass2Out / pass2Inlet)); }
+                if (pass3Inlet != 0 && pass3Out != 0) { pass3Ratio = Double.parseDouble(df.format(pass3Out / pass3Inlet)); }
+                if (pass4Inlet != 0 && pass4Out != 0) { pass4Ratio = Double.parseDouble(df.format(pass4Out / pass4Inlet)); }
+                if (pass5Inlet != 0 && pass5Out != 0) { pass5Ratio = Double.parseDouble(df.format(pass5Out / pass5Inlet)); }
+                if (pass6Inlet != 0 && pass6Out != 0) { pass6Ratio = Double.parseDouble(df.format(pass6Out / pass6Inlet)); }
+                if (pass7Inlet != 0 && pass7Out != 0) { pass7Ratio = Double.parseDouble(df.format(pass7Out / pass7Inlet)); }
+                if (pass8Inlet != 0 && pass8Out != 0) { pass8Ratio = Double.parseDouble(df.format(pass8Out / pass8Inlet)); }
+                Date recordTime = tFurnancePressure.getRecordTime();
+                double ratio = 0;
+                switch (pass) {
+                    case "pass1":
+                        ratio = pass1Ratio;
+                        break;
+                    case "pass2":
+                        ratio = pass2Ratio;
+                        break;
+                    case "pass3":
+                        ratio = pass3Ratio;
+                        break;
+                    case "pass4":
+                        ratio = pass4Ratio;
+                        break;
+                    case "pass5":
+                        ratio = pass5Ratio;
+                        break;
+                    case "pass6":
+                        ratio = pass6Ratio;
+                        break;
+                    case "pass7":
+                        ratio = pass7Ratio;
+                        break;
+                    case "pass8":
+                        ratio = pass8Ratio;
+                        break;
+                    case "passAll":
+                        ratio = this.getMaxDouble(new double[] {pass1Ratio,pass2Ratio,pass3Ratio,pass4Ratio,pass5Ratio,pass6Ratio,pass7Ratio,pass8Ratio});
+                        break;
+                }
+                map.put(recordTime, ratio);
+            }
+            return map;
+        }
+        return null;
+    }
+    private LinkedHashMap<Date, Double> calcAnalysis109B(List<TFurnancePressure> tFurnancePressures, String pass) {
+        LinkedHashMap<Date, Double> map = new LinkedHashMap<>();
+        if (tFurnancePressures != null && tFurnancePressures.size() != 0) {
+            // pass max inlet
+            double pass1Inlet = 0;
+            double pass2Inlet = 0;
+            double pass3Inlet = 0;
+            double pass4Inlet = 0;
+            double pass5Inlet = 0;
+            double pass6Inlet = 0;
+            double pass7Inlet = 0;
+            double pass8Inlet = 0;
+            // pass max outlet
+            double pass1Out = 0;
+            double pass2Out = 0;
+            double pass3Out = 0;
+            double pass4Out = 0;
+            double pass5Out = 0;
+            double pass6Out = 0;
+            double pass7Out = 0;
+            double pass8Out = 0;
+            // pass ratio
+            double pass1Ratio = 0;
+            double pass2Ratio = 0;
+            double pass3Ratio = 0;
+            double pass4Ratio = 0;
+            double pass5Ratio = 0;
+            double pass6Ratio = 0;
+            double pass7Ratio = 0;
+            double pass8Ratio = 0;
+            for (TFurnancePressure tFurnancePressure : tFurnancePressures) {
+                String pass1Array = tFurnancePressure.getPass2();
+                String pass2Array = tFurnancePressure.getPass4();
+                String pass3Array = tFurnancePressure.getPass6();
+                String pass4Array = tFurnancePressure.getPass8();
+                String pass5Array = tFurnancePressure.getPass10();
+                String pass6Array = tFurnancePressure.getPass12();
+                String pass7Array = tFurnancePressure.getPass14();
+                String pass8Array = tFurnancePressure.getPass16();
+                if (StringUtils.isNotEmpty(pass1Array)) {
+                    pass1Inlet = Double.parseDouble(pass1Array.substring(pass1Array.lastIndexOf(",")+1));
+                    pass1Out = this.getMaxValue(pass1Array.substring(0, pass1Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass2Array)) {
+                    pass2Inlet = Double.parseDouble(pass2Array.substring(pass2Array.lastIndexOf(",")+1));
+                    pass2Out = this.getMaxValue(pass2Array.substring(0, pass2Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass3Array)) {
+                    pass3Inlet = Double.parseDouble(pass3Array.substring(pass3Array.lastIndexOf(",")+1));
+                    pass3Out = this.getMaxValue(pass3Array.substring(0, pass3Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass4Array)) {
+                    pass4Inlet = Double.parseDouble(pass4Array.substring(pass4Array.lastIndexOf(",")+1));
+                    pass4Out = this.getMaxValue(pass4Array.substring(0, pass4Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass5Array)) {
+                    pass5Inlet = Double.parseDouble(pass5Array.substring(pass5Array.lastIndexOf(",")+1));
+                    pass5Out = this.getMaxValue(pass5Array.substring(0, pass5Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass6Array)) {
+                    pass6Inlet = Double.parseDouble(pass6Array.substring(pass6Array.lastIndexOf(",")+1));
+                    pass6Out = this.getMaxValue(pass6Array.substring(0, pass6Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass7Array)) {
+                    pass7Inlet = Double.parseDouble(pass7Array.substring(pass7Array.lastIndexOf(",")+1));
+                    pass7Out = this.getMaxValue(pass7Array.substring(0, pass7Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass8Array)) {
+                    pass8Inlet = Double.parseDouble(pass8Array.substring(pass8Array.lastIndexOf(",")+1));
+                    pass8Out = this.getMaxValue(pass8Array.substring(0, pass8Array.indexOf(",")));
+                }
+                DecimalFormat df = new DecimalFormat("#.00");
+                if (pass1Inlet != 0 && pass1Out != 0) { pass1Ratio = Double.parseDouble(df.format(pass1Out / pass1Inlet)); }
+                if (pass2Inlet != 0 && pass2Out != 0) { pass2Ratio = Double.parseDouble(df.format(pass2Out / pass2Inlet)); }
+                if (pass3Inlet != 0 && pass3Out != 0) { pass3Ratio = Double.parseDouble(df.format(pass3Out / pass3Inlet)); }
+                if (pass4Inlet != 0 && pass4Out != 0) { pass4Ratio = Double.parseDouble(df.format(pass4Out / pass4Inlet)); }
+                if (pass5Inlet != 0 && pass5Out != 0) { pass5Ratio = Double.parseDouble(df.format(pass5Out / pass5Inlet)); }
+                if (pass6Inlet != 0 && pass6Out != 0) { pass6Ratio = Double.parseDouble(df.format(pass6Out / pass6Inlet)); }
+                if (pass7Inlet != 0 && pass7Out != 0) { pass7Ratio = Double.parseDouble(df.format(pass7Out / pass7Inlet)); }
+                if (pass8Inlet != 0 && pass8Out != 0) { pass8Ratio = Double.parseDouble(df.format(pass8Out / pass8Inlet)); }
+                Date recordTime = tFurnancePressure.getRecordTime();
+                double ratio = 0;
+                switch (pass) {
+                    case "pass1":
+                        ratio = pass1Ratio;
+                        break;
+                    case "pass2":
+                        ratio = pass2Ratio;
+                        break;
+                    case "pass3":
+                        ratio = pass3Ratio;
+                        break;
+                    case "pass4":
+                        ratio = pass4Ratio;
+                        break;
+                    case "pass5":
+                        ratio = pass5Ratio;
+                        break;
+                    case "pass6":
+                        ratio = pass6Ratio;
+                        break;
+                    case "pass7":
+                        ratio = pass7Ratio;
+                        break;
+                    case "pass8":
+                        ratio = pass8Ratio;
+                        break;
+                    case "passAll":
+                        ratio = this.getMaxDouble(new double[] {pass1Ratio,pass2Ratio,pass3Ratio,pass4Ratio,pass5Ratio,pass6Ratio,pass7Ratio,pass8Ratio});
+                        break;
+                }
+                map.put(recordTime, ratio);
+            }
+            return map;
+        }
+        return null;
+    }
+    private LinkedHashMap<Date, Double> calcAnalysis130(List<TFurnancePressure> tFurnancePressures, String pass) {
+        LinkedHashMap<Date, Double> map = new LinkedHashMap<>();
+        if (tFurnancePressures != null && tFurnancePressures.size() != 0) {
+            // pass max inlet
+            double pass1Inlet = 0;
+            double pass2Inlet = 0;
+            double pass3Inlet = 0;
+            double pass4Inlet = 0;
+            // pass max outlet
+            double pass1Out = 0;
+            double pass2Out = 0;
+            double pass3Out = 0;
+            double pass4Out = 0;
+            // pass ratio
+            double pass1Ratio = 0;
+            double pass2Ratio = 0;
+            double pass3Ratio = 0;
+            double pass4Ratio = 0;
+            for (TFurnancePressure tFurnancePressure : tFurnancePressures) {
+                String pass1Array = tFurnancePressure.getPass1();
+                String pass2Array = tFurnancePressure.getPass2();
+                String pass3Array = tFurnancePressure.getPass3();
+                String pass4Array = tFurnancePressure.getPass4();
+                if (StringUtils.isNotEmpty(pass1Array)) {
+                    pass1Inlet = Double.parseDouble(pass1Array.substring(pass1Array.lastIndexOf(",")+1));
+                    pass1Out = this.getMaxValue(pass1Array.substring(0, pass1Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass2Array)) {
+                    pass2Inlet = Double.parseDouble(pass2Array.substring(pass2Array.lastIndexOf(",")+1));
+                    pass2Out = this.getMaxValue(pass2Array.substring(0, pass2Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass3Array)) {
+                    pass3Inlet = Double.parseDouble(pass3Array.substring(pass3Array.lastIndexOf(",")+1));
+                    pass3Out = this.getMaxValue(pass3Array.substring(0, pass3Array.indexOf(",")));
+                }
+                if (StringUtils.isNotEmpty(pass4Array)) {
+                    pass4Inlet = Double.parseDouble(pass4Array.substring(pass4Array.lastIndexOf(",")+1));
+                    pass4Out = this.getMaxValue(pass4Array.substring(0, pass4Array.indexOf(",")));
+                }
+                DecimalFormat df = new DecimalFormat("#.00");
+                if (pass1Inlet != 0 && pass1Out != 0) { pass1Ratio = Double.parseDouble(df.format(pass1Out / pass1Inlet)); }
+                if (pass2Inlet != 0 && pass2Out != 0) { pass2Ratio = Double.parseDouble(df.format(pass2Out / pass2Inlet)); }
+                if (pass3Inlet != 0 && pass3Out != 0) { pass3Ratio = Double.parseDouble(df.format(pass3Out / pass3Inlet)); }
+                if (pass4Inlet != 0 && pass4Out != 0) { pass4Ratio = Double.parseDouble(df.format(pass4Out / pass4Inlet)); }
+                Date recordTime = tFurnancePressure.getRecordTime();
+                double ratio = 0;
+                switch (pass) {
+                    case "pass1":
+                        ratio = pass1Ratio;
+                        break;
+                    case "pass2":
+                        ratio = pass2Ratio;
+                        break;
+                    case "pass3":
+                        ratio = pass3Ratio;
+                        break;
+                    case "pass4":
+                        ratio = pass4Ratio;
+                        break;
+                    case "passAll":
+                        ratio = this.getMaxDouble(new double[] {pass1Ratio,pass2Ratio,pass3Ratio,pass4Ratio});
+                        break;
+                }
+                map.put(recordTime, ratio);
+            }
+            return map;
+        }
+        return null;
+    }
+
     /**
      * 获取裂解炉炉管测压详细信息
      */
-    @PostMapping("/getInfoByDate")
-    public AjaxResult getInfoByDate(@RequestBody TFurnancePressure tFurnancePressure) throws ParseException {
+    @PostMapping("/info")
+    public AjaxResult getPressureInfo(@RequestBody TFurnancePressure tFurnancePressure) throws ParseException {
         String furnanceName = tFurnancePressure.getFurnanceName();
         Date recordTime = tFurnancePressure.getRecordTime();
         if ("".equals(furnanceName) || recordTime == null) {

+ 2 - 3
master/src/main/java/com/ruoyi/project/production/controller/TFurnanceTemperatureController.java

@@ -8,7 +8,6 @@ import java.util.List;
 
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.project.production.controller.vo.FurnanceTemperatureVO;
-import com.ruoyi.project.production.domain.TFurnancePressure;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -44,8 +43,8 @@ public class TFurnanceTemperatureController extends BaseController
     /**
      * 获取裂解炉炉管测温详细信息
      */
-    @PostMapping("/getInfoByDate")
-    public AjaxResult getInfoByDate(@RequestBody TFurnanceTemperature tFurnanceTemperature) throws ParseException {
+    @PostMapping("/info")
+    public AjaxResult getTemperatureInfo(@RequestBody TFurnanceTemperature tFurnanceTemperature) throws ParseException {
         String furnanceName = tFurnanceTemperature.getFurnanceName();
         Date recordTime = tFurnanceTemperature.getRecordTime();
         if ("".equals(furnanceName) || recordTime == null) {

+ 46 - 0
master/src/main/java/com/ruoyi/project/production/controller/vo/FvpAnalysisQueryVO.java

@@ -0,0 +1,46 @@
+package com.ruoyi.project.production.controller.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.web.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * @author Wang Zi Wen
+ * @email wangggziwen@163.com
+ * @date 2024/05/31 09:21:07
+ */
+public class FvpAnalysisQueryVO extends BaseEntity {
+
+    private String pass;
+
+    private String furnanceName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    private Date recordTime;
+
+    public String getPass() {
+        return pass;
+    }
+
+    public void setPass(String pass) {
+        this.pass = pass;
+    }
+
+    public String getFurnanceName() {
+        return furnanceName;
+    }
+
+    public void setFurnanceName(String furnanceName) {
+        this.furnanceName = furnanceName;
+    }
+
+    public Date getRecordTime() {
+        return recordTime;
+    }
+
+    public void setRecordTime(Date recordTime) {
+        this.recordTime = recordTime;
+    }
+
+}

+ 22 - 0
master/src/main/java/com/ruoyi/project/production/domain/TFurnancePressure.java

@@ -113,6 +113,28 @@ public class TFurnancePressure extends BaseEntity
     /** 记录人userId */
     private Long recorder;
 
+    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    private Date startDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    private Date endDate;
+
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
     public Long getRecorder() {
         return recorder;
     }

+ 2 - 0
master/src/main/java/com/ruoyi/project/production/mapper/TFurnancePressureMapper.java

@@ -12,6 +12,8 @@ import com.ruoyi.project.production.domain.TFurnancePressure;
  */
 public interface TFurnancePressureMapper 
 {
+    public List<TFurnancePressure> selectTFurnancePressureAnalysis(TFurnancePressure tFurnancePressure);
+
     /**
      * 查询裂解炉炉管测压
      * 

+ 15 - 0
master/src/main/resources/mybatis/production/TFurnancePressureMapper.xml

@@ -34,6 +34,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="team"    column="team"    />
         <result property="photoUrl"    column="photo_url"    />
         <result property="recorder"    column="recorder"    />
+        <result property="startDate"    column="start_date"    />
+        <result property="endDate"    column="end_date"    />
     </resultMap>
 
     <sql id="selectTFurnancePressureVo">
@@ -77,6 +79,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by record_time asc
     </select>
 
+    <select id="selectTFurnancePressureAnalysis" parameterType="TFurnancePressure" resultMap="TFurnancePressureResult">
+        <include refid="selectTFurnancePressureVo"/>
+        <where>
+            and furnance_name = #{furnanceName}
+            and RECORD_TIME &gt;= #{startDate}
+            and RECORD_TIME &lt; #{endDate}
+            and d.del_flag = 0
+        </where>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+        order by record_time asc
+    </select>
+
     <select id="selectTFurnancePressureByDate" parameterType="TFurnancePressure" resultMap="TFurnancePressureResult">
         <include refid="selectTFurnancePressureVo"/>
         <where>

+ 10 - 1
ui/src/api/production/pressure.js

@@ -1,9 +1,18 @@
 import request from '@/utils/request'
 
+// 获取裂解炉炉管测压fvp分析数据
+export function getFvpAnalysis(data) {
+  return request({
+    url: '/production/pressure/getFvpAnalysis',
+    method: 'post',
+    data: data
+  })
+}
+
 // 获取裂解炉炉管测压详细信息
 export function getInfoByDate(data) {
   return request({
-    url: '/production/pressure/getInfoByDate',
+    url: '/production/pressure/info',
     method: 'post',
     data: data
   })

+ 1 - 1
ui/src/api/production/temperature.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 获取裂解炉炉管测温详细信息
 export function getInfoByDate(data) {
   return request({
-    url: '/production/temperature/getInfoByDate',
+    url: '/production/temperature/info',
     method: 'post',
     data: data
   })

+ 106 - 19
ui/src/views/production/pressure/fvp.vue

@@ -22,8 +22,8 @@
         <el-table-column label="OUT" align="center" prop="pass1Out" :show-overflow-tooltip="true"></el-table-column>
         <el-table-column label="RATIO" align="center" prop="pass1Ratio" :show-overflow-tooltip="true">
           <template slot-scope="scope">
-            <span v-if="scope.row.pass1Ratio>0.9" style="color:red;">{{scope.row.pass1Ratio}}</span>
-            <span v-if="scope.row.pass1Ratio<=0.9">{{scope.row.pass1Ratio}}</span>
+            <span @click="handleClick('pass1', scope.row) "v-if="scope.row.pass1Ratio>0.9" style="color:red;">{{scope.row.pass1Ratio}}</span>
+            <span @click="handleClick('pass1', scope.row) "v-if="scope.row.pass1Ratio<=0.9">{{scope.row.pass1Ratio}}</span>
           </template>
         </el-table-column>
       </el-table-column>
@@ -32,8 +32,8 @@
         <el-table-column label="OUT" align="center" prop="pass2Out" :show-overflow-tooltip="true"></el-table-column>
         <el-table-column label="RATIO" align="center" prop="pass2Ratio" :show-overflow-tooltip="true">
           <template slot-scope="scope">
-            <span v-if="scope.row.pass2Ratio>0.9" style="color:red;">{{scope.row.pass2Ratio}}</span>
-            <span v-if="scope.row.pass2Ratio<=0.9">{{scope.row.pass2Ratio}}</span>
+            <span @click="handleClick('pass2', scope.row)" v-if="scope.row.pass2Ratio>0.9" style="color:red;">{{scope.row.pass2Ratio}}</span>
+            <span @click="handleClick('pass2', scope.row)" v-if="scope.row.pass2Ratio<=0.9">{{scope.row.pass2Ratio}}</span>
           </template>
         </el-table-column>
       </el-table-column>
@@ -42,8 +42,8 @@
         <el-table-column label="OUT" align="center" prop="pass3Out" :show-overflow-tooltip="true"></el-table-column>
         <el-table-column label="RATIO" align="center" prop="pass3Ratio" :show-overflow-tooltip="true">
           <template slot-scope="scope">
-            <span v-if="scope.row.pass3Ratio>0.9" style="color:red;">{{scope.row.pass3Ratio}}</span>
-            <span v-if="scope.row.pass3Ratio<=0.9">{{scope.row.pass3Ratio}}</span>
+            <span @click="handleClick('pass3', scope.row)" v-if="scope.row.pass3Ratio>0.9" style="color:red;">{{scope.row.pass3Ratio}}</span>
+            <span @click="handleClick('pass3', scope.row)" v-if="scope.row.pass3Ratio<=0.9">{{scope.row.pass3Ratio}}</span>
           </template>
         </el-table-column>
       </el-table-column>
@@ -52,8 +52,8 @@
         <el-table-column label="OUT" align="center" prop="pass4Out" :show-overflow-tooltip="true"></el-table-column>
         <el-table-column label="RATIO" align="center" prop="pass4Ratio" :show-overflow-tooltip="true">
           <template slot-scope="scope">
-            <span v-if="scope.row.pass4Ratio>0.9" style="color:red;">{{scope.row.pass4Ratio}}</span>
-            <span v-if="scope.row.pass4Ratio<=0.9">{{scope.row.pass4Ratio}}</span>
+            <span @click="handleClick('pass4', scope.row)" v-if="scope.row.pass4Ratio>0.9" style="color:red;">{{scope.row.pass4Ratio}}</span>
+            <span @click="handleClick('pass4', scope.row)" v-if="scope.row.pass4Ratio<=0.9">{{scope.row.pass4Ratio}}</span>
           </template>
         </el-table-column>
       </el-table-column>
@@ -62,8 +62,8 @@
         <el-table-column label="OUT" align="center" prop="pass5Out" :show-overflow-tooltip="true"></el-table-column>
         <el-table-column label="RATIO" align="center" prop="pass5Ratio" :show-overflow-tooltip="true">
           <template slot-scope="scope">
-            <span v-if="scope.row.pass5Ratio>0.9" style="color:red;">{{scope.row.pass5Ratio}}</span>
-            <span v-if="scope.row.pass5Ratio<=0.9">{{scope.row.pass5Ratio}}</span>
+            <span @click="handleClick('pass5', scope.row)" v-if="scope.row.pass5Ratio>0.9" style="color:red;">{{scope.row.pass5Ratio}}</span>
+            <span @click="handleClick('pass5', scope.row)" v-if="scope.row.pass5Ratio<=0.9">{{scope.row.pass5Ratio}}</span>
           </template>
         </el-table-column>
       </el-table-column>
@@ -72,8 +72,8 @@
         <el-table-column label="OUT" align="center" prop="pass6Out" :show-overflow-tooltip="true"></el-table-column>
         <el-table-column label="RATIO" align="center" prop="pass6Ratio" :show-overflow-tooltip="true">
           <template slot-scope="scope">
-            <span v-if="scope.row.pass6Ratio>0.9" style="color:red;">{{scope.row.pass6Ratio}}</span>
-            <span v-if="scope.row.pass6Ratio<=0.9">{{scope.row.pass6Ratio}}</span>
+            <span @click="handleClick('pass6', scope.row)" v-if="scope.row.pass6Ratio>0.9" style="color:red;">{{scope.row.pass6Ratio}}</span>
+            <span @click="handleClick('pass6', scope.row)" v-if="scope.row.pass6Ratio<=0.9">{{scope.row.pass6Ratio}}</span>
           </template>
         </el-table-column>
       </el-table-column>
@@ -82,8 +82,8 @@
         <el-table-column label="OUT" align="center" prop="pass7Out" :show-overflow-tooltip="true"></el-table-column>
         <el-table-column label="RATIO" align="center" prop="pass7Ratio" :show-overflow-tooltip="true">
           <template slot-scope="scope">
-            <span v-if="scope.row.pass7Ratio>0.9" style="color:red;">{{scope.row.pass7Ratio}}</span>
-            <span v-if="scope.row.pass7Ratio<=0.9">{{scope.row.pass7Ratio}}</span>
+            <span @click="handleClick('pass7', scope.row)" v-if="scope.row.pass7Ratio>0.9" style="color:red;">{{scope.row.pass7Ratio}}</span>
+            <span @click="handleClick('pass7', scope.row)" v-if="scope.row.pass7Ratio<=0.9">{{scope.row.pass7Ratio}}</span>
           </template>
         </el-table-column>
       </el-table-column>
@@ -92,8 +92,8 @@
         <el-table-column label="OUT" align="center" prop="pass8Out" :show-overflow-tooltip="true"></el-table-column>
         <el-table-column label="RATIO" align="center" prop="pass8Ratio" :show-overflow-tooltip="true">
           <template slot-scope="scope">
-            <span v-if="scope.row.pass8Ratio>0.9" style="color:red;">{{scope.row.pass8Ratio}}</span>
-            <span v-if="scope.row.pass8Ratio<=0.9">{{scope.row.pass8Ratio}}</span>
+            <span @click="handleClick('pass8', scope.row)" v-if="scope.row.pass8Ratio>0.9" style="color:red;">{{scope.row.pass8Ratio}}</span>
+            <span @click="handleClick('pass8', scope.row)" v-if="scope.row.pass8Ratio<=0.9">{{scope.row.pass8Ratio}}</span>
           </template>
         </el-table-column>
       </el-table-column>
@@ -102,27 +102,50 @@
         <el-table-column label="MAX OUT" align="center" prop="allPassMaxOut" :show-overflow-tooltip="true"></el-table-column>
         <el-table-column label="MAX RATIO" align="center" prop="allPassMaxRatio" :show-overflow-tooltip="true">
           <template slot-scope="scope">
-            <span v-if="scope.row.allPassMaxRatio>0.9" style="color:red;">{{scope.row.allPassMaxRatio}}</span>
-            <span v-if="scope.row.allPassMaxRatio<=0.9">{{scope.row.allPassMaxRatio}}</span>
+            <span @click="handleClick('passAll', scope.row)" v-if="scope.row.allPassMaxRatio>0.9" style="color:red;">{{scope.row.allPassMaxRatio}}</span>
+            <span @click="handleClick('passAll', scope.row)" v-if="scope.row.allPassMaxRatio<=0.9">{{scope.row.allPassMaxRatio}}</span>
           </template>
         </el-table-column>
       </el-table-column>
     </el-table>
+    <!-- 趋势分析对话框 -->
+    <el-dialog :title="analysis.title" :visible.sync="analysis.open" width="1000px" append-to-body @close="disposeChart">
+      <div id="chart" :style="{width:width,height:height}"></div>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="cancelAnalysis">确 定</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-  import { listFvp } from "@/api/production/pressure";
+  import { listFvp, getFvpAnalysis } from "@/api/production/pressure";
   import { treeselect } from "@/api/system/dept";
   import { getToken } from "@/utils/auth";
   import Treeselect from "@riophae/vue-treeselect";
   import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 
   export default {
+    props: {
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '400px'
+      },
+    },
     name: "Pressure",
     components: { Treeselect },
     data() {
       return {
+        chart: null,
+        // 趋势分析参数
+        analysis: {
+          open: false,
+          title: "",
+        },
         // 遮罩层
         loading: true,
         // 选中数组
@@ -225,6 +248,67 @@
       init() {
         this.getList();
       },
+      handleClick(pass, row) {
+        let passName = "";
+        switch (pass) {
+          case "pass1": passName = "PASS 1"; break;
+          case "pass2": passName = "PASS 2"; break;
+          case "pass3": passName = "PASS 3"; break;
+          case "pass4": passName = "PASS 4"; break;
+          case "pass5": passName = "PASS 5"; break;
+          case "pass6": passName = "PASS 6"; break;
+          case "pass7": passName = "PASS 7"; break;
+          case "pass8": passName = "PASS 8"; break;
+          case "passAll": passName = "ALL PASS"; break;
+        }
+        this.analysis.open = true;
+        this.analysis.title = row.furnanceName + " " + passName + " RATIO 趋势分析";
+        getFvpAnalysis({
+          "pass": pass,
+          "furnanceName": row.furnanceName,
+          "recordTime": this.queryParams.recordTime,
+        }).then(response => {
+          let dateList = [];
+          let dataList = [];
+          for (let key in response.data) {
+            let date = new Date(key);
+            let year = date.getFullYear();
+            let month = ('0' + (date.getMonth() + 1)).slice(-2);
+            let day = ('0' + date.getDate()).slice(-2);
+            let hours = ('0' + date.getHours()).slice(-2);
+            let minutes = ('0' + date.getMinutes()).slice(-2);
+            let seconds = ('0' + date.getSeconds()).slice(-2);
+            dateList.push(year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds);
+            dataList.push(response.data[key]);
+          }
+          let option = {
+            tooltip: {
+              trigger: 'axis'
+            },
+            xAxis: {
+              type: 'category',
+              data: dateList,
+            },
+            yAxis: {
+              type: 'value'
+            },
+            series: [
+              {
+                data: dataList,
+                type: 'line'
+              }
+            ]
+          };
+          this.chart = this.echarts.init(document.getElementById('chart'));
+          this.chart.setOption(option);
+        });
+      },
+      /** 销毁趋势图 */
+      disposeChart() {
+        if(this.chart != null) {
+          this.echarts.dispose(this.chart);
+        }
+      },
       /** 查询裂解炉炉管测压列表 */
       getList() {
         this.loading = true;
@@ -254,6 +338,9 @@
         this.open = false;
         this.reset();
       },
+      cancelAnalysis() {
+        this.analysis.open = false;
+      },
       // 表单重置
       reset() {
         this.form = {