瀏覽代碼

Merge branch 'master' of http://116.63.33.55/git/read_opc

ws 1 年之前
父節點
當前提交
2c1f6905d0
共有 36 個文件被更改,包括 2537 次插入1861 次删除
  1. 21 8
      PrintServer/src/main/java/com/jd/printserver/controller/PrintServerController.java
  2. 116 23
      PrintServer/src/main/java/com/jd/printserver/utils/PrintUtils.java
  3. 96 2
      chuanyi_client/package-lock.json
  4. 1 0
      chuanyi_client/package.json
  5. 0 6
      chuanyi_client/src/App.vue
  6. 2 1
      chuanyi_client/src/api/datasource.js
  7. 1 1
      chuanyi_client/src/background.js
  8. 314 388
      chuanyi_client/src/components/CustomDialog/DataSourceItem.vue
  9. 227 711
      chuanyi_client/src/components/HeaderMain/index.vue
  10. 594 0
      chuanyi_client/src/components/HeaderMain/itemChooseTree.vue
  11. 3 0
      chuanyi_client/src/main.js
  12. 36 2
      chuanyi_client/src/utils/cqcy.js
  13. 0 5
      chuanyi_client/src/utils/request.js
  14. 686 0
      chuanyi_client/src/views/group_item/index copy.vue
  15. 77 140
      chuanyi_client/src/views/group_item/index.vue
  16. 49 5
      chuanyi_client/src/views/my_report/index.vue
  17. 112 244
      chuanyi_client/src/views/print_config/index.vue
  18. 9 4
      chuanyi_client/src/views/report_template/index.vue
  19. 10 1
      chuanyi_client/src/views/run_config/index.vue
  20. 161 3
      chuanyi_client/src/views/run_config/showReport.vue
  21. 0 148
      cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/task/Test.java
  22. 0 151
      cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/task/TestUtil.java
  23. 0 4
      cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/util/OpcDaUtil.java
  24. 3 0
      cqcy-ei/cqcy-ei-da/src/main/resources/application.yml
  25. 1 1
      cqcy-ei/cqcy-ei-da/src/main/resources/static/app/index.html
  26. 0 0
      cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/js/index.fcb95d98.js
  27. 0 0
      cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/js/pages-login-index.65f24270.js
  28. 0 0
      cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/js/pages-reportForm-index.229acf35.js
  29. 0 0
      cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/js/pages-reportForm-index.b2b67ea5.js
  30. 2 1
      cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/webview/bar-wv.html
  31. 2 2
      cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/webview/dataItem-wv.html
  32. 2 1
      cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/webview/line-wv.html
  33. 6 5
      reado-app/pages/reportForm/data-item.vue
  34. 2 1
      reado-app/static/webview/bar-wv.html
  35. 2 2
      reado-app/static/webview/dataItem-wv.html
  36. 2 1
      reado-app/static/webview/line-wv.html

+ 21 - 8
PrintServer/src/main/java/com/jd/printserver/controller/PrintServerController.java

@@ -24,7 +24,6 @@ import javax.print.attribute.Attribute;
 import javax.print.attribute.PrintServiceAttributeSet;
 import javax.print.attribute.standard.PrinterIsAcceptingJobs;
 import javax.servlet.http.HttpServletRequest;
-import java.awt.print.PrinterJob;
 import java.io.File;
 import java.io.IOException;
 import java.util.*;
@@ -107,12 +106,26 @@ public class PrintServerController extends BaseController {
     @RequestMapping(value = "/getPrintName")
     @CrossOrigin
     public AjaxResult getPrintName(){
-        List<String> list = new ArrayList<>();
-        for (PrintService ps : PrinterJob.lookupPrintServices()) {
-            String printName = ps.toString();
-            list.add(printName);
-        }
-        return success(list);
+        return success(PrintUtils.getAllPrintState());
+//        List<Map<String,String>> list=new ArrayList<>();
+//        for (PrintService ps : PrinterJob.lookupPrintServices()) {
+//            Map<String,String> map=new HashMap<>();
+//            PrintServiceAttributeSet attributes = ps.getAttributes();
+//            Attribute stateAttr = attributes.get(PrinterState.class);
+//            Attribute reasonAttr = attributes.get(PrinterStateReason.class);
+//
+//            PrinterState printerState = (PrinterState) stateAttr;
+//            PrinterStateReason printerStateReason = (PrinterStateReason) reasonAttr;
+//            map.put("name",ps.getName());
+//
+//            if (printerState == PrinterState.IDLE && printerStateReason == null) {
+//                map.put("state","在线");
+//            } else {
+//                map.put("state","离线");
+//            }
+//            list.add(map);
+//        }
+//        return success(list);
     }
 
     /**
@@ -136,7 +149,7 @@ public class PrintServerController extends BaseController {
             Attribute attr = attributes.get(PrinterIsAcceptingJobs.class);
 
             map = new HashMap<>();
-            map.put("printName", printService.toString());
+            map.put("printName", printService.getName());
             map.put("status", 0);
             // 判断打印机是否接受新的打印任务
             if (attr != null && attr instanceof PrinterIsAcceptingJobs) {

+ 116 - 23
PrintServer/src/main/java/com/jd/printserver/utils/PrintUtils.java

@@ -2,21 +2,22 @@ package com.jd.printserver.utils;
 
 import com.jd.printserver.javafx.entity.PrintParam;
 import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.pdmodel.PDPageContentStream;
-import org.apache.pdfbox.pdmodel.common.PDRectangle;
-import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 import org.apache.pdfbox.printing.PDFPrintable;
 import org.apache.pdfbox.printing.Scaling;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.print.*;
-import javax.print.attribute.*;
-import javax.print.attribute.standard.*;
+import javax.print.PrintService;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.standard.PageRanges;
+import javax.print.attribute.standard.Sides;
 import java.awt.print.*;
 import java.io.*;
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class PrintUtils {
 
@@ -36,11 +37,10 @@ public class PrintUtils {
         PDFprint(outputFilePath, printParam);
 
 
-
     }
 
 
-    public static Boolean PDFprint(String inputImgPath, PrintParam printParam){
+    public static Boolean PDFprint(String inputImgPath, PrintParam printParam) {
 //加载文档模板
         try (PDDocument document = PDDocument.load(new File(inputImgPath))) {
             //单位:像素
@@ -52,7 +52,7 @@ public class PrintUtils {
             int marginBottom = 0;//printParam.mm2px(printParam.getMarginBottom());
             int paperWidth = printParam.mm2px(printParam.getWidth());
             int paperHeight = printParam.mm2px(printParam.getHeight());
-            int printWidth = paperWidth - marginLeft -marginRight;
+            int printWidth = paperWidth - marginLeft - marginRight;
             int printHeight = paperHeight - marginTop - marginBottom;
 //            int pdfPaperWidth = 0;
 //            int pdfPaperHeight = 0;
@@ -158,14 +158,14 @@ public class PrintUtils {
                     try {
                         printJob.setPrintService(printService);
                     } catch (PrinterException e) {
-                        log.error("打印失败,打印机不可用,请检查。打印机名称为 {}",printParam.getPrintName());
+                        log.error("打印失败,打印机不可用,请检查。打印机名称为 {}", printParam.getPrintName());
                         return false;
                     }
                     break;
                 }
             }
-            if(!isChoose){
-                log.error("打印失败,未找到打印机,请检查。打印机名称为 {}",printParam.getPrintName());
+            if (!isChoose) {
+                log.error("打印失败,未找到打印机,请检查。打印机名称为 {}", printParam.getPrintName());
                 return false;
             }
 
@@ -233,13 +233,13 @@ public class PrintUtils {
 
             //页码范围类型 1 全部 2 部分页码
             int pageRange = printParam.getPageRange();
-            if(pageRange == 2){
+            if (pageRange == 2) {
                 //打印页数
                 //打印第1~2页
-                if(printParam.getPageRangeEnd() > printParam.getPageRangeStart()){
+                if (printParam.getPageRangeEnd() > printParam.getPageRangeStart()) {
                     //打印开始到结束页
-                    pars.add(new PageRanges(printParam.getPageRangeStart(),printParam.getPageRangeEnd()));
-                }else{
+                    pars.add(new PageRanges(printParam.getPageRangeStart(), printParam.getPageRangeEnd()));
+                } else {
                     //打印一页
                     pars.add(new PageRanges(printParam.getPageRangeStart()));
                 }
@@ -259,24 +259,117 @@ public class PrintUtils {
         }
     }
 
-    public static float getMinScale(int printWidth, int printHeight, int imageWidth, int imageHeight){
+    public static float getMinScale(int printWidth, int printHeight, int imageWidth, int imageHeight) {
         float scale;
         float wScale = 1f;
-        if(printWidth < imageWidth){
+        if (printWidth < imageWidth) {
 
             wScale = BigDecimal.valueOf(printWidth)
-                    .divide(BigDecimal.valueOf(imageWidth),4, BigDecimal.ROUND_DOWN).floatValue();
+                    .divide(BigDecimal.valueOf(imageWidth), 4, BigDecimal.ROUND_DOWN).floatValue();
         }
         float hScale = 1f;
-        if(printHeight < imageHeight){
+        if (printHeight < imageHeight) {
             hScale = BigDecimal.valueOf(printHeight)
                     .divide(BigDecimal.valueOf(imageHeight), 4, BigDecimal.ROUND_DOWN).floatValue();
         }
-        if(wScale < hScale){
+        if (wScale < hScale) {
             scale = wScale;
-        }else{
+        } else {
             scale = hScale;
         }
         return scale;
     }
+
+    /**
+     * 获取本机打印机和所有的状态
+     *
+     * @return
+     */
+    public static List<Map<String, String>> getAllPrintState() {
+        List<Map<String, String>> list = new ArrayList<>();
+        try {
+            // 调用CMD命令
+            ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "wmic printer get name,ExtendedPrinterStatus, PrinterStatus"); // /c参数表示执行后关闭CMD窗口
+            processBuilder.redirectErrorStream(true); // 将错误输出流与标准输出流合并
+            Process process = processBuilder.start();
+            // 获取命令输出结果
+            InputStream inputStream = process.getInputStream();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 设置编码为GBK
+            String line;
+
+            while ((line = reader.readLine()) != null) {
+                String trim = line.trim();
+                String s = trim.replaceAll("\\s+", " ");
+                if (!s.isEmpty() && s.charAt(0) != 'E') { // 从第二行开始(第一行始终以'E'开头)
+                    String ePrinterStatus = s.substring(0, 1);
+                    String printerName = s.substring(2, s.length() - 2);
+                    String printerStatus = s.substring(s.length() - 1);
+                    if (printerStatus.equals("1") || printerStatus.equals("2")) {
+                        Map<String, String> map = new HashMap<>();
+                        map.put("name", printerName);
+                        map.put("state", getPrintCode(ePrinterStatus));
+                        list.add(map);
+                    } else if (ePrinterStatus.equals("1") || ePrinterStatus.equals("2")) {
+                        Map<String, String> map = new HashMap<>();
+                        map.put("name", printerName);
+                        map.put("state", getPrintCode(printerStatus));
+                        list.add(map);
+                    }
+                }
+            }
+            // 等待命令执行完成
+            process.waitFor();
+        } catch (IOException | InterruptedException e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 通过打印机状态码,转换为打印机中文状态
+     *
+     * @param statusCode
+     * @return
+     */
+    public static String getPrintCode(String statusCode) {
+        switch (statusCode) {
+            case "1":
+                return "其它Other";
+            case "2":
+                return "未知Unknown";
+            case "3":
+                return "就绪Idle";
+            case "4":
+                return "打印中Printing";
+            case "5":
+                return "热身Warming Up";
+            case "6":
+                return "停止打印Stopped Printing";
+            case "7":
+                return "脱机Offline";
+            case "8":
+                return "暂停Paused";
+            case "9":
+                return "错误Error";
+            case "10":
+                return "忙碌Busy";
+            case "11":
+                return "不可用Not Available";
+            case "12":
+                return "等待Waiting";
+            case "13":
+                return "加工Processing";
+            case "14":
+                return "初始化Initialization";
+            case "15":
+                return "节能Power Save";
+            case "16":
+                return "待删除Pending Deletion";
+            case "17":
+                return "I/O激活I/O Active";
+            case "18":
+                return "手动进纸Manual Feed";
+        }
+        throw new RuntimeException("没有此种打印机状态");
+    }
 }

+ 96 - 2
chuanyi_client/package-lock.json

@@ -1,14 +1,15 @@
 {
   "name": "Ei",
-  "version": "1.0.5",
+  "version": "1.0.0",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "Ei",
-      "version": "1.0.5",
+      "version": "1.0.0",
       "hasInstallScript": true,
       "dependencies": {
+        "@femessage/element-ui": "^2.22.0",
         "axios": "^0.27.2",
         "core-js": "^3.26.1",
         "cron-parser": "^4.7.1",
@@ -512,6 +513,28 @@
         "lodash.uniq": "^4.5.0"
       }
     },
+    "node_modules/@femessage/element-ui": {
+      "version": "2.22.0",
+      "resolved": "https://registry.npmmirror.com/@femessage/element-ui/-/element-ui-2.22.0.tgz",
+      "integrity": "sha512-+xzm5af44TCIfvyPBSk2BpZ9yFDlZkJm5TWT83U3vZZ52z0pET4TcesDEKsAjcu2TbRL6VX/1UbjSHUJQU8URQ==",
+      "dependencies": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "classnames": "^2.2.6",
+        "deepmerge": "^1.2.0",
+        "lodash.isequal": "^4.5.0",
+        "normalize-wheel": "^1.0.1",
+        "omit.js": "^1.0.2",
+        "raf": "^3.4.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "shallowequal": "^1.1.0",
+        "throttle-debounce": "^1.0.1",
+        "vue-virtual-scroll-list": "^2.3.1"
+      },
+      "peerDependencies": {
+        "vue": "^2.5.17"
+      }
+    },
     "node_modules/@gar/promisify": {
       "version": "1.1.3",
       "resolved": "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz",
@@ -4038,6 +4061,11 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/classnames": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz",
+      "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+    },
     "node_modules/clean-css": {
       "version": "5.3.1",
       "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.1.tgz",
@@ -10363,6 +10391,14 @@
       "resolved": "https://registry.npmmirror.com/omggif/-/omggif-1.0.10.tgz",
       "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
     },
+    "node_modules/omit.js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/omit.js/-/omit.js-1.0.2.tgz",
+      "integrity": "sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==",
+      "dependencies": {
+        "babel-runtime": "^6.23.0"
+      }
+    },
     "node_modules/on-finished": {
       "version": "2.4.1",
       "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
@@ -11986,6 +12022,14 @@
       "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
     },
+    "node_modules/raf": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz",
+      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+      "dependencies": {
+        "performance-now": "^2.1.0"
+      }
+    },
     "node_modules/randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
@@ -12914,6 +12958,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/shallowequal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz",
+      "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+    },
     "node_modules/shebang-command": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -18133,6 +18182,25 @@
         "lodash.uniq": "^4.5.0"
       }
     },
+    "@femessage/element-ui": {
+      "version": "2.22.0",
+      "resolved": "https://registry.npmmirror.com/@femessage/element-ui/-/element-ui-2.22.0.tgz",
+      "integrity": "sha512-+xzm5af44TCIfvyPBSk2BpZ9yFDlZkJm5TWT83U3vZZ52z0pET4TcesDEKsAjcu2TbRL6VX/1UbjSHUJQU8URQ==",
+      "requires": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "classnames": "^2.2.6",
+        "deepmerge": "^1.2.0",
+        "lodash.isequal": "^4.5.0",
+        "normalize-wheel": "^1.0.1",
+        "omit.js": "^1.0.2",
+        "raf": "^3.4.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "shallowequal": "^1.1.0",
+        "throttle-debounce": "^1.0.1",
+        "vue-virtual-scroll-list": "^2.3.1"
+      }
+    },
     "@gar/promisify": {
       "version": "1.1.3",
       "resolved": "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz",
@@ -21100,6 +21168,11 @@
         }
       }
     },
+    "classnames": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz",
+      "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+    },
     "clean-css": {
       "version": "5.3.1",
       "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.1.tgz",
@@ -26235,6 +26308,14 @@
       "resolved": "https://registry.npmmirror.com/omggif/-/omggif-1.0.10.tgz",
       "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
     },
+    "omit.js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/omit.js/-/omit.js-1.0.2.tgz",
+      "integrity": "sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==",
+      "requires": {
+        "babel-runtime": "^6.23.0"
+      }
+    },
     "on-finished": {
       "version": "2.4.1",
       "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
@@ -27480,6 +27561,14 @@
       "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
     },
+    "raf": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz",
+      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+      "requires": {
+        "performance-now": "^2.1.0"
+      }
+    },
     "randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
@@ -28238,6 +28327,11 @@
         "kind-of": "^6.0.2"
       }
     },
+    "shallowequal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz",
+      "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+    },
     "shebang-command": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz",

+ 1 - 0
chuanyi_client/package.json

@@ -13,6 +13,7 @@
   },
   "main": "background.js",
   "dependencies": {
+    "@femessage/element-ui": "^2.22.0",
     "axios": "^0.27.2",
     "core-js": "^3.26.1",
     "cron-parser": "^4.7.1",

+ 0 - 6
chuanyi_client/src/App.vue

@@ -97,7 +97,6 @@ export default {
   },
   methods: {
     initWebSocket() {
-      console.log('webSocket');
       let _this = this
       if (typeof (WebSocket) === 'undefined') {
         showAlertWin(_this, null, '您使用的环境暂不支持socket服务!')
@@ -123,12 +122,10 @@ export default {
       }
     },
     webSocketOpen(e) {
-      console.log('open', e)
       let _this = this
       let count = 0
       const interval = setInterval(() => {
         count++
-        // console.log('count', count)
         if (_this.webSocket && _this.webSocket.readyState === 1) {
           _this.webSocket.send(getToken())
         } else {
@@ -137,13 +134,10 @@ export default {
       }, 5 * 1000)
     },
     webSocketError(e) {
-      console.log('error', e)
     },
     webSocketMessage(e) {
-      console.log('message', e)
     },
     webSocketClose(e) {
-      console.log('close', e)
       this.webSocket.close()
       this.webSocket = null
     }

+ 2 - 1
chuanyi_client/src/api/datasource.js

@@ -970,13 +970,14 @@ export function stopAutoPrintById(reportTableId) {
 
 export function getDriverItemBySouceId(id) {
     return request({
-        url: '/dataSource/getDriverItemBySouceId?id='+id,
+        url: '/dataSource/getDriverItemBySouceId?id=' + id,
         method: 'get'
     })
 }
 
 export function getCompositeScreen(params) {
     return request({
+        timeout: 60000,
         url: '/dataSource/getCompositeScreen',
         method: 'get',
         params

+ 1 - 1
chuanyi_client/src/background.js

@@ -85,7 +85,7 @@ async function createWindow() {
     win.webContents.openDevTools()
   } else {
     // 去掉顶部菜单
-    // win.setMenu(null)
+    win.setMenu(null)
   }
   // 菜单模板设置
   let templateMenu = [

+ 314 - 388
chuanyi_client/src/components/CustomDialog/DataSourceItem.vue

@@ -1,59 +1,30 @@
 <template>
   <div>
-    <el-dialog
-        :title="dataItemDialogTitle"
-        width="80%"
-        top="10vh"
-        class="cy-custom-dialog"
-        center
-        v-dialog-drag-and-zoom
-        v-if="dataItemDialogVisible"
-        :before-close="itemDialogClose"
-        :visible.sync="dataItemDialogVisible"
-        :close-on-click-modal="false"
-        :append-to-body="true">
+    <el-dialog :title="dataItemDialogTitle" width="80%" top="10vh" class="cy-custom-dialog" center v-dialog-drag-and-zoom
+      v-if="dataItemDialogVisible" :before-close="itemDialogClose" :visible.sync="dataItemDialogVisible"
+      :close-on-click-modal="false" :append-to-body="true">
       <el-form label-width='100px' style="display: flex;">
-          <el-row style="width: 650px;">
-              <el-col :span="12">
-        <el-form-item label='数据源:' style="margin-bottom: 0px; width: 300px;">
-          <el-select v-model="groupBasicForm.dataSourceId" disabled>
-            <el-option
-                v-for="dict in dataSourceList"
-                :key="dict.id"
-                :label="dict.dataSourceName"
-                :value="dict.id"
-            ></el-option>
+        <el-row style="width: 650px;">
+          <el-col :span="12">
+            <el-form-item label='数据源:' style="margin-bottom: 0px; width: 300px;">
+              <el-select v-model="groupBasicForm.dataSourceId" disabled>
+                <el-option v-for="dict in dataSourceList" :key="dict.id" :label="dict.dataSourceName"
+                  :value="dict.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-select v-model="queryParams.needItemStr" multiple collapse-tags placeholder="请选择">
+            <el-option v-for="item in DriverItemData" :key="item.id" :label="item.itemName" :value="item.itemName">
+            </el-option>
           </el-select>
-        </el-form-item>
-              </el-col>
-                <el-select
-                        v-model="queryParams.needItemStr"
-                        multiple
-                        collapse-tags
-                        placeholder="请选择"
-                >
-                    <el-option
-                            v-for="item in DriverItemData"
-                            :key="item.id"
-                            :label="item.itemName"
-                            :value="item.itemName"
-                    >
-                    </el-option>
-                </el-select>
-                <el-button
-                        type="primary"
-                        size="mini"
-                        style="margin-left: 15px;"
+          <el-button type="primary" size="mini" style="margin-left: 15px;" @click="getCompositeScreen">复合筛选</el-button>
 
-                        @click="query"
-                >复合筛选</el-button>
+          <el-form-item v-if="itemDataStep == 2" label='数据项:' style="margin-bottom: 0px; width: 300px;">
+            <el-input placeholder="请输入数据项名称进行过滤" style="" @input="chooseItemChangeEvent"
+              v-model="filterChooseItemText"></el-input>
+          </el-form-item>
 
-        <el-form-item v-if="itemDataStep == 2" label='数据项:' style="margin-bottom: 0px; width: 300px;">
-          <el-input placeholder="请输入数据项名称进行过滤" style=""
-                    @input="chooseItemChangeEvent" v-model="filterChooseItemText"></el-input>
-        </el-form-item>
-
-          </el-row>
+        </el-row>
       </el-form>
       <div v-if="itemDataStep == 1" style="display: flex; height: calc(100% - 36px); overflow: auto;">
         <!-- 数据项 -->
@@ -62,51 +33,33 @@
           <div class="cy-line" style="padding-bottom: 10px;">
             <div style="height: 35px;">
               <el-input placeholder="输入关键字进行过滤" v-model="filterItemData" size="mini"
-                        prefix-icon="el-icon-search"></el-input>
+                prefix-icon="el-icon-search"></el-input>
             </div>
             <div style="height: calc(100% - 35px); overflow: auto;">
-              <div :style="hasLeavesFlag == 1 ? 'height: 40%; overflow: auto;' : 'height: 100%; overflow: auto;'">
-                  <!--                         :show-checkbox="hasLeavesFlag == 1 ? false : true"-->
-                <el-tree class="cy-item-tree"
-                         ref="itemTree"
-                         :indent="10"
-                         :load="loadGroupDataItemNode"
-                         :props="groupProps"
-                         lazy
-                         node-key="id"
-                         :show-checkbox="true"
-                         :filter-node-method="filterItemEvent"
-                         @node-click="handleItemNodeClick"
-                         :check-on-click-node="true"
-                         :highlight-current="true"
-                         :default-expand-all="itemDataExpandAll">
+              <div :style="'height: 40%; overflow: auto;'">
+                <virtual-tree class="cy-item-tree" ref="itemTree" :data="treeData" :indent="10" node-key="id"
+                  :filter-node-method="filterItemEvent" @node-click="handleItemNodeClick" :check-on-click-node="false"
+                  :show-checkbox="true" :highlight-current="true" :default-expand-all="true">
                   <span class="custom-tree-node" slot-scope="{ node, data }">
-                    <svg-icon v-if="data.isLeaf" icon-class="file-bg"/>
-                    <svg-icon v-else-if="node.expanded" icon-class="folder-open" style="width: 1.2em;"/>
-                    <svg-icon v-else icon-class="folder"/>
+                    <svg-icon v-if="data.isLeaf" icon-class="file-bg" />
+                    <svg-icon v-else-if="node.expanded" icon-class="folder-open" style="width: 1.2em;" />
+                    <svg-icon v-else icon-class="folder" />
                     <span :title='node.label || "-"' style="margin-left: 2px;">{{ node.label }}</span>
                   </span>
-                </el-tree>
+                </virtual-tree>
               </div>
-              <div v-if="hasLeavesFlag == 1" style="height: 60%; overflow: auto;">
+              <div style="height: 60%; overflow: auto;">
                 <el-divider content-position="left" style="margin-bottom: 15px!important;">
                   <i class="el-icon-collection-tag"></i>
                   <span>(共{{ leavesList.length }}项)</span>
                 </el-divider>
-                <el-input placeholder="输入关键字进行过滤"
-                          style="margin-top: -10px;width: calc(100% - 60px);" size="mini"
-                          @input="itemChangeEvent" v-model="filterItemText"></el-input>
-                <el-checkbox v-model="isSelectAllItemData" @change="handleCheckAllChange"
-                             style="margin-left: 5px;">全选
+                <el-input placeholder="输入关键字进行过滤" style="margin-top: -10px;width: calc(100% - 60px);" size="mini"
+                  @input="itemChangeEvent" v-model="filterItemText"></el-input>
+                <el-checkbox v-model="isSelectAllItemData" @change="handleCheckAllChange" style="margin-left: 5px;">全选
                 </el-checkbox>
                 <div class="cy-leaves-div">
-                  <!--                  <el-checkbox-group v-model="leavesChooseList" @change="handleCheckedCitiesChange">-->
-                  <!--                    <el-checkbox v-for="leaves in leavesList" :label="leaves">{{ leaves.itemName }}</el-checkbox>-->
-                  <!--                  </el-checkbox-group>-->
-                  <p-virtual-check ref="pvc"
-                                   :data-sources="leavesList"
-                                   @check-change-all="checkChangeAll"
-                                   @check-change="checkChange"></p-virtual-check>
+                  <p-virtual-check ref="pvc" :data-sources="leavesList" @check-change-all="checkChangeAll"
+                    @check-change="checkChange"></p-virtual-check>
                 </div>
               </div>
             </div>
@@ -146,39 +99,25 @@
               <!--                  <span :title='node.label || data.itemName' style="margin-left: 2px;">{{ node.label || data.itemName }}</span>-->
               <!--                </span>-->
               <!--              </el-tree>-->
-              <p-virtual-check ref="pvcChoose"
-                               :data-sources="chooseItemDataListByTree"
-                               @check-change-all="checkChangeAllChoose"
-                               @check-change="checkChangeChoose"></p-virtual-check>
+              <p-virtual-check ref="pvcChoose" :data-sources="chooseItemDataListByTree"
+                @check-change-all="checkChangeAllChoose" @check-change="checkChangeChoose"></p-virtual-check>
             </div>
           </div>
         </div>
       </div>
       <div v-if="itemDataStep == 2" style="overflow: auto; height: calc(100% - 40px);">
-        <el-button size="mini"
-                   @click="multipleSetting"
-                   style="position: absolute; right: 30px; top: 80px;">批量设置表达式
+        <el-button size="mini" @click="multipleSetting" style="position: absolute; right: 30px; top: 80px;">批量设置表达式
         </el-button>
-        <el-button size="mini"
-                   @click="multipleSettingEventReport"
-                   style="position: absolute; right: 160px; top: 80px; display: none;">批量配置事件驱动
+        <el-button size="mini" @click="multipleSettingEventReport"
+          style="position: absolute; right: 160px; top: 80px; display: none;">批量配置事件驱动
         </el-button>
-        <u-table ref="multipleTable"
-                 row-key="label"
-                 use-virtual
-                 :height="430"
-                 :data="chooseItemDataList"
-                 @selection-change="selectionLineChangeHandle"
-                 @sort-change="sortChange"
-                 :big-data-checkbox="true"
-                 showBodyOverflow="title"
-                 showHeaderOverflow="title"
-                 style="margin-top: 10px;"
-                 border>
-          <u-table-column type="selection" width="55" align="center"/>
-          <u-table-column type="index" label="序号" width="60" fixed align="center"/>
-          <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center"/>
-          <u-table-column label="四则运算表达式" prop="rule.operationRule" sortable="custom" width="200" align="center"/>
+        <u-table ref="multipleTable" row-key="label" use-virtual :height="430" :data="chooseItemDataList"
+          @selection-change="selectionLineChangeHandle" @sort-change="sortChange" :big-data-checkbox="true"
+          showBodyOverflow="title" showHeaderOverflow="title" style="margin-top: 10px;" border>
+          <u-table-column type="selection" width="55" align="center" />
+          <u-table-column type="index" label="序号" width="60" fixed align="center" />
+          <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center" />
+          <u-table-column label="四则运算表达式" prop="rule.operationRule" sortable="custom" width="200" align="center" />
           <u-table-column label="操作" width="150" align="center">
             <template slot-scope="scope">
               <el-button size="mini" @click="handleChoose(scope.rowIndex, scope.row)">选择表达式</el-button>
@@ -187,29 +126,17 @@
         </u-table>
       </div>
       <span slot='footer'>
-          <el-button type="primary" v-if="itemDataStep == 1" @click="itemDialogSave1">下一步</el-button>
-          <el-button type="primary" v-if="itemDataStep == 2" @click="itemDialogSave2">确定</el-button>
-          <el-button @click="itemDialogClose">取消</el-button>
+        <el-button type="primary" v-if="itemDataStep == 1" @click="itemDialogSave1">下一步</el-button>
+        <el-button type="primary" v-if="itemDataStep == 2" @click="itemDialogSave2">确定</el-button>
+        <el-button @click="itemDialogClose">取消</el-button>
       </span>
     </el-dialog>
 
-    <el-dialog
-        title="选择表达式"
-        width="500px"
-        top="10vh"
-        center
-        v-dialog-drag
-        v-if="dialogDataModelVisible"
-        :before-close="dialogDataModelClose"
-        :visible.sync="dialogDataModelVisible"
-        :close-on-click-modal="false"
-        :append-to-body="true">
+    <el-dialog title="选择表达式" width="500px" top="10vh" center v-dialog-drag v-if="dialogDataModelVisible"
+      :before-close="dialogDataModelClose" :visible.sync="dialogDataModelVisible" :close-on-click-modal="false"
+      :append-to-body="true">
       <el-select v-model="chooseDataModel" filterable clearable placeholder="请选择表达式" style="width: 100%;">
-        <el-option
-            v-for="(item, index) in this.dataModelList"
-            :key="index"
-            :label="item.title"
-            :value="item.id">
+        <el-option v-for="(item, index) in this.dataModelList" :key="index" :label="item.title" :value="item.id">
         </el-option>
       </el-select>
       <div style="width: 100%; text-align: center; margin-top: 20px;">
@@ -227,15 +154,16 @@ import {
   showAlertMsgWin,
   showAlertWin,
   showLoading,
+  showLoadingTime,
   traverseNode,
   traverseVisible
 } from "@/utils/cqcy";
 import {
-    getAllDataModel,
-    getAllDataSource, getCompositeScreen, getDriverItemBySouceId,
-    getNextAllItem
+  getAllDataModel, getItemGroupById,
+  getAllDataSource, getCompositeScreen, getDriverItemBySouceId,
+  getNextAllItem
 } from "@/api/datasource";
-import {v4 as uuidv4} from "uuid";
+import { v4 as uuidv4 } from "uuid";
 import PVirtualCheck from "@/components/PVirtualCheck"
 
 export default {
@@ -258,6 +186,8 @@ export default {
       isSelectAllItem: false,
       chooseDataModel: null,
       dataModelList: [],
+      // 树数据
+      treeData: [],
       leavesList: [],
       leavesListF: [],
       leavesChooseList: [],
@@ -276,15 +206,13 @@ export default {
         dataSourceId: null,
         itemList: []
       },
-      // 驱动数据返回类型:0 通用 1 WINCC
-      hasLeavesFlag: 0,
-        DriverItemData: [],
-        queryParams: {
-            id: null,
-            chooseItemStr: "",
-            nextItemStr: "",
-            needItemStr: [],
-        },
+      DriverItemData: [],
+      queryParams: {
+        id: null,
+        chooseItemStr: "",
+        nextItemStr: "",
+        needItemStr: [],
+      },
     }
   },
   props: ['chooseGroup'],
@@ -294,104 +222,153 @@ export default {
     }
   },
   methods: {
-      getDriverItemBySouceId(id) {
-          this.queryParams.id = id;
-          getDriverItemBySouceId(id).then((res) => {
-              console.log(res);
-              if (res.code === 200) {
-                  this.DriverItemData = res.data;
+    getDriverItemBySouceId(id) {
+      this.queryParams.id = id;
+      getDriverItemBySouceId(id).then((res) => {
+        if (res.code === 200) {
+          this.DriverItemData = res.data;
+        }
+      });
+    },
+    getCompositeScreen() {
+      let params = {};
+      params.id = this.queryParams.id
+      params.chooseItemStr = this.queryParams.chooseItemStr
+      params.needItemStr = JSON.stringify(this.queryParams.needItemStr)
+      const treeArr = this.$refs.itemTree.getCheckedNodes();
+      const treeQ = document.getElementsByClassName('el-tree cy-item-tree el-tree--highlight-current')[0]
+        .getElementsByClassName('el-tree-node__content');
+      let seTreeArr = []
+      if (treeArr.length > 0) {
+        for (let i = 0; i < treeQ.length; i++) {
+          const parentClass = treeQ[i].parentElement.classList;
+          if (parentClass.contains('is-current') && !parentClass.contains('is-hidden')) {
+            // 选择的层级
+            let treechild = treeQ[i].nextElementSibling.getElementsByClassName('el-tree-node__content');
+            for (let j = 0; j < treechild.length; j++) {
+              const clz = treechild[j].parentElement.classList;
+              if (clz.contains('is-checked') && !clz.contains('is-hidden')) {
+                seTreeArr.push(treechild[j].textContent)
               }
-          });
-      },
-      query() {
-          this.queryParams.nextItemStr = this.filterItemData;
-
-          let params = this.queryParams;
-          params.needItemStr = JSON.stringify(this.queryParams.needItemStr.length > 0 ? this.queryParams.needItemStr : [])
-          const treeArr = this.$refs.itemTree.getCheckedNodes();
-          const treeQ = document.getElementsByClassName('el-tree cy-item-tree el-tree--highlight-current')[0]
-              .getElementsByClassName('el-tree-node__content');
-          let seTreeArr = []
-          if (treeArr.length > 0) {
-              for (let i = 0; i < treeQ.length; i++) {
-                  const parentClass = treeQ[i].parentElement.classList;
-                  if (parentClass.contains('is-current') && !parentClass.contains('is-hidden')) {
-                      // 选择的层级
-                      let treechild = treeQ[i].nextElementSibling.getElementsByClassName('el-tree-node__content');
-                      for (let j = 0; j < treechild.length; j++) {
-                          const clz = treechild[j].parentElement.classList;
-                          if (clz.contains('is-checked') && !clz.contains('is-hidden')) {
-                              seTreeArr.push(treechild[j].textContent)
-                          }
-                      }
-                      break;
-                  }
+            }
+            break;
+          }
+        }
+      }
+      params.nextItemStr = JSON.stringify(seTreeArr)
+      if (!seTreeArr || seTreeArr.length == 0) {
+        this.$message({
+          message: '节点选择为空',
+          type: 'warning'
+        });
+        return
+      }
+      if (!this.queryParams.needItemStr || this.queryParams.needItemStr.length == 0) {
+        this.$message({
+          message: '复合筛选属性不能为空',
+          type: 'warning'
+        });
+        return
+      }
+      const loading = showLoadingTime(this, "筛选中,请稍候···", 60000);
+      getCompositeScreen(params).then((res) => {
+        if (res.code === 200) {
+          let treeData = this.chooseItemDataListByTree ? this.chooseItemDataListByTree : [];
+          if (res.data && res.data.length > 0) {
+            let lodArr = [];
+            for (let j = 0; j < res.data.length; j++) {
+              lodArr.push(res.data[j].label ? res.data[j].label : res.data[j].itemName);
+            }
+            let status = false;
+            let idArr = {}
+            for (let i = 0; i < treeData.length; i++) {
+              if (lodArr.indexOf(treeData[i].label) !== -1) {
+                idArr[lodArr.indexOf(treeData[i].label)] = '1'
+              }
+            }
+            for (let j = 0; j < res.data.length; j++) {
+              if (!idArr[j]) {
+                treeData.push(res.data[j])
+              } else {
+                status = true;
               }
+            }
+            if (status) {
+              this.$message({
+                message: '请注意,选择的数据项中含有重复的项',
+                type: 'warning'
+              });
+            }
           }
-          params.nextItemStr = JSON.stringify(seTreeArr)
-          getCompositeScreen(params).then((res) => {
-              console.log(this.chooseItemDataListByTree);
-              if (res.code === 200) {
-                  let treeData = this.chooseItemDataListByTree ? this.chooseItemDataListByTree : [];
-                  if (res.data && res.data.length > 0) {
-                      let lodArr = [];
-                      for (let j = 0; j < res.data.length; j++) {
-                          lodArr.push(res.data[j].label ? res.data[j].label : res.data[j].itemName);
-                      }
-                      console.log(lodArr)
-                      let status = false;
-                      let idArr = {}
-                      for (let i = 0; i < treeData.length; i++) {
-                          if (lodArr.indexOf(treeData[i].label) !== -1) {
-                              idArr[lodArr.indexOf(treeData[i].label)] = '1'
-                          }
-                      }
-                      console.log(idArr)
-                      for (let j = 0; j < res.data.length; j++) {
-                          if (!idArr[j]) {
-                              treeData.push(res.data[j])
-                          } else {
-                              status = true;
-                          }
-                      }
-                      console.log(treeData)
-                      if (status) {
-                          this.$message({
-                              message: '请注意,选择的数据项中含有重复的项',
-                              type: 'warning'
-                          });
-                      }
-                  }
 
-
-                  this.handleCheckAllChange(false);
-                  this.$nextTick(() => {
-                      this.chooseItemDataListByTree = treeData;
-                      this.isSelectAllItem = false;
-                      this.isSelectAllItemData = false;
-                      this.leavesChooseList = [];
-                      this.queryParams.needItemStr = [];
-                      this.$refs.itemTree.setCheckedKeys([]);
-                      this.$refs.itemTree.setCheckedNodes([]);
-                      // this.$refs.chooseItemTree.setCheckedNodes([])
-                      console.log(this.chooseItemDataListByTree);
-                  });
-                  if (!res.data || res.data.length === 0) {
-                      this.$message({
-                          message: '没有筛选出符合条件的数据项,请重新筛选',
-                          type: 'warning'
-                      });
-                  }
-              }
+          this.handleCheckAllChange(false);
+          this.$nextTick(() => {
+            this.chooseItemDataListByTree = treeData;
+            this.isSelectAllItem = false;
+            this.isSelectAllItemData = false;
+            this.leavesChooseList = [];
+            this.$refs.itemTree.setCheckedKeys([]);
+            this.$refs.itemTree.setCheckedNodes([]);
+            // this.$refs.chooseItemTree.setCheckedNodes([])
           });
-      },
+          if (!res.data || res.data.length === 0) {
+            this.$message({
+              message: '没有筛选出符合条件的数据项,请重新筛选',
+              type: 'warning'
+            });
+          }
+          loading.close()
+        }
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e);
+      });
+    },
     /** 显示弹窗 */
     show() {
       this.groupBasicForm.dataSourceId = this.chooseGroup.dataSourceId
       this.getDataSourceList()
+      const loading = showLoading(this, "加载中,请稍候···");
+      this.isSelectAllItem = false;
+      this.dataLineListSelections = [];
+      this.leavesList = [];
+      this.leavesChooseList = [];
+      this.itemDataStep = 1;
+      this.tempItemList = JSON.parse(JSON.stringify(this.groupBasicForm.itemList))
+      this.getNextAllItem(this.chooseGroup.dataSourceId, null, (data) => {
+        //加载树
+        this.treeData = data.children
+        //加载虚拟列表,叶节点
+        let leaves = data.leaves
+        this.leavesList = leaves
+        this.leavesListF = leaves
+        let arr = [];
+        //将原来的数据项加载到,右侧作为已选择的
+        for (let i = 0; i < this.tempItemList.length; i++) {
+          let temp = {
+            nodeIdentifier: null,
+            dataType: null,
+            label: this.tempItemList[i].itemName,
+            nodeIndex: this.tempItemList[i].nodeIndex,
+            itemName: this.tempItemList[i].itemName,
+            itemReadName: this.tempItemList[i].itemReadName,
+            dataModelId: this.tempItemList[i].dataModelId,
+            value: this.tempItemList[i].itemReadName,
+            checked: false,
+          };
+          arr.push(temp)
+        }
+        this.chooseItemDataListByTree = arr
+        this.dataItemDialogTitle = "选择数据项";
+        this.dataItemDialogVisible = true;
+
+        //获取数据源的驱动数据项信息
+        this.getDriverItemBySouceId(this.chooseGroup.dataSourceId)
+        loading.close();
+      })
     },
     /** 自定义排序 */
-    sortChange({prop, order}) {
+    sortChange({ prop, order }) {
       this.chooseItemDataList.sort(customCompare(prop, order))
     },
     /** 动态搜索事件 */
@@ -511,100 +488,71 @@ export default {
       })
       this.leavesList = filterList
     },
-    /** 懒加载数据组数据项查询 */
-    loadGroupDataItemNode(node, resolve) {
-      if (node.level === 0) {
-          // setTimeout(() => {
-              this.getDataItemByDataSource()
-          // }, 200)
-		// console.log(this.itemDataListByTree)
-          // return resolve(this.itemDataListByTree)
-      }
-      let itemNames = []
-      extractDataItemValues(node, itemNames)
-      let itemName = itemNames.reverse().join('!@')
-      let dataSourceId = this.chooseGroup.dataSourceId
-        this.queryParams.chooseItemStr = itemName;
-      if (node.childNodes && node.childNodes.length > 0) {
-          return;
-      }
-	  
-      getNextAllItem(dataSourceId, itemName).then(res => {
-        if (!res.data) {
-          resolve([])
-          return
-        }
-        let datas = res.data.label
-        let leaves = res.data.leaves
-        let leaveList = []
-        if (leaves && leaves.length > 0) {
-          leaves.forEach((t) => {
-            t.label = t.itemName
-            t.value = t.itemReadName
-            t.checked = false
-            leaveList.push(t)
-          })
-        }
-        this.filterItemText = ''
-        this.leavesList = leaveList
-        this.leavesListF = JSON.parse(JSON.stringify(this.leavesList))
-        console.log(11, this.leavesList)
-        let dataList = []
+    /** 获取树节点的下级信息 */
+    getNextAllItem(dataSourceId, itemName, callback) {
+      getNextAllItem(dataSourceId, itemName).then((res) => {
+        let data = {}
+        this.filterLeavesText = "";
+        let datas = res.data.label;
+        let leaves = res.data.leaves;
+        // 模拟数据
+        let dataList = [];
         if (datas && datas.length > 0) {
           datas.forEach((t) => {
             dataList.push({
-              'dataSourceId': dataSourceId,
-              'label': t.itemName,
-              'leaf': false,
-              'children': []
-            })
-          })
+              dataSourceId: dataSourceId,
+              label: t.itemName,
+              leaf: false,
+              children: [],
+            });
+          });
         }
-          this.getDriverItemBySouceId(dataSourceId);
-        resolve(dataList)
-      }).catch((e) => {
-        resolve([])
-        showAlertWin(this, null, e)
+        let leavesList = [];
+        if (leaves && leaves.length > 0) {
+          leaves.forEach((t) => {
+            t.label = t.itemName;
+            t.value = t.itemReadName;
+            t.checked = false;
+            leavesList.push(t);
+          });
+        }
+        data.children = dataList
+        data.leaves = leavesList
+        callback(data);
       })
     },
     /** 数据项点击事件 */
-    handleItemNodeClick(data, n, target) {
-      let node = this.$refs.itemTree.getNode(n)
+    handleItemNodeClick(d, n, t) {
+      let itemNames = [];
+      extractDataItemValues(n, itemNames);
+      let itemName = itemNames.reverse().join("!@");
+      this.queryParams.chooseItemStr = itemName;
+      const loading = showLoading(this, "加载中,请稍候···");
+      if ((!d.children || d.children.length == 0) && (!d.leaves || d.leaves.length == 0)) {
+        this.getNextAllItem(this.groupBasicForm.dataSourceId, itemName, (data) => {
+          //加载树
+          d.children = data.children
+          let leaves = data.leaves
+          d.leaves = leaves
+          //加载虚拟列表,叶节点
+          this.leavesList = leaves
+          this.leavesListF = leaves
+          loading.close();
+        })
+      } else {
+        if (d.leaves) {
+          let leaves = d.leaves
+          this.leavesList = leaves
+          this.leavesListF = leaves
+        }
+        loading.close();
+      }
+      let node = this.$refs.itemTree.getNode(n);
       if (!node) {
-        this.isSelectAllItemData = false
-        node.loaded = false
-        node.expand()
+        this.isSelectAllItemData = false;
+        node.loaded = false;
+        node.expand();
       }
-      // if (this.hasLeavesFlag !== 1) return
-      // this.isSelectAllItemData = false
-      // const loading = showLoading(this, '加载中,请稍候···')
-      // let itemNames = []
-      // extractDataItemValues(node, itemNames)
-      // let itemName = itemNames.reverse().join('!@')
-      // let dataSourceId = node.data.dataSourceId
-      // getNextAllItem(dataSourceId, itemName).then(res => {
-      //   loading.close()
-      //   let data = res.data
-      //
-      //   let leaves = []
-      //   if (data.leaves && data.leaves.length > 0) {
-      //     data.leaves.forEach((t) => {
-      //       t.label = t.itemName
-      //       t.value = t.itemReadName
-      //       t.checked = false
-      //       leaves.push(t)
-      //     })
-      //   }
-      //   this.filterItemText = ''
-      //   this.leavesList = leaves
-      //   console.log(22, this.leavesList)
-      //   this.leavesListF = JSON.parse(JSON.stringify(this.leavesList))
-      // }).catch((e) => {
-      //   loading.close()
-      //   this.leavesList = []
-      //   this.leavesListF = JSON.parse(JSON.stringify(this.leavesList))
-      //   showAlertWin(this, null, e)
-      // })
     },
     /** 根据数据源选择数据项 */
     getDataItemByDataSource() {
@@ -623,10 +571,10 @@ export default {
       if (this.tempItemList && this.tempItemList.length > 0) {
         this.chooseItemDataListByTree = this.tempItemList
       }
-	  this.$nextTick(() => {
-	    // 区分驱动返回数据类型
-	    this.hasLeavesFlag = 1
-	  })
+      this.$nextTick(() => {
+        // 区分驱动返回数据类型
+        this.hasLeavesFlag = 1
+      })
       // const loading = showLoading(this, '加载中,请稍候···')
       // getNextAllItem(id, null).then(res => {
       //   loading.close()
@@ -679,87 +627,63 @@ export default {
     /** 添加数据项 */
     addCheckNodesBtnEvent() {
       // 根据当前选择节点拼接为:XXXX.XXXX.XXX
-      let chooseChannelNameList = []
-      // WinCC数据项处理
-      if (this.hasLeavesFlag === 1) {
-        if (this.leavesChooseList.length == 0) {
-          showAlertMsgWin(this, null, '请选择数据项!')
-          return
-        }
-        for (let i = 0; i < this.leavesChooseList.length; i++) {
-          let temp = {
-            'id': uuidv4(),
-            'nodeIdentifier': null,
-            'dataType': null,
-            'label': this.leavesChooseList[i].fullPath,
-            'nodeIndex': this.leavesChooseList[i].nodeIndex,
-            'itemName': this.leavesChooseList[i].itemName,
-            'itemReadName': this.leavesChooseList[i].itemReadName,
-            'value': this.leavesChooseList[i].itemReadName,
-            'checked': false
-          }
-          chooseChannelNameList.push(temp)
-        }
-      }
-      // 通用数据项处理
-      else {
-        let checkedNodes = this.$refs.itemTree.getCheckedNodes(false, true)
-        if (checkedNodes.length == 0) {
-          showAlertMsgWin(this, null, '请选择数据项!')
-          return
-        }
-        for (let i in checkedNodes) {
-          let checkedNode = checkedNodes[i]
-          if (!checkedNode.isLeaf) {
-            continue
-          }
-          const nodeId = checkedNode.$treeNodeId;
-          let channelName = this.treeFindPath(this.itemDataListByTree, data => data.$treeNodeId === nodeId, "label")
-          let temp = {
-            'id': uuidv4(),
-            'label': channelName.join('.'),
-            'nodeIdentifier': checkedNode.nodeIdentifier,
-            'nodeIndex': checkedNode.nodeIndex,
-            'dataType': checkedNode.dataType,
-            'itemReadName': checkedNode.itemReadName,
-            'value': checkedNode.itemReadName,
-            'checked': false
-          }
-          chooseChannelNameList.push(temp)
-        }
+      let chooseChannelNameList = [];
+      if (this.leavesChooseList.length == 0) {
+        showAlertMsgWin(this, null, "请选择数据项!");
+        return;
       }
-      if (chooseChannelNameList.length == 0) {
-        showAlertMsgWin(this, null, '请选择子数据项!')
-        return
+      for (let i = 0; i < this.leavesChooseList.length; i++) {
+        let temp = {
+          id: uuidv4(),
+          nodeIdentifier: null,
+          dataType: null,
+          label: this.leavesChooseList[i].fullPath,
+          nodeIndex: this.leavesChooseList[i].nodeIndex,
+          itemName: this.leavesChooseList[i].itemName,
+          itemReadName: this.leavesChooseList[i].itemReadName,
+          value: this.leavesChooseList[i].itemReadName,
+          checked: false,
+        };
+        chooseChannelNameList.push(temp);
       }
       // 去重
-      let arr = JSON.parse(JSON.stringify(this.chooseItemDataListByTree))
+      let arr = JSON.parse(JSON.stringify(this.chooseItemDataListByTree));
       if (arr.length == 0) {
-        arr = chooseChannelNameList
+        arr = chooseChannelNameList;
       } else {
+        let status = false;
         for (let i in chooseChannelNameList) {
-          let flag = false
+          let flag = false;
           for (let j in arr) {
-            let tName = arr[j].label ? arr[j].label : arr[j].itemName
+            let tName = arr[j].label ? arr[j].label : arr[j].itemName;
             if (chooseChannelNameList[i].label == tName) {
-              flag = true
-              break
+              flag = true;
+              if (!status) {
+                status = true;
+              }
+              break;
             }
           }
           if (!flag) {
-            arr.push(chooseChannelNameList[i])
+            arr.push(chooseChannelNameList[i]);
           }
         }
+        if (status) {
+          this.$message({
+            message: '请注意,选择的数据项中含有重复的项',
+            type: 'warning'
+          });
+        }
       }
-      this.handleCheckAllChange(false)
+      this.handleCheckAllChange(false);
       this.$nextTick(() => {
-        this.chooseItemDataListByTree = arr
-        this.leavesChooseList = []
-        this.isSelectAllItem = false
-        this.isSelectAllItemData = false
-        this.$refs.itemTree.setCheckedKeys([])
+        this.chooseItemDataListByTree = arr;
+        this.isSelectAllItem = false;
+        this.isSelectAllItemData = false;
+        this.leavesChooseList = [];
+        this.$refs.itemTree.setCheckedKeys([]);
         // this.$refs.chooseItemTree.setCheckedNodes([])
-      })
+      });
     },
     /** 移除数据项 */
     removeCheckNodesBtnEvent() {
@@ -779,7 +703,7 @@ export default {
       if (!_temp || _temp.length == 0) {
         return
       }
-      for (let i = _temp.length - 1; i >= 0; i --) {
+      for (let i = _temp.length - 1; i >= 0; i--) {
         if (_temp[i].checked) {
           this.chooseItemDataListByTree.splice(i, 1)
         }
@@ -830,6 +754,7 @@ export default {
     },
     /** 选择数据项弹出层保存事件:第二步 */
     itemDialogSave2() {
+      this.treeData=[]
       this.filterChooseItemText = ''
       this.chooseItemChangeEvent()
       this.itemDataStep = 1
@@ -867,8 +792,8 @@ export default {
         }
         for (let i = 0; i < dataModelList.length; i++) {
           dataModelList[i].title = dataModelList[i].remark
-              ? ('【' + dataModelList[i].remark + '】' + dataModelList[i].operationRule)
-              : dataModelList[i].operationRule
+            ? ('【' + dataModelList[i].remark + '】' + dataModelList[i].operationRule)
+            : dataModelList[i].operationRule
           this.dataModelList.push(dataModelList[i])
         }
         this.$nextTick(() => {
@@ -955,6 +880,7 @@ export default {
         this.chooseItemDataListByTree = this.tempItemList
         this.groupBasicForm.itemList = this.tempItemList
       }
+      this.treeData=[]
       this.filterChooseItemText = ''
       this.filterItemData = ''
       this.itemDataListByTree = []
@@ -976,8 +902,8 @@ export default {
 </script>
 
 <style scoped>
-.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
-    background-color: #90b9e1;
-    color: white;
+.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
+  background-color: #90b9e1;
+  color: white;
 }
 </style>

File diff suppressed because it is too large
+ 227 - 711
chuanyi_client/src/components/HeaderMain/index.vue


+ 594 - 0
chuanyi_client/src/components/HeaderMain/itemChooseTree.vue

@@ -0,0 +1,594 @@
+<template>
+    <div>
+        <!-- 数据项选择树 -->
+        <el-dialog :title="title" width="80%" top="10vh" custom-class="dialog-max" class="cy-custom-dialog" center
+            :before-close="dialogClose" :visible.sync="visible" @open="handleOpen" @close="handleClose">
+            <el-form label-width="100px">
+                <el-row>
+                    <el-col :span="6">
+                        <el-form-item label="数据源:" style="margin-bottom: 20px; width: 300px">
+                            <el-select v-model="dataSourceId" disabled>
+                                <el-option v-for="dict in dataSourceList" :key="dict.id" :label="dict.dataSourceName"
+                                    :value="dict.id"></el-option>
+                            </el-select>
+                        </el-form-item>
+                        <!-- <el-form-item label="所选路径" style="margin-bottom: 20px; width: 300px">
+                            <el-input style="margin-top: -10px; width: 400px" disabled
+                                v-model="queryParams.chooseItemStr"></el-input>
+                        </el-form-item> -->
+                    </el-col>
+                    <template>
+                        <el-select v-model="queryParams.needItemStr" multiple collapse-tags placeholder="请选择">
+                            <el-option v-for="item in DriverItemData" :key="item.id" :label="item.itemName"
+                                :value="item.itemName">
+                            </el-option>
+                        </el-select>
+                        <el-button type="primary" size="mini" style="margin-left: 15px;"
+                            @click="getCompositeScreen">复合筛选</el-button>
+                    </template>
+                </el-row>
+            </el-form>
+            <!-- <div style="display: flex; height: calc(100% - 36px); overflow: auto"> -->
+            <div style="display: flex; height: calc(100% - 36px);">
+                <!-- 数据项 -->
+                <div class="cy-transform-data">
+                    <el-divider content-position="left">数据项</el-divider>
+                    <div class="cy-line" style="padding-bottom: 10px">
+                        <div style="height: 35px">
+                            <el-input placeholder="输入关键字进行过滤" v-model="filterLabelText" size="mini"
+                                prefix-icon="el-icon-search"></el-input>
+                        </div>
+                        <div style="height: calc(100% - 50px); overflow: auto">
+                            <!-- 树节点 -->
+                            <div style="height: 20vh;overflow: auto;">
+                                <virtual-tree class="cy-group-tree" ref="itemTree" :data="treeData" :indent="10"
+                                    node-key="id" :filter-node-method="filterLabelEvent" @node-click="handleLabelNodeClick"
+                                    @node-expand="handleLabelNodeExpand" @node-collapse="handleLabelNodeCollapse"
+                                    :check-on-click-node="false" :show-checkbox="true" :highlight-current="true"
+                                    :default-expand-all="true">
+                                    <span class="custom-tree-node" slot-scope="{ node, data }">
+                                        <i v-if="data.isLeaf" class="el-icon-document"
+                                            style="color: #e69a0f; margin-right: 5px;" />
+                                        <i v-else-if="node.expanded" class="el-icon-folder-opened"
+                                            style="color: #e69a0f; margin-right: 5px;" />
+                                        <i v-else class="el-icon-folder" style="color: #e69a0f; margin-right: 5px;" />
+                                        <!-- <svg-icon v-if="data.isLeaf" icon-class="file-bg" />
+                                        <svg-icon v-else-if="node.expanded" icon-class="folder-open" style="width: 1.2em" />
+                                        <svg-icon v-else icon-class="folder" /> -->
+                                        <span :title="node.label || '-'" style="margin-left: 2px">{{
+                                            node.label
+                                        }}</span>
+                                    </span>
+                                </virtual-tree>
+                            </div>
+                            <!-- 树节点对应的叶节点 -->
+                            <div style="height: 30vh; overflow: auto">
+                                <el-divider content-position="left" style="margin-bottom: 15px !important">
+                                    <i></i>
+                                    <span>(共{{ leavesList.length }}项)</span>
+                                </el-divider>
+                                <el-input placeholder="输入关键字进行过滤" style="margin-top: -10px; width: calc(100% - 60px)"
+                                    size="mini" @input="filterLeavesEvent" v-model="filterLeavesText"></el-input>
+                                <el-checkbox v-model="isSelectAllLeaves" @change="handleCheckAllLeavesChange"
+                                    style="margin-left: 5px">全选</el-checkbox>
+                                <div class="cy-leaves-div">
+                                    <p-virtual-check ref="pvc" :data-sources="leavesList"
+                                        @check-change-all="checkChangeAllLeaves"
+                                        @check-change="checkChangeLeaves"></p-virtual-check>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- 操作按钮 -->
+                <div class="cy-transform-btn">
+                    <el-row>
+                        <el-button size="mini" @click="addCheckNodesBtnEvent">添加&nbsp;&gt;&gt;</el-button>
+                    </el-row>
+                    <el-row>
+                        <el-button size="mini" @click="removeCheckNodesBtnEvent">&lt;&lt;&nbsp;移除</el-button>
+                    </el-row>
+                    <el-row>
+                        <el-button size="mini" @click="removeAllCheckNodesBtnEvent">全部移除</el-button>
+                    </el-row>
+                </div>
+                <!-- 已选择数据项 -->
+                <div class="cy-transform-data">
+                    <el-divider content-position="left">已选择数据项({{ chooseItemDataListByTree.length }})</el-divider>
+                    <div class="cy-line">
+                        <el-checkbox v-model="isSelectAllItem" @change="selectAllItem"
+                            style="margin-left: 10px">全选</el-checkbox>
+                        <div style="height: 60vh; overflow: auto">
+                            <p-virtual-check ref="pvcChoose" :data-sources="chooseItemDataListByTree"
+                                @check-change-all="checkChangeAllChoose"
+                                @check-change="checkChangeChoose"></p-virtual-check>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <span slot="footer">
+                <el-button type="primary" @click="gotoItemConfig">下一步</el-button>
+                <el-button @click="dialogClose">取消</el-button>
+            </span>
+        </el-dialog>
+
+        <!-- 数据项表达式配置 -->
+        <ItemConfigModel ref="itemConfigModel" @dialogClose="dialogClose" @saveItemChoose="saveItemChoose">
+        </ItemConfigModel>
+    </div>
+</template>
+
+<script>
+import { showLoading } from '@/utils/cqcy'
+import { extractDataItemValues, getNodeAllPath } from '@/utils/cqcy'
+import PVirtualCheck from "@/components/PVirtualCheck/index.vue";
+import { getNextAllItem, getDriverItemBySouceId, getCompositeScreen } from '@/api/source/itemGroup';
+import { getAllDataModel } from '@/api/source/dataModel';
+import ItemConfigModel from './itemConfigModel.vue'
+
+export default {
+    components: {
+        'p-virtual-check': PVirtualCheck,
+        ItemConfigModel
+    },
+    watch: {
+        filterLabelText(val) {
+            this.$refs.itemTree.filter(val);
+        },
+    },
+    created() {
+        this.getAllDataModel()
+    },
+    data() {
+        return {
+            visible: false,
+            title: '选择数据项',
+            dataSourceId: null,
+            treeItemName: null,
+            //树数据
+            treeData: [],
+            //所有数据源信息
+            dataSourceList: [],
+            //所有数据模型
+            dataModelList: [],
+            //原来数据组中包含的数据项信息
+            itemList: [],
+            //过滤树节点的输入文本
+            filterLabelText: null,
+            //左侧展示的叶节点
+            leavesList: [],
+            leavesListF: [],
+            //左侧选中的叶节点
+            leavesChooseList: [],
+            //过滤叶节点的输入文本
+            filterLeavesText: null,
+            //是否全选所有叶节点
+            isSelectAllLeaves: false,
+            //右侧展示的,已选择的数据项
+            chooseItemDataListByTree: [],
+            //右侧,是否选择所有数据项
+            isSelectAllItem: false,
+            queryParams: {
+                id: null,
+                chooseItemStr: "",
+                nextItemStr: "",
+                needItemStr: [],
+            },
+            DriverItemData: []
+        }
+    },
+    methods: {
+        /** 关闭弹出层 */
+        dialogClose() {
+            this.visible = false
+        },
+        /** 弹窗打开事件 */
+        handleOpen() {
+            const loading = showLoading(this, "加载中,请稍候···");
+            this.isSelectAllItem = false
+            this.getNextAllItem(this.dataSourceId, this.treeItemName, (data) => {
+                //加载树
+                this.treeData = data.children
+                //加载虚拟列表,叶节点
+                let leaves = data.leaves
+                this.leavesList = leaves
+                this.leavesListF = leaves
+                let arr = [];
+                //将原来的数据项加载到,右侧作为已选择的
+                for (let i = 0; i < this.itemList.length; i++) {
+                    let temp = {
+                        nodeIdentifier: null,
+                        dataType: null,
+                        label: this.itemList[i].itemName,
+                        nodeIndex: this.itemList[i].nodeIndex,
+                        itemName: this.itemList[i].itemName,
+                        itemReadName: this.itemList[i].itemReadName,
+                        dataModelId: this.itemList[i].dataModelId,
+                        value: this.itemList[i].itemReadName,
+                        checked: false,
+                    };
+                    arr.push(temp)
+                }
+                this.chooseItemDataListByTree = arr
+                //获取数据源的驱动数据项信息
+                this.getDriverItemBySouceId(this.dataSourceId)
+                loading.close();
+            })
+        },
+        /** 弹窗关闭事件 */
+        handleClose() {
+            this.dataSourceId = null
+            this.treeItemName = []
+            this.treeData = []
+            this.leavesList = []
+            this.chooseItemDataListByTree = []
+            this.filterLabelText = null
+            this.filterLeavesText = null
+        },
+        /** 查询改数据源下的驱动数据项信息 */
+        getDriverItemBySouceId(id) {
+            this.queryParams.id = id;
+            getDriverItemBySouceId(id).then((res) => {
+                if (res.code === 200) {
+                    this.DriverItemData = res.data;
+                }
+            });
+        },
+        /** 跳转到配置数据项表达式 */
+        gotoItemConfig() {
+            if (this.chooseItemDataListByTree.length == 0) {
+                this.$message({
+                    message: '请选择数据项!',
+                    type: 'warning'
+                });
+                return;
+            }
+            this.$refs.itemConfigModel.title = '数据项表达式配置'
+            this.$refs.itemConfigModel.visible = true
+            this.$refs.itemConfigModel.leavesChooseList = this.chooseItemDataListByTree
+            this.$refs.itemConfigModel.tableTotal = this.chooseItemDataListByTree.length
+            let arr = [];
+            for (let i = 0; i < this.chooseItemDataListByTree.length; i++) {
+                let temp = this.chooseItemDataListByTree[i];
+                let dataModelId = this.chooseItemDataListByTree[i].dataModelId
+                for (let j = 0; j < this.dataModelList.length; j++) {
+                    if (this.dataModelList[j].id == dataModelId) {
+                        temp.remark = this.dataModelList[j].remark
+                        break
+                    }
+                }
+                arr.push(temp)
+            }
+            this.$refs.itemConfigModel.tableData = arr
+            this.$refs.itemConfigModel.dataModelList = this.dataModelList
+        },
+        /** 将数据项选择的信息,传递给父组件 */
+        saveItemChoose(datas) {
+            this.$emit('saveItemChoose', datas)
+        },
+        /** 获取树节点的下级信息 */
+        getNextAllItem(dataSourceId, itemName, callback) {
+            getNextAllItem(dataSourceId, itemName).then((res) => {
+                let data = {}
+                this.filterLeavesText = "";
+                let datas = res.data.label;
+                let leaves = res.data.leaves;
+                // 模拟数据
+                let dataList = [];
+                if (datas && datas.length > 0) {
+                    datas.forEach((t) => {
+                        dataList.push({
+                            dataSourceId: dataSourceId,
+                            label: t.itemName,
+                            leaf: false,
+                            children: [],
+                        });
+                    });
+                }
+                let leavesList = [];
+                if (leaves && leaves.length > 0) {
+                    leaves.forEach((t) => {
+                        t.label = t.itemName;
+                        t.value = t.itemReadName;
+                        t.checked = false;
+                        leavesList.push(t);
+                    });
+                }
+                data.children = dataList
+                data.leaves = leavesList
+                callback(data);
+            })
+        },
+        /** 过滤树节点事件 */
+        filterLabelEvent(value, data) {
+            if (!value) return true;
+            return data.label.indexOf(value) !== -1;
+        },
+        /** 数据项点击事件 */
+        handleLabelNodeClick(d, n, t) {
+            this.queryParams.chooseItemStr = getNodeAllPath(n, null);
+            const loading = showLoading(this, "加载中,请稍候···");
+            if ((!d.children || d.children.length == 0) && (!d.leaves || d.leaves.length == 0)) {
+                let itemNames = [];
+                extractDataItemValues(n, itemNames);
+                let itemName = itemNames.reverse().join("!@");
+                this.queryParams.chooseItemStr = itemName;
+                this.getNextAllItem(this.dataSourceId, itemName, (data) => {
+                    //加载树
+                    d.children = data.children
+                    let leaves = data.leaves
+                    d.leaves = leaves
+                    //加载虚拟列表,叶节点
+                    this.leavesList = leaves
+                    this.leavesListF = leaves
+                    loading.close();
+                })
+            } else {
+                if (d.leaves) {
+                    let leaves = d.leaves
+                    this.leavesList = leaves
+                    this.leavesListF = leaves
+                }
+                loading.close();
+            }
+        },
+        /** 过滤叶节点事件 */
+        filterLeavesEvent(value) {
+            let arr = JSON.parse(JSON.stringify(this.leavesListF));
+            if (!value || !value.trim()) {
+                this.leavesList = arr;
+                return;
+            }
+            let filterList = arr.filter((v) => {
+                return v.itemName.indexOf(value) !== -1;
+            });
+            this.leavesList = filterList;
+        },
+        /** 全选叶节点事件 */
+        handleCheckAllLeavesChange(flag) {
+            this.$refs.pvc.checkedAll(flag);
+        },
+        /** 是否全部选中 */
+        checkChangeAllLeaves(flag) {
+            this.isSelectAllLeaves = flag;
+        },
+        /** 查看选中的所有叶节点状态,并将checked为true的填入到选中的叶节点中 */
+        checkChangeLeaves(datas) {
+            this.leavesChooseList = [];
+            if (!datas || datas.length == 0) {
+                return;
+            }
+            datas.forEach((data) => {
+                if (data.checked) {
+                    this.leavesChooseList.push(data);
+                }
+            });
+        },
+        /** 将选择的叶节点添加到右边,成为数据项 */
+        addCheckNodesBtnEvent() {
+            // 根据当前选择节点拼接为:XXXX.XXXX.XXX
+            let chooseChannelNameList = [];
+            if (this.leavesChooseList.length == 0) {
+                this.$message({
+                    message: '请选择数据项!',
+                    type: 'warning'
+                });
+                return;
+            }
+            for (let i = 0; i < this.leavesChooseList.length; i++) {
+                let temp = {
+                    nodeIdentifier: null,
+                    dataType: this.leavesChooseList[i].dataType,
+                    label: this.leavesChooseList[i].fullPath,
+                    nodeIndex: this.leavesChooseList[i].nodeIndex,
+                    itemName: this.leavesChooseList[i].fullPath,
+                    // itemName: this.leavesChooseList[i].itemName,
+                    itemReadName: this.leavesChooseList[i].itemReadName,
+                    value: this.leavesChooseList[i].itemReadName,
+                    checked: false,
+                };
+                chooseChannelNameList.push(temp);
+            }
+            // 去重
+            let arr = JSON.parse(JSON.stringify(this.chooseItemDataListByTree));
+            if (arr.length == 0) {
+                arr = chooseChannelNameList;
+            } else {
+                let status = false;
+                for (let i in chooseChannelNameList) {
+                    let flag = false;
+                    for (let j in arr) {
+                        let tName = arr[j].label ? arr[j].label : arr[j].itemName;
+                        if (chooseChannelNameList[i].label == tName) {
+                            flag = true;
+                            if (!status) {
+                                status = true;
+                            }
+                            break;
+                        }
+                    }
+                    if (!flag) {
+                        arr.push(chooseChannelNameList[i]);
+                    }
+                }
+                if (status) {
+                    this.$message({
+                        message: '请注意,选择的数据项中含有重复的项',
+                        type: 'warning'
+                    });
+                }
+            }
+            this.handleCheckAllLeavesChange(false);
+            this.$nextTick(() => {
+                this.chooseItemDataListByTree = arr;
+                this.isSelectAllItem = false;
+                this.isSelectAllLeaves = false;
+                this.leavesChooseList = [];
+                this.$refs.itemTree.setCheckedKeys([]);
+            });
+        },
+        /** 将右边选择的数据项移除 */
+        removeCheckNodesBtnEvent() {
+            let _temp = this.chooseItemDataListByTree;
+            if (!_temp || _temp.length == 0) {
+                return;
+            }
+            for (let i = _temp.length - 1; i >= 0; i--) {
+                if (_temp[i].checked) {
+                    this.chooseItemDataListByTree.splice(i, 1);
+                }
+            }
+
+            // 重置选择
+            this.isSelectAllItem = false;
+            this.$refs.itemTree.setCheckedKeys([]);
+            this.selectAllItem(false);
+        },
+        /** 将右边所有的数据项移除 */
+        removeAllCheckNodesBtnEvent() {
+            if (this.chooseItemDataListByTree.length == 0) {
+                return;
+            }
+            this.isSelectAllItem = false;
+            this.chooseItemDataListByTree = [];
+        },
+        /** 数据项全选事件 */
+        selectAllItem(val) {
+            this.$refs.pvcChoose.checkedAll(val);
+        },
+        /** 是否全部选中监听器 */
+        checkChangeAllChoose(flag) {
+            this.isSelectAllItem = flag;
+        },
+        /** 选中的数据项信息 */
+        checkChangeChoose(datas) {
+            this.chooseItemDataListByTree = datas;
+        },
+        /** 复合筛选 */
+        getCompositeScreen() {
+            const loading = showLoading(this, "筛选中,请稍候···");
+            let params = {};
+            params.id = this.queryParams.id
+            params.chooseItemStr = this.queryParams.chooseItemStr
+            params.needItemStr = JSON.stringify(this.queryParams.needItemStr)
+            //得到选择的所有节点
+            const treeArr = this.$refs.itemTree.getCheckedNodes();
+            const treeQ = document.getElementsByClassName('el-tree cy-group-tree el-tree--highlight-current')[0]
+                .getElementsByClassName('el-tree-node__content');
+            let seTreeArr = []
+            //赛选出需要的节点
+            if (treeArr.length > 0) {
+                for (let i = 0; i < treeQ.length; i++) {
+                    const parentClass = treeQ[i].parentElement.classList;
+                    if (parentClass.contains('is-current') && !parentClass.contains('is-hidden')) {
+                        // 选择的层级
+                        let treechild = treeQ[i].nextElementSibling.getElementsByClassName('el-tree-node__content');
+                        for (let j = 0; j < treechild.length; j++) {
+                            const clz = treechild[j].parentElement.classList;
+                            if (clz.contains('is-checked') && !clz.contains('is-hidden')) {
+                                seTreeArr.push(treechild[j].textContent)
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+            params.nextItemStr = JSON.stringify(seTreeArr)
+            if (!seTreeArr || seTreeArr.length == 0) {
+                this.$message({
+                    message: '节点选择为空',
+                    type: 'warning'
+                });
+                return
+            }
+            if (!this.queryParams.needItemStr || this.queryParams.needItemStr.length == 0) {
+                this.$message({
+                    message: '复合筛选属性不能为空',
+                    type: 'warning'
+                });
+                return
+            }
+            getCompositeScreen(params).then((res) => {
+                if (res.code === 200) {
+                    let treeData = this.chooseItemDataListByTree ? this.chooseItemDataListByTree : [];
+                    if (res.data && res.data.length > 0) {
+                        let lodArr = [];
+                        for (let j = 0; j < res.data.length; j++) {
+                            lodArr.push(res.data[j].label ? res.data[j].label : res.data[j].itemName);
+                        }
+                        let status = false;
+                        let idArr = {}
+                        for (let i = 0; i < treeData.length; i++) {
+                            if (lodArr.indexOf(treeData[i].label) !== -1) {
+                                idArr[lodArr.indexOf(treeData[i].label)] = '1'
+                            }
+                        }
+                        for (let j = 0; j < res.data.length; j++) {
+                            if (!idArr[j]) {
+                                treeData.push(res.data[j])
+                            } else {
+                                status = true;
+                            }
+                        }
+                        if (status) {
+                            this.$message({
+                                message: '请注意,选择的数据项中含有重复的项',
+                                type: 'warning'
+                            });
+                        }
+                    }
+
+                    this.checkChangeAllLeaves(false);
+                    this.$nextTick(() => {
+                        this.chooseItemDataListByTree = treeData;
+                        this.isSelectAllItem = false;
+                        this.isSelectAllLeaves = false;
+                        this.leavesChooseList = [];
+                        this.queryParams.needItemStr = [];
+                        this.$refs.itemTree.setCheckedKeys([]);
+                        this.$refs.itemTree.setCheckedNodes([]);
+                    });
+                    if (!res.data || res.data.length === 0) {
+                        this.$message({
+                            message: '没有筛选出符合条件的数据项,请重新筛选',
+                            type: 'warning'
+                        });
+                    }
+                    loading.close()
+                }
+            });
+        },
+        /** 查询所有模型数据 */
+        getAllDataModel() {
+            let queryParams = {
+                page: 1,
+                limit: 9999,
+                operationRule: null
+            }
+            getAllDataModel(queryParams).then(res => {
+                if (!res || !res.data) {
+                    this.$message({
+                        message: '数据查询失败!',
+                        type: 'warning'
+                    })
+                    return
+                }
+                this.dataModelList = res.data.dataModelList
+            })
+        }
+    }
+}
+</script>
+
+<style rel="stylesheet/scss" lang="scss" scoped>
+@import './itemChooseTree.css';
+
+.dialog-max {
+    height: 85vh;
+
+    .el-dialog__body {
+        height: 72vh;
+        overflow: hidden;
+    }
+}
+</style>

+ 3 - 0
chuanyi_client/src/main.js

@@ -3,6 +3,8 @@ import Cookies from 'js-cookie';
 import Element from 'element-ui';
 import splitPane from 'vue-splitpane';
 import UmyUi from 'umy-ui';
+/** 虚拟树 */
+import { Tree as virtualTree } from '@femessage/element-ui'
 
 import '@/assets/styles/element-variables.scss';
 import 'font-awesome/css/font-awesome.css';
@@ -16,6 +18,7 @@ import router from './router';
 import store from './store';
 import '@/utils/directives';
 
+Vue.component('virtualTree', virtualTree)
 Vue.component('split-pane', splitPane);
 
 Vue.use(UmyUi);

+ 36 - 2
chuanyi_client/src/utils/cqcy.js

@@ -256,6 +256,24 @@ export function showLoading(_this, tips) {
 }
 
 /**
+ * 创建加载框
+ * @param tips
+ * @returns {Promise<*>}
+ */
+export function showLoadingTime(_this, tips,time) {
+    const loading = _this.$loading({
+        lock: true,
+        text: tips ? tips : '加载中···',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+    });
+    setTimeout(() => {
+        if (loading) loading.close()
+    }, time)
+    return loading
+}
+
+/**
  * HOST 地址验证
  * @param url
  * @returns {boolean}
@@ -626,7 +644,6 @@ export function gotoPage(_this, _path, _query) {
 export function checkReportChangeStatus() {
     let len = getLuckysheetConfig() ? getLuckysheetConfig().length : 0
     let lastLen = localStorage.getItem('REPORT_LEN') ? parseInt(localStorage.getItem('REPORT_LEN')) : 0
-    console.log(len, lastLen)
     if (len > 0 && lastLen > 0 && len != lastLen) {
         if (len < lastLen || len - lastLen > 20)
             return true
@@ -671,4 +688,21 @@ export function withDateFormatLength(listDate) {
         arr.push(date.substring(0, 19))
     })
     return arr
-}
+}
+
+/**
+ * 数据组获取父级标签
+ * @param obj
+ * @param arr
+ */
+export function getNodeAllPath(node, str) {
+    if (str) {
+      str = node.data.label + "." + str
+    } else {
+      str = node.data.label
+    }
+    if (node.parent && node.parent.parent) {
+      str = getNodeAllPath(node.parent, str)
+    }
+    return str;
+  }

+ 0 - 5
chuanyi_client/src/utils/request.js

@@ -37,7 +37,6 @@ service.interceptors.request.use(config => {
     if (sysHost) {
         config.baseURL = sysHost
     }
-    console.log(config.baseURL)
     // get请求映射params参数
     if (config.method === 'get' && config.params) {
         let url = config.url + '?' + tansParams(config.params);
@@ -63,7 +62,6 @@ service.interceptors.request.use(config => {
             const interval = 1000;                         // 间隔时间(ms),小于此时间视为重复提交
             if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
                 const message = cqcyCode[901];
-                console.warn(`[${s_url}]: ` + message)
                 // return Promise.reject(new Error(message))
                 return  Promise.reject(message)
             } else {
@@ -75,7 +73,6 @@ service.interceptors.request.use(config => {
     }
     return config
 }, error => {
-    console.log(error)
     Promise.reject(error)
 })
 
@@ -142,7 +139,6 @@ service.interceptors.response.use(res => {
         //     type: 'error',
         //     duration: 5 * 1000
         // })
-        console.warn(message)
         return Promise.reject(message)
     }
 )
@@ -174,7 +170,6 @@ export function download(url, params, filename, config) {
         }
         downloadLoadingInstance.close();
     }).catch((r) => {
-        console.error(r)
         Message.error(cqcyCode[902])
         downloadLoadingInstance.close();
     })

+ 686 - 0
chuanyi_client/src/views/group_item/index copy.vue

@@ -0,0 +1,686 @@
+<template>
+  <div class="cqcy-content" v-if="chooseGroupId">
+    <div style="margin-bottom: 10px;">
+      <span style="color: #474646; font-size: 14px;">数据组:</span>
+      <el-select v-model="chooseGroupId" disabled size="mini">
+        <el-option
+            v-for="dict in groupDataList"
+            :key="dict.id"
+            :label="dict.groupName"
+            :value="dict.id"
+        ></el-option>
+      </el-select>
+      <span style="margin-left: 20px; color: #474646; font-size: 14px;">数据项名称:</span>
+      <el-input placeholder="请输入数据项名称"
+                size="mini"
+                style="width: 200px;"
+                @input="itemChangeEvent"
+                v-model="filterItemText"
+                prefix-icon="el-icon-search">
+      </el-input>
+      <el-checkbox v-model="groupRunStatus" size="mini" style="margin-left: 20px;"
+                   @change="groupRunCheckboxEvent" title="固定每5秒刷新一次数据">实时数据</el-checkbox>
+      <el-button type="danger"
+                 v-show="!groupRunStatus"
+                 icon="el-icon-delete"
+                 size="mini"
+                 @click="multipleDelItemEvent"
+                 style="float: right;">批量删除</el-button>
+      <el-button type="primary"
+                 v-show="!groupRunStatus"
+                 icon="el-icon-s-tools"
+                 size="mini"
+                 @click="multipleModelItemEvent"
+                 style="float: right; margin-right: 15px;">批量设置表达式</el-button>
+      <el-button type="primary"
+                 v-show="!groupRunStatus"
+                 icon="el-icon-plus"
+                 size="mini"
+                 @click="addGroupItemEvent"
+                 style="float: right; margin-right: 5px;">添加数据项</el-button>
+    </div>
+    <u-table class="cy-group-items"
+             row-key="label"
+             use-virtual
+             :height="uTableHeight"
+             :data="itemDataList"
+             @selection-change="selectionLineChangeHandle"
+             @sort-change="sortChange"
+             :big-data-checkbox="true"
+             showBodyOverflow="title"
+             showHeaderOverflow="title"
+             border>
+      <u-table-column type="selection" width="55" align="center"/>
+      <u-table-column type="index" label="序号" width="60" fixed align="center"/>
+      <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center"/>
+      <template v-if="groupRunStatus">
+        <u-table-column prop="dataType" sortable="custom" label="数据项类型" align="center" width="120">
+        </u-table-column>
+        <u-table-column prop="operationRule" sortable="custom" label="表达式" align="center" width="150">
+          <template slot-scope="scope">
+            {{ scope.row.operationRule ? scope.row.operationRule : '默认值' }}
+          </template>
+        </u-table-column>
+        <u-table-column prop="quality" sortable="custom" label="质量" align="center" width="60">
+        </u-table-column>
+        <u-table-column prop="dataOrgValue" sortable="custom" label="原始数据值" align="center" width="120">
+          <template slot-scope="scope">
+            {{ (scope.row.dataOrgValue != null
+              && scope.row.dataOrgValue != 'undefined'
+              && scope.row.dataOrgValue != 'null') ? scope.row.dataOrgValue : '' }}
+          </template>
+        </u-table-column>
+        <u-table-column prop="dataValue" sortable="custom" label="计算值" align="center" width="100">
+          <template slot-scope="scope">
+            {{ (scope.row.dataValue != null
+              && scope.row.dataValue != 'undefined'
+              && scope.row.dataValue != 'null') ? scope.row.dataValue : '' }}
+          </template>
+        </u-table-column>
+        <u-table-column prop="dataSourceName" sortable="custom" label="数据源名称" align="center" width="180">
+        </u-table-column>
+        <u-table-column prop="createTime" sortable label="取值时间" align="center" width="180">
+        </u-table-column>
+      </template>
+      <template v-else>
+        <u-table-column prop="describe" sortable="custom" label="别名" align="center" width="150">
+          <template slot-scope="scope" v-if="scope.row.describe">
+            <!--          <el-tag type="primary" disable-transitions>{{ scope.row.describe }}</el-tag>-->
+            <span>{{ scope.row.describe }}</span>
+          </template>
+        </u-table-column>
+        <u-table-column prop="dataSourceName" sortable="custom" label="数据源名称" align="center" width="180">
+        </u-table-column>
+        <u-table-column prop="operationRule" sortable="custom" label="表达式" align="center" width="200">
+          <template slot-scope="scope">
+            {{ scope.row.operationRule ? scope.row.operationRule : '默认值' }}
+          </template>
+        </u-table-column>
+        <u-table-column label="操作" align="center" width="180">
+          <template slot-scope="scope">
+            <el-button type="text"
+                       size="small"
+                       icon="el-icon-edit"
+                       @click="handleClickByEdit(scope.row)">编辑</el-button>
+            <el-button type="text"
+                       size="small"
+                       icon="el-icon-delete"
+                       style="color: red;"
+                       @click="handleClickByDel(scope.row)">删除</el-button>
+          </template>
+        </u-table-column>
+      </template>
+    </u-table>
+
+    <!-- 修改数据项基础信息 -->
+    <el-dialog
+        title="修改数据项"
+        width="600px"
+        top="10vh"
+        center
+        v-dialog-drag
+        v-if="dialogItemVisible"
+        :before-close="dialogClose"
+        :visible.sync="dialogItemVisible"
+        :close-on-click-modal="false"
+        :append-to-body="true">
+      <el-form ref="itemForm" :model="itemForm" label-width="150px">
+        <el-form-item label="ID" prop="id" style="display: none;">
+          <el-input v-model='itemForm.id'
+                    type="text"
+                    auto-complete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="数据模型:" prop="dataModelId">
+          <el-select v-model="itemForm.dataModelId" filterable clearable placeholder="请选择表达式" style="width: 100%;">
+            <el-option
+                v-for="(item, index) in this.dataModelList"
+                :key="index"
+                :label="item.title"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数据项描述信息:" prop="describe">
+          <el-input v-model.trim='itemForm.describe'
+                    type="text"
+                    auto-complete="off"
+                    show-word-limit
+                    maxlength="20"
+                    placeholder="请输入描述信息"></el-input>
+        </el-form-item>
+<!--        <el-divider content-position="left" class="cy-divider">事件报表配置(以下任意一项配置为空都将会无效)</el-divider>-->
+<!--        <el-form-item label="事件驱动产生条件:" prop="eventMode">-->
+<!--          <el-radio-group v-model="itemForm.eventMode">-->
+<!--            <el-radio label="0">大于</el-radio>-->
+<!--            <el-radio label="1">小于</el-radio>-->
+<!--            <el-radio label="2">布尔类型</el-radio>-->
+<!--          </el-radio-group>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="阈值:" prop="eventValue">-->
+<!--          <el-input v-model="itemForm.eventValue" placeholder="请输入阈值" maxlength="8">-->
+<!--          </el-input>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="事件驱动报表:" prop="tableReportId">-->
+<!--          <el-select v-model="itemForm.tableReportId" filterable clearable-->
+<!--                     placeholder="请选择事件驱动报表" style="width: 100%;">-->
+<!--            <el-option-->
+<!--                v-for="(item, index) in this.eventReportList"-->
+<!--                :key="index"-->
+<!--                :label="item.reportTableName"-->
+<!--                :value="item.id">-->
+<!--            </el-option>-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
+      </el-form>
+      <span slot='footer'>
+        <el-button type="primary" @click="editConfirmEvent" style="margin-top: 20px;">确定</el-button>
+        <el-button @click="dialogClose" style="margin-top: 20px;">取消</el-button>
+      </span>
+    </el-dialog>
+
+    <el-dialog
+        title="选择表达式"
+        width="500px"
+        top="10vh"
+        center
+        v-dialog-drag
+        v-if="dialogDataModelVisible"
+        :before-close="dialogDataModelClose"
+        :visible.sync="dialogDataModelVisible"
+        :close-on-click-modal="false"
+        :append-to-body="true">
+      <el-select v-model="chooseDataModel" filterable clearable placeholder="请选择表达式" style="width: 100%;">
+        <el-option
+            v-for="(item, index) in this.dataModelList"
+            :key="index"
+            :label="item.title"
+            :value="item.id">
+        </el-option>
+      </el-select>
+      <div style="width: 100%; text-align: center; margin-top: 20px;">
+        <el-button type="primary" @click="saveDataModelEvent">确定</el-button>
+        <el-button @click="dialogDataModelClose">取消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 选择数据项 -->
+    <data-source-item ref="dataSourceItem" @update-message="updateDataItemEmit" :chooseGroup="chooseGroup"></data-source-item>
+
+  </div>
+</template>
+
+<script>
+import {
+  addItemList,
+  batchSetExpresses,
+  deleteItemByIdList,
+  getAllDataModel,
+  getItemById,
+  getItemGroupById,
+  getItemValueById,
+  updateItem
+} from "@/api/datasource";
+import {customCompare, showAlertMsgWin, showAlertWin, showConfirmWin, showLoading} from "@/utils/cqcy";
+import cqcyCode from "@/utils/cqcyCode";
+import DataSourceItem from "@/components/CustomDialog/DataSourceItem.vue";
+
+export default {
+  name: "index",
+  components: {
+    DataSourceItem
+  },
+  data() {
+    return {
+      dialogItemVisible: false,
+      dialogDataModelVisible: false,
+      itemDataList: [],
+      itemDataListF: [],
+      groupDataList: [],
+      dataModelList: [],
+      chooseDataModel: null,
+      selectionItems: [],
+      eventReportList: [],
+      chooseGroup: null,
+      chooseGroupId: null,
+      groupRunStatus: false,
+      timeInterval: null,
+      filterItemText: '',
+      uTableHeight: 500,
+      itemForm: {
+        id: null,
+        dataModelId: null,
+        // eventMode: null,
+        // eventValue: null,
+        // tableReportId: null,
+        describe: ''
+      }
+    }
+  },
+  watch: {
+    '$route'(to, from) {
+      this.readParams()
+    },
+    '$route.query.t': {
+      handler(o, n) {
+      }
+    },
+    deep: true
+  },
+  created() {
+    this.readParams()
+  },
+  beforeDestroy() {
+    if (this.timeInterval) {
+      clearInterval(this.timeInterval)
+      this.timeInterval = null
+    }
+    // sessionStorage.removeItem('GROUP_ID')
+  },
+  methods: {
+    sortChange({ prop, order }) {
+      this.itemDataList.sort(customCompare(prop, order))
+    },
+    itemChangeEvent(value) {
+      let arr = JSON.parse(JSON.stringify(this.itemDataListF))
+      if (!value || !value.trim()) {
+        this.itemDataList = arr
+        return
+      }
+      let filterList = arr.filter(v => {
+        return v.itemName.indexOf(value) !== -1
+      })
+      this.itemDataList = filterList
+    },
+    /** 读取参数 */
+    readParams() {
+      this.filterItemText = ''
+      // let groupListStorage = sessionStorage.getItem('GROUP_LIST') ? sessionStorage.getItem('GROUP_LIST') : '[]'
+      // this.groupDataList = JSON.parse(groupListStorage)
+      let groupId = sessionStorage.getItem('GROUP_ID') ? sessionStorage.getItem('GROUP_ID') : '-1'
+      this.chooseGroupId = parseInt(groupId)
+      this.groupRunStatus = false
+      this.getGroupById(this.chooseGroupId)
+      // this.getItemValueById()
+    },
+    /** 运行状态值 */
+    groupRunCheckboxEvent(val) {
+      this.groupRunStatus = val
+      this.getItemValueById()
+    },
+    /** 获取数据项值信息 */
+    getItemValueById() {
+      if (!this.groupRunStatus || !this.chooseGroup) {
+        this.filterItemText = ''
+        if (this.timeInterval) {
+          clearInterval(this.timeInterval)
+          this.timeInterval = null
+        }
+        this.getGroupById(this.chooseGroupId)
+        return
+      }
+      getItemValueById(this.chooseGroup.id).then(res => {
+        // this.filterItemText = ''
+        let list = res.data
+        if (!list) return
+        // 避免布尔类型时页面无法显示数据
+        for (let i = 0; i < list.length; i ++) {
+          list[i].dataValue += ''
+          list[i].quality += ''
+        }
+        if (this.filterItemText) {
+          let filterList = list.filter(v => {
+            return v.itemName.indexOf(this.filterItemText) !== -1
+          })
+          this.itemDataList = filterList
+        } else {
+          this.itemDataList = list
+        }
+        this.itemDataListF = JSON.parse(JSON.stringify(list))
+      }).catch((e) => {
+        showAlertWin(this, null, e)
+      })
+      let temp = setInterval(() => {
+        getItemValueById(this.chooseGroup.id).then(res => {
+          // this.filterItemText = ''
+          let list = res.data
+          // 避免布尔类型时页面无法显示数据
+          for (let i = 0; i < list.length; i ++) {
+            list[i].dataValue += ''
+            list[i].quality += ''
+          }
+          if (this.filterItemText) {
+            let filterList = list.filter(v => {
+              return v.itemName.indexOf(this.filterItemText) !== -1
+            })
+            this.itemDataList = filterList
+          } else {
+            this.itemDataList = list
+          }
+          this.itemDataListF = JSON.parse(JSON.stringify(list))
+        }).catch((e) => {
+          // showAlertWin(this, e)
+        })
+      }, 5 * 1000)
+      this.timeInterval = temp
+    },
+    setRowHeight() {
+      if ($('.cqcy-content') && $('.cqcy-content')[0]) {
+        this.uTableHeight = $('.cqcy-content')[0].offsetHeight - 100
+      }
+    },
+    /** 获取组详细信息 */
+    getGroupById(id) {
+      this.setRowHeight()
+      if (this.timeInterval) {
+        clearInterval(this.timeInterval)
+        this.timeInterval = null
+      }
+      if (!id || id <= 0) {
+        this.chooseGroupId = null
+        return
+      }
+      this.filterItemText = ''
+      const loading = showLoading(this, '加载中,请稍候···')
+      getItemGroupById(id).then(res => {
+        loading.close()
+        this.chooseGroup = res.data
+        this.groupDataList = [{
+          'id': this.chooseGroup.id,
+          'groupName': this.chooseGroup.groupName
+        }]
+        this.setRowHeight()
+        this.itemDataList = this.chooseGroup.itemList
+        this.itemDataListF = JSON.parse(JSON.stringify(this.itemDataList))
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 查询所有数据模型 */
+    getAllDataModel(callback) {
+      let loading = showLoading(this, '数据加载中,请稍候···')
+      let params = {
+        'page': 1,
+        'limit': 1000
+      }
+      getAllDataModel(params).then(res => {
+        loading.close()
+        this.dataModelList = res.data.dataModelList
+        for (let i = 0; i < this.dataModelList.length; i ++) {
+          this.dataModelList[i].title = this.dataModelList[i].remark
+              ? ('【' + this.dataModelList[i].remark + '】' + this.dataModelList[i].operationRule)
+              : this.dataModelList[i].operationRule
+        }
+        if (callback) callback(true)
+      }).catch((e) => {
+        loading.close()
+        if (callback) callback(false)
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 编辑 */
+    handleClickByEdit(row) {
+      let _this = this
+      if (!row || !row.id) {
+        showAlertMsgWin(_this, null, cqcyCode[201])
+        return
+      }
+      _this.getAllDataModel(status => {
+        if (!status) return
+        const loading = showLoading(_this, '加载中,请稍候···')
+        getItemById(row.id).then(res => {
+          loading.close()
+          if (res.data.runState == 1) {
+            showAlertMsgWin(this, null, '该数据组正在运行中,禁止修改!')
+            return
+          }
+          _this.$nextTick(() => {
+            _this.itemForm.id = row.id
+            _this.itemForm.dataModelId = res.data.dataModelId
+            _this.itemForm.describe = res.data.describe
+            // _this.itemForm.tableReportId = res.data.tableReportId
+            // _this.itemForm.eventMode = res.data.eventMode + ''
+            // _this.itemForm.eventValue = res.data.eventValue
+            _this.dialogItemVisible = true
+          })
+        }).catch((e) => {
+          loading.close()
+          showAlertWin(_this, null, e)
+        })
+        // let params = {
+        //   'page': 1,
+        //   'limit': 1000,
+        //   'isAutoReport': 3
+        // }
+        // getAllReportTable(params).then(res => {
+        //   let eventReportList = res.data.reportTableList
+        //   this.eventReportList = eventReportList
+        //   getItemById(row.id).then(res => {
+        //     loading.close()
+        //     _this.$nextTick(() => {
+        //       _this.itemForm.id = row.id
+        //       _this.itemForm.dataModelId = res.data.dataModelId
+        //       _this.itemForm.describe = res.data.describe
+        //       _this.itemForm.tableReportId = res.data.tableReportId
+        //       _this.itemForm.eventMode = res.data.eventMode + ''
+        //       _this.itemForm.eventValue = res.data.eventValue
+        //       _this.dialogItemVisible = true
+        //     })
+        //   }).catch((e) => {
+        //     loading.close()
+        //     showAlertWin(_this, e)
+        //   })
+        // }).catch((e) => {
+        //   loading.close()
+        //   showAlertWin(this, e)
+        // })
+      })
+    },
+    /** 编辑确认事件 */
+    editConfirmEvent() {
+      // if (this.itemForm.eventValue) {
+      //   let reg = /^(\-)?\d+(\.\d{1,2})?$/
+      //   if (!reg.test(this.itemForm.eventValue)) {
+      //     this.$message({
+      //       message: '阈值不合法',
+      //       type: 'warning'
+      //     })
+      //     return
+      //   }
+      //   if (this.itemForm.eventMode == '2' && this.itemForm.eventValue != 0 && this.itemForm.eventValue != 1) {
+      //     this.$message({
+      //       message: '布尔类型时阈值只能为0或者1',
+      //       type: 'warning'
+      //     })
+      //     return
+      //   }
+      // }
+      const loading = showLoading(this, '加载中,请稍候···')
+      // 若驱动报表事件任意一项为空,则清空报表事项
+      // if ((!this.itemForm.eventMode || this.itemForm.eventMode == 'null')
+      //     || (this.itemForm.eventValue == null || this.itemForm.eventValue == '')
+      //     || !this.itemForm.tableReportId) {
+      //   this.itemForm.eventMode = null
+      //   this.itemForm.eventValue = null
+      //   this.itemForm.tableReportId = null
+      // }
+      let params = JSON.parse(JSON.stringify(this.itemForm))
+      updateItem(params).then(res => {
+        loading.close()
+        let msg = res.data ? '编辑成功!' : '编辑失败!'
+        showAlertMsgWin(this, null, msg)
+        this.dialogItemVisible = false
+        this.getGroupById(this.chooseGroupId)
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 删除数据项 */
+    delItems(ids) {
+      if (ids.length === this.itemDataListF.length) {
+        showAlertMsgWin(this, null, '至少保留一项数据项信息!')
+        return
+      }
+      const loading = showLoading(this, '删除中,请稍候···')
+      deleteItemByIdList(ids).then(res => {
+        loading.close()
+        let msg = res.data ? '删除成功!' : '删除失败!'
+        showAlertMsgWin(this, null, msg)
+        this.getGroupById(this.chooseGroupId)
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 删除 */
+    handleClickByDel(row) {
+      if (!row || !row.id) {
+        showAlertMsgWin(this, null, cqcyCode[201])
+        return
+      }
+      if (this.chooseGroup && this.chooseGroup.runState == 1) {
+        showAlertMsgWin(this, null, '该数据组正在运行中,禁止删除!')
+        return
+      }
+      showConfirmWin(this, null, '您确定要删除该数据项吗?', () => {
+        this.delItems([row.id])
+      })
+    },
+    /** 多选事件 */
+    selectionLineChangeHandle(val) {
+      this.selectionItems = val
+    },
+    /** 批量设置组数据中数据项表达式 */
+    multipleModelItemEvent() {
+      if (!this.selectionItems || this.selectionItems.length == 0) {
+        showAlertMsgWin(this, null, '请至少选择一项数据!')
+        return
+      }
+      if (this.chooseGroup && this.chooseGroup.runState == 1) {
+        showAlertMsgWin(this, null, '该数据组正在运行中,禁止修改!')
+        return
+      }
+      this.getAllDataModel(status => {
+        this.dialogDataModelVisible = true
+      })
+    },
+    /** 添加数据项 */
+    addGroupItemEvent() {
+        const loading = showLoading(this, '加载中,请稍候···')
+        getItemGroupById(this.chooseGroupId).then(res => {
+            loading.close()
+            if (res.data.runState == 1) {
+                showAlertMsgWin(this, null, '该数据组正在运行中,禁止添加数据项!')
+            } else {
+                this.$refs.dataSourceItem.show()
+            }
+        }).catch((e) => {
+            loading.close()
+            showAlertWin(this, null, e)
+        })
+    },
+    /** 批量设置组数据中数据项表达式 */
+    saveDataModelEvent() {
+      // let ids = Array.from(this.selectionItems, ({ id }) => id)
+      let itemList = []
+      this.selectionItems.forEach((item) => {
+        itemList.push({
+          'id': item.id,
+          'itemGroupId': item.itemGroupId,
+          'dataModelId': this.chooseDataModel
+        })
+      })
+      let params = {
+        'itemList': itemList
+      }
+      const loading = showLoading(this, '设置中,请稍候···')
+      batchSetExpresses(params).then(res => {
+        loading.close()
+        let msg = res.data ? '设置成功!' : '设置失败!'
+        showAlertMsgWin(this, null, msg)
+        this.dialogDataModelVisible = false
+        this.selectionItems = []
+        this.chooseDataModel = null
+        this.getGroupById(this.chooseGroupId)
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 批量删除组数据中数据项 */
+    multipleDelItemEvent() {
+      if (!this.selectionItems || this.selectionItems.length == 0) {
+        showAlertMsgWin(this, null, '请至少选择一项数据!')
+        return
+      }
+      if (this.chooseGroup && this.chooseGroup.runState == 1) {
+        showAlertMsgWin(this, null, '该数据组正在运行中,禁止删除!')
+        return
+      }
+      showConfirmWin(this, null, '您确定要删除已选择数据项吗?', () => {
+        let ids = Array.from(this.selectionItems, ({ id }) => id)
+        this.delItems(ids)
+      })
+    },
+    /** 更新已选择数据项 */
+    updateDataItemEmit(items) {
+      let params = {
+        'id': this.chooseGroup.id,
+        'itemList': items
+      }
+      const loading = showLoading(this, '添加中,请稍候···')
+      addItemList(params).then(res => {
+        loading.close()
+        let msg = res.data ? '设置成功!' : '设置失败!'
+        showAlertMsgWin(this, null, msg)
+        this.dialogDataModelVisible = false
+        this.selectionItems = []
+        this.chooseDataModel = null
+        this.getGroupById(this.chooseGroupId)
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
+    },
+    /** 弹出层关闭事件 */
+    dialogClose(done) {
+      if (this.$refs['itemForm']) {
+        this.$refs['itemForm'].resetFields()
+      }
+      if (typeof (done) === 'function') {
+        done()
+      } else {
+        this.dialogItemVisible = false
+      }
+    },
+    /** 数据模型弹出层关闭事件 */
+    dialogDataModelClose(done) {
+      if (typeof(done) === 'function') {
+        done()
+      } else {
+        this.dialogDataModelVisible = false
+      }
+    },
+  }
+}
+</script>
+
+<style rel="stylesheet/scss" lang="scss">
+.el-table--enable-row-hover .el-table__body tr:hover > td {
+  background-color: transparent !important;
+}
+
+.cy-divider {
+  margin-top: 50px;
+  .el-divider__text {
+    font-size: 12px;
+    color: #5e5e5e;
+  }
+}
+
+.cy-group-items {
+  margin-top: 10px;
+  height: calc(100% - 100px);
+}
+</style>

+ 77 - 140
chuanyi_client/src/views/group_item/index.vue

@@ -3,56 +3,27 @@
     <div style="margin-bottom: 10px;">
       <span style="color: #474646; font-size: 14px;">数据组:</span>
       <el-select v-model="chooseGroupId" disabled size="mini">
-        <el-option
-            v-for="dict in groupDataList"
-            :key="dict.id"
-            :label="dict.groupName"
-            :value="dict.id"
-        ></el-option>
+        <el-option v-for="dict in groupDataList" :key="dict.id" :label="dict.groupName" :value="dict.id"></el-option>
       </el-select>
       <span style="margin-left: 20px; color: #474646; font-size: 14px;">数据项名称:</span>
-      <el-input placeholder="请输入数据项名称"
-                size="mini"
-                style="width: 200px;"
-                @input="itemChangeEvent"
-                v-model="filterItemText"
-                prefix-icon="el-icon-search">
+      <el-input placeholder="请输入数据项名称" size="mini" style="width: 200px;" @input="itemChangeEvent" v-model="filterItemText"
+        prefix-icon="el-icon-search">
       </el-input>
-      <el-checkbox v-model="groupRunStatus" size="mini" style="margin-left: 20px;"
-                   @change="groupRunCheckboxEvent" title="固定每5秒刷新一次数据">实时数据</el-checkbox>
-      <el-button type="danger"
-                 v-show="!groupRunStatus"
-                 icon="el-icon-delete"
-                 size="mini"
-                 @click="multipleDelItemEvent"
-                 style="float: right;">批量删除</el-button>
-      <el-button type="primary"
-                 v-show="!groupRunStatus"
-                 icon="el-icon-s-tools"
-                 size="mini"
-                 @click="multipleModelItemEvent"
-                 style="float: right; margin-right: 15px;">批量设置表达式</el-button>
-      <el-button type="primary"
-                 v-show="!groupRunStatus"
-                 icon="el-icon-plus"
-                 size="mini"
-                 @click="addGroupItemEvent"
-                 style="float: right; margin-right: 5px;">添加数据项</el-button>
+      <el-checkbox v-model="groupRunStatus" size="mini" style="margin-left: 20px;" @change="groupRunCheckboxEvent"
+        title="固定每5秒刷新一次数据">实时数据</el-checkbox>
+      <el-button type="danger" v-show="!groupRunStatus" icon="el-icon-delete" size="mini" @click="multipleDelItemEvent"
+        style="float: right;">批量删除</el-button>
+      <el-button type="primary" v-show="!groupRunStatus" icon="el-icon-s-tools" size="mini"
+        @click="multipleModelItemEvent" style="float: right; margin-right: 15px;">批量设置表达式</el-button>
+      <el-button type="primary" v-show="!groupRunStatus" icon="el-icon-plus" size="mini" @click="addGroupItemEvent"
+        style="float: right; margin-right: 5px;">添加数据项</el-button>
     </div>
-    <u-table class="cy-group-items"
-             row-key="label"
-             use-virtual
-             :height="uTableHeight"
-             :data="itemDataList"
-             @selection-change="selectionLineChangeHandle"
-             @sort-change="sortChange"
-             :big-data-checkbox="true"
-             showBodyOverflow="title"
-             showHeaderOverflow="title"
-             border>
-      <u-table-column type="selection" width="55" align="center"/>
-      <u-table-column type="index" label="序号" width="60" fixed align="center"/>
-      <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center"/>
+    <u-table class="cy-group-items" row-key="label" use-virtual :height="uTableHeight" :data="itemDataList"
+      @selection-change="selectionLineChangeHandle" @sort-change="sortChange" :big-data-checkbox="true"
+      showBodyOverflow="title" showHeaderOverflow="title" border>
+      <u-table-column type="selection" width="55" align="center" />
+      <u-table-column type="index" label="序号" width="60" fixed align="center" />
+      <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center" />
       <template v-if="groupRunStatus">
         <u-table-column prop="dataType" sortable="custom" label="数据项类型" align="center" width="120">
         </u-table-column>
@@ -98,79 +69,54 @@
         </u-table-column>
         <u-table-column label="操作" align="center" width="180">
           <template slot-scope="scope">
-            <el-button type="text"
-                       size="small"
-                       icon="el-icon-edit"
-                       @click="handleClickByEdit(scope.row)">编辑</el-button>
-            <el-button type="text"
-                       size="small"
-                       icon="el-icon-delete"
-                       style="color: red;"
-                       @click="handleClickByDel(scope.row)">删除</el-button>
+            <el-button type="text" size="small" icon="el-icon-edit" @click="handleClickByEdit(scope.row)">编辑</el-button>
+            <el-button type="text" size="small" icon="el-icon-delete" style="color: red;"
+              @click="handleClickByDel(scope.row)">删除</el-button>
           </template>
         </u-table-column>
       </template>
     </u-table>
 
     <!-- 修改数据项基础信息 -->
-    <el-dialog
-        title="修改数据项"
-        width="600px"
-        top="10vh"
-        center
-        v-dialog-drag
-        v-if="dialogItemVisible"
-        :before-close="dialogClose"
-        :visible.sync="dialogItemVisible"
-        :close-on-click-modal="false"
-        :append-to-body="true">
+    <el-dialog title="修改数据项" width="600px" top="10vh" center v-dialog-drag v-if="dialogItemVisible"
+      :before-close="dialogClose" :visible.sync="dialogItemVisible" :close-on-click-modal="false" :append-to-body="true">
       <el-form ref="itemForm" :model="itemForm" label-width="150px">
         <el-form-item label="ID" prop="id" style="display: none;">
-          <el-input v-model='itemForm.id'
-                    type="text"
-                    auto-complete="off"></el-input>
+          <el-input v-model='itemForm.id' type="text" auto-complete="off"></el-input>
         </el-form-item>
         <el-form-item label="数据模型:" prop="dataModelId">
           <el-select v-model="itemForm.dataModelId" filterable clearable placeholder="请选择表达式" style="width: 100%;">
-            <el-option
-                v-for="(item, index) in this.dataModelList"
-                :key="index"
-                :label="item.title"
-                :value="item.id">
+            <el-option v-for="(item, index) in this.dataModelList" :key="index" :label="item.title" :value="item.id">
             </el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="数据项描述信息:" prop="describe">
-          <el-input v-model.trim='itemForm.describe'
-                    type="text"
-                    auto-complete="off"
-                    show-word-limit
-                    maxlength="20"
-                    placeholder="请输入描述信息"></el-input>
+          <el-input v-model.trim='itemForm.describe' type="text" auto-complete="off" show-word-limit maxlength="20"
+            placeholder="请输入描述信息"></el-input>
         </el-form-item>
-<!--        <el-divider content-position="left" class="cy-divider">事件报表配置(以下任意一项配置为空都将会无效)</el-divider>-->
-<!--        <el-form-item label="事件驱动产生条件:" prop="eventMode">-->
-<!--          <el-radio-group v-model="itemForm.eventMode">-->
-<!--            <el-radio label="0">大于</el-radio>-->
-<!--            <el-radio label="1">小于</el-radio>-->
-<!--            <el-radio label="2">布尔类型</el-radio>-->
-<!--          </el-radio-group>-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="阈值:" prop="eventValue">-->
-<!--          <el-input v-model="itemForm.eventValue" placeholder="请输入阈值" maxlength="8">-->
-<!--          </el-input>-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="事件驱动报表:" prop="tableReportId">-->
-<!--          <el-select v-model="itemForm.tableReportId" filterable clearable-->
-<!--                     placeholder="请选择事件驱动报表" style="width: 100%;">-->
-<!--            <el-option-->
-<!--                v-for="(item, index) in this.eventReportList"-->
-<!--                :key="index"-->
-<!--                :label="item.reportTableName"-->
-<!--                :value="item.id">-->
-<!--            </el-option>-->
-<!--          </el-select>-->
-<!--        </el-form-item>-->
+        <!--        <el-divider content-position="left" class="cy-divider">事件报表配置(以下任意一项配置为空都将会无效)</el-divider>-->
+        <!--        <el-form-item label="事件驱动产生条件:" prop="eventMode">-->
+        <!--          <el-radio-group v-model="itemForm.eventMode">-->
+        <!--            <el-radio label="0">大于</el-radio>-->
+        <!--            <el-radio label="1">小于</el-radio>-->
+        <!--            <el-radio label="2">布尔类型</el-radio>-->
+        <!--          </el-radio-group>-->
+        <!--        </el-form-item>-->
+        <!--        <el-form-item label="阈值:" prop="eventValue">-->
+        <!--          <el-input v-model="itemForm.eventValue" placeholder="请输入阈值" maxlength="8">-->
+        <!--          </el-input>-->
+        <!--        </el-form-item>-->
+        <!--        <el-form-item label="事件驱动报表:" prop="tableReportId">-->
+        <!--          <el-select v-model="itemForm.tableReportId" filterable clearable-->
+        <!--                     placeholder="请选择事件驱动报表" style="width: 100%;">-->
+        <!--            <el-option-->
+        <!--                v-for="(item, index) in this.eventReportList"-->
+        <!--                :key="index"-->
+        <!--                :label="item.reportTableName"-->
+        <!--                :value="item.id">-->
+        <!--            </el-option>-->
+        <!--          </el-select>-->
+        <!--        </el-form-item>-->
       </el-form>
       <span slot='footer'>
         <el-button type="primary" @click="editConfirmEvent" style="margin-top: 20px;">确定</el-button>
@@ -178,23 +124,11 @@
       </span>
     </el-dialog>
 
-    <el-dialog
-        title="选择表达式"
-        width="500px"
-        top="10vh"
-        center
-        v-dialog-drag
-        v-if="dialogDataModelVisible"
-        :before-close="dialogDataModelClose"
-        :visible.sync="dialogDataModelVisible"
-        :close-on-click-modal="false"
-        :append-to-body="true">
+    <el-dialog title="选择表达式" width="500px" top="10vh" center v-dialog-drag v-if="dialogDataModelVisible"
+      :before-close="dialogDataModelClose" :visible.sync="dialogDataModelVisible" :close-on-click-modal="false"
+      :append-to-body="true">
       <el-select v-model="chooseDataModel" filterable clearable placeholder="请选择表达式" style="width: 100%;">
-        <el-option
-            v-for="(item, index) in this.dataModelList"
-            :key="index"
-            :label="item.title"
-            :value="item.id">
+        <el-option v-for="(item, index) in this.dataModelList" :key="index" :label="item.title" :value="item.id">
         </el-option>
       </el-select>
       <div style="width: 100%; text-align: center; margin-top: 20px;">
@@ -204,7 +138,8 @@
     </el-dialog>
 
     <!-- 选择数据项 -->
-    <data-source-item ref="dataSourceItem" @update-message="updateDataItemEmit" :chooseGroup="chooseGroup"></data-source-item>
+    <data-source-item ref="dataSourceItem" @update-message="updateDataItemEmit"
+      :chooseGroup="chooseGroup"></data-source-item>
 
   </div>
 </template>
@@ -220,7 +155,7 @@ import {
   getItemValueById,
   updateItem
 } from "@/api/datasource";
-import {customCompare, showAlertMsgWin, showAlertWin, showConfirmWin, showLoading} from "@/utils/cqcy";
+import { customCompare, showAlertMsgWin, showAlertWin, showConfirmWin, showLoading } from "@/utils/cqcy";
 import cqcyCode from "@/utils/cqcyCode";
 import DataSourceItem from "@/components/CustomDialog/DataSourceItem.vue";
 
@@ -323,7 +258,7 @@ export default {
         let list = res.data
         if (!list) return
         // 避免布尔类型时页面无法显示数据
-        for (let i = 0; i < list.length; i ++) {
+        for (let i = 0; i < list.length; i++) {
           list[i].dataValue += ''
           list[i].quality += ''
         }
@@ -344,7 +279,7 @@ export default {
           // this.filterItemText = ''
           let list = res.data
           // 避免布尔类型时页面无法显示数据
-          for (let i = 0; i < list.length; i ++) {
+          for (let i = 0; i < list.length; i++) {
             list[i].dataValue += ''
             list[i].quality += ''
           }
@@ -406,10 +341,10 @@ export default {
       getAllDataModel(params).then(res => {
         loading.close()
         this.dataModelList = res.data.dataModelList
-        for (let i = 0; i < this.dataModelList.length; i ++) {
+        for (let i = 0; i < this.dataModelList.length; i++) {
           this.dataModelList[i].title = this.dataModelList[i].remark
-              ? ('【' + this.dataModelList[i].remark + '】' + this.dataModelList[i].operationRule)
-              : this.dataModelList[i].operationRule
+            ? ('【' + this.dataModelList[i].remark + '】' + this.dataModelList[i].operationRule)
+            : this.dataModelList[i].operationRule
         }
         if (callback) callback(true)
       }).catch((e) => {
@@ -567,18 +502,19 @@ export default {
     },
     /** 添加数据项 */
     addGroupItemEvent() {
-        const loading = showLoading(this, '加载中,请稍候···')
-        getItemGroupById(this.chooseGroupId).then(res => {
-            loading.close()
-            if (res.data.runState == 1) {
-                showAlertMsgWin(this, null, '该数据组正在运行中,禁止添加数据项!')
-            } else {
-                this.$refs.dataSourceItem.show()
-            }
-        }).catch((e) => {
-            loading.close()
-            showAlertWin(this, null, e)
-        })
+      const loading = showLoading(this, '加载中,请稍候···')
+      getItemGroupById(this.chooseGroupId).then(res => {
+        loading.close()
+        if (res.data.runState == 1) {
+          showAlertMsgWin(this, null, '该数据组正在运行中,禁止添加数据项!')
+        } else {
+          this.$refs.dataSourceItem.groupBasicForm.itemList = res.data.itemList
+          this.$refs.dataSourceItem.show()
+        }
+      }).catch((e) => {
+        loading.close()
+        showAlertWin(this, null, e)
+      })
     },
     /** 批量设置组数据中数据项表达式 */
     saveDataModelEvent() {
@@ -656,7 +592,7 @@ export default {
     },
     /** 数据模型弹出层关闭事件 */
     dialogDataModelClose(done) {
-      if (typeof(done) === 'function') {
+      if (typeof (done) === 'function') {
         done()
       } else {
         this.dialogDataModelVisible = false
@@ -667,12 +603,13 @@ export default {
 </script>
 
 <style rel="stylesheet/scss" lang="scss">
-.el-table--enable-row-hover .el-table__body tr:hover > td {
+.el-table--enable-row-hover .el-table__body tr:hover>td {
   background-color: transparent !important;
 }
 
 .cy-divider {
   margin-top: 50px;
+
   .el-divider__text {
     font-size: 12px;
     color: #5e5e5e;

+ 49 - 5
chuanyi_client/src/views/my_report/index.vue

@@ -70,9 +70,22 @@
                 prop="createTime"
                 width="200">
             </el-table-column>
-            <el-table-column v-if="false" label="操作" align="center" width="380">
+            <el-table-column label="操作" align="center" width="380">
               <template slot-scope="scope">
-                <el-button type="text"
+                <el-button
+                  type="text"
+                  v-if="
+                    uid == scope.row.userId &&
+                    (scope.row.reportTableType == 1
+                    ||scope.row.reportTableType == 2||
+                    scope.row.reportTableType == 5) 
+                  "
+                  size="small"
+                  icon="el-icon-setting"
+                  @click="tableHistoryReport(scope.row.id)"
+                  >运行记录
+                </el-button>
+                <!-- <el-button type="text"
                            v-if="uid == scope.row.userId"
                            size="small"
                            icon="el-icon-edit"
@@ -108,7 +121,7 @@
                            icon="el-icon-delete"
                            style="color: red;"
                            @click="removeReportItem(scope.row)">删除
-                </el-button>
+                </el-button> -->
               </template>
             </el-table-column>
           </el-table>
@@ -514,10 +527,14 @@
          style="display: none;position: absolute;z-index: 0;top: 0;width: 100%;height: 100vh;overflow: hidden;">
       <div id="print-html" ref="printPayFeeNew"></div>
     </div>
+
+    <!-- 报表运行记录table弹出层 -->
+    <History ref="history"></History>
   </div>
 </template>
 
 <script>
+import History from '@/views/run_config/historyReport.vue';
 import BreadcrumbView from '@/components/BreadcrumbView'
 import {
   customCompare,
@@ -557,7 +574,8 @@ import { print } from "@/utils/print.js";
 export default {
   name: "index",
   components: {
-    BreadcrumbView
+    BreadcrumbView,
+    History
   },
   computed: {
     ...mapGetters([
@@ -565,6 +583,17 @@ export default {
       'uid'
     ])
   },
+  beforeRouteEnter(to, from, next) {
+    next(vm => {
+      vm.pathUrl = from.fullPath
+      if(from.path=='/showReport'){
+        //如果是从展示报表中,且为运行记录,则默认打开原本的弹出层
+        if(to.query.type&&to.query.type=='history'){
+          vm.tableHistoryReport(to.query.mainReportTableId)
+        }
+      }
+    })
+  },
   data() {
     return {
       breadcrumbList: ['我的报表'],
@@ -1765,7 +1794,16 @@ export default {
         }
         return
       }
-      const loading = showLoading(this, '加载中,请稍候···')
+      // const loading = showLoading(this, '加载中,请稍候···')
+      const loading = this.$loading({
+        lock: true,
+        text: '加载中,请稍候···',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0)'
+      });
+      setTimeout(() => {
+          if (loading) loading.close()
+      }, 30 * 1000)
       getReportTableById(this.chooseMyReport.id).then(res => {
         let _data = res.data
         if (!_data) {
@@ -2225,6 +2263,12 @@ export default {
         }, 500)
       }
     },
+    /** 从表格操作进入的运行记录 */
+    tableHistoryReport(id){
+      this.$refs.history.mainReportTableId=id
+      this.$refs.history.visible=true
+      this.$refs.history.getChReportTable();
+    },
     /** 报表记录 */
     historyReport() {
       const loading = showLoading(this, '加载中,请稍候···')

+ 112 - 244
chuanyi_client/src/views/print_config/index.vue

@@ -1,9 +1,6 @@
 <template>
   <div class="cqcy-content" style="margin: 0; height: calc(100% - 70px)">
-    <breadcrumb-view
-      :breadcrumbList="breadcrumbList"
-      :show-index="false"
-    ></breadcrumb-view>
+    <breadcrumb-view :breadcrumbList="breadcrumbList" :show-index="false"></breadcrumb-view>
     <!-- <div class="cy-nav-sx">
       <el-input
         placeholder=""
@@ -16,24 +13,17 @@
         >查询</el-button
       >
     </div> -->
-    <el-button
-      type="primary"
-      class="cy-nav-btn"
-      icon="el-icon-circle-plus-outline"
-      size="mini"
-      @click="handleAdd"
-      >新增打印配置</el-button
-    >
+    <el-button type="primary" class="cy-nav-btn" icon="el-icon-circle-plus-outline" size="mini"
+      @click="handleAdd">新增打印配置</el-button>
+      <el-button type="primary" class="cy-nav-btn" icon="el-icon-refresh" size="mini"
+      @click="getAllPrintConfig">刷新</el-button>
     <el-divider></el-divider>
     <div class="cy-main">
-      <el-table
-        :data="tableData"
-        border
-        :header-cell-style="{ background: '#E8E8E8' }"
-        style="width: 100%"
-      >
+      <el-table :data="tableData" border :header-cell-style="{ background: '#E8E8E8' }" style="width: 100%">
         <el-table-column align="center" label="打印机" prop="printName">
         </el-table-column>
+        <el-table-column align="center" label="状态" prop="state">
+        </el-table-column>
         <el-table-column align="center" label="作业名称" prop="jobName">
         </el-table-column>
         <el-table-column align="center" label="打印方向" prop="orientation">
@@ -64,107 +54,58 @@
           <template slot-scope="scope">
             {{
               scope.row.fitToPages === 1
-                ? "无打印缩放"
-                : scope.row.fitToPages === 2
+              ? "无打印缩放"
+              : scope.row.fitToPages === 2
                 ? "将所有列打印在一页"
                 : scope.row.fitToPages === 3
-                ? "将所有行打印在一页"
-                : "自定义缩放"
+                  ? "将所有行打印在一页"
+                  : "自定义缩放"
             }}
           </template>
         </el-table-column>
         <el-table-column label="操作" align="center" width="300">
           <template slot-scope="scope">
-            <el-button
-              size="mini"
-              @click="handleValReplaceDetail(scope.$index, scope.row)"
-              type="text"
-              icon="el-icon-document"
-              >详情</el-button
-            >
-            <el-button
-              size="mini"
-              @click="handleValReplaceEdit(scope.$index, scope.row)"
-              type="text"
-              icon="el-icon-edit"
-              >编辑</el-button
-            >
-            <el-button
-              size="mini"
-              @click="handleDelete(scope.$index, scope.row)"
-              type="text"
-              style="color: red"
-              icon="el-icon-delete"
-              >删除</el-button
-            >
+            <el-button size="mini" @click="handleValReplaceDetail(scope.$index, scope.row)" type="text"
+              icon="el-icon-document">详情</el-button>
+            <el-button size="mini" @click="handleValReplaceEdit(scope.$index, scope.row)" type="text"
+              icon="el-icon-edit">编辑</el-button>
+            <el-button size="mini" @click="handleDelete(scope.$index, scope.row)" type="text" style="color: red"
+              icon="el-icon-delete">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
-      <el-pagination
-        style="margin-top: 20px"
-        background
-        layout="sizes, prev, pager, next, total"
-        :current-page="queryParams.page"
-        @size-change="sizeChangeEvent"
-        @current-change="currentChangeEvent"
-        :total="tableTotal"
-      >
+      <el-pagination style="margin-top: 20px" background layout="sizes, prev, pager, next, total"
+        :current-page="queryParams.page" @size-change="sizeChangeEvent" @current-change="currentChangeEvent"
+        :total="tableTotal">
       </el-pagination>
     </div>
 
     <!-- 新增打印配置 -->
-    <el-dialog
-      :title="dialogDataModelTitle"
-      width="850px"
-      top="10vh"
-      center
-      v-dialog-drag
-      v-if="dialogDataModelVisible"
-      :before-close="dialogClose"
-      :visible.sync="dialogDataModelVisible"
-      :close-on-click-modal="false"
-      :append-to-body="true"
-    >
-      <el-form
-        ref="dataModelForm"
-        :model="dataModelForm"
-        :rules="dataModelRules"
-        label-width="110px"
-      >
-      <el-row>
-        <el-col :span="12">
-          <el-form-item label="打印机" prop="printName">
-          <el-select
-            v-model="dataModelForm.printName"
-            placeholder="请选择打印机"
-            style="width: 250px"
-            :disabled="isDisable"
-          >
-            <el-option v-for="item in printNameData" :label="item" :value="item"> </el-option>
-          </el-select>
-        </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="作业名称" prop="jobName">
-          <el-input
-            v-model="dataModelForm.jobName"
-            placeholder="请输入作业名称"
-            maxlength="20"
-            style="width: 250px"
-            :disabled="isDisable"
-          ></el-input>
-        </el-form-item>
-      </el-col>
-      </el-row>
-      <el-row>
+    <el-dialog :title="dialogDataModelTitle" width="850px" top="10vh" center v-dialog-drag v-if="dialogDataModelVisible"
+      :before-close="dialogClose" :visible.sync="dialogDataModelVisible" :close-on-click-modal="false"
+      :append-to-body="true">
+      <el-form ref="dataModelForm" :model="dataModelForm" :rules="dataModelRules" label-width="110px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="打印机" prop="printName">
+              <el-select v-model="dataModelForm.printName" placeholder="请选择打印机" style="width: 250px"
+                :disabled="isDisable">
+                <el-option v-for="item in printList" :label="item.name" :value="item.name"> </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="作业名称" prop="jobName">
+              <el-input v-model="dataModelForm.jobName" placeholder="请输入作业名称" maxlength="20" style="width: 250px"
+                :disabled="isDisable"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
           <el-col :span="12">
             <el-form-item label="打印方向" prop="orientation">
-              <el-select
-                v-model="dataModelForm.orientation"
-                placeholder="请选择打印方向"
-                style="width: 250px"
-                :disabled="isDisable"
-              >
+              <el-select v-model="dataModelForm.orientation" placeholder="请选择打印方向" style="width: 250px"
+                :disabled="isDisable">
                 <el-option label="横向" :value="1"> </el-option>
                 <el-option label="纵向" :value="2"> </el-option>
               </el-select>
@@ -172,85 +113,65 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="打印份数" prop="copies">
-              <el-input-number
-                v-model="dataModelForm.copies"
-                :min="1"
-                :max="10"
-                style="width: 250px"
-                :disabled="isDisable"
-              ></el-input-number>
+              <el-input-number v-model="dataModelForm.copies" :min="1" :max="10" style="width: 250px"
+                :disabled="isDisable"></el-input-number>
             </el-form-item>
           </el-col>
         </el-row>
         <el-form-item label="打印页面类型" prop="pageType">
-          <el-select
-            v-model="dataModelForm.pageType"
-            placeholder="请选择打印页面类型"
-            @change="formatterPageType"
-            style="width: 250px"
-            :disabled="isDisable"
-          >
+          <el-select v-model="dataModelForm.pageType" placeholder="请选择打印页面类型" @change="formatterPageType"
+            style="width: 250px" :disabled="isDisable">
             <el-option label="A3" :value="1">
               <div>A3:297mm X 420mm</div>
             </el-option>
             <el-option label="A4" :value="2">
-              <div>A4:210mm X 297mm</div></el-option
-            >
+              <div>A4:210mm X 297mm</div>
+            </el-option>
             <el-option label="A5" :value="3">
-              <div>A5:148mm X 210mm</div></el-option
-            >
+              <div>A5:148mm X 210mm</div>
+            </el-option>
             <el-option label="B5" :value="4">
-              <div>B5:182mm X 257mm</div></el-option
-            >
+              <div>B5:182mm X 257mm</div>
+            </el-option>
             <el-option label="C5" :value="5">
-              <div>Devolop C5:162mm X 229mm</div></el-option
-            >
+              <div>Devolop C5:162mm X 229mm</div>
+            </el-option>
             <el-option label="DL" :value="6">
-              <div>Devolop DL:110mm X 220mm</div></el-option
-            >
+              <div>Devolop DL:110mm X 220mm</div>
+            </el-option>
             <el-option label="B5" :value="7">
-              <div>Devolop B5:176mm X 250mm</div></el-option
-            >
+              <div>Devolop B5:176mm X 250mm</div>
+            </el-option>
             <el-option label="DM" :value="8">
-              <div>Devolop Monarch:3.875inch X 7.5inch</div></el-option
-            >
+              <div>Devolop Monarch:3.875inch X 7.5inch</div>
+            </el-option>
             <el-option label="D9" :value="9">
               <div>Devolop 9:3.875inch X 8.875inch</div>
             </el-option>
             <el-option label="D10" :value="10">
-              <div>Devolop 10:4.125inch X 9.5inch</div></el-option
-            >
+              <div>Devolop 10:4.125inch X 9.5inch</div>
+            </el-option>
             <el-option label="LT" :value="11">
-              <div>Letter:8.5inch X 11inch</div></el-option
-            >
+              <div>Letter:8.5inch X 11inch</div>
+            </el-option>
             <el-option label="LG" :value="12">
-              <div>Legal:8.5inch X 14inch</div></el-option
-            >
+              <div>Legal:8.5inch X 14inch</div>
+            </el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="打印边距">
           <el-row>
             <el-col :span="12">
-              <el-input
-                v-model="dataModelForm.marginLeft"
-                placeholder="请输入左边距"
-                maxlength="20"
-                style="width: 250px; margin: 0 20px 20px 0"
-                :disabled="isDisable"
-              >
+              <el-input v-model="dataModelForm.marginLeft" placeholder="请输入左边距" maxlength="20"
+                style="width: 250px; margin: 0 20px 20px 0" :disabled="isDisable">
                 <template slot="append">mm</template>
               </el-input>
             </el-col>
             <el-col :span="12">
-              <el-input
-                v-model="dataModelForm.marginRight"
-                placeholder="请输入右边距"
-                maxlength="20"
-                style="width: 250px; margin: 0 20px 20px 0"
-                :disabled="isDisable"
-              >
+              <el-input v-model="dataModelForm.marginRight" placeholder="请输入右边距" maxlength="20"
+                style="width: 250px; margin: 0 20px 20px 0" :disabled="isDisable">
                 <template slot="append">mm</template>
               </el-input>
             </el-col>
@@ -258,25 +179,15 @@
           <el-row>
             <el-col :span="12">
-              <el-input
-                v-model="dataModelForm.marginTop"
-                placeholder="请输入上边距"
-                maxlength="20"
-                style="width: 250px; margin: 0 20px 20px 0"
-                :disabled="isDisable"
-              >
+              <el-input v-model="dataModelForm.marginTop" placeholder="请输入上边距" maxlength="20"
+                style="width: 250px; margin: 0 20px 20px 0" :disabled="isDisable">
                 <template slot="append">mm</template>
               </el-input>
             </el-col>
             <el-col :span="12">
-              <el-input
-                v-model="dataModelForm.marginBottom"
-                placeholder="请输入下边距"
-                maxlength="20"
-                style="width: 250px; margin: 0 20px 20px 0"
-                :disabled="isDisable"
-              >
+              <el-input v-model="dataModelForm.marginBottom" placeholder="请输入下边距" maxlength="20"
+                style="width: 250px; margin: 0 20px 20px 0" :disabled="isDisable">
                 <template slot="append">mm</template>
               </el-input>
             </el-col>
@@ -309,89 +220,47 @@
           </el-select>
         </el-form-item> -->
         <el-form-item label="页码范围类型" prop="pageRange">
-          <el-select
-            v-model="dataModelForm.pageRange"
-            placeholder="请选择页码范围类型"
-            style="width: 250px"
-            :disabled="isDisable"
-          >
+          <el-select v-model="dataModelForm.pageRange" placeholder="请选择页码范围类型" style="width: 250px" :disabled="isDisable">
             <el-option label="全部" :value="1"> </el-option>
             <el-option label="部分页码" :value="2"> </el-option>
           </el-select>
         </el-form-item>
         <el-row>
           <el-col :span="12">
-            <el-form-item
-              label="开始页码"
-              prop="pageRangeStart"
-              v-if="dataModelForm.pageRange === 2"
-            >
-              <el-input-number
-                v-model="dataModelForm.pageRangeStart"
-                :precision="0"
-                :min="1"
-                :max="100"
-                style="width: 250px"
-                :disabled="isDisable"
-              ></el-input-number>
+            <el-form-item label="开始页码" prop="pageRangeStart" v-if="dataModelForm.pageRange === 2">
+              <el-input-number v-model="dataModelForm.pageRangeStart" :precision="0" :min="1" :max="100"
+                style="width: 250px" :disabled="isDisable"></el-input-number>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item
-              label="结束页码"
-              prop="pageRangeEnd"
-              v-if="dataModelForm.pageRange === 2"
-            >
-              <el-input-number
-                v-model="dataModelForm.pageRangeEnd"
-                :precision="0"
-                :min="1"
-                :max="100"
-                style="width: 250px"
-                :disabled="isDisable"
-              ></el-input-number>
+            <el-form-item label="结束页码" prop="pageRangeEnd" v-if="dataModelForm.pageRange === 2">
+              <el-input-number v-model="dataModelForm.pageRangeEnd" :precision="0" :min="1" :max="100"
+                style="width: 250px" :disabled="isDisable"></el-input-number>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="打印区域" prop="printArea">
-              <el-select
-                v-model="dataModelForm.printArea"
-                placeholder="请选择打印区域"
-                style="width: 250px"
-                :disabled="isDisable"
-              >
+              <el-select v-model="dataModelForm.printArea" placeholder="请选择打印区域" style="width: 250px"
+                :disabled="isDisable">
                 <el-option label="整个工作表" :value="1"> </el-option>
                 <el-option label="选定区域" :value="2"> </el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item
-              label="打印区域参数"
-              prop="printAreaValue"
-              v-if="dataModelForm.printArea === 2"
-            >
-              <el-input
-                v-model="dataModelForm.printAreaValue"
-                placeholder="请输入打印区域参数 例如A1:H6"
-                maxlength="20"
-                style="width: 250px; margin: 0 20px 20px 0"
-                :disabled="isDisable"
-              ></el-input>
+            <el-form-item label="打印区域参数" prop="printAreaValue" v-if="dataModelForm.printArea === 2">
+              <el-input v-model="dataModelForm.printAreaValue" placeholder="请输入打印区域参数 例如A1:H6" maxlength="20"
+                style="width: 250px; margin: 0 20px 20px 0" :disabled="isDisable"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="打印缩放" prop="fitToPages">
-              <el-select
-                v-model="dataModelForm.fitToPages"
-                placeholder="请选择打印缩放"
-                style="width: 250px"
-                :disabled="isDisable"
-              >
+              <el-select v-model="dataModelForm.fitToPages" placeholder="请选择打印缩放" style="width: 250px"
+                :disabled="isDisable">
                 <el-option label="无打印缩放" :value="1"> </el-option>
                 <el-option label="将所有列打印在一页" :value="2"> </el-option>
                 <el-option label="将所有行打印在一页" :value="3"> </el-option>
@@ -401,26 +270,14 @@
           </el-col>
           <el-col :span="12" v-if="dataModelForm.fitToPages === 4">
             <el-form-item label="缩放比例" prop="scale">
-              <el-input-number
-                v-model="dataModelForm.scale"
-                :precision="0"
-                :min="1"
-                :max="100"
-                label="百分比"
-                style="width: 250px"
-                :disabled="isDisable"
-              ></el-input-number>
+              <el-input-number v-model="dataModelForm.scale" :precision="0" :min="1" :max="100" label="百分比"
+                style="width: 250px" :disabled="isDisable"></el-input-number>
               <span style="position: absolute; right: 81px">%</span>
             </el-form-item>
           </el-col>
         </el-row>
         <el-form-item style="text-align: center">
-          <el-button
-            type="primary"
-            @click="saveDataModelEvent"
-            v-if="!isDisable"
-            >确定</el-button
-          >
+          <el-button type="primary" @click="saveDataModelEvent" v-if="!isDisable">确定</el-button>
           <el-button @click="dialogClose">取消</el-button>
         </el-form-item>
       </el-form>
@@ -508,7 +365,7 @@ export default {
         fitToPages: 1,
       },
       dataModelRules: {
-        printName:[
+        printName: [
           { required: true, message: "请选择打印配置", trigger: "change" },
         ],
         jobName: [
@@ -563,21 +420,21 @@ export default {
       // 详情禁用
       isDisable: false,
       // 打印机集合
-      printNameData:[]
+      printList: []
     };
   },
   watch: {},
-  beforeDestroy() {},
+  beforeDestroy() { },
   created() {
     this.getPrint()
   },
   methods: {
     /** 获取打印机 */
-    getPrint(){
-      getPrint().then(res=>{
+    getPrint() {
+      getPrint().then(res => {
         console.log(res)
-        if(res.code===200){
-          this.printNameData=res.data
+        if (res.code === 200) {
+          this.printList = res.data
         }
         this.getAllPrintConfig();
       })
@@ -653,7 +510,18 @@ export default {
     getAllPrintConfig() {
       getAllPrintConfig(this.queryParams).then((res) => {
         if (res.code === 200) {
-          this.tableData = res.data.printConfigList;
+          let arr = []
+          for (let a of res.data.printConfigList) {
+            let b = a
+            for (let p of this.printList) {
+              if (p.name == b.printName) {
+                b.state = p.state
+                break
+              }
+            }
+            arr.push(b)
+          }
+          this.tableData = arr
           this.tableTotal = res.data.count;
         }
       });

+ 9 - 4
chuanyi_client/src/views/report_template/index.vue

@@ -478,7 +478,8 @@
                      border>
               <u-table-column type="selection" width="55" align="center"/>
               <u-table-column type="index" label="序号" width="60" fixed align="center"/>
-              <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center"/>
+              <!-- <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center"/> -->
+              <u-table-column label="数据项名称" prop="itemReadName" sortable="custom" align="center"/>
               <u-table-column prop="valueType" label="取值类型" align="center">
                 <template slot-scope="scope">
                   {{ getValByProp(valueTypeList, scope.row.valueType) }}
@@ -531,7 +532,8 @@
                      border>
               <u-table-column type="selection" width="55" align="center"/>
               <u-table-column type="index" label="序号" width="60" fixed align="center"/>
-              <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center"/>
+              <!-- <u-table-column label="数据项名称" prop="itemName" sortable="custom" align="center"/> -->
+              <u-table-column label="数据项名称" prop="itemReadName" sortable="custom" align="center"/>
               <u-table-column prop="dataValue" label="值" align="center">
               </u-table-column>
               <u-table-column label="操作" align="center" width="80">
@@ -1717,7 +1719,8 @@ export default {
         let tempList = flag ? this.chooseItemData : this.chooseGroupItemList
         let _data = res.data.itemList ? res.data.itemList : []
         _data.forEach((t) => {
-          t.label = t.itemName
+          // t.label = t.itemName
+          t.label = t.itemReadName
           t.value = t.itemReadName
           t.checked = false
         })
@@ -2468,12 +2471,14 @@ export default {
           data: this.barChartForm.xAxisData
         }
         this.barChartOption.yAxis = {}
+        console.log(this.chooseItemData)
         // 图表图例类型:1 数据项 0 值
         if (this.barChartForm.legendType == '1') {
           let legendNameList = []
           for (let i in this.chooseItemData) {
             let name = this.chooseItemData[i].describe
-            name = name ? name : this.chooseItemData[i].itemName
+            // name = name ? name : this.chooseItemData[i].itemName
+            name = name ? name : this.chooseItemData[i].itemReadName
             legendNameList.push(name)
           }
           this.barChartOption.legend.data = legendNameList

+ 10 - 1
chuanyi_client/src/views/run_config/index.vue

@@ -2522,7 +2522,16 @@ export default {
         }
         return;
       }
-      const loading = showLoading(this, "加载中,请稍候···");
+      // const loading = showLoading(this, "加载中,请稍候···");
+      const loading = this.$loading({
+        lock: true,
+        text: '加载中,请稍候···',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0)'
+      });
+      setTimeout(() => {
+          if (loading) loading.close()
+      }, 30 * 1000)
       getReportTableById(this.chooseMyReport.id)
         .then((res) => {
           let _data = res.data;

+ 161 - 3
chuanyi_client/src/views/run_config/showReport.vue

@@ -59,12 +59,13 @@
 <script>
 
 import DownloadReportType from './downloadReportType.vue'
-import { showAlertMsgWin, getNowFormatDate, showLoading, } from "@/utils/cqcy";
+import { showAlertMsgWin, getNowFormatDate, showLoading, withDateFormatLength } from "@/utils/cqcy";
 import { delReportTableById, getAutoChReportTable, getReportTableById } from "@/api/datasource";
 import { getUsername } from "@/utils/auth";
 import { insertLuckysheetEChart, setSheetDatas } from "@/utils/luckysheettool";
 import { exportExcel } from "@/utils/export";
 import BreadcrumbView from "@/components/BreadcrumbView";
+import { print } from "@/utils/print.js";
 export default {
     components: {
         BreadcrumbView,
@@ -183,7 +184,8 @@ export default {
                         console.log(imgSrc);
                         document.querySelector("#print-html").innerHTML = $img;
                         setTimeout(() => {
-                            print(this.printId)
+                            // Print.js插件
+                            print(this.$route.query.id)
                             if (document.querySelector("#print-area"))
                                 document.querySelector("#print-area").style = "display:none";
                             loading.close();
@@ -205,7 +207,7 @@ export default {
                     this.$nextTick(() => {
                         document.querySelector("#print-html").innerHTML = $img;
                         setTimeout(() => {
-                            print(this.printId)
+                            print(this.$route.query.id)
                             if (document.querySelector("#print-area"))
                                 document.querySelector("#print-area").style = "display:none";
                             loading.close();
@@ -355,6 +357,64 @@ export default {
                 }, this.reportInterval * 1000);
             }
         },
+        /** 报表reload事件 */
+        reloadReportNode() {
+            if (!this.chooseMyReport || !this.chooseMyReport.id) {
+                if (this.reportIntervalTag) {
+                    clearInterval(this.reportIntervalTag);
+                    // sessionStorage.removeItem(this.sessionName + this.reportTableId)
+                }
+                return;
+            }
+            // const loading = showLoading(this, "加载中,请稍候···");
+            const loading = this.$loading({
+                lock: true,
+                text: '加载中,请稍候···',
+                spinner: 'el-icon-loading',
+                background: 'rgba(0, 0, 0, 0)'
+            });
+            setTimeout(() => {
+                if (loading) loading.close()
+            }, 30 * 1000)
+            getReportTableById(this.chooseMyReport.id).then((res) => {
+                let _data = res.data;
+                if (!_data) {
+                    loading.close();
+                    // if (this.reportIntervalTag) clearInterval(this.reportIntervalTag)
+                    return;
+                }
+                this.chooseCurrMyReport = _data;
+                this.chooseMyReport = res.data;
+                // this.setLuckysheetStatus(_data, true, '', loading)
+                // 报表数据
+                let reportTableData = _data.reportTableData;
+                let luckyData = JSON.parse(reportTableData);
+                // 基础数据项值
+                let baseItem = luckyData.baseItem;
+                // 数据项
+                let reportTableItemList = _data.reportTableItemList;
+                let reportChartList = _data.reportChartList;
+                // 报表类型
+                let reportTableType = _data.reportTableType;
+                // 绘制基础数据项
+                this.drawBaseInfo(baseItem);
+                // 绘制数据值
+                // this.drawTableData(reportTableItemList, reportTableType, _data, luckysheet.getSheet(0).data);
+                this.drawTableData(reportTableItemList, reportTableType, _data, luckyData.data[0].data);
+                for (let i in reportChartList) {
+                    this.insertEChartInfo(reportChartList[i]);
+                }
+                luckysheet.setRangeShow("BH1");
+                loading.close();
+            }).catch((e) => {
+                if (this.reportIntervalTag) {
+                    clearInterval(this.reportIntervalTag);
+                    // sessionStorage.removeItem(this.sessionName + this.reportTableId)
+                }
+                loading.close();
+                showAlertWin(this, null, e);
+            });
+        },
         /** 绘制基础数据项布局信息 */
         drawBaseInfo(baseData) {
             if (!baseData) {
@@ -511,6 +571,104 @@ export default {
             setSheetDatas(tableItemList, luckysheet, null, null, sheData);
             // this.updateLocalExcelContent();
         },
+        /** 向 Excel 插入图表 */
+        insertEChartInfo(chart) {
+            let _self = this;
+            let info = JSON.parse(chart.standby);
+            let reportChartItemList = chart.reportChartItemList;
+            let chartType = chart.chartType;
+            // 系列
+            let series = info.option.series;
+            for (let i in series) {
+                let temp = series[i];
+                temp.data = [];
+                for (let j in reportChartItemList) {
+                    let _name = reportChartItemList[j].describe
+                        ? reportChartItemList[j].describe
+                        : reportChartItemList[j].itemName;
+                    if (chartType == "pie") {
+                        info.option.legend = null;
+                        info.option.tooltip = {
+                            trigger: "item",
+                            formatter: "{b0}<br /> <b>{c0}</b>",
+                        };
+                        temp.name = _name;
+                        let names = reportChartItemList[i].valueTimeList
+                            ? reportChartItemList[i].valueTimeList.split(",")
+                            : [];
+                        names = withDateFormatLength(names);
+                        let vals = reportChartItemList[i].valueList
+                            ? reportChartItemList[i].valueList.split(",")
+                            : [];
+                        names.forEach((name, j) => {
+                            temp.data.push({
+                                name: name,
+                                value: vals[j],
+                            });
+                        });
+                    } else {
+                        let _t = [];
+                        let t = reportChartItemList[i].valueList
+                            ? reportChartItemList[i].valueList.split(",")
+                            : [];
+                        t.forEach((temp) => {
+                            _t.push(parseFloat(temp));
+                        });
+                        temp.data = _t;
+                    }
+                }
+            }
+            if (chartType != "pie") {
+                // x 轴
+                let xAxis = info.option.xAxis;
+                let legend = info.option.legend;
+                // xAxis.data = []
+                legend.data = [];
+                let axisLabel = {};
+                axisLabel.rotate = 20;
+                xAxis.axisLabel = axisLabel;
+                let times = reportChartItemList[0].valueTimeList
+                    ? reportChartItemList[0].valueTimeList.split(",")
+                    : [];
+                xAxis.data =
+                    reportChartItemList && reportChartItemList.length > 0
+                        ? withDateFormatLength(times)
+                        : [];
+                // xAxis.data = xAxis.data.slice(0, 7)
+                for (let i in reportChartItemList) {
+                    let name = reportChartItemList[i].describe
+                        ? reportChartItemList[i].describe
+                        : reportChartItemList[i].itemName;
+                    // xAxis.data.push(name)
+                    legend.data.push(name);
+                }
+            }
+            setTimeout(() => {
+                const sheet = luckysheet.getLuckysheetfile()[0];
+                let optionData = sheet.data;
+                let elements = document.getElementsByClassName(info.className);
+                for (let i = 0; i < elements.length; i++) {
+                    elements[i].parentNode.removeChild(elements[i]);
+                }
+                try {
+                    let flag = true;
+                    insertLuckysheetEChart({
+                        selector: "#luckysheet",
+                        info,
+                        sheet,
+                        optionData,
+                        echarts,
+                        luckysheet,
+                        $,
+                        _self,
+                        flag,
+                    });
+                } catch (e) {
+                    console.log(999, e == "echarts is not defined");
+                    console.error(e);
+                }
+            }, 200);
+        },
     }
 }
 </script>

+ 0 - 148
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/task/Test.java

@@ -1,148 +0,0 @@
-package com.example.opc_da.task;
-
-import com.alibaba.fastjson.JSONObject;
-import com.example.opc_common.entity.DataSource;
-import com.example.opc_common.util.Blank;
-import com.example.opc_da.util.OpcDaUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.jinterop.dcom.common.JIException;
-import org.openscada.opc.lib.common.AlreadyConnectedException;
-import org.openscada.opc.lib.da.Server;
-import org.openscada.opc.lib.da.browser.Branch;
-import org.openscada.opc.lib.da.browser.FlatBrowser;
-import org.openscada.opc.lib.da.browser.Leaf;
-import org.openscada.opc.lib.da.browser.TreeBrowser;
-
-import java.net.UnknownHostException;
-import java.util.*;
-
-import static com.example.opc_da.util.OpcDaUtil.genFullPath;
-
-@Slf4j
-public class Test {
-
-    public static void main(String[] args) throws UnknownHostException, AlreadyConnectedException, JIException {
-        DataSource dataSource = new DataSource();
-        DataSource dataSource1 = new DataSource();
-        DataSource dataSource2 = new DataSource();
-        dataSource.setClsId("75D00BBB-DDA5-11D1-B944-9E614D000000");
-        dataSource.setIpAddress("192.168.1.99");
-        dataSource.setIpUserName("administrator");
-        dataSource.setIpPassword("asdf");
-        dataSource1.setClsId("75d00bbb-dda5-11d1-b944-9e614d000000");
-        dataSource1.setIpAddress("192.168.1.99");
-        dataSource1.setIpUserName("administrator");
-        dataSource1.setIpPassword("asdf");
-        dataSource2.setClsId("3c5702a2-eb8e-11d4-83a4-00105a984cbd");
-        dataSource2.setIpAddress("192.168.1.111");
-        dataSource2.setIpUserName("administrator");
-        dataSource2.setIpPassword("asdf");
-//        Server server = OpcDaUtil.createServer(dataSource);
-//        Server server1 = OpcDaUtil.createServer(dataSource1);
-        Server server2 = OpcDaUtil.createServer(dataSource2);
-//        server.connect();
-//        server1.connect();
-        server2.connect();
-//        test1(server,itemStr,itemName1,itemName2);
-    }
-
-    public static void test1(Server server, String itemStr, String itemName1, String itemName2) throws JIException {
-        long l = System.currentTimeMillis();
-        TreeBrowser treeBrowser = server.getTreeBrowser();
-        System.out.println(System.currentTimeMillis() - l + "ms");
-        List<Map<String, String>> mapList = new ArrayList<>();
-        if (Blank.isEmpty(itemStr)) {
-            mapList = xxx(treeBrowser, new Branch(), itemName1, itemName2);
-        } else {
-            String[] split = itemStr.split("!@");
-            Branch branch = new Branch();
-            for (int i = 0; i < split.length; i++) {
-                String itemId = split[i];
-                if (i == split.length - 1) {
-                    mapList = xxx(treeBrowser, new Branch(branch, itemId), itemName1, itemName2);
-                } else {
-                    branch = new Branch(branch, itemId);
-                }
-            }
-        }
-        System.out.println("-----" + (System.currentTimeMillis() - l) + "ms");
-        System.out.println("--------------");
-        System.out.println(mapList.size());
-        mapList.forEach(map -> {
-            System.out.println(map.toString());
-        });
-    }
-
-    public static void test2(Server server, String itemStr, String itemName1, String itemName2) throws UnknownHostException, JIException {
-        long l = System.currentTimeMillis();
-        FlatBrowser flatBrowser = server.getFlatBrowser();
-        Collection<String> browse = flatBrowser.browse();
-//        Collection<String> browse = flatBrowser.browse(itemName1);
-//        Collection<String> browse = flatBrowser.browse("通道 1.设备 1."+itemName1);
-//        Collection<String> browse = flatBrowser.getAccessPaths("通道 1.设备 1."+itemName1);
-        System.out.println(System.currentTimeMillis() - l + "ms");
-        System.out.println("-----" + (System.currentTimeMillis() - l) + "ms");
-        System.out.println("--------------");
-        System.out.println(browse.toString());
-        browse.forEach(e -> {
-            System.out.println(e);
-        });
-    }
-
-    public static List<Map<String, String>> xxx(TreeBrowser treeBrowser, Branch branch, String itemName1, String itemName2) {
-        JSONObject jsonObject = new JSONObject();
-        try {
-            treeBrowser.fillBranches(branch);
-        } catch (Exception ignored) {
-        }
-//        try {
-//            treeBrowser.fillLeaves(branch);
-//        } catch (Exception ignored) {
-//        }
-
-        List<Map<String, String>> mapList = new ArrayList<>();
-        Iterator iter = branch.getBranches().iterator();
-        while (iter.hasNext()) {
-            Branch subBranch = (Branch) iter.next();
-//            map.put(subBranch.getName(), subBranch.getName());
-            String name = subBranch.getName();
-            if (name.contains(itemName1)) {
-                List<Map<String, String>> yyy = yyy(treeBrowser, new Branch(branch, name), itemName2);
-                if (Blank.notBlank(yyy)) {
-                    mapList.addAll(yyy);
-                }
-            }
-        }
-//        jsonObject.put("leaves", mapList);
-        return mapList;
-    }
-
-    public static List<Map<String, String>> yyy(TreeBrowser treeBrowser, Branch branch, String itemName2) {
-//        try {
-//            treeBrowser.fillBranches(branch);
-//        } catch (Exception ignored) {
-//        }
-        try {
-            treeBrowser.fillLeaves(branch);
-        } catch (Exception ignored) {
-        }
-
-        Iterator iter = branch.getLeaves().iterator();
-        List<Map<String, String>> mapList = new ArrayList<>();
-        while (iter.hasNext()) {
-            Leaf leaf = (Leaf) iter.next();
-//            map.put(leaf.getName(), leaf.getItemId());
-            Map<String, String> map = new HashMap<>();
-            String name = leaf.getName();
-            if (name.contains(itemName2)) {
-                map.put("fullPath", genFullPath(leaf));
-                map.put("itemName", leaf.getName());
-                map.put("itemReadName", leaf.getItemId());
-                mapList.add(map);
-            }
-        }
-        return mapList;
-    }
-
-
-}

+ 0 - 151
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/task/TestUtil.java

@@ -1,151 +0,0 @@
-package com.example.opc_da.task;
-
-import com.example.opc_common.util.DateUtil;
-import com.example.opc_da.util.CronUtil;
-import org.quartz.CronExpression;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-
-public class TestUtil {
-
-        public static void main(String[] args) throws ParseException {
-            String startTime = "2023-09-27 11:49:41";
-            int time = 5; // 间隔时间为5秒
-
-            System.out.println("秒:"+getCron(startTime, "5", 1, null));
-//            System.out.println("分:"+getCron(startTime, "5", 2, null));
-//            System.out.println("时:"+getCron(startTime, "5", 3, null));
-//            System.out.println("天:"+ getCron(startTime, "11:23:34", 4, null));
-//            System.out.println("月:"+getCron(startTime, "11:23:33", 5, 4));
-        }
-
-    /**
-     * 拼接cron表达式
-     * @param date
-     * @param time
-     * @param type
-     */
-        public static String getCron(String date, String time, int type, Integer day) throws ParseException {
-            String cronExpression = "";
-            // 将起始时间转换为Date对象
-            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-            Date startDate = null;
-            try {
-                startDate = dateFormat.parse(date);
-
-                // 计算Cron表达式的各个字段
-                int second = startDate.getSeconds();
-                int minute = startDate.getMinutes();
-                int hour = startDate.getHours();
-                if (type == 1) {
-                    // 秒
-                    cronExpression = String.format("%d/%d %d/%d * * * ?", second, Integer.parseInt(time), minute, 1);
-                } else if (type == 2) {
-                    // 分
-                     cronExpression = String.format("%d %d/%d * * * ?",
-                             second, minute, Integer.parseInt(time));
-                } else if (type == 3) {
-                    // 时
-                    // 计算Cron表达式的小时字段
-                    int cronHour = (hour + Integer.parseInt(time)) % 24;
-
-                    // 构建Cron表达式
-                    cronExpression = String.format("%d %d %d/%d * * ?", second, minute, cronHour, Integer.parseInt(time));
-                } else if (type == 4) {
-                    // 每天的哪个时间
-                    cronExpression = getDayCron(startDate, time);
-                } else if (type == 5) {
-                    // 每月哪个时间
-                    cronExpression = getMonCron(startDate, time, day);
-                }
-
-
-                System.out.println("生成的Cron表达式为:" + cronExpression);
-            } catch (ParseException e) {
-                e.printStackTrace();
-            }
-            if (!"".equals(cronExpression)) {
-                getExpressTime(cronExpression, startDate);
-            }
-            return cronExpression;
-        }
-
-        public static String getDayCron(Date  startDate, String time) {
-            String[] times = time.split(":");
-            Calendar calendar = Calendar.getInstance();
-            calendar.setTime(startDate);
-
-            // 设置每天的执行时间为10:30:21
-            calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(times[0]));
-            calendar.set(Calendar.MINUTE, Integer.parseInt(times[1]));
-            calendar.set(Calendar.SECOND, Integer.parseInt(times[2]));
-
-            // 构建Cron表达式
-            String cronExpression = String.format("%d %d %d * * ?",
-                    calendar.get(Calendar.SECOND),
-                    calendar.get(Calendar.MINUTE),
-                    calendar.get(Calendar.HOUR_OF_DAY));
-            return cronExpression;
-        }
-
-    public static String getMonCron(Date  startDate, String time, int day) {
-        String[] times = time.split(":");
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(startDate);
-
-        calendar.set(Calendar.DAY_OF_MONTH, day);
-        calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(times[0]));
-        calendar.set(Calendar.MINUTE, Integer.parseInt(times[1]));
-        calendar.set(Calendar.SECOND, Integer.parseInt(times[2]));
-
-        // 构建Cron表达式
-        String cronExpression = String.format("%d %d %d %d * ?",
-                calendar.get(Calendar.SECOND),
-                calendar.get(Calendar.MINUTE),
-                calendar.get(Calendar.HOUR_OF_DAY),
-                calendar.get(Calendar.DAY_OF_MONTH));
-        return cronExpression;
-    }
-
-    public static String getExpressTime(String cronExpression, Date currentDate) throws ParseException {
-        CronExpression cron = new CronExpression(cronExpression);
-
-        // 获取下一次执行时间
-        Date nextExecutionTime = cron.getNextValidTimeAfter(currentDate);
-        // 获取上一次执行时间
-        Date prevExecutionTime = calculatePrevExecutionTime(cron, nextExecutionTime);
-
-
-        // 格式化时间
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String formattedNextExecutionTime = dateFormat.format(nextExecutionTime);
-        String formattedPrevExecutionTime = dateFormat.format(prevExecutionTime);
-        System.out.println("当前时间: " +  dateFormat.format(currentDate));
-        // 打印结果
-        System.out.println("下一次执行时间: " + formattedNextExecutionTime);
-        System.out.println("上一次执行时间: " + formattedPrevExecutionTime);
-        return "";
-    }
-
-    private static Date calculatePrevExecutionTime(CronExpression cron, Date currentDate) {
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(currentDate);
-
-        // 初始将时间减一秒,以确保不会返回当前时间
-        calendar.add(Calendar.SECOND, -1);
-
-        // 循环查找上一次执行时间
-        while (true) {
-            Date prevTime = calendar.getTime();
-            if (cron.isSatisfiedBy(prevTime)) {
-                return prevTime;
-            }
-            calendar.add(Calendar.SECOND, -1);
-        }
-    }
-
-
-}

+ 0 - 4
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/util/OpcDaUtil.java

@@ -357,10 +357,6 @@ public class OpcDaUtil {
         return itemStr;
     }
 
-    //java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException: Index 16 out of bounds for length 16
-    //	at org.openscada.opc.lib.da.Server.connect(Server.java:140)
-    //	at com.example.opc_da.task.Test.main(Test.java:37)
-    //读取opcda,因为没有输入账号导致的问题
     public static String genException(String message) {
         if (Blank.isEmpty(message)) {
             return "通信异常或账号输入错误" + "-系统错误信息:" + message;

+ 3 - 0
cqcy-ei/cqcy-ei-da/src/main/resources/application.yml

@@ -1,3 +1,6 @@
+server:
+  max-http-header-size: 10MB
+  
 spring:
   profiles:
     active: @spring.profiles.active@

+ 1 - 1
cqcy-ei/cqcy-ei-da/src/main/resources/static/app/index.html

@@ -2,4 +2,4 @@
 				.supports('top: constant(a)'))
 			document.write(
 				'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
-				(coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=./static/index.63b34199.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=./static/js/chunk-vendors.35954aaa.js></script><script src=./static/js/index.aba819c1.js></script></body></html>
+				(coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=./static/index.63b34199.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=./static/js/chunk-vendors.35954aaa.js></script><script src=./static/js/index.fcb95d98.js></script></body></html>

File diff suppressed because it is too large
+ 0 - 0
cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/js/index.fcb95d98.js


File diff suppressed because it is too large
+ 0 - 0
cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/js/pages-login-index.65f24270.js


File diff suppressed because it is too large
+ 0 - 0
cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/js/pages-reportForm-index.229acf35.js


File diff suppressed because it is too large
+ 0 - 0
cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/js/pages-reportForm-index.b2b67ea5.js


+ 2 - 1
cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/webview/bar-wv.html

@@ -188,7 +188,8 @@
 
 						const series = chartData.map(item => {
 							return {
-								name: item.describe ? item.describe : item.itemName,
+								// name: item.describe ? item.describe : item.itemName,
+								name: item.describe ? item.describe : item.itemReadName,
 								data: item.valueList,
 								type: 'bar'
 							}

+ 2 - 2
cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/webview/dataItem-wv.html

@@ -98,7 +98,7 @@
 					const startTime = GetQueryString('startTime')
 					const endTime = GetQueryString('endTime')
 					const valueType = GetQueryString('valueType')
-					const itemName = GetQueryString('itemName')
+					const itemReadName = GetQueryString('itemReadName')
 					const token = window.localStorage.getItem('C_TOKEN')
 
 					var service, serviceTime
@@ -122,7 +122,7 @@
 									valueTimeList
 								} = res.data
 								const service = [{
-									name: itemName,
+									name: itemReadName,
 									data: valueList,
 									type: 'line'
 								}]

+ 2 - 1
cqcy-ei/cqcy-ei-da/src/main/resources/static/app/static/webview/line-wv.html

@@ -189,7 +189,8 @@
 
 						const series = chartData.map(item => {
 							return {
-								name: item.describe ? item.describe : item.itemName,
+								// name: item.describe ? item.describe : item.itemName,
+								name: item.describe ? item.describe : item.itemReadName,
 								data: item.valueList,
 								type: 'line'
 							}

+ 6 - 5
reado-app/pages/reportForm/data-item.vue

@@ -88,7 +88,7 @@
 				dataValue: null,
 				// 数据项数据
 				dataItem: [],
-				itemName: null,
+				itemReadName: null,
 				src: ''
 			}
 		},
@@ -155,7 +155,7 @@
 					if (data.code === 200) {
 						this.dataItem = data.data.itemList.map(item => {
 							return {
-								text: item.itemName,
+								text: item.itemReadName,
 								value: item.id
 							}
 						})
@@ -182,14 +182,15 @@
 							valueType
 						} = this.queryParams
 						this.src =
-							`/static/webview/dataItem-wv.html?id=${id}&startTime=${startTime}&endTime=${endTime}&valueType=${valueType}&itemName=${this.itemName}`
+							`/static/webview/dataItem-wv.html?id=${id}&startTime=${startTime}&endTime=${endTime}&valueType=${valueType}&itemReadName=${this.itemReadName}`
 						if (data.data) {
 							const {
 								valueList,
 								valueTimeList
 							} = data.data
 							const service = [{
-								name: this.itemName,
+								// name: this.itemName,
+								name: this.itemReadName,
 								data: valueList
 							}]
 							this.service = service
@@ -250,7 +251,7 @@
 				const item = this.dataItem.find(item => {
 					return item.value === val
 				})
-				this.itemName = item.text
+				this.itemReadName = item.text
 			}
 		}
 	}

+ 2 - 1
reado-app/static/webview/bar-wv.html

@@ -188,7 +188,8 @@
 
 						const series = chartData.map(item => {
 							return {
-								name: item.describe ? item.describe : item.itemName,
+								// name: item.describe ? item.describe : item.itemName,
+								name: item.describe ? item.describe : item.itemReadName,
 								data: item.valueList,
 								type: 'bar'
 							}

+ 2 - 2
reado-app/static/webview/dataItem-wv.html

@@ -98,7 +98,7 @@
 					const startTime = GetQueryString('startTime')
 					const endTime = GetQueryString('endTime')
 					const valueType = GetQueryString('valueType')
-					const itemName = GetQueryString('itemName')
+					const itemReadName = GetQueryString('itemReadName')
 					const token = window.localStorage.getItem('C_TOKEN')
 
 					var service, serviceTime
@@ -122,7 +122,7 @@
 									valueTimeList
 								} = res.data
 								const service = [{
-									name: itemName,
+									name: itemReadName,
 									data: valueList,
 									type: 'line'
 								}]

+ 2 - 1
reado-app/static/webview/line-wv.html

@@ -189,7 +189,8 @@
 
 						const series = chartData.map(item => {
 							return {
-								name: item.describe ? item.describe : item.itemName,
+								// name: item.describe ? item.describe : item.itemName,
+								name: item.describe ? item.describe : item.itemReadName,
 								data: item.valueList,
 								type: 'line'
 							}

Some files were not shown because too many files changed in this diff