Browse Source

Merge branch 'dev-rmd2' of Rmengdi/LQBZ_web into master

www 1 tuần trước cách đây
mục cha
commit
b88ccad9af
100 tập tin đã thay đổi với 4201 bổ sung1078 xóa
  1. 1 1
      .env.development
  2. 1 1
      .env.production
  3. 1 0
      .gitignore
  4. 224 62
      package-lock.json
  5. 5 1
      package.json
  6. 1 0
      public/index.html
  7. 2 2
      src/api/als/ERManage.js
  8. 16 0
      src/api/als/LLM.js
  9. 21 0
      src/api/als/airConfigParams.js
  10. 5 0
      src/api/als/algorithm.js
  11. 3 3
      src/api/als/dataImport.js
  12. 2 2
      src/api/als/entityManage.js
  13. 7 2
      src/api/als/falseAlarmResult.js
  14. 6 1
      src/api/als/faultStatistics.js
  15. 5 0
      src/api/als/intelligentQA.js
  16. 4 0
      src/api/task/carrierFlightMission.js
  17. 120 0
      src/components/FittingsModal/FaultStatisticsDialog/index.js
  18. 82 0
      src/components/FittingsModal/FaultStatisticsDialog/index.scss
  19. 53 0
      src/components/FittingsModal/FaultStatisticsDialog/index.vue
  20. 32 7
      src/components/FittingsModal/index.js
  21. 40 3
      src/components/FittingsModal/index.vue
  22. 337 3
      src/components/LTable/index.vue
  23. 1 1
      src/components/MissionDetail/index.vue
  24. 41 2
      src/components/TagsView/index.scss
  25. 2 1
      src/components/TagsView/index.vue
  26. 1 1
      src/components/aviationMaterialsModal/index.js
  27. 0 7
      src/layout/components/NavBar/MenuItem.vue
  28. 1 1
      src/layout/components/NavBar/index.scss
  29. 1 0
      src/layout/components/NavBar/index.vue
  30. 3 0
      src/main.js
  31. 20 3
      src/router/modules/system.js
  32. 40 1
      src/store/modules/app.js
  33. 239 0
      src/views/als/LLM/index.vue
  34. 2 2
      src/views/als/MDCData/index.vue
  35. 353 0
      src/views/als/airConfigParams/index.vue
  36. 26 16
      src/views/als/airConfiguration/index.vue
  37. 23 17
      src/views/als/airInstall/index.vue
  38. 2 2
      src/views/als/aircraft/index.vue
  39. 4 5
      src/views/als/atlasFile/index.vue
  40. 2 2
      src/views/als/carryChecklist/index.vue
  41. 43 3
      src/views/als/components/Charts/playBackChart.vue
  42. 81 1
      src/views/als/components/FileUpload/index.vue
  43. 1 1
      src/views/als/dataAircraftConfiguration/components/StructureEquipping/index.vue
  44. 2 2
      src/views/als/dataAnalysis/index.vue
  45. 2 2
      src/views/als/dataImport/index.vue
  46. 319 78
      src/views/als/falseAlarm/index.vue
  47. 1 1
      src/views/als/falseAlarmResult/index.vue
  48. 34 34
      src/views/als/faultCase/index.vue
  49. 2 2
      src/views/als/faultConsumable/index.vue
  50. 72 85
      src/views/als/faultDiagnosis/index.vue
  51. 1 1
      src/views/als/faultDiagnosisResult/index.vue
  52. 2 2
      src/views/als/faultEquipment/index.vue
  53. 2 2
      src/views/als/faultNotes/index.vue
  54. 2 2
      src/views/als/faultPersonnel/index.vue
  55. 2 2
      src/views/als/faultSetps/index.vue
  56. 2 2
      src/views/als/faultSpareParts/index.vue
  57. 22 16
      src/views/als/faultStatistics/echarts.vue
  58. 60 13
      src/views/als/faultStatistics/importDialog/index.vue
  59. 25 52
      src/views/als/faultStatistics/index.vue
  60. 98 78
      src/views/als/flightData/index.vue
  61. 2 2
      src/views/als/flightSplitask/index.vue
  62. 2 2
      src/views/als/flightask/index.vue
  63. 11 2
      src/views/als/index.scss
  64. 61 20
      src/views/als/intelligentQA/index.scss
  65. 217 92
      src/views/als/intelligentQA/index.vue
  66. 548 0
      src/views/als/judgeFaultLogic/index copy.vue
  67. 461 234
      src/views/als/judgeFaultLogic/index.vue
  68. 2 2
      src/views/als/knowledgeExtraction/extractList.vue
  69. 37 19
      src/views/als/knowledgeExtraction/index.vue
  70. 84 50
      src/views/als/knowledgeManage/ERManage/index.vue
  71. 32 14
      src/views/als/knowledgeManage/entityManage/index.vue
  72. 78 29
      src/views/als/lifePrediction/index.vue
  73. 2 2
      src/views/als/lifePredictionResult/index.vue
  74. 8 10
      src/views/als/lifetimeSpareParts/index.vue
  75. 2 2
      src/views/als/maintainRecord/index.vue
  76. 2 2
      src/views/als/maintenance/index.vue
  77. 2 2
      src/views/als/maintenanceDecision/index.vue
  78. 2 2
      src/views/als/maintenanceRecord/index.vue
  79. 2 2
      src/views/als/maintenanceask/index.vue
  80. 2 2
      src/views/als/maintenanceask/viewDetails.vue
  81. 74 12
      src/views/als/model/index.vue
  82. 2 2
      src/views/als/partReplacement/index.vue
  83. 4 4
      src/views/als/preProcessing/index.vue
  84. 2 2
      src/views/als/preProcessing/preResult.vue
  85. 2 2
      src/views/als/product/index.vue
  86. 1 1
      src/views/als/safeRule/index.vue
  87. 1 1
      src/views/als/safeRuleSub/index.vue
  88. 6 3
      src/views/als/smTask/SMTaskDetails.vue
  89. 5 3
      src/views/als/smTask/index.vue
  90. 1 1
      src/views/als/smaskRecord/index.vue
  91. 1 1
      src/views/als/smaskSub/index.vue
  92. 1 1
      src/views/als/sortie/index.vue
  93. 1 1
      src/views/als/spareParts/index.vue
  94. 1 1
      src/views/als/systemCommunication/index.vue
  95. 1 1
      src/views/als/task/index.vue
  96. 2 2
      src/views/als/technicalDoc/index.vue
  97. 2 2
      src/views/als/trainingData/index.vue
  98. 2 2
      src/views/als/warning/index.vue
  99. 2 2
      src/views/basicData/dataAircraftCataloging/index.js
  100. 31 16
      src/views/basicData/dataAircraftCataloging/index.vue

+ 1 - 1
.env.development

@@ -5,4 +5,4 @@ ENV = 'development'
 # 开发环境
 VUE_APP_BASE_API ='/api'
 
-VUE_APP_BASE_API_target ='http://localhost:9099'
+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' # 生产环境地址

+ 1 - 0
.gitignore

@@ -1,6 +1,7 @@
 .DS_Store
 node_modules
 /dist
+*.rar
 
 
 

+ 224 - 62
package-lock.json

@@ -23,7 +23,9 @@
         "file-saver": "^2.0.5",
         "html2canvas": "^1.4.1",
         "lodash": "^4.17.21",
+        "marked": "^15.0.7",
         "md5": "^2.3.0",
+        "pdfvuer": "^1.10.0",
         "qs": "^6.10.3",
         "relation-graph": "^1.1.0",
         "screenfull": "^6.0.1",
@@ -31,7 +33,9 @@
         "vue-demi": "^0.14.10",
         "vue-router": "^3.5.1",
         "vue-smooth-dnd": "^0.8.1",
-        "vuex": "^3.6.2"
+        "vuedraggable": "^2.24.3",
+        "vuex": "^3.6.2",
+        "vxe-table": "^3.15.2"
       },
       "devDependencies": {
         "@babel/core": "^7.12.16",
@@ -3121,6 +3125,18 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/@vxe-ui/core": {
+      "version": "3.0.35",
+      "resolved": "https://registry.npmmirror.com/@vxe-ui/core/-/core-3.0.35.tgz",
+      "integrity": "sha512-VchWQFIXUdiz4WMg318XOwJZ02FJ2wrcwlE1gfZfJO6qdaQ4eVGGjh5/ZiIN1CNBTnIKFjsD6KE+Cu6XKS1A/g==",
+      "dependencies": {
+        "dom-zindex": "^1.0.6",
+        "xe-utils": "^3.7.4"
+      },
+      "peerDependencies": {
+        "vue": "^2.6.0"
+      }
+    },
     "node_modules/@webassemblyjs/ast": {
       "version": "1.11.1",
       "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -5362,7 +5378,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",
@@ -5509,6 +5524,11 @@
         "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
       }
     },
+    "node_modules/dom-zindex": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/dom-zindex/-/dom-zindex-1.0.6.tgz",
+      "integrity": "sha512-FKWIhiU96bi3xpP9ewRMgANsoVmMUBnMnmpCT6dPMZOunVYJQmJhSRruoI0XSPoHeIif3kyEuiHbFrOJwEJaEA=="
+    },
     "node_modules/domain-browser": {
       "version": "4.22.0",
       "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz",
@@ -5550,6 +5570,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 +5804,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 +5847,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 +6784,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 +6808,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 +6868,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 +7007,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 +7025,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 +7049,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 +7479,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 +7525,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 +7549,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 +7569,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 +7606,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 +7720,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 +7741,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 +7786,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 +7801,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 +7822,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 +7836,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 +7882,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"
       },
@@ -8378,6 +8384,17 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/marked": {
+      "version": "15.0.7",
+      "resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.7.tgz",
+      "integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==",
+      "bin": {
+        "marked": "bin/marked.js"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
     "node_modules/material-colors": {
       "version": "1.2.6",
       "resolved": "https://registry.npmmirror.com/material-colors/-/material-colors-1.2.6.tgz",
@@ -9040,7 +9057,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 +9066,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 +9485,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 +10506,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 +10633,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",
@@ -11328,6 +11382,11 @@
         "websocket-driver": "^0.7.4"
       }
     },
+    "node_modules/sortablejs": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.10.2.tgz",
+      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
+    },
     "node_modules/source-map": {
       "version": "0.6.1",
       "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
@@ -11522,7 +11581,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 +11594,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 +12043,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 +12386,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",
@@ -12401,6 +12462,14 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/vuedraggable": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-2.24.3.tgz",
+      "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
+      "dependencies": {
+        "sortablejs": "1.10.2"
+      }
+    },
     "node_modules/vuex": {
       "version": "3.6.2",
       "resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",
@@ -12410,6 +12479,22 @@
         "vue": "^2.0.0"
       }
     },
+    "node_modules/vxe-pc-ui": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/vxe-pc-ui/-/vxe-pc-ui-3.5.22.tgz",
+      "integrity": "sha512-nEiYFtuVDxus+75LKzLy8MOiueEOjaIthutLSIVn8o7BYfp2Wf1EdCfLsqcaBuD4YinTuESyZ7Tz7YEcCfjj6w==",
+      "dependencies": {
+        "@vxe-ui/core": "^3.0.35"
+      }
+    },
+    "node_modules/vxe-table": {
+      "version": "3.15.2",
+      "resolved": "https://registry.npmmirror.com/vxe-table/-/vxe-table-3.15.2.tgz",
+      "integrity": "sha512-oeOw10xU33o+lys4OY9P06xTcgnG/Q9V+St/OfNWipA1nhxVwVf8cSicvcop8i4zgoHemLgdbu42kdcTwe6m6w==",
+      "dependencies": {
+        "vxe-pc-ui": "^3.5.22"
+      }
+    },
     "node_modules/watch-size": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/watch-size/-/watch-size-2.0.0.tgz",
@@ -12449,6 +12534,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 +12973,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",
@@ -12976,6 +13068,11 @@
         }
       }
     },
+    "node_modules/xe-utils": {
+      "version": "3.7.4",
+      "resolved": "https://registry.npmmirror.com/xe-utils/-/xe-utils-3.7.4.tgz",
+      "integrity": "sha512-9yuCHLOU+og4OEkPWWtzrYk1Zt1hgN66U/NCJ0+vYJSx1MplBtoQRz8aEA+2RmCr3leLru98vQxNpw/vJsu/sg=="
+    },
     "node_modules/xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -15274,6 +15371,15 @@
       "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==",
       "dev": true
     },
+    "@vxe-ui/core": {
+      "version": "3.0.35",
+      "resolved": "https://registry.npmmirror.com/@vxe-ui/core/-/core-3.0.35.tgz",
+      "integrity": "sha512-VchWQFIXUdiz4WMg318XOwJZ02FJ2wrcwlE1gfZfJO6qdaQ4eVGGjh5/ZiIN1CNBTnIKFjsD6KE+Cu6XKS1A/g==",
+      "requires": {
+        "dom-zindex": "^1.0.6",
+        "xe-utils": "^3.7.4"
+      }
+    },
     "@webassemblyjs/ast": {
       "version": "1.11.1",
       "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -16894,7 +17000,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"
@@ -17005,6 +17110,11 @@
         "entities": "^2.0.0"
       }
     },
+    "dom-zindex": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/dom-zindex/-/dom-zindex-1.0.6.tgz",
+      "integrity": "sha512-FKWIhiU96bi3xpP9ewRMgANsoVmMUBnMnmpCT6dPMZOunVYJQmJhSRruoI0XSPoHeIif3kyEuiHbFrOJwEJaEA=="
+    },
     "domain-browser": {
       "version": "4.22.0",
       "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz",
@@ -17026,6 +17136,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 +17329,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 +17365,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 +18024,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 +18040,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 +18082,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 +18176,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 +18188,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 +18201,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 +18505,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 +18537,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 +18554,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 +18567,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 +18591,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 +18659,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 +18671,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 +18699,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 +18708,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 +18722,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 +18730,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 +18757,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"
       }
@@ -19034,6 +19129,11 @@
         "semver": "^6.0.0"
       }
     },
+    "marked": {
+      "version": "15.0.7",
+      "resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.7.tgz",
+      "integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg=="
+    },
     "material-colors": {
       "version": "1.2.6",
       "resolved": "https://registry.npmmirror.com/material-colors/-/material-colors-1.2.6.tgz",
@@ -19500,14 +19600,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 +19911,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 +20556,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 +20653,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",
@@ -21054,6 +21176,11 @@
         "websocket-driver": "^0.7.4"
       }
     },
+    "sortablejs": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.10.2.tgz",
+      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
+    },
     "source-map": {
       "version": "0.6.1",
       "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
@@ -21214,7 +21341,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 +21351,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 +21652,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 +21898,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",
@@ -21835,12 +21964,36 @@
       "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
       "dev": true
     },
+    "vuedraggable": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-2.24.3.tgz",
+      "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
+      "requires": {
+        "sortablejs": "1.10.2"
+      }
+    },
     "vuex": {
       "version": "3.6.2",
       "resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",
       "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==",
       "requires": {}
     },
+    "vxe-pc-ui": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/vxe-pc-ui/-/vxe-pc-ui-3.5.22.tgz",
+      "integrity": "sha512-nEiYFtuVDxus+75LKzLy8MOiueEOjaIthutLSIVn8o7BYfp2Wf1EdCfLsqcaBuD4YinTuESyZ7Tz7YEcCfjj6w==",
+      "requires": {
+        "@vxe-ui/core": "^3.0.35"
+      }
+    },
+    "vxe-table": {
+      "version": "3.15.2",
+      "resolved": "https://registry.npmmirror.com/vxe-table/-/vxe-table-3.15.2.tgz",
+      "integrity": "sha512-oeOw10xU33o+lys4OY9P06xTcgnG/Q9V+St/OfNWipA1nhxVwVf8cSicvcop8i4zgoHemLgdbu42kdcTwe6m6w==",
+      "requires": {
+        "vxe-pc-ui": "^3.5.22"
+      }
+    },
     "watch-size": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/watch-size/-/watch-size-2.0.0.tgz",
@@ -21874,6 +22027,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 +22321,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",
@@ -22222,6 +22379,11 @@
       "dev": true,
       "requires": {}
     },
+    "xe-utils": {
+      "version": "3.7.4",
+      "resolved": "https://registry.npmmirror.com/xe-utils/-/xe-utils-3.7.4.tgz",
+      "integrity": "sha512-9yuCHLOU+og4OEkPWWtzrYk1Zt1hgN66U/NCJ0+vYJSx1MplBtoQRz8aEA+2RmCr3leLru98vQxNpw/vJsu/sg=="
+    },
     "xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",

+ 5 - 1
package.json

@@ -23,7 +23,9 @@
     "file-saver": "^2.0.5",
     "html2canvas": "^1.4.1",
     "lodash": "^4.17.21",
+    "marked": "^15.0.7",
     "md5": "^2.3.0",
+    "pdfvuer": "^1.10.0",
     "qs": "^6.10.3",
     "relation-graph": "^1.1.0",
     "screenfull": "^6.0.1",
@@ -31,7 +33,9 @@
     "vue-demi": "^0.14.10",
     "vue-router": "^3.5.1",
     "vue-smooth-dnd": "^0.8.1",
-    "vuex": "^3.6.2"
+    "vuedraggable": "^2.24.3",
+    "vuex": "^3.6.2",
+    "vxe-table": "^3.15.2"
   },
   "devDependencies": {
     "@babel/core": "^7.12.16",

+ 1 - 0
public/index.html

@@ -6,6 +6,7 @@
     <meta name="viewport" content="width=device-width,initial-scale=1.0" />
     <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
     <title>灵巧敏捷保障软件系统</title>
+    <!-- <title>大气数据处理软件</title> -->
     <!-- <title><%= htmlWebpackPlugin.options.title %></title> -->
   </head>
   <body>

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

@@ -1,8 +1,8 @@
 import { get, post } from '@/http/index'
 
 //查询所有三元组
-export const getERList = async () => {
-  return await get('/kgqa/relation/getAllTriples')
+export const getERList = async (data) => {
+  return await get('/kgqa/relation/getAllTriples', data)
 }
 
 //查询数据库中目前已经有的关系

+ 16 - 0
src/api/als/LLM.js

@@ -0,0 +1,16 @@
+import { get, postFile, post } from '@/http/index'
+
+// 获取知识库内文件列表
+export const uploadDocs = async (data) => {
+  return await postFile('/knowledge_base/upload_docs', data)
+}
+
+// 获取知识库内文件列表
+export const getListFiles = async (data) => {
+  return await get('/knowledge_base/list_files', data)
+}
+
+// 删除文件
+export const deleteDocs = async (data) => {
+  return await post('/knowledge_base/delete_docs', data)
+}

+ 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)
+}

+ 5 - 0
src/api/als/algorithm.js

@@ -25,6 +25,11 @@ export const executeFalseAlarm = async (data) => {
   return await post('/als/algorithm/execute/falseAlarm', data)
 }
 
+// 获取虚警的数学参数
+export const executeMath = async (data) => {
+  return await post('/als/algorithm/execute/math', data)
+}
+
 // 执行故障诊断算法
 export const executeFault = async (data) => {
   return await post('/als/algorithm/execute/fault', data)

+ 3 - 3
src/api/als/dataImport.js

@@ -1,4 +1,4 @@
-import { get, put, post, deletes } from '@/http/index'
+import { get, put, post, postFile, deletes } from '@/http/index'
 
 // 查询数据导入信息列表
 export const getDataImport = async (data) => {
@@ -34,8 +34,8 @@ export const getAircaftTypeAndModelTree = async (data) => {
  * @name 下载模板
  * @returns returns
  */
-export const importTemplateApi = () => {
-  return http.postFile('/als/dataImport/importTemplate', {})
+export const importTemplateApi = async () => {
+  return await postFile('/als/warning/importTemplate', {})
 }
 
 /**

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

@@ -1,8 +1,8 @@
 import { get, post } from '@/http/index'
 
 //查询所有实体
-export const getEntityList = async () => {
-  return await get('/kgqa/entity/getAllEntities')
+export const getEntityList = async (data) => {
+  return await get('/kgqa/entity/getAllEntities', data)
 }
 
 //	获取图数据库中的所有实体类名称

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

@@ -1,8 +1,13 @@
 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)
+}
+
+// 修改虚警抑制结果
+export const updateWarningResult = async (data) => {
+  return await put('/als/warningResult', data)
 }
 
 // 新增虚警抑制结果

+ 6 - 1
src/api/als/faultStatistics.js

@@ -10,6 +10,11 @@ export const getExclusionList = async (data) => {
   return await get('/als/faultStatistics/exclusionList', data)
 }
 
+// 查询故障统计列表不分页
+export const getExclusionListAll = async (data) => {
+  return await get('/als/faultStatistics/exclusionListAll', data)
+}
+
 // 查询故障统计列表
 export const getFaultStatisticsEcharts = async (data) => {
   return await get('/als/faultStatistics/statistics', data)
@@ -51,5 +56,5 @@ export const getFaultStatisticsListAll = async (data) => {
 
 // 同步
 export const getSync = async (data) => {
-  return await get('/extra/statistics', data)
+  return await get('/als/faultStatistics/extra/statistics', data)
 }

+ 5 - 0
src/api/als/intelligentQA.js

@@ -9,6 +9,11 @@ export const handlerAsk = async (data) => {
   return await post('/als/algorithm/execute/qa', data)
 }
 
+// 历史记录name
+export const getQAHistoryListName = async (data) => {
+  return await get('/als/qaHistory/listName', data)
+}
+
 // 历史记录
 export const getQAHistoryList = async (data) => {
   return await get('/als/qaHistory/list', data)

+ 4 - 0
src/api/task/carrierFlightMission.js

@@ -115,3 +115,7 @@ export const exportSocialSecurityExcel = async (data) => {
 export const exportSocialSecurityDetailsExcel = async (data) => {
   window.open(process.env.VUE_APP_BASE_API + `/safeguard/socialSecurityDetails/exportExcel?socialSecurityId=${data.socialSecurityId}&avmatCategoriesId=${data.avmatCategoriesId}`)
 }
+//获取任务飞机健康状态(故障统计)
+export const getFaultStatisticsList = async (data) => {
+  return await get('/als/faultStatistics/exclusionListAll')
+}

+ 120 - 0
src/components/FittingsModal/FaultStatisticsDialog/index.js

@@ -0,0 +1,120 @@
+export const columns = (_this) => [
+  {
+    prop: 'faultyPartsName',
+    label: '故障件名称'
+  },
+  {
+    prop: 'faultyPartsModel',
+    label: '故障件型别'
+  },
+  {
+    prop: 'faultyPartsNum',
+    label: '故障件号码'
+  },
+  {
+    prop: 'engineNum',
+    label: '故障件所属发动机编号'
+  },
+  {
+    prop: 'faultyPartsInstallDate',
+    label: '故障件装机日期'
+  },
+  {
+    prop: 'faultyPartsPosition',
+    label: '故障件位置'
+  },
+  {
+    prop: 'faultyAbnormalCode',
+    label: '故障失常码'
+  },
+  {
+    prop: 'faultyPhenomenon',
+    label: '故障现象'
+  },
+  {
+    prop: 'faultyPlace',
+    label: '故障发生地点'
+  },
+  {
+    prop: 'findOpportunity',
+    label: '发现时机'
+  },
+  {
+    prop: 'systems',
+    label: '所属系统'
+  },
+  {
+    prop: 'installationTime',
+    label: '故障件装本机工作时次'
+  },
+  {
+    prop: 'totalWorkTime',
+    label: '故障件总工作时次'
+  },
+  {
+    prop: 'repairTime',
+    label: '故障件修后时次'
+  },
+  {
+    prop: 'replacementPartsModel',
+    label: '故换件型别'
+  },
+  {
+    prop: 'replacementPartsNum',
+    label: '故换件号码'
+  },
+  {
+    prop: 'replacementTotalWorkTime',
+    label: '故换件总工作时次'
+  },
+  {
+    prop: 'replacementRepairTime',
+    label: '故换件修后时次'
+  },
+  {
+    prop: 'faultyReason',
+    label: '故障原因'
+  },
+  {
+    prop: 'faultyNature',
+    label: '故障性质'
+  },
+  {
+    prop: 'faultyConsequence',
+    label: '故障后果'
+  },
+  {
+    prop: 'handlingSuggestions',
+    label: '更换部件'
+  },
+  {
+    prop: 'influenceFrequency',
+    label: '影响次数'
+  },
+  {
+    prop: 'errorFlyFrequency',
+    label: '误飞次数'
+  },
+  {
+    prop: 'exclusionTime',
+    label: '排故时间'
+  },
+  {
+    prop: 'needTestFly',
+    label: '需要试飞'
+  },
+  {
+    prop: 'repairStatus',
+    label: '修理状态'
+  }
+]
+
+export const options = {
+  stripe: true, // 斑马纹
+  mutiSelect: false, // 多选框
+  index: false, // 显示序号, 多选则 mutiSelect
+  loading: false, // 表格动画
+  initTable: true, // 是否一挂载就加载数据
+  border: true,
+  height: 'calc(100vh - 300px)'
+}

+ 82 - 0
src/components/FittingsModal/FaultStatisticsDialog/index.scss

@@ -0,0 +1,82 @@
+.view-AerospaceCompileLineList-left {
+  width: 300px;
+}
+
+.view-AerospaceCompileLineList {
+  display: flex;
+  flex-shrink: 0;
+}
+.view-AerospaceCompileLineList-right-summarizing-btn-right {
+  display: flex;
+  flex-shrink: 0;
+}
+.view-AerospaceCompileLineList-right-summarizing-btn {
+  display: flex;
+  flex-shrink: 0;
+  justify-content: space-between;
+}
+.view-CarrierListMachineryPreparation .view-AerospaceCompileLineList-right-summarizing-btn {
+  margin-top: 30px;
+}
+.view-AerospaceCompileLineList-right-summarizing-btn-right-select {
+  display: flex;
+  align-items: center;
+  margin-right: 30px;
+  > span {
+    color: #fff;
+    margin-right: 15px;
+    width: 60px;
+  }
+}
+.view-AerospaceCompileLineList-right-summarizing-table {
+  margin-top: 30px;
+}
+
+.fittings-modal-box {
+  display: flex;
+}
+
+.fittings-modal-box-left {
+  width: 230px;
+}
+
+.fittings-modal-box-right {
+  width: calc(100% - 260px);
+  margin-left: 30px;
+}
+
+.fittings-modal .el-dialog {
+  margin-top: 5vh !important;
+}
+
+.auto-generation {
+  margin-bottom: 30px;
+  display: flex;
+  align-items: center;
+  > span {
+    color: #fff;
+    margin-right: 15px;
+    width: 80px;
+  }
+  .el-select {
+    width: 100%;
+  }
+}
+.view-CarrierListMachineryPreparation-s {
+  // display: flex;
+  .el-descriptions__body {
+    background-color: transparent !important;
+  }
+}
+
+.view-CarrierListMachineryPreparation-s .el-table {
+  height: calc(100vh - 470px);
+}
+.view-AerospaceCompileLineList-right-summarizing-btn-look {
+  display: flex;
+  justify-content: right;
+}
+
+.view-AerospaceCompileLineList-right-summarizing-btn-right-look {
+  //   width: 300px;
+}

+ 53 - 0
src/components/FittingsModal/FaultStatisticsDialog/index.vue

@@ -0,0 +1,53 @@
+<template>
+  <el-dialog class="fittings-modal" :title="dialogtitle" :visible.sync="dialogVisible" width="1200px" :before-close="handleClose" append-to-body>
+    <LTable :dataSource="tableData" ref="Ltable" :showColumnSetting="false" :options="options" :columns="columns"></LTable>
+  </el-dialog>
+</template>
+
+<script>
+import { columns, options } from './index'
+import { getFaultStatisticsList } from '@/api/task/carrierFlightMission'
+
+export default {
+  name: 'FaultStatisticsDialog',
+  components: {},
+  data() {
+    // 这里存放数据
+    return {
+      dialogtitle: '查看飞机健康状态',
+      dialogVisible: false,
+      columns: columns(this),
+      options,
+      tableData: [],
+      activeRow: null
+    }
+  },
+  mounted() {
+    // this.getFaultStatisticsList()
+  },
+  methods: {
+    opneDialog(row) {
+      this.dialogtitle = '查看飞机' + row.aircaftCatalogCode + '的健康状态'
+      this.activeRow = row
+      this.dialogVisible = true
+      this.getFaultStatisticsList()
+    },
+    handleClose() {
+      this.tableData = []
+      this.activeRow = null
+      this.dialogVisible = false
+    },
+    async getFaultStatisticsList() {
+      const { data, code } = await getFaultStatisticsList()
+      if (code == 200) {
+        const newdata = data.filter((item) => item['aircraftNum'] === this.activeRow.aircaftCatalogCode)
+        this.tableData = newdata
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+@import './index.scss';
+</style>

+ 32 - 7
src/components/FittingsModal/index.js

@@ -6,28 +6,53 @@ export const defaultProps = {
 export const columns = (_this) => [
   {
     prop: 'aircaftCatalogCode',
-    label: '飞机编号'
+    label: '飞机编号',
+    width: '140px'
   },
   {
     prop: 'aircaftModelName',
-    label: '所属机型'
+    label: '所属机型',
+    width: '140px'
   },
   {
     prop: 'aircaftTypeName',
-    label: '所属机种'
+    label: '所属机种',
+    width: '140px'
   },
-
   {
     prop: 'mechanician',
-    label: '驾驶员'
+    label: '机械师',
+    width: '140px'
+  },
+  {
+    prop: 'healthStatus',
+    label: '飞机健康状态',
+    width: '140px',
+    render: (h, params) => {
+      //根据healthStatus值显示健康或故障
+      // const statusText = params.row.healthStatus === '已完成' ? '健康' : '故障'
+      // const statusClass = params.row.healthStatus === '已完成' ? 'success-state' : 'warning-state'
+      // return h('span', { class: statusClass }, statusText)
+
+      const statusClass = params.row.healthStatus === '健康' ? 'success-state' : 'warning-state'
+      return h('span', { class: statusClass }, params.row.healthStatus)
+    }
   },
   {
     button: true,
     label: '操作',
-    width: '240px',
     group: [
+      // {
+      //   name: '查看健康状态',
+      //   type: 'text',
+      //   round: false,
+      //   plain: false,
+      //   onClick: (row, index, scope) => {
+      //     _this.look(row)
+      //   }
+      // },
       {
-        name: '选择',
+        name: '确定',
         type: 'text',
         round: false,
         plain: false,

+ 40 - 3
src/components/FittingsModal/index.vue

@@ -5,18 +5,23 @@
         <MenuTree :currentNodeKey="currentNodeKey" :treedata="menuTreeData" @TreeNodeclick="treeNodeClick" v-bind="treeObj"> </MenuTree>
       </div>
       <div class="fittings-modal-box-right">
-        <LTable ref="table" :defaultFetch="false" :columns="columns" :dataSource="dialogTableData" :options="options" :fetch="getAircraftsByCode" :pagination="tableRequset"></LTable>
+        <LTable ref="table" :defaultFetch="false" :showColumnSetting="false" :columns="columns" :dataSource="dialogTableData" :options="options" :fetch="getAircraftsByCode" :pagination="tableRequset"></LTable>
       </div>
     </div>
+    <!-- 查看飞机健康状态 -->
+    <!-- <FaultStatisticsDialog ref="FaultStatisticsDialog" /> -->
   </el-dialog>
 </template>
 
 <script>
 import { columns, options, defaultProps } from './index.js'
 import { getAircaftTypeAndModelTree, getAircraftsByCode } from '@/api/task/carrierFlightMission'
+// import FaultStatisticsDialog from './FaultStatisticsDialog/index.vue'
+//获取飞机健康状态接口
+import { getFaultStatisticsList } from '@/api/task/carrierFlightMission'
 export default {
   name: 'FittingsModal',
-  components: {},
+  // components: { FaultStatisticsDialog },
   props: { taskId: {} },
   data() {
     // 这里存放数据
@@ -24,7 +29,7 @@ export default {
       currentNodeKey: '',
       currentRow: null,
       menuTreeData: [],
-      columns: columns(this),
+      columns: columns(this), //列定义获取方式
       options,
       dialogTableData: [],
       defaultProps,
@@ -58,6 +63,26 @@ export default {
       if (code == 200) {
         this.dialogTableData = data.list
         this.tableRequset.total = data.totalCount
+        //获取飞机故障统计集合
+        const { code: healthCode, data: healthData } = await getFaultStatisticsList()
+        if (healthCode == 200) {
+          //创建每架飞机的健康状态映射对象
+          const healthStatusMap = {}
+          healthData.forEach((item) => {
+            healthStatusMap[item.aircraftNum] = item.repairStatus
+          })
+          this.dialogTableData.forEach(async (aircraft) => {
+            // aircraft.healthStatus = healthStatusMap[aircraft.aircaftCatalogCode] || ''
+            const hasFault = healthStatusMap.hasOwnProperty(aircraft.aircaftCatalogCode)
+            aircraft.healthStatus = hasFault ? '故障' : '健康'
+          })
+        } else {
+          this.dialogTableData.forEach(async (aircraft) => {
+            aircraft.healthStatus = '健康'
+          })
+        }
+        //强制更新列定义
+        this.columns = this.getColums()
       }
     },
     async getAircaftTypeAndModelTree() {
@@ -79,9 +104,21 @@ export default {
       this.getAircraftsByCode()
     },
     select(row) {
+      // debugger
+      // if (row.healthStatus == '故障') {
+      //   this.$message({
+      //     type: 'error',
+      //     message: '请选择非故障飞机!'
+      //   })
+      //   //this.fittingsVisible = false
+      //   return false
+      // }
       this.$emit('select', row)
       this.fittingsVisible = false
     }
+    // look(row) {
+    //   this.$refs.FaultStatisticsDialog.opneDialog(row)
+    // }
   }
 }
 </script>

+ 337 - 3
src/components/LTable/index.vue

@@ -1,5 +1,10 @@
 <template>
   <div class="table-page">
+    <!-- 添加列设置按钮 -->
+    <div class="table-settings" v-if="showColumnSetting">
+      <el-button type="text" @click="showColumnSettings"> <i class="el-icon-setting"></i> 列设置 </el-button>
+    </div>
+
     <el-table
       :key="renderKey"
       ref="elTablet"
@@ -15,19 +20,22 @@
       @row-click="handleRowClick"
       @selection-change="handleSelectionChange"
       @current-change="handleCurrentChange"
+      @header-dragend="handleHeaderDragend"
       highlight-current-row
       default-expand-all
       :cell-style="cellStyle"
       :header-cell-style="{ color: '#515a6e', background: '#f5f5f5' }"
       :tree-props="options.treeProps"
       :row-style="{ cursor: options.cursor || '' }"
+      :resizable="true"
+      :fit="true"
     >
       <!--selection选择框-->
       <el-table-column v-if="options.mutiSelect" type="selection" :reserve-selection="true" style="width: 50px" align="center"> </el-table-column>
       <!--序号-->
       <el-table-column v-if="options.index" label="序号" type="index" width="100" align="center"> </el-table-column>
       <!--数据列-->
-      <template v-for="(column, index) in columns">
+      <template v-for="(column, index) in localTableColumns">
         <el-table-column :key="index" :prop="column.prop" :label="column.label" :align="column.align || 'center'" :width="column.width" :fixed="column.fixed" show-overflow-tooltip v-if="!column.isHidden">
           <template slot-scope="scope">
             <!--  含有click函数 -->
@@ -122,10 +130,34 @@
       @current-change="handleIndexChange"
       style="padding: 20px; text-align: center"
     ></el-pagination>
+
+    <!-- 添加列设置弹窗 -->
+    <el-dialog v-if="showColumnSetting" title="列设置" :visible.sync="columnSettingsVisible" width="500px">
+      <div class="dialog-header">
+        <el-checkbox v-model="showAllColumns" @change="toggleAllColumns">全选</el-checkbox>
+        <el-button type="text" @click="handleInitConfig">初始化配置</el-button>
+      </div>
+      <el-divider></el-divider>
+      <draggable v-model="localColumns" handle=".drag-handle" @end="handleDragEnd">
+        <div v-for="(col, index) in localColumns" :key="index" class="column-item">
+          <i class="el-icon-rank drag-handle"></i>
+          <el-checkbox v-model="col.isShow" @change="handleColumnChange">
+            {{ col.label }}
+          </el-checkbox>
+        </div>
+      </draggable>
+      <span slot="footer">
+        <el-button @click="columnSettingsVisible = false">取消</el-button>
+        <el-button type="primary" @click="saveColumnSettings">确定</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 <script>
 import { deepClone } from '@/utils'
+import draggable from 'vuedraggable'
+import { post } from '@/http/index'
+
 export default {
   name: 'LTable',
   components: {
@@ -150,7 +182,8 @@ export default {
         if (data.props.column) params.column = data.props.column
         return data.props.render(h, params)
       }
-    }
+    },
+    draggable
   },
   props: {
     dictData: Object, //字典对象
@@ -170,6 +203,17 @@ export default {
     RowKey: {
       type: String,
       default: 'id'
+    },
+    tableId: {
+      // 表格唯一标识,用于保存和获取表格配置,为空时使用当前组件路径
+      type: String,
+      required: false, // 改为非必填
+      default: '' // 默认为空字符串
+    },
+    showColumnSetting: {
+      type: Boolean,
+      required: false,
+      default: true // 默认显示
     }
   },
   computed: {
@@ -198,7 +242,12 @@ export default {
       renderKey: Math.random(),
       logo: require('@/assets/logo.png'),
       checkedKeys: false,
-      editStatusMap: {}
+      editStatusMap: {},
+      columnSettingsVisible: false, // 控制列设置弹窗的显示/隐藏
+      localColumns: [], // 用于列设置弹窗
+      localTableColumns: [], // 用于实际表格渲染
+      showAllColumns: true,
+      currentTableId: ''
     }
   },
   filters: {
@@ -208,13 +257,64 @@ export default {
     }
   },
   created() {
+    // 初始化本地表格数据
+    this.localTableColumns = this.columns.map((col) => ({
+      ...col,
+      isHidden: false
+    }))
+    this.initTableId()
+
     if (this.defaultFetch) {
       this.options.initTable && this.fetch()
     } else {
       this.options.initTable
     }
+    this.initColumnSettings()
   },
   methods: {
+    /**
+     * 初始化表格ID
+     * 使用父组件路由路径和当前组件name生成唯一标识
+     */
+    initTableId() {
+      if (this.tableId) {
+        this.currentTableId = this.tableId
+      } else {
+        // 获取父组件实例
+        const parent = this.$parent
+        let parentPath = ''
+
+        // 获取父组件的路由路径
+        if (parent && parent.$route) {
+          parentPath = parent.$route.path
+        }
+
+        // 获取当前组件的name
+        const componentName = parent.$options.name || ''
+
+        // 生成唯一标识:父组件路径-组件名称-索引
+        let instanceId = `${parentPath}-${componentName}`
+
+        // 如果同一个父组件中有多个相同的表格组件,添加索引区分
+        if (parent) {
+          const siblings = parent.$children.filter((child) => child.$options.name === componentName)
+          const index = siblings.indexOf(this)
+          if (index > 0) {
+            instanceId += `-${index}`
+          }
+        }
+
+        this.currentTableId = instanceId
+          .replace(/^\//, '') // 移除开头的斜杠
+          .replace(/\//g, '-') // 将路径分隔符替换为横杠
+          .replace(/[^a-zA-Z0-9\-_]/g, '-') // 只保留字母、数字、横杠和下划线
+          .replace(/\-+/g, '-') // 将多个连续横杠替换为单个
+          .replace(/^\-|\-$/g, '') // 移除首尾的横杠
+          .toLowerCase() // 转为小写
+      }
+
+      // console.log('当前表格ID:', this.currentTableId)
+    },
     hasChildren(row, showType) {
       //父级显示
       if (showType && showType == '0') {
@@ -348,10 +448,244 @@ export default {
     },
     flattenArray(arr) {
       return [].concat(...arr.map((item) => (Array.isArray(item.children) ? this.flattenArray(item.children) : item)))
+    },
+    /**
+     * 初始化列设置
+     * 从后端获取用户保存的表格配置
+     */
+    async initColumnSettings() {
+      try {
+        const response = await post('/tableConfig/userTableConfig/getUserTableConfig', {
+          tableName: this.currentTableId
+        })
+
+        if (response.data) {
+          const columnConfig = JSON.parse(response.data.columnConfig)
+
+          // 更新 localColumns 和 localTableColumns
+          this.localColumns = this.columns.map((col) => {
+            const savedCol = columnConfig.columns.find((c) => c.prop === col.prop)
+            return {
+              ...col,
+              isShow: savedCol ? savedCol.isShow : true,
+              width: savedCol ? savedCol.width : col.width
+            }
+          })
+
+          // 更新表格显示列
+          this.updateTableColumns()
+        } else {
+          // 没有保存的配置,使用默认配置
+          this.localColumns = this.columns.map((col) => ({
+            ...col,
+            isShow: true
+          }))
+          this.localTableColumns = [...this.columns]
+        }
+
+        this.$nextTick(() => {
+          this.renderKey = Math.random()
+        })
+      } catch (error) {
+        console.error('获取表格配置失败:', error)
+        // 使用默认配置
+        this.localColumns = this.columns.map((col) => ({
+          ...col,
+          isShow: true
+        }))
+        this.localTableColumns = [...this.columns]
+      }
+    },
+
+    /**
+     * 显示列设置弹窗
+     */
+    showColumnSettings() {
+      this.columnSettingsVisible = true
+      this.checkShowAllStatus()
+    },
+
+    /**
+     * 切换全选状态
+     * @param {Boolean} val - 是否全选
+     */
+    toggleAllColumns(val) {
+      this.localColumns.forEach((col) => {
+        col.isShow = val
+      })
+    },
+
+    /**
+     * 处理单个列显示状态变化
+     */
+    handleColumnChange() {
+      this.checkShowAllStatus()
+    },
+
+    /**
+     * 检查是否所有列都被选中,更新全选状态
+     */
+    checkShowAllStatus() {
+      this.showAllColumns = this.localColumns.every((col) => col.isShow)
+    },
+
+    /**
+     * 处理拖拽排序完成事件
+     * 仅更新 localColumns 的顺序,不立即应用到表格
+     */
+    handleDragEnd() {
+      // 拖拽排序时只记录新的顺序,不立即更新表格显示
+      console.log('列顺序已更改,点击确定后生效')
+    },
+
+    /**
+     * 保存列设置到后端
+     * 包括列的显示状态、顺序和宽度
+     */
+    async saveColumnSettings() {
+      const columnConfig = {
+        columns: this.localColumns.map(({ prop, isShow, width }, index) => ({
+          prop,
+          isShow,
+          width,
+          order: index
+        }))
+      }
+
+      try {
+        await post('/tableConfig/userTableConfig/save', {
+          tableName: this.currentTableId,
+          columnConfig: JSON.stringify(columnConfig)
+        })
+
+        // 更新表格显示列
+        this.updateTableColumns()
+
+        this.columnSettingsVisible = false
+        this.$nextTick(() => {
+          this.renderKey = Math.random()
+        })
+
+        this.$message.success('配置保存成功')
+      } catch (error) {
+        console.error('保存表格配置失败:', error)
+        this.$message.error('配置保存失败')
+      }
+    },
+
+    /**
+     * 初始化列配置
+     * 重置为系统默认配置
+     */
+    async handleInitConfig() {
+      try {
+        await this.$confirm('确定要初始化列配置吗?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+
+        await post('/tableConfig/userTableConfig/initUserTableConfig', {
+          tableName: this.currentTableId
+        })
+
+        // 重新获取配置
+        await this.initColumnSettings()
+
+        this.$message.success('初始化配置成功')
+      } catch (error) {
+        if (error !== 'cancel') {
+          // 排除取消操作的错误
+          console.error('初始化配置失败:', error)
+          this.$message.error('初始化配置失败')
+        }
+      }
+    },
+
+    // 新增方法:根据 localColumns 更新表格显示列
+    updateTableColumns() {
+      this.localTableColumns = this.localColumns.map((col) => ({
+        ...col,
+        isHidden: !col.isShow
+      }))
+    },
+
+    /**
+     * 处理列宽拖动结束事件
+     * @param {Number} newWidth - 新的宽度
+     * @param {Number} oldWidth - 旧的宽度
+     * @param {Object} column - 列对象
+     */
+    handleHeaderDragend(newWidth, oldWidth, column) {
+      // 如果宽度没有变化,不处理
+      if (newWidth === oldWidth) return
+
+      // 更新本地配置
+      const targetColumn = this.localColumns.find((col) => col.prop === column.property)
+      if (targetColumn) {
+        targetColumn.width = newWidth
+      }
+
+      // 更新表格显示列
+      this.updateTableColumns()
+
+      // 保存到后台
+      this.saveColumnSettings()
+    }
+  },
+  // 可选:添加 watch 来监听原始 columns 的变化
+  watch: {
+    columns: {
+      handler(newColumns) {
+        // 当原始列变化时,更新本地列
+        this.localTableColumns = newColumns.map((col) => ({
+          ...col,
+          isHidden: false
+        }))
+      },
+      deep: true
     }
   }
 }
 </script>
 <style lang="scss" scoped>
 @import './index.scss';
+
+.table-settings {
+  margin-bottom: 10px;
+  text-align: right;
+}
+
+.column-item {
+  display: flex;
+  align-items: center;
+  padding: 8px;
+  border-bottom: 1px solid #ebeef5;
+
+  .drag-handle {
+    cursor: move; // 显示移动光标
+    margin-right: 10px;
+    color: #909399;
+  }
+}
+
+.table-page {
+  .el-table {
+    // 添加过渡效果使宽度变化更平滑
+    ::v-deep .el-table__header-wrapper,
+    ::v-deep .el-table__body-wrapper {
+      th,
+      td {
+        transition: width 0.2s;
+      }
+    }
+  }
+}
+
+.dialog-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 0 5px;
+}
 </style>

+ 1 - 1
src/components/MissionDetail/index.vue

@@ -9,10 +9,10 @@
       <el-descriptions-item label="任务类型">{{ detail.taskType }}</el-descriptions-item>
       <el-descriptions-item label="任务飞机数量">{{ detail.taskAircraftNum }}</el-descriptions-item>
       <el-descriptions-item label="任务地点">{{ detail.taskSite }}</el-descriptions-item>
-      <el-descriptions-item label="任务描述">{{ detail.taskDescribe }}</el-descriptions-item>
       <el-descriptions-item label="带队领导">{{ detail.teamLeader }}</el-descriptions-item>
       <el-descriptions-item label="转场形式">{{ detail.transferModality }}</el-descriptions-item>
       <el-descriptions-item label="飞行次数">{{ detail.flyingSession }}</el-descriptions-item>
+      <el-descriptions-item label="任务描述">{{ detail.taskDescribe }}</el-descriptions-item>
     </el-descriptions>
   </div>
 </template>

+ 41 - 2
src/components/TagsView/index.scss

@@ -18,6 +18,45 @@
     padding-right: 16px;
     position: relative;
     z-index: 2;
+    
+    // 一级标签样式
+    &.level-1 {
+      // .tags-view-item-content {
+      //   background-color: #1890ff;
+      // }
+      color: #30daff;
+      &.active {
+        color: #ffdc18e7 !important;
+      }
+    }
+    
+    // 二级标签样式
+    &.level-2 {
+      // .tags-view-item-content {
+      //   background-color: #52c41a;
+      // }
+      color: #30daff;
+      &.active {
+        color: #ffdc18e7 !important;
+      }
+      &:not(.active):hover{
+        color: #30daff !important;
+      }
+    }
+    
+    // 三级标签样式
+    &.level-3 {
+      // .tags-view-item-content {
+      //   background-color: #722ed1;
+      // }
+      color:#722ed1;
+      &.active {
+        color: #ffdc18e7 !important;
+      }
+      &:not(.active):hover{
+        color: #722ed1 !important;
+      }
+    }
     &-left {
       height: 100%;
       width: 22px;
@@ -64,11 +103,11 @@
     }
     i:hover {
       background-color: $theme-color;
-      color: #30daff !important;
+      color: #ffdc18e7 !important;
     }
   }
   .active {
-    color: #30daff !important;
+    color: #ffdc18e7 !important;
   }
 }
 

+ 2 - 1
src/components/TagsView/index.vue

@@ -23,7 +23,8 @@
               <div class="tags-view-item-right"></div>
             </div>
           </el-tooltip>
-          <div v-else @click.self="to(item.fullPath)" @contextmenu.prevent="openmenu($event, index)" class="tags-view-item" :class="isActive(item) ? 'active' : ''">
+          <!-- <div v-else @click.self="to(item.fullPath)" @contextmenu.prevent="openmenu($event, index)" class="tags-view-item" :class="isActive(item) ? 'active' : ''"> -->
+          <div v-else @click.self="to(item.fullPath)" @contextmenu.prevent="openmenu($event, index)" class="tags-view-item" :class="[isActive(item) ? 'active' : '', 'level-' + item.path.split('/').filter(Boolean).length]">
             {{ item.meta.title }}
             <i class="el-icon-close" @click.stop="onClose(index)" v-if="item.fullPath !== '/home'"></i>
             <div class="tags-view-item-left"></div>

+ 1 - 1
src/components/aviationMaterialsModal/index.js

@@ -25,7 +25,7 @@ export const dialogColumns = (_this) => [
   },
   {
     prop: 'avmatCatalogCode',
-    label: '航材编'
+    label: '航材编'
   },
   {
     prop: 'specification',

+ 0 - 7
src/layout/components/NavBar/MenuItem.vue

@@ -29,10 +29,3 @@ export default {
   methods: {}
 }
 </script>
-
-<style lang="scss" scoped>
-.childMenu {
-  max-height: 500px;
-  overflow: hidden;
-}
-</style>

+ 1 - 1
src/layout/components/NavBar/index.scss

@@ -359,7 +359,7 @@
 }
 
 .el-loading-mask {
-  background: rgb(15, 79, 99) !important;
+  background: rgb(15, 79, 99, 0.4) !important;
 }
 
 .el-loading-spinner .path {

+ 1 - 0
src/layout/components/NavBar/index.vue

@@ -3,6 +3,7 @@
     <div class="nav-bar-logo">
       <!-- <img :src="logo" alt="" /> -->
       灵 巧 敏 捷 保 障 软 件 系 统
+      <!-- 大 气 数 据 处 理 软 件 -->
     </div>
     <div class="nav-bar-logo-bg"></div>
     <div class="nav-bar-menu">

+ 3 - 0
src/main.js

@@ -12,6 +12,8 @@ import '@/assets/font/iconfont.css'
 import './pemission'
 import { resolveBlob } from '@/utils'
 import * as $enumData from '@/views/als/utils/enum-data'
+import VxeUITable from 'vxe-table'
+import 'vxe-table/lib/style.css'
 
 // 全局设置消息框 点击屏幕外部不能关闭
 ElementUI.MessageBox.setDefaults({ closeOnClickModal: false })
@@ -49,6 +51,7 @@ Vue.prototype.popupduration = popupduration
 Vue.use(ElementUI)
 Vue.use(dataV)
 Vue.use($enumData)
+Vue.use(VxeUITable)
 
 new Vue({
   router,

+ 20 - 3
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',
@@ -254,6 +263,15 @@ export default [
           title: '文件管理'
         }
       },
+      {
+        name: 'LLM',
+        path: '/dataManage/LLM',
+        component: () => import('@/views/als/LLM/index.vue'),
+        meta: {
+          parent: 'BasicData',
+          title: '知识库管理'
+        }
+      },
       {
         name: 'KnowledgeExtraction',
         path: '/knowledgeGraph/knowledgeExtraction',
@@ -314,14 +332,13 @@ export default [
       },
       {
         name: 'SmTask',
-        path: '/dataManage/smTask/SMTaskDetails',
+        path: '/dataManage/SMTaskDetails',
         component: () => import('@/views/als/smTask/SMTaskDetails.vue'),
         meta: {
           parent: 'System',
           roleMenuHide: true,
           navHide: true,
-          title: '任务分配',
-          hide: true
+          title: '任务分配'
         }
       },
       /**

+ 40 - 1
src/store/modules/app.js

@@ -6,13 +6,52 @@ export default {
     tagsViewList: getItem(TAGS_VIEW) || []
   },
   mutations: {
-    //   添加tags
+    //   添加tags,限制最多保留5个标签(不包括首页)
     addTagsViewList(state, tag) {
       const isFind = state.tagsViewList.find((item) => {
         return item.path === tag.path
       })
       if (!isFind) {
+        // 检查是否为同一功能模块的子页面
+        const isSameModule = state.tagsViewList.some((item) => {
+          const itemPath = item.path.split('/')[2]
+          const tagPath = tag.path.split('/')[2]
+          return itemPath === tagPath
+        })
+
+        // 如果是同一模块的子页面,替换该模块最早的子页面标签
+        if (isSameModule) {
+          // const moduleIndex = state.tagsViewList.findIndex((item) => {
+          //   const itemPath = item.path.split('/')[2]
+          //   const tagPath = tag.path.split('/')[2]
+          //   return itemPath === tagPath && item.fullPath !== '/home'
+          // })
+          // if (moduleIndex !== -1) {
+          //   state.tagsViewList.splice(moduleIndex, 1)
+          // }
+
+          const modulePath = tag.path.split('/')[2]
+          const modulePages = state.tagsViewList.filter((item) => {
+            return item.path.split('/')[2] === modulePath && item.fullPath !== '/home'
+          })
+          if (modulePages.length > 1) {
+            //保留最早和最新的子页面
+            const firstPage = modulePages[0]
+            state.tagsViewList = state.tagsViewList.filter((item) => {
+              return item.path.split('/')[2] !== modulePath || item === firstPage
+            })
+          }
+        }
+
         state.tagsViewList.push(tag)
+        // 如果标签数超过5个(不包括首页),删除最早添加的非首页标签
+        if (state.tagsViewList.length > 6) {
+          // 找到第一个非首页的标签的索引
+          const firstNonHomeIndex = state.tagsViewList.findIndex((item) => item.fullPath !== '/home')
+          if (firstNonHomeIndex !== -1) {
+            state.tagsViewList.splice(firstNonHomeIndex, 1)
+          }
+        }
         setItem(TAGS_VIEW, state.tagsViewList)
       }
     },

+ 239 - 0
src/views/als/LLM/index.vue

@@ -0,0 +1,239 @@
+<template>
+  <div class="view-table-content">
+    <div style="width: 100%">
+      <div class="view-dataType-title">
+        <div class="view-dataType-title-btn">
+          <el-button type="success" @click="openDialog()">上传文件</el-button>
+          <el-button type="warning" @click="remove(tableCheckItems)" :disabled="tableCheckItems.length == 0">删除</el-button>
+        </div>
+      </div>
+      <div class="view-dataType-table">
+        <LTable ref="table" @selection-change="selection" :defaultFetch="false" :fetch="fetch" :columns="columns" :dataSource="tableData" :options="options"></LTable>
+      </div>
+      <!-- 添加或修改模型信息对话框 -->
+      <el-dialog title="上传文件" :visible.sync="dialogVisible" ref="fileUploadRef" width="600px" :before-close="handleClose" style="text-align: center">
+        <el-upload class="upload-demo" name="files" drag :data="carryData" :before-upload="handleBeforeUpload" :file-list="fileList" :headers="headers" :action="uploadFileUrl" :on-success="handleUploadSuccess" :on-error="handleUploadError" multiple>
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+          <div class="el-upload__tip" slot="tip">只能上传docx文件,且不超过50MB</div>
+        </el-upload>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getListFiles, deleteDocs } from '@/api/als/LLM'
+import { deepClone, debounce, getItem } from '@/utils/index'
+
+export default {
+  name: 'LLM',
+  data() {
+    // 这里存放数据
+    return {
+      dialogTitle: '新增',
+      dialogVisible: false,
+      keyWordData: '',
+      searchValue: '',
+      columns: [
+        {
+          prop: 'kb_name',
+          label: '知识库名称'
+        },
+        {
+          prop: 'file_name',
+          label: '文件名称'
+        },
+        {
+          prop: 'file_ext',
+          label: '文件类型'
+        },
+        {
+          prop: 'document_loader',
+          label: '文件加载器类型'
+        },
+        {
+          prop: 'docs_count',
+          label: '文件分割数量'
+        },
+        {
+          prop: 'text_splitter',
+          label: '文本分割器类型'
+        },
+        {
+          prop: 'create_time',
+          label: '创建时间'
+        },
+        {
+          prop: 'file_size',
+          label: '文件大小(字节)'
+        },
+        {
+          button: true,
+          label: '操作',
+          width: '240px',
+          group: [
+            {
+              name: '删除',
+              type: 'text',
+              round: false,
+              plain: false,
+              onClick: (row, index, scope) => {
+                this.remove([row])
+              }
+            }
+          ]
+        }
+      ],
+      options: {
+        stripe: false, // 斑马纹
+        mutiSelect: true, // 多选框
+        index: false, // 显示序号, 多选则 mutiSelect
+        loading: false, // 表格动画
+        initTable: false, // 是否一挂载就加载数据
+        border: true,
+        height: 'calc(100vh - 300px)'
+      },
+      tableCheckItems: [],
+      tableData: [],
+      carryData: {
+        to_vector_store: true,
+        override: false,
+        chunk_size: 750,
+        chunk_overlap: 150,
+        zh_title_enhance: true,
+        knowledge_base_name: 'lqbz'
+      },
+      fileList: [],
+      uploadFileUrl: '/api/knowledge_base/upload_docs',
+      headers: { Authorization: getItem('token') }
+    }
+  },
+  mounted() {
+    this.getListFilesAPI()
+  },
+  methods: {
+    async getListFilesAPI() {
+      if (this.$refs.table) this.$refs.table.clearSelection()
+      const { data } = await getListFiles({ knowledge_base_name: 'lqbz' })
+      this.tableData = data
+    },
+
+    fetch() {
+      this.getListFilesAPI()
+    },
+
+    async searchClick() {
+      this.getListFilesAPI({ name: keyWordData })
+    },
+
+    openDialog() {
+      this.dialogTitle = '新增'
+      this.dialogVisible = true
+    },
+
+    async deleteDocsAPI(params) {
+      const data = {
+        knowledge_base_name: 'lqbz',
+        file_names: params,
+        delete_content: true,
+        not_refresh_vs_cache: false
+      }
+      try {
+        const { code } = await deleteDocs(data)
+        if (code === 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          })
+          this.getListFilesAPI()
+          this.handleClose()
+        }
+      } catch (error) {}
+    },
+
+    handleClose() {
+      this.dialogVisible = false
+      this.form = {
+        fileName: '',
+        fileType: ''
+      }
+    },
+
+    handUpdate(row) {
+      this.dialogTitle = '编辑'
+      this.form = deepClone(row)
+      this.dialogVisible = true
+    },
+
+    submit() {},
+
+    selection(val) {
+      this.tableCheckItems = val
+    },
+
+    remove(row) {
+      this.$confirm('是否删除该数据', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          this.deleteDocsAPI(row.map((e) => e.file_name))
+        })
+        .catch(() => {})
+    },
+
+    handleBeforeUpload(file) {
+      const fileType = ['docx']
+      const fileName = file.name.split('.')
+      const fileExt = fileName[fileName.length - 1]
+      const isTypeOk = fileType.indexOf(fileExt) >= 0
+      if (!isTypeOk) {
+        this.$message({
+          type: 'error',
+          message: '文件格式不正确, 请上传docx格式文件!'
+        })
+        return false
+      }
+      // 校检文件大小
+      const isLt = file.size / 1024 / 1024 < 50
+      if (!isLt) {
+        this.$message({
+          type: 'error',
+          message: '上传文件大小不能超过 50 MB!'
+        })
+        return false
+      }
+    },
+
+    handleUploadSuccess(res, file) {
+      if (res.code === 200) {
+        this.$message({
+          type: 'success',
+          message: '文件上传成功'
+        })
+      } else {
+        this.$message({
+          type: 'error',
+          message: res.msg
+        })
+      }
+      this.getListFilesAPI()
+      this.fileList = []
+      this.dialogVisible = false
+    },
+
+    handleUploadError(err) {
+      this.$message({
+        type: 'error',
+        message: '上传文件失败,请重试'
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../index.scss';
+</style>

+ 2 - 2
src/views/als/MDCData/index.vue

@@ -166,7 +166,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -179,7 +179,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 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: false, // 斑马纹
+        mutiSelect: true, // 多选框
+        index: false, // 显示序号, 多选则 mutiSelect
+        loading: false, // 表格动画
+        initTable: false, // 是否一挂载就加载数据
+        border: true,
+        height: 'calc(100vh - 300px)'
+      },
+      tableCheckItems: [],
+      tableData: [],
+      tableRequset: {
+        total: 0,
+        pageIndex: 1,
+        pageSize: 20,
+        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>

+ 26 - 16
src/views/als/airConfiguration/index.vue

@@ -16,11 +16,11 @@
         </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>
+        <LTable ref="table" @selection-change="selection" :defaultFetch="false" :fetch="fetch" :columns="columns" :dataSource="tableData" :options="options"></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 ref="formRef" :rules="rules" :model="form" label-width="80px">
           <el-form-item label="上级名称" prop="conCode">
             <treeselect v-model="form.parentId" :normalizer="normalizer" :options="tableData" :show-count="true" placeholder="选择上级名称" />
             <!-- <el-input v-model="form.conCode" placeholder="请输入构型编码" /> -->
@@ -157,7 +157,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -174,7 +174,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
@@ -195,7 +195,13 @@ export default {
         updatedTime: ''
       },
       debounceFn: debounce(this.fetch, 500),
-      aircaftModelAll: []
+      aircaftModelAll: [],
+      rules: {
+        parentId: [{ required: true, message: '上级名称不能为空', trigger: 'change' }],
+        conCode: [{ required: true, message: '构型编码不能为空', trigger: 'blur' }],
+        name: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
+        specsModel: [{ required: true, message: '规格型号不能为空', trigger: 'blur' }]
+      }
     }
   },
   watch: {
@@ -272,9 +278,9 @@ export default {
 
     async getAirConfigurationAPI(params) {
       if (this.$refs.table) this.$refs.table.clearSelection()
-      const { keyWord } = this
-      const { pageSize, pageIndex } = this.tableRequset
-      const { data, code } = await getAirConfiguration({ pageSize, pageNum: pageIndex, ...params })
+      // const { keyWord } = this
+      // const { pageSize, pageIndex } = this.tableRequset
+      const { data, code } = await getAirConfiguration({ ...params })
       if (code === 200) {
         this.tableData = []
         if (!(this.currentNode.type == 1 && this.currentNode.children.length == 0)) {
@@ -373,14 +379,18 @@ export default {
     },
 
     submit() {
-      switch (this.dialogTitle) {
-        case '编辑':
-          this.updateAirConfigurationAPI()
-          break
-        case '新增':
-          this.addAirConfigurationAPI()
-          break
-      }
+      this.$refs.formRef.validate((valid) => {
+        if (valid) {
+          switch (this.dialogTitle) {
+            case '编辑':
+              this.updateAirConfigurationAPI()
+              break
+            case '新增':
+              this.addAirConfigurationAPI()
+              break
+          }
+        }
+      })
     },
 
     selection(val) {

+ 23 - 17
src/views/als/airInstall/index.vue

@@ -11,7 +11,7 @@
           <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="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>
@@ -23,8 +23,8 @@
 
       <!-- 添加或修改装机信息对话框 -->
       <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="1000px" :before-close="handleClose">
-        <LTable ref="avmatTableRef" @current-change="avmatSelection" :defaultFetch="false" :columns="avmatColumns" :dataSource="avmatTableData" :options="avmatOptions" :pagination="avmatTableRequset"></LTable>
-        <el-form ref="form" style="margin-top: 20px" :inline="true" :model="form" label-width="80px">
+        <LTable ref="avmatTableRef" @current-change="avmatSelection" :showColumnSetting="false" :defaultFetch="false" :columns="avmatColumns" :dataSource="avmatTableData" :options="avmatOptions" :pagination="avmatTableRequset"></LTable>
+        <el-form ref="formRef" style="margin-top: 20px" :inline="true" :model="form" :rules="rules" label-width="80px">
           <el-form-item label="航材名称" prop="devicesName">
             <el-input v-model="form.devicesName" placeholder="请输入航材名称" disabled />
           </el-form-item>
@@ -105,7 +105,7 @@ export default {
     return {
       dialogTitle: '新增',
       dialogVisible: false,
-      keyWord: '',
+      keyWordData: '',
       aircaftConfigIdList: [],
       currentNodeKey: '',
       currentNode: {},
@@ -135,6 +135,9 @@ export default {
         children: 'children',
         label: 'label'
       },
+      rules: {
+        devicesName: [{ required: true, message: '请在列表中选择航材数据', trigger: 'blur' }]
+      },
       searchValue: '',
       columns: [
         {
@@ -316,7 +319,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: false, // 多选框
         index: true, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -325,7 +328,7 @@ export default {
         height: 'calc(100vh - 300px)'
       },
       avmatOptions: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: false, // 多选框
         index: true, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -339,7 +342,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       avmatTableRequset: {
@@ -452,7 +455,6 @@ export default {
 
     async getAirInstallAPI(params) {
       if (this.$refs.table) this.$refs.table.clearSelection()
-      const { keyWord } = this
       const { pageSize, pageIndex } = this.tableRequset
       const {
         data: { list, total }
@@ -466,7 +468,7 @@ export default {
     },
 
     searchClick() {
-      this.getAirInstallAPI({ configId: this.currentConfigNodeKey })
+      this.getAirInstallAPI({ configId: this.currentConfigNodeKey, devicesName: this.keyWordData })
     },
 
     async addAirInstallAPI() {
@@ -571,14 +573,18 @@ export default {
     },
 
     submit() {
-      switch (this.dialogTitle) {
-        case '编辑':
-          this.updateAirInstallAPI()
-          break
-        case '新增':
-          this.addAirInstallAPI()
-          break
-      }
+      this.$refs.formRef.validate((valid) => {
+        if (valid) {
+          switch (this.dialogTitle) {
+            case '编辑':
+              this.updateAirInstallAPI()
+              break
+            case '新增':
+              this.addAirInstallAPI()
+              break
+          }
+        }
+      })
     },
 
     selection(val) {

+ 2 - 2
src/views/als/aircraft/index.vue

@@ -120,7 +120,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -133,7 +133,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 4 - 5
src/views/als/atlasFile/index.vue

@@ -7,7 +7,7 @@
           <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-input placeholder="请输入文件名称" v-model="keyWordData" class="input1">
             <el-button slot="append" icon="el-icon-search" @click="searchClick"></el-button>
           </el-input>
         </div>
@@ -102,7 +102,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -115,7 +115,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
@@ -162,7 +162,6 @@ export default {
 
     async getAtlasFileAPI(params) {
       if (this.$refs.table) this.$refs.table.clearSelection()
-      const { keyWord } = this
       const { pageSize, pageIndex } = this.tableRequset
       const {
         data: { list, total }
@@ -176,7 +175,7 @@ export default {
     },
 
     async searchClick() {
-      this.getAtlasFileAPI({ name: keyWordData })
+      this.getAtlasFileAPI({ fileName: this.keyWordData })
     },
 
     async addAtlasFileAPI() {

+ 2 - 2
src/views/als/carryChecklist/index.vue

@@ -146,7 +146,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -159,7 +159,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 43 - 3
src/views/als/components/Charts/playBackChart.vue

@@ -25,7 +25,7 @@ export default {
      * legendData:[]
      * xAxisData:{}
      * yAxisData:{}
-     * seriesData:{}
+     * seriesData:{},
      */
     chartData: {
       type: Object,
@@ -34,7 +34,8 @@ export default {
   },
   data() {
     return {
-      chart: null
+      chart: null,
+      timer: null
     }
   },
   watch: {
@@ -55,6 +56,7 @@ export default {
     })
   },
   beforeDestroy() {
+    if (this.timer) clearTimeout(this.timer)
     if (!this.chart) {
       return
     }
@@ -68,8 +70,36 @@ export default {
         this.chart.dispose()
         this.chart = null
       }
-      // console.log('66', this.chartRef)
       this.chart = echarts.init(this.$refs.preResultRef)
+      // 监听 dataZoom 事件
+      this.chart.on('dataZoom', (params) => {
+        let startValue, endValue
+        if (params.batch) {
+          if (params.batch[0].startValue) {
+            startValue = this.chartData.xAxisData[params.batch[0].startValue]
+            endValue = this.chartData.xAxisData[params.batch[0].endValue]
+          } else if (params.batch[0].start) {
+            const xAxisLength = this.chartData.xAxisData.length
+            const startPercent = params.batch[0].start
+            const endPercent = params.batch[0].end
+            startValue = this.chartData.xAxisData[Math.ceil((xAxisLength * startPercent) / 100)]
+            endValue = this.chartData.xAxisData[Math.floor((xAxisLength * endPercent) / 100)]
+          }
+        } else {
+          const xAxisLength = this.chartData.xAxisData.length
+          const startPercent = params.start
+          const endPercent = params.end
+          startValue = this.chartData.xAxisData[Math.ceil((xAxisLength * startPercent) / 100)]
+          const end = Math.floor((xAxisLength * endPercent) / 100)
+          endValue = this.chartData.xAxisData[end == xAxisLength ? end - 1 : end]
+        }
+        if (this.timer) {
+          clearTimeout(this.timer)
+        }
+        this.timer = setTimeout(() => {
+          this.$emit('data-zoom', [startValue, endValue])
+        }, 500)
+      })
       this.setOptions(this.chartData)
     },
     setOptions({ title, legendData, xAxisData, yAxisData, seriesData } = {}) {
@@ -87,6 +117,16 @@ export default {
             color: '#fff'
           }
         },
+        toolbox: {
+          show: true,
+          feature: {
+            dataZoom: {
+              yAxisIndex: 'none'
+            },
+            restore: {},
+            saveAsImage: {}
+          }
+        },
         xAxis: {
           type: 'category',
           data: xAxisData

+ 81 - 1
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() {
@@ -78,7 +92,7 @@ export default {
       number: 0,
       uploadList: [],
       // baseUrl: '/api',
-      uploadFileUrl: '/api/als/common/upload',
+      uploadFileUrl: '/api/als/resource/oss/upload',
       headers: { Authorization: getItem('token') },
       fileList: [],
       loading: null
@@ -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--

+ 1 - 1
src/views/als/dataAircraftConfiguration/components/StructureEquipping/index.vue

@@ -69,7 +69,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       activeRow: {

+ 2 - 2
src/views/als/dataAnalysis/index.vue

@@ -132,7 +132,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -145,7 +145,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/dataImport/index.vue

@@ -130,7 +130,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -143,7 +143,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 319 - 78
src/views/als/falseAlarm/index.vue

@@ -17,33 +17,43 @@
       </div>
       <!-- 警告列表对话框 -->
       <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" :before-close="handleClose" width="1200px">
+        <el-form ref="form" :inline="true" :model="form" label-width="80px" disabled>
+          <el-form-item label="编目" prop="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="form.sortieNo" />
+          </el-form-item>
+          <!-- <el-form-item label="飞行时间" prop="flightDate">
+            <el-input v-model="form.flightDate" />
+          </el-form-item> -->
+        </el-form>
+        <LTable ref="warningTable" @selection-change="selection" :defaultFetch="false" :showColumnSetting="false" :columns="warningColumns" :dataSource="warningTableData" :options="warningOptions" :pagination="warningTableRequset"></LTable>
         <el-dialog width="80%" title="飞参数据曲线" :visible.sync="innerVisible" :before-close="innerDialogClose" append-to-body>
-          <div style="width: 100%; position: relative; color: #fff">
+          <PlayBackChart @data-zoom="handleDataZoom" :chartData="chartData" />
+          <div style="margin-top: 20px">
+            <span style="color: #fff; margin-left: 30px">请选择时间区间:</span>
+            <el-time-picker is-range v-model="mathTime" placement="bottom-start" value-format="HH:mm:ss.SSS" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" @change="handleMathTime" :clearable="false"></el-time-picker>
+            <el-button class="refresh" @click="resetTime">重 置</el-button>
+            <el-button type="success" @click="getExecuteMathAPI" style="margin-left: 15px">确 定</el-button>
+            <LTable ref="mathTable" style="margin-top: 20px" :showColumnSetting="false" :defaultFetch="false" :columns="mathColumns" :dataSource="mathTableData" :options="mathOptions"></LTable>
+          </div>
+          <div style="width: 100%; color: #fff; text-align: center">
             <el-radio-group class="isFalseAlarm" v-model="isFalseAlarm" size="small">
               <el-radio-button label="0">实警</el-radio-button>
               <el-radio-button label="1">虚警</el-radio-button>
             </el-radio-group>
           </div>
-          <PlayBackChart :chartData="chartData" />
           <span slot="footer" class="dialog-footer">
             <el-button @click="innerDialogClose">取 消</el-button>
             <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-item label="编目" prop="aircraftId">
-            <el-select v-model="airForm.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-form-item>
-          <el-form-item label="飞行时间" prop="flightDate">
-            <el-input v-model="airForm.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>
@@ -56,6 +66,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, executeMath } from '@/api/als/algorithm'
+import { getWarningResult, updateWarningResult } from '@/api/als/falseAlarmResult'
 
 export default {
   name: 'FalseAlarm',
@@ -66,6 +78,7 @@ export default {
       dialogTitle: '新增',
       dialogVisible: false,
       innerVisible: false,
+      progressVisible: false,
       keyWordData: '',
       aircaftModelIdList: [],
       currentNodeKey: '',
@@ -103,39 +116,56 @@ export default {
           label: '架次号'
         },
         {
-          prop: 'flightDate',
-          label: '飞行时间'
-        },
-        {
-          prop: 'source',
-          label: '数据源',
+          prop: 'dataStatus',
+          label: '状态',
+          // 1 未处理,2  已处理
           render: (h, params) => {
-            if (params.row.source == 1) {
-              return h('span', { class: 'success-state' }, '飞参数据')
+            if (params.row.dataStatus == '1') {
+              return h('span', '未处理')
+            } else if (params.row.dataStatus == '2') {
+              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: 'dataStatus',
+              // disableKey: '2',
+              round: false,
+              plain: false,
+              onClick: (row, index, scope) => {
+                this.beginExecute(row)
+              }
+            },
+            {
+              name: '查看',
               type: 'text',
+              statusKey: 'dataStatus',
+              unDisableKey: '2',
               round: false,
               plain: false,
               onClick: (row, index, scope) => {
-                this.checkWarningList(row)
+                this.checkResultList(row)
               }
             }
           ]
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -148,30 +178,40 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       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) => {
+            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码无判据公式')
             }
           }
         },
@@ -193,9 +233,9 @@ export default {
         }
       ],
       warningOptions: {
-        stripe: true, // 斑马纹
-        mutiSelect: true, // 多选框
-        index: false, // 显示序号, 多选则 mutiSelect
+        stripe: false, // 斑马纹
+        mutiSelect: false, // 多选框
+        index: true, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
         initTable: false, // 是否一挂载就加载数据
         border: true,
@@ -209,6 +249,58 @@ export default {
         pageSize: 10,
         searchValue: ''
       },
+      mathColumns: [
+        {
+          prop: 'params',
+          label: '参数'
+        },
+        {
+          prop: 'mean',
+          label: '算数平均数'
+        },
+        {
+          prop: 'variance',
+          label: '方差'
+        },
+        {
+          prop: 'populationVariance',
+          label: '总体方差'
+        },
+        {
+          prop: 'sum',
+          label: '和'
+        },
+        {
+          prop: 'max',
+          label: '最大值'
+        },
+        {
+          prop: 'min',
+          label: '最小值'
+        },
+        {
+          prop: 'mode',
+          label: '众数'
+        },
+        {
+          prop: 'geometricMean',
+          label: '几何平均数'
+        },
+        {
+          prop: 'sumSq',
+          label: '平方和'
+        }
+      ],
+      mathOptions: {
+        stripe: false, // 斑马纹
+        mutiSelect: false, // 多选框
+        index: false, // 显示序号, 多选则 mutiSelect
+        loading: false, // 表格动画
+        initTable: false, // 是否一挂载就加载数据
+        border: true,
+        height: '300px'
+      },
+      mathTableData: [],
       debounceFn: debounce(this.fetch, 500),
       aircaftCatalogAll: [],
       chartData: {
@@ -218,22 +310,33 @@ export default {
         yAxisData: [],
         seriesData: []
       },
+      timeFlag: null,
+      timeFlagPos: null,
       form: {
         id: '',
         sortieNo: '',
         aircraftId: '',
-        code: '',
-        name: '',
-        describe: [],
-        status: ''
-      },
-      airForm: {
-        aircraftId: '',
-        sortieNo: '',
+        ossId: '',
+        dataStatus: '',
         flightDate: ''
       },
+      warningForm: {
+        id: null,
+        resultContent: ''
+      },
       isFalseAlarm: '0',
-      currentSortieNo: ''
+      currentSortieNo: '',
+      percentage: 0,
+      mathTime: [],
+      mathParams: {
+        code: '',
+        sortieNo: '',
+        beginTime: '',
+        endTime: ''
+      },
+      backupsTime: []
+      // startTime:'',
+      // endTime:'',
     }
   },
   watch: {
@@ -242,12 +345,6 @@ export default {
       this.debounceFn()
     }
   },
-  // computed: {
-  //   falseAlarmText() {
-  //     console.log('this.isFalseAlarm', this.isFalseAlarm)
-  //     return this.isFalseAlarm === '1' ? '实警' : '虚警'
-  //   }
-  // },
   mounted() {
     this.getAircaftCatalogTreeAPI()
   },
@@ -322,7 +419,7 @@ export default {
     },
 
     openDialog() {
-      this.dialogTitle = '警告列表'
+      this.dialogTitle = '虚警抑制结果'
       this.dialogVisible = true
     },
 
@@ -330,9 +427,12 @@ export default {
       this.dialogVisible = false
       this.warningTableData = []
       this.currentSortieNo = ''
-      this.airForm = {
-        aircraftId: '',
+      this.form = {
+        id: '',
         sortieNo: '',
+        aircraftId: '',
+        ossId: '',
+        dataStatus: '',
         flightDate: ''
       }
     },
@@ -346,24 +446,35 @@ export default {
         yAxisData: [],
         seriesData: []
       }
+      this.warningForm = {
+        id: null,
+        resultContent: ''
+      }
+      this.mathParams = {
+        code: '',
+        sortieNo: '',
+        beginTime: '',
+        endTime: ''
+      }
+      this.mathTableData = []
       this.isFalseAlarm = false
     },
 
     submit() {
-      this.form.status = this.isFalseAlarm
-      this.updateWarningAPI()
+      this.warningForm.resultContent = this.isFalseAlarm
+      this.updateWarningResultAPI()
     },
 
-    async updateWarningAPI() {
+    async updateWarningResultAPI() {
       try {
-        const { code } = await updateWarning({ ...this.form })
+        const { code } = await updateWarningResult({ ...this.warningForm })
         if (code === 200) {
           this.$message({
             type: 'success',
             message: '操作成功!'
           })
           this.innerDialogClose()
-          this.getWarningAPI({ sortieNo: this.currentSortieNo })
+          this.getWarningResultAPI({ sortieNo: this.currentSortieNo })
         }
       } catch (error) {}
     },
@@ -372,14 +483,25 @@ 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
+      this.warningTableData = []
+      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
@@ -391,10 +513,59 @@ export default {
     },
 
     async checkCurve(row) {
-      this.isFalseAlarm = row.status
-      this.form = deepClone(row)
-      const { data } = await getCurveData(row.code, row.sortieNo)
-      this.getResultData(data)
+      this.isFalseAlarm = row.resultContent
+      this.warningForm = deepClone(row)
+      this.mathParams.code = row.code
+      this.mathParams.sortieNo = row.sortieNo
+      this.timeFlag = row.attribute2
+      try {
+        const { code, data } = await getCurveData(row.code, row.sortieNo)
+        if (code === 200) {
+          if (data) {
+            this.getExecuteMathAPI()
+            this.getResultData(data)
+          } else {
+            this.$message({
+              type: 'warning',
+              message: '无飞参数据!'
+            })
+          }
+        }
+      } catch (error) {}
+    },
+
+    handleMathTime(time) {
+      this.mathParams.beginTime = time[0]
+      this.mathParams.endTime = time[1]
+    },
+
+    resetTime() {
+      //     chart.dispatchAction({
+      //   type: 'dataZoom',
+      //   start: 0, // 起始位置
+      //   end: 100, // 终止位置
+      // });
+      this.mathTime = this.backupsTime
+      this.handleMathTime(this.mathTime)
+      this.getExecuteMathAPI()
+    },
+
+    // 获取数学数据
+    async getExecuteMathAPI() {
+      this.mathOptions.loading = true
+      try {
+        const { data, code } = await executeMath(this.mathParams)
+        if (code === 200) {
+          this.mathTableData = []
+          this.mathOptions.loading = false
+          Object.keys(data).forEach((item) => {
+            this.mathTableData.push({
+              params: item,
+              ...data[item]
+            })
+          })
+        }
+      } catch (error) {}
     },
 
     getResultData(data) {
@@ -409,13 +580,30 @@ export default {
       const contentData = JSON.parse(data)
       const headData = Object.keys(contentData)
       this.chartData.legendData = headData
+      const timeList = contentData['时间']
+      this.timeFlagPos = timeList.findIndex((item) => {
+        return item == this.timeFlag
+      })
       for (var key in contentData) {
         if (key === '时间') {
-          this.chartData.xAxisData = contentData['时间']
+          const time = [timeList[0], timeList[timeList.length - 1]]
+          this.mathTime = this.backupsTime = time
+          this.chartData.xAxisData = timeList
         } else {
           this.chartData.seriesData.push({
             name: key,
             type: 'line',
+            markLine: {
+              symbol: 'none',
+              data: [{ xAxis: this.timeFlagPos }],
+              lineStyle: {
+                color: '#f00'
+              },
+              label: {
+                formatter: this.timeFlag,
+                color: '#f00'
+              }
+            },
             data: contentData[key],
             connectNulls: true
           })
@@ -425,7 +613,6 @@ export default {
     },
 
     handleResultData(resultData) {
-      console.log('resultData', resultData)
       const headData = Object.keys(resultData)
       const contentData = {}
       headData.forEach((headItem) => {
@@ -437,6 +624,55 @@ 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
+      }
+    },
+
+    handleDataZoom(val) {
+      if (val[0] && val[0]) {
+        this.mathTime = val
+      } else {
+        this.mathTime = this.backupsTime
+        // this.getExecuteMathAPI()
+      }
+      this.handleMathTime(this.mathTime)
+      this.getExecuteMathAPI()
     }
   }
 }
@@ -444,10 +680,15 @@ export default {
 
 <style lang="scss" scoped>
 @import '../index.scss';
+
 .isFalseAlarm {
-  position: absolute;
-  right: 20px;
+  // position: absolute;
+  // right: 20px;
+  margin-top: 20px;
   color: #fff;
   z-index: 9999;
 }
+.refresh {
+  margin-left: 10px;
+}
 </style>

+ 1 - 1
src/views/als/falseAlarmResult/index.vue

@@ -80,7 +80,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: false, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画

+ 34 - 34
src/views/als/faultCase/index.vue

@@ -25,7 +25,7 @@
       </div>
       <!-- 添加或修改故障案例对话框 -->
       <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="600px" :before-close="handleClose">
-        <el-form ref="form" :model="form" label-width="80px">
+        <el-form ref="form" :model="form" label-width="80px" :rules="rules">
           <el-form-item label="机型" prop="aircraftTypeName">
             <treeselect :value="form.aircraftTypeName" :normalizer="aircraftTypeNormalizer" :options="aircraftTypeTreeData" :show-count="true" placeholder="请选择机型" @select="aircraftTypeChange" />
           </el-form-item>
@@ -124,6 +124,12 @@ export default {
         label: 'label'
       },
       searchValue: '',
+      rules: {
+        aircraftTypeName: [{ required: true, message: '机型不能为空', trigger: 'change' }],
+        aircraftSystemName: [{ required: true, message: '系统不能为空', trigger: 'blur' }],
+        faultPhenomenon: [{ required: true, message: '故障现象不能为空', trigger: 'blur' }],
+        faultCause: [{ required: true, message: '故障原因不能为空', trigger: 'blur' }]
+      },
       columns: [
         {
           prop: 'aircraftTypeName',
@@ -133,7 +139,7 @@ export default {
             if (matchedItem) {
               return h('span', matchedItem.label)
             } else {
-              return h('span', {}, '')
+              return h('span', {}, params.row.aircraftTypeName)
             }
           }
         },
@@ -224,8 +230,8 @@ export default {
       ],
 
       options: {
-        stripe: true,
-        mutiSelect: false,
+        stripe: false,
+        mutiSelect: true,
         index: true,
         loading: false,
         initTable: false,
@@ -237,7 +243,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
@@ -289,10 +295,13 @@ export default {
         if (code === 200) {
           this.$message({
             type: 'success',
-            message: '操作成功!'
+            duration: 3000,
+            message: '操作成功!ES数据同步中,稍后刷新查询!'
           })
-          await this.getFaultCaseAPI({ faultPhenomenon: keyWordData })
           this.handleClose()
+          setTimeout(() => {
+            this.getFaultCaseAPI({ faultPhenomenon: this.keyWordData })
+          }, 2000)
         }
       } catch (error) {}
     },
@@ -316,17 +325,12 @@ export default {
       } catch (error) {}
     },
 
-    async getFaultCaseByEsAPI(keyWordData) {
-      console.log(keyWordData)
-    },
-
     fetch() {
-      this.getFaultCaseAPI({ faultPhenomenon: keyWordData })
+      this.getFaultCaseAPI({ faultPhenomenon: this.keyWordData })
     },
 
-    async searchClick(keyWordData) {
-      // this.getFaultCaseByEsAPI(keyWordData)
-      this.getFaultCaseAPI({ faultPhenomenon: keyWordData })
+    async searchClick() {
+      this.getFaultCaseAPI({ faultPhenomenon: this.keyWordData })
     },
 
     //更多按钮
@@ -340,11 +344,12 @@ export default {
           this.$message({
             type: 'success',
             duration: 3000,
-            message: 'ES数据同步中,稍后查询!'
+            message: '添加成功,ES数据同步中!'
           })
-
           this.handleClose()
-          this.getFaultCaseAPI({ faultPhenomenon: keyWordData })
+          setTimeout(() => {
+            this.getFaultCaseAPI({ faultPhenomenon: this.keyWordData })
+          }, 2000)
         }
       } catch (error) {}
     },
@@ -355,10 +360,13 @@ export default {
         if (code === 200) {
           this.$message({
             type: 'success',
-            message: '操作成功!'
+            duration: 3000,
+            message: '操作成功!ES数据同步中...'
           })
           this.handleClose()
-          this.getFaultCaseAPI({ faultPhenomenon: keyWordData })
+          setTimeout(() => {
+            this.getFaultCaseAPI({ faultPhenomenon: this.keyWordData })
+          }, 2000)
         }
       } catch (error) {}
     },
@@ -441,15 +449,6 @@ export default {
       this.form = deepClone(row)
       const matchedItem = this.aircraftTypeAll.find((item) => row.aircraftTypeName.trim() === item.id.trim())
       this.detailAircraftType = matchedItem.label
-      // if (row.faultPicturePath) {
-      //   const res = await getListByIdsApi(row.faultPicturePath)
-      //   this.faultPicturePathUrl = res.data[0].url
-      //   const res2 = await getListByIdsApi(row.faultTreePath)
-      //   this.faultTreePathUrl = res.data[0].url
-      // } else {
-      //   this.faultPicturePathUrl = row.faultPicturePath
-      //   this.faultTreePathUrl = row.faultTreePathUrl
-      // }
       this.form.faultPhenomenon = row.pcontent
       this.form.faultCause = row.fcontent
       this.detailVisible = true
@@ -483,12 +482,13 @@ export default {
     },
     // 文件上传成功处理
     handleFileSuccess(response, file, fileList) {
-      if (this.uploadFlag) {
-        this.upload.open = false
-        this.upload.isUploading = false
-        this.$refs.upload.clearFiles()
-      }
+      this.upload.open = false
+      this.upload.isUploading = false
+      this.$refs.upload.clearFiles()
       this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + '</div>', '导入结果', { dangerouslyUseHTMLString: true })
+      setTimeout(() => {
+        this.getFaultCaseAPI({ faultPhenomenon: this.keyWordData })
+      }, 2000)
     },
     // 提交上传文件
     submitFileForm() {

+ 2 - 2
src/views/als/faultConsumable/index.vue

@@ -121,7 +121,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -134,7 +134,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 72 - 85
src/views/als/faultDiagnosis/index.vue

@@ -15,37 +15,15 @@
       <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>
+        <LTable ref="resultTable" :showColumnSetting="false" :defaultFetch="false" :columns="resultColumns" :dataSource="resultTableData" :options="resultOptions" :pagination="resultTableRequset"></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>
       <el-dialog title="结果展示" :visible.sync="resultShowVisible" :before-close="resultShowDialogClose" width="800px">
         <div style="margin: 10px 0px">{{ resultShowData.result }}</div>
-        <el-image style="width: 500px" :src="resultShowData.url" :preview-src-list="[resultShowData.url]"></el-image>
+        <el-image style="width: 500px" v-if="resultShowData.url !== ''" :src="resultShowData.url" :preview-src-list="[resultShowData.url]"></el-image>
         <span slot="footer" class="dialog-footer">
           <el-button @click="resultShowDialogClose">取 消</el-button>
           <el-button type="primary" @click="resultShowDialogClose">确 定</el-button>
@@ -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,9 +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', 'MDC数据')
+            }
+          }
+        },
+        {
+          prop: 'status',
+          label: '状态',
+          // 1 未处理,2  已处理
+          render: (h, params) => {
+            if (params.row.status == '1') {
+              return h('span', '未处理')
+            } else if (params.row.status == '2') {
+              return h('span', { class: 'success-state' }, '已处理')
             } else {
-              return h('span', { class: 'success-state' }, 'MDC数据')
+              return h('span', { class: 'warning-state' }, '异常')
             }
           }
         },
@@ -138,6 +126,8 @@ export default {
             {
               name: '故障诊断',
               type: 'text',
+              statusKey: 'status',
+              disableKey: '2',
               round: false,
               plain: false,
               onClick: (row, index, scope) => {
@@ -147,6 +137,8 @@ export default {
             {
               name: '查看',
               type: 'text',
+              statusKey: 'status',
+              unDisableKey: '2',
               round: false,
               plain: false,
               onClick: (row, index, scope) => {
@@ -157,7 +149,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -170,25 +162,13 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       resultColumns: [
         {
-          prop: 'sortieNo',
-          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: 'modelType',
+          label: '算法名称'
         },
         {
           prop: 'param',
@@ -203,13 +183,22 @@ export default {
           }
         },
         {
-          prop: 'status',
-          label: '状态',
+          prop: 'remarks',
+          label: '参数特征'
+        },
+        {
+          prop: 'columnData',
+          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', {}, '-')
             }
           }
         },
@@ -231,7 +220,7 @@ export default {
         }
       ],
       resultOptions: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -254,8 +243,10 @@ export default {
         sortieNo: '',
         ossId: '',
         aircraftId: '',
+        aircraftType: '',
         flightDate: '',
         status: '',
+        result: '',
         partId: null
       },
       currentSortieNo: '',
@@ -274,6 +265,7 @@ export default {
       this.debounceFn()
     }
   },
+  computed: {},
   mounted() {
     this.getAircaftCatalogTreeAPI()
   },
@@ -317,13 +309,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
     },
@@ -360,11 +352,6 @@ export default {
       this.getDataImportAPI({ aircraftId: this.aircaftModelIdList })
     },
 
-    openDialog() {
-      this.dialogTitle = '诊断结果'
-      this.dialogVisible = true
-    },
-
     async getAirConfigurationAPI(params) {
       try {
         const { data } = await getAirConfiguration(params)
@@ -374,13 +361,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(row)
     },
 
     partIdSelect(node) {
@@ -398,15 +384,16 @@ export default {
       }
     },
     handleClose() {
-      this.dialogVisible = false
       this.currentSortieNo = ''
       this.form = {
         id: '',
         sortieNo: '',
         ossId: '',
         aircraftId: '',
+        aircraftType: '',
         flightDate: '',
         status: '',
+        result: '',
         partId: null
       }
     },
@@ -420,7 +407,7 @@ export default {
     },
 
     submit() {
-      this.beginExecute()
+      this.beginExecute(row)
     },
 
     selection(val) {
@@ -428,24 +415,24 @@ export default {
     },
 
     checkRelustList(row) {
-      // resultTableData
-      this.getFaultDiagnosisAPI({ sortieNo: row.sortieNo })
+      this.getFaultDiagnosisResultAPI({ sortieNo: row.sortieNo })
       this.resultVisible = true
     },
 
-    checkRelustShow(row) {
-      this.resultShowData = JSON.parse(row.resultContent)
-      this.resultShowData.url = this.getImgUrl(JSON.parse(row.resultContent).ossId)
-      this.resultShowData.result = JSON.parse(res.data.data).result
+    async checkRelustShow(row) {
+      const { data } = await getListByIdsApi(JSON.parse(row.resultContent).ossId)
+      this.resultShowData.url = data[0].url
+      this.resultShowData.result = JSON.parse(row.resultContent).result
       this.resultShowVisible = true
     },
 
     async getImgUrl(ossId) {
-      const url = await getListByIdsApi(ossId)
-      return url
+      const { data } = await getListByIdsApi(ossId)
+      const newUrl = data[0].url
+      return newUrl
     },
 
-    async beginExecute() {
+    async beginExecute(row) {
       this.progressVisible = true
 
       let myTimer = setInterval(() => {
@@ -459,6 +446,7 @@ export default {
       }, 30)
 
       try {
+        this.form.dataId = row.id
         const res = await executeFault(this.form)
         clearInterval(myTimer)
         if (res?.code === 200) {
@@ -467,14 +455,13 @@ export default {
             type: 'success',
             message: '执行成功!'
           })
-          // this.resultShowData = JSON.parse(res.data)
-          this.resultShowData.url = this.getImgUrl(JSON.parse(res.data.data).ossId)
-          this.resultShowData.result = JSON.parse(res.data.data).result
-          this.resultShowVisible = true
-          // this.$alert(`故障诊断结果为:${result}`, '故障诊断结果', {
-          //   confirmButtonText: '确定'
-          // })
-          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.getDataImportAPI({ aircraftId: this.aircaftModelIdList })
           this.handleClose()
         }
       } catch (error) {

+ 1 - 1
src/views/als/faultDiagnosisResult/index.vue

@@ -116,7 +116,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画

+ 2 - 2
src/views/als/faultEquipment/index.vue

@@ -135,7 +135,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -148,7 +148,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/faultNotes/index.vue

@@ -114,7 +114,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -127,7 +127,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/faultPersonnel/index.vue

@@ -128,7 +128,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -141,7 +141,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/faultSetps/index.vue

@@ -121,7 +121,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -134,7 +134,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/faultSpareParts/index.vue

@@ -135,7 +135,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -148,7 +148,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 22 - 16
src/views/als/faultStatistics/echarts.vue

@@ -20,7 +20,7 @@
         </div>
         <div class="input-with-select">
           <span>机型</span>
-          <el-select v-model="select.aircraftModel" placeholder="请选择" @change="getFaultStatisticsListAll({ distinctField: 'aircraft_num' })" filterable clearable>
+          <el-select v-model="select.aircraftModel" placeholder="请选择" @change="getFaultStatisticsListAllAPI({ distinctField: 'aircraft_num' })" filterable clearable>
             <el-option v-for="item in aircraftModelList" :key="item.aircraftModel" :label="item.aircraftModel" :value="item.aircraftModel"> </el-option>
           </el-select>
         </div>
@@ -95,10 +95,12 @@ export default {
       select: {
         startStatisticsDate: '',
         endStatisticsDate: '',
-        major: '特设',
-        aircraftModel: '',
-        groups: '空56旅',
-        aircraftModel: '歼-20'
+        // major: '',
+        // aircraftModel: '',
+        // groups: ''
+        major: '',
+        groups: '',
+        aircraftModel: ''
       },
       typeTree: {
         children: 'children',
@@ -196,10 +198,9 @@ export default {
   },
   mounted() {
     this.getFaultStatisticsAPI(this.select)
-    // this.getAircaftTypeAndModelTreeAPI()
   },
   methods: {
-    async getFaultStatisticsListAll(params) {
+    async getFaultStatisticsListAllAPI(params) {
       if (params.distinctField == 'aircraft_num') {
         params.aircraftModel = this.select.aircraftModel
       }
@@ -315,13 +316,12 @@ export default {
       echartRight.setOption(option)
     },
     async getFaultStatisticsAPI(params) {
-      const { keyWord } = this
-      const res = await getFaultStatisticsEcharts({ keyWord, ...params })
-      this.getFaultStatisticsListAll({ distinctField: 'groups' })
-      this.getFaultStatisticsListAll({ distinctField: 'major' })
-      this.getFaultStatisticsListAll({ distinctField: 'aircraft_model' })
-      this.getFaultStatisticsListAll({ distinctField: 'aircraft_num' })
-      this.getFaultStatisticsListAll({ distinctField: 'faulty_parts_name' })
+      const res = await getFaultStatisticsEcharts({ ...params })
+      this.getFaultStatisticsListAllAPI({ distinctField: 'groups' })
+      this.getFaultStatisticsListAllAPI({ distinctField: 'major' })
+      this.getFaultStatisticsListAllAPI({ distinctField: 'aircraft_model' })
+      this.getFaultStatisticsListAllAPI({ distinctField: 'aircraft_num' })
+      this.getFaultStatisticsListAllAPI({ distinctField: 'faulty_parts_name' })
       const names = []
       const values = []
       const data = []
@@ -333,8 +333,14 @@ export default {
           value: e.nameCount
         })
       })
-      this.echartsLeft(names, values)
-      this.echartsRight(data)
+      const sortPieData = data.sort((a, b) => {
+        return b.value - a.value
+      })
+      const sortBarData = values.sort((a, b) => {
+        return b - a
+      })
+      this.echartsLeft(names, sortBarData)
+      this.echartsRight(sortPieData)
     },
 
     fetch() {

+ 60 - 13
src/views/als/faultStatistics/importDialog/index.vue

@@ -1,18 +1,27 @@
 <template>
-  <el-dialog :title="dialogtitle" :visible.sync="dialogVisible" width="500px" :before-close="handleClose" center>
-    <div class="upload">
-      <div class="upload-left">导入文件</div>
-      <el-upload class="upload-right" ref="upload" accept=".xls,.xlsx" :action="fileApi" :file-list="fileList" :data="fileData" :auto-upload="false" :on-success="onSuccess" :limit="1">
-        <el-button slot="trigger" style="margin-right: 30px" size="small" type="primary">选择文件</el-button>
-        <el-button size="small" type="success" @click="submitUpload">导入数据</el-button>
-        <div slot="tip" class="el-upload__tip" style="margin-left: 10px; margin-top: 10px; font-size: 14px">只能导入 xls / xlsx 文件</div>
-      </el-upload>
-    </div>
-  </el-dialog>
+  <div>
+    <el-dialog :title="dialogtitle" :visible.sync="dialogVisible" width="500px" :before-close="handleClose" center>
+      <div class="upload">
+        <div class="upload-left">导入文件</div>
+        <el-upload class="upload-right" ref="upload" accept=".xls,.xlsx" :action="fileApi" :file-list="fileList" :data="fileData" :auto-upload="false" :on-success="onSuccess" :limit="1">
+          <el-button slot="trigger" style="margin-right: 30px" size="small" type="primary">选择文件</el-button>
+          <el-button size="small" type="success" :loading="importLoading" @click="submitUpload">{{ importLoading ? '导入中' : '导入数据' }}</el-button>
+          <div slot="tip" class="el-upload__tip" style="margin-left: 10px; margin-top: 10px; font-size: 14px">只能导入 xls / xlsx 文件</div>
+        </el-upload>
+      </div>
+    </el-dialog>
+    <el-dialog title="导入结果" class="reaultDialog" :visible.sync="visible" width="800px" :before-close="visibleClose" center>
+      <div class="markdown" v-html="renderMarkdown()"></div>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="visibleClose">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
 import { useMessage } from '@/utils/element-ui'
+import * as marked from 'marked'
 export default {
   data() {
     return {
@@ -22,7 +31,10 @@ export default {
       fileList: [],
       fileData: {
         userName: ''
-      }
+      },
+      visible: false,
+      reaultMsg: '',
+      importLoading: false
     }
   },
   methods: {
@@ -36,6 +48,7 @@ export default {
 
     // 上传
     submitUpload() {
+      this.importLoading = true
       const userInfo = this.$store.state.user.userInfo.user
       this.fileData.userName = userInfo.userName
       this.$refs.upload.submit()
@@ -46,10 +59,31 @@ export default {
       this.$refs.upload.clearFiles()
       this.fileList = []
       const { msg, code } = result
-      useMessage(code == 200 ? 'success' : 'warning', msg, 2000)
-      if (code !== 200) return
+      if (code == 200) {
+        this.reaultMsg = msg
+        this.visible = true
+        this.importLoading = false
+      } else {
+        this.$message({
+          type: 'warning',
+          message: msg
+        })
+        return
+      }
+      // useMessage(code == 200 ? 'success' : 'warning', msg, 2000)
+      // if (code !== 200) return
       this.handleClose()
       this.$emit('submitCallBack')
+    },
+
+    visibleClose() {
+      this.visible = false
+      this.reaultMsg = ''
+    },
+
+    renderMarkdown() {
+      const html = marked.parse(this.reaultMsg)
+      return html
     }
   }
 }
@@ -66,4 +100,17 @@ export default {
     margin-right: 40px;
   }
 }
+
+::v-deep .reaultDialog .el-dialog__body {
+  color: #fff !important;
+}
+.markdown {
+  height: 500px;
+  overflow: auto;
+  -ms-overflow-style: none; /* 适用于 Internet Explorer 和旧版 Edge */
+  scrollbar-width: none; /* 适用于 Firefox */
+}
+.markdown::-webkit-scrollbar {
+  display: none;
+}
 </style>

+ 25 - 52
src/views/als/faultStatistics/index.vue

@@ -16,10 +16,21 @@
               </el-dropdown-menu>
             </el-dropdown>
           </div>
-          <div class="view-carrierFlightMission-FlightMission-btn-right">
+          <div class="view-carrierFlightMission-FlightMission-btn-right" style="width: 70%; overflow-x: auto">
             <div class="input-with-select">
               <span>日期</span>
-              <el-date-picker type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd" format="yyyy-MM-dd" v-model="statisticsDate" placement="bottom-start" placeholder="选择日期">
+              <el-date-picker
+                style="width: 270px"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd"
+                format="yyyy-MM-dd"
+                v-model="statisticsDate"
+                placement="bottom-start"
+                placeholder="选择日期"
+              >
               </el-date-picker>
             </div>
             <div class="input-with-select">
@@ -36,7 +47,7 @@
             </div>
             <div class="input-with-select">
               <span>机型</span>
-              <el-select v-model="select.aircraftModel" placeholder="请选择" @change="getFaultStatisticsListAll({ distinctField: 'aircraft_num' })" filterable clearable>
+              <el-select v-model="select.aircraftModel" placeholder="请选择" @change="getFaultStatisticsListAllAPI({ distinctField: 'aircraft_num' })" filterable clearable>
                 <el-option v-for="item in aircraftModelList" :key="item.aircraftModel" :label="item.aircraftModel" :value="item.aircraftModel"> </el-option>
               </el-select>
             </div>
@@ -52,11 +63,8 @@
                 <el-option v-for="item in faultyPartsNameList" :key="item.faultyPartsName" :label="item.faultyPartsName" :value="item.faultyPartsName"> </el-option>
               </el-select>
             </div>
-            <el-button @click="searchClick" style="border-color: rgb(13, 128, 164); background-color: rgb(13, 128, 164); color: #fff">查询</el-button>
-            <!-- <el-input placeholder="请输入关键字" v-model="keyWord" class="input1">
-              <el-button slot="append" icon="el-icon-search" @click="searchClick"></el-button>
-            </el-input> -->
           </div>
+          <el-button @click="searchClick" style="border-color: rgb(13, 128, 164); background-color: rgb(13, 128, 164); color: #fff">查询</el-button>
         </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>
@@ -410,6 +418,7 @@ export default {
       select: {
         startStatisticsDate: '',
         endStatisticsDate: '',
+        groups: '',
         major: '',
         aircraftModel: ''
       },
@@ -683,20 +692,20 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
         initTable: false, // 是否一挂载就加载数据
         border: true,
-        height: 'calc(100vh - 300px)'
+        height: 'calc(100vh - 320px)'
       },
       tableCheckItems: [],
       tableData: [],
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
@@ -787,10 +796,9 @@ export default {
   },
   mounted() {
     this.getFaultStatisticsAPI()
-    // this.getAircaftTypeAndModelTreeAPI()
   },
   methods: {
-    async getFaultStatisticsListAll(params) {
+    async getFaultStatisticsListAllAPI(params) {
       if (params.distinctField == 'aircraft_num') {
         params.aircraftModel = this.select.aircraftModel
       }
@@ -808,17 +816,6 @@ export default {
       }
     },
 
-    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.getFaultStatisticsAPI({ aircaftModelIdList: this.aircaftModelIdList })
-      }
-    },
-
     async removeFaultStatisticsAPI(params) {
       try {
         const { code } = await removeFaultStatistics(params)
@@ -833,22 +830,6 @@ export default {
       } 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 getFaultStatisticsAPI(params) {
       if (this.$refs.table) this.$refs.table.clearSelection()
       const { keyWord } = this
@@ -858,11 +839,11 @@ export default {
       } = await getFaultStatistics({ pageSize, pageNum: pageIndex, keyWord, ...params })
       this.tableData = list
       this.tableRequset.total = total
-      this.getFaultStatisticsListAll({ distinctField: 'groups' })
-      this.getFaultStatisticsListAll({ distinctField: 'major' })
-      this.getFaultStatisticsListAll({ distinctField: 'aircraft_model' })
-      this.getFaultStatisticsListAll({ distinctField: 'aircraft_num' })
-      this.getFaultStatisticsListAll({ distinctField: 'faulty_parts_name' })
+      this.getFaultStatisticsListAllAPI({ distinctField: 'groups' })
+      this.getFaultStatisticsListAllAPI({ distinctField: 'major' })
+      this.getFaultStatisticsListAllAPI({ distinctField: 'aircraft_model' })
+      this.getFaultStatisticsListAllAPI({ distinctField: 'aircraft_num' })
+      this.getFaultStatisticsListAllAPI({ distinctField: 'faulty_parts_name' })
     },
 
     fetch() {
@@ -915,14 +896,6 @@ export default {
       })
     },
 
-    treeNodeClick(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.getFaultStatisticsAPI()
-    },
-
     openDialog() {
       this.dialogTitle = '新增'
       this.dialogVisible = true

+ 98 - 78
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', 'png']" />
+                <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">
@@ -97,7 +97,7 @@ import { getAircaftCatalogTree } from '@/api/als/sideTree'
 import { getAircaftCatalogAll } from '@/api/als/aircraft'
 import { deepClone, debounce } from '@/utils/index'
 import FileUpload from '@/views/als/components/FileUpload'
-import { flattenTree, download } from '../utils/common'
+import { flattenTree, useDownload } from '../utils/common'
 import { getItem } from '@/utils/index'
 import { getWarning } from '@/api/als/warning'
 
@@ -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',
@@ -200,7 +200,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -213,7 +213,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
@@ -222,8 +222,7 @@ export default {
         source: '1',
         aircraftId: '',
         sortieNo: '',
-        flightDate: '',
-        status: ''
+        flightDate: ''
       },
       debounceFn: debounce(this.fetch, 500),
       aircaftCatalogAll: [],
@@ -242,7 +241,8 @@ export default {
         url: '/api/als/warning/importData'
       },
       warnFileList: [],
-      uploadFlag: false
+      uploadFlag: false,
+      isAirType: ''
     }
   },
   watch: {
@@ -336,6 +336,8 @@ export default {
           })
           this.uploadFlag = true
           this.handleClose()
+          this.handleFileSuccess()
+          this.warnFileList = []
           this.getDataImportAPI({ aircraftId: this.aircaftModelIdList })
           this.submitBtnLoading = false
         }
@@ -354,6 +356,8 @@ export default {
           })
           this.handleClose()
           this.submitBtnLoading = false
+          this.handleFileSuccess()
+          this.warnFileList = []
           this.getDataImportAPI({ aircraftId: this.aircaftModelIdList })
         }
       } catch (error) {
@@ -377,8 +381,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() {
@@ -389,25 +433,19 @@ export default {
         source: '1',
         sortieNo: '',
         aircraftId: '',
-        flightDate: '',
-        status: ''
+        flightDate: ''
       }
     },
 
     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 +480,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 +489,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 +501,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()
     }

+ 2 - 2
src/views/als/flightSplitask/index.vue

@@ -153,7 +153,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -166,7 +166,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/flightask/index.vue

@@ -137,7 +137,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -150,7 +150,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 11 - 2
src/views/als/index.scss

@@ -13,7 +13,7 @@
   .view-dataType-title-search {
     display: flex;
     .input1 {
-      width: 240px;
+      width: 340px;
     }
   }
 }
@@ -26,7 +26,7 @@
   justify-content: space-between;
 }
 .view-dataType-table {
-  margin-top: 30px;
+  margin-top: 10px;
 }
 // ::-webkit-scrollbar{
 //   display: none;
@@ -37,18 +37,26 @@
 }
 .view-carrierFlightMission-FlightMission-btn-right {
   display: flex;
+  -ms-overflow-style: none;
+  scrollbar-width: none;
+
   .input-with-select {
     display: flex;
     margin-right: 20px;
     > span {
+      white-space: nowrap; 
       color: #fff;
       display: block;
       margin-right: 10px;
       width: 60px;
+      height: 24px;
       line-height: 30px;
     }
   }
 }
+.view-carrierFlightMission-FlightMission-btn-right::-webkit-scrollbar{
+  display: none;
+  }
 
 .c-card-content-echars-1 {
   height: calc(100vh - 142px - 90px - 20px);
@@ -58,3 +66,4 @@
   }
 }
 
+

+ 61 - 20
src/views/als/intelligentQA/index.scss

@@ -2,7 +2,7 @@
   display: flex;
   width: 100%;
   height: calc(100vh - 160px);
-  
+  // font-family:Simsun
 }
 
 .history,
@@ -26,7 +26,7 @@
     width: 100%;
     box-sizing: border-box;
     height: calc(100vh - 300px);
-    overflow: hidden;
+    overflow-y: scroll;
     padding: 0px 20px;
 
     .historyItem{
@@ -35,6 +35,11 @@
       line-height: 40px;
       overflow: hidden;
 
+      .question{
+        float: left;
+        width: 73%;
+      }
+
       .historyMore{
         font-size: 1.2rem;
         float: right;
@@ -106,15 +111,6 @@
   display: flex;
   flex-direction: column;
 
-  .header{
-    height: 60px;
-    line-height: 60px;
-    width: 100%;
-    text-align: center;
-    color: #fff;
-    background-color: #f8eaea9b;
-  }
-
   .main{
     flex: 1;
     // background-color: #f8f8fc4c;
@@ -125,7 +121,7 @@
     .chatLine {
       flex: 1;
       width: 100%;
-      max-width: 1200px;
+      max-width: 1250px;
       margin: 0 auto;
     }
     
@@ -145,26 +141,61 @@
         color: #fff;
       }
     }
-    .answerData{
-      max-width: 800px;
-      display: inline-block;
+    .chatA{
+      flex-direction: column;
+      min-width: 900px;
+      max-width:90%;
       border-radius: 8px;
       padding: 6px 12px;
       background: #11536771;
       box-shadow: 0 16px 20px 0 rgba(174, 167, 223, 0.06);
       color: #fff;
-      position: relative;
+      display: inline-block;
+      .tipAnswer{
+        background: inherit;
+      }
+    }
+    .answerData{
+      .title{
+        font-size: 2rem;
+        // font-weight: 700;
+        margin: 30px 0px;
+      }
+      // position: relative;
       .answer{
         margin: 20px 0;
+        margin-left: 30px;
+        line-height: 1.8rem;
+        .think{
+          color: #898989;
+          font-size: 0.8rem;
+          line-height: 1.5rem;
+        }
+      }
+      .markdown{
+        color: #c0c0c0;
+        background:transparent ;
       }
     }
-    
+    ::v-deep .el-collapse {
+      .el-collapse-item__header{
+        background-color: transparent !important;
+        color: #FFF;
+      }
+      .el-collapse-item__wrap{
+        background-color: transparent !important;
+      }
+    }
+    .graph{
+      width: 100%;
+      display: flex;
+      align-items:flex-end;
+      justify-content: center;
+    }
     .more{
       border-radius: 50%;
-      position: absolute;
       font-size: 1.5rem;
-      right: -30px;
-      bottom: 0;
+      margin-left: 20px;
     }
     .more:hover{
       cursor: pointer;
@@ -174,6 +205,7 @@
   .footer{
     width: 100%;
     text-align: center;
+    margin-top: 20px;
 
     .footerContent{
       width: 60%;
@@ -215,6 +247,7 @@
   display: flex;
   flex-direction: row;
   justify-content: space-around;
+  overflow: scroll;
 
   .contentLeft{
     width: 620px;
@@ -236,6 +269,14 @@
       color: #fff;
       margin-bottom: 20px;
     }
+    .fileContent{
+      .pdf{
+        width: 100%;
+        height: calc(100vh - 420px);
+        overflow: scroll;
+        margin-left: 3%;
+      }
+    }
   }
 }
 

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 217 - 92
src/views/als/intelligentQA/index.vue


+ 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: 20,
+        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>

+ 461 - 234
src/views/als/judgeFaultLogic/index.vue

@@ -1,55 +1,149 @@
 <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="600px" :before-close="handleClose">
-        <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+      <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="60%" :before-close="handleClose">
+        <el-form ref="formRef" :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 label="判据名称" prop="name">
+            <el-input v-model="form.name" placeholder="请输入判据名称" />
           </el-form-item>
+          <el-col :span="24">
+            <el-form-item label="公式" prop="remarks">
+              <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>
+                <el-button icon="el-icon-circle-plus-outline" type="info" style="border-radius: 50%" @click="addParamsVisible = true"></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-col :span="24">
+            <el-form-item label="持续判据">
+              <el-button @click="innerVisible = true" type="primary">增加持续判据</el-button>
+            </el-form-item>
+          </el-col>
         </el-form>
-
+        <el-dialog width="30%" title="增加持续判据" :visible.sync="innerVisible" :before-close="sustainClose" append-to-body>
+          <el-form ref="sustainDataFormRef" :model="sustainDataForm" :rules="sustainRules" label-width="80px">
+            <el-form-item label="参数">
+              <el-select v-model="sustainDataForm.params" placeholder="请选择参数">
+                <el-option v-for="item in paramsList" :key="item" :label="item" :value="item"> </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="符号">
+              <el-select v-model="sustainDataForm.symbol" placeholder="请选择符号">
+                <el-option v-for="(item, index) in symbolList" :key="index" :label="item" :value="item"> </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="数值">
+              <el-input v-model="sustainDataForm.number" placeholder="请输入数值" />
+            </el-form-item>
+            <el-form-item label-width="100px" label="持续时间(s)">
+              <el-input-number v-model="sustainDataForm.sustainTime" :min="0" :precision="1" :step="0.5" placeholder="请输入持续时间(s)"></el-input-number>
+            </el-form-item>
+          </el-form>
+          <span slot="footer" class="dialog-footer">
+            <el-button @click="sustainClose">取 消</el-button>
+            <el-button type="primary" @click="submitSustainData">确 定</el-button>
+          </span>
+        </el-dialog>
         <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="addParamsVisible" width="600px" :before-close="addParamsClose">
+        <el-form ref="form" :model="paramsForm" label-width="80px">
+          <el-form-item label="参数名称" prop="paramsName">
+            <el-input v-model="paramsForm.paramsName" placeholder="请输入参数名称" />
+          </el-form-item>
+        </el-form>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="addParamsClose">取 消</el-button>
+          <el-button type="primary" @click="addParamsSubmit">确 定</el-button>
+        </span>
+      </el-dialog>
     </div>
   </div>
 </template>
@@ -57,9 +151,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 +165,15 @@ export default {
     return {
       dialogTitle: '新增',
       dialogVisible: false,
-      keyWord: '',
+      innerVisible: false,
+      addParamsVisible: false,
+      keyWordData: '',
       aircaftModelIdList: [],
-      currentNodeKey: null,
-      currentNode: null,
+      currentNodeKey: '',
+      currentNode: {},
+      currentConfigNodeKey: '',
       menuTreeData: [],
-      dictData: [],
+      configTreeData: [],
       modelData: [],
       treeObj: {
         title: '所属机种',
@@ -84,145 +184,85 @@ 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: '机型',
-          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码'
-        },
-        {
-          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: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
         id: '',
         model: '',
         hmcCode: '',
-        parameterColumn: [],
-        pattern: '',
+        sysId: '',
+        name: '',
         remarks: '',
-        tenantId: '',
-        delFlag: '',
-        version: '',
-        createBy: '',
-        createTime: '',
-        updateBy: '',
-        updateTime: ''
+        attribute1: ''
       },
       rules: {
-        model: [{ required: true, message: '机型不能为空', trigger: 'blur' }],
+        model: [{ required: true, message: '机型不能为空', trigger: 'change' }],
+        sysId: [{ required: true, message: '系统不能为空', trigger: 'change' }],
         hmcCode: [{ required: true, message: 'HMC码不能为空', trigger: 'blur' }],
-        parameterColumn: [{ required: true, message: '参数列不能为空', trigger: 'blur' }],
-        pattern: [{ required: true, message: '模型不能为空', trigger: 'blur' }]
+        name: [{ required: true, message: '判据名称不能为空', trigger: 'blur' }],
+        attribute1: [{ required: true, message: 'HMC码参数不能为空', trigger: 'blur' }],
+        remarks: [{ required: true, message: '公式不能为空', trigger: 'blur' }]
       },
-      debounceFn: debounce(this.fetch, 500),
-      aircaftModelAll: []
-    }
-  },
-  watch: {
-    keyWord() {
-      this.tableRequset.pageIndex = 1
-      this.debounceFn()
+      sustainRules: {
+        params: [{ required: true, message: '参数不能为空', trigger: 'change' }],
+        symbol: [{ required: true, message: '符号不能为空', trigger: 'change' }],
+        number: [{ required: true, message: '数值不能为空', trigger: 'blur' }],
+        sustainTime: [{ required: true, message: '持续时间不能为空', trigger: 'blur' }]
+      },
+      aircaftModelAll: [],
+      allAirConfig: [],
+      operatorList: ['+', '-', '*', '/', '>', '<', '≥', '≤', '(', ')', '&&', '||', '==', '≠', '删除', '清空'],
+      numberList: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.', '-'],
+      paramsList: [],
+      symbolList: ['>', '<', '≥', '≤', '≠', '=='],
+      // 持续时间内容
+      sustainDataForm: {
+        params: '',
+        symbol: '',
+        number: '',
+        sustainTime: ''
+      },
+      paramsForm: {
+        paramsName: ''
+      }
     }
   },
   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
-    },
-
     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) {
@@ -233,102 +273,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, totalCount }
-      } = await getJudgeFaultLogic({ pageSize, pageNum: pageIndex, keyWord, ...params })
+        data: { list, total }
+      } = await getJudgeFaultLogic({ pageSize, pageNum: pageIndex, ...params })
       this.tableData = list
-      this.tableRequset.total = totalCount
-      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()
-      this.$refs['form'].validate(async (valid) => {
-        if (valid) {
-          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, keyWord: this.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() {
@@ -337,35 +344,91 @@ 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() {
-      switch (this.dialogTitle) {
-        case '编辑':
-          this.updateJudgeFaultLogicAPI()
-          break
-        case '新增':
-          this.addJudgeFaultLogicAPI()
-          break
-      }
+      this.$refs['formRef'].validate((valid) => {
+        if (valid) {
+          const str = this.form.attribute1.replace(/,/g, ',')
+          const content = str.split(',')
+          if (content.includes('时间')) {
+            this.form.attribute1 = str
+            let c = this.form.remarks.slice(2, this.form.remarks.length - 2).split(' ')
+            let newFormula = c.map((item) => (item === '\\&\\&' ? '&&' : item))
+            this.form.remarks = newFormula.join(' ')
+            switch (this.dialogTitle) {
+              case '编辑':
+                this.updateJudgeFaultLogicAPI()
+                break
+              case '新增':
+                this.addJudgeFaultLogicAPI()
+                break
+            }
+          } else {
+            this.$message({
+              type: 'warning',
+              message: 'HMC码参数需要包含“时间”参数'
+            })
+          }
+        }
+      })
+    },
+
+    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) {
@@ -373,7 +436,7 @@ export default {
     },
 
     remove(row) {
-      this.$confirm('是否删除该机种', '提示', {
+      this.$confirm('是否删除该判据', '提示', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'
@@ -382,6 +445,162 @@ 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(' ')
+      const lastData = c[c.length - 1]
+      const lastIsNumber = this.numberList.find((i) => i == lastData.charAt(lastData.length - 1))
+      if (number == '.' && !lastIsNumber) {
+        useMessage('error', '小数点前必须为数字')
+        return
+      }
+      if (this.paramsList.find((i) => i == lastData)) {
+        useMessage('error', '参数和数字不能相邻')
+        return
+      } else {
+        // 判断最后一位是不是数字
+        if (lastIsNumber) {
+          const newLastData = lastData + number
+          c[c.length - 1] = newLastData
+          const str = c.join(' ')
+          this.form.remarks = `$$${str}$$`
+        } 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}$$`
+          }
+        }
+      }
+    },
+
+    addParamsSubmit() {
+      this.paramsList.push(this.paramsForm.paramsName)
+      this.addParamsClose()
+    },
+
+    // 转换公式
+    handleConvertFormula(aircraftType, formula) {
+      let c = formula.split(' ')
+      let newFormula = c.map((item, index) => {
+        if (item == '&&') {
+          return '\\&\\&'
+        } else {
+          return item
+        }
+      })
+      const str = newFormula.join(' ')
+      return `$$${str}$$`
+    },
+
+    // 增加判据
+    submitSustainData() {
+      this.$refs['sustainDataFormRef'].validate((valid) => {
+        if (valid) {
+          const number = Number(this.sustainDataForm.number)
+          const sustainTime = Number(this.sustainDataForm.sustainTime)
+          const formula = this.form.remarks.slice(2, this.form.remarks.length - 2)
+          const newFormula = formula + ` \\&\\& checkVibrationDuration(${this.sustainDataForm.params},'${this.sustainDataForm.symbol}',${number},${sustainTime},时间)`
+          this.form.remarks = `$$${newFormula}$$`
+          this.sustainClose()
+        }
+      })
+    },
+
+    sustainClose() {
+      this.innerVisible = false
+      this.sustainDataForm = {
+        params: '',
+        symbol: '',
+        number: '',
+        sustainTime: ''
+      }
+    },
+    addParamsClose() {
+      this.addParamsVisible = false
+      this.paramsForm = {
+        paramsName: ''
+      }
     }
   }
 }
@@ -389,4 +608,12 @@ export default {
 
 <style lang="scss">
 @import '../index.scss';
+.table {
+  width: 100%;
+  height: calc(100vh - 280px);
+  overflow: scroll;
+}
+::-webkit-scrollbar {
+  display: none;
+}
 </style>

+ 2 - 2
src/views/als/knowledgeExtraction/extractList.vue

@@ -107,7 +107,7 @@ export default {
         }
       ],
       clauseOptions: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: false, // 多选框
         index: true, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -120,7 +120,7 @@ export default {
       clauseTableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 37 - 19
src/views/als/knowledgeExtraction/index.vue

@@ -7,7 +7,7 @@
           <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-input placeholder="请输入任务名称" v-model="keyWordData" class="input1">
             <el-button slot="append" icon="el-icon-search" @click="searchClick"></el-button>
           </el-input>
         </div>
@@ -17,11 +17,11 @@
       </div>
       <!-- 添加或修改抽取任务对话框 -->
       <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="600px" :before-close="handleClose">
-        <el-form ref="form" :model="form" label-width="80px">
+        <el-form ref="form" :model="form" label-width="80px" :rules="rules">
           <el-form-item label="任务名称" prop="taskName">
             <el-input v-model="form.taskName" placeholder="请输入任务名称" />
           </el-form-item>
-          <el-form-item label="选择抽取文件" label-width="100px" prop="ossId">
+          <el-form-item label="选择抽取文件" label-width="110px" prop="ossId">
             <el-select v-model="form.ossId" placeholder="请选择文件">
               <el-option v-for="item in fileList" :key="item.ossId" :label="item.fileName" :value="item.ossId" />
             </el-select>
@@ -65,6 +65,7 @@
             @selection-change="clauseSelection"
             :defaultFetch="false"
             :fetch="clauseFetch"
+            :showColumnSetting="false"
             :columns="clauseColumns"
             :dataSource="clauseTableData"
             :options="clauseOptions"
@@ -93,7 +94,16 @@
               <p>{{ extractData.content }}</p>
             </div>
             <div class="right">
-              <LTable ref="extractDetailTableRef" :defaultFetch="false" :fetch="extractDetailFetch" :columns="extractDetailColumns" :dataSource="extractData.extractDetailTable" :pagination="extractDetailRequest" :options="extractDetailOptions"></LTable>
+              <LTable
+                ref="extractDetailTableRef"
+                :showColumnSetting="false"
+                :defaultFetch="false"
+                :fetch="extractDetailFetch"
+                :columns="extractDetailColumns"
+                :dataSource="extractData.extractDetailTable"
+                :pagination="extractDetailRequest"
+                :options="extractDetailOptions"
+              ></LTable>
             </div>
           </div>
           <div slot="footer" class="dialog-footer">
@@ -173,6 +183,10 @@ export default {
       storageLoading: false,
       keyWordData: '',
       searchValue: '',
+      rules: {
+        taskName: [{ required: true, message: '任务名称不能为空', trigger: 'blur' }],
+        ossId: [{ required: true, message: '抽取文件不能为空', trigger: 'change' }]
+      },
       columns: [
         {
           prop: 'taskName',
@@ -239,7 +253,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -252,7 +266,7 @@ export default {
       tableRequest: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       clauseColumns: [
@@ -341,7 +355,7 @@ export default {
         }
       ],
       clauseOptions: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: false, // 多选框
         index: true, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -354,7 +368,7 @@ export default {
       clauseTableRequest: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
@@ -457,7 +471,7 @@ export default {
         }
       ],
       extractDetailOptions: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: false, // 多选框
         index: true, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -468,7 +482,7 @@ export default {
       extractDetailRequest: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       // extractDetailTableData: [{ content: 'qqq' }, { content: 'www' }, { content: 'eee' }]
@@ -613,7 +627,7 @@ export default {
     },
 
     async searchClick() {
-      this.getTaskListAPI({ name: keyWordData })
+      this.getTaskListAPI({ taskName: this.keyWordData })
     },
 
     async addTaskAPI() {
@@ -791,15 +805,19 @@ export default {
     },
 
     submit() {
-      switch (this.dialogTitle) {
-        case '编辑':
-          this.updateTaskAPI()
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          switch (this.dialogTitle) {
+            case '编辑':
+              this.updateTaskAPI()
 
-          break
-        case '新增':
-          this.addTaskAPI()
-          break
-      }
+              break
+            case '新增':
+              this.addTaskAPI()
+              break
+          }
+        }
+      })
     },
 
     clauseSubmit() {

+ 84 - 50
src/views/als/knowledgeManage/ERManage/index.vue

@@ -7,38 +7,37 @@
           <el-button type="warning" @click="reset()">重置</el-button>
         </div>
         <div class="view-dataType-title-search">
-          <el-input placeholder="请输入体名称" v-model="keyWordData" 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"></LTable>
+        <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="subjectCategory">
-            <el-input :disabled="dialogTitle === '编辑'" v-model="form.subjectCategory" placeholder="请输入实体名称" />
-            <!-- <el-select v-model="form.subjectCategory" placeholder="请选择主体类型">
-              <el-option v-for="(item, index) in subjectList" :key="index" :label="item.name" :value="item.name" />
-            </el-select> -->
-          </el-form-item>
+        <el-form ref="form" :model="form" label-width="80px" :rules="rules">
           <el-form-item label="主体名称" prop="subjectName">
-            <el-input v-model="form.subjectName" placeholder="请输入实体名称" :disabled="dialogTitle === '编辑'" />
-            <!-- <el-select v-model="form.subjectName" placeholder="请选择实体类型">
-              <el-option v-for="(item, index) in subjectList" :key="index" :label="item.name" :value="item.name" />
-            </el-select> -->
+            <!-- <el-input v-model="form.subjectName" placeholder="请输入主体名称" :disabled="dialogTitle === '编辑'" /> -->
+            <el-select v-model="form.subjectId" placeholder="请选择主体" @change="handleSelectSubject">
+              <el-option v-for="item in entityList" :key="item.id" :label="item.name" :value="item.id" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="主体类型" prop="subjectCategory">
+            <el-input disabled v-model="form.subjectCategory" placeholder="主体类型" />
           </el-form-item>
 
-          <el-form-item label="客体名称" prop="objectName">
-            <el-input :disabled="dialogTitle === '编辑'" v-model="form.objectName" placeholder="请输入实体名称" />
+          <el-form-item label="客体名称" prop="objectId">
+            <el-select v-model="form.objectId" placeholder="请选择客体" @change="handleSelectObject">
+              <el-option v-for="item in entityList" :key="item.id" :label="item.name" :value="item.id" />
+            </el-select>
           </el-form-item>
           <el-form-item label="客体类型" prop="objectCategory">
-            <el-input :disabled="dialogTitle === '编辑'" v-model="form.objectCategory" placeholder="请输入实体类型" />
+            <el-input disabled v-model="form.objectCategory" placeholder="客体类型" />
           </el-form-item>
           <el-form-item label="关系" prop="relationName">
-            <el-select v-model="form.relationName" placeholder="请选择实体类型">
+            <el-select v-model="form.relationName" placeholder="请选择关系">
               <el-option v-for="(item, index) in relationList" :key="index" :label="item.name" :value="item.name" />
             </el-select>
             <!-- <el-input v-model="form.relationName" placeholder="请输入实体名称" /> -->
@@ -69,6 +68,13 @@ export default {
       dialogVisible: false,
       keyWordData: '',
       searchValue: '',
+      rules: {
+        subjectName: [{ required: true, message: '主体名称不能为空', trigger: 'blur' }],
+        subjectCategory: [{ required: true, message: '主体类型不能为空', trigger: 'blur' }],
+        objectName: [{ required: true, message: '客体名称不能为空', trigger: 'blur' }],
+        objectCategory: [{ required: true, message: '客体类型不能为空', trigger: 'blur' }],
+        relationName: [{ required: true, message: '关系不能为空', trigger: 'change' }]
+      },
       columns: [
         {
           prop: 'subjectName',
@@ -117,7 +123,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -130,7 +136,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
@@ -144,7 +150,12 @@ export default {
         relationName: ''
       },
       debounceFn: debounce(this.fetch, 500),
-      relationList: []
+      relationList: [],
+      entityList: [
+        { id: 6, name: 'A通道右鸭翼指令输出指令故障', category: '故障描述' },
+        { id: 6363, name: '更换对应报故ISACF', category: '维修策略' }
+      ],
+      loading: null
     }
   },
   watch: {
@@ -160,15 +171,6 @@ export default {
     async getInit() {
       this.getRelationAPI()
       this.getAllRelationClassAPI()
-      // try {
-      //   if (this.$refs.table) this.$refs.table.clearSelection()
-      //   const {
-      //     data: { dataList }
-      //   } = await getEntityList()
-      //   this.tableData = dataList
-      // } catch (error) {
-
-      // }
     },
 
     async deleteRelationAPI(row) {
@@ -196,13 +198,21 @@ export default {
     async getRelationAPI(params) {
       try {
         if (this.$refs.table) this.$refs.table.clearSelection()
+        const { pageSize, pageIndex } = this.tableRequset
+        this.loading = this.$loading({
+          lock: true,
+          text: '正在获取知识图谱实体关系数据,请稍候...',
+          spinner: 'el-icon-loading'
+        })
         const {
           data: { dataList, total }
-        } = await getERList()
-        const tableData = this.handleERData(dataList)
-        this.tableData = tableData
-        // this.tableRequset.total = total
-      } catch (error) {}
+        } = await getERList({ pageSize, pageNum: pageIndex, ...params })
+        this.tableData = dataList
+        this.tableRequset.total = total
+        this.loading.close()
+      } catch (error) {
+        this.loading.close()
+      }
     },
 
     handleERData(data) {
@@ -230,12 +240,36 @@ export default {
       return tableData
     },
 
+    handleSelectSubject(val) {
+      const data = this.entityList.find((item) => {
+        return item.id == val
+      })
+      this.form.subjectCategory = data.category
+    },
+
+    handleSelectObject(val) {
+      const data = this.entityList.find((item) => {
+        return item.id == val
+      })
+      this.form.objectCategory = data.category
+    },
+
     async getAllRelationClassAPI(params) {
       try {
         const {
           data: { dataList }
         } = await getAllRelationClass()
         this.relationList = dataList
+        this.loading.close()
+      } catch (error) {}
+    },
+
+    async getEntityListAPI() {
+      try {
+        const {
+          data: { dataList }
+        } = await getEntityList()
+        this.entityList = dataList
       } catch (error) {}
     },
 
@@ -255,21 +289,22 @@ export default {
     },
 
     async addRelationAPI() {
-      try {
-        const addData = {
-          node_name: this.form.name,
-          node_label: this.form.category
-        }
-        const { code } = await addRelation(addData)
-        if (code === 200) {
-          this.$message({
-            type: 'success',
-            message: '操作成功!'
-          })
-          this.handleClose()
-          this.getRelationAPI()
-        }
-      } catch (error) {}
+      // try {
+      const addData = {
+        head_node_id: this.form.subjectId,
+        tail_node_id: this.form.objectId,
+        new_relation_name: this.form.relationName
+      }
+      // const { code } = await addRelation(addData)
+      // if (code === 200) {
+      this.$message({
+        type: 'success',
+        message: '操作成功!'
+      })
+      this.handleClose()
+      this.getRelationAPI()
+      // }
+      // } catch (error) {}
     },
 
     async updateRelationAPI() {
@@ -279,7 +314,6 @@ export default {
           tail_node_id: this.form.objectId,
           new_relation_name: this.form.relationName
         }
-        console.log('updateData', updateData)
         const { code } = await updateRelation(updateData)
         if (code === 200) {
           this.$message({

+ 32 - 14
src/views/als/knowledgeManage/entityManage/index.vue

@@ -13,10 +13,10 @@
         </div>
       </div>
       <div class="view-dataType-table">
-        <LTable ref="table" @selection-change="selection" :defaultFetch="false" :fetch="fetch" :columns="columns" :dataSource="tableData" :options="options"></LTable>
+        <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-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="600px" :before-close="handleClose" :rules="rules">
         <el-form ref="form" :model="form" label-width="80px">
           <el-form-item label="实体名称" prop="name">
             <el-input v-model="form.name" placeholder="请输入实体名称" />
@@ -51,6 +51,10 @@ export default {
       dialogVisible: false,
       keyWordData: '',
       searchValue: '',
+      rules: {
+        name: [{ required: true, message: '实体名称不能为空', trigger: 'blur' }],
+        category: [{ required: true, message: '实体类型不能为空', trigger: 'change' }]
+      },
       columns: [
         {
           prop: 'name',
@@ -87,7 +91,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -100,7 +104,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
@@ -146,12 +150,21 @@ export default {
     async getEntityAPI(params) {
       try {
         if (this.$refs.table) this.$refs.table.clearSelection()
+        const { pageSize, pageIndex } = this.tableRequset
+        this.loading = this.$loading({
+          lock: true,
+          text: '正在获取知识图谱实体数据,请稍候...',
+          spinner: 'el-icon-loading'
+        })
         const {
           data: { dataList, total }
-        } = await getEntityList()
+        } = await getEntityList({ pageSize, pageNum: pageIndex, ...params })
         this.tableData = dataList
         this.tableRequset.total = total
-      } catch (error) {}
+        this.loading.close()
+      } catch (error) {
+        this.loading.close()
+      }
     },
 
     async getEntityClassAPI(params) {
@@ -160,6 +173,7 @@ export default {
           data: { dataList }
         } = await getAllEntityClass()
         this.categoryList = dataList
+        this.loading.close()
       } catch (error) {}
     },
 
@@ -236,14 +250,18 @@ export default {
     },
 
     submit() {
-      switch (this.dialogTitle) {
-        case '编辑':
-          this.updateEntityAPI()
-          break
-        case '新增':
-          this.addEntityAPI()
-          break
-      }
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          switch (this.dialogTitle) {
+            case '编辑':
+              this.updateEntityAPI()
+              break
+            case '新增':
+              this.addEntityAPI()
+              break
+          }
+        }
+      })
     },
 
     selection(val) {

+ 78 - 29
src/views/als/lifePrediction/index.vue

@@ -12,8 +12,8 @@
           </div>
         </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.type == 2)"></el-button>
+          <el-input placeholder="请输入部件名称" v-model="keyWordData" class="input1">
+            <el-button slot="append" icon="el-icon-search" @click="searchClick"></el-button>
           </el-input>
         </div>
       </div>
@@ -29,11 +29,33 @@
             </el-select>
           </el-form-item>
           <el-form-item label="架次号" prop="sortieNo">
-            <LTable ref="sortieNoTableRef" :defaultFetch="false" :fetch="sortieNoFetch" @selection-change="sortieNoSelection" class="single-select-table" :columns="sortieNoColumns" :dataSource="sortieNoList" :options="sortieNoOptions"></LTable>
+            <LTable
+              ref="sortieNoTableRef"
+              :defaultFetch="false"
+              :fetch="sortieNoFetch"
+              :showColumnSetting="false"
+              @selection-change="sortieNoSelection"
+              class="single-select-table"
+              :columns="sortieNoColumns"
+              :dataSource="sortieNoList"
+              :options="sortieNoOptions"
+            ></LTable>
           </el-form-item>
           <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,10 +63,10 @@
           <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">
+      <el-dialog title="结果展示" :visible.sync="resultVisible" width="50%" :before-close="resultShowDialogClose" style="text-align: center">
         <el-image style="width: 500px" :src="resultShowData.url" :preview-src-list="[resultShowData.url]"></el-image>
         <span slot="footer" class="dialog-footer">
           <el-button @click="resultShowDialogClose">取 消</el-button>
@@ -122,18 +144,33 @@ export default {
           prop: 'code',
           label: '部件编码'
         },
+        {
+          prop: 'timeRange',
+          label: '时间区间'
+        },
+        {
+          prop: 'sortiesCount',
+          label: '架次数量'
+        },
         {
           prop: 'createTime',
           label: '创建时间'
         },
         {
           prop: 'status',
-          label: '状态'
+          label: '状态',
+          render: (h, params) => {
+            if (params.row.status == 0) {
+              return h('span', { class: 'warning-state' }, '失败')
+            } else {
+              return h('span', { class: 'success-state' }, '成功')
+            }
+          }
         },
         {
           button: true,
           label: '操作',
-          width: '240px',
+          width: '200px',
           group: [
             {
               name: '查看结果',
@@ -157,7 +194,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -170,7 +207,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       sortieNoColumns: [
@@ -195,7 +232,7 @@ export default {
         }
       ],
       sortieNoOptions: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: true, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -216,17 +253,14 @@ export default {
         methodType: '',
         status: '',
         resultContent: '',
-        ossIds: []
+        ossIds: [],
+        timeRange: '',
+        sortiesCount: ''
       },
       debounceFn: debounce(this.fetch, 500),
       aircaftCatalogAll: [],
       percentage: 0,
       partsData: [],
-      // executeForm: {
-      //   sortieNo: '',
-      //   aircraftId: '',
-      //   partId: ''
-      // },
       rules: {
         aircraftId: [{ required: true, message: '编目不能为空', trigger: 'change' }],
         partId: [{ required: true, message: '部件不能为空', trigger: 'change' }]
@@ -234,7 +268,8 @@ export default {
       resultUrl: '',
       resultShowData: {
         url: ''
-      }
+      },
+      timeValue: ''
     }
   },
   watch: {
@@ -357,6 +392,8 @@ export default {
 
     partIdSelect(node) {
       this.form.partId = node.id
+      this.form.model = node.specsModel
+      this.form.code = node.conCode
     },
 
     async getAirConfigurationAPI(params) {
@@ -380,7 +417,9 @@ export default {
         methodType: '',
         status: '',
         resultContent: '',
-        ossIds: []
+        ossIds: [],
+        timeRange: '',
+        sortiesCount: ''
       }
     },
 
@@ -391,9 +430,9 @@ export default {
       }
     },
 
-    checkResult(row) {
-      // this.form = deepClone(row)
-      this.resultShowData.url = this.getImgUrl(JSON.parse(row.resultContent).ossId)
+    async checkResult(row) {
+      const { data } = await getListByIdsApi(JSON.parse(row.resultContent).ossId)
+      this.resultShowData.url = data[0].url
       this.resultVisible = true
     },
     async beginExecute() {
@@ -402,11 +441,26 @@ export default {
       })
       if (this.sortieNoCheckItems.length == 0) {
         this.$message({
-          type: 'success',
+          type: 'warning',
           message: '请选择架次号!'
         })
         return
       }
+      if (this.sortieNoCheckItems.length == 1) {
+        this.form.timeRange = this.sortieNoCheckItems[0].flightDate
+      } else {
+        let minDate = this.sortieNoCheckItems[0].flightDate
+        let maxDate = this.sortieNoCheckItems[0].flightDate
+        for (let i = 1; i < this.sortieNoCheckItems.length; i++) {
+          let currentDate = this.sortieNoCheckItems[i].flightDate
+          if (currentDate < minDate) {
+            minDate = currentDate
+          } else if (currentDate > maxDate) {
+            maxDate = currentDate
+          }
+        }
+        this.form.timeRange = `${minDate} 至 ${maxDate}`
+      }
       this.progressVisible = true
 
       let myTimer = setInterval(() => {
@@ -429,8 +483,8 @@ export default {
             type: 'success',
             message: '执行成功!'
           })
-          this.resultShowData.url = this.getImgUrl(JSON.parse(res.data.data).ossId)
-
+          const { data } = await getListByIdsApi(JSON.parse(res.data).ossId)
+          this.resultShowData.url = data[0].url
           this.resultVisible = true
           this.getLifePredictionAPI({ aircraftId: this.aircaftModelIdList })
         }
@@ -442,11 +496,6 @@ export default {
       }
     },
 
-    async getImgUrl(ossId) {
-      const url = await getListByIdsApi(ossId)
-      return url
-    },
-
     normalizer(node) {
       if (node.children && !node.children.length) {
         delete node.children

+ 2 - 2
src/views/als/lifePredictionResult/index.vue

@@ -141,7 +141,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -154,7 +154,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 8 - 10
src/views/als/lifetimeSpareParts/index.vue

@@ -7,7 +7,8 @@
     <div class="view-dataSpecies-right">
       <div class="view-dataType-title">
         <div class="view-dataType-title-btn">
-          <el-button type="success" @click="openDialog()" :disabled="currentConfigNodeKey === ''">新增</el-button>
+          <!-- <el-button type="success" @click="openDialog()" :disabled="currentConfigNodeKey === ''">新增</el-button> -->
+          <el-button type="success" @click="openDialog()" :disabled="!(currentNode.type == 2) || currentConfigNodeKey == ''">新增</el-button>
           <el-button type="warning" @click="remove(tableCheckItems)" :disabled="tableCheckItems.length == 0">删除</el-button>
           <el-dropdown split-button type="primary" style="margin-left: 10px" trigger="click" @command="handleExport">
             更多
@@ -55,9 +56,9 @@
             <el-input v-model="form.componentNum" placeholder="请输入部件编码" />
           </el-form-item>
           <el-form-item label="出厂日期" prop="factoryDate">
-            <el-date-picker clearable v-model="form.factoryDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择出厂日期"></el-date-picker>
+            <el-date-picker placement="bottom-start" clearable v-model="form.factoryDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择出厂日期"></el-date-picker>
           </el-form-item>
-          <el-form-item label="当前安装飞机" prop="currentInstallAircraft">
+          <el-form-item label="当前安装飞机" label-width="110px" prop="currentInstallAircraft">
             <el-input v-model="form.currentInstallAircraft" placeholder="请输入当前安装飞机" />
           </el-form-item>
           <el-form-item label="工作时次" prop="workTime">
@@ -227,7 +228,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -241,7 +242,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       avmatTableRequset: {
@@ -363,7 +364,7 @@ export default {
       const { keyWord } = this
       const { pageSize, pageIndex } = this.tableRequset
       const {
-        data: { list, totalCount }
+        data: { list, total }
       } = await getLifetimeSpareParts({ pageSize, pageNum: pageIndex, keyWord, ...params })
       this.tableData = list
       this.tableRequset.total = total
@@ -418,7 +419,7 @@ export default {
       // this.$refs.table.clearSelection()
       this.currentAirId = this.form.airId = data.id
       this.currentAirModelId = this.form.airModelId = data.parentId
-      // this.currentNode = data
+      this.currentNode = data
       // this.form.aircraftType = data.label
       // this.getAirInstallAPI(this.currentNodeKey)
       let dataTree = []
@@ -435,9 +436,6 @@ export default {
       // topNode.children = data1
       topNode.children = handleTree(dataTree, 'id')
       this.configTreeData.push(topNode)
-      console.log(this.aircaftModelAll)
-      console.log(this.aircaftCatalogAll)
-      console.log(this.configAll)
     },
 
     treeConfigNodeClick(data) {

+ 2 - 2
src/views/als/maintainRecord/index.vue

@@ -283,7 +283,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -296,7 +296,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/maintenance/index.vue

@@ -221,7 +221,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -234,7 +234,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/maintenanceDecision/index.vue

@@ -202,7 +202,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -215,7 +215,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/maintenanceRecord/index.vue

@@ -317,7 +317,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -330,7 +330,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/maintenanceask/index.vue

@@ -201,7 +201,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -214,7 +214,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/maintenanceask/viewDetails.vue

@@ -242,13 +242,13 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       tableRequset2: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       tableData2: [],

+ 74 - 12
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-if="['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,7 +137,7 @@ export default {
         },
         {
           prop: 'param',
-          label: '参数'
+          label: '模型参数'
         },
         {
           prop: 'columnData',
@@ -166,7 +185,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -179,7 +198,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
@@ -187,6 +206,7 @@ export default {
         name: '',
         type: '',
         url: '',
+        paramType: null,
         aircraftType: null,
         partId: null,
         param: '',
@@ -202,9 +222,13 @@ 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' }],
+        columnData: [{ required: true, message: '数据列不能为空', trigger: 'blur' }],
         partId: [{ required: true, message: '部件不能为空', trigger: 'change' }]
-      }
+      },
+      paramTypeData: [],
+      aircaftModelAll: []
     }
   },
   watch: {
@@ -214,10 +238,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 +319,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 +376,7 @@ export default {
         name: '',
         type: '',
         url: '',
+        paramType: null,
         aircraftType: null,
         partId: null,
         param: '',
@@ -353,7 +389,6 @@ export default {
     handUpdate(row) {
       this.dialogTitle = '编辑'
       this.form = deepClone(row)
-      console.log('this.form', this.form)
       if (['5', '6'].includes(this.form.type)) {
         const item = this.allAirConfig.find((item) => item.id === this.form.partId)
         this.form.aircraftType = item.aircraftType
@@ -364,10 +399,37 @@ export default {
     },
 
     submit() {
+      const isExist = this.paramTypeData.find((item) => {
+        return item.dictLabel === this.form.paramType
+      })
+      if (this.form.paramType && !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()

+ 2 - 2
src/views/als/partReplacement/index.vue

@@ -168,7 +168,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -181,7 +181,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 4 - 4
src/views/als/preProcessing/index.vue

@@ -46,7 +46,7 @@
           </el-row>
 
           <el-form-item label="架次号" prop="sortieNo">
-            <LTable ref="sortieNoTableRef" @current-change="sortieNoSelection" class="single-select-table" :columns="sortieNoColumns" :dataSource="sortieNoList" :options="sortieNoOptions" :pagination="SortieNoTableRequset"></LTable>
+            <LTable ref="sortieNoTableRef" @current-change="sortieNoSelection" class="single-select-table" :showColumnSetting="false" :columns="sortieNoColumns" :dataSource="sortieNoList" :options="sortieNoOptions" :pagination="SortieNoTableRequset"></LTable>
           </el-form-item>
 
           <el-form-item label="参数" prop="param">
@@ -236,7 +236,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -245,7 +245,7 @@ export default {
         height: 'calc(100vh - 300px)'
       },
       sortieNoOptions: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: false, // 多选框
         index: true, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -264,7 +264,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/preProcessing/preResult.vue

@@ -113,7 +113,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -135,7 +135,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/product/index.vue

@@ -127,7 +127,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -140,7 +140,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 1 - 1
src/views/als/safeRule/index.vue

@@ -131,7 +131,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 1 - 1
src/views/als/safeRuleSub/index.vue

@@ -159,7 +159,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 6 - 3
src/views/als/smTask/SMTaskDetails.vue

@@ -114,7 +114,7 @@ import { deepClone, debounce } from '@/utils/index'
 import { flattenTree } from '../utils/common'
 
 export default {
-  name: 'SMTaskDetails',
+  name: 'SmTask',
   components: {},
   data() {
     // 这里存放数据
@@ -242,13 +242,13 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       tableRequset2: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       tableData2: [],
@@ -577,4 +577,7 @@ export default {
     background-color: transparent !important;
   }
 }
+::-webkit-scrollbar {
+  display: none;
+}
 </style>

+ 5 - 3
src/views/als/smTask/index.vue

@@ -222,7 +222,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -235,7 +235,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {
@@ -440,8 +440,10 @@ export default {
 
     checkDetails(row) {
       // this.$router.push({ name: 'SMTaskDetails', params: { smTaskId: row.id } })
+      // name: 'SMTaskDetails',
+      // this.$router.push(`/dataManage/SMTaskDetails/${row.id}`)
       this.$router.push({
-        name: 'SMTaskDetails',
+        path: '/dataManage/SMTaskDetails',
         query: {
           smTaskId: row.id
         }

+ 1 - 1
src/views/als/smaskRecord/index.vue

@@ -164,7 +164,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 1 - 1
src/views/als/smaskSub/index.vue

@@ -199,7 +199,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 1 - 1
src/views/als/sortie/index.vue

@@ -146,7 +146,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 1 - 1
src/views/als/spareParts/index.vue

@@ -145,7 +145,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 1 - 1
src/views/als/systemCommunication/index.vue

@@ -187,7 +187,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 1 - 1
src/views/als/task/index.vue

@@ -171,7 +171,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/technicalDoc/index.vue

@@ -125,7 +125,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -138,7 +138,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/trainingData/index.vue

@@ -147,7 +147,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -160,7 +160,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/als/warning/index.vue

@@ -153,7 +153,7 @@ export default {
         }
       ],
       options: {
-        stripe: true, // 斑马纹
+        stripe: false, // 斑马纹
         mutiSelect: true, // 多选框
         index: false, // 显示序号, 多选则 mutiSelect
         loading: false, // 表格动画
@@ -166,7 +166,7 @@ export default {
       tableRequset: {
         total: 0,
         pageIndex: 1,
-        pageSize: 10,
+        pageSize: 20,
         searchValue: ''
       },
       form: {

+ 2 - 2
src/views/basicData/dataAircraftCataloging/index.js

@@ -11,7 +11,7 @@ export const columns = (_this) => [
   },
   {
     prop: 'mechanician',
-    label: '驾驶员'
+    label: '机械师'
   },
 
   {
@@ -48,7 +48,7 @@ export const columns = (_this) => [
     prop: 'status',
     label: '状态',
     render: (h, params) => {
-      if (params.row.status == 1) {
+      if (params.row.status == 0) {
         return h('span', { class: 'success-state' }, '服役')
       } else {
         return h('span', { class: 'warning-state' }, '退役')

+ 31 - 16
src/views/basicData/dataAircraftCataloging/index.vue

@@ -27,11 +27,11 @@
         <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="飞机编号">
+        <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+          <el-form-item label="飞机编号" prop="aircaftCatalogCode">
             <el-input v-model="form.aircaftCatalogCode"></el-input>
           </el-form-item>
-          <el-form-item label="驾驶员">
+          <el-form-item label="机械师">
             <el-input v-model="form.mechanician"></el-input>
           </el-form-item>
           <el-form-item label="所属机型">
@@ -52,7 +52,7 @@
           <el-form-item label="生产厂家">
             <el-input v-model="form.manufacturer"></el-input>
           </el-form-item>
-          <el-form-item label="生编号">
+          <el-form-item label="生编号">
             <el-input v-model="form.factoryNumber"></el-input>
           </el-form-item>
           <el-form-item label="状态">
@@ -125,6 +125,15 @@ export default {
         factoryNumber: '',
         status: ''
       },
+      rules: {
+        aircaftCatalogCode: [
+          {
+            required: true,
+            message: '请输入飞机编号',
+            trigger: 'blur'
+          }
+        ]
+      },
       debounceFn: debounce(this.fetch, 500)
     }
   },
@@ -184,10 +193,10 @@ export default {
       const { keyWord } = this
       const { pageSize, pageIndex } = this.tableRequset
       const {
-        data: { list, total }
+        data: { list, totalCount }
       } = await getAircaftCatalog({ pageSize, pageIndex, keyWord, ...params })
       this.tableData = list
-      this.tableRequset.total = total
+      this.tableRequset.total = totalCount
     },
 
     fetch() {
@@ -265,16 +274,22 @@ export default {
     },
 
     submit() {
-      switch (this.dialogTitle) {
-        case '编辑':
-          this.updateAircaftCatalogAPI()
-          this.handleClose()
-          break
-        case '新增':
-          this.addAircaftCatalogAPI()
-          this.handleClose()
-          break
-      }
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          switch (this.dialogTitle) {
+            case '编辑':
+              this.updateAircaftCatalogAPI()
+              this.handleClose()
+              break
+            case '新增':
+              this.addAircaftCatalogAPI()
+              this.handleClose()
+              break
+          }
+        } else {
+          return false
+        }
+      })
     },
 
     selection(val) {

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác