Ver código fonte

虚警抑制、故障诊断、判故逻辑调整、飞参数据文件上传处理、问答页面跳转

Rmengdi 3 meses atrás
pai
commit
cce43fd573

+ 1 - 1
.env.development

@@ -5,4 +5,4 @@ ENV = 'development'
 # 开发环境
 VUE_APP_BASE_API ='/api'
 
-VUE_APP_BASE_API_target ='http://192.168.2.10:9091'
+VUE_APP_BASE_API_target ='http://localhost:9091'

+ 1 - 1
.env.production

@@ -6,4 +6,4 @@ ENV = 'production'
 
 VUE_APP_BASE_API ='/api'
 
-VUE_APP_BASE_API_target ='http://192.168.5.18:8080' # 生产环境地址
+VUE_APP_BASE_API_target ='http://localhost:8080' # 生产环境地址

+ 105 - 61
package-lock.json

@@ -24,6 +24,7 @@
         "html2canvas": "^1.4.1",
         "lodash": "^4.17.21",
         "md5": "^2.3.0",
+        "pdfvuer": "^1.10.0",
         "qs": "^6.10.3",
         "relation-graph": "^1.1.0",
         "screenfull": "^6.0.1",
@@ -5362,7 +5363,6 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz",
       "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "has-property-descriptors": "^1.0.0",
@@ -5550,6 +5550,12 @@
         "url": "https://github.com/fb55/domhandler?sponsor=1"
       }
     },
+    "node_modules/dommatrix": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/dommatrix/-/dommatrix-1.0.3.tgz",
+      "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==",
+      "deprecated": "dommatrix is no longer maintained. Please use @thednp/dommatrix."
+    },
     "node_modules/domutils": {
       "version": "2.8.0",
       "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz",
@@ -5778,7 +5784,6 @@
       "version": "1.20.1",
       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz",
       "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "es-to-primitive": "^1.2.1",
@@ -5822,7 +5827,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
       "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "dev": true,
       "dependencies": {
         "is-callable": "^1.1.4",
         "is-date-object": "^1.0.1",
@@ -6760,7 +6764,6 @@
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
       "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -6785,7 +6788,6 @@
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
       "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
-      "dev": true,
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -6846,7 +6848,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
       "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "get-intrinsic": "^1.1.1"
@@ -6986,7 +6987,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
       "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
-      "dev": true,
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -7005,7 +7005,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
       "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "get-intrinsic": "^1.1.1"
@@ -7030,7 +7029,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
       "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
-      "dev": true,
       "dependencies": {
         "has-symbols": "^1.0.2"
       },
@@ -7461,7 +7459,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
       "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
-      "dev": true,
       "dependencies": {
         "get-intrinsic": "^1.1.0",
         "has": "^1.0.3",
@@ -7508,7 +7505,6 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
       "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
-      "dev": true,
       "dependencies": {
         "has-bigints": "^1.0.1"
       },
@@ -7533,7 +7529,6 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
       "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
@@ -7554,7 +7549,6 @@
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
       "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
-      "dev": true,
       "engines": {
         "node": ">= 0.4"
       },
@@ -7592,7 +7586,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
       "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "dev": true,
       "dependencies": {
         "has-tostringtag": "^1.0.0"
       },
@@ -7707,7 +7700,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
       "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
-      "dev": true,
       "engines": {
         "node": ">= 0.4"
       },
@@ -7729,7 +7721,6 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
       "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
-      "dev": true,
       "dependencies": {
         "has-tostringtag": "^1.0.0"
       },
@@ -7775,7 +7766,6 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
       "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
@@ -7791,7 +7781,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
       "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2"
       },
@@ -7813,7 +7802,6 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
       "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
-      "dev": true,
       "dependencies": {
         "has-tostringtag": "^1.0.0"
       },
@@ -7828,7 +7816,6 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
       "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
-      "dev": true,
       "dependencies": {
         "has-symbols": "^1.0.2"
       },
@@ -7875,7 +7862,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
       "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2"
       },
@@ -9040,7 +9026,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">= 0.4"
@@ -9050,7 +9035,6 @@
       "version": "4.1.2",
       "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.2.tgz",
       "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.0",
@@ -9470,6 +9454,41 @@
         "node": ">=0.12"
       }
     },
+    "node_modules/pdfjs-dist": {
+      "version": "2.14.305",
+      "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-2.14.305.tgz",
+      "integrity": "sha512-5f7i25J1dKIBczhgfxEgNxfYNIxXEdxqo6Qb4ehY7Ja+p6AI4uUmk/OcVGXfRGm2ys5iaJJhJUwBFwv6Jl/Qww==",
+      "dependencies": {
+        "dommatrix": "^1.0.1",
+        "web-streams-polyfill": "^3.2.1"
+      },
+      "peerDependencies": {
+        "worker-loader": "^3.0.8"
+      },
+      "peerDependenciesMeta": {
+        "worker-loader": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pdfvuer": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmmirror.com/pdfvuer/-/pdfvuer-1.10.0.tgz",
+      "integrity": "sha512-sPeyBeLE12nkOzhiOh97LwSQ72NkGo8WwLC5vpHsFRgeDmquW40PJAxPqrHW12Ua8bpi6RXNm7BjGxvz8jjZ9g==",
+      "dependencies": {
+        "es-abstract": "^1.18.0",
+        "pdfjs-dist": "2.14.305",
+        "raw-loader": "^0.5.1",
+        "vue-resize-sensor": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "pdfjs-dist": "2.14.305",
+        "vue": "^2.6.11"
+      }
+    },
     "node_modules/picocolors": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
@@ -10456,6 +10475,11 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmmirror.com/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q=="
+    },
     "node_modules/read-pkg": {
       "version": "5.2.0",
       "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -10578,7 +10602,6 @@
       "version": "1.4.3",
       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
       "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -11522,7 +11545,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
       "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.4",
@@ -11536,7 +11558,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
       "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.4",
@@ -11986,7 +12007,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
       "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "has-bigints": "^1.0.2",
@@ -12330,6 +12350,11 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/vue-resize-sensor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/vue-resize-sensor/-/vue-resize-sensor-2.0.0.tgz",
+      "integrity": "sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ=="
+    },
     "node_modules/vue-router": {
       "version": "3.5.4",
       "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.5.4.tgz",
@@ -12449,6 +12474,14 @@
         "defaults": "^1.0.3"
       }
     },
+    "node_modules/web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -12880,7 +12913,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
       "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
-      "dev": true,
       "dependencies": {
         "is-bigint": "^1.0.1",
         "is-boolean-object": "^1.1.0",
@@ -16894,7 +16926,6 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz",
       "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
-      "dev": true,
       "requires": {
         "has-property-descriptors": "^1.0.0",
         "object-keys": "^1.1.1"
@@ -17026,6 +17057,11 @@
         "domelementtype": "^2.2.0"
       }
     },
+    "dommatrix": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/dommatrix/-/dommatrix-1.0.3.tgz",
+      "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww=="
+    },
     "domutils": {
       "version": "2.8.0",
       "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz",
@@ -17214,7 +17250,6 @@
       "version": "1.20.1",
       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz",
       "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "es-to-primitive": "^1.2.1",
@@ -17251,7 +17286,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
       "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "dev": true,
       "requires": {
         "is-callable": "^1.1.4",
         "is-date-object": "^1.0.1",
@@ -17911,7 +17945,6 @@
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
       "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -17928,8 +17961,7 @@
     "functions-have-names": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
-      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
-      "dev": true
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
     },
     "fuzzysearch": {
       "version": "1.0.3",
@@ -17971,7 +18003,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
       "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "get-intrinsic": "^1.1.1"
@@ -18066,8 +18097,7 @@
     "has-bigints": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
-      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
-      "dev": true
+      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="
     },
     "has-flag": {
       "version": "4.0.0",
@@ -18079,7 +18109,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
       "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
-      "dev": true,
       "requires": {
         "get-intrinsic": "^1.1.1"
       }
@@ -18093,7 +18122,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
       "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
-      "dev": true,
       "requires": {
         "has-symbols": "^1.0.2"
       }
@@ -18398,7 +18426,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
       "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
-      "dev": true,
       "requires": {
         "get-intrinsic": "^1.1.0",
         "has": "^1.0.3",
@@ -18431,7 +18458,6 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
       "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
-      "dev": true,
       "requires": {
         "has-bigints": "^1.0.1"
       }
@@ -18449,7 +18475,6 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
       "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
@@ -18463,8 +18488,7 @@
     "is-callable": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
-      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
-      "dev": true
+      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
     },
     "is-ci": {
       "version": "1.2.1",
@@ -18488,7 +18512,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
       "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "dev": true,
       "requires": {
         "has-tostringtag": "^1.0.0"
       }
@@ -18557,8 +18580,7 @@
     "is-negative-zero": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
-      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
-      "dev": true
+      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="
     },
     "is-number": {
       "version": "7.0.0",
@@ -18570,7 +18592,6 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
       "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
-      "dev": true,
       "requires": {
         "has-tostringtag": "^1.0.0"
       }
@@ -18599,7 +18620,6 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
       "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
@@ -18609,7 +18629,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
       "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2"
       }
@@ -18624,7 +18643,6 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
       "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
-      "dev": true,
       "requires": {
         "has-tostringtag": "^1.0.0"
       }
@@ -18633,7 +18651,6 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
       "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
-      "dev": true,
       "requires": {
         "has-symbols": "^1.0.2"
       }
@@ -18661,7 +18678,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
       "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2"
       }
@@ -19500,14 +19516,12 @@
     "object-keys": {
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
     },
     "object.assign": {
       "version": "4.1.2",
       "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.2.tgz",
       "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.0",
         "define-properties": "^1.1.3",
@@ -19813,6 +19827,26 @@
         "sha.js": "^2.4.8"
       }
     },
+    "pdfjs-dist": {
+      "version": "2.14.305",
+      "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-2.14.305.tgz",
+      "integrity": "sha512-5f7i25J1dKIBczhgfxEgNxfYNIxXEdxqo6Qb4ehY7Ja+p6AI4uUmk/OcVGXfRGm2ys5iaJJhJUwBFwv6Jl/Qww==",
+      "requires": {
+        "dommatrix": "^1.0.1",
+        "web-streams-polyfill": "^3.2.1"
+      }
+    },
+    "pdfvuer": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmmirror.com/pdfvuer/-/pdfvuer-1.10.0.tgz",
+      "integrity": "sha512-sPeyBeLE12nkOzhiOh97LwSQ72NkGo8WwLC5vpHsFRgeDmquW40PJAxPqrHW12Ua8bpi6RXNm7BjGxvz8jjZ9g==",
+      "requires": {
+        "es-abstract": "^1.18.0",
+        "pdfjs-dist": "2.14.305",
+        "raw-loader": "^0.5.1",
+        "vue-resize-sensor": "^2.0.0"
+      }
+    },
     "picocolors": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
@@ -20438,6 +20472,11 @@
         "unpipe": "1.0.0"
       }
     },
+    "raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmmirror.com/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q=="
+    },
     "read-pkg": {
       "version": "5.2.0",
       "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -20530,7 +20569,6 @@
       "version": "1.4.3",
       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
       "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -21214,7 +21252,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
       "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.4",
@@ -21225,7 +21262,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
       "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.4",
@@ -21527,7 +21563,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
       "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
-      "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
         "has-bigints": "^1.0.2",
@@ -21774,6 +21809,11 @@
         }
       }
     },
+    "vue-resize-sensor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/vue-resize-sensor/-/vue-resize-sensor-2.0.0.tgz",
+      "integrity": "sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ=="
+    },
     "vue-router": {
       "version": "3.5.4",
       "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.5.4.tgz",
@@ -21874,6 +21914,11 @@
         "defaults": "^1.0.3"
       }
     },
+    "web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="
+    },
     "webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -22163,7 +22208,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
       "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
-      "dev": true,
       "requires": {
         "is-bigint": "^1.0.1",
         "is-boolean-object": "^1.1.0",

+ 1 - 0
package.json

@@ -24,6 +24,7 @@
     "html2canvas": "^1.4.1",
     "lodash": "^4.17.21",
     "md5": "^2.3.0",
+    "pdfvuer": "^1.10.0",
     "qs": "^6.10.3",
     "relation-graph": "^1.1.0",
     "screenfull": "^6.0.1",

+ 21 - 0
src/api/als/airConfigParams.js

@@ -0,0 +1,21 @@
+import { get, put, post, deletes } from '@/http/index'
+
+// 查询机型机号列表
+export const getAirConfigParams = async (data) => {
+  return await get('/als/airParamter/list', data)
+}
+
+// 新增机型机号
+export const addAirConfigParams = async (data) => {
+  return await post('/als/airParamter', data)
+}
+
+// 修改机型机号
+export const updateAirConfigParams = async (data) => {
+  return await put('/als/airParamter', data)
+}
+
+// 删除机型机号
+export const removeAirConfigParams = async (id) => {
+  return await deletes('/als/airParamter/' + id)
+}

+ 2 - 2
src/api/als/falseAlarmResult.js

@@ -1,8 +1,8 @@
 import { get, put, post, deletes } from '@/http/index'
 
 // 查询虚警抑制结果列表
-export const getFalseAlarmResult = async (data) => {
-  return await get('/als/falseAlarmResult/list', data)
+export const getWarningResult = async (data) => {
+  return await get('/als/warningResult/list', data)
 }
 
 // 新增虚警抑制结果

+ 9 - 0
src/router/modules/system.js

@@ -245,6 +245,15 @@ export default [
           title: '判故逻辑管理'
         }
       },
+      {
+        name: 'AirConfigParams',
+        path: '/dataManage/AirConfigParams',
+        component: () => import('@/views/als/airConfigParams/index.vue'),
+        meta: {
+          parent: 'BasicData',
+          title: '构型参数管理'
+        }
+      },
       {
         name: 'AtlasFile',
         path: '/knowledgeGraph/atlasFile',

+ 353 - 0
src/views/als/airConfigParams/index.vue

@@ -0,0 +1,353 @@
+<template>
+  <div class="view-table-content">
+    <div class="view-dataSpecies-left" style="display: flex; width: 430px">
+      <MenuTree :currentNodeKey="currentNodeKey" nodeKey="id" :treedata="menuTreeData" @TreeNodeclick="treeNodeClick" v-bind="treeObj" style="width: 250px"> </MenuTree>
+      <MenuTree :currentNodeKey="currentConfigNodeKey" nodeKey="id" :treedata="configTreeData" @TreeNodeclick="treeConfigNodeClick" v-bind="configurationTreeObj" style="width: 250px"> </MenuTree>
+    </div>
+    <div class="view-dataSpecies-right" style="width: calc(100% - 460px)">
+      <div class="view-dataType-title">
+        <div class="view-dataType-title-btn">
+          <el-button type="success" @click="openDialog()" :disabled="currentConfigNodeKey === '' || currentConfigNodeKey === '1'">新增</el-button>
+          <el-button type="warning" @click="remove(tableCheckItems)" :disabled="tableCheckItems.length == 0">删除</el-button>
+        </div>
+        <div class="view-dataType-title-search">
+          <el-input placeholder="请输入关键字" v-model="keyWordData" class="input1">
+            <el-button slot="append" icon="el-icon-search" @click="searchClick" :disabled="currentNode.id === ''"></el-button>
+          </el-input>
+        </div>
+      </div>
+      <div class="view-dataType-table">
+        <LTable ref="table" @selection-change="selection" :defaultFetch="false" :fetch="fetch" :columns="columns" :dataSource="tableData" :options="options" :pagination="tableRequset"></LTable>
+      </div>
+      <!-- 添加或修改机型机号对话框 -->
+      <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="600px" :before-close="handleClose">
+        <el-form ref="form" :model="form" label-width="80px">
+          <el-form-item label="机型" prop="aircraftType">
+            <el-select v-model="form.aircraftType" placeholder="请选择机型" disabled>
+              <el-option v-for="item in aircaftModelAll" :key="item.aircaftModelId" :label="item.aircaftModelName" :value="item.aircaftModelId"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="系统" prop="sysId">
+            <el-select v-model="form.sysId" placeholder="请选择构型" disabled>
+              <el-option v-for="item in allAirConfig" :key="item.id" :label="item.name" :value="item.id"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="参数名称" prop="name">
+            <el-input v-model="form.name" placeholder="请输入参数名称" />
+          </el-form-item>
+        </el-form>
+
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" @click="submit">确 定</el-button>
+        </span>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getAirConfigParams, addAirConfigParams, updateAirConfigParams, removeAirConfigParams } from '@/api/als/airConfigParams'
+import { getAircaftCatalogTree, getAircaftTypeAndModelTree } from '@/api/als/sideTree'
+import { getAircaftModelAll, getAircaftCatalogAll } from '@/api/als/aircraft'
+import { handleTree } from '../utils/common'
+import { getAirConfiguration } from '@/api/als/airConfiguration'
+import { deepClone, debounce } from '@/utils/index'
+export default {
+  name: 'AirConfigParams',
+  components: {},
+  data() {
+    // 这里存放数据
+    return {
+      dialogTitle: '新增',
+      dialogVisible: false,
+      keyWordData: '',
+      aircaftModelIdList: [],
+      currentNodeKey: '',
+      currentNode: {},
+      currentConfigNodeKey: '',
+      currentConfigNode: {},
+      menuTreeData: [],
+      configTreeData: [],
+      treeObj: {
+        title: '所属机种',
+        activityheight: '275px',
+        searchIcon: false,
+        configure: {
+          children: 'children',
+          label: 'label'
+        }
+      },
+      configurationTreeObj: {
+        title: '飞机系统',
+        activityheight: '275px',
+        searchIcon: false,
+        configure: {
+          children: 'children',
+          label: 'name'
+        }
+      },
+      typeTree: {
+        children: 'children',
+        label: 'label'
+      },
+      searchValue: '',
+      columns: [
+        {
+          prop: 'sysId',
+          label: '系统',
+          render: (h, params) => {
+            const matchedItem = this.allAirConfig.find((item) => params.row.sysId === item.id)
+            if (matchedItem) {
+              return h('span', matchedItem.name)
+            } else {
+              return h('span', {}, '')
+            }
+          }
+        },
+        {
+          prop: 'name',
+          label: '参数名称'
+        },
+        {
+          button: true,
+          label: '操作',
+          width: '240px',
+          group: [
+            {
+              name: '编辑',
+              type: 'text',
+              round: false,
+              plain: false,
+              onClick: (row, index, scope) => {
+                this.handUpdate(row)
+              }
+            },
+            {
+              name: '删除',
+              type: 'text',
+              round: false,
+              plain: false,
+              onClick: (row, index, scope) => {
+                this.remove([row])
+              }
+            }
+          ]
+        }
+      ],
+      options: {
+        stripe: true, // 斑马纹
+        mutiSelect: true, // 多选框
+        index: false, // 显示序号, 多选则 mutiSelect
+        loading: false, // 表格动画
+        initTable: false, // 是否一挂载就加载数据
+        border: true,
+        height: 'calc(100vh - 300px)'
+      },
+      tableCheckItems: [],
+      tableData: [],
+      tableRequset: {
+        total: 0,
+        pageIndex: 1,
+        pageSize: 10,
+        searchValue: ''
+      },
+      form: {
+        id: '',
+        aircraftType: '',
+        sysId: '',
+        name: ''
+      },
+      debounceFn: debounce(this.fetch, 500),
+      allAirConfig: [],
+      aircaftModelAll: []
+    }
+  },
+  watch: {
+    keyWord() {
+      this.tableRequset.pageIndex = 1
+      this.debounceFn()
+    }
+  },
+  mounted() {
+    this.getAircaftTypeAndModelTreeAPI()
+  },
+  methods: {
+    async getAircaftTypeAndModelTreeAPI(params) {
+      const { data } = await getAircaftTypeAndModelTree(params)
+      this.menuTreeData = data
+      const { data: airConfigData } = await getAirConfiguration()
+      this.allAirConfig = airConfigData
+      const getAircaftModelAllParams = {
+        aircaftTypeCode: '',
+        aircaftTypeId: '',
+        queryParam: ''
+      }
+      const { data: data1 } = await getAircaftModelAll(getAircaftModelAllParams)
+      this.aircaftModelAll = data1
+    },
+
+    async removeAirConfigParamsAPI(params) {
+      try {
+        const { code } = await removeAirConfigParams(params)
+        if (code === 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          })
+          await this.getAirConfigParamsAPI({ sysId: this.currentConfigNodeKey })
+          this.handleClose()
+        }
+      } catch (error) {}
+    },
+
+    getTreeLeafData(list) {
+      const newArr = []
+      function getLeaf(data, arr) {
+        data.forEach((e) => {
+          if (e.type === 2) {
+            arr.push(e)
+          }
+          if (e.children.length) {
+            getLeaf(e.children, arr)
+          }
+        })
+      }
+      getLeaf(list, newArr)
+      return newArr
+    },
+
+    async getAirConfigParamsAPI(params) {
+      if (this.$refs.table) this.$refs.table.clearSelection()
+      const { pageSize, pageIndex } = this.tableRequset
+      const {
+        data: { list, total }
+      } = await getAirConfigParams({ pageSize, pageNum: pageIndex, ...params })
+      this.tableData = list
+      this.tableRequset.total = total
+    },
+
+    fetch() {
+      this.getAirConfigParamsAPI({ sysId: this.currentConfigNodeKey })
+    },
+
+    searchClick() {
+      this.getAirConfigParamsAPI({ aircraftType: this.currentNode.id, sysId: this.currentConfigNodeKey, name: this.keyWordData })
+    },
+
+    async addAirConfigParamsAPI() {
+      try {
+        delete this.form.aircaftModelName
+        const { code } = await addAirConfigParams({ ...this.form })
+        if (code === 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          })
+          this.handleClose()
+          this.getAirConfigParamsAPI({ sysId: this.currentConfigNodeKey })
+        }
+      } catch (error) {}
+    },
+
+    async updateAirConfigParamsAPI() {
+      try {
+        const { code } = await updateAirConfigParams({ ...this.form })
+        if (code === 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          })
+          this.handleClose()
+          this.getAirConfigParamsAPI({ sysId: this.currentConfigNodeKey })
+        }
+      } catch (error) {}
+    },
+
+    async treeNodeClick(data) {
+      this.currentNode = data
+      let dataTree = []
+      if (data.type === 1) {
+        const { data: data1 } = await getAirConfiguration({ aircraftType: data.id })
+        dataTree = data1
+        this.getAirConfigParamsAPI({ aircraftType: data.id })
+        this.currentNodeKey = data.id
+      }
+      this.configTreeData = []
+      const topNode = { id: '1', name: '整机', children: [] }
+      topNode.children = handleTree(dataTree, 'id')
+      this.configTreeData.push(topNode)
+    },
+
+    treeConfigNodeClick(data) {
+      this.$refs.table.clearSelection()
+      this.currentConfigNodeKey = this.form.sysId = data.id
+      this.currentConfigNode = data
+      this.getAirConfigParamsAPI({ sysId: this.currentConfigNodeKey })
+    },
+
+    openDialog() {
+      this.dialogTitle = '新增'
+      this.dialogVisible = true
+      this.form.aircraftType = this.currentNode.id
+      this.form.sysId = this.currentConfigNodeKey
+    },
+
+    handleClose() {
+      this.dialogVisible = false
+      this.form = {
+        id: '',
+        aircraftType: '',
+        sysId: '',
+        name: ''
+      }
+    },
+
+    handUpdate(row) {
+      this.dialogTitle = '编辑'
+      this.form = deepClone(row)
+      this.dialogVisible = true
+    },
+
+    submit() {
+      switch (this.dialogTitle) {
+        case '编辑':
+          this.updateAirConfigParamsAPI()
+          break
+        case '新增':
+          this.addAirConfigParamsAPI()
+          break
+      }
+    },
+
+    selection(val) {
+      this.tableCheckItems = val
+    },
+
+    remove(row) {
+      this.$confirm('是否删除该数据', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          this.removeAirConfigParamsAPI(row.map((e) => e.id))
+        })
+        .catch(() => {})
+    },
+
+    getAircraftType(item) {
+      const matchedItem = this.aircaftModelAll?.find((i) => item === i.aircaftModelId)
+      if (matchedItem) {
+        return matchedItem.aircaftModelName
+      } else {
+        return item
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../index.scss';
+</style>

+ 80 - 0
src/views/als/components/FileUpload/index.vue

@@ -67,10 +67,24 @@ export default {
     fileType: {
       type: Array
     },
+    // 是否飞参数据名称校验
+    isNameCheck: {
+      type: Boolean,
+      default: false
+    },
+    // 飞机型号类型
+    isAirType: {
+      type: String,
+      default: ''
+    },
     // 是否显示提示
     isShowTip: {
       type: Boolean,
       default: true
+    },
+    uploadSuccess: {
+      type: Function,
+      default: null
     }
   },
   data() {
@@ -151,6 +165,40 @@ export default {
           return false
         }
       }
+      // 校验飞参数据名称是否符合
+      if (this.isNameCheck) {
+        const name = file.name.split('.')
+        const fileName = name.slice(0, name.length - 1)
+        if (fileName.length !== 1) {
+          this.$message({
+            type: 'error',
+            message: '上传文件名称不符合规则!'
+          })
+          return false
+        } else {
+          if (this.isAirType === 'KJ') {
+            const airTime = fileName[0].split('_')[0]
+            const isTime = this.isValidDateTime(airTime)
+            if (!isTime) {
+              this.$message({
+                type: 'error',
+                message: '上传文件名称不符合规则!'
+              })
+              return false
+            }
+          } else if (this.isAirType === 'J') {
+            const airTime = fileName[0].split('_').slice(-2).join('')
+            const isTime = this.isValidDateTime(airTime)
+            if (!isTime) {
+              this.$message({
+                type: 'error',
+                message: '上传文件名称不符合规则!'
+              })
+              return false
+            }
+          }
+        }
+      }
       this.loading = this.$loading({
         lock: true,
         text: '正在上传文件,请稍候...',
@@ -160,6 +208,35 @@ export default {
       this.number++
       return true
     },
+
+    // 判断是否为时间
+    isValidDateTime(str) {
+      // 正则表达式匹配规则
+      const regex = /^\d{4}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])[0-5]\d[0-5]\d$/
+
+      if (!regex.test(str)) {
+        return false // 字符串格式不正确
+      }
+
+      // 提取日期时间部分
+      const year = parseInt(str.substring(0, 4), 10)
+      const month = parseInt(str.substring(4, 6), 10)
+      const day = parseInt(str.substring(6, 8), 10)
+      const hour = parseInt(str.substring(8, 10), 10)
+      const minute = parseInt(str.substring(10, 12), 10)
+      const second = parseInt(str.substring(12, 14), 10)
+
+      // 创建日期对象,检查日期是否有效
+      const date = new Date(year, month - 1, day, hour, minute, second)
+
+      // 检查日期的年月日时分秒是否与输入的字符串匹配
+      if (date.getFullYear() === year && date.getMonth() + 1 === month && date.getDate() === day && date.getHours() === hour && date.getMinutes() === minute && date.getSeconds() === second) {
+        return true
+      }
+
+      return false
+    },
+
     // 文件个数超出
     handleExceed() {
       this.$message({
@@ -179,6 +256,9 @@ export default {
     handleUploadSuccess(res, file) {
       if (res.code === 200) {
         this.uploadList.push({ fileName: res.data.fileName, url: res.data.url, ossId: res.data.ossId })
+        if (this.isNameCheck) {
+          this.$emit('uploadValue', this.uploadList)
+        }
         this.uploadedSuccessfully()
       } else {
         this.number--

+ 121 - 50
src/views/als/falseAlarm/index.vue

@@ -30,21 +30,24 @@
             <el-button type="primary" @click="submit">确 定</el-button>
           </span>
         </el-dialog>
-        <el-form ref="airForm" :inline="true" :model="airForm" label-width="80px" disabled>
+        <el-form ref="form" :inline="true" :model="form" label-width="80px" disabled>
           <el-form-item label="编目" prop="aircraftId">
-            <el-select v-model="airForm.aircraftId">
+            <el-select v-model="form.aircraftId">
               <el-option v-for="item in aircaftCatalogAll" :key="item.aircaftCatalogId" :label="item.aircaftCatalogCode" :value="item.aircaftCatalogId"> </el-option>
             </el-select>
           </el-form-item>
           <el-form-item label="架次" prop="sortieNo">
-            <el-input v-model="airForm.sortieNo" />
+            <el-input v-model="form.sortieNo" />
           </el-form-item>
           <el-form-item label="飞行时间" prop="flightDate">
-            <el-input v-model="airForm.flightDate" />
+            <el-input v-model="form.flightDate" />
           </el-form-item>
         </el-form>
         <LTable ref="warningTable" @selection-change="selection" :defaultFetch="false" :columns="warningColumns" :dataSource="warningTableData" :options="warningOptions" :pagination="warningTableRequset"></LTable>
       </el-dialog>
+      <el-dialog title="执行进度" :visible.sync="progressVisible" width="800px">
+        <el-progress :text-inside="true" :stroke-width="24" :percentage="percentage" status="success"></el-progress>
+      </el-dialog>
     </div>
   </div>
 </template>
@@ -56,6 +59,8 @@ import { getAircaftCatalogTree } from '@/api/als/sideTree'
 import { getAircaftCatalogAll } from '@/api/als/aircraft'
 import PlayBackChart from '@/views/als/components/Charts/playBackChart.vue'
 import { deepClone, debounce } from '@/utils/index'
+import { executeFalseAlarm, getOssIdDataAPI } from '@/api/als/algorithm'
+import { getWarningResult } from '@/api/als/falseAlarmResult'
 
 export default {
   name: 'FalseAlarm',
@@ -66,6 +71,7 @@ export default {
       dialogTitle: '新增',
       dialogVisible: false,
       innerVisible: false,
+      progressVisible: false,
       keyWordData: '',
       aircaftModelIdList: [],
       currentNodeKey: '',
@@ -103,32 +109,46 @@ export default {
           label: '架次号'
         },
         {
-          prop: 'flightDate',
-          label: '飞行时间'
-        },
-        {
-          prop: 'source',
-          label: '数据源',
+          prop: 'status',
+          label: '状态',
           render: (h, params) => {
-            if (params.row.source == 1) {
-              return h('span', { class: 'success-state' }, '飞参数据')
+            if (params.row.status == '4') {
+              return h('span', { class: 'success-state' }, '已处理')
             } else {
-              return h('span', { class: 'success-state' }, 'MDC数据')
+              return h('span', { class: 'warning-state' }, '未处理')
             }
           }
         },
+        {
+          // 算法执行时间
+          prop: 'createTime',
+          label: '创建时间'
+        },
         {
           button: true,
           label: '操作',
           width: '240px',
           group: [
             {
-              name: '查看警告列表',
+              name: '虚警判断',
+              type: 'text',
+              statusKey: 'status',
+              disableKey: '4',
+              round: false,
+              plain: false,
+              onClick: (row, index, scope) => {
+                this.beginExecute(row)
+              }
+            },
+            {
+              name: '查看',
               type: 'text',
+              statusKey: 'status',
+              unDisableKey: '4',
               round: false,
               plain: false,
               onClick: (row, index, scope) => {
-                this.checkWarningList(row)
+                this.checkResultList(row)
               }
             }
           ]
@@ -153,25 +173,36 @@ export default {
       },
       warningColumns: [
         {
-          prop: 'code',
-          label: 'HMC码'
+          prop: 'name',
+          label: '故障名称'
         },
         {
-          prop: 'name',
-          label: '名称'
+          prop: 'code',
+          label: 'HMC码'
         },
         {
-          prop: 'describe',
-          label: '描述'
+          prop: 'attribute1',
+          label: '判据名称',
+          // render: (h, params) => {
+          //   return h('span', { class: 'warning-state' }, params.row.attribute1)
+          // },
+          onClick: (row, index, scope) => {
+            console.log(4444)
+            this.$router.push({ name: 'JudgeFaultLogic' })
+          }
         },
         {
-          prop: 'status',
-          label: '是否虚警',
+          prop: 'resultContent',
+          label: '判断结果',
           render: (h, params) => {
-            if (params.row.status == '0') {
+            if (params.row.resultContent == '0') {
               return h('span', { class: 'warning-state' }, '实警')
-            } else {
+            } else if (params.row.resultContent == '1') {
               return h('span', { class: 'success-state' }, '虚警')
+            } else if (params.row.resultContent == '2') {
+              return h('span', '判故公式参数不匹配')
+            } else if (params.row.resultContent == '3') {
+              return h('span', '该HMC码无判据公式')
             }
           }
         },
@@ -194,8 +225,8 @@ export default {
       ],
       warningOptions: {
         stripe: true, // 斑马纹
-        mutiSelect: true, // 多选框
-        index: false, // 显示序号, 多选则 mutiSelect
+        mutiSelect: false, // 多选框
+        index: true, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
         initTable: false, // 是否一挂载就加载数据
         border: true,
@@ -222,18 +253,13 @@ export default {
         id: '',
         sortieNo: '',
         aircraftId: '',
-        code: '',
-        name: '',
-        describe: [],
-        status: ''
-      },
-      airForm: {
-        aircraftId: '',
-        sortieNo: '',
+        ossId: '',
+        status: '',
         flightDate: ''
       },
       isFalseAlarm: '0',
-      currentSortieNo: ''
+      currentSortieNo: '',
+      percentage: 0
     }
   },
   watch: {
@@ -242,12 +268,6 @@ export default {
       this.debounceFn()
     }
   },
-  // computed: {
-  //   falseAlarmText() {
-  //     console.log('this.isFalseAlarm', this.isFalseAlarm)
-  //     return this.isFalseAlarm === '1' ? '实警' : '虚警'
-  //   }
-  // },
   mounted() {
     this.getAircaftCatalogTreeAPI()
   },
@@ -322,7 +342,7 @@ export default {
     },
 
     openDialog() {
-      this.dialogTitle = '警告列表'
+      this.dialogTitle = '虚警抑制结果'
       this.dialogVisible = true
     },
 
@@ -330,9 +350,12 @@ export default {
       this.dialogVisible = false
       this.warningTableData = []
       this.currentSortieNo = ''
-      this.airForm = {
-        aircraftId: '',
+      this.form = {
+        id: '',
         sortieNo: '',
+        aircraftId: '',
+        ossId: '',
+        status: '',
         flightDate: ''
       }
     },
@@ -372,14 +395,24 @@ export default {
       this.tableCheckItems = val
     },
 
-    checkWarningList(row) {
-      this.currentSortieNo = this.airForm.sortieNo = row.sortieNo
-      this.airForm.aircraftId = row.aircraftId
-      this.airForm.flightDate = row.flightDate
-      this.getWarningAPI({ sortieNo: this.currentSortieNo })
+    checkResultList(row) {
+      this.currentSortieNo = this.form.sortieNo = row.sortieNo
+      this.form.aircraftId = row.aircraftId
+      this.form.flightDate = row.flightDate
+      this.getWarningResultAPI({ sortieNo: row.sortieNo })
       this.openDialog()
     },
 
+    async getWarningResultAPI(params) {
+      if (this.$refs.warningTable) this.$refs.warningTable.clearSelection()
+      const { pageSize, pageIndex } = this.warningTableRequset
+      const {
+        data: { list, total }
+      } = await getWarningResult({ pageSize, pageNum: pageIndex, ...params })
+      this.warningTableData = list
+      this.warningTableRequset.total = total
+    },
+
     async getWarningAPI(params) {
       if (this.$refs.warningTable) this.$refs.warningTable.clearSelection()
       const { pageSize, pageIndex } = this.warningTableRequset
@@ -448,6 +481,44 @@ export default {
         }
       })
       return { contentData, headData }
+    },
+
+    async beginExecute(row) {
+      this.form = deepClone(row)
+      this.progressVisible = true
+      let myTimer = setInterval(() => {
+        if (this.percentage < 100) {
+          if (this.percentage === 99) {
+            this.percentage = 99
+          } else {
+            this.percentage += 1
+          }
+        }
+      }, 30)
+      try {
+        this.form.dataId = row.id
+        const res = await executeFalseAlarm(this.form)
+
+        clearInterval(myTimer)
+        if (res?.code === 200) {
+          this.handleClose()
+          this.$message({
+            type: 'success',
+            message: '执行成功!'
+          })
+          // const res = await getWarningResult({ falseAlarmId: row.sortieNo })
+          // const { data } = await getListByIdsApi(JSON.parse(res.data).ossId)
+          // this.resultShowData.url = data[0].url
+          this.checkResultList(row)
+          this.dialogVisible = true
+          this.getDataImportAPI({ aircraftId: this.aircaftModelIdList })
+        }
+      } catch (error) {
+        clearInterval(myTimer)
+      } finally {
+        this.progressVisible = false
+        this.percentage = 0
+      }
     }
   }
 }

+ 56 - 77
src/views/als/faultDiagnosis/index.vue

@@ -15,28 +15,6 @@
       <div class="view-dataType-table">
         <LTable ref="table" @selection-change="selection" :defaultFetch="false" :fetch="fetch" :columns="columns" :dataSource="tableData" :options="options" :pagination="tableRequset"></LTable>
       </div>
-      <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" :before-close="handleClose" width="600px">
-        <el-form ref="form" :model="form" label-width="80px">
-          <el-form-item label="编目" prop="aircraftId">
-            <el-select v-model="form.aircraftId" disabled>
-              <el-option v-for="item in aircaftCatalogAll" :key="item.aircaftCatalogId" :label="item.aircaftCatalogCode" :value="item.aircaftCatalogId"> </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="架次" prop="sortieNo">
-            <el-input v-model="form.sortieNo" disabled />
-          </el-form-item>
-          <el-form-item label="飞行时间" prop="flightDate">
-            <el-input v-model="form.flightDate" disabled />
-          </el-form-item>
-          <el-form-item label="部件" prop="partId">
-            <treeselect :value="form.partId" :normalizer="normalizer" :options="partsData" :show-count="true" noOptionsText="该机型暂无构型信息,请在构型管理中添加" placeholder="请选择部件" @select="partIdSelect" />
-          </el-form-item>
-        </el-form>
-        <span slot="footer" class="dialog-footer">
-          <el-button @click="handleClose">取 消</el-button>
-          <el-button type="primary" @click="submit">确 定</el-button>
-        </span>
-      </el-dialog>
       <el-dialog title="诊断结果" :visible.sync="resultVisible" width="1200px">
         <LTable ref="resultTable" :defaultFetch="false" :columns="resultColumns" :dataSource="resultTableData" :options="resultOptions" :pagination="resultTableRequset"></LTable>
       </el-dialog>
@@ -58,24 +36,20 @@
 <script>
 import { getDataImport } from '@/api/als/dataImport'
 import { getFaultDiagnosis } from '@/api/als/faultDiagnosis'
+import { getFaultDiagnosisResult } from '@/api/als/faultDiagnosisResult'
 import { getAircaftCatalogTree } from '@/api/als/sideTree'
 import { getAircaftCatalogAll } from '@/api/als/aircraft'
 import { deepClone, debounce } from '@/utils/index'
-import { handleTree } from '../utils/common'
-import Treeselect from '@riophae/vue-treeselect'
-import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+import { handleTree, flattenTree } from '../utils/common'
 import { getAirConfiguration } from '@/api/als/airConfiguration'
 import { executeFault } from '@/api/als/algorithm'
 import { getListByIdsApi } from '@/api/als/oss'
 
 export default {
   name: 'FaultDiagnosis',
-  components: { Treeselect },
   data() {
     // 这里存放数据
     return {
-      dialogTitle: '新增',
-      dialogVisible: false,
       resultVisible: false,
       progressVisible: false,
       resultShowVisible: false,
@@ -124,12 +98,23 @@ export default {
           label: '数据源',
           render: (h, params) => {
             if (params.row.source == 1) {
-              return h('span', { class: 'success-state' }, '飞参数据')
+              return h('span', '飞参数据')
             } else {
-              return h('span', { class: 'success-state' }, 'MDC数据')
+              return h('span', 'MDC数据')
             }
           }
         },
+        // {
+        //   prop: 'status',
+        //   label: '状态',
+        //   render: (h, params) => {
+        //     if (params.row.status == '1') {
+        //       return h('span', { class: 'success-state' }, '已处理')
+        //     } else {
+        //       return h('span', { class: 'warning-state' }, '未处理')
+        //     }
+        //   }
+        // },
         {
           button: true,
           label: '操作',
@@ -175,41 +160,38 @@ export default {
       },
       resultColumns: [
         {
-          prop: 'sortieNo',
-          label: '架次号'
+          prop: 'modelType',
+          label: '算法名称'
         },
         {
-          prop: 'aircraftId',
-          label: '编目',
-          render: (h, params) => {
-            const matchedItem = this.aircaftCatalogAll.find((item) => params.row.aircraftId.trim() === item.aircaftCatalogId.trim())
-            if (matchedItem) {
-              return h('span', matchedItem.aircaftCatalogCode)
-            } else {
-              return h('span', {}, '')
-            }
-          }
+          prop: 'param',
+          label: '部件'
+          // render: (h, params) => {
+          //   const matchedItem = this.allAirConfig.find((item) => params.row.param === item.id)
+          //   if (matchedItem) {
+          //     return h('span', matchedItem.name)
+          //   } else {
+          //     return h('span', {}, '')
+          //   }
+          // }
         },
         {
-          prop: 'param',
-          label: '部件',
-          render: (h, params) => {
-            const matchedItem = this.allAirConfig.find((item) => params.row.param === item.id)
-            if (matchedItem) {
-              return h('span', matchedItem.name)
-            } else {
-              return h('span', {}, '')
-            }
-          }
+          prop: 'remarks',
+          label: '参数特征'
+        },
+        {
+          prop: 'columnData',
+          label: '数据列'
         },
         {
-          prop: 'status',
-          label: '状态',
+          prop: 'resultContent',
+          label: '结果',
           render: (h, params) => {
-            if (params.row.status == 0) {
-              return h('span', { class: 'warning-state' }, '失败')
+            const result = JSON.parse(params.row.resultContent).result
+            if (result) {
+              return h('span', result)
             } else {
-              return h('span', { class: 'success-state' }, '成功')
+              return h('span', {}, '-')
             }
           }
         },
@@ -254,8 +236,10 @@ export default {
         sortieNo: '',
         ossId: '',
         aircraftId: '',
+        aircraftType: '',
         flightDate: '',
         status: '',
+        result: '',
         partId: null
       },
       currentSortieNo: '',
@@ -318,13 +302,13 @@ export default {
       return newArr
     },
 
-    async getFaultDiagnosisAPI(params) {
+    async getFaultDiagnosisResultAPI(params) {
       if (this.$refs.resultTable) this.$refs.resultTable.clearSelection()
       const { keyWord } = this
       const { pageSize, pageIndex } = this.resultTableRequset
       const {
         data: { list, total }
-      } = await getFaultDiagnosis({ pageSize, pageNum: pageIndex, ...params })
+      } = await getFaultDiagnosisResult({ pageSize, pageNum: pageIndex, ...params })
       this.resultTableData = list
       this.resultTableRequset.total = total
     },
@@ -361,11 +345,6 @@ export default {
       this.getDataImportAPI({ aircraftId: this.aircaftModelIdList })
     },
 
-    openDialog() {
-      this.dialogTitle = '诊断结果'
-      this.dialogVisible = true
-    },
-
     async getAirConfigurationAPI(params) {
       try {
         const { data } = await getAirConfiguration(params)
@@ -375,13 +354,12 @@ export default {
     },
 
     faultExecute(row) {
-      this.dialogTitle = '选择诊断部件'
       this.form = deepClone(row)
+      const allAir = flattenTree(this.menuTreeData)
+      const item = allAir.find((item) => item.id === this.form.aircraftId)
+      this.form.aircraftType = item.parentId
       this.currentSortieNo = row.sortieNo
-      const item = this.aircaftCatalogAll.find((item) => item.aircaftCatalogId === this.form.aircraftId)
-      // this.form.aircraftType = item.aircraftType
-      this.getAirConfigurationAPI({ aircraftType: item.aircaftModelId })
-      this.dialogVisible = true
+      this.beginExecute()
     },
 
     partIdSelect(node) {
@@ -399,15 +377,16 @@ export default {
       }
     },
     handleClose() {
-      this.dialogVisible = false
       this.currentSortieNo = ''
       this.form = {
         id: '',
         sortieNo: '',
         ossId: '',
         aircraftId: '',
+        aircraftType: '',
         flightDate: '',
         status: '',
+        result: '',
         partId: null
       }
     },
@@ -429,8 +408,7 @@ export default {
     },
 
     checkRelustList(row) {
-      // resultTableData
-      this.getFaultDiagnosisAPI({ sortieNo: row.sortieNo })
+      this.getFaultDiagnosisResultAPI({ sortieNo: row.sortieNo })
       this.resultVisible = true
     },
 
@@ -469,11 +447,12 @@ export default {
             type: 'success',
             message: '执行成功!'
           })
-          const { data } = await getListByIdsApi(JSON.parse(res.data).ossId)
-          this.resultShowData.url = data[0].url
-          this.resultShowData.result = JSON.parse(res.data).result
-          this.resultShowVisible = true
-          this.getFaultDiagnosisAPI({ sortieNo: this.currentSortieNo })
+          // const { data } = await getListByIdsApi(JSON.parse(res.data).ossId)
+          // this.resultShowData.url = data[0].url
+          // this.resultShowData.result = JSON.parse(res.data).result
+          // this.resultShowVisible = true
+          this.resultVisible = true
+          this.getFaultDiagnosisResultAPI({ sortieNo: this.currentSortieNo })
           this.handleClose()
         }
       } catch (error) {

+ 89 - 71
src/views/als/flightData/index.vue

@@ -21,39 +21,10 @@
       <!-- 添加或修改飞参数据信息对话框 -->
       <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="1000px" :before-close="handleClose">
         <el-form ref="form" :inline="true" :rules="rules" :model="form" label-width="80px">
-          <el-row>
-            <el-col :span="12">
-              <el-form-item label="数据源" prop="source">
-                <el-select v-model="form.source" placeholder="请选择数据源" disabled>
-                  <el-option label="飞参数据" value="1"></el-option>
-                  <el-option label="MDC数据" value="2"></el-option>
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="编目" prop="aircraftId">
-                <el-select v-model="form.aircraftId" placeholder="请选择编目" disabled>
-                  <el-option v-for="item in aircaftCatalogAll" :key="item.aircaftCatalogId" :label="item.aircaftCatalogCode" :value="item.aircaftCatalogId"> </el-option>
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row>
-            <el-col :span="12">
-              <el-form-item label="飞行时间" prop="flightDate">
-                <el-date-picker v-model="form.flightDate" type="datetime" placement="bottom-start" value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择飞行时间" @change="flightDateChange"></el-date-picker>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="架次号" prop="sortieNo">
-                <el-input disabled v-model="form.sortieNo" placeholder="选择飞行时间自动生成" />
-              </el-form-item>
-            </el-col>
-          </el-row>
           <el-row>
             <el-col :span="12">
               <el-form-item label="上传飞参数据" label-width="110px" prop="ossId">
-                <FileUpload v-model="form.ossId" :limit="1" :fileSize="500" :fileType="['xls', 'xlsx', 'csv', 'txt']" />
+                <FileUpload v-model="form.ossId" :limit="1" :fileSize="500" :fileType="['xls', 'xlsx', 'csv', 'txt']" :isNameCheck="true" :isAirType="isAirType" @uploadValue="uploadValue" />
               </el-form-item>
             </el-col>
             <el-col :span="12">
@@ -80,6 +51,35 @@
               </el-form-item>
             </el-col>
           </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="数据源" prop="source">
+                <el-select v-model="form.source" placeholder="请选择数据源" disabled>
+                  <el-option label="飞参数据" value="1"></el-option>
+                  <el-option label="MDC数据" value="2"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="编目" prop="aircraftId">
+                <el-select v-model="form.aircraftId" placeholder="请选择编目" disabled>
+                  <el-option v-for="item in aircaftCatalogAll" :key="item.aircaftCatalogId" :label="item.aircaftCatalogCode" :value="item.aircaftCatalogId"> </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="飞行时间" prop="flightDate">
+                <el-date-picker disabled v-model="form.flightDate" type="datetime" placement="bottom-start" value-format="yyyy-MM-dd HH:mm:ss" placeholder="上传飞参数据自动生成"></el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="架次号" prop="sortieNo">
+                <el-input disabled v-model="form.sortieNo" placeholder="上传飞参数据自动生成" />
+              </el-form-item>
+            </el-col>
+          </el-row>
         </el-form>
 
         <span slot="footer" class="dialog-footer">
@@ -126,7 +126,7 @@ export default {
       },
       rules: {
         source: [{ required: true, message: '数据源不能为空', trigger: 'change' }],
-        aircaftModel: [{ required: true, message: '机型不能为空', trigger: 'change' }],
+        // aircaftModel: [{ required: true, message: '机型不能为空', trigger: 'change' }],
         aircraftId: [{ required: true, message: '编目不能为空', trigger: 'change' }],
         flightDate: [{ required: true, message: '飞行时间不能为空', trigger: 'change' }],
         sortieNo: [{ required: true, message: '飞架次号不能为空', trigger: 'blur' }],
@@ -178,15 +178,15 @@ export default {
           label: '操作',
           width: '240px',
           group: [
-            {
-              name: '编辑',
-              type: 'text',
-              round: false,
-              plain: false,
-              onClick: (row, index, scope) => {
-                this.handUpdate(row)
-              }
-            },
+            // {
+            //   name: '编辑',
+            //   type: 'text',
+            //   round: false,
+            //   plain: false,
+            //   onClick: (row, index, scope) => {
+            //     this.handUpdate(row)
+            //   }
+            // },
             {
               name: '删除',
               type: 'text',
@@ -242,7 +242,8 @@ export default {
         url: '/api/als/warning/importData'
       },
       warnFileList: [],
-      uploadFlag: false
+      uploadFlag: false,
+      isAirType: ''
     }
   },
   watch: {
@@ -377,8 +378,48 @@ export default {
     openDialog() {
       this.dialogTitle = '新增'
       this.dialogVisible = true
+      this.judgeFileType(this.currentNode.parentId)
       this.form.aircraftId = this.currentNodeKey
-      this.form.aircaftModel = this.currentNode.parentId
+    },
+
+    judgeFileType(aircaftModelId) {
+      const data = flattenTree(this.menuTreeData).find((item) => {
+        return item.id == aircaftModelId
+      })
+      const aircaftModelName = data.label
+      if (aircaftModelName && aircaftModelName.includes('空警')) {
+        this.isAirType = 'KJ'
+      } else if (aircaftModelName && aircaftModelName.includes('歼')) {
+        this.isAirType = 'J'
+      }
+    },
+
+    uploadValue(uploadList) {
+      const name = uploadList[0].fileName.split('.')
+      const fileName = name.slice(0, name.length - 1)
+      const aircraft = this.aircaftCatalogAll.find((item) => {
+        return item.aircaftCatalogId == this.currentNodeKey
+      })
+      let airTime
+      if (this.isAirType == 'KJ') {
+        airTime = fileName[0].split('_')[0]
+      } else if (this.isAirType == 'J') {
+        airTime = fileName[0].split('_').slice(-2).join('')
+      }
+      this.form.sortieNo = aircraft.aircaftCatalogCode + airTime
+      this.form.flightDate = this.formatDateString(airTime)
+    },
+
+    // 时间转换
+    formatDateString(dateStr) {
+      const year = dateStr.substring(0, 4)
+      const month = dateStr.substring(4, 6)
+      const day = dateStr.substring(6, 8)
+      const hour = dateStr.substring(8, 10)
+      const minute = dateStr.substring(10, 12)
+      const second = dateStr.substring(12, 14)
+
+      return `${year}-${month}-${day} ${hour}:${minute}:${second}`
     },
 
     handleClose() {
@@ -397,17 +438,12 @@ export default {
     async handUpdate(row) {
       this.dialogTitle = '编辑'
       this.form = deepClone(row)
-      // const {
-      //   data: { list, total }
-      // }=await getWarning({ sortieNo: row.SortieNo })
-      // if(total!==0){
-
-      // }
-      // console.log('this.form', this.form)
       this.dialogVisible = true
+      this.judgeFileType(this.currentNode.parentId)
     },
 
     submit() {
+      console.log('this.form', this.form)
       this.$refs['form'].validate((valid) => {
         if (valid) {
           switch (this.dialogTitle) {
@@ -442,24 +478,7 @@ export default {
         .catch(() => {})
     },
 
-    flightDateChange() {
-      this.form.sortieNo = this.getTime('JC')
-      // this.form.sortieNo = this.getTime() + '-' + obj?.model
-    },
-    getTime(prefix) {
-      const now = new Date()
-      const year = now.getFullYear()
-      const month = ('0' + (now.getMonth() + 1)).slice(-2)
-      const day = ('0' + now.getDate()).slice(-2)
-      const hours = ('0' + now.getHours()).slice(-2)
-      const minutes = ('0' + now.getMinutes()).slice(-2)
-      const seconds = ('0' + now.getSeconds()).slice(-2)
-
-      const dateString = `${year}${month}${day}${hours}${minutes}${seconds}` // 返回格式化的单号
-
-      return `${prefix}-${dateString}`
-    },
-    /** 导入按钮操作 */
+    /** 警告列表导入按钮操作 */
     handleImport() {
       this.upload.title = '警告列表导入'
       this.upload.open = true
@@ -468,11 +487,11 @@ export default {
     importTemplate() {
       useDownload(importTemplateApi, 'warning_template', {}, '.xlsx')
     },
-    // 文件上传中处理
+    // 警告列表文件上传中处理
     handleFileUploadProgress(event, file, fileList) {
       this.upload.isUploading = true
     },
-    // 文件上传成功处理
+    // 警告列表文件上传成功处理
     handleFileSuccess(response, file, fileList) {
       if (this.uploadFlag) {
         this.upload.open = false
@@ -480,9 +499,8 @@ export default {
         this.$refs.upload.clearFiles()
         this.submitBtnLoading = false
       }
-      // this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + '</div>', '导入结果', { dangerouslyUseHTMLString: true })
     },
-    // 提交上传文件
+    // 警告列表提交上传文件
     submitFileForm() {
       this.$refs.upload.submit()
     }

+ 9 - 0
src/views/als/intelligentQA/index.scss

@@ -215,6 +215,7 @@
   display: flex;
   flex-direction: row;
   justify-content: space-around;
+  overflow: scroll;
 
   .contentLeft{
     width: 620px;
@@ -236,6 +237,14 @@
       color: #fff;
       margin-bottom: 20px;
     }
+    .fileContent{
+      .pdf{
+        width: 100%;
+        height: calc(100vh - 420px);
+        overflow: scroll;
+        margin-left: 3%;
+      }
+    }
   }
 }
 

+ 39 - 8
src/views/als/intelligentQA/index.vue

@@ -26,7 +26,7 @@
                 <div class="answer">{{ item.answer }}</div>
                 <!-- <div class="graph"></div> -->
                 <graphECharts v-if="item.graph" :graphData="item.graph" class="charts"></graphECharts>
-                <i v-if="item.user_id && item.ossID" class="el-icon-more more" @click="handleMore(item)"></i>
+                <i v-if="(item.user_id && item.ossID) || (item.userId && item.ossId)" class="el-icon-more more" @click="handleMore(item)"></i>
               </div>
             </div>
           </div>
@@ -66,11 +66,13 @@
             </div>
             <div class="fileContent">
               <div v-if="fileInfo.fileSuffix == '.docx' || fileInfo.fileSuffix == '.doc'">
-                <VueOfficeDocx style="width: 100%; height: calc(100vh - 400px)" :src="fileInfo.url" />
+                <VueOfficeDocx ref="docxShow" style="width: 100%; height: calc(100vh - 400px)" :src="fileInfo.url" />
               </div>
               <div v-if="fileInfo.fileSuffix == '.pdf'">
-                <VueOfficePdf style="width: 100%; height: calc(100vh - 400px)" :src="fileInfo.url" />
+                <!-- <VueOfficePdf style="width: 100%; height: calc(100vh - 400px)" :src="fileInfo.url" /> -->
+                <pdfvuer :src="fileInfo.url" class="pdf" :page="filePage"> </pdfvuer>
               </div>
+              <el-pagination style="margin-top: 5px" v-if="fileInfo.fileSuffix == '.pdf'" background small layout="prev, pager, next" :current-page="filePage" :page-count="fileTotalPage" @current-change="handleIndexChange"> </el-pagination>
             </div>
           </div>
         </div>
@@ -92,12 +94,15 @@ import axios from 'axios'
 import { getListByIdsApi } from '@/api/als/oss'
 //引入VueOfficeDocx组件
 import VueOfficeDocx from '@vue-office/docx'
-import VueOfficePdf from '@vue-office/pdf'
+// import VueOfficePdf from '@vue-office/pdf'
 import '@vue-office/docx/lib/index.css'
+import pdfvuer from 'pdfvuer' // pdfvuer 版本为@1.6.1
+import 'pdfjs-dist/build/pdf.worker.entry'
 
 export default {
   name: 'IntelligentQA',
-  components: { graphECharts, VueOfficeDocx, VueOfficePdf },
+  // components: { graphECharts, VueOfficeDocx, VueOfficePdf },
+  components: { graphECharts, VueOfficeDocx, pdfvuer },
   data() {
     return {
       dialogVisible: false,
@@ -115,7 +120,10 @@ export default {
       },
       historyData: [],
       fileInfo: {},
-      statisticsData: []
+      statisticsData: [],
+      // TODO 问答给数据后将该字段替换
+      filePage: 2,
+      fileTotalPage: null
     }
   },
   mounted() {
@@ -255,15 +263,32 @@ export default {
     },
 
     handleMore(data) {
-      console.log('data', data)
       this.getListById(data.ossID)
       this.moreData = data
       this.dialogVisible = true
     },
 
     async getListById(id) {
-      const { data } = await getListByIdsApi(id)
+      // const { data } = await getListByIdsApi(id)
+      // pdf测试:250091300051144704,word测试:250122767632355328
+      const { data } = await getListByIdsApi('250122767632355328')
       this.fileInfo = data[0]
+      if (this.fileInfo.fileSuffix == '.pdf') {
+        pdfvuer
+          .createLoadingTask(this.fileInfo.url)
+          .then((pdf) => {
+            this.fileTotalPage = pdf.numPages
+          })
+          .catch((err) => {
+            console.error('PDF 加载失败:', err)
+          })
+      } else if (this.fileInfo.fileSuffix == '.docx' || this.fileInfo.fileSuffix == '.doc') {
+        // this.$nextTick(() => {
+        //   console.log('this.$refs.docxShow', this.$refs.docxShow)
+        //   console.log('this.$refs.docxShow.children', this.$refs.docxShow.children)
+        // })
+        // const docxRef=this.$refs.docxShow
+      }
     },
 
     handleClose() {
@@ -303,6 +328,12 @@ export default {
           this.getHistoryAll()
         }
       } catch (error) {}
+    },
+
+    // currentPage 改变时触发事件
+    handleIndexChange(current) {
+      this.filePage = current
+      // this.fetch()
     }
 
     // const { code, data } = {

+ 548 - 0
src/views/als/judgeFaultLogic/index copy.vue

@@ -0,0 +1,548 @@
+<template>
+  <div class="view-table-content">
+    <div class="view-dataSpecies-left" style="display: flex; width: 430px">
+      <MenuTree :currentNodeKey="currentNodeKey" nodeKey="id" :treedata="menuTreeData" @TreeNodeclick="treeNodeClick" v-bind="treeObj" style="width: 250px"> </MenuTree>
+      <MenuTree :currentNodeKey="currentConfigNodeKey" nodeKey="id" :treedata="configTreeData" @TreeNodeclick="treeConfigNodeClick" v-bind="configurationTreeObj" style="width: 250px"> </MenuTree>
+    </div>
+    <div class="view-dataSpecies-right" style="width: calc(100% - 460px)">
+      <div class="view-dataType-title">
+        <div class="view-dataType-title-btn">
+          <el-button type="success" @click="openDialog()" :disabled="currentConfigNodeKey === '' || currentConfigNodeKey === '1'">新增</el-button>
+          <el-button type="warning" @click="remove(tableCheckItems)" :disabled="tableCheckItems.length == 0">删除</el-button>
+          <!-- <el-button type="primary">导入模板</el-button>
+          <el-button type="primary">导出模板</el-button> -->
+        </div>
+        <div class="view-dataType-title-search">
+          <el-input placeholder="请输入机型/HMC码" v-model="keyWord" class="input1">
+            <el-button slot="append" icon="el-icon-search" @click="searchClick"></el-button>
+          </el-input>
+        </div>
+      </div>
+      <div class="view-dataType-table">
+        <el-table :data="tableData" class="table" @selection-change="selection">
+          <el-table-column type="selection" width="55" align="center"> </el-table-column>
+          <el-table-column prop="model" width="250" align="center" label="机型">
+            <template slot-scope="scope">{{ changeModel(scope.row.model) }} </template>
+          </el-table-column>
+          <el-table-column prop="hmcCode" width="250" align="center" label="HMC码"> </el-table-column>
+          <el-table-column prop="formula" label="公式" align="center">
+            <template slot-scope="scope">
+              <span><MathJax ref="MathJax" :formula="handleConvertFormula(scope.row.model, scope.row.formula)" /></span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" width="300">
+            <template slot-scope="scope">
+              <el-button :disabled="scope.row.isEdit == 0" @click="handUpdate(scope.row)" type="text" size="small">编辑</el-button>
+              <el-button :disabled="scope.row.isEdit == 0" @click="remove(scope.row)" type="text" size="small">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination
+          background
+          :total="tableRequset.total"
+          :page-size="tableRequset.pageSize"
+          :page-sizes="[10, 20, 30, 40, 50]"
+          layout="sizes,total, prev, pager, next, jumper"
+          @size-change="handleSizeChange"
+          @current-change="handleIndexChange"
+          style="padding: 20px; text-align: center"
+        >
+        </el-pagination>
+      </div>
+      <!-- 添加或修改判故逻辑对话框 -->
+      <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="60%" :before-close="handleClose">
+        <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+          <el-form-item label="机型" prop="model">
+            <el-select v-model="form.model" placeholder="请选择机型">
+              <el-option v-for="item in aircaftModelAll" :key="item.aircaftModelId" :label="item.aircaftModelName" :value="item.aircaftModelId"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="HMC码" prop="hmcCode">
+            <el-input v-model="form.hmcCode" placeholder="请输入HMC码" />
+          </el-form-item>
+          <el-col :span="24">
+            <el-form-item label="公式">
+              <MathJax ref="MathJax" :formula="form.formula" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="参数">
+              <el-button @click="addParams(item)" type="primary" v-for="(item, index) in paramsList" :key="index">{{ item }}</el-button>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="数字">
+              <el-button @click="addNumber(item)" type="primary" v-for="(item, index) in numberList" :key="index">{{ item }}</el-button>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="运算符">
+              <el-button @click="addSymbol(item)" type="primary" v-for="(item, index) in operatorList" :key="index">{{ item }}</el-button>
+            </el-form-item>
+          </el-col>
+        </el-form>
+
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" @click="submit">确 定</el-button>
+        </span>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getJudgeFaultLogic, getAircaftTypeAndModelTree, addJudgeFaultLogic, updateJudgeFaultLogic, removeJudgeFaultLogic } from '@/api/als/judgeFaultLogic'
+import { getAirConfigParams } from '@/api/als/airConfigParams'
+import { deepClone, debounce } from '@/utils/index'
+import { getDict } from '@/api/dict'
+import { getModel } from '@/api/als/model'
+import { getAircaftModelAll, getAircaftCatalogAll } from '@/api/als/aircraft'
+import { useMessage } from '@/utils/element-ui'
+
+export default {
+  name: 'JudgeFaultLogic',
+  components: {},
+  data() {
+    // 这里存放数据
+    return {
+      dialogTitle: '新增',
+      dialogVisible: false,
+      keyWord: '',
+      aircaftModelIdList: [],
+      currentNodeKey: '',
+      currentNode: {},
+      currentConfigNodeKey: '',
+      menuTreeData: [],
+      configTreeData: [],
+      modelData: [],
+      treeObj: {
+        title: '所属机种',
+        activityheight: '275px',
+        searchIcon: false,
+        configure: {
+          children: 'children',
+          label: 'label'
+        }
+      },
+      configurationTreeObj: {
+        title: '飞机构型',
+        activityheight: '275px',
+        searchIcon: false,
+        configure: {
+          children: 'children',
+          label: 'name'
+        }
+      },
+      typeTree: {
+        children: 'children',
+        label: 'label'
+      },
+      searchValue: '',
+      tableCheckItems: [],
+      tableData: [],
+      tableRequset: {
+        total: 0,
+        pageIndex: 1,
+        pageSize: 10,
+        searchValue: ''
+      },
+      form: {
+        id: '',
+        model: '',
+        hmcCode: '',
+        formula: ''
+      },
+      rules: {
+        // model: [{ required: true, message: '机型不能为空', trigger: 'change' }],
+        // hmcCode: [{ required: true, message: 'HMC码不能为空', trigger: 'blur' }],
+        // parameterColumn: [{ required: true, message: '参数列不能为空', trigger: 'change' }]
+      },
+      debounceFn: debounce(this.fetch, 500),
+      aircaftModelAll: [],
+      allAirConfig: [],
+      btnList: [],
+      operatorList: ['+', '-', '*', '/', '>', '<', '≥', '≤', '(', ')', '&&', '||', '==', '≠', '删除', '清空'],
+      numberList: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
+      paramsList: ['年纪', '月收入', '抵押品价值', '信用评分', '有担保人']
+    }
+  },
+  watch: {
+    keyWord() {
+      this.tableRequset.pageIndex = 1
+      this.debounceFn()
+    }
+  },
+  mounted() {
+    // this.getJudgeFaultLogicAPI()
+    this.getAircaftTypeAndModelTreeAPI()
+  },
+  methods: {
+    async getAircaftTypeAndModelTreeAPI(params) {
+      const { data } = await getAircaftTypeAndModelTree(params)
+      this.menuTreeData = data
+      const { data: airConfigData } = await getAirConfiguration()
+      this.allAirConfig = airConfigData
+      const getAircaftModelAllParams = {
+        aircaftTypeCode: '',
+        aircaftTypeId: '',
+        queryParam: ''
+      }
+      const { data: data1 } = await getAircaftModelAll(getAircaftModelAllParams)
+      this.aircaftModelAll = data1
+    },
+
+    async removeJudgeFaultLogicAPI(params) {
+      try {
+        const { code } = await removeJudgeFaultLogic(params)
+        if (code === 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          })
+          await this.getJudgeFaultLogicAPI()
+          this.handleClose()
+        }
+      } catch (error) {}
+    },
+
+    getTreeLeafData(list) {
+      const newArr = []
+      function getLeaf(data, arr) {
+        data.forEach((e) => {
+          if (e.type === 1) {
+            arr.push(e)
+          }
+          if (e.children.length) {
+            getLeaf(e.children, arr)
+          }
+        })
+      }
+      getLeaf(list, newArr)
+      return newArr
+    },
+
+    async getJudgeFaultLogicAPI(params) {
+      if (this.$refs.table) this.$refs.table.clearSelection()
+      const { keyWord } = this
+      const { pageSize, pageIndex } = this.tableRequset
+      const {
+        data: { list, total }
+      } = await getJudgeFaultLogic({ pageSize, pageNum: pageIndex, keyWord, ...params })
+      this.tableData = list
+      this.tableData.forEach((item, index) => {
+        if (index == 0) {
+          item.formula = '年纪 ≥ 25 && ( 月收入 ≥ 10000 || 抵押品价值 ≥ 500000 ) / ( 信用评分 ≥ 700 || 有担保人 == 1 )'
+        } else {
+          item.formula = ''
+        }
+      })
+      // this.tableData = list.map((item) => {
+      //   return { ...item, formula: '年纪 ≥ 25 && ( 月收入 ≥ 10000 || 抵押品价值 ≥ 500000 ) / ( 信用评分 ≥ 700 || 有担保人 == 1 )' }
+      // })
+      this.tableRequset.total = total
+      const getAircaftModelAllParams = {
+        aircaftTypeCode: '',
+        aircaftTypeId: '',
+        queryParam: ''
+      }
+      const { data: data1 } = await getAircaftModelAll(getAircaftModelAllParams)
+      this.aircaftModelAll = data1
+    },
+
+    fetch() {
+      this.getJudgeFaultLogicAPI()
+    },
+
+    searchClick() {
+      this.getJudgeFaultLogicAPI()
+    },
+
+    async addJudgeFaultLogicAPI() {
+      this.form.parameterColumn = this.form.parameterColumn.toString()
+      try {
+        delete this.form.aircaftModelName
+        const { code } = await addJudgeFaultLogic({ ...this.form })
+        if (code === 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          })
+          this.getJudgeFaultLogicAPI()
+          this.handleClose()
+        }
+      } catch (error) {}
+    },
+
+    async updateJudgeFaultLogicAPI() {
+      this.form.parameterColumn = this.form.parameterColumn.toString()
+      try {
+        const { code } = await updateJudgeFaultLogic({ ...this.form })
+        if (code === 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          })
+          this.getJudgeFaultLogicAPI()
+          this.handleClose()
+        }
+      } catch (error) {}
+    },
+
+    async treeNodeClick(data) {
+      this.currentNode = data
+      let dataTree = []
+      if (data.type === 1) {
+        const { data: data1 } = await getAirConfiguration({ aircraftType: data.id })
+        dataTree = data1
+        this.getAirConfigParamsAPI({ aircraftType: data.id })
+        this.currentNodeKey = data.id
+      }
+      this.configTreeData = []
+      const topNode = { id: '1', name: '整机', children: [] }
+      topNode.children = handleTree(dataTree, 'id')
+      this.configTreeData.push(topNode)
+    },
+
+    treeConfigNodeClick(data) {
+      this.$refs.table.clearSelection()
+      this.currentConfigNodeKey = this.form.sysId = data.id
+      this.currentConfigNode = data
+      this.getAirConfigParamsAPI({ sysId: this.currentConfigNodeKey })
+    },
+
+    changeModel(item) {
+      const matchedItem = this.aircaftModelAll?.find((i) => item === i.aircaftModelId)
+      if (matchedItem) {
+        return matchedItem.aircaftModelName
+      } else {
+        return item
+      }
+    },
+
+    openDialog() {
+      this.dialogTitle = '新增'
+      this.dialogVisible = true
+      this.form.aircraftType = this.currentNode.id
+      this.form.sysId = this.currentConfigNodeKey
+    },
+
+    handleClose() {
+      this.dialogVisible = false
+      this.form = {
+        id: '',
+        model: '',
+        hmcCode: '',
+        formula: ''
+      }
+    },
+
+    handleIndexChange(val) {
+      this.tableRequset.pageIndex = val
+      this.getJudgeFaultLogicAPI()
+    },
+    handleSizeChange(val) {
+      this.tableRequset.pageSize = val
+      this.getJudgeFaultLogicAPI()
+    },
+
+    handUpdate(row) {
+      this.dialogTitle = '编辑'
+      this.form = deepClone(row)
+      // this.$set(this.form, 'formula', '$$年纪 \\geq 25 \\&\\& (月收入 \\geq 10000 \\parallel 抵押品价值\\geq 500000)\\&\\&(信用评分\\geq 700 \\parallel 有担保人= 1)$$')
+      // this.form.formula = ''
+      this.dialogVisible = true
+    },
+
+    submit() {
+      let c = this.form.formula.slice(2, this.form.formula.length - 2).split(' ')
+      console.log('c', c)
+      let newFormula = c.map((item) => (item === '\\&\\&' ? '&&' : item))
+      this.form.formulatr = newFormula.join(' ')
+      console.log('this.form', this.form)
+      // this.$refs['form'].validate((valid) => {
+      //   if (valid) {
+      //     switch (this.dialogTitle) {
+      //       case '编辑':
+      //         this.updateJudgeFaultLogicAPI()
+      //         break
+      //       case '新增':
+      //         this.addJudgeFaultLogicAPI()
+      //         break
+      //     }
+      //   }
+      // })
+    },
+
+    selection(val) {
+      this.tableCheckItems = val
+    },
+
+    remove(row) {
+      this.$confirm('是否删除该机种', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          this.removeJudgeFaultLogicAPI(row.map((e) => e.id))
+        })
+        .catch(() => {})
+    },
+
+    // 增加参数
+    addParams(params) {
+      let formula = deepClone(this.form.formula)
+      // 先拿到当前的字符 去除前后 $$ 符号 以空格分隔
+      let c = formula.slice(2, formula.length - 2).split(' ')
+      if (this.paramsList.find((i) => i == c[c.length - 1])) {
+        useMessage('error', '不能连续输入两个参数')
+        return
+      } else if (this.numberList.find((i) => i == c[c.length - 1])) {
+        useMessage('error', '参数和数字不能相邻')
+        return
+      } else {
+        c.push(params)
+        const str = c.join(' ')
+        this.form.formula = `$$${str}$$`
+      }
+    },
+
+    // 增加数字
+    addNumber(number) {
+      let formula = deepClone(this.form.formula)
+      // 先拿到当前的字符 去除前后 $$ 符号 以空格分隔
+      let c = formula.slice(2, formula.length - 2).split(' ')
+      if (number == '.' && !this.numberList.find((i) => i == c[c.length - 1])) {
+        useMessage('error', '小数点前必须为数字')
+        return
+      }
+      if (this.paramsList.find((i) => i == c[c.length - 1])) {
+        useMessage('error', '参数和数字不能相邻')
+        return
+      } else {
+        c.push(number)
+        const str = c.join(' ')
+        this.form.formula = `$$${str}$$`
+      }
+    },
+
+    // 增加运算符
+    addSymbol(item) {
+      let n = deepClone(this.form.formula)
+      const syf = ['+', '-', '*', '/', '>', '<', '≥', '≤', '&&', '||', '≠', '==', '\\&\\&']
+      if (item == '删除') {
+        if (n.length == 0) {
+          return
+        } else {
+          let c = n.slice(2, n.length - 2).split(' ')
+          let j = c.slice(0, c.length - 1)
+          if (j.length == 0) {
+            this.form.formula = ''
+            return
+          } else {
+            const str = j.join(' ')
+            this.form.formula = `$$${str}$$`
+            return
+          }
+        }
+      }
+      if (item == '清空') {
+        this.form.formula = ''
+      } else {
+        // 如果是空
+        if (n.length == 0) {
+          // 第一位不能输入 syf 里面的任意字符
+          if (syf.find((i) => i == item)) {
+            useMessage('error', '第一位不能输入运算符')
+            return
+          }
+          this.form.formula = `$$${item}$$`
+        } else {
+          let c = n.slice(2, n.length - 2).split(' ')
+          // 不能连续输入  syf 里面的任意字符
+          if (syf.find((i) => i == c[c.length - 1]) && syf.find((i) => i == item)) {
+            useMessage('error', '不能连续输入运算符')
+            return
+          }
+          if (item == '&&') {
+            c.push('\\&\\&')
+            const str = c.join(' ')
+            this.form.formula = `$$${str}$$`
+          } else {
+            c.push(item)
+            const str = c.join(' ')
+            this.form.formula = `$$${str}$$`
+          }
+        }
+      }
+    },
+
+    // 转换公式
+    async handleConvertFormula(aircraftType, formula) {
+      // '年纪 ≥ 25 && (月收入 ≥ 10000 || 抵押品价值 ≥ 500000) && (信用评分 ≥ 700 || 有担保人 == 1)'
+      // '$$年纪 \\geq 25 \\&\\& (月收入 \\geq 10000 \\parallel 抵押品价值\\geq 500000)\\&\\&(信用评分\\geq 700 \\parallel 有担保人= 1)$$'
+      let c = formula.split(' ')
+      let newFormula = c.map((item, index) => {
+        if (item == '&&') {
+          return '\\&\\&'
+        } else {
+          return item
+        }
+      })
+      const str = newFormula.join(' ')
+      return `$$${str}$$`
+    },
+
+    // 查找相匹配的括号的位置 (公式数组,传入的括号型号,传入括号的位置)
+    findBracketPos(formulaArray, bracketType, position) {
+      // stack用来存储多层括号,findPos为最终匹配上的括号位置
+      let stack = [],
+        findPos
+      if (bracketType == '(') {
+        console.log('findPos1', findPos)
+        for (let i = position + 1; i < formulaArray.length; i++) {
+          console.log('findPos3', findPos)
+          if (formulaArray[i] == '(') {
+            stack.push('(')
+          } else if (formulaArray[i] == ')') {
+            if (stack.length !== 0) {
+              stack.pop()
+            } else {
+              findPos = i
+              console.log('findPos2', findPos)
+              break
+            }
+          }
+        }
+      } else if (bracketType == ')') {
+        for (let i = formulaArray.length - 1; i > 0; i--) {
+          if (formulaArray[i] == ')') {
+            stack.push(')')
+          } else if (formulaArray[i] == '(') {
+            if (stack.length !== 0) {
+              stack.pop()
+            } else {
+              findPos = i
+              break
+            }
+          }
+        }
+      }
+      return findPos
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+@import '../index.scss';
+.table {
+  width: 100%;
+  height: calc(100vh - 280px);
+  overflow: scroll;
+}
+::-webkit-scrollbar {
+  display: none;
+}
+</style>

+ 331 - 221
src/views/als/judgeFaultLogic/index.vue

@@ -1,50 +1,102 @@
 <template>
   <div class="view-table-content">
-    <!-- <div class="view-dataSpecies-left">
-      <MenuTree :currentNodeKey="currentNodeKey" nodeKey="id" :treedata="menuTreeData" @TreeNodeclick="treeNodeClick" v-bind="treeObj"> </MenuTree>
-    </div> -->
-    <div style="width: 100%">
+    <div class="view-dataSpecies-left" style="display: flex; width: 430px">
+      <MenuTree :currentNodeKey="currentNodeKey" nodeKey="id" :treedata="menuTreeData" @TreeNodeclick="treeNodeClick" v-bind="treeObj" style="width: 250px"> </MenuTree>
+      <MenuTree :currentNodeKey="currentConfigNodeKey" nodeKey="id" :treedata="configTreeData" @TreeNodeclick="treeConfigNodeClick" v-bind="configurationTreeObj" style="width: 250px"> </MenuTree>
+    </div>
+    <div class="view-dataSpecies-right" style="width: calc(100% - 460px)">
       <div class="view-dataType-title">
         <div class="view-dataType-title-btn">
-          <el-button type="success" @click="openDialog()" :disabled="currentNode && currentNode.type == 0">新增</el-button>
+          <el-button type="success" @click="openDialog()" :disabled="currentConfigNodeKey === '' || currentConfigNodeKey === '1'">新增</el-button>
           <el-button type="warning" @click="remove(tableCheckItems)" :disabled="tableCheckItems.length == 0">删除</el-button>
-          <!-- <el-button type="primary">导入模板</el-button>
-          <el-button type="primary">导出模板</el-button> -->
         </div>
         <div class="view-dataType-title-search">
-          <el-input placeholder="请输入机型/HMC码" v-model="keyWord" class="input1">
+          <el-input placeholder="请输入判据名称" v-model="keyWordData" class="input1">
             <el-button slot="append" icon="el-icon-search" @click="searchClick"></el-button>
           </el-input>
         </div>
       </div>
       <div class="view-dataType-table">
-        <LTable ref="table" @selection-change="selection" :defaultFetch="false" :fetch="fetch" :columns="columns" :dataSource="tableData" :options="options" :pagination="tableRequset"></LTable>
+        <el-table :data="tableData" ref="table" class="table" @selection-change="selection">
+          <el-table-column type="selection" width="55" align="center"> </el-table-column>
+          <!-- <el-table-column prop="model" width="250" align="center" label="机型">
+            <template slot-scope="scope">{{ changeModel(scope.row.model) }} </template>
+          </el-table-column> -->
+          <el-table-column prop="sysId" width="250" align="center" label="系统">
+            <template slot-scope="scope">{{ changeSys(scope.row.sysId) }} </template>
+          </el-table-column>
+          <el-table-column prop="name" width="250" align="center" label="判据名称"> </el-table-column>
+          <el-table-column prop="hmcCode" width="250" align="center" label="HMC码"> </el-table-column>
+          <el-table-column prop="remarks" label="公式" align="center">
+            <template slot-scope="scope">
+              <span><MathJax ref="MathJax" :formula="scope.row.remarks" /></span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" width="180">
+            <template slot-scope="scope">
+              <el-button :disabled="scope.row.isEdit == 0" @click="handUpdate(scope.row)" type="text" size="small">编辑</el-button>
+              <el-button :disabled="scope.row.isEdit == 0" @click="remove([scope.row])" type="text" size="small">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination
+          background
+          :total="tableRequset.total"
+          :page-size="tableRequset.pageSize"
+          :page-sizes="[10, 20, 30, 40, 50]"
+          layout="sizes,total, prev, pager, next, jumper"
+          @size-change="handleSizeChange"
+          @current-change="handleIndexChange"
+          style="padding: 20px; text-align: center"
+        >
+        </el-pagination>
       </div>
       <!-- 添加或修改判故逻辑对话框 -->
       <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="60%" :before-close="handleClose">
         <el-form ref="form" :model="form" :rules="rules" label-width="80px">
           <el-form-item label="机型" prop="model">
-            <el-select v-model="form.model" placeholder="请选择机型">
+            <el-select disabled v-model="form.model" placeholder="请选择机型">
               <el-option v-for="item in aircaftModelAll" :key="item.aircaftModelId" :label="item.aircaftModelName" :value="item.aircaftModelId"> </el-option>
             </el-select>
           </el-form-item>
+          <el-form-item label="系统" prop="sysId">
+            <el-select disabled v-model="form.sysId" placeholder="请选择系统">
+              <el-option v-for="item in allAirConfig" :key="item.id" :label="item.name" :value="item.id"> </el-option>
+            </el-select>
+          </el-form-item>
           <el-form-item label="HMC码" prop="hmcCode">
             <el-input v-model="form.hmcCode" placeholder="请输入HMC码" />
           </el-form-item>
-          <el-form-item label="参数列" prop="parameterColumn">
-            <el-checkbox-group v-model="form.parameterColumn">
-              <div style="column-count: 3">
-                <el-checkbox v-for="dict in dictData" :key="dict.dictValue" :value="dict.dictValue" :label="dict.dictLabel">{{ dict.dictLabel }}</el-checkbox>
-              </div>
-            </el-checkbox-group>
+          <el-form-item label="HMC码参数" label-width="100px" prop="attribute1">
+            <el-input v-model="form.attribute1" type="textarea" :rows="2" placeholder="请输入HMC码参数,如:发动机排气温度,燃油流量,机匣频率" />
           </el-form-item>
-          <!-- <el-form-item label="模型" prop="pattern">
-            <el-select v-model="form.pattern" placeholder="请选择模型">
-              <el-option v-for="item in modelData.list" :key="item.id" :label="item.name" :value="item.id" />
-            </el-select>
-          </el-form-item> -->
+          <el-form-item label="判据名称" prop="name">
+            <el-input v-model="form.name" placeholder="请输入判据名称" />
+          </el-form-item>
+          <el-col :span="24">
+            <el-form-item label="公式">
+              <MathJax ref="MathJax" :formula="form.remarks" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="参数">
+              <div v-if="paramsList.length !== 0">
+                <el-button @click="addParams(item)" type="primary" v-for="(item, index) in paramsList" :key="index">{{ item }}</el-button>
+              </div>
+              <span v-else style="color: white">暂无参数,请去构型参数管理页面添加</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="数字">
+              <el-button @click="addNumber(item)" type="primary" v-for="(item, index) in numberList" :key="index">{{ item }}</el-button>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="运算符">
+              <el-button @click="addSymbol(item)" type="primary" v-for="(item, index) in operatorList" :key="index">{{ item }}</el-button>
+            </el-form-item>
+          </el-col>
         </el-form>
-
         <span slot="footer" class="dialog-footer">
           <el-button @click="handleClose">取 消</el-button>
           <el-button type="primary" @click="submit">确 定</el-button>
@@ -57,9 +109,12 @@
 <script>
 import { getJudgeFaultLogic, getAircaftTypeAndModelTree, addJudgeFaultLogic, updateJudgeFaultLogic, removeJudgeFaultLogic } from '@/api/als/judgeFaultLogic'
 import { deepClone, debounce } from '@/utils/index'
-import { getDict } from '@/api/dict'
-import { getModel } from '@/api/als/model'
 import { getAircaftModelAll, getAircaftCatalogAll } from '@/api/als/aircraft'
+import { handleTree } from '../utils/common'
+import { getAirConfiguration } from '@/api/als/airConfiguration'
+import { getAirConfigParams } from '@/api/als/airConfigParams'
+import { useMessage } from '@/utils/element-ui'
+
 export default {
   name: 'JudgeFaultLogic',
   components: {},
@@ -68,12 +123,13 @@ export default {
     return {
       dialogTitle: '新增',
       dialogVisible: false,
-      keyWord: '',
+      keyWordData: '',
       aircaftModelIdList: [],
-      currentNodeKey: null,
-      currentNode: null,
+      currentNodeKey: '',
+      currentNode: {},
+      currentConfigNodeKey: '',
       menuTreeData: [],
-      dictData: [],
+      configTreeData: [],
       modelData: [],
       treeObj: {
         title: '所属机种',
@@ -84,82 +140,20 @@ export default {
           label: 'label'
         }
       },
+      configurationTreeObj: {
+        title: '飞机系统',
+        activityheight: '275px',
+        searchIcon: false,
+        configure: {
+          children: 'children',
+          label: 'name'
+        }
+      },
       typeTree: {
         children: 'children',
         label: 'label'
       },
       searchValue: '',
-      columns: [
-        // { prop: 'id', label: '编号' },
-        {
-          prop: 'model',
-          label: '机型',
-          width: '300px',
-          render: (h, params) => {
-            const matchedItem = this.aircaftModelAll?.find((item) => params.row.model === item.aircaftModelId)
-            if (matchedItem) {
-              return h('span', matchedItem.aircaftModelName)
-            } else {
-              return h('span', params.row.model)
-            }
-          }
-        },
-        {
-          prop: 'hmcCode',
-          label: 'HMC码',
-          width: '300px'
-        },
-        {
-          prop: 'parameterColumn',
-          label: '参数列'
-        },
-        // {
-        //   prop: 'pattern',
-        //   label: '模型',
-        //   render: (h, params) => {
-        //     const matchedItem = this.modelData.list?.find((item) => params.row.pattern === item.id)
-        //     if (matchedItem) {
-        //       return h('span', matchedItem.name)
-        //     } else {
-        //       return h('span', {}, '')
-        //     }
-        //   }
-        // },
-        {
-          button: true,
-          label: '操作',
-          width: '240px',
-          group: [
-            {
-              name: '编辑',
-              type: 'text',
-              round: false,
-              plain: false,
-              onClick: (row, index, scope) => {
-                this.handUpdate(row)
-              }
-            },
-            {
-              name: '删除',
-              type: 'text',
-              round: false,
-              plain: false,
-              onClick: (row, index, scope) => {
-                this.remove([row])
-              }
-            }
-          ]
-        }
-      ],
-      options: {
-        stripe: true, // 斑马纹
-        mutiSelect: true, // 多选框
-        index: false, // 显示序号, 多选则 mutiSelect
-        loading: false, // 表格动画
-        initTable: false, // 是否一挂载就加载数据
-        border: true,
-        height: 'calc(100vh - 300px)'
-      },
       tableCheckItems: [],
       tableData: [],
       tableRequset: {
@@ -172,63 +166,44 @@ export default {
         id: '',
         model: '',
         hmcCode: '',
-        parameterColumn: [],
-        pattern: '',
+        sysId: '',
+        name: '',
         remarks: '',
-        tenantId: '',
-        delFlag: '',
-        version: '',
-        createBy: '',
-        createTime: '',
-        updateBy: '',
-        updateTime: ''
+        attribute1: ''
       },
       rules: {
         model: [{ required: true, message: '机型不能为空', trigger: 'change' }],
+        sysId: [{ required: true, message: '系统不能为空', trigger: 'change' }],
         hmcCode: [{ required: true, message: 'HMC码不能为空', trigger: 'blur' }],
-        parameterColumn: [{ required: true, message: '参数列不能为空', trigger: 'change' }]
-        // pattern: [{ required: false, message: '模型不能为空', trigger: 'blur' }]
+        name: [{ required: true, message: '判据名称不能为空', trigger: 'blur' }]
       },
-      debounceFn: debounce(this.fetch, 500),
-      aircaftModelAll: []
-    }
-  },
-  watch: {
-    keyWord() {
-      this.tableRequset.pageIndex = 1
-      this.debounceFn()
+      aircaftModelAll: [],
+      allAirConfig: [],
+      operatorList: ['+', '-', '*', '/', '>', '<', '≥', '≤', '(', ')', '&&', '||', '==', '≠', '删除', '清空'],
+      numberList: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
+      paramsList: []
     }
   },
   mounted() {
-    this.getDict()
-    this.getModelAPI()
-    this.getJudgeFaultLogicAPI()
-    // this.getAircaftTypeAndModelTreeAPI()
+    this.getAircaftTypeAndModelTreeAPI()
   },
   methods: {
-    async getDict() {
-      const { data } = await getDict('als_parameter_column')
-      this.dictData = data
-    },
-
-    async getModelAPI() {
-      const { data } = await getModel({ pageSize: 100, pageNum: 1, ...{ type: 5 } })
-      this.modelData = data
-      console.log('this.modelData', this.modelData)
-    },
-
     async getAircaftTypeAndModelTreeAPI(params) {
       const { data } = await getAircaftTypeAndModelTree(params)
       this.menuTreeData = data
-      if (data.length) {
-        this.currentNodeKey = data[0].value
-        this.currentNode = data[0]
-        this.aircaftModelIdList = this.getTreeLeafData(data[0]?.children).map((e) => e.id)
-        this.getJudgeFaultLogicAPI()
+      const { data: airConfigData } = await getAirConfiguration()
+      this.allAirConfig = airConfigData
+      const getAircaftModelAllParams = {
+        aircaftTypeCode: '',
+        aircaftTypeId: '',
+        queryParam: ''
       }
+      const { data: data1 } = await getAircaftModelAll(getAircaftModelAllParams)
+      this.aircaftModelAll = data1
     },
 
     async removeJudgeFaultLogicAPI(params) {
+      console.log('params', params)
       try {
         const { code } = await removeJudgeFaultLogic(params)
         if (code === 200) {
@@ -236,98 +211,69 @@ export default {
             type: 'success',
             message: '操作成功!'
           })
-          await this.getJudgeFaultLogicAPI()
+          await this.getJudgeFaultLogicAPI({ model: this.currentNodeKey, sysId: this.currentConfigNodeKey })
           this.handleClose()
         }
       } catch (error) {}
     },
 
-    getTreeLeafData(list) {
-      const newArr = []
-      function getLeaf(data, arr) {
-        data.forEach((e) => {
-          if (e.type === 1) {
-            arr.push(e)
-          }
-          if (e.children.length) {
-            getLeaf(e.children, arr)
-          }
-        })
-      }
-      getLeaf(list, newArr)
-      return newArr
-    },
-
     async getJudgeFaultLogicAPI(params) {
       if (this.$refs.table) this.$refs.table.clearSelection()
-      const { keyWord } = this
       const { pageSize, pageIndex } = this.tableRequset
       const {
         data: { list, total }
-      } = await getJudgeFaultLogic({ pageSize, pageNum: pageIndex, keyWord, ...params })
+      } = await getJudgeFaultLogic({ pageSize, pageNum: pageIndex, ...params })
       this.tableData = list
-      this.tableRequset.total = total
-      const getAircaftModelAllParams = {
-        aircaftTypeCode: '',
-        aircaftTypeId: '',
-        queryParam: ''
-      }
-      const { data: data1 } = await getAircaftModelAll(getAircaftModelAllParams)
-      this.aircaftModelAll = data1
-    },
+      this.tableData.forEach((item) => {
+        const newFormula = item.remarks.replace(/&&/g, '\\&\\&')
 
-    fetch() {
-      this.getJudgeFaultLogicAPI()
+        item.remarks = `$$${newFormula}$$`
+      })
+      this.tableRequset.total = total
     },
 
     searchClick() {
-      this.getJudgeFaultLogicAPI()
-    },
-
-    async addJudgeFaultLogicAPI() {
-      this.form.parameterColumn = this.form.parameterColumn.toString()
-      try {
-        delete this.form.aircaftModelName
-        const { code } = await addJudgeFaultLogic({ ...this.form })
-        if (code === 200) {
-          this.$message({
-            type: 'success',
-            message: '操作成功!'
-          })
-          this.getJudgeFaultLogicAPI()
-          this.handleClose()
-        }
-      } catch (error) {}
+      this.getJudgeFaultLogicAPI({ model: this.currentNodeKey, sysId: this.currentConfigNodeKey, name: keyWordData })
     },
 
-    async updateJudgeFaultLogicAPI() {
-      this.form.parameterColumn = this.form.parameterColumn.toString()
-      try {
-        const { code } = await updateJudgeFaultLogic({ ...this.form })
-        if (code === 200) {
-          this.$message({
-            type: 'success',
-            message: '操作成功!'
-          })
-          this.getJudgeFaultLogicAPI()
-          this.handleClose()
-        }
-      } catch (error) {}
+    async treeNodeClick(data) {
+      this.currentNode = data
+      let dataTree = []
+      if (data.type === 1) {
+        dataTree = this.allAirConfig.filter((item) => {
+          return item.aircraftType == data.id
+        })
+        this.getJudgeFaultLogicAPI({ model: data.id })
+        this.currentNodeKey = data.id
+      }
+      this.configTreeData = []
+      const topNode = { id: '1', name: '整机', children: [] }
+      topNode.children = handleTree(dataTree, 'id')
+      this.configTreeData.push(topNode)
     },
 
-    treeNodeClick(data) {
+    treeConfigNodeClick(data) {
       this.$refs.table.clearSelection()
-      this.currentNodeKey = data.id
-      this.currentNode = data
-      this.aircaftModelIdList = this.getTreeLeafData(data.children.length ? data.children : [data]).map((e) => e.id)
-      this.getJudgeFaultLogicAPI()
+      this.currentConfigNodeKey = this.form.sysId = data.id
+      this.currentConfigNode = data
+      this.getJudgeFaultLogicAPI({ sysId: this.currentConfigNodeKey })
     },
 
-    openDialog() {
+    async openDialog() {
       this.dialogTitle = '新增'
-      this.dialogVisible = true
-      // this.form.aircaftModelName = this.currentNode.label
-      // this.form.aircaftModelId = this.currentNode.id
+      const {
+        data: { list },
+        code
+      } = await getAirConfigParams({ pageSize: 1000, pageNum: 1, sysId: this.currentConfigNodeKey })
+      this.paramsList = []
+      if (code == 200) {
+        list.forEach((item) => {
+          this.paramsList.push(item.name)
+        })
+        this.dialogVisible = true
+      }
+      this.form.model = this.currentNode.id
+      this.form.sysId = this.currentConfigNodeKey
     },
 
     handleClose() {
@@ -336,29 +282,45 @@ export default {
         id: '',
         model: '',
         hmcCode: '',
-        parameterColumn: [],
-        pattern: '',
+        sysId: '',
+        name: '',
         remarks: '',
-        tenantId: '',
-        delFlag: '',
-        version: '',
-        createBy: '',
-        createTime: '',
-        updateBy: '',
-        updateTime: ''
+        attribute1: ''
       }
     },
-
-    handUpdate(row) {
+    async handUpdate(row) {
       this.dialogTitle = '编辑'
       this.form = deepClone(row)
-      this.form.parameterColumn = this.form.parameterColumn.split(',')
-      this.dialogVisible = true
+      const {
+        data: { list },
+        code
+      } = await getAirConfigParams({ pageSize: 1000, pageNum: 1, sysId: row.sysId })
+      this.paramsList = []
+      if (code == 200) {
+        list.forEach((item) => {
+          this.paramsList.push(item.name)
+        })
+        this.dialogVisible = true
+      }
+    },
+
+    handleIndexChange(val) {
+      this.tableRequset.pageIndex = val
+      this.getJudgeFaultLogicAPI({ model: this.currentNodeKey, sysId: this.currentConfigNodeKey })
+    },
+    handleSizeChange(val) {
+      this.tableRequset.pageSize = val
+      this.getJudgeFaultLogicAPI({ model: this.currentNodeKey, sysId: this.currentConfigNodeKey })
     },
 
     submit() {
       this.$refs['form'].validate((valid) => {
         if (valid) {
+          let c = this.form.remarks.slice(2, this.form.remarks.length - 2).split(' ')
+          console.log('c', c)
+          let newFormula = c.map((item) => (item === '\\&\\&' ? '&&' : item))
+          this.form.remarks = newFormula.join(' ')
+          console.log('this.form', this.form)
           switch (this.dialogTitle) {
             case '编辑':
               this.updateJudgeFaultLogicAPI()
@@ -371,12 +333,40 @@ export default {
       })
     },
 
+    async addJudgeFaultLogicAPI() {
+      try {
+        const { code } = await addJudgeFaultLogic({ ...this.form })
+        if (code === 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          })
+          this.getJudgeFaultLogicAPI({ model: this.currentNodeKey, sysId: this.currentConfigNodeKey })
+          this.handleClose()
+        }
+      } catch (error) {}
+    },
+
+    async updateJudgeFaultLogicAPI() {
+      try {
+        const { code } = await updateJudgeFaultLogic({ ...this.form })
+        if (code === 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          })
+          this.getJudgeFaultLogicAPI({ model: this.currentNodeKey, sysId: this.currentConfigNodeKey })
+          this.handleClose()
+        }
+      } catch (error) {}
+    },
+
     selection(val) {
       this.tableCheckItems = val
     },
 
     remove(row) {
-      this.$confirm('是否删除该机种', '提示', {
+      this.$confirm('是否删除该判据', '提示', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'
@@ -385,6 +375,118 @@ export default {
           this.removeJudgeFaultLogicAPI(row.map((e) => e.id))
         })
         .catch(() => {})
+    },
+
+    changeSys(item) {
+      const matchedItem = this.allAirConfig?.find((i) => item === i.id)
+      if (matchedItem) {
+        return matchedItem.name
+      } else {
+        return item
+      }
+    },
+
+    // 增加参数
+    addParams(params) {
+      let formula = deepClone(this.form.remarks)
+      // 先拿到当前的字符 去除前后 $$ 符号 以空格分隔
+      let c = formula.slice(2, formula.length - 2).split(' ')
+      if (this.paramsList.find((i) => i == c[c.length - 1])) {
+        useMessage('error', '不能连续输入两个参数')
+        return
+      } else if (this.numberList.find((i) => i == c[c.length - 1])) {
+        useMessage('error', '参数和数字不能相邻')
+        return
+      } else {
+        c.push(params)
+        const str = c.join(' ')
+        this.form.remarks = `$$${str}$$`
+      }
+    },
+
+    // 增加数字
+    addNumber(number) {
+      let formula = deepClone(this.form.remarks)
+      // 先拿到当前的字符 去除前后 $$ 符号 以空格分隔
+      let c = formula.slice(2, formula.length - 2).split(' ')
+      if (number == '.' && !this.numberList.find((i) => i == c[c.length - 1])) {
+        useMessage('error', '小数点前必须为数字')
+        return
+      }
+      if (this.paramsList.find((i) => i == c[c.length - 1])) {
+        useMessage('error', '参数和数字不能相邻')
+        return
+      } else {
+        c.push(number)
+        const str = c.join(' ')
+        this.form.remarks = `$$${str}$$`
+      }
+    },
+
+    // 增加运算符
+    addSymbol(item) {
+      let n = deepClone(this.form.remarks)
+      const syf = ['+', '-', '*', '/', '>', '<', '≥', '≤', '&&', '||', '≠', '==', '\\&\\&']
+      if (item == '删除') {
+        if (n.length == 0) {
+          return
+        } else {
+          let c = n.slice(2, n.length - 2).split(' ')
+          let j = c.slice(0, c.length - 1)
+          if (j.length == 0) {
+            this.form.remarks = ''
+            return
+          } else {
+            const str = j.join(' ')
+            this.form.remarks = `$$${str}$$`
+            return
+          }
+        }
+      }
+      if (item == '清空') {
+        this.form.remarks = ''
+      } else {
+        // 如果是空
+        if (n.length == 0) {
+          // 第一位不能输入 syf 里面的任意字符
+          if (syf.find((i) => i == item)) {
+            useMessage('error', '第一位不能输入运算符')
+            return
+          }
+          this.form.remarks = `$$${item}$$`
+        } else {
+          let c = n.slice(2, n.length - 2).split(' ')
+          // 不能连续输入  syf 里面的任意字符
+          if (syf.find((i) => i == c[c.length - 1]) && syf.find((i) => i == item)) {
+            useMessage('error', '不能连续输入运算符')
+            return
+          }
+          if (item == '&&') {
+            c.push('\\&\\&')
+            const str = c.join(' ')
+            this.form.remarks = `$$${str}$$`
+          } else {
+            c.push(item)
+            const str = c.join(' ')
+            this.form.remarks = `$$${str}$$`
+          }
+        }
+      }
+    },
+
+    // 转换公式
+    handleConvertFormula(aircraftType, formula) {
+      let c = formula.split(' ')
+      let newFormula = c.map((item, index) => {
+        if (item == '&&') {
+          return '\\&\\&'
+        } else {
+          return item
+        }
+      })
+      const str = newFormula.join(' ')
+      console.log('str', `$$${str}$$`)
+      return `$$${str}$$`
     }
   }
 }
@@ -392,4 +494,12 @@ export default {
 
 <style lang="scss">
 @import '../index.scss';
+.table {
+  width: 100%;
+  height: calc(100vh - 280px);
+  overflow: scroll;
+}
+::-webkit-scrollbar {
+  display: none;
+}
 </style>

+ 27 - 9
src/views/als/lifePrediction/index.vue

@@ -34,6 +34,18 @@
           <el-form-item label="部件" prop="partId">
             <treeselect noOptionsText="该机型暂无构型信息,请在构型管理中添加" :value="form.partId" :normalizer="normalizer" :options="partsData" :show-count="true" placeholder="请选择部件" @select="partIdSelect" />
           </el-form-item>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="部件型号" prop="model">
+                <el-input disabled placeholder="选择部件自动关联" style="width: 90%" v-model="form.model" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="部件编号" prop="code">
+                <el-input style="width: 90%" disabled placeholder="选择部件自动关联" v-model="form.code" />
+              </el-form-item>
+            </el-col>
+          </el-row>
         </el-form>
 
         <span slot="footer" class="dialog-footer">
@@ -41,7 +53,7 @@
           <el-button type="primary" @click="submit">确 定</el-button>
         </span>
       </el-dialog>
-      <el-dialog title="执行进度" :visible.sync="progressVisible" width="800px" :before-close="handleClose">
+      <el-dialog title="执行进度" :visible.sync="progressVisible" width="800px">
         <el-progress :text-inside="true" :stroke-width="24" :percentage="percentage" status="success"></el-progress>
       </el-dialog>
       <el-dialog title="结果展示" :visible.sync="resultVisible" width="50%" :before-close="resultShowDialogClose">
@@ -122,6 +134,14 @@ export default {
           prop: 'code',
           label: '部件编码'
         },
+        {
+          prop: 'timeInterval',
+          label: '时间区间'
+        },
+        {
+          prop: 'sortieNum',
+          label: '架次数量'
+        },
         {
           prop: 'createTime',
           label: '创建时间'
@@ -140,7 +160,7 @@ export default {
         {
           button: true,
           label: '操作',
-          width: '240px',
+          width: '200px',
           group: [
             {
               name: '查看结果',
@@ -229,11 +249,6 @@ export default {
       aircaftCatalogAll: [],
       percentage: 0,
       partsData: [],
-      // executeForm: {
-      //   sortieNo: '',
-      //   aircraftId: '',
-      //   partId: ''
-      // },
       rules: {
         aircraftId: [{ required: true, message: '编目不能为空', trigger: 'change' }],
         partId: [{ required: true, message: '部件不能为空', trigger: 'change' }]
@@ -241,7 +256,8 @@ export default {
       resultUrl: '',
       resultShowData: {
         url: ''
-      }
+      },
+      timeValue: ''
     }
   },
   watch: {
@@ -364,6 +380,8 @@ export default {
 
     partIdSelect(node) {
       this.form.partId = node.id
+      this.form.model = node.specsModel
+      this.form.code = node.conCode
     },
 
     async getAirConfigurationAPI(params) {
@@ -409,7 +427,7 @@ export default {
       })
       if (this.sortieNoCheckItems.length == 0) {
         this.$message({
-          type: 'success',
+          type: 'warning',
           message: '请选择架次号!'
         })
         return

+ 73 - 10
src/views/als/model/index.vue

@@ -29,14 +29,16 @@
           <el-form-item label="模型链接" prop="url">
             <el-input v-model="form.url" placeholder="请输入模型链接" />
           </el-form-item>
+          <el-form-item v-show="['5'].includes(form.type)" label="参数特征" prop="paramType">
+            <el-select v-model="form.paramType" filterable allow-create default-first-option placeholder="请选择参数特征">
+              <el-option v-for="item in paramTypeData" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"> </el-option>
+            </el-select>
+          </el-form-item>
           <el-form-item v-show="['5', '6'].includes(form.type)" label="机型" prop="aircraftType">
             <treeselect :value="form.aircraftType" :normalizer="aircraftTypeNormalizer" :options="aircraftTypeTreeData" :show-count="true" placeholder="请选择机型" @select="aircraftTypeChange" />
           </el-form-item>
           <el-form-item v-show="['5', '6'].includes(form.type)" label="部件" prop="partId">
             <treeselect noOptionsText="该机型暂无构型信息,请在构型管理中添加" :value="form.partId" :normalizer="normalizer" :options="partsData" :show-count="true" placeholder="请选择部件" @select="partIdSelect" />
-            <!-- <el-select v-model="form.partId" filterable placeholder="请选择部件">
-              <el-option v-for="item in partsData" :key="item.id" :label="item.devicesName" :value="item.id"> </el-option>
-            </el-select> -->
           </el-form-item>
           <el-form-item label="参数" prop="param">
             <el-input type="textarea" :rows="2" v-model="form.param" placeholder="请输入参数" />
@@ -67,10 +69,11 @@ import { deepClone, debounce } from '@/utils/index'
 import Treeselect from '@riophae/vue-treeselect'
 import '@riophae/vue-treeselect/dist/vue-treeselect.css'
 import { handleTree } from '../utils/common'
-import { agloModelList } from '@/views/als/utils/enum-data'
 import { getAirConfiguration } from '@/api/als/airConfiguration'
-import { getAirInstall } from '@/api/als/airInstall'
 import { getAircaftTypeAndModelTree } from '@/api/als/sideTree'
+import { getDict } from '@/api/dict'
+import { addData } from '@/api/system/dict/data'
+import { getAircaftModelAll } from '@/api/als/aircraft'
 
 export default {
   name: 'Model',
@@ -104,6 +107,22 @@ export default {
           prop: 'url',
           label: '模型链接'
         },
+        {
+          prop: 'paramType',
+          label: '参数特征'
+        },
+        {
+          prop: 'aircraftType',
+          label: '机型',
+          render: (h, params) => {
+            const matchedItem = this.aircaftModelAll.find((item) => params.row.aircraftType === item.aircaftModelId)
+            if (matchedItem) {
+              return h('span', matchedItem.aircaftModelName)
+            } else {
+              return h('span', {}, '')
+            }
+          }
+        },
         {
           prop: 'partId',
           label: '部件',
@@ -118,11 +137,11 @@ export default {
         },
         {
           prop: 'param',
-          label: '参数'
+          label: '模型参数'
         },
         {
           prop: 'columnData',
-          label: '数据列'
+          label: '飞参数据列'
         },
         {
           prop: 'status',
@@ -187,6 +206,7 @@ export default {
         name: '',
         type: '',
         url: '',
+        paramType: null,
         aircraftType: null,
         partId: null,
         param: '',
@@ -202,9 +222,12 @@ export default {
         name: [{ required: true, message: '模型名称不能为空', trigger: 'blur' }],
         type: [{ required: true, message: '模型类型不能为空', trigger: 'change' }],
         url: [{ required: true, message: '模型链接不能为空', trigger: 'blur' }],
+        paramType: [{ required: true, message: '参数特征不能为空', trigger: 'change' }],
         aircraftType: [{ required: true, message: '机型不能为空', trigger: 'change' }],
         partId: [{ required: true, message: '部件不能为空', trigger: 'change' }]
-      }
+      },
+      paramTypeData: [],
+      aircaftModelAll: []
     }
   },
   watch: {
@@ -214,10 +237,22 @@ export default {
     }
   },
   mounted() {
+    this.getDict()
     this.getModelAPI()
     this.getPartData()
   },
   methods: {
+    async getDict() {
+      const { data } = await getDict('als_model_params_character')
+      this.paramTypeData = data
+      const getAircaftModelAllParams = {
+        aircaftTypeCode: '',
+        aircaftTypeId: '',
+        queryParam: ''
+      }
+      const { data: data1 } = await getAircaftModelAll(getAircaftModelAllParams)
+      this.aircaftModelAll = data1
+    },
     async getPartData() {
       try {
         const { data } = await getAircaftTypeAndModelTree()
@@ -283,7 +318,6 @@ export default {
 
     async getModelAPI(params) {
       if (this.$refs.table) this.$refs.table.clearSelection()
-      const { keyWord } = this
       const { pageSize, pageIndex } = this.tableRequset
       const {
         data: { list, total }
@@ -341,6 +375,7 @@ export default {
         name: '',
         type: '',
         url: '',
+        paramType: null,
         aircraftType: null,
         partId: null,
         param: '',
@@ -364,10 +399,38 @@ export default {
     },
 
     submit() {
+      console.log('this.form.paramType', this.form.paramType)
+      const isExist = this.paramTypeData.find((item) => {
+        return item.dictLabel === this.form.paramType
+      })
+      if (!isExist) {
+        const sortData = Math.max.apply(
+          Math,
+          this.paramTypeData.map((item) => {
+            return item.dictSort
+          })
+        )
+        const data = {
+          dictType: 'als_model_params_character',
+          dictLabel: this.form.paramType,
+          dictValue: this.form.paramType,
+          dictSort: sortData + 1,
+          status: '0'
+        }
+        addData(data).then((response) => {
+          if (response.code !== 200) {
+            this.$message({
+              type: 'warning',
+              message: '模型参数特征未保存成功'
+            })
+            // useMessage('warning', '模型参数特征未保存成功')
+          }
+        })
+      }
+
       switch (this.dialogTitle) {
         case '编辑':
           this.updateModelAPI()
-
           break
         case '新增':
           this.addModelAPI()