From 7076e54c4fbb2857e57f9b59f9e71a712d83eccd Mon Sep 17 00:00:00 2001 From: xiangcongshuai <xiangcongshuai@supervision.ltd> Date: Tue, 22 Oct 2024 15:02:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:ocr2.0=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 + pnpm-lock.yaml | 372 +++++++- src/api/caseDetails/evidence.js | 68 ++ src/api/caseDetails/ocr.js | 1 - src/api/promptManagement/index.js | 33 +- src/assets/caseManagement/empty.png | Bin 0 -> 45158 bytes src/assets/common/file_empty.png | Bin 0 -> 45158 bytes src/assets/file/check.png | Bin 0 -> 694 bytes src/assets/file/type1.png | Bin 0 -> 2279 bytes src/assets/file/type2.png | Bin 0 -> 3542 bytes src/assets/file/type3.png | Bin 0 -> 3273 bytes src/assets/file/type4.png | Bin 0 -> 2970 bytes src/assets/file/type5.png | Bin 0 -> 3370 bytes src/assets/file/type6.png | Bin 0 -> 3028 bytes src/components/Search/index.vue | 2 +- src/config/net.config.js | 2 +- src/icons/svg/docx.svg | 7 + src/router/index.js | 64 +- .../components/AddEvidence/AddFolder.vue | 126 ++- .../components/AddEvidence/MoveFolder.vue | 99 +++ .../components/EvidenceConfirm.vue | 526 +++++++++++ .../components/EvidenceExtract.vue | 216 +++++ .../AddEvidence/components/UploadEvidence.vue | 516 +++++++++++ .../components/AddEvidence/edit.vue | 162 ++++ .../components/AddEvidence/index.vue | 376 ++------ .../caseDetails/components/CaseEvidence.vue | 117 ++- .../components/EditEvidence/index.vue | 681 +++++++------- .../components/edit/EditEvidence.vue | 1 - src/views/caseDetails/index.vue | 73 +- .../PromptConfig/add/PromptDebug.vue | 182 ++++ .../PromptConfig/add/PromptInput.vue | 831 ++++++++++++++++++ .../PromptConfig/add/SelectImg.vue | 90 ++ .../PromptConfig/add/index.vue | 434 ++++++++- .../promptManagement/PromptConfig/index.vue | 53 +- .../atomicIndex/components/EditAtomic.vue | 220 +++-- .../atomicIndex/components/SelectSql.vue | 102 ++- .../indexRule/components/CustomLogic.vue | 106 ++- 37 files changed, 4564 insertions(+), 899 deletions(-) create mode 100644 src/api/caseDetails/evidence.js create mode 100644 src/assets/caseManagement/empty.png create mode 100644 src/assets/common/file_empty.png create mode 100644 src/assets/file/check.png create mode 100644 src/assets/file/type1.png create mode 100644 src/assets/file/type2.png create mode 100644 src/assets/file/type3.png create mode 100644 src/assets/file/type4.png create mode 100644 src/assets/file/type5.png create mode 100644 src/assets/file/type6.png create mode 100644 src/icons/svg/docx.svg create mode 100644 src/views/caseDetails/components/AddEvidence/MoveFolder.vue create mode 100644 src/views/caseDetails/components/AddEvidence/components/EvidenceConfirm.vue create mode 100644 src/views/caseDetails/components/AddEvidence/components/EvidenceExtract.vue create mode 100644 src/views/caseDetails/components/AddEvidence/components/UploadEvidence.vue create mode 100644 src/views/caseDetails/components/AddEvidence/edit.vue create mode 100644 src/views/promptManagement/PromptConfig/add/PromptDebug.vue create mode 100644 src/views/promptManagement/PromptConfig/add/PromptInput.vue create mode 100644 src/views/promptManagement/PromptConfig/add/SelectImg.vue diff --git a/package.json b/package.json index 32d6796..f741e54 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,9 @@ "dependencies": { "@riophae/vue-treeselect": "0.4.0", "@vue/composition-api": "1.7.1", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^1.0.2", + "@wangeditor/plugin-mention": "^1.0.0", "axios": "1.6.0", "core-js": "3.30.1", "countup.js": "^2.8.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c6846d..695ce6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,15 @@ dependencies: '@vue/composition-api': specifier: 1.7.1 version: 1.7.1(vue@2.6.14) + '@wangeditor/editor': + specifier: ^5.1.23 + version: 5.1.23 + '@wangeditor/editor-for-vue': + specifier: ^1.0.2 + version: 1.0.2(@wangeditor/editor@5.1.23)(vue@2.6.14) + '@wangeditor/plugin-mention': + specifier: ^1.0.0 + version: 1.0.0(@wangeditor/editor@5.1.23)(snabbdom@3.6.2) axios: specifier: 1.6.0 version: 1.6.0 @@ -1674,6 +1683,10 @@ packages: resolution: {integrity: sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==} dev: true + /@transloadit/prettier-bytes@0.0.7: + resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==} + dev: false + /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -1721,6 +1734,10 @@ packages: /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + /@types/event-emitter@0.3.5: + resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==} + dev: false + /@types/express-serve-static-core@4.19.5: resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} dependencies: @@ -1863,6 +1880,47 @@ packages: '@types/node': 20.14.10 dev: true + /@uppy/companion-client@2.2.2: + resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==} + dependencies: + '@uppy/utils': 4.1.3 + namespace-emitter: 2.0.1 + dev: false + + /@uppy/core@2.3.4: + resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==} + dependencies: + '@transloadit/prettier-bytes': 0.0.7 + '@uppy/store-default': 2.1.1 + '@uppy/utils': 4.1.3 + lodash.throttle: 4.1.1 + mime-match: 1.0.2 + namespace-emitter: 2.0.1 + nanoid: 3.3.7 + preact: 10.24.3 + dev: false + + /@uppy/store-default@2.1.1: + resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==} + dev: false + + /@uppy/utils@4.1.3: + resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==} + dependencies: + lodash.throttle: 4.1.1 + dev: false + + /@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4): + resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==} + peerDependencies: + '@uppy/core': ^2.3.3 + dependencies: + '@uppy/companion-client': 2.2.2 + '@uppy/core': 2.3.4 + '@uppy/utils': 4.1.3 + nanoid: 3.3.7 + dev: false + /@vue/babel-helper-vue-jsx-merge-props@1.4.0: resolution: {integrity: sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==} dev: true @@ -2440,6 +2498,202 @@ packages: resolution: {integrity: sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==} dev: true + /@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2): + resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + is-url: 1.2.4 + lodash.throttle: 4.1.1 + nanoid: 3.3.7 + slate: 0.72.8 + snabbdom: 3.6.2 + dev: false + + /@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2): + resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + prismjs: 1.29.0 + slate: 0.72.8 + snabbdom: 3.6.2 + dev: false + + /@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2): + resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==} + peerDependencies: + '@uppy/core': ^2.1.1 + '@uppy/xhr-upload': ^2.0.3 + dom7: ^3.0.0 + is-hotkey: ^0.2.0 + lodash.camelcase: ^4.3.0 + lodash.clonedeep: ^4.5.0 + lodash.debounce: ^4.0.8 + lodash.foreach: ^4.5.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + lodash.toarray: ^4.4.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@types/event-emitter': 0.3.5 + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + dom7: 3.0.0 + event-emitter: 0.3.5 + html-void-elements: 2.0.1 + i18next: 20.6.1 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.7 + scroll-into-view-if-needed: 2.2.31 + slate: 0.72.8 + slate-history: 0.66.0(slate@0.72.8) + snabbdom: 3.6.2 + dev: false + + /@wangeditor/editor-for-vue@1.0.2(@wangeditor/editor@5.1.23)(vue@2.6.14): + resolution: {integrity: sha512-BOENvAXJVtVXlE2X50AAvjV82YlCUeu5cbeR0cvEQHQjYtiVnJtq7HSoj85r2kTgGouI5OrpJG9BBEjSjUSPyA==} + peerDependencies: + '@wangeditor/editor': '>=5.1.0' + vue: ^2.6.14 + dependencies: + '@wangeditor/editor': 5.1.23 + vue: 2.6.14 + dev: false + + /@wangeditor/editor@5.1.23: + resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==} + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.7 + slate: 0.72.8 + snabbdom: 3.6.2 + dev: false + + /@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2): + resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + slate: 0.72.8 + snabbdom: 3.6.2 + dev: false + + /@wangeditor/plugin-mention@1.0.0(@wangeditor/editor@5.1.23)(snabbdom@3.6.2): + resolution: {integrity: sha512-txQEoHxzil78WoTGXn0ENONZ2sdEL8GI5qBxETn6TMEXQkqiUXA4Kc8bV8D8nZDniC00oFb80kDmOIpT/KUBGw==} + peerDependencies: + '@wangeditor/editor': '>=5.0.0' + snabbdom: ^3.3.1 + dependencies: + '@wangeditor/editor': 5.1.23 + snabbdom: 3.6.2 + dev: false + + /@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2): + resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + nanoid: 3.3.7 + slate: 0.72.8 + snabbdom: 3.6.2 + dev: false + + /@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2): + resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==} + peerDependencies: + '@uppy/core': ^2.0.3 + '@uppy/xhr-upload': ^2.0.3 + '@wangeditor/basic-modules': 1.x + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.foreach: ^4.5.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + lodash.foreach: 4.5.0 + slate: 0.72.8 + snabbdom: 3.6.2 + dev: false + + /@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2): + resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==} + peerDependencies: + '@uppy/core': ^2.1.4 + '@uppy/xhr-upload': ^2.0.7 + '@wangeditor/core': 1.x + dom7: ^3.0.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + nanoid: 3.3.7 + slate: 0.72.8 + snabbdom: 3.6.2 + dev: false + /@webassemblyjs/ast@1.12.1: resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: @@ -3827,6 +4081,10 @@ packages: - supports-color dev: true + /compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + dev: false + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -4699,6 +4957,12 @@ packages: entities: 2.2.0 dev: true + /dom7@3.0.0: + resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==} + dependencies: + ssr-window: 3.0.0 + dev: false + /domain-browser@4.23.0: resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} engines: {node: '>=10'} @@ -6445,6 +6709,10 @@ packages: engines: {node: '>=8'} dev: true + /html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + dev: false + /html-webpack-plugin@5.6.0(webpack@5.93.0): resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} engines: {node: '>=10.13.0'} @@ -6575,6 +6843,12 @@ packages: requiresBuild: true dev: true + /i18next@20.6.1: + resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==} + dependencies: + '@babel/runtime': 7.24.8 + dev: false + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -6710,6 +6984,10 @@ packages: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} dev: false + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + /immutable@4.3.6: resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} dev: true @@ -6995,6 +7273,10 @@ packages: is-extglob: 2.1.1 dev: true + /is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + dev: false + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -7067,6 +7349,11 @@ packages: dependencies: isobject: 3.0.1 + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false + /is-png@2.0.0: resolution: {integrity: sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==} engines: {node: '>=8'} @@ -7145,6 +7432,10 @@ packages: engines: {node: '>=10'} dev: true + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: false + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -7431,9 +7722,16 @@ packages: dependencies: p-locate: 4.1.0 + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: true /lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -7455,6 +7753,10 @@ packages: resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} dev: false + /lodash.foreach@4.5.0: + resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==} + dev: false + /lodash.groupby@4.6.0: resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} dev: false @@ -7495,6 +7797,14 @@ packages: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: false + + /lodash.toarray@4.4.0: + resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==} + dev: false + /lodash.union@4.6.0: resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} dev: false @@ -7711,6 +8021,12 @@ packages: engines: {node: '>= 0.6'} dev: true + /mime-match@1.0.2: + resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==} + dependencies: + wildcard: 1.1.2 + dev: false + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -7854,11 +8170,14 @@ packages: thenify-all: 1.6.0 dev: true + /namespace-emitter@2.0.1: + resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==} + dev: false + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true /nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} @@ -8968,6 +9287,10 @@ packages: posthtml-render: 1.4.0 dev: true + /preact@10.24.3: + resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + dev: false + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -9007,6 +9330,11 @@ packages: engines: {node: '>=4'} dev: true + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: false + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -9582,6 +9910,12 @@ packages: engines: {node: ^14.13.1 || >=16.0.0} dev: false + /scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + dependencies: + compute-scroll-into-view: 1.0.20 + dev: false + /seek-bzip@1.0.6: resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} hasBin: true @@ -9798,6 +10132,23 @@ packages: engines: {node: '>=8'} dev: true + /slate-history@0.66.0(slate@0.72.8): + resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==} + peerDependencies: + slate: '>=0.65.3' + dependencies: + is-plain-object: 5.0.0 + slate: 0.72.8 + dev: false + + /slate@0.72.8: + resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==} + dependencies: + immer: 9.0.21 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + dev: false + /slice-ansi@2.1.0: resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} engines: {node: '>=6'} @@ -9807,6 +10158,11 @@ packages: is-fullwidth-code-point: 2.0.0 dev: true + /snabbdom@3.6.2: + resolution: {integrity: sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==} + engines: {node: '>=12.17.0'} + dev: false + /snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} @@ -9980,6 +10336,10 @@ packages: frac: 1.1.2 dev: false + /ssr-window@3.0.0: + resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==} + dev: false + /ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} @@ -10450,6 +10810,10 @@ packages: setimmediate: 1.0.5 dev: false + /tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + dev: false + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -11419,6 +11783,10 @@ packages: dependencies: isexe: 2.0.0 + /wildcard@1.1.2: + resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==} + dev: false + /wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} diff --git a/src/api/caseDetails/evidence.js b/src/api/caseDetails/evidence.js new file mode 100644 index 0000000..7a7814f --- /dev/null +++ b/src/api/caseDetails/evidence.js @@ -0,0 +1,68 @@ +import request from '@/utils/request' + +/** 案件证据分类树 */ +export function getCaseEvidenceTree(data) { + return request({ + url: `/caseEvidence/category/tree`, + method: 'get', + params: data + }) +} +/** 案件证据文件目录树 */ +export function getCaseEvidenceFileTree(data) { + return request({ + url: `/caseEvidence/directory/tree`, + method: 'get', + params: data + }) +} + +/** 创建目录 */ +export function createDirectory(data) { + return request({ + url: `/caseEvidence/directory/save`, + method: 'post', + data + }) +} + +/** 证据识别并提取 */ +export function ocrAndExtract(data) { + return request({ + url: `/caseEvidence/ocrAndExtract`, + method: 'post', + data + }) +} +/** 案件证据文件目录树 */ +export function getCaseEvidenceDirectoryList(data) { + return request({ + url: `/caseEvidence/directory/ls`, + method: 'get', + params: data + }) +} +/** 识别并提取列表 */ +export function ocrAndExtractList(data) { + return request({ + url: `/caseEvidence/ocrAndExtract/list`, + method: 'get', + params: data + }) +} +/** 查询证据详情-结果以树的方式展示 */ +export function ocrAndExtractDetails(data) { + return request({ + url: `/caseEvidence/ocrAndExtract/details`, + method: 'get', + params: data + }) +} +/** 核实证据 */ +export function caseEvidenceVerify(data) { + return request({ + url: `/caseEvidence/verify`, + method: 'post', + data + }) +} \ No newline at end of file diff --git a/src/api/caseDetails/ocr.js b/src/api/caseDetails/ocr.js index e72a4fd..43b3f1d 100644 --- a/src/api/caseDetails/ocr.js +++ b/src/api/caseDetails/ocr.js @@ -1,5 +1,4 @@ import request from '@/utils/request' -import routes from '../gateway-routes' /** 获取笔录基本信息 */ export function getRocordInfo(data) { diff --git a/src/api/promptManagement/index.js b/src/api/promptManagement/index.js index e98dc02..1a0ae07 100644 --- a/src/api/promptManagement/index.js +++ b/src/api/promptManagement/index.js @@ -24,13 +24,13 @@ export function saveChunkClassify(data) { }) } /** 保存提示词 */ -export function addOrUpdPrompt(data) { - return request({ - url: `${routes.record}/addOrUpdPrompt`, - method: 'post', - data - }) -} +// export function addOrUpdPrompt(data) { +// return request({ +// url: `${routes.record}/addOrUpdPrompt`, +// method: 'post', +// data +// }) +// } /** 删除提示词 */ export function delPrompt(data) { return request({ @@ -54,4 +54,21 @@ export function queryResult(data) { method: 'get', params: data }) -} \ No newline at end of file +} +/** 提示词列表分页查询 */ +export function queryPromptList(data) { + return request({ + url: `/prompt/list`, + method: 'post', + data + }) +} + +/** 添加或更新 */ +export function addOrUpdPrompt(data) { + return request({ + url: `/record/addOrUpdPrompt`, + method: 'post', + data + }) +} diff --git a/src/assets/caseManagement/empty.png b/src/assets/caseManagement/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd23b956a57b39e6781ef9276589a81e295f355 GIT binary patch literal 45158 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	q*`)I zXsg}3rHcog1PJ>WMwas(u!T&xyf(7iRH(RRcracBbIT6+-j28(evu^VgKnc1l#_tF zjUW8+??Qo!7}us7g<AmtFM+XpG0T40mH!#(-Xn`%9pJoNr=i&XU+ygH9188o=ETE1 z%SFtT0lZI1IWA5VEDHiE0vev8J{Q8l#)uIq366gPT7bv!zoO$4s2VIoU1h-ks$wWn zD*mrHD-FW6e9=&z{B-*9pA{gH|H<+{vFbmNq>lQmPb2?lh0Ead-y~0>>5Hf2;Fzt^ z{%?{eRU*at|CtXXvV-&qqG6R);s4+vdQz+VUuZ<Z98X9aOb3<!7uu7W9p?XuhEGTx uI}s`W=f#sl&;C#R{~daY<NsGH^hh8Uu35YI#V-`?=~0qXm#vUC4f%hK`1aZW literal 0 HcmV?d00001 diff --git a/src/assets/common/file_empty.png b/src/assets/common/file_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd23b956a57b39e6781ef9276589a81e295f355 GIT binary patch literal 45158 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	q*`)I zXsg}3rHcog1PJ>WMwas(u!T&xyf(7iRH(RRcracBbIT6+-j28(evu^VgKnc1l#_tF zjUW8+??Qo!7}us7g<AmtFM+XpG0T40mH!#(-Xn`%9pJoNr=i&XU+ygH9188o=ETE1 z%SFtT0lZI1IWA5VEDHiE0vev8J{Q8l#)uIq366gPT7bv!zoO$4s2VIoU1h-ks$wWn zD*mrHD-FW6e9=&z{B-*9pA{gH|H<+{vFbmNq>lQmPb2?lh0Ead-y~0>>5Hf2;Fzt^ z{%?{eRU*at|CtXXvV-&qqG6R);s4+vdQz+VUuZ<Z98X9aOb3<!7uu7W9p?XuhEGTx uI}s`W=f#sl&;C#R{~daY<NsGH^hh8Uu35YI#V-`?=~0qXm#vUC4f%hK`1aZW literal 0 HcmV?d00001 diff --git a/src/assets/file/check.png b/src/assets/file/check.png new file mode 100644 index 0000000000000000000000000000000000000000..72ab799079f60e98eeab1f90a0d7032fe4085624 GIT binary patch literal 694 zcmV;n0!jUeP)<h;3K|Lk000e1NJLTq001li001lq1^@s69)wx}00001b5ch_0Itp) z=>Px%a7jc#R9HvtnLljPKorKmmxv*hN=UGDs0ahBbU-9yBEg7Y?1Gy984v@Mfw{?u z7)TbTf+991DrTgHtyLxPiWmrD=mHWFhz_WJ=sAt*T8Z!3@!77FTO!-<-uvad@6Kl( zA<(WjxK<?G1>p_|<>2#_t{pHOa?#r9Qr};bh8ML4pFb#I1BCUIpj2gCMtjCZtJkGp z(!m4vV2juWu%OD4evnf-L|vdg;K~X=&zrJAO+@LvSM->w4K8yLU(**Ydc{LRoo+01 zmkL;l-aUgJE;>|M<xe^G?nzY`eF5eSw2EDF3LINHWyh()N}*zhO%;wJ-P}cB?KU94 zZ{7nRWPvrb%oG;L7f*n>3&(`F9s<Arh7)H3JPKAYA3Os-e$E;2IM^@WfqN~JA%IjB z4uchSO?L41!)d*mlYmtNUzrCMZvuY~fX#P0CH#Y%6s!t(_AKyv<9IfU*R;bY1;)Yd z{}|-i|7rHEKf-8<tMdb3f73!I4XaXEg5Ewoxn9aW6SRzstg~V#e~YW^Fo#j$uwfks zZ3|Yda1>~pu#tc@&=O<A29YLRa1MtpQ4*W9XM^=s9@at!<0hS8qZYhaz+v_n7O?>v z*~40;ZNW|qJW6Ssu!#T<p=GZjyDj;0(CoTK`BQT*wud#zZNyB0ZKyiYi^DdMDgP<7 z#0vL8xMccgd3er%LzQK2qku<w08%h?sk+8BX74~I_l?fr^59TrmD@n>RqpJ*r1jHr z>_u=&=TPspkB+@W<)gE@W)79^lxEQsSZ^;8G;Z}im)(D85@P{`Ynd3E@ePD6B5dt! cQqRxuANyQ8-(<0fsQ>@~07*qoM6N<$f)|uHS^xk5 literal 0 HcmV?d00001 diff --git a/src/assets/file/type1.png b/src/assets/file/type1.png new file mode 100644 index 0000000000000000000000000000000000000000..f447d4992e928c2ea55f7afeeeb45b9049d9ef1d GIT binary patch literal 2279 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 literal 0 HcmV?d00001 diff --git a/src/assets/file/type2.png b/src/assets/file/type2.png new file mode 100644 index 0000000000000000000000000000000000000000..d3c9846de9d1ec7c20d69c0b57646d6730a03438 GIT binary patch literal 3542 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 O20$S#5tYX7@&5yEb!t}t literal 0 HcmV?d00001 diff --git a/src/assets/file/type3.png b/src/assets/file/type3.png new file mode 100644 index 0000000000000000000000000000000000000000..e6141460085ffb4814a3216252bce4bdc0e93f02 GIT binary patch literal 3273 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 literal 0 HcmV?d00001 diff --git a/src/assets/file/type4.png b/src/assets/file/type4.png new file mode 100644 index 0000000000000000000000000000000000000000..aacb39bfaa80e3c6eafcba86030c7b555dc18de8 GIT binary patch literal 2970 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 literal 0 HcmV?d00001 diff --git a/src/assets/file/type5.png b/src/assets/file/type5.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe84a46bd6c7aca248c9d3a2a4ec80e5527cbee GIT binary patch literal 3370 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 literal 0 HcmV?d00001 diff --git a/src/assets/file/type6.png b/src/assets/file/type6.png new file mode 100644 index 0000000000000000000000000000000000000000..47f2bc3ae0a9afd2c8e6a4f9ef3572f3490889e2 GIT binary patch literal 3028 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 JawE6ce*z0hW+eas literal 0 HcmV?d00001 diff --git a/src/components/Search/index.vue b/src/components/Search/index.vue index 1114282..9832089 100644 --- a/src/components/Search/index.vue +++ b/src/components/Search/index.vue @@ -9,7 +9,7 @@ <template> <div ref="screenRef" v-clickoutside="handleClose" class="screen-body"> <div v-if="title" class="title">{{ title }}</div> - <el-form label-width="60px" label-position="left" size="mini"> + <el-form label-width="80px" label-position="left" size="mini"> <el-row :gutter="10" type="flex" class="search_header" style="align-items: stretch"> <el-col class="search_left"> <el-row :gutter="40"> diff --git a/src/config/net.config.js b/src/config/net.config.js index 223c560..f8258a8 100644 --- a/src/config/net.config.js +++ b/src/config/net.config.js @@ -5,7 +5,7 @@ const network = { // 默认的接口地址 如果是开发环境和生产环境走vab-mock-server,当然你也可以选择自己配置成需要的接口地址 baseURL: process.env.NODE_ENV === 'development' - ? 'http://192.168.10.137:8097/fu-hsi-server' + ? 'http://192.168.10.25:8097/fu-hsi-server' : '/fuHsiApi', // 配后端数据的接收方式application/json;charset=UTF-8或者application/x-www-form-urlencoded;charset=UTF-8 contentType: 'application/json;charset=UTF-8', diff --git a/src/icons/svg/docx.svg b/src/icons/svg/docx.svg new file mode 100644 index 0000000..fd3c69d --- /dev/null +++ b/src/icons/svg/docx.svg @@ -0,0 +1,7 @@ +<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M20.7777 6.05V19.5556C20.7777 20.9 19.6777 22 18.3333 22H3.66661C2.32217 22 1.22217 20.9 1.22217 19.5556V2.44444C1.22217 1.1 2.32217 0 3.66661 0H14.7277L20.7777 6.05Z" fill="#4F6BF6"/> +<path d="M12.488 16.2343H13.7634L15.8889 9.43262H14.6141L12.488 16.2343Z" fill="white"/> +<path d="M14.7278 4.82778V0L20.7778 6.05H15.95C15.2778 6.05 14.7278 5.5 14.7278 4.82778Z" fill="#243EBB"/> +<path d="M13.7634 16.2343H12.488L10.3626 10.2827H11.6374L13.7634 16.2343ZM9.51192 16.2343H8.23653L6.11108 9.43262H7.38586L9.51192 16.2343Z" fill="white"/> +<path d="M8.23657 16.2338H9.51196L11.6374 10.2822H10.3626L8.23657 16.2338Z" fill="white"/> +</svg> diff --git a/src/router/index.js b/src/router/index.js index e1025d1..92f3f20 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -126,6 +126,37 @@ export const asyncRoutes = [ } ] }, + { + path: '/prompt', + name: 'Prompt', + permission: 'p_promptProject', + component: Layout, + meta: { title: '提示工程' }, + children: [ + { + path: '/prompt-config', + name: 'PromptConfig', + permission: 'p_promptManagement', + component: () => import('@/views/promptManagement/PromptConfig/index.vue'), + meta: { title: '提示词配置', affix: false } + }, + + { + path: '/prompt-management', + name: 'PromptManagement', + permission: 'p_promptManagement', + component: () => import('@/views/promptManagement/index.vue'), + meta: { title: '提示词模板', affix: false } + }, + { + path: '/prompt-test', + name: 'PromptTest', + permission: 'p_promptTest', + component: () => import('@/views/promptManagement/PromptTest.vue'), + meta: { title: '提示词调试', affix: false } + } + ] + }, { path: '/system', name: 'System', @@ -191,46 +222,17 @@ export const asyncRoutes = [ permission: 'p_caseDetails', component: () => import('@/views/caseDetails/components/EditEvidence/index.vue'), meta: { title: '编辑图像证据', affix: true } - } - ] - }, - { - path: '/prompt', - name: 'Prompt', - permission: 'p_promptProject', - component: Layout, - meta: { title: '提示工程' }, - children: [ - { - path: '/prompt-config', - name: 'PromptConfig', - permission: 'p_promptManagement', - component: () => import('@/views/promptManagement/PromptConfig/index.vue'), - meta: { title: '提示词配置', affix: false } }, { path: '/add-prompt', name: 'AddPrompt', permission: 'p_promptManagement', component: () => import('@/views/promptManagement/PromptConfig/add/index.vue'), - meta: { title: '新增提示词', affix: false } - }, - { - path: '/prompt-management', - name: 'PromptManagement', - permission: 'p_promptManagement', - component: () => import('@/views/promptManagement/index.vue'), - meta: { title: '提示词模板', affix: false } - }, - { - path: '/prompt-test', - name: 'PromptTest', - permission: 'p_promptTest', - component: () => import('@/views/promptManagement/PromptTest.vue'), - meta: { title: '提示词调试', affix: false } + meta: { title: '新增提示词', affix: true } } ] }, + { path: '*', redirect: '/404', diff --git a/src/views/caseDetails/components/AddEvidence/AddFolder.vue b/src/views/caseDetails/components/AddEvidence/AddFolder.vue index fbfe2a0..397e7aa 100644 --- a/src/views/caseDetails/components/AddEvidence/AddFolder.vue +++ b/src/views/caseDetails/components/AddEvidence/AddFolder.vue @@ -2,64 +2,148 @@ <template> <cs-dialog :dialog="dialogOptions" + @onSubmit="handleSubmit" > <template slot="content"> <div> <el-form ref="form" :model="addInfo" :rules="rules" label-width="90px"> - <el-form-item label="选择目录" prop="caseType"> - <el-select v-model="dataInfo['caseType']" clearable placeholder="请选择案件类型"> - <el-option v-for="item in caseTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> - </el-select> + <el-form-item label="选择目录" prop="directoryList"> + <el-cascader + ref="cascaderRef" + v-model="addInfo.directoryList" + style="width: 100%;" + :options="treeData" + :props="{ checkStrictly: true,label:'categoryName',children:'child',value:'id' }" + clearable + @change="selectDirectory" + /> </el-form-item> - <el-form-item label="提供人" prop="caseNo"> - <el-select v-model="dataInfo['caseType']" clearable placeholder="请选择案件类型"> - <el-option v-for="item in caseTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> - </el-select> + <el-form-item label="提供人" prop="provider"> + <div class="flex-row" style="justify-content: space-between"> + <el-select + v-model="addInfo.provider" + placeholder="请选择姓名" + style="width: 83%" + @change="selectProvider" + > + <el-option + v-for="item in userList" + :key="item.id" + :value="item.name" + :label="item.name" + > + <span>{{ `${item.name}` }}</span> + </el-option> + </el-select> + <el-button type="primary" @click="handleAdd">新增</el-button> + </div> </el-form-item> - <el-form-item label="模版类型" prop="caseNo"> - <el-input v-model="dataInfo['name']" clearable placeholder="请输入指令名称" /> + <el-form-item label="模版类型" prop="type"> + <el-input v-model="addInfo['type']" clearable placeholder="请输入" /> </el-form-item> - <el-form-item label="备注" prop="caseNo"> - <el-input v-model="dataInfo['name']" clearable placeholder="请输入指令名称" /> + <el-form-item label="文件夹名称" prop="directoryName"> + <el-input v-model="addInfo['directoryName']" clearable placeholder="请输入" /> </el-form-item> </el-form> + <!--新增用户--> + <add-case-user ref="add" @reloadData="getUserList" /> </div> </template> </cs-dialog> </template> <script> - +import AddCaseUser from '../edit/AddCaseUser.vue' +import { queryUserList } from '@/api/caseDetails' +import { createDirectory, getCaseEvidenceTree } from '@/api/caseDetails/evidence' export default { name: 'AddFolder', + components: { AddCaseUser }, data() { return { dialogOptions: { show: false, - width: '930px', + width: '510px', title: { title: '新建文件夹' }, - hiddenFooter: true, appendToBody: true }, - addInfo:{ - + options: [], + rules: {}, + treeData: [], + selectName: '', + // 用户 + userList: [], + // 角色 + roleList: JSON.parse(sessionStorage.getItem('case_role')), + addInfo: { + parentId: '', + directoryList: [] } } }, + watch: { + selectName: { + handler: function(val) { + if (val && this.addInfo.provider) { + this.$set(this.addInfo, 'directoryName', `${val}-${this.addInfo.provider}`) + } + }, + immediate: true + } + }, mounted() { - + this.getUserList() }, methods: { // 显示弹窗 show() { this.dialogOptions.show = true + this.getTreeList() + }, + selectProvider(val) { + if (val && this.selectName) { + this.$set(this.addInfo, 'directoryName', `${this.selectName}-${val}`) + } + }, + getTreeList() { + getCaseEvidenceTree({ caseId: this.caseId, caseType: 1 }).then(res => { + if (res.code === 200) { + this.treeData = res.data + } + }) + }, + handleAdd() { + this.$refs.add.show() + }, + selectDirectory(item) { + const nodes = this.$refs.cascaderRef.getCheckedNodes() + console.log(nodes) + this.$set(this.addInfo, 'type', nodes[0].data.promptName) + this.selectName = nodes[0].data.categoryName + // this.addInfo.type = nodes[0].data.promptName + }, + // 获取人员列表 + getUserList() { + queryUserList({ caseId: this.$route.params.id }).then(res => { + this.userList = res.data + }) }, - handleSelect(val) { - this.$emit('selectOk', val) - this.dialogOptions.show = false + handleSubmit() { + createDirectory({ + caseId: this.$route.params.id, + directoryName: this.addInfo.directoryName, + provider: this.addInfo.provider, + categoryId: this.addInfo.directoryList[this.addInfo.directoryList.length - 1] + }).then(res => { + if (res.code === 200) { + this.$message.success('添加成功') + this.$emit('addOk', res.data) + this.dialogOptions.show = false + } + }) } } } diff --git a/src/views/caseDetails/components/AddEvidence/MoveFolder.vue b/src/views/caseDetails/components/AddEvidence/MoveFolder.vue new file mode 100644 index 0000000..1fc17a3 --- /dev/null +++ b/src/views/caseDetails/components/AddEvidence/MoveFolder.vue @@ -0,0 +1,99 @@ + +<template> + <cs-dialog + :dialog="dialogOptions" + @onSubmit="handleSubmit" + > + <template slot="content"> + <div class="move-tree"> + <el-input + v-model="filterText" + prefix-icon="el-icon-search" + placeholder="搜索名称" + /> + <el-tree + :data="treeData" + highlight-current + default-expand-all + :props="defaultProps" + @node-click="handleNodeClick" + /> + </div> + </template> + </cs-dialog> +</template> + +<script> +import { getCaseEvidenceFileTree } from '@/api/caseDetails/evidence' +export default { + name: 'MoveFolder', + data() { + return { + dialogOptions: { + show: false, + width: '510px', + title: { + title: '移动文件到' + }, + appendToBody: true + }, + selectId: '', + filterText: '', + treeData: [], + defaultProps: { + children: 'child', + label: 'directoryName' + } + + } + }, + mounted() { + + }, + methods: { + // 显示弹窗 + show() { + this.dialogOptions.show = true + this.getTreeList() + }, + handleNodeClick(data) { + this.selectId = data.id + }, + // 查询左侧树 + getTreeList() { + getCaseEvidenceFileTree({ caseId: this.$route.params.id }).then(res => { + if (res.code === 200) { + this.treeData = res.data + } + }) + }, + handleSubmit() { + this.dialogOptions.show = false + this.$emit('selectOk', this.selectId) + } + } +} +</script> + + <style scoped lang="scss"> +.move-tree { + background: #F9FAFB; + ::v-deep { + .el-tree { + background: #F9FAFB; + .el-tree-node { + // height: 40px; + font-size: 16px; + color: #333333; + } + .el-tree-node__content { + height: 40px; + } + .el-tree-node.is-current > .el-tree-node__content { + background: #dce3ed; + color: #666666; + } + } + } + } + </style> diff --git a/src/views/caseDetails/components/AddEvidence/components/EvidenceConfirm.vue b/src/views/caseDetails/components/AddEvidence/components/EvidenceConfirm.vue new file mode 100644 index 0000000..20dde08 --- /dev/null +++ b/src/views/caseDetails/components/AddEvidence/components/EvidenceConfirm.vue @@ -0,0 +1,526 @@ +<template> + <div class="EvidenceConfirm"> + <div class="header"> + <div class="nav-list"> + <div v-for="(item,index) in navList" :key="index" class="nav-item"> + <span>{{ item }}</span> + <span v-if="index !== navList.length -1">></span> + </div> + </div> + <div class="title"> + <span>{{ `案件名称:${caseName}` }}</span> + <span>{{ `案件编号:${caseNo}` }}</span> + </div> + </div> + <div class="proofread-content"> + <div class="left-tree"> + <el-tree + ref="tree" + :data="treeData" + :props="defaultProps" + :expand-on-click-node="false" + default-expand-all + node-key="id" + highlight-current + @node-click="handleNodeClick" + /> + </div> + <div class="mid-content"> + <div class="left"> + <el-scrollbar v-if="selectList.length > 0" class="left-scroll"> + <vuedraggable v-model="selectList" animation="400" class="img_list"> + <div v-for="(item,index) in selectList" :key="index" class="img_item" :class="[item.fileId === selectInfo.fileId?'actived':'']"> + <img v-if="['jpg', 'png'].includes(item.fileType)" :src="getImgUrl(item.fileId)" @click="selectItem(item)"> + + </img> + <svg-icon v-if="[ 'doc', 'docx'].includes(item.fileType)" class="svg-img" icon-class="docx" /> + </div> + + </vuedraggable> + </el-scrollbar> + <div v-if="selectList.length > 0 && ['jpg', 'png'].includes(selectInfo.fileType)" class="act_img"> + <img v-if="selectInfo.fileId" :src="getImgUrl(selectInfo.fileId)" alt=""> + </div> + <div v-if="selectList.length === 0" class="empty-content"> + <img src="@/assets/caseManagement/empty.png" alt=""> + <span>暂无本次证据材料</span> + </div> + <span class="boder1" /> + <span class="boder2" /> + <span class="boder3" /> + <span class="boder4" /> + </div> + <div class="right"> + <div class="title">识别结果</div> + <el-input + v-model="selectInfo.ocrText" + class="right-text" + type="textarea" + /> + <span class="boder1" /> + <span class="boder2" /> + <span class="boder3" /> + <span class="boder4" /> + </div> + </div> + <div class="FormInfo"> + <el-form ref="form" :model="selectInfo" :rules="rules" label-width="100px" style="margin-top: 10px"> + <el-row :gutter="10" class="form-content"> + <el-col :span="24"> + <el-form-item label="证据名称" prop="title"> + <el-input v-model="selectInfo.evidenceInfo.title" placeholder="请输入证据名称" /> + </el-form-item> + </el-col> + </el-row> + + <el-row v-if="selectInfo.evidenceInfo.property.length > 0" :gutter="10" class="form-content"> + <el-col v-for="(item,index) in selectInfo.evidenceInfo.property" :key="index" :span="24"> + <el-form-item :label="item.attrName"> + <el-input v-if="item.attrValueType ==='text'" v-model="item.attrValue" placeholder="请输入" /> + </el-form-item> + </el-col> + </el-row> + </el-form> + </div> + </div> + <div class="footer-btns"> + <div class="btn" @click="submit">确认并提交</div> + <div class="btn" @click="save">保存</div> + <div class="reset_btn" @click="reset">重置</div> + </div> + </div> + +</template> +<script> +import * as vuedraggable from 'vuedraggable' +import { baseURL } from '@/config' +import { commonDownloadFile } from '@/api/config/uploadApi' +import { ocrAndExtractDetails, caseEvidenceVerify } from '@/api/caseDetails/evidence' +export default { + name: 'RecordProofread', + components: { vuedraggable }, + data() { + return { + selectList: [], + activedImg: '', + caseNo: '', + caseName: '', + dataInfo: {}, + navList: [], + // 证据类型 + evidenceTypeList: JSON.parse(sessionStorage.getItem('evidence_type')), + defaultProps: { + children: 'child', + label: 'directoryName' + }, + rules: { + title: [{ required: true, message: '证据名称不能为空!', trigger: 'blur' }] + }, + treeData: [], + flag: true, + selectInfo: { + evidenceInfo: { + property: [], + title: '' + }, + ocrText: '' + } + } + }, + mounted() { + this.getTreeList() + this.caseNo = this.$route.query.caseNo + this.caseName = this.$route.query.caseName + }, + methods: { + getParentNames(node, treeData, parentNames = []) { + // 找到节点的直接父节点 + const parent = treeData.find(parentNode => + parentNode.child && parentNode.child.some(child => child.id === node.id) + ) + + // 如果找到父节点,将其名称添加到数组中,并递归检查更上层的父节点 + if (parent) { + parentNames.push(parent.directoryName) + return this.getParentNames(parent, treeData, parentNames) + } + + // 如果没有找到更上层的父节点,返回所有父节点的名称 + return parentNames + }, + // 查询左侧树 + getTreeList() { + ocrAndExtractDetails({ caseId: this.$route.params.id, batchNo: this.$route.query.recordId }).then(res => { + if (res.code === 200) { + this.treeData = res.data + this.$nextTick(() => { + this.handleNodeClick(res.data[0]) + }) + } + }) + }, + getImgUrl(id) { + return `${baseURL}${commonDownloadFile}${id}` + }, + selectItem(item) { + this.selectInfo = item + this.activedImg = `${baseURL}${commonDownloadFile}${this.selectInfo.fileId}` + }, + reset() { + + }, + findNodeById(nodes, id) { + for (const node of nodes) { + if (node.id === id) { + return node + } else if (node.child) { + const foundNode = this.findNodeById(node.child, id) + if (foundNode) { + return foundNode + } + } + } + return null + }, + // 获取有文件的list + getFileList(nodes) { + for (const node of nodes) { + if (node.fileInfoList.length > 0) { + return node + } else if (node.child) { + const foundNode = this.getFileList(node.child) + if (foundNode) { + return foundNode + } + } + } + return null + }, + handleNodeClick(data) { + this.selectId = data.id + this.navList = [] + this.navList = this.getParentNames(data, this.treeData) + const nodeItem = this.findNodeById(this.treeData, this.selectId) + if (nodeItem.fileInfoList.length === 0) { + const newNodeItem = this.getFileList(nodeItem.child) + this.$refs.tree.setCurrentKey(newNodeItem.id) + this.selectList = newNodeItem.fileInfoList + this.selectInfo = this.selectList[0] + } else { + this.selectList = nodeItem.fileInfoList + this.selectInfo = this.selectList[0] + } + this.navList.push(data.directoryName) + }, + checkEvidence(nodes) { + for (const item of nodes) { + if (item.fileInfoList.length > 0) { + for (let i = 0; i < item.fileInfoList.length; i++) { + if (!item.fileInfoList[i].evidenceInfo.title) { + this.handleNodeClick(item) + this.selectItem(item.fileInfoList[i]) + this.flag = false + break + } + } + } else if (item.child) { + this.checkEvidence(item.child) + } + } + }, + save() { + this.checkEvidence(this.treeData) + if (this.flag) { + caseEvidenceVerify({ + batchNo: this.$route.query.recordId, + caseId: this.$route.params.id, + evidenceDirectoryList: this.treeData + }).then(res => { + if (res.code === 200) { + this.$baseMessage.success(res.msg || '保存成功!') + this.$store.dispatch( + 'tabsBar/delRoute', + this.$route + ) + this.$router.push({ path: `/case-details/${this.$route.params.id}/${this.$route.query.caseName}`, query: { isEdit: 1, caseNo: this.$route.query.caseNo }}) + } + }) + } else { + this.$baseMessage.error('证据不能为空!') + } + }, + submit() { + this.save() + this.$emit('submit') + } + } +} +</script> + <style lang="scss" scoped> + .EvidenceConfirm { + display: flex; + flex: 1; + padding: 0 24px; + flex-direction: column; + :deep(.el-scrollbar__wrap) { + overflow-x: hidden; + + } + .left-tree { + width: 210px; + margin-right: 16px; + background: #F9FAFB; + ::v-deep { + .el-tree { + background: #F9FAFB; + .el-tree-node { + // height: 40px; + font-size: 16px; + color: #333333; + } + .el-tree-node__content { + height: 40px; + } + .el-tree-node.is-current > .el-tree-node__content { + background: #dce3ed; + color: #666666; + } + } + } + + } + .proofread-content { + flex: 1; + margin-left: 18px; + display: flex; + + .mid-content { + display: flex; + flex: 1; + .left { + width: 55%; + margin-right: 24px; + position: relative; + // background: #F6F8F9; + border: 1px solid #DCE3EB; + display: flex; + padding: 8px; + .empty-content { + flex: 1; + padding: 24px; + display: flex; + margin-top: 16px; + flex-direction: column; + display: flex; + justify-content: center; + align-items: center;font-size: 16px; + color: #333333; + img { + width: 200px; + height: 200px; + } + } + .left-scroll { + background: #F6F8F9; + width: 150px; + margin-right: 14px; + } + .act_img { + padding: 16px 28px; + flex: 1; + background: #F6F8F9; + height: calc(100vh - 420px); + background-size: 100% 100%; + display: flex; + align-items: center; + justify-content: center; + img { + height: 100%; + } + } + .actived { + border: 2px solid #3763FF !important; + } + } + .right { + width: 45%; + position: relative; + border: 1px solid #DCE3EB; + display: flex; + padding: 8px; + flex-direction: column; + .title { + background: #F6F8F9; + border-bottom: 1px solid #DCE3EB; + height: 70px; + padding-left: 24px; + line-height: 70px; + font-weight: bold; + font-size: 18px; + color: #333333; + } + .right-text { + width: 100%; + height: 500px; + } + } + } + .FormInfo { + width: 410px; + background: #F6F8F9; + border-radius: 8px 8px 8px 8px; + margin-left: 24px; + // height: calc(100vh - 350px); + padding: 0 24px; + margin-bottom: 72px; + .expand { + display: flex; + flex-direction: row-reverse; + padding: 0 24px; + align-items: center; + cursor: pointer; + margin-bottom: 16px; + img { + width: 18px; + height: 18px; + margin-right: 8px; + } + .line { + flex: 1; + height: 1px; + background: #E9E9E9; + margin-right: 8px; + } + } + } + .img_list { + display: flex; + flex-direction: column; + align-items: center; + padding-top: 25px; + overflow-x: hidden; + padding: 24px; + background: #F6F8F9; + .img_item { + width: 98px; + height: 138px; + margin-bottom: 16px; + border-radius: 6px 6px 6px 6px; + border: 1px solid #D1D3D6; + cursor: move; + } + .svg-img { + width: 98px; + height: 138px; + margin-bottom: 16px; + border-radius: 6px 6px 6px 6px; + border: 1px solid #D1D3D6; + cursor: move; + } + } + .boder1 { + position: absolute; + width: 15px; + height: 15px; + left: 0; + top: 0; + border-top: 2px solid #2073FF; + border-left: 2px solid #2073FF; + } + .boder2 { + position: absolute; + width: 15px; + height: 15px; + right: 0; + top: 0; + border-top: 2px solid #2073FF; + border-right: 2px solid #2073FF; + } + .boder3 { + position: absolute; + width: 15px; + height: 15px; + left: 0; + bottom: 0; + border-bottom: 2px solid #2073FF; + border-left: 2px solid #2073FF; + } + .boder4 { + position: absolute; + width: 15px; + height: 15px; + right: 0; + bottom: 0; + border-bottom: 2px solid #2073FF; + border-right: 2px solid #2073FF; + } + } + .header { + display: flex; + justify-content: space-between; + padding-left: 210px; + .nav-list { + display: flex; + font-size: 16px; + color: #333333; + margin-bottom: 16px; + .nav-item { + display: flex; + span { + margin-right: 16px; + } + } + } + .title { + // display: flex; + text-align: right;font-size: 16px; + color: #333333; + margin-bottom: 24px; + span { + margin-left: 32px; + } + } + } + .footer-btns { + padding-top: 24px; + height: 68px; + display: flex; + flex-direction: row-reverse; + .btn { + width: 188px; + height: 48px; + background: #3763FF; + box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); + border-radius: 6px 6px 6px 6px; + text-align: center; + line-height: 48px; + font-size: 16px; + color: #FFFFFF; + cursor: pointer; + margin-left: 24px; + } + .reset_btn { + width: 188px; + height: 48px; + background: #FFFFFF; + box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); + border-radius: 6px 6px 6px 6px; + border: 1px solid #3763FF; + text-align: center; + line-height: 48px; + font-size: 16px; + color: #3763FF; + cursor: pointer; + margin-left: 24px; + } + } + } + </style> + <style lang="scss" scoped> + + ::v-deep .el-textarea__inner { + height: calc(100vh - 450px); + border: none; + box-shadow: none; + } + </style> diff --git a/src/views/caseDetails/components/AddEvidence/components/EvidenceExtract.vue b/src/views/caseDetails/components/AddEvidence/components/EvidenceExtract.vue new file mode 100644 index 0000000..65b9236 --- /dev/null +++ b/src/views/caseDetails/components/AddEvidence/components/EvidenceExtract.vue @@ -0,0 +1,216 @@ +<template> + <div class="EvidenceExtract"> + <div class="title"> + <span>{{ `案件名称:${caseName}` }}</span> + <span>{{ `案件编号:${caseNo}` }}</span> + </div> + <vxe-grid v-bind="gridOptions" class="record_table"> + <template #status="{row}"> + <div v-if="row.status === '2'" class="status"> + <img src="@/assets/record/success.png" alt=""> + <span>识别成功</span> + </div> + <div v-if="row.status === '3'" class="status"> + <img src="@/assets/record/error.png" alt=""> + <span>识别失败</span> + </div> + <!-- <div v-if="row.status === '0'"> + <img src="@/assets/record/error.png" alt=""> + <span>未识别</span> + </div> --> + <div v-if="row.status === '1' || row.status === '0'" class="status"> + <!-- <img src="@/assets/record/error.png" alt=""> --> + <div v-loading="true" style="width: 20px;height: 20px;margin-right: 8px;position: relative;top: 12px;" /> + <span>正在识别</span> + </div> + </template> + <template #opera="{ row, rowIndex}"> + <div class="btn-list"> + <!-- <img src="@/assets/record/reset_identify.png" alt=""> --> + <!-- <img src="@/assets/record/view_detail.png" alt=""> --> + <el-image + style="width: 16px; height: 16px;margin-right: 16px;" + :src="detailImg" + :preview-src-list="getImgUrlList(row)" + fit="cover" + @click="openDeatils(row)" + /> + <!-- <img src="@/assets/record/del.png" alt="" @click="del(row,rowIndex )"> --> + </div> + </template> + </vxe-grid> + <div class="footer-btns"> + <div class="reset_btn" @click="closed">关闭,后台提取</div> + <div class="btn" @click="next">下一步,内容确认</div> + </div> + </div> + +</template> +<script> +import * as vuedraggable from 'vuedraggable' +import { baseURL } from '@/config' +import { commonDownloadFile } from '@/api/config/uploadApi' +import { saveRecord, deleteFile } from '@/api/caseDetails/ocr' +import { ocrAndExtractList } from '@/api/caseDetails/evidence' +export default { + name: 'EvidenceExtract', + components: { vuedraggable }, + data() { + return { + detailImg: require('@/assets/record/view_detail.png'), + caseNo: '', + caseName: '', + props: { + recordId: { + type: String, + default: '' + } + }, + gridOptions: { + + columns: [ + { title: '序号', type: 'seq', width: '80px' }, + { title: '证据名称', field: 'evidenceName' }, + { title: '附件名称', field: 'attachmentName' }, + { title: '模板类型', field: 'templateName',width:'200px' }, + { title: '证据类型', field: 'evidenceTypeName',width:'200px' }, + { title: '附件大小', field: 'attachmentSize',width:'150px' }, + { title: '状态', slots: { default: 'status' }, align: 'center' }, + // { title: '操作', slots: { default: 'opera' }, fixed: 'right', width: '200px' } + ], + data: [ + ] + }, + srcList: [] + } + }, + mounted() { + this.getDataList() + this.caseNo = this.$route.query.caseNo + this.caseName = this.$route.query.caseName + }, + methods: { + getImgUrlList(row) { + return [`${baseURL}${commonDownloadFile}${row.fileId}`] + }, + getDataList() { + ocrAndExtractList({ + batchNo: this.$route.query.recordId, + caseId: this.$route.params.id + }).then(res => { + if (res.code === 200) { + this.$set(this.gridOptions, 'data', res.data) + this.gridOptions.data = res.data + for (const item of res.data) { + if (item.status !== '2' && item.status !== '3') { + setTimeout(() => { + this.getDataList() + }, 3000) + return + } + } + } + }) + }, + del(row, index) { + if (this.gridOptions.data.length === 1) { + this.$baseMessage.error('至少保留一条数据!') + return + } + deleteFile({ recordId: this.$route.query.recordId, fileId: row.fileId }).then(res => { + if (res.code === 200) { + this.gridOptions.data.splice(index, 1) + this.$baseMessage.success('删除成功!') + } + }) + }, + closed() { + this.$store.dispatch( + 'tabsBar/delRoute', + this.$route + ) + this.$router.push({ path: `/case-details/${this.$route.params.id}/${this.$route.query.caseName}`, query: { isEdit: 1, caseNo: this.$route.query.caseNo }}) + }, + next() { + this.$emit('save', this.$route.query.recordId) + } + } +} +</script> + <style lang="scss" scoped> + .EvidenceExtract { + display: flex; + flex-direction: column; + padding: 0 24px; + .title { + // display: flex; + text-align: right;font-size: 16px; + color: #333333; + margin-bottom: 24px; + span { + margin-left: 32px; + } + } + .record_table { + flex: 1; + margin-left: 18px; + } + .status { + display: flex; + justify-content: center; + align-items: center; + img { + width: 20px; + height: 20px; + margin-right: 8px; + } + ::v-deep { + .el-loading-spinner .circular { + width: 20px; + height: 20px; + } + } + } + .btn-list { + img { + width: 16px; + height: 16px; + cursor: pointer; + margin-right: 16px; + } + } + .footer-btns { + position: absolute; + right: 24px; + bottom: 24px; + display: flex; + .reset_btn { + width: 188px; + height: 48px; + background: #FFFFFF; + box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); + border-radius: 6px 6px 6px 6px; + border: 1px solid #3763FF; + text-align: center; + line-height: 48px; + font-size: 16px; + color: #3763FF; + cursor: pointer; + margin-left: 24px; + } + .btn { + width: 188px; + height: 48px; + background: #3763FF; + box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); + border-radius: 6px 6px 6px 6px; + text-align: center; + line-height: 48px; + font-size: 16px; + color: #FFFFFF; + cursor: pointer; + margin-left: 24px; + } + } + } + </style> diff --git a/src/views/caseDetails/components/AddEvidence/components/UploadEvidence.vue b/src/views/caseDetails/components/AddEvidence/components/UploadEvidence.vue new file mode 100644 index 0000000..7d072d0 --- /dev/null +++ b/src/views/caseDetails/components/AddEvidence/components/UploadEvidence.vue @@ -0,0 +1,516 @@ +<template> + <div class="UploadEvidence"> + <div class="left-tree"> + <el-input + v-model="filterText" + prefix-icon="el-icon-search" + placeholder="搜索名称" + /> + <el-tree + :data="treeData" + :props="defaultProps" + node-key="id" + current-node-key="1" + highlight-current + default-expand-all + @node-click="handleNodeClick" + /> + </div> + <div class="main-content"> + <div class="nav-list"> + <div v-for="(item,index) in navList" :key="index" class="nav-item"> + <span>{{ item }}</span> + <span v-if="index !== navList.length -1">></span> + </div> + </div> + <div class="btn-list"> + <el-button type="primary" icon="el-icon-folder-add" @click="addFolder">新建文件夹</el-button> + <el-upload + :headers="{ + token: token + }" + :action="uploadOption.action" + :accept="uploadOption.accept" + multiple + :on-success="handleSuccess" + :before-upload="beforeUpload" + :show-file-list="false" + class="drag-content btn-list" + > + <el-button type="primary" style="height: 42px;margin-left: 24px;" icon="el-icon-circle-plus-outline">添加证据</el-button> + </el-upload> + <div class="plain-btn" @click="move">移动</div> + <!-- <div class="plain-btn">删除文件夹</div> --> + <div class="plain-btn" @click="del">删除</div> + <div class="case-content"> + <span>{{ `案件名称:${caseName}` }}</span> + <span>{{ `案件编号:${caseNo}` }}</span> + </div> + </div> + <div v-if="selectList.length > 0" class="file-content"> + <vuedraggable v-model="selectList" animation="400" class="file-list"> + <div v-for="(item,index) in selectList" :key="index" class="file-item" @click="selectItem(index)"> + <div class="main-content"> + <img v-if="item.type === 1" src="@/assets/file/type1.png" alt=""> + <svg-icon v-if="item.type === 3" class="svg-img" icon-class="docx" /> + <img v-if="item.type === 2" class="file-img" :src="getImgUrl(item.fileId)" alt=""> + </div> + <div class="footer">{{ item.fileName }}</div> + <div v-if="!item.check" class="no-select" /> + <img v-else src="@/assets/file/check.png" class="selected" alt=""> + </div> + </vuedraggable> + + </div> + <div v-else class="empty-content"> + <img src="@/assets/caseManagement/empty.png" alt=""> + <span>暂无本次证据材料</span> + </div> + <div class="footer-btns"> + + <div class="btn" @click="save">下一步,证据识别</div> + <div class="reset_btn" @click="closed">关闭</div> + </div> + </div> + <AddFolder ref="AddFolderRef" @addOk="addFolderOk" /> + <MoveFolder ref="MoveFolderRef" @selectOk="selectOk" /> + </div> +</template> +<script> +import { baseURL } from '@/config' +import { getAccessToken } from '@/utils/accessToken' +import { commonDownloadFile } from '@/api/config/uploadApi' +import * as vuedraggable from 'vuedraggable' +import AddFolder from '../AddFolder.vue' +import MoveFolder from '../MoveFolder.vue' +import { getCaseEvidenceFileTree, ocrAndExtract } from '@/api/caseDetails/evidence' +export default { + name: 'UploadEvidence', + components: { vuedraggable, AddFolder, MoveFolder }, + data() { + return { + // 上传配置 + uploadOption: { + action: `${baseURL}/minio/uploadFile`, + accept: '.bmp,.jpg,.png,.doc,.docx' + }, + token: getAccessToken(), + filterText: '', + defaultProps: { + children: 'child', + label: 'directoryName' + }, + navList: ['未分类'], + caseNo: '', + caseName: '', + selectList: [], + selectId: '1', + treeData: [] + } + }, + mounted() { + this.getTreeList() + this.caseNo = this.$route.query.caseNo + this.caseName = this.$route.query.caseName + }, + methods: { + beforeUpload(file) { + const isLt5M = file.size / 1024 / 1024 < 5 + const filename = file.name + const postfix = filename.substring(filename.lastIndexOf('.')) + if (!['.jpg', '.png', '.doc', '.docx'].includes(postfix)) { + this.$message.error('上传的文件格式不符合要求!') + return false + } + if (!isLt5M) { + this.$message.error('上传文件大小不能超过 5MB!') + return false + } + return true + }, + handleSuccess(res, file) { + const filename = file.name + const postfix = filename.substring(filename.lastIndexOf('.')) + const obj = { + fileName: file.name, + fileId: res.data, + type: 2, + check: false + } + if (['.doc', '.docx'].includes(postfix)) { + obj.type = 3 + } + // const selectItem = this.findSelectNode(this.treeData) + this.addNodeProperty(this.selectId, obj) + this.selectList.push(obj) + }, + del() { + const list = this.getSelectList() + if (list.length === 0) { + this.$baseMessage.error('请选择文件!') + return + } + list.forEach(e => { + if (e.type === 1) { + this.$baseMessage.error('不能删除文件夹!') + return + } + }) + this.delFiles() + }, + // 删除文件 + delFiles() { + const node = this.findNodeById(this.treeData, this.selectId) + for (let i = node.fileInfoList.length - 1; i >= 0; i--) { + if (node.fileInfoList[i].check === true) { + node.fileInfoList.splice(i, 1) + } + } + this.selectList = JSON.parse(JSON.stringify(node.fileInfoList)) + }, + // 选择移动的文件夹 + selectOk(val) { + if (this.selectId === val) { + this.$message.error('不能移动到相同的文件夹') + return false + } + const list = this.getSelectList() + this.moveNodeFileList(val, list) + this.delFiles() + }, + moveNodeFileList(toId, list) { + const node = this.findNodeById(this.treeData, toId) + for (const item of list) { + node.fileInfoList.push(item) + } + }, + addNodeProperty(nodeId, data) { + const node = this.findNodeById(this.treeData, nodeId) + if (node) { + node.fileInfoList.push(data) + node.fileIdList.push(data.fileId) + } + console.log('111', this.treeData) + }, + findNodeById(nodes, id) { + for (const node of nodes) { + if (node.id === id) { + return node + } else if (node.child) { + const foundNode = this.findNodeById(node.child, id) + if (foundNode) { + return foundNode + } + } + } + return null + }, + getParentNames(node, treeData, parentNames = []) { + // 找到节点的直接父节点 + const parent = treeData.find(parentNode => + parentNode.child && parentNode.child.some(child => child.id === node.id) + ) + + // 如果找到父节点,将其名称添加到数组中,并递归检查更上层的父节点 + if (parent) { + parentNames.push(parent.directoryName) + return this.getParentNames(parent, treeData, parentNames) + } + + // 如果没有找到更上层的父节点,返回所有父节点的名称 + return parentNames + }, + // 查询左侧树 + getTreeList() { + getCaseEvidenceFileTree({ caseId: this.$route.params.id }).then(res => { + if (res.code === 200) { + this.treeData = res.data + this.treeData.unshift({ + directoryName: '未分类', + id: '1', + fileIdList: [], + fileInfoList: [] + }) + } + }) + }, + handleNodeClick(data) { + this.selectId = data.id + this.selectList = [] + this.navList = [] + if (this.selectId === '1') { + this.selectList = JSON.parse(JSON.stringify(this.treeData[0].fileInfoList)) + } else { + const nodeItem = this.findNodeById(this.treeData, this.selectId) + if (nodeItem.child && nodeItem.child.length > 0) { + for (const item of nodeItem.child) { + this.selectList.push({ + fileName: item.directoryName, + type: 1, + check: false + }) + } + } + for (const item of nodeItem.fileInfoList) { + this.selectList.push(item) + } + } + + this.navList = this.getParentNames(data, this.treeData) + this.navList.push(data.directoryName) + }, + // 选择文件 + selectItem(index) { + this.selectList[index].check = !this.selectList[index].check + }, + addFolderOk(item) { + const node = this.findNodeById(this.treeData, item.parentId) + node.child.push({ + ...item, + child: [], + fileIdList: [], + fileInfoList: [] + }) + }, + getSelectList() { + const list = [] + for (const item of this.selectList) { + if (item.check) { + list.push(item) + } + } + return list + }, + // 移动到文件夹 + move() { + const list = this.getSelectList() + if (list.length === 0) { + this.$baseMessage.error('请选择文件!') + return + } + list.forEach(e => { + if (e.type === 1) { + this.$baseMessage.error('不能移动文件夹!') + return + } + }) + this.$refs.MoveFolderRef.show() + }, + closed() { + this.$store.dispatch( + 'tabsBar/delRoute', + this.$route + ) + this.$router.push({ path: `/case-details/${this.$route.params.id}/${this.$route.query.caseName}`, query: { isEdit: 1, caseNo: this.$route.query.caseNo }}) + }, + save() { + if (this.treeData[0].fileInfoList && this.treeData[0].fileInfoList.length > 0) { + this.$baseMessage.error('请分类!') + return + } + const list = JSON.parse(JSON.stringify(this.treeData)) + list.splice(0, 1) + ocrAndExtract({ + evidenceFileList: list, + caseId: this.$route.params.id + }).then(res => { + if (res.code === 200) { + this.$baseMessage.success('新增成功!') + this.$emit('save', res.data) + } + }) + }, + addFolder() { + this.$refs.AddFolderRef.show() + }, + getImgUrl(id) { + return `${baseURL}${commonDownloadFile}${id}` + } + } +} +</script> +<style lang="scss" scoped> +.UploadEvidence { + display: flex; + padding: 0 24px; + flex: 1; + .left-tree { + width: 210px; + margin-right: 16px; + background: #F9FAFB; + ::v-deep { + .el-tree { + background: #F9FAFB; + .el-tree-node { + // height: 40px; + font-size: 16px; + color: #333333; + } + .el-tree-node__content { + height: 40px; + } + .el-tree-node.is-current > .el-tree-node__content { + background: #dce3ed; + color: #666666; + } + } + } + + } + .main-content { + display: flex; + flex-direction: column; + flex: 1; + .svg-img { + + } + .nav-list { + display: flex; + font-size: 16px; + color: #333333; + margin-bottom: 16px; + .nav-item { + display: flex; + span { + margin-right: 16px; + } + } + } + .btn-list { + display: flex; + position: relative; + .plain-btn { + height: 42px; + background: #FFFFFF; + border-radius: 6px 6px 6px 6px; + border: 1px solid #3763FF; + padding: 0 24px; + line-height: 42px; + cursor: pointer; + margin-left: 24px;font-size: 16px; + color: #3763FF; + } + .case-content { + position: absolute; + right: 0px; + span { + font-size: 16px; + color: #333333; + margin-left: 32px; + } + } + } + .file-content { + flex: 1; + border: 1px dashed #3763ff; + padding: 24px; + display: flex; + margin-top: 16px; + .file-list { + display: flex; + } + .file-item { + width: 190px; + height: 230px; + position: relative; + margin-right: 16px; + cursor: pointer; + .main-content { + background: #F5F5F5; + height: 188px; + display: flex; + justify-content: center; + align-items: center; + .svg-img, img { + width: 120px; + height: 120px; + } + .file-img { + width: 132px; + height: 188px; + } + } + .footer { + line-height: 42px; + height: 42px; + background: #FFFFFF; + border-radius: 0px 0px 12px 12px; + padding-left: 16px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: middle; + box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.08);font-size: 16px; + color: #333333; + } + .no-select { + position: absolute; + top: 12px; + right: 12px;width: 22px; + height: 22px; + background: #FFFFFF; + border-radius: 4px 4px 4px 4px; + border: 1px solid #D9D9D9; + cursor: pointer; + } + .selected { + width: 22px; + height: 22px; + position: absolute; + top: 12px; + right: 12px; + cursor: pointer; + } + } + } + .empty-content { + flex: 1; + border: 1px dashed #3763ff; + padding: 24px; + display: flex; + margin-top: 16px; + flex-direction: column; + display: flex; + justify-content: center; + align-items: center;font-size: 16px; + color: #333333; + img { + width: 200px; + height: 200px; + } + } + .footer-btns { + display: flex; + flex-direction: row-reverse; + padding: 24px 0; + .reset_btn { + width: 188px; + height: 48px; + background: #FFFFFF; + box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); + border-radius: 6px 6px 6px 6px; + border: 1px solid #3763FF; + text-align: center; + line-height: 48px; + font-size: 16px; + color: #3763FF; + cursor: pointer; + margin-left: 24px; + } + .btn { + width: 188px; + height: 48px; + background: #3763FF; + box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); + border-radius: 6px 6px 6px 6px; + text-align: center; + line-height: 48px; + font-size: 16px; + color: #FFFFFF; + cursor: pointer; + margin-left: 24px; + } + } + } +} +</style> diff --git a/src/views/caseDetails/components/AddEvidence/edit.vue b/src/views/caseDetails/components/AddEvidence/edit.vue new file mode 100644 index 0000000..518a2fb --- /dev/null +++ b/src/views/caseDetails/components/AddEvidence/edit.vue @@ -0,0 +1,162 @@ +<template> + <div class="EditEvidence"> + <div class="step-list"> + <div class="step-list-item"> + <img :src="actUploadImg" alt=""> + <span class="actived">证据上传并归档</span> + </div> + <div :class="[activeStep > 0 ?'act-step-line':'step-line']"> + <span>>></span> + </div> + <div class="step-list-item"> + <img v-if="activeStep > 0" :src="actIdentifyImg" alt=""> + <img v-else :src="identifyImg" alt=""> + <span :class="[activeStep > 0 ?'actived':'']">证据识别并提取</span> + </div> + <div :class="[activeStep > 0 ?'act-step-line':'step-line']"> + <span>>></span> + </div> + <div class="step-list-item"> + <img v-if="activeStep > 1" :src="actUploadImg" alt=""> + <img v-else :src="uploadImg" alt=""> + <span :class="[activeStep > 1 ?'actived':'']">证据确认</span> + </div> + </div> + <UploadEvidence v-show="activeStep === 0" ref="UploadEvidenceRef" @save="saveOk" /> + <EvidenceExtract v-if="activeStep === 1" ref="EvidenceExtractRef" @save="saveOk" /> + <EvidenceConfirm v-if="activeStep === 2" ref="EvidenceConfirmRef" /> + </div> +</template> +<script> +import { baseURL } from '@/config' +import { commonDownloadFile } from '@/api/config/uploadApi' +import * as vuedraggable from 'vuedraggable' +import UploadEvidence from './components/UploadEvidence.vue' +import EvidenceExtract from './components/EvidenceExtract.vue' +import EvidenceConfirm from './components/EvidenceConfirm.vue' +export default { + name: 'EditEvidence', + components: { vuedraggable, UploadEvidence, EvidenceExtract, EvidenceConfirm }, + data() { + return { + fileList: [], + actRecordImg: require('@/assets/record/act_record.png'), + actIdentifyImg: require('@/assets/record/act_identify.png'), + actUploadImg: require('@/assets/record/act_upload.png'), + identifyImg: require('@/assets/record/identify.png'), + uploadImg: require('@/assets/record/upload.png'), + activeStep: 0, + status: '1', + interval: undefined + } + }, + mounted() { + + }, + methods: { + getImgUrl(id) { + return `${baseURL}${commonDownloadFile}${id}` + }, + beforeUpload(file) { + const isLt5M = file.size / 1024 / 1024 < 5 + const filename = file.name + const postfix = filename.substring(filename.lastIndexOf('.')) + if (!['.jpg', '.png'].includes(postfix)) { + this.$message.error('上传图片只能是 JPG,PNG 格式!') + return false + } + if (!isLt5M) { + this.$message.error('上传头像图片大小不能超过 5MB!') + return false + } + if (this.fileList >= 12) { + this.$message.error('上传文件数量不能超过12张!') + return false + } + return true + }, + del(index) { + this.fileList.splice(index, 1) + }, + handleSuccess(res, file) { + const obj = { + name: file.name, + fileId: res.data + } + this.fileList.push(obj) + this.imgOcrIdentify(res.data) + }, + saveOk() { + this.activeStep += 1 + }, + async submit() { + + } + } +} +</script> + + <style scoped lang="scss"> + .EditEvidence { + width: 100%; + height: 100%; + background: #fff; + display: flex; + flex-direction: column; + .step-list { + display: flex; + align-items: center; + width: 100%; + justify-content: center; + padding-top: 36px; + margin-bottom: 32px; + .step-list-item { + display: flex; + align-items: center; + span { + font-size: 20px; + color: #999999; + margin-left: 16px; + margin-right: 16px; + } + .actived { + color: #3763FF; + } + } + .step-line { + width: 137px; + height: 2px; + border-top: 2px dashed #999999; + display: flex; + position: relative; + margin-right: 42px; + span { + position: absolute; + right: -24px; + top: -11px; + color: #999999; + font-size: 16px; + } + } + .act-step-line { + width: 137px; + height: 2px; + border-top: 2px dashed #3763FF; + display: flex; + position: relative; + margin-right: 42px; + span { + position: absolute; + right: -24px; + top: -11px; + color: #3763FF; + font-size: 16px; + } + } + img { + width: 36px; + height: 36px; + } + } + } + </style> diff --git a/src/views/caseDetails/components/AddEvidence/index.vue b/src/views/caseDetails/components/AddEvidence/index.vue index 2aee4fa..073c9b3 100644 --- a/src/views/caseDetails/components/AddEvidence/index.vue +++ b/src/views/caseDetails/components/AddEvidence/index.vue @@ -1,108 +1,56 @@ <template> - <div v-loading="loading" element-loading-text="识别中..." class="AddEvidence"> - <div v-if="fileList.length === 0 && status === '1'" class="no-upload-main"> - <el-upload - drag - :headers="{ - token: token - }" - :action="uploadOption.action" - :accept="uploadOption.accept" - multiple - :on-success="handleSuccess" - :before-upload="beforeUpload" - :show-file-list="false" - class="drag-content" - > - <div class="upload-content"> - <!-- <div>点击或将文件拖拽到这里上传</div> - <div>支持PNG、JPG、JPEG、BMP、WEBP图片格式OCR转换,一次可以处理12张</div> - <el-button type="primary" icon="el-icon-upload2" style="margin-top: 10px">点击上传</el-button> --> - <img src="@/assets/record/upload_content.png" alt=""> - <div class="upload-content-main"> - <span class="title">点击或将文件拖拽到这里上传</span> - <span class="desc">支持PNG、JPG、JPEG图片格式OCR转换,一次可以处理12张</span> - </div> - </div> - </el-upload> - </div> - <div v-if=" fileList.length > 0&& status === '1'" class="handle-upload-main"> - <el-upload - drag - :headers="{ - token: token - }" - :action="uploadOption.action" - :accept="uploadOption.accept" - multiple - :on-success="handleSuccess" - :before-upload="beforeUpload" - :show-file-list="false" - class="handle-drag-content" - > - - <div class="upload-content-main"> - <span class="title">点击或将文件拖拽到这里上传</span> - <span class="desc">支持PNG、JPG、JPEG图片格式OCR转换,一次可以处理12张</span> - <div class="up-btn"> - <img src="@/assets/record/upload_btn.png" alt=""> - <span>选择文件</span> - </div> - </div> - - </el-upload> - <div class="upload-list"> - <vuedraggable v-model="fileList" animation="400" class="img_list"> - <!-- <transition-group> --> - <div v-for="(item,index) in fileList" :key="index" class="img_item"> - <!-- <img :src="getImgUrl(item.id)" alt=""> --> - <el-image - class="img_item_url" - :src="getImgUrl(item.fileId)" - :zoom-rate="1.2" - :max-scale="7" - :min-scale="0.2" - :preview-src-list="[getImgUrl(item.fileId)]" - fit="cover" - /> - <span>{{ item.name }}</span> - <img class="del" @click="del(index)" src="@/assets/record/del_img.png" alt=""> - </div> - <!-- </transition-group> --> - </vuedraggable> + <div class="AddEvidence"> + <div class="step-list"> + <div class="step-list-item"> + <img :src="actUploadImg" alt=""> + <span class="actived">证据上传并归档</span> + </div> + <div :class="[activeStep > 0 ?'act-step-line':'step-line']"> + <span>>></span> + </div> + <div class="step-list-item"> + <img v-if="activeStep > 0" :src="actIdentifyImg" alt=""> + <img v-else :src="identifyImg" alt=""> + <span :class="[activeStep > 0 ?'actived':'']">证据识别并提取</span> + </div> + <div :class="[activeStep > 0 ?'act-step-line':'step-line']"> + <span>>></span> + </div> + <div class="step-list-item"> + <img v-if="activeStep > 1" :src="actUploadImg" alt=""> + <img v-else :src="uploadImg" alt=""> + <span :class="[activeStep > 1 ?'actived':'']">证据确认</span> </div> - <div class="submit-btn" @click="submit">内容核实</div> </div> - <EvidenceProofread v-if="status ==='2'" :file-list="fileList" /> + <UploadEvidence v-show="activeStep === 0" ref="UploadEvidenceRef" @save="saveOk" /> + <EvidenceExtract v-if="activeStep === 1" ref="EvidenceExtractRef" @save="saveOk" /> + <EvidenceConfirm v-if="activeStep === 2" ref="EvidenceConfirmRef" /> </div> </template> <script> import { baseURL } from '@/config' -import { getAccessToken } from '@/utils/accessToken' import { commonDownloadFile } from '@/api/config/uploadApi' import * as vuedraggable from 'vuedraggable' -import EvidenceProofread from './EvidenceProofread.vue' -import { submitOrcTask, retrieveTitle, retrieveTitleProcess } from '@/api/caseDetails/ocr' +import UploadEvidence from './components/UploadEvidence.vue' +import EvidenceExtract from './components/EvidenceExtract.vue' +import EvidenceConfirm from './components/EvidenceConfirm.vue' export default { name: 'AddEvidence', - components: { vuedraggable, EvidenceProofread }, + components: { vuedraggable, UploadEvidence, EvidenceExtract, EvidenceConfirm }, data() { return { fileList: [], + actRecordImg: require('@/assets/record/act_record.png'), + actIdentifyImg: require('@/assets/record/act_identify.png'), + actUploadImg: require('@/assets/record/act_upload.png'), + identifyImg: require('@/assets/record/identify.png'), + uploadImg: require('@/assets/record/upload.png'), + activeStep: 0, + recordId: '', status: '1', - loading: false, - // 上传配置 - uploadOption: { - action: `${baseURL}/minio/uploadFile`, - accept: '.bmp,.jpg,.png' - }, - interval: undefined, - token: getAccessToken() + interval: undefined } }, - beforeDestroy() { - clearInterval(this.interval) // 组件销毁前清除定时器 - }, mounted() { }, @@ -119,11 +67,7 @@ export default { return false } if (!isLt5M) { - this.$message.error('上传头像图片大小不能超过 5MB!') - return false - } - if (this.fileList >= 12) { - this.$message.error('上传文件数量不能超过12张!') + this.$message.error('上传图片大小不能超过 5MB!') return false } return true @@ -139,34 +83,13 @@ export default { this.fileList.push(obj) this.imgOcrIdentify(res.data) }, - // 图片识别 - imgOcrIdentify(id) { - submitOrcTask({ fileId: id }) - }, - // 查询进度 - queryProcess() { - const list = [] - this.fileList.forEach(e => { - list.push(e.fileId) - }) - retrieveTitleProcess(list).then(res => { - if (res.code === 200 && res.data === true) { - this.loading = false - this.status = '2' - clearInterval(this.interval) - } - }) + saveOk(val) { + this.activeStep += 1 + this.recordId = val + this.$route.query.recordId = val }, async submit() { - const list = [] - this.fileList.forEach(e => { - list.push(e.fileId) - }) - this.loading = true - const res = await retrieveTitle(list) - if (res.code === 200) { - this.interval = setInterval(this.queryProcess, 3000) - } + } } } @@ -174,184 +97,65 @@ export default { <style scoped lang="scss"> .AddEvidence { - display: flex; - background: #FFFFFF; - height: 100%; - - .no-upload-main { - - margin: auto 270px; - flex: 1; - border: 1px dashed #3763FF; - display: flex; - align-items: center; - justify-content: center; - height: calc(100vh - 400px); - .drag-content { - .upload-content { - position: relative; - display: flex; - align-items: center; - justify-content: center; - img { - width: 463px; - height:361px ; - } - .upload-content-main { - position: absolute; - top: 200px; - - display: flex; - flex-direction: column; - .title { - font-size: 20px; - color: #333333; - } - .desc { - font-size: 16px; - color: #999999; - margin-top: 12px; - } - } - - } - } - } - .handle-upload-main { + width: 100%; + height: 100%; + background: #fff; display: flex; flex-direction: column; - margin-top: 16px; - flex: 1; - // align-items: center; - justify-content: center; - height: calc(100vh - 330px); - padding: 0 26px; - .handle-drag-content { - height: 240px; - border: 1px dashed transparent; - background: linear-gradient(#fff,#fff) padding-box, - repeating-linear-gradient(-45deg,#3763FF 0, #3763FF 0.3em, #fff 0,#fff 0.6em); + .step-list { display: flex; - width: 100%; align-items: center; + width: 100%; justify-content: center; - margin-bottom: 16px; - ::v-deep { - .el-upload-dragger { - border: 0; - } - } - .upload-content-main { + padding-top: 36px; + margin-bottom: 32px; + .step-list-item { display: flex; - flex-direction: column; - justify-content: center; align-items: center; - .title { - font-size: 20px; - color: #333333; + span { + font-size: 20px; + color: #999999; + margin-left: 16px; + margin-right: 16px; } - .desc { - font-size: 16px; - color: #999999; - margin-top: 12px; + .actived { + color: #3763FF; } - .up-btn { - margin-left: 16px; - display: flex; - align-items: center; - justify-content: center; - width: 122px; - height: 42px; - background: #3763FF; - border-radius: 6px 6px 6px 6px; - cursor: pointer; - font-size: 16px; - color: #FFFFFF; - margin-top: 32px; - img { - width: 20px; - height: 20px; - margin-right: 6px; - } + } + .step-line { + width: 137px; + height: 2px; + border-top: 2px dashed #999999; + display: flex; + position: relative; + margin-right: 42px; + span { + position: absolute; + right: -24px; + top: -11px; + color: #999999; + font-size: 16px; } } + .act-step-line { + width: 137px; + height: 2px; + border-top: 2px dashed #3763FF; + display: flex; + position: relative; + margin-right: 42px; + span { + position: absolute; + right: -24px; + top: -11px; + color: #3763FF; + font-size: 16px; + } + } + img { + width: 36px; + height: 36px; + } } - .upload-list { - flex: 1; - width: 100%; - border: 1px dashed transparent; - background: linear-gradient(#fff,#fff) padding-box, - repeating-linear-gradient(-45deg,#3763FF 0, #3763FF 0.3em, #fff 0,#fff 0.6em); - .img_list { - display: flex; - flex-wrap: wrap; - padding: 24px 0 0 24px; - .img_item { - display: flex; - flex-direction: column; - margin-right: 16px; - margin-bottom: 16px; - position: relative; - .img_item_url { - width: 136px; - height: 190px; - border-radius: 6px 6px 6px 6px; - border: 1px solid #D1D3D6; - margin-bottom: 8px; - cursor: move; - } - span { - font-size: 16px; - color: #333333; - word-break: break-all; - } - .del { - position: absolute; - width: 24px; - height: 24px; - right: 8px; - top: 8px; - display: none; - cursor: pointer; - } - } - .img_item:hover { - .del { - display: block; - } - - } - } - } - .submit-btn { - position: absolute; - bottom: 16px; - right: 16px;width: 188px; - height: 48px; - background: #3763FF; - box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); - border-radius: 6px 6px 6px 6px;font-size: 16px; - color: #FFFFFF; - text-align: center; - line-height: 48px; - cursor: pointer; - } - } - ::v-deep { - .el-upload { - width: 100%; - } - .el-upload-dragger { - width: 100%; - height: 100%; - } - .el-steps--simple { - padding: 0; - background: none; - } - .el-step.is-simple .el-step__title { - font-size: 14px; - } - } } </style> diff --git a/src/views/caseDetails/components/CaseEvidence.vue b/src/views/caseDetails/components/CaseEvidence.vue index aa9d699..99245c6 100644 --- a/src/views/caseDetails/components/CaseEvidence.vue +++ b/src/views/caseDetails/components/CaseEvidence.vue @@ -2,16 +2,31 @@ <template> <div class="evidence-content"> <div class="evidence-tree"> - 11 + <el-tree + ref="tree" + node-key="id" + :data="treeData" + current-node-key="1" + :props="defaultProps" + highlight-current + default-expand-all + @node-click="handleNodeClick" + /> </div> <div class="evidence-main"> <div v-if="isEdit" class="flex-row" style="align-items: center; justify-content: space-between"> <div> <el-button type="primary" icon="el-icon-folder-add" @click="addFolder">新建文件夹</el-button> - <el-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAdd">添加证据</el-button> + <el-button type="primary" icon="el-icon-circle-plus-outline" @click="addEvidence">添加证据</el-button> </div> - <el-input v-model="searchName" placeholder="搜索名称" style="width: 300px" /> + <!-- <el-input v-model="searchName" placeholder="搜索名称" style="width: 300px" /> --> + </div> + <div class="nav-list"> + <div v-for="(item,index) in navList" :key="index" class="nav-item"> + <span>{{ item }}</span> + <span v-if="index !== navList.length -1">></span> + </div> </div> <vxe-grid v-bind="gridOptions" style="margin-top: 10px"> <template #opera="{row}"> @@ -28,7 +43,7 @@ /> </div> </div> - + <AddFolder ref="AddFolderRef" @addOk="getTreeList" /> <!--编辑/新增证据--> <!-- <edit-evidence ref="edit" @onClose="fetchData" /> --> <!--选择上传笔录方式--> @@ -40,12 +55,14 @@ import mixin from '@/views/mixin' import EditEvidence from '@/views/caseDetails/components/edit/EditEvidence.vue' +import AddFolder from './AddEvidence/AddFolder.vue' import { queryEvidenceList, deleteEvidence } from '@/api/caseDetails' import { debounce } from '@/utils' +import { getCaseEvidenceFileTree, getCaseEvidenceDirectoryList } from '@/api/caseDetails/evidence' import SelectUploadType from './SelectUploadType.vue' export default { name: 'CaseEvidence', - components: { EditEvidence, SelectUploadType }, + components: { EditEvidence, SelectUploadType, AddFolder }, mixins: [mixin], props: { // 是否编辑 @@ -73,6 +90,13 @@ export default { { title: '操作', slots: { default: 'opera' }, fixed: 'right', width: '100px' } ], data: [{}] + }, + treeData: [], + selectId: '', + navList: ['全部'], + defaultProps: { + children: 'child', + label: 'directoryName' } } }, @@ -80,7 +104,7 @@ export default { isExpand: { handler: function(newVal, oldVal) { if (newVal !== oldVal) { - this.tableHeight(this.isExpand ? this.isEdit ? 580 : 530 : this.isEdit ? 400 : 320) + this.tableHeight(this.isExpand ? this.isEdit ? 630 : 580 : this.isEdit ? 450 : 370) } }, immediate: true @@ -92,8 +116,9 @@ export default { mounted() { this.caseId = this.$route.params.id this.$nextTick(() => { - this.tableHeight(this.isExpand ? (this.isEdit ? 580 : 530) : (this.isEdit ? 400 : 320)) + this.tableHeight(this.isExpand ? (this.isEdit ? 630 : 580) : (this.isEdit ? 450 : 370)) }) + this.getTreeList() this.fetchData() }, methods: { @@ -102,7 +127,11 @@ export default { _this.fetchData() }), addFolder() { - + this.$refs.AddFolderRef.show() + }, + // 添加证据 + addEvidence() { + this.$router.push({ path: `/add-evidence/${this.caseId}`, query: { caseName: this.$route.params.caseName, caseNo: this.$route.query.caseNo }}) }, // 获取数据 fetchData() { @@ -110,13 +139,49 @@ export default { caseId: this.caseId, evidenceName: this.searchName, pageNum: this.queryForm.page, - pageSize: this.queryForm.size + pageSize: this.queryForm.size, + directoryId: this.selectId === '1' ? '' : this.selectId } queryEvidenceList(params).then(res => { this.gridOptions.data = res.data.records this.queryForm.total = res.data.total }) }, + // 查询左侧树 + getTreeList() { + getCaseEvidenceFileTree({ caseId: this.caseId }).then(res => { + if (res.code === 200) { + this.treeData = res.data + this.treeData.unshift({ + directoryName: '全部', + id: '1' + }) + // this.$refs.tree.setCurrentKey(this.treeData[0].id) + } + }) + }, + getParentNames(node, treeData, parentNames = []) { + // 找到节点的直接父节点 + const parent = treeData.find(parentNode => + parentNode.child && parentNode.child.some(child => child.id === node.id) + ) + + // 如果找到父节点,将其名称添加到数组中,并递归检查更上层的父节点 + if (parent) { + parentNames.push(parent.directoryName) + return this.getParentNames(parent, treeData, parentNames) + } + + // 如果没有找到更上层的父节点,返回所有父节点的名称 + return parentNames + }, + handleNodeClick(data) { + this.selectId = data.id + this.navList = [] + this.navList = this.getParentNames(data, this.treeData) + this.navList.push(data.directoryName) + this.fetchData() + }, // 添加证据 handleAdd() { // this.$refs.edit.show() @@ -151,10 +216,42 @@ export default { .evidence-content { display: flex; .evidence-tree { - width: 200px; + width: 210px; + margin-right: 16px; + background: #F9FAFB; + ::v-deep { + .el-tree { + background: #F9FAFB; + .el-tree-node { + // height: 40px; + font-size: 16px; + color: #333333; + } + .el-tree-node__content { + height: 40px; + } + .el-tree-node.is-current > .el-tree-node__content { + background: #dce3ed; + color: #666666; + } + } + } } .evidence-main { flex: 1; } + .nav-list { + display: flex; + font-size: 16px; + color: #333333; + margin-bottom: 16px; + margin-top: 24px; + .nav-item { + display: flex; + span { + margin-right: 16px; + } + } + } } </style> diff --git a/src/views/caseDetails/components/EditEvidence/index.vue b/src/views/caseDetails/components/EditEvidence/index.vue index 995da0e..b4c0293 100644 --- a/src/views/caseDetails/components/EditEvidence/index.vue +++ b/src/views/caseDetails/components/EditEvidence/index.vue @@ -1,101 +1,32 @@ <template> <div class="EditEvidence"> - <div class="EvidenceProofread"> - <div class="FormInfo"> - <el-form ref="form" :model="dataInfo" :rules="rules" label-width="100px" style="margin-top: 10px"> - <el-row :gutter="10" class="form-content"> - <el-col :span="24"> - <el-form-item label="案件编号"> - <span>{{ caseNo }}</span> - </el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="案件名称"> - <span>{{ caseName }}</span> - </el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="证据名称" prop="evidenceName"> - <el-input v-model="dataInfo['evidenceName']" placeholder="请输入证据名称" /> - </el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="证据类型" prop="evidenceType"> - <el-select v-model="dataInfo['evidenceType']" style="width: 100%" placeholder="请选择证据类型"> - <el-option - v-for="item in evidenceTypeList" - :key="item.value" - :value="item.value" - :label="item.label" - /> - </el-select></el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="提供人" prop="provider"> - <el-input v-model="dataInfo.property['provider']" placeholder="请输入提供人" /> - </el-form-item> - </el-col> - <div class="expand" @click="handleExpand"> - <span v-show="isExpand">收起</span> - <span v-show="!isExpand">展开</span> - <img v-show="isExpand" :src="expandImg" alt=""> - - <img v-show="!isExpand" :src="unExpandImg" alt=""> - <span class="line" /> - </div> - <div v-show="isExpand"> - <el-col :span="24"> - <el-form-item label="受害人" prop="victim"> - <el-input v-model="dataInfo.property['victim']" placeholder="请输入受害人名称" /> - </el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="合同标的物" prop="contractSubject"> - <el-input v-model="dataInfo.property['contractSubject']" placeholder="请输入合同标的物" /> - </el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="合同签订时间" prop="contractSignTime"> - <el-date-picker - v-model="dataInfo.property['contractSignTime']" - type="datetime" - format="yyyy-MM-dd HH:MM:ss" - value-format="yyyy-MM-dd HH:MM:ss" - placeholder="请选择合同签订时间" - style="width: 100%" - /> - </el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="金额" prop="amount"> - <el-input v-model="dataInfo.property['amount']" type="number" placeholder="请输入金额" /> - </el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="证据结果" prop="evidenceResult"> - <el-input v-model="dataInfo.property['evidenceResult']" placeholder="请输入证据结果" /> - </el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="其他" prop="otherDesc"> - <el-input - v-model="dataInfo.property.otherDesc" - row - type="textarea" - /> - </el-form-item> - </el-col> - </div> - - </el-row> - </el-form> + <div class="header"> + <div class="title"> + <span>{{ `案件名称:${caseName}` }}</span> + <span>{{ `案件编号:${caseNo}` }}</span> </div> - <div class="proofread-content"> + </div> + <div class="proofread-content"> + <div class="mid-content"> <div class="left"> - <div class="show-img"> - <img :src="activedImg" alt=""> - </div> + <el-scrollbar v-if="selectList.length > 0" class="left-scroll"> + <vuedraggable v-model="selectList" animation="400" class="img_list"> + <div v-for="(item,index) in selectList" :key="index" :class="[item.fileId === selectInfo.fileId?'actived':'']"> + <img v-if="['jpg', 'png'].includes(item.fileType)" class="img_item" :src="getImgUrl(item.fileId)" @click="selectItem(item)"> + + </img> + <svg-icon v-if="[ 'doc', 'docx'].includes(item.fileType)" class="svg-img" icon-class="docx" /> + </div> + </vuedraggable> + </el-scrollbar> + <div v-if="selectList.length > 0 && ['jpg', 'png'].includes(selectInfo.fileType)" class="act_img"> + <img v-if="selectInfo.fileId" :src="getImgUrl(selectInfo.fileId)" alt=""> + </div> + <div v-if="selectList.length === 0" class="empty-content"> + <img src="@/assets/caseManagement/empty.png" alt=""> + <span>暂无本次证据材料</span> + </div> <span class="boder1" /> <span class="boder2" /> <span class="boder3" /> @@ -104,8 +35,7 @@ <div class="right"> <div class="title">识别结果</div> <el-input - v-model="dataInfo.ocrText" - readonly + v-model="selectInfo.ocrText" class="right-text" type="textarea" /> @@ -115,11 +45,30 @@ <span class="boder4" /> </div> </div> - <div class="footer-btns"> - <div class="reset_btn" @click="reset">重置</div> - <div class="btn" @click="submit">确认并提交</div> + <div class="FormInfo"> + <el-form ref="form" :model="selectInfo" :rules="rules" label-width="100px" style="margin-top: 10px"> + <el-row :gutter="10" class="form-content"> + <el-col :span="24"> + <el-form-item label="证据名称" prop="title"> + <el-input v-model="selectInfo.evidenceInfo.title" placeholder="请输入证据名称" /> + </el-form-item> + </el-col> + </el-row> + + <el-row v-if="selectInfo.evidenceInfo.property" :gutter="10" class="form-content"> + <el-col v-for="(item,index) in selectInfo.evidenceInfo.property" :key="index" :span="24"> + <el-form-item :label="item.attrName"> + <el-input v-if="item.attrValueType ==='text'" v-model="item.attrValue" placeholder="请输入" /> + </el-form-item> + </el-col> + </el-row> + </el-form> </div> </div> + <div class="footer-btns"> + <div class="btn" @click="submit">确认并提交</div> + <div class="reset_btn" @click="reset">重置</div> + </div> </div> </template> @@ -127,249 +76,375 @@ import * as vuedraggable from 'vuedraggable' import { baseURL } from '@/config' import { commonDownloadFile } from '@/api/config/uploadApi' -import { queryEvidenceInfo, updateEvidence } from '@/api/caseDetails/ocr' +import { ocrAndExtractDetails, caseEvidenceVerify } from '@/api/caseDetails/evidence' export default { - name: 'EvidenceProofread', + name: 'EditEvidence', components: { vuedraggable }, data() { return { - dataList: [], - isExpand: true, - rules: { - evidenceName: [{ required: true, message: '证据名称不能为空!', trigger: 'blur' }], - evidenceType: [{ required: true, message: '证据类型不能为空!', trigger: 'blur' }] - }, - // 证据类型 - evidenceTypeList: JSON.parse(sessionStorage.getItem('evidence_type')), - expandImg: require('@/assets/record/expand.png'), - unExpandImg: require('@/assets/record/unExpand.png'), + selectList: [], + activedImg: '', caseNo: '', caseName: '', - dataInfo: { - fileId: '', - ocrText: '', - property: {} + dataInfo: {}, + // 证据类型 + evidenceTypeList: JSON.parse(sessionStorage.getItem('evidence_type')), + rules: { + title: [{ required: true, message: '证据名称不能为空!', trigger: 'blur' }] }, - activedImg: '' + flag: true, + treeData: [], + selectInfo: { + evidenceInfo: { + property: [], + title: '' + }, + ocrText: '' + } } }, mounted() { + this.getTreeList() this.caseNo = this.$route.query.caseNo this.caseName = this.$route.query.caseName - this.getData() }, methods: { getImgUrl(id) { return `${baseURL}${commonDownloadFile}${id}` }, - handleExpand() { - this.isExpand = !this.isExpand - }, - getData() { - queryEvidenceInfo({ evidenceId: this.$route.query.evidenceId }).then(res => { - this.dataInfo = res.data - this.dataInfo.fileId = res.data.fileList[0].fileId - this.dataInfo.ocrText = res.data.fileList[0].ocrText - this.activedImg = `${baseURL}${commonDownloadFile}${this.dataInfo.fileId}` - }) + selectItem(item) { + this.selectInfo = item + this.activedImg = `${baseURL}${commonDownloadFile}${this.selectInfo.fileId}` }, reset() { - this.getData() + this.getTreeList() }, - submit() { - const loading = this.$baseLoading(1, '保存中...') - this.dataInfo.caseId = this.$route.params.id - this.dataInfo.fileIdList = [this.dataInfo.fileList[0].fileId] - updateEvidence(this.dataInfo).then(res => { - loading.close() + getTreeList() { + ocrAndExtractDetails({ caseId: this.$route.params.id, evidenceId: this.$route.query.evidenceId }).then(res => { if (res.code === 200) { - this.$store.dispatch( - 'tabsBar/delRoute', - this.$route - ) - this.$router.push({ path: `/case-details/${this.$route.params.id}/${this.$route.query.caseName}`, query: { currentKey: '1-2', isEdit: 1 }}) + this.treeData = res.data + this.$nextTick(() => { + this.handleNodeClick(res.data[0]) + }) } }) + }, + findNodeById(nodes, id) { + for (const node of nodes) { + if (node.id === id) { + return node + } else if (node.child) { + const foundNode = this.findNodeById(node.child, id) + if (foundNode) { + return foundNode + } + } + } + return null + }, + // 获取有文件的list + getFileList(nodes) { + for (const node of nodes) { + if (node.fileInfoList.length > 0) { + return node + } else if (node.child) { + const foundNode = this.getFileList(node.child) + if (foundNode) { + return foundNode + } + } + } + return null + }, + handleNodeClick(data) { + this.selectId = data.id + const nodeItem = this.findNodeById(this.treeData, this.selectId) + if (nodeItem.fileInfoList.length === 0) { + const newNodeItem = this.getFileList(nodeItem.child) + this.selectList = newNodeItem.fileInfoList + this.selectId = newNodeItem.id + this.selectInfo = this.selectList[0] + } else { + this.selectList = nodeItem.fileInfoList + this.selectInfo = this.selectList[0] + this.selectId = nodeItem.id + } + console.log('111', this.selectList, this.selectInfo) + }, + checkEvidence(nodes) { + for (const item of nodes) { + if (item.fileInfoList.length > 0) { + for (let i = 0; i < item.fileInfoList.length; i++) { + if (!item.fileInfoList[i].evidenceInfo.title) { + this.handleNodeClick(item) + this.selectItem(item.fileInfoList[i]) + this.flag = false + break + } + } + } else if (item.child) { + this.checkEvidence(item.child) + } + } + }, + save() { + this.checkEvidence(this.treeData) + if (this.flag) { + caseEvidenceVerify({ + batchNo: this.$route.query.recordId, + caseId: this.$route.params.id, + evidenceDirectoryList: this.treeData + }).then(res => { + if (res.code === 200) { + this.$baseMessage.success(res.msg || '保存成功!') + this.$store.dispatch( + 'tabsBar/delRoute', + this.$route + ) + this.$router.push({ path: `/case-details/${this.$route.params.id}/${this.$route.query.caseName}`, query: { isEdit: 1, caseNo: this.$route.query.caseNo }}) + } + }) + } else { + this.$baseMessage.error('证据不能为空!') + } + }, + submit() { + this.save() } } } </script> -<style lang="scss" scoped> -.EditEvidence { - display: flex; - background: #FFFFFF; - height: 100%; - .EvidenceProofread { - display: flex; - margin: 24px; - width: 100%; - .FormInfo { - width: 470px; - background: #F6F8F9; - border-radius: 8px 8px 8px 8px; - // height: calc(100vh - 350px); - padding: 0 24px; - margin-bottom: 72px; - .expand { + <style lang="scss" scoped> + .EditEvidence { display: flex; - flex-direction: row-reverse; padding: 0 24px; - align-items: center; - cursor: pointer; - margin-bottom: 16px; - img { - width: 18px; - height: 18px; - margin-right: 8px; - } - .line { - flex: 1; - height: 1px; - background: #E9E9E9; - margin-right: 8px; - } + flex-direction: column; + background: #fff; + height: 100%; + :deep(.el-scrollbar__wrap) { + overflow-x: hidden; + } - } - :deep(.el-scrollbar__wrap) { - overflow-x: hidden; - } - .proofread-content { - flex: 1; - margin-left: 18px; - display: flex; - margin-bottom: 72px; - .left { - width: 55%; - margin-right: 24px; - position: relative; - // background: #F6F8F9; - border: 1px solid #DCE3EB; - display: flex; - padding: 8px; - .show-img { - padding: 16px 28px; - flex: 1; - background: #F6F8F9; - img { - width: 100%; - height: 100%; + .proofread-content { + flex: 1; + margin-left: 18px; + display: flex; + + .mid-content { + display: flex; + flex: 1; + .left { + + margin-right: 24px; + position: relative; + // background: #F6F8F9; + border: 1px solid #DCE3EB; + display: flex; + padding: 8px; + .empty-content { + flex: 1; + padding: 24px; + display: flex; + margin-top: 16px; + flex-direction: column; + display: flex; + justify-content: center; + align-items: center;font-size: 16px; + color: #333333; + img { + width: 200px; + height: 200px; + } + } + .left-scroll { + background: #F6F8F9; + width: 150px; + margin-right: 14px; + } + .act_img { + padding: 16px 28px; + flex: 1; + background: #F6F8F9; + height: calc(100vh - 420px); background-size: 100% 100%; + display: flex; + align-items: center; + justify-content: center; + img { + height: 100%; + } + } + .svg-img { + width: 98px; + height: 138px; + // margin-bottom: 16px; + border-radius: 6px 6px 6px 6px; + border: 1px solid #D1D3D6; + cursor: move; + } + .actived { + border: 2px solid #3763FF !important; + } } - } - } - .right { - width: 45%; - position: relative; - border: 1px solid #DCE3EB; - display: flex; - padding: 8px; - flex-direction: column; - .title { - background: #F6F8F9; - border-bottom: 1px solid #DCE3EB; - height: 70px; - padding-left: 24px; - line-height: 70px; - font-weight: bold; - font-size: 18px; - color: #333333; - width: 100%; - } - ::v-deep .el-textarea__inner { - height: calc(100vh - 450px); - border: none; - box-shadow: none; + .right { + flex: 1; + position: relative; + border: 1px solid #DCE3EB; + display: flex; + padding: 8px; + flex-direction: column; + .title { + background: #F6F8F9; + border-bottom: 1px solid #DCE3EB; + height: 70px; + padding-left: 24px; + line-height: 70px; + font-weight: bold; + font-size: 18px; + color: #333333; + } + .right-text { + width: 100%; + height: 500px; + } } - } - .img_list { - display: flex; - flex-direction: column; - align-items: center; - padding-top: 25px; - overflow-x: hidden; - padding: 24px; + } + .FormInfo { + width: 410px; background: #F6F8F9; - .img_item { - width: 98px; - height: 138px; - margin-bottom: 16px; - border-radius: 6px 6px 6px 6px; - border: 1px solid #D1D3D6; - cursor: pointer; + border-radius: 8px 8px 8px 8px; + margin-left: 24px; + // height: calc(100vh - 350px); + padding: 0 24px; + margin-bottom: 72px; + .expand { + display: flex; + flex-direction: row-reverse; + padding: 0 24px; + align-items: center; + cursor: pointer; + margin-bottom: 16px; + img { + width: 18px; + height: 18px; + margin-right: 8px; + } + .line { + flex: 1; + height: 1px; + background: #E9E9E9; + margin-right: 8px; + } } } - .boder1 { - position: absolute; - width: 15px; - height: 15px; - left: 0; - top: 0; - border-top: 2px solid #2073FF; - border-left: 2px solid #2073FF; - } - .boder2 { - position: absolute; - width: 15px; - height: 15px; - right: 0; - top: 0; - border-top: 2px solid #2073FF; - border-right: 2px solid #2073FF; + .img_list { + display: flex; + flex-direction: column; + align-items: center; + padding-top: 25px; + overflow-x: hidden; + padding: 24px; + background: #F6F8F9; + .img_item { + width: 98px; + height: 138px; + // margin-bottom: 16px; + border-radius: 6px 6px 6px 6px; + border: 1px solid #D1D3D6; + cursor: move; + } + } + .boder1 { + position: absolute; + width: 15px; + height: 15px; + left: 0; + top: 0; + border-top: 2px solid #2073FF; + border-left: 2px solid #2073FF; + } + .boder2 { + position: absolute; + width: 15px; + height: 15px; + right: 0; + top: 0; + border-top: 2px solid #2073FF; + border-right: 2px solid #2073FF; + } + .boder3 { + position: absolute; + width: 15px; + height: 15px; + left: 0; + bottom: 0; + border-bottom: 2px solid #2073FF; + border-left: 2px solid #2073FF; + } + .boder4 { + position: absolute; + width: 15px; + height: 15px; + right: 0; + bottom: 0; + border-bottom: 2px solid #2073FF; + border-right: 2px solid #2073FF; + } } - .boder3 { - position: absolute; - width: 15px; - height: 15px; - left: 0; - bottom: 0; - border-bottom: 2px solid #2073FF; - border-left: 2px solid #2073FF; + .header { + display: flex; + justify-content: space-between; + padding-top: 24px; + .title { + // display: flex; + text-align: right;font-size: 16px; + color: #333333; + margin-bottom: 24px; + span { + margin-left: 32px; + } + } } - .boder4 { - position: absolute; - width: 15px; - height: 15px; - right: 0; - bottom: 0; - border-bottom: 2px solid #2073FF; - border-right: 2px solid #2073FF; + .footer-btns { + padding-top: 24px; + height: 68px; + display: flex; + flex-direction: row-reverse; + .btn { + width: 188px; + height: 48px; + background: #3763FF; + box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); + border-radius: 6px 6px 6px 6px; + text-align: center; + line-height: 48px; + font-size: 16px; + color: #FFFFFF; + cursor: pointer; + margin-left: 24px; + } + .reset_btn { + width: 188px; + height: 48px; + background: #FFFFFF; + box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); + border-radius: 6px 6px 6px 6px; + border: 1px solid #3763FF; + text-align: center; + line-height: 48px; + font-size: 16px; + color: #3763FF; + cursor: pointer; + margin-left: 24px; + } } } - .footer-btns { - position: absolute; - right: 24px; - bottom: 24px; - display: flex; - .btn { - width: 188px; - height: 48px; - background: #3763FF; - box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); - border-radius: 6px 6px 6px 6px; - text-align: center; - line-height: 48px; - font-size: 16px; - color: #FFFFFF; - cursor: pointer; - margin-left: 24px; - } - .reset_btn { - width: 188px; - height: 48px; - background: #FFFFFF; - box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); - border-radius: 6px 6px 6px 6px; - border: 1px solid #3763FF; - text-align: center; - line-height: 48px; - font-size: 16px; - color: #3763FF; - cursor: pointer; - margin-left: 24px; - } - } -} -} - -</style> + </style> + <style lang="scss" scoped> + ::v-deep .el-textarea__inner { + height: calc(100vh - 450px); + border: none; + box-shadow: none; + } + </style> diff --git a/src/views/caseDetails/components/edit/EditEvidence.vue b/src/views/caseDetails/components/edit/EditEvidence.vue index 1c5ff8a..3076cde 100644 --- a/src/views/caseDetails/components/edit/EditEvidence.vue +++ b/src/views/caseDetails/components/edit/EditEvidence.vue @@ -146,7 +146,6 @@ export default { const loading = this.$baseLoading(1, '保存中...') this.$refs.form.validate(valid => { if (valid) { - const params = { ...this.evidenceForm, caseId: this.$route.params.id diff --git a/src/views/caseDetails/index.vue b/src/views/caseDetails/index.vue index b9e5dd9..82ecbb8 100644 --- a/src/views/caseDetails/index.vue +++ b/src/views/caseDetails/index.vue @@ -334,6 +334,53 @@ export default { height: 100%; color: #333333; box-sizing: border-box; + .info-left { + ::v-deep { + .el-descriptions__body { + background: none; + } + .el-tree-node__content { + background: linear-gradient( 90deg, rgba(69, 105, 255, .1) 0%, #FFFFFF 100%); + border-radius: 5px; + height: 35px; + line-height: 35px; + margin-bottom: 10px; + .el-tree-node__expand-icon { + padding: 6px; + } + } + .el-tree-node__children{ + margin-left: 10px; + border-left: 1px solid rgba(51, 51, 51, 0.20); + } + .el-tree-node__children .el-tree-node__content { + background: #FFFFFF; + padding-left: 0 !important; + margin-left: 8px; + } + .el-tree-node__children .el-tree-node__content .el-tree-node__expand-icon { + padding: 0; + } + .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content { + background: #3763FF; + color: white; + } + .el-descriptions-item__label { + font-weight: 400; + font-size: 16px; + color: #666666; + } + .el-descriptions-item__content { + font-weight: 400; + font-size: 16px; + color: #333333; + } + .el-descriptions--small:not(.is-bordered) .el-descriptions-item__cell { + padding-bottom: 16px !important; + } +} + } + .details-header { padding: 10px; box-sizing: border-box; @@ -471,32 +518,6 @@ export default { .el-descriptions__body { background: none; } - .el-tree-node__content { - background: linear-gradient( 90deg, rgba(69, 105, 255, .1) 0%, #FFFFFF 100%); - border-radius: 5px; - height: 35px; - line-height: 35px; - margin-bottom: 10px; - .el-tree-node__expand-icon { - padding: 6px; - } - } - .el-tree-node__children{ - margin-left: 10px; - border-left: 1px solid rgba(51, 51, 51, 0.20); - } - .el-tree-node__children .el-tree-node__content { - background: #FFFFFF; - padding-left: 0 !important; - margin-left: 8px; - } - .el-tree-node__children .el-tree-node__content .el-tree-node__expand-icon { - padding: 0; - } - .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content { - background: #3763FF; - color: white; - } .el-descriptions-item__label { font-weight: 400; font-size: 16px; diff --git a/src/views/promptManagement/PromptConfig/add/PromptDebug.vue b/src/views/promptManagement/PromptConfig/add/PromptDebug.vue new file mode 100644 index 0000000..afed1c8 --- /dev/null +++ b/src/views/promptManagement/PromptConfig/add/PromptDebug.vue @@ -0,0 +1,182 @@ + +<template> + <cs-drawer + :drawer-option="drawerOption" + > + <div slot="content" class="PromptDebug"> + <div class="left"> + <div class="title">识别结果预览</div> + <div class="left-content"> + <div class="top">证据模板:买卖合同</div> + <!-- <div class="empty"> + <img src="@/assets/common/file_empty.png" alt=""> + <span>暂无结果,请在右侧输入调试内容或上传文档</span> + </div> --> + </div> + </div> + <div class="right"> + <div class="right-item"> + <span>调试内容</span> + <el-input + v-model="textarea" + type="textarea" + :rows="8" + placeholder="请输入" + /> + </div> + <div class="right-item"> + <span>选择文件</span> + <el-upload + :headers="{ + token: token + }" + :action="uploadOption.action" + :accept="uploadOption.accept" + :data="{ + temp: true + }" + :on-success="handleSuccess" + :before-upload="beforeUpload" + > + <div class="up-btn"> + 请选择文件 + </div> + <div class="desc">支持上传扩展名为txt、doc、docx文件,且仅限一份文件</div> + </el-upload> + </div> + </div> + </div> + </cs-drawer> +</template> + +<script> +import { baseURL } from '@/config' +import { getAccessToken } from '@/utils/accessToken' +export default { + name: 'PromptDebug', + data() { + return { + drawerOption: { + show: false, + title: '提示词调试', + width: '1200px', + hiddenFooter: true + }, + textarea: '', + // 上传配置 + uploadOption: { + action: `${baseURL}/minio/uploadFile`, + accept: '.txt,.doc,.docx' + }, + token: getAccessToken(), + fileId: '', + fileList: [], + dataInfo: undefined + } + }, + methods: { + show(data) { + this.drawerOption.show = true + this.dataInfo = data + }, + beforeUpload(file) { + const isLt5M = file.size / 1024 / 1024 < 5 + const filename = file.name + const postfix = filename.substring(filename.lastIndexOf('.')) + if (!['.txt', '.doc', '.docx'].includes(postfix)) { + this.$message.error('上传图片只能是 txt,doc,docx 格式!') + return false + } + if (!isLt5M) { + this.$message.error('上传头像图片大小不能超过 5MB!') + return false + } + return true + }, + handleSuccess(res, file) { + this.fileId = res.data + // const obj = { + // name: file.name, + // fileId: res.data + // } + // this.fileList.push(obj) + // this.imgOcrIdentify(res.data) + } + } +} +</script> + +<style scoped lang="scss"> +.PromptDebug { + display: flex; + padding: 16px; + overflow: auto; + .left { + width: 50%; + + .title { + font-size: 18px; + color: #333333; + margin-bottom: 16px; + } + .left-content { + border-radius: 6px 6px 6px 6px; + border: 1px solid #D9D9D9; + width: 100%; + height: calc(100vh - 300px); + .empty { + margin: 260px auto; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + img { + width: 200px; + height: 200px; + } + span { + font-size: 16px; + color: #333333; + } + } + .top { + height: 53px; + background: #F2F6FA;font-size: 16px; + color: #888888; + line-height: 53px; + padding-left: 24px; + } + } + } + .right { + margin-left: 32px; + flex: 1; + .right-item { + display: flex; + flex-direction: column; + margin-top: 24px; + span { + font-size: 16px; + color: #333333; + margin-bottom: 16px; + } + .up-btn { + width: 128px; + height: 42px; + background: #FFFFFF; + border-radius: 6px 6px 6px 6px; + border: 1px solid #3763FF; + line-height: 42px; + font-size: 16px; + color: #3763FF; + cursor: pointer; + } + .desc { + font-size: 16px; + color: #B4B4B4; + margin-top: 16px; + } + } + } +} +</style> diff --git a/src/views/promptManagement/PromptConfig/add/PromptInput.vue b/src/views/promptManagement/PromptConfig/add/PromptInput.vue new file mode 100644 index 0000000..f9374de --- /dev/null +++ b/src/views/promptManagement/PromptConfig/add/PromptInput.vue @@ -0,0 +1,831 @@ +<template> + <div class="custom-at-box"> + <div class="custom-textarea-box"> + <div + ref="customInput" + :class="[ + 'custom-textarea custom-scroll', + { 'show-word-limit': showWordLimit && maxlength }, + { 'custom-textarea-disabled': disabled }, + ]" + :contenteditable="!disabled" + :placeholder="placeholder" + @input="onInput($event)" + @keydown="onKeyDownInput($event)" + @paste="onPaste($event)" + @copy="onCopy($event)" + @click="showList(false)" + /> + <div v-if="showWordLimit && maxlength" class="custom-at-limit"> + {{ inputValueLen }}/{{ maxlength }} + </div> + </div> + <div :key="`customInput${taskPanelIsInFullScreen}`"> + <el-popover + ref="popoverRef" + v-model="showPopover" + trigger="click" + class="custom-select-box" + :append-to-body="taskPanelPopoverAppendToBody" + :style="{ top: popoverOffset + 'px' }" + @hide="hidePoppver" + > + <div + ref="customSelectContent" + class="custom-select-content custom-scroll" + > + + <div + v-for="(item, index) in dataList" + + :key="index" + :class="[ + 'custom-select-item', + { hoverItem: selectedIndex === index }, + ]" + @click="handleClickOperatorItem(item)" + > + <div class="custom-select-item-content"> + {{ item.name }} + </div> + </div> + </div> + </el-popover> + </div> + </div> +</template> +<script> +import Vue from 'vue' + +export default { + props: { + // 输入框placeholder + placeholder: { + type: String, + default: '请输入...' + }, + // 是否显示输入字数统计 + showWordLimit: { + type: Boolean, + default: false + }, + // 是否禁用 + disabled: { + type: Boolean, + default: false + }, + // 最大输入长度 + maxlength: { + type: [Number, String], + default: '3000' + }, + setRefresh: { + type: Object, + default: () => {} + }, + // 输入框输入的内容 + value: { + type: String, + default: '' + } + }, + data() { + return { + // 已输入内容的长度 + inputValueLen: 0, + top: '', + left: '', + message: '', + startOffset: 0, + // @搜索人dom + searSpan: null, + // 筛选人数据 + dataList: [ + { + name: 'xxxx' + }, + { + name: 'dddd' + } + ], + // @插入位置 + selectionIndex: 0, + // 当前编辑的dom + dom: null, + // 当前编辑dom的index + domIndex: 0, + // 当前编辑dom的childNodes的index + childDomIndex: 0, + // 编辑前dom内容 + beforeDomVal: '', + // 筛选人选择框 + showPopover: false, + // 筛选人选择框偏移量 + popoverOffset: 0, + listInput: false, + listInputValue: '', + // 防抖 + timer: null, + // 保存弹窗加载状态 + addDataLoad: false, + + // 鼠标选择人的索引 + selectedIndex: 0 + } + }, + computed: { + // 计算属性,用于同步父组件的数据 + model: { + get() { + return this.value + }, + set(newValue) { + this.$emit('input', newValue) + if (this.$refs.customInput) { + this.$emit('inputText', this.$refs.customInput.textContent) + } + const nodeList = this.$refs.customInput.childNodes + const list = [] + nodeList.forEach((e) => { + if (e.childNodes) { + e.childNodes.forEach(i => { + if (i.className === 'active-text') { + list.push({ + jobNumber: i.getAttribute('data-id'), + name: i.textContent.replace(/{/g, '').replace(/\s/g, '') + }) + } + }) + } + if (e.className === 'active-text') { + list.push({ + jobNumber: e.getAttribute('data-id'), + name: e.textContent.replace(/{/g, '').replace(/\s/g, '') + }) + } + }) + this.$emit('changeChosen', list) + } + }, + taskPanelIsInFullScreen() { + return this.$store.getters.taskPanelIsInFullScreen + }, + taskPanelPopoverAppendToBody() { + return this.$store.getters.taskPanelPopoverAppendToBody + } + }, + mounted() { + this.setNativeInputValue() + }, + methods: { + // 设置输入框的值 + setNativeInputValue() { + if (this.$refs.customInput) { + if (this.value === this.$refs.customInput.innerHTML) return + this.$refs.customInput.innerHTML = this.value + this.inputValueLen = this.$refs.customInput.innerText.length + } + }, + // 筛选人弹窗数据选择 + handleClickOperatorItem(item) { + this.addData(JSON.parse(JSON.stringify(item))) + this.$refs.customSelectContent.scrollTop = 0 + this.selectedIndex = 0 + this.showPopover = false + this.listInput = false + this.listInputValue = '' + }, + // 艾特人弹窗关闭 + hidePoppver() { + this.$refs.customSelectContent.scrollTop = 0 + this.selectedIndex = 0 + this.showPopover = false + this.listInput = false + this.listInputValue = '' + }, + // 创建艾特需要插入的元素 + createAtDom(item) { + // 先判断剩余输入长度是否能够完整插入元素 + const dom = document.createElement('span') + + dom.classList.add('active-text') + // 这里的contenteditable属性设置为false,删除时可以整块删除 + dom.setAttribute('contenteditable', 'false') + // 将id存储在dom元素的标签上,便于后续数据处理 + dom.setAttribute('data-id', item.name) + + dom.innerHTML = `{${item.name}} ` + + return dom + }, + // 插入元素 + addData(item) { + const spanElement = this.createAtDom(item) + + const maxlength = Number(this.maxlength) || 3000 + // 因为插入后需要删除之前输入的@,所以判断长度时需要减去这个1 + if (maxlength - this.inputValueLen < spanElement.innerText.length - 1) { + this.$message('剩余字数不足') + return + } + this.$refs.customInput.focus() + + // 获取当前光标位置的范围 + const selection = window.getSelection() + const range = selection.getRangeAt(0) + + // 找到要插入的节点 + const nodes = Array.from(this.$refs.customInput.childNodes) + let insertNode = '' + // 是否是子元素 + let domIsCustomInputChild = true + if (nodes[this.domIndex].nodeType === Node.TEXT_NODE) { + insertNode = nodes[this.domIndex] + } else { + const childNodeList = nodes[this.domIndex].childNodes + insertNode = childNodeList[this.childDomIndex] + domIsCustomInputChild = false + } + + // 如果前一个节点是空的文本节点,@用户无法删除 + // 添加判断条件:如果前一个节点是空的文本节点,则插入一个空的<span>节点 + const html = insertNode.textContent + // 左边的节点 + const textLeft = document.createTextNode( + html.substring(0, this.selectionIndex - 1) + '' + ) + const emptySpan = document.createElement('span') + + // 如果找到了要插入的节点,则在其前面插入新节点 + if (insertNode) { + if (!textLeft.textContent) { + if (domIsCustomInputChild) { + this.$refs.customInput.insertBefore(emptySpan, insertNode) + } else { + nodes[this.domIndex].insertBefore(emptySpan, insertNode) + } + } + insertNode.parentNode.insertBefore(spanElement, insertNode.nextSibling) + // 删除多余的@以及搜索条件 + const textContent = insertNode.textContent.slice( + 0, + -(1 + this.listInputValue.length) + ) + if (!textContent && insertNode.nodeName === '#text') { + insertNode.remove() + } else { + insertNode.textContent = textContent + } + } else { + // 如果未找到要插入的节点,则将新节点直接追加到末尾 + this.$refs.customInput.appendChild(spanElement) + } + + // 将光标移动到 span 元素之后 + const nextNode = spanElement.nextSibling + range.setStart( + nextNode || spanElement.parentNode, + nextNode ? 0 : spanElement.parentNode.childNodes.length + ) + range.setEnd( + nextNode || spanElement.parentNode, + nextNode ? 0 : spanElement.parentNode.childNodes.length + ) + selection.removeAllRanges() + selection.addRange(range) + + this.model = this.$refs.customInput.innerHTML + this.inputValueLen = this.$refs.customInput.innerText.length + this.showList(false) + }, + // 检查是否发生了全选操作 + isSelectAll() { + const selection = window.getSelection() + return selection.toString() === this.$refs.customInput.innerText + }, + // 获取输入框是否选中文字 + isSelect() { + try { + const selection = window.getSelection() + return selection.toString().length + } catch (error) { + return 0 + } + }, + // 输入事件 + onKeyDownInput(event) { + // 获取当前输入框的长度 + const currentLength = this.$refs.customInput.innerText.length + // 获取最大输入长度限制 + const maxLength = Number(this.maxlength) || 3000 + + // 如果按下的键是非控制键并且当前长度已经达到了最大长度限制 + if (currentLength >= maxLength) { + // 获取按键的 keyCode + var keyCode = event.keyCode || event.which + + // 检查是否按下了 Ctrl 键 + var ctrlKey = event.ctrlKey || event.metaKey // metaKey 用于 macOS 上的 Command 键 + + // 允许的按键:Backspace(8)、Delete(46)、方向键和 + var allowedKeys = [8, 46, 37, 38, 39, 40] + + // 允许的按键 Ctrl+A、Ctrl+C、Ctrl+V + const allowedCtrlKey = [65, 67, 86] + + // 检查按键是否在允许列表中并且没有执行选中操作 + if (!allowedKeys.includes(keyCode) && !this.isSelect()) { + if ((allowedCtrlKey.includes(keyCode) && ctrlKey)) { + return + } + // 阻止默认行为 + event.preventDefault() + return false + } + } + + if (this.showPopover) { + const listElement = this.$refs.customSelectContent + const itemHeight = listElement.children[0].clientHeight + if (event.key === 'ArrowDown') { + // 防止光标移动 + event.preventDefault() + // 移动选中索引 + if (this.selectedIndex === this.dataList.length - 1) { + this.selectedIndex = 0 // 跳转到第一项 + listElement.scrollTop = 0 // 滚动到列表顶部 + } else { + this.selectedIndex++ + const itemBottom = (this.selectedIndex + 1) * itemHeight + const scrollBottom = listElement.scrollTop + listElement.clientHeight + if (itemBottom > scrollBottom) { + listElement.scrollTop += itemHeight + } + } + } else if (event.key === 'ArrowUp') { + event.preventDefault() + if (this.selectedIndex === 0) { + this.selectedIndex = this.dataList.length - 1 // 跳转到最后一项 + listElement.scrollTop = listElement.scrollHeight // 滚动到列表底部 + } else { + this.selectedIndex-- + const itemTop = this.selectedIndex * itemHeight + if (itemTop < listElement.scrollTop) { + listElement.scrollTop -= itemHeight + } + } + } else if (event.key === 'Enter') { + event.preventDefault() + this.handleClickOperatorItem( + this.dataList[this.selectedIndex] + ) + } + } else if (event.key === 'Backspace' && this.isSelectAll()) { + // 如果执行了全选操作并删除,清空输入框内容 + this.$refs.customInput.innerText = '' + this.model = this.$refs.customInput.innerHTML + this.inputValueLen = 0 + } + }, + // 监听输入事件 + onInput(e) { + this.inputValueLen = this.$refs.customInput.innerText.length + if ( + ['<div><br></div>', '<br>', '<span></span><br>'].includes( + this.$refs.customInput.innerHTML + ) + ) { + this.$refs.customInput.innerHTML = '' + this.inputValueLen = 0 + } else if (e.data === '{') { + // 保存焦点位置 + this.saveIndex() + this.showList() + this.listInput = true + } else if (this.showPopover) { + const { diffChars } = Vue.internal + const diffResult = diffChars( + this.beforeDomVal, + this.dom.textContent + ) + let result = '' + // 遍历差异信息数组 + for (let i = 0; i < diffResult.length; i++) { + const change = diffResult[i] + + // 如果当前差异是添加或修改类型,则将其添加到结果字符串中 + if (change.added) { + result += change.value + } else if (change.removed && change.value === '{') { + this.showList(false) + this.listInputValue = '' + } + } + if (this.timer) { + clearTimeout(this.timer) + } + this.listInputValue = result + this.timer = setTimeout(() => { + this.remoteMethod() + }, 300) + } + this.model = this.$refs.customInput.innerHTML + }, + onPaste(event) { + event.preventDefault() + // 获取剪贴板中的 HTML 和文本内容 + const html = (event.clipboardData || window.clipboardData).getData( + 'text/html' + ) + const text = (event.clipboardData || window.clipboardData).getData( + 'text/plain' + ) + + // 设置最大输入限制 + const maxLength = Number(this.maxlength) || 3000 + + // 此时加个条件 看鼠标选中的文本长度,剩余可输入长度加上选中文本长度 + const selection1 = window.getSelection() + const range1 = selection1.getRangeAt(0) + const clonedSelection = range1.cloneContents() + let selectTextLen = 0 + if (clonedSelection.textContent && clonedSelection.textContent.length) { + selectTextLen = clonedSelection.textContent.length + } + + // 剩余可输入长度 + const remainingLength = maxLength - this.inputValueLen + selectTextLen + + // 过滤掉不可见字符 + const cleanText = text.replace(/\s/g, '') + + // 创建一个临时 div 用于处理粘贴的 HTML 内容 + const tempDiv = document.createElement('div') + tempDiv.innerHTML = html + + // 过滤掉不需要的内容,例如注释和换行符 + const fragment = document.createDocumentFragment() + let totalLength = 0 + + if (cleanText) { + if (remainingLength >= cleanText.length) { + fragment.appendChild(document.createTextNode(cleanText)) + } else { + const truncatedText = cleanText.substr(0, remainingLength) + fragment.appendChild(document.createTextNode(truncatedText)) + } + } else { + Array.from(tempDiv.childNodes).forEach((node) => { + const regex = /<span class="active-text" contenteditable="false" data-id="(\d+)">{([^<]+)<\/span>/g + // 过滤注释和空白节点 + if ( + node.nodeType !== 8 && + !(node.nodeType === 3 && !/\S/.test(node.textContent)) + ) { + const childText = node.textContent || '' + const childLength = childText.length + const childHtml = node.outerHTML || node.innerHTML + // 如果剩余空间足够,插入节点 + if ((regex.exec(childHtml) !== null) && totalLength + childLength <= remainingLength) { + fragment.appendChild(node.cloneNode(true)) + totalLength += childLength + } else if (remainingLength - totalLength > 0) { + // 如果还有剩余长度,不插入节点,插入文本内容 + const lastNodeLength = remainingLength - totalLength + const truncatedText = childText.substr(0, lastNodeLength) + fragment.appendChild(document.createTextNode(truncatedText)) + totalLength += truncatedText.length + } else { + // 如果添加当前节点的内容会超出剩余可插入长度,则结束循环 + return + } + } + }) + } + + // 插入处理后的内容到光标位置 + const selection = window.getSelection() + const range = selection.getRangeAt(0) + range.deleteContents() + range.insertNode(fragment) + + // 更新输入框内容和长度 + this.model = this.$refs.customInput.innerHTML + this.inputValueLen = this.$refs.customInput.innerText.length + + // 设置光标位置为插入内容的后面一位 + const newRange = document.createRange() + newRange.setStart(range.endContainer, range.endOffset) + newRange.collapse(true) + selection.removeAllRanges() + selection.addRange(newRange) + }, + // 修改默认复制事件 + onCopy(e) { + e.preventDefault() + const selection = window.getSelection() + const range = selection.getRangeAt(0) + const clonedSelection = range.cloneContents() + + // 检查复制的内容是否包含符合条件的元素 + const hasActiveText = + clonedSelection.querySelector( + '.active-text[contenteditable="false"][data-id]' + ) !== null + + const clipboardData = e.clipboardData || window.clipboardData + if (hasActiveText) { + const div = document.createElement('div') + div.appendChild(clonedSelection) + const selectedHtml = div.innerHTML + clipboardData.setData('text/html', selectedHtml) + } else { + clipboardData.setData('text/plain', clonedSelection.textContent || '') + } + }, + // 保存焦点位置 + async saveIndex() { + const selection = getSelection() + this.selectionIndex = selection.anchorOffset + const nodeList = this.$refs.customInput.childNodes + const range = selection.getRangeAt(0) + + // 保存当前编辑的dom节点 + for (const [index, value] of nodeList.entries()) { + // 这里第二个参数要配置成true,没配置有其他的一些小bug + // (range.startContainer.contains(value) && range.endContainer.contains(value)) 是为了处理兼容性问题 + if ( + selection.containsNode(value, true) || + (range.startContainer.contains(value) && + range.endContainer.contains(value)) + ) { + if (value.nodeType === Node.TEXT_NODE) { + this.dom = value + this.beforeDomVal = value.textContent + this.domIndex = index + const selection = window.getSelection() + const range = selection.getRangeAt(0) + this.startOffset = range.startOffset - 1 + } else { + const childNodeList = value.childNodes + for (const [childIndex, childValue] of childNodeList.entries()) { + if (selection.containsNode(childValue, true)) { + this.dom = value + this.beforeDomVal = value.textContent + this.domIndex = index + this.childDomIndex = childIndex + const selection = window.getSelection() + const range = selection.getRangeAt(0) + this.startOffset = range.startOffset - 1 + } + } + } + } + } + }, + // 筛选人弹窗 + showList(bool = true) { + this.showPopover = bool + if (bool) { + const offset = + this.getCursorDistanceFromDivBottom(this.$refs.customInput) || -1 + if (offset < 0) { + this.popoverOffset = 0 + } else { + this.popoverOffset = -(offset - 1) + } + } + if (!bool) { + this.listInputValue = '' + this.remoteMethod() + } + }, + // 获取光标位置 + getCursorDistanceFromDivBottom(editableDiv) { + // 获取选区 + const selection = window.getSelection() + // 获取选区的范围 + const range = selection.rangeCount > 0 ? selection.getRangeAt(0) : null + + if (range) { + // 创建一个临时元素来标记范围的结束位置 + const markerElement = document.createElement('span') + // 插入临时标记元素 + range.insertNode(markerElement) + markerElement.appendChild(document.createTextNode('\u200B')) // 零宽空格 + + // 获取标记元素的位置信息 + const markerOffsetTop = markerElement.offsetTop + const markerHeight = markerElement.offsetHeight + + // 计算光标距离div底部的距离 + const cursorDistanceFromBottom = + editableDiv.offsetHeight - (markerOffsetTop + markerHeight) + + // 滚动条距顶部的高度 + const scrollTop = editableDiv.scrollTop || 0 + // 移除临时标记元素 + markerElement.parentNode.removeChild(markerElement) + + // 返回光标距离底部的距离 + return cursorDistanceFromBottom + scrollTop + } + + // 如果没有选区,则返回-1或者其他错误值 + return -1 + }, + // 搜索筛选人 + async remoteMethod() { + + }, + handleNameShift(item) { + const name = item.name || '' + if (!name) return '--' + if (name.length > 1) { + return name.slice(0, 1) + } else { + return name + } + }, + // 按钮div点击 聚焦textarea + handleBtnBoxClick() { + this.$refs.customInput.focus() + }, + getInnerText() { + const customInput = this.$refs.customInput + if (!customInput) return + return customInput.innerText + }, + getJobId() { + const nodeList = this.$refs.customInput.childNodes + const list = [] + nodeList.forEach((e) => { + if (e.className === 'active-text') { + list.push(e.getAttribute('data-id')) + } + }) + return list + }, + clearInput() { + this.$refs.customInput.innerText = '' + this.$refs.customInput.innerHTML = '' + this.inputValueLen = 0 + this.$emit('input', '') + this.$emit('inputText', '') + this.$emit('changeChosen', []) + } + } +} +</script> + <style lang="scss" scoped> + .custom-textarea-btn { + position: absolute; + bottom: 1px; + right: 4px; + left: 4px; + text-align: right; + // background: #fff; + padding-bottom: 3px; + .el-button { + font-size: 12px; + padding: 4px 10px; + } + } + .custom-textarea-box { + position: relative; + } + .custom-at-limit { + position: absolute; + right: 12px; + bottom: 4px; + font-size: 12px; + color: #999; + line-height: 12px; + } + ::v-deep.custom-textarea { + height: calc(100vh - 400px); + background-color: #ffffff; + padding: 5px 15px; + color: #606266; + overflow-y: auto; + line-height: 20px; + font-size: 14px; + transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); + position: relative; + word-break: break-all; + .el-textarea__inner { + border: none; + resize: none; + } + &.show-word-limit { + padding-bottom: 16px; + } + &.custom-textarea-disabled { + cursor: not-allowed; + background-color: #f5f7fa; + border-color: #e4e7ed; + color: #c0c4cc; + } + &:focus { + border-color: #f98600 !important; + } + &:empty::before { + content: attr(placeholder); + font-size: 14px; + color: #c0c4cc; + } + .active-text { + color: #909399; + // padding: 2px 6px; + // background: #f4f4f5; + margin-right: 4px; + // border-radius: 4px; + // font-size: 12px; + } + // &:focus::before { + // content: ""; + // } + } + + ::v-deep.custom-select-box { + position: relative; + + .el-popover { + padding: 0; + top: 0; + box-shadow: 0 4px 8px 0 rgba(89, 88, 88, 0.8); + } + .custom-select-content { + width: 259px; + padding: 8px; + max-height: 260px; + overflow-y: auto; + } + + .custom-select-item { + // font-size: 14px; + // padding: 0 20px; + // position: relative; + // height: 34px; + // line-height: 34px; + // box-sizing: border-box; + display: flex; + padding: 8px 12px; + border-bottom: 1px solid #ebebeb; + align-items: center; + color: #606266; + cursor: pointer; + &:last-child { + border-bottom: none; + } + .avatar-box { + flex-shrink: 0; + .custom-select-item-avatar { + width: 24px; + height: 24px; + background-color: #ffb803; + border-radius: 50%; + text-align: center; + line-height: 24px; + color: #ffffff; + } + } + .custom-select-item-content { + flex: 1; + padding-left: 12px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + &:hover { + background-color: #f5f7fa; + } + &.hoverItem { + background-color: #dbdbdb; + } + } + .custom-select-empty { + padding: 10px 0; + text-align: center; + color: #999; + font-size: 14px; + + &.load { + display: flex; + align-items: center; + justify-content: center; + } + } + .custom-scroll { + overflow: auto; + &::-webkit-scrollbar { + width: 8px; + height: 8px; + } + &::-webkit-scrollbar-thumb { + border-radius: 8px; + background-color: #b4b9bf; + } + } + } + </style> diff --git a/src/views/promptManagement/PromptConfig/add/SelectImg.vue b/src/views/promptManagement/PromptConfig/add/SelectImg.vue new file mode 100644 index 0000000..3213227 --- /dev/null +++ b/src/views/promptManagement/PromptConfig/add/SelectImg.vue @@ -0,0 +1,90 @@ + +<template> + <cs-dialog + :dialog="dialogOptions" + > + <template slot="content"> + <div class="SelectImg"> + <img v-for="(item,index) in imgList" :key="index" :class="[selectId === item.id ? 'actived':'']" class="img-item" :src="item.url" @click="selectItem(item.id)"> + + </img> + </div> + </template> + </cs-dialog> +</template> + +<script> + +export default { + name: 'SelectImg', + data() { + return { + dialogOptions: { + show: false, + width: '520px', + title: { + title: '选择目录图片' + }, + // hiddenFooter: true, + appendToBody: true + }, + selectId: '', + imgList: [ + { + url: require('@/assets/file/type1.png'), + id: 1 + }, { + url: require('@/assets/file/type2.png'), + id: 2 + }, { + url: require('@/assets/file/type3.png'), + id: 3 + }, { + url: require('@/assets/file/type4.png'), + id: 4 + }, { + url: require('@/assets/file/type5.png'), + id: 5 + }, { + url: require('@/assets/file/type6.png'), + id: 6 + } + ] + + } + }, + mounted() { + + }, + methods: { + // 显示弹窗 + show() { + this.dialogOptions.show = true + }, + selectItem(id) { + this.selectId = id + }, + handleSelect(val) { + this.$emit('selectOk', val) + this.dialogOptions.show = false + } + } +} +</script> + + <style scoped lang="scss"> + .SelectImg { + display: flex; + flex-wrap: wrap; + img { + width: 100px; + height: 100px; + margin: 0 16px 16px 0; + cursor: pointer; + } + .actived { + border: 2px solid rgba(55, 99, 255, 1); + border-radius: 8px 8px 8px 8px; + } + } + </style> diff --git a/src/views/promptManagement/PromptConfig/add/index.vue b/src/views/promptManagement/PromptConfig/add/index.vue index 837012b..40dbece 100644 --- a/src/views/promptManagement/PromptConfig/add/index.vue +++ b/src/views/promptManagement/PromptConfig/add/index.vue @@ -1,62 +1,428 @@ <template> <div class="add-prompt"> - <div class="left"> - <div class="title">基础配置</div> - <el-form ref="form" :model="dataInfo" :rules="rules" label-width="90px"> - <el-form-item label="案件类型" prop="caseType"> - <el-select v-model="dataInfo['caseType']" clearable placeholder="请选择案件类型"> - <el-option v-for="item in caseTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> - </el-select> - </el-form-item> - <el-form-item label="指令类型" prop="caseNo"> - <el-select v-model="dataInfo['caseType']" clearable placeholder="请选择案件类型"> - <el-option v-for="item in caseTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> - </el-select> - </el-form-item> - <el-form-item label="指令类型" prop="caseNo"> - <el-input v-model="dataInfo['name']" clearable placeholder="请输入指令名称" /> - </el-form-item> - <el-form-item label="关键词" prop="caseNo"> - <el-input v-model="dataInfo['name']" clearable placeholder="请输入指令名称" /> - </el-form-item> - <el-form-item label="选择目录" prop="caseType"> - <el-select v-model="dataInfo['caseType']" clearable placeholder="请选择案件类型"> - <el-option v-for="item in caseTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> - </el-select> - </el-form-item> - </el-form> - </div> - <div class="right"> + <div class="tip">提示词配置对于自动识别属性内容和生成知识图谱至关重要,通过上传测试文件检验其效果能有效提升案件指标判别的准确性。</div> + <div class="main-content"> + <div class="left"> + <div class="title">基础配置</div> + <el-form ref="form" :model="dataInfo" :rules="rules" label-width="120px"> + <el-form-item label="案件类型" prop="caseType"> + <el-select v-model="dataInfo['caseType']" style="width: 100%;" clearable placeholder="请选择案件类型"> + <el-option v-for="item in caseTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> + </el-select> + </el-form-item> + <el-form-item label="提示词类型" prop="type"> + <el-select v-model="dataInfo['type']" style="width: 100%;" placeholder="请选择提示词类型"> + <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" /> + </el-select> + </el-form-item> + <el-form-item label="提示词名称" prop="name"> + <el-input v-model="dataInfo['name']" clearable placeholder="请输入提示词名称" /> + </el-form-item> + <el-form-item v-if="dataInfo.type ==='1'" label="所属目录" prop="evidenceCategoryList"> + <el-cascader v-model="dataInfo.evidenceCategoryList" style="width: 100%;" :props="defaultProps" :options="treeData" /> + </el-form-item> + <!-- <el-form-item v-if="dataInfo.type ==='1'" label="类目图标" prop="caseType"> + <div class="select-img"> + <div class="sel-btn" @click="openSelectImg">请选择</div> + </div> + </el-form-item> --> + <el-form-item v-if="dataInfo.type ==='1'" label="提取属性" prop="extractAttributes"> + <div class="params-table"> + <div class="top"> + <span style="width: 450px;">字典标签</span> + <span style="width: 150px;">字典数值</span> + <span style="width: 80px;">操作</span> + </div> + <div v-for="(item,index) in dataInfo.extractAttributes" :key="index" class="table-item"> + <el-input v-model="item.attrName" style="width: 400px;margin-right: 40px;" placeholder="请输入" /> + <el-select v-model="item.attrValueType" style="width: 120px;margin-right: 40px;" clearable placeholder="请选择"> + <el-option v-for="items in extractList" :key="items.value" :label="items.label" :value="items.value" /> + </el-select> + <i class="el-icon-delete" @click="delItem(index)" /> + </div> + <div class="add-table" @click="addItem"> + <i class="el-icon-circle-plus-outline" style="color: #3763FF;font-size: 16px;" /> + <span>添加数据</span> + </div> + </div> + </el-form-item> + </el-form> + </div> + <div class="right"> <div class="right-header"> - <span>提示词配置</span> - <div class="btn-list">11</div> + <span>提示词配置</span> + <div class="btn-list"> + <div class="ai-btn"> + <i class="el-icon-refresh" /> + <span>AI自动生成</span> + </div> + <div class="btn" @click="handleDebug">调试</div> + </div> + + </div> + <div class="content"> + <!-- <el-input + v-model="dataInfo['prompt']" + type="textarea" + :rows="24" + placeholder="请输入提示词模板" + /> --> + <PromptInput + v-model="customInputHTML" + placeholder="" + @inputText="handleChangeInputText" + @changeChosen="handleChangeChosen" + /> + </div> - <div class="content">222</div> + </div> </div> + <div class="footer-btns"> + <div class="btn" @click="submit">发布模板</div> + <div class="btn" @click="submit">保存</div> + <div class="reset_btn" @click="reset">重置</div> + + </div> + <PromptDebug ref="PromptDebugRef" /> + <SelectImg ref="SelectImgRef" /> </div> </template> <script> - +import PromptDebug from './PromptDebug.vue' +import SelectImg from './SelectImg.vue' +import { getCaseEvidenceTree } from '@/api/caseDetails/evidence' +import { addOrUpdPrompt } from '@/api/promptManagement' +import PromptInput from './PromptInput.vue' export default { + name: 'AddPrompt', + components: { + PromptDebug, + SelectImg, + PromptInput + }, data() { return { dataInfo: { - caseType: '' + // 输入框的html代码 + customInputHTML: '', + // 输入框的文本,可让后端使用,如不使用,也没啥用 + customInputText: '', + // 输入框返回的@人员数据 + customInputMentions: [], + + caseType: '', + type: '1', + name: '', + evidenceCategoryList: [], + extractAttributes: [], + prompt: '请根据属性定义从源文本中提取属性:\n' + + '\n' + + '示例文本:\n' + + '"\n' + + '甲方:张三公司\n' + + '乙方:\n' + + '数量:5000吨水泥\n' + + '合同金额:8346元\n' + + '支付时间:2022年11月30日\n' + + '履行期限:2022年12月1日至2023年12月1日\n' + + '签订日期:2022年11月23日\n' + + '"\n' + + '\n' + + '示例结果:\n' + + '{\n' + + ' "甲方名称": "张三公司",\n' + + ' "乙方名称": "",\n' + + ' "数量": "5000吨水泥",\n' + + ' "合同金额": "8346.00",\n' + + ' "支付时间": "2022-11-30",\n' + + ' "履行期限": "2022年12月1日至2023年12月1日",\n' + + ' "签订日期": "2022-11-23"\n' + + '}\n' + + '\n' + + '源文本:\n' + + '{ocr_txt}\n' + + '\n' + + '属性定义:\n' + + '{attr_define}\n' + + '\n' + + '### 注意事项:\n' + + '1. 将结果以JSON格式返回。不需要进行解释。\n' + + '2. 如果某字段提取不到,则返回""。\n' + + '3. 日期格式为yyyy-MM-dd,数字格式返回保留两位小数。\n' + + '4. 值为文本类型的数据,尽量使用原文中的文字。\n' + + '5. 只可以使用原文中的文字,不可以自行添加内容。\n' + + '\n' + + '回溯你输出的结果,确保你的输出结果符合json格式。' + }, + tableList: [{ + name: '', + type: '' + }], + rules: { + caseType: [{ required: true, message: '案件类型不能为空!', trigger: 'blur' }], + type: [{ required: true, message: '提示词类型不能为空!', trigger: 'blur' }], + name: [{ required: true, message: '提示词名称不能为空!', trigger: 'blur' }], + extractAttributes: [{ required: true, message: '提取属性不能为空!', trigger: 'blur' }] }, + defaultProps: { + children: 'child', + label: 'categoryName', + value: 'id', + checkStrictly: true + }, + treeData: [], + id: '', + extractList: [ + { + label: '输入框', + value: 'text' + }, + { + label: '日期', + value: 'date' + } + ], // 案件类型数据 - caseTypeOptions: JSON.parse(sessionStorage.getItem('case_type')) + caseTypeOptions: JSON.parse(sessionStorage.getItem('case_type')), + typeOptions: JSON.parse(sessionStorage.getItem('prompt_type')) } }, mounted() { - + this.getTreeList() }, methods: { + // 获取输入框返回的文本 + handleChangeInputText(val) { + this.customInputText = val + }, + // 获取输入框返回的文本 + handleChangeChosen(val) { + this.customInputMentions = val + }, handleDebug() { + this.$refs.PromptDebugRef.show() + }, + openSelectImg() { + this.$refs.SelectImgRef.show() + }, + // 查询目录 + getTreeList() { + getCaseEvidenceTree({ caseType: 1 }).then(res => { + if (res.code === 200) { + this.treeData = res.data + } + }) + }, + addItem() { + this.dataInfo.extractAttributes.push({ + attrName: '', + attrValueType: '' + }) + }, + delItem(index) { + this.dataInfo.extractAttributes.splice(index, 1) + }, + reset() { + }, + submit() { + this.$refs.form.validate(valid => { + if (valid) { + const params = { + id: this.id, + ...this.dataInfo, + evidenceCategoryId: this.dataInfo.evidenceCategoryList[this.dataInfo.evidenceCategoryList.length - 1 ] + } + addOrUpdPrompt(params).then(res => { + const { code, msg } = res + code === 200 ? (this.id ? this.$baseMessage.success(msg || '编辑成功!') : this.$baseMessage.success(msg || '新增成功!')) : (this.id ? this.$baseMessage.error(msg || '编辑失败!') : this.$baseMessage.error(msg || '新增失败!')) + }) + } + }) + } } } </script> <style lang="scss" scoped> .add-prompt { + background-color: #fff; + height: 100%; + display: flex; + flex-direction: column; + padding: 0 40px; + + .tip { + width: 100%; + height: 70px; + background: #F6F8F9; + border-radius: 8px 8px 8px 8px; + line-height: 70px; + padding-left: 24px; + font-size: 16px; + color: #333333; + margin-top: 24px; + margin-bottom: 16px; + } + .main-content { + display: flex; + flex: 1; + .left { + width: 750px; + border-right: 1px solid rgba(51, 51, 51, 0.20); + padding-right: 40px; + .title { + font-weight: bold; + font-size: 18px; + color: #333333; + margin-top: 24px; + margin-bottom: 24px; + } + .select-img { + width: 96px; + height: 42px; + background: #FFFFFF; + border-radius: 6px 6px 6px 6px; + border: 1px solid #3763FF; + line-height: 42px; + text-align: center;font-size: 16px; + color: #3763FF; + cursor: pointer; + } + .params-table { + border-radius: 6px 6px 6px 6px; + border: 1px solid #D9D9D9; + .top { + background: #F2F6FA; + height: 42px; + display: flex; + line-height: 42px; + span { + text-align: center;font-size: 16px; + color: #888888; + } + } + .add-table { + height: 56px; + display: flex; + justify-content: center; + align-items: center; + font-size: 16px; + color: #3763FF; + cursor: pointer; + span { + margin-left: 8px; + } + } + .table-item { + display: flex; + padding: 16px; + align-items: center; + border-bottom: 1px solid #FFEAEAEA; + i { + color: #FF3429; + cursor: pointer; + } + } + } + } + .right { + flex: 1; + padding: 24px 40px; + display: flex; + flex-direction: column; + .right-header { + display: flex; + justify-content: space-between; + span { + font-weight: bold; + font-size: 18px; + color: #333333; + } + .btn-list { + display: flex; + .ai-btn { + width: 154px; + height: 42px; + border-radius: 6px 6px 6px 6px; + border: 1px solid #3763FF; + display: flex; + justify-content: center; + align-items: center; + margin-right: 24px; + cursor: pointer; + i { + font-size: 16px; + color: #3763FF; + } + span { + font-size: 16px; + color: #3763FF; + margin-left: 8px; + font-weight: 400; + } + } + .btn { + width: 98px; + height: 42px; + background: #3763FF; + border-radius: 6px 6px 6px 6px;text-align: center; + line-height: 42px; + font-size: 16px; + color: #FFFFFF; + cursor: pointer; + } + } + } + .content { + border-radius: 6px 6px 6px 6px; + border: 1px solid #D9D9D9; + margin-top: 14px; + flex: 1; + // padding: 16px; + ::v-deep { + .el-textarea__inner { + border: none; + resize: none; + } +} + } + } + } + .footer-btns { + height: 96px; + background: #FFFFFF; + box-shadow: 2px -4px 12px 0px rgba(0,0,0,0.04); + border-radius: 8px 8px 8px 8px; + display: flex; + flex-direction: row-reverse; + align-items: center; + .btn { + width: 188px; + height: 48px; + background: #3763FF; + box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); + border-radius: 6px 6px 6px 6px; + text-align: center; + line-height: 48px; + font-size: 16px; + color: #FFFFFF; + cursor: pointer; + margin-left: 24px; + } + .reset_btn { + width: 188px; + height: 48px; + background: #FFFFFF; + box-shadow: 0px 2px 0px 0px rgba(0,0,0,0.04); + border-radius: 6px 6px 6px 6px; + border: 1px solid #3763FF; + text-align: center; + line-height: 48px; + font-size: 16px; + color: #3763FF; + cursor: pointer; + margin-left: 24px; + } + } } </style> diff --git a/src/views/promptManagement/PromptConfig/index.vue b/src/views/promptManagement/PromptConfig/index.vue index 1922638..7e0ec10 100644 --- a/src/views/promptManagement/PromptConfig/index.vue +++ b/src/views/promptManagement/PromptConfig/index.vue @@ -1,6 +1,6 @@ <template> - <div class="content"> + <div ref="htmlContent" class="content"> <cs-search title="提示词检索" :data="searchData" :span="6" direction="row" @onSearch="onSearch" @getData="onSearch" /> <div class="index-content"> <div class="header"> @@ -26,44 +26,28 @@ <script> import mixin from '@/views/mixin' -import { queryIndexData, deleteModelIndex } from '@/api/indexRule' +import { queryPromptList } from '@/api/promptManagement' export default { - name: 'Index', + name: 'PromptConfig', mixins: [mixin], data() { return { // 筛选数据 searchData: [ - { label: '指标名称', model: 'name', type: 'input' }, - { label: '指标类别', model: 'indexType', type: 'select', option: JSON.parse(sessionStorage.getItem('index_type')) }, - // { label: '证据名称', model: 'doer', type: 'input' }, - { label: '案件类型', model: 'caseType', type: 'select', option: JSON.parse(sessionStorage.getItem('case_type')) }, - { label: '原子指标', model: 'atomicIndexName', type: 'input' } + { label: '提示词名称', model: 'name', type: 'input' }, + { label: '提示词类型', model: 'type', type: 'select', option: JSON.parse(sessionStorage.getItem('prompt_type')) } ], // 表格配置 gridOptions: { ...mixin.data().gridOptions, - // 指标名称单元格添加样式 - cellClassName: ({ column }) => { - if (column.field === 'indexName') { - return 'text-blue' - } - return null - }, - // 展开行结构配置 - expandConfig: { - iconClose: 'vxe-icon-square-plus', - iconOpen: 'vxe-icon-square-minus' - }, columns: [ - { title: '序号', type: 'seq', width: '50px' }, - { title: '指标名称', field: 'name', align: 'left' }, - { title: '指标类别', field: 'indexTypeName', width: '150px' }, - { title: '指标分数', field: 'indexScore', width: '150px', sortable: true }, - { title: '原子指标数量', field: 'atomicIndexNum', width: '150px' }, - { title: '最新时间', field: 'updateTime', width: '150px' }, - { title: '操作', slots: { default: 'operate' }, fixed: 'right', width: '150px' } + { title: 'ID', field: 'id', width: '300px' }, + { title: '提示词名称', field: 'name', width: '300px' }, + { title: '提示词类型', field: 'type', width: '200px' }, + { title: '匹配值', field: 'matchNum', width: '200px' }, + { title: '提示词', field: 'prompt' }, + { title: '操作', slots: { default: 'operate' }, width: '150px' } ], data: [] } @@ -75,21 +59,22 @@ export default { methods: { // 数据查询 fetchData() { - queryIndexData({ ...this.searchFormData }, this.queryForm.page, this.queryForm.size).then(res => { - this.gridOptions.data = res.data.result + queryPromptList({ ...this.searchFormData, page: this.queryForm.page, size: this.queryForm.size }).then(res => { + this.gridOptions.data = res.data.records this.queryForm.total = res.data.total }) }, // 新增 handleAdd() { + this.$router.push({ path: `/add-prompt` }) }, // 删除 handleDel(row) { - this.$baseConfirm('确定要删除吗?', null, async() => { - const { code, msg } = await deleteModelIndex(row.id) - code === 200 ? this.$baseMessage.success(msg || '删除成功!') : this.$baseMessage.error(msg || '删除失败!') - this.fetchData() - }) + // this.$baseConfirm('确定要删除吗?', null, async() => { + // const { code, msg } = await deleteModelIndex(row.id) + // code === 200 ? this.$baseMessage.success(msg || '删除成功!') : this.$baseMessage.error(msg || '删除失败!') + // this.fetchData() + // }) }, // 筛选 onSearch(data, callback) { diff --git a/src/views/ruleEngine/atomicIndex/components/EditAtomic.vue b/src/views/ruleEngine/atomicIndex/components/EditAtomic.vue index 95e6a85..b743f92 100644 --- a/src/views/ruleEngine/atomicIndex/components/EditAtomic.vue +++ b/src/views/ruleEngine/atomicIndex/components/EditAtomic.vue @@ -13,91 +13,105 @@ @onSubmit="handleSubmit" > <template slot="content"> - <el-form ref="form" :model="ruleForm" :rules="rules" label-width="120px"> - <el-form-item label="案件类型" prop="caseType"> - <el-select v-model="ruleForm.caseType" :disabled="isView" placeholder="请选择案件类型" style="width: 100%"> - <el-option - v-for="item in caseTypeOptions" - :key="item.value" - :label="item.label" - :value="item.value" + <div class="add-atomic"> + <el-form ref="form" :model="ruleForm" :rules="rules" label-width="120px"> + <el-form-item label="案件类型" prop="caseType"> + <el-select v-model="ruleForm.caseType" :disabled="isView" placeholder="请选择案件类型" style="width: 100%"> + <el-option + v-for="item in caseTypeOptions" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + <el-form-item label="原子指标名称" prop="name"> + <el-input + v-model="ruleForm.name" + :disabled="isView" + placeholder="请输入原子指标名称" /> - </el-select> - </el-form-item> - <el-form-item label="原子指标名称" prop="name"> - <el-input - v-model="ruleForm.name" - :disabled="isView" - placeholder="请输入原子指标名称" - /> - </el-form-item> - <el-form-item label="指标算法" prop="indexSource"> - <el-radio-group v-model="ruleForm['indexSource']" :disabled="isView" @change="changeType"> - <el-radio - v-for="item in sourceOptions" - :key="item.value" - :label="item.value" - > - {{ item.label }} - </el-radio> + </el-form-item> + <el-form-item label="指标算法" prop="indexSource"> + <el-radio-group v-model="ruleForm['indexSource']" :disabled="isView" @change="changeType"> + <el-radio + v-for="item in sourceOptions" + :key="item.value" + :label="item.value" + > + {{ item.label }} + </el-radio> <!-- <el-radio label="1">人工指定</el-radio>--> <!-- <el-radio label="2">数据库查询</el-radio>--> <!-- <el-radio label="3">图谱生成</el-radio>--> <!-- <el-radio label="4">大模型</el-radio>--> - </el-radio-group> - </el-form-item> - - <el-form-item v-if="ruleForm['indexSource'] === '4'" label="prompt标签" prop="recordType"> - <el-select v-model="ruleForm['recordType']" :disabled="isView" placeholder="请选择prompt标签" style="width: 100%"> - <el-option - v-for="item in promptTagOptions" - :key="item.value" - :label="item.label" - :value="item.value" + </el-radio-group> + </el-form-item> + <el-form-item label="查询语句" prop="indexSource"> + <div class="select-btn" @click="selectSql">请选择</div> + <div v-if="ruleForm['indexSource'] === '3'" class="sel-name">{{ `已选:指令名称` }}</div> + <div v-if="ruleForm['indexSource'] === '4'" class="sel-name">{{ `已选:指令名称(即证据模板名称)` }}</div> + <span v-if="ruleForm['indexSource'] === '3'" class="sel-desc">{{ `头节点类型-关系-尾节点类型` }}</span> + <div v-if="ruleForm['indexSource'] === '4'" class="select-model-list"> + <div v-for="(item,index) in modelList" :key="index" class="model-list-item"> + <span>{{ item.name }}</span> + <i class="el-icon-circle-close" /> + </div> + </div> + </el-form-item> + <el-form-item v-if="ruleForm['indexSource'] === '4'" label="prompt标签" prop="recordType"> + <el-select v-model="ruleForm['recordType']" :disabled="isView" placeholder="请选择prompt标签" style="width: 100%"> + <el-option + v-for="item in promptTagOptions" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + <el-form-item v-if="ruleForm['indexSource'] === '4'" label="prompt内容" prop="prompt"> + <el-input + v-model="ruleForm.prompt" + :disabled="isView" + type="textarea" + :rows="5" + placeholder="请输入prompt内容" + /> + </el-form-item> + <el-form-item v-if="ruleForm['indexSource'] === '2' || ruleForm['indexSource'] === '3'" label="查询语句" prop="queryLang"> + <el-input + v-model="ruleForm['queryLang']" + :disabled="isView" + type="textarea" + :rows="5" + placeholder="请输入查询语句" /> - </el-select> - </el-form-item> - <el-form-item v-if="ruleForm['indexSource'] === '4'" label="prompt内容" prop="prompt"> - <el-input - v-model="ruleForm.prompt" - :disabled="isView" - type="textarea" - :rows="5" - placeholder="请输入prompt内容" - /> - </el-form-item> - <el-form-item v-if="ruleForm['indexSource'] === '2' || ruleForm['indexSource'] === '3'" label="查询语句" prop="queryLang"> - <el-input - v-model="ruleForm['queryLang']" - :disabled="isView" - type="textarea" - :rows="5" - placeholder="请输入查询语句" - /> - </el-form-item> + </el-form-item> - <!-- <el-form-item label="判断结果" prop="judgeResult">--> - <!-- <el-select v-model="ruleForm['judgeResult']" :disabled="isView" placeholder="请选择判断结果" style="width: 100%">--> - <!-- <el-option--> - <!-- v-for="item in resultOptions"--> - <!-- :key="item.value"--> - <!-- :label="item.label"--> - <!-- :value="item.value"--> - <!-- />--> - <!-- </el-select>--> - <!-- </el-form-item>--> - <el-form-item label="原子指标说明" prop="remark"> - <el-input - v-model="ruleForm.remark" - :disabled="isView" - type="textarea" - :rows="5" - placeholder="请输入原子指标说明" - /> - </el-form-item> - </el-form> + <!-- <el-form-item label="判断结果" prop="judgeResult">--> + <!-- <el-select v-model="ruleForm['judgeResult']" :disabled="isView" placeholder="请选择判断结果" style="width: 100%">--> + <!-- <el-option--> + <!-- v-for="item in resultOptions"--> + <!-- :key="item.value"--> + <!-- :label="item.label"--> + <!-- :value="item.value"--> + <!-- />--> + <!-- </el-select>--> + <!-- </el-form-item>--> + <el-form-item label="原子指标说明" prop="remark"> + <el-input + v-model="ruleForm.remark" + :disabled="isView" + type="textarea" + :rows="5" + placeholder="请输入原子指标说明" + /> + </el-form-item> + </el-form> + </div> + <SelectSql ref="SelectSqlRef" /> </template> - <SelectSql ref="SelectSqlRef" /> + </cs-drawer> </template> @@ -116,6 +130,17 @@ export default { title: '指标配置', width: '40%' }, + modelList: [ + { + name: '属性1' + }, { + name: '属性2' + }, { + name: '属性3' + }, { + name: '属性4' + } + ], // 案件类型数据 caseTypeOptions: JSON.parse(sessionStorage.getItem('case_type')), // prompt 标签数据 @@ -169,6 +194,9 @@ export default { this.ruleForm = { indexSource: '1' } // this.$refs.form.clearValidate() }, + selectSql() { + this.$refs.SelectSqlRef.show() + }, // 确定 handleSubmit() { this.$refs.form.validate(async valid => { @@ -193,5 +221,41 @@ export default { </script> <style scoped lang="scss"> - +.add-atomic { + .select-btn { + width: 96px; + height: 36px; + background: #FFFFFF; + border-radius: 6px 6px 6px 6px; + border: 1px solid #3763FF; + line-height: 36px; + text-align: center;font-size: 16px; + color: #3763FF; + cursor: pointer; + } + .sel-name { + margin-top: 8px;font-size: 16px; + color: #3763FF; + } + .sel-desc { + margin-top: 8px;font-size: 16px; + color: #333333 + } + .select-model-list { + display: flex; + .model-list-item { + padding: 0 12px; + height: 32px; + margin:0 8px 8px 0; + background: #F0F0F0; + border-radius: 6px 6px 6px 6px;font-size: 14px; + color: #333333; + display: flex; + align-items: center; + span { + margin-right: 16px; + } + } + } +} </style> diff --git a/src/views/ruleEngine/atomicIndex/components/SelectSql.vue b/src/views/ruleEngine/atomicIndex/components/SelectSql.vue index 412286c..a89d98a 100644 --- a/src/views/ruleEngine/atomicIndex/components/SelectSql.vue +++ b/src/views/ruleEngine/atomicIndex/components/SelectSql.vue @@ -6,6 +6,7 @@ @onSubmit="handleSubmit" > <template slot="content"> + <el-form v-model="searchForm" label-width="120px"> <el-row :gutter="10"> <el-col :span="10"> @@ -13,35 +14,37 @@ <el-input v-model="searchForm['name']" clearable placeholder="请选择原子指标名称" /> </el-form-item> </el-col> - <el-col :span="10"> - <el-form-item label="指令类型" prop="indexSource"> - <el-select v-model="searchForm['indexSource']" clearable placeholder="请选择指标算法"> - <el-option - v-for="item in indexAlgorithmOptions" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - </el-form-item> - </el-col> <el-col :span="4"> <el-button type="primary" @click="handleSearch">查询</el-button> </el-col> </el-row> </el-form> + <div class="main"> <vxe-grid ref="xTable" row-id="id" v-bind="gridOptions" - style="margin-top: 10px" - :checkbox-config="{ labelField: '', highlight: true, trigger: 'row', reserve: true , range: true}" + style="margin-top: 10px;width: 850px;" + :radio-config-config="{ labelField: '', highlight: true, trigger: 'row', reserve: true , range: true}" - @checkbox-change="selectChangeEvent" + @radioConfig-change="selectChangeEvent" /> <div class="main-right"> - 111 + <!-- <div class="chart-content"> + <span class="title">提示词配置内容</span> + </div> --> + <div class="model-content"> + <vxe-grid + ref="modelTable" + row-id="id" + v-bind="modelGridOptions" + :checkbox-config-config="{ labelField: '', highlight: true, trigger: 'row', reserve: true , range: true}" + + @checkbox-change="selectChangeEvent" + /> + <div class="title">提示词配置内容</div> + </div> </div> </div> @@ -69,6 +72,8 @@ export default { dialogOption: { show: false, appendToBody: true, + width: '1400px', + height: '800px', title: { title: '选择原子指标查询语句' } @@ -83,14 +88,23 @@ export default { // 表格配置 gridOptions: { ...mixin.data().gridOptions, - height: '320px', + columns: [ + { type: 'radio', width: '80px' }, + { title: '指令名称', field: 'name', align: 'left' }, + { title: '指令类型', field: 'indexSourceName' }, + { title: '三元组', field: 'remark' }, + { title: '属性', field: 'remark' } + ], + data: [{}] + }, + modelGridOptions: { + height: '240px', columns: [ { type: 'checkbox', width: '80px' }, - { title: '原子指标名称', field: 'name', align: 'left' }, - { title: '指标来源', field: 'indexSourceName' }, - { title: '指标说明', field: 'remark' } + { title: '属性名称', field: 'remark' }, + { title: '属性类型', field: 'remark' } ], - data: [] + data: [{}] }, // 上个界面传递过来的已选择的原子指标 selectionRows: [] @@ -98,11 +112,11 @@ export default { }, methods: { // 显示弹窗 - show(data) { + show() { this.dialogOption.show = true - this.selectionRows = data - this.searchForm['name'] = '' - this.fetchData() + // this.selectionRows = data + // this.searchForm['name'] = '' + // this.fetchData() }, // 获取原子指标列表 fetchData() { @@ -180,5 +194,43 @@ export default { <style lang="scss"> .SelectSql .el-dialog { background: #fff; + .main { + display: flex; + margin-bottom: 20px; + height: 550px; + .main-right { + flex: 1; + margin-left: 24px; + .chart-content { + background: #FFFFFF; + border-radius: 6px 6px 6px 6px; + border: 1px solid #D9D9D9; + padding: 16px; + height: 100%; + .title { + font-weight: bold; + font-size: 18px; + color: #333333; + margin-bottom: 16px; + } + } + .model-content { + background: #FFFFFF; + border-radius: 6px 6px 6px 6px; + border: 1px solid #D9D9D9; + padding: 16px; + height: 100%; + .title { + font-weight: bold; + font-size: 18px; + color: #333333; + margin-bottom: 16px; + margin-top: 16px; + } + } + } + } + } </style> + diff --git a/src/views/ruleEngine/indexRule/components/CustomLogic.vue b/src/views/ruleEngine/indexRule/components/CustomLogic.vue index 73bb002..e35d243 100644 --- a/src/views/ruleEngine/indexRule/components/CustomLogic.vue +++ b/src/views/ruleEngine/indexRule/components/CustomLogic.vue @@ -40,41 +40,58 @@ {{ logic.label }} </el-radio-button> </el-radio-group> - <div v-for="(subItem, subIndex) in item.atomicData" :key="subIndex" class="flex-row row-content"> - <span class="row-line" /> - <el-button - icon="el-icon-remove-outline" - type="text" - style="color: red" - :disabled="item.atomicData.length === 1" - @click="handleRowClick(item, subItem)" - /> - <el-select - v-model="subItem.atomicIndex" - placeholder="请选择" - clearable - style="width: 300px" - > - <el-option - v-for="option in atomicIndexData" - :key="option.id" - :label="option.name" - :value="option.id" - /> - </el-select> - <el-select - v-model="subItem.relationalSymbol" - placeholder="请选择" - clearable - style="width: 150px;margin-left: 20px" - > - <el-option - v-for="option in symbolOptions" - :key="option.value" - :label="option.label" - :value="option.value" + <div v-for="(subItem, subIndex) in item.atomicData" :key="subIndex"> + <div class="flex-row row-content"> + <span class="row-line" /> + <el-button + icon="el-icon-remove-outline" + type="text" + style="color: red" + :disabled="item.atomicData.length === 1" + @click="handleRowClick(item, subItem)" /> - </el-select> + <el-select + v-model="subItem.atomicIndex" + placeholder="请选择" + clearable + style="width: 300px" + > + <el-option + v-for="option in atomicIndexData" + :key="option.id" + :label="option.name" + :value="option.id" + /> + </el-select> + <el-select + v-model="subItem.relationalSymbol" + placeholder="请选择" + clearable + style="width: 150px;margin-left: 20px" + > + <el-option + v-for="option in symbolOptions" + :key="option.value" + :label="option.label" + :value="option.value" + /> + </el-select> + </div> + <div class="row-sku"> + <div class="row-sku-top"> + <i class="el-icon-circle-plus-outline" style="color: #3763FF;font-size: 14px;" /> + <span>添加单个条件</span> + <el-radio-group v-model="subItem.groupLogic" class="group-logic"> + <el-radio-button + v-for="logic in logicSymbolOptions" + :key="logic.value" + :label="logic.value" + > + {{ logic.label }} + </el-radio-button> + </el-radio-group></div> + <div v-for="(items,i) in "></div> + </div> </div> <el-button icon="el-icon-circle-plus-outline" @@ -108,7 +125,7 @@ <script> import mixin from '@/views/mixin' - +// import { CirclePlus } from "@element-plus/icons-vue"; export default { name: 'CustomLogic', mixins: [mixin], @@ -128,7 +145,9 @@ export default { return { // 原子指标逻辑数据 logicData: [ - { groupLogic: '1', rowLogic: '1', atomicData: [{ atomicIndex: '', relationalSymbol: '' }] } + { groupLogic: '1', rowLogic: '1', atomicData: [{ atomicIndex: '', relationalSymbol: '', attributeList:[{ + + }] }] } ], // 逻辑运算符 logicSymbolOptions: JSON.parse(sessionStorage.getItem('logic_symbol')) @@ -240,6 +259,7 @@ export default { .group { border: 1px dashed #999999; position: relative; + padding-bottom: 40px; .group-title { position: absolute; top: -10px; @@ -254,7 +274,7 @@ export default { background: #ffffff; } .row-content { - margin: 30px 0; + margin: 30px 0 16px 0; align-items: center; .row-line { width: 50px; @@ -277,6 +297,18 @@ export default { bottom: -15px; left: 310px; } + .row-sku { + padding-left: 50px; + .row-sku-top { + span { + font-size: 14px; + color: #3763FF; + margin-left: 4px; + cursor: pointer; + margin-right: 16px; + } + } + } } .group-logic-content { padding: 30px 0;