瀏覽代碼

Merge remote-tracking branch 'origin/dev' into wuguojie

# Conflicts:
#	src/views/insurancePolicy/index.vue
#	src/views/quoteConfig/project/modules/projectAdd.vue
wuguojie 1 年之前
父節點
當前提交
43fe0f81ce

+ 337 - 0
pnpm-lock.yaml

@@ -14,6 +14,12 @@ importers:
       '@imengyu/vue3-context-menu':
       '@imengyu/vue3-context-menu':
         specifier: ^1.4.4
         specifier: ^1.4.4
         version: 1.4.4
         version: 1.4.4
+      '@vue-office/docx':
+        specifier: ^1.6.3
+        version: 1.6.3(vue-demi@0.14.10(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))
+      '@vue/component-compiler-utils':
+        specifier: ^3.3.0
+        version: 3.3.0(handlebars@4.7.8)(lodash@4.17.21)
       '@vueuse/components':
       '@vueuse/components':
         specifier: ^12.0.0
         specifier: ^12.0.0
         version: 12.0.0(typescript@5.6.3)
         version: 12.0.0(typescript@5.6.3)
@@ -47,6 +53,9 @@ importers:
       hotkeys-js:
       hotkeys-js:
         specifier: ^3.13.7
         specifier: ^3.13.7
         version: 3.13.7
         version: 3.13.7
+      js-pinyin:
+        specifier: ^0.2.7
+        version: 0.2.7
       lodash-es:
       lodash-es:
         specifier: ^4.17.21
         specifier: ^4.17.21
         version: 4.17.21
         version: 4.17.21
@@ -86,6 +95,9 @@ importers:
       vue:
       vue:
         specifier: ^3.5.13
         specifier: ^3.5.13
         version: 3.5.13(typescript@5.6.3)
         version: 3.5.13(typescript@5.6.3)
+      vue-cropper:
+        specifier: ^1.1.4
+        version: 1.1.4
       vue-m-message:
       vue-m-message:
         specifier: ^4.0.2
         specifier: ^4.0.2
         version: 4.0.2
         version: 4.0.2
@@ -1862,6 +1874,16 @@ packages:
   '@volar/typescript@2.4.10':
   '@volar/typescript@2.4.10':
     resolution: {integrity: sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==}
     resolution: {integrity: sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==}
 
 
+  '@vue-office/docx@1.6.3':
+    resolution: {integrity: sha512-Cs+3CAaRBOWOiW4XAhTwwxJ0dy8cPIf6DqfNvYcD3YACiLwO4kuawLF2IAXxyijhbuOeoFsfvoVbOc16A/4bZA==}
+    peerDependencies:
+      '@vue/composition-api': ^1.7.1
+      vue: ^2.0.0 || >=3.0.0
+      vue-demi: ^0.14.6
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+
   '@vue/babel-helper-vue-transform-on@1.2.5':
   '@vue/babel-helper-vue-transform-on@1.2.5':
     resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==}
     resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==}
 
 
@@ -1893,6 +1915,9 @@ packages:
   '@vue/compiler-vue2@2.7.16':
   '@vue/compiler-vue2@2.7.16':
     resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
     resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
 
 
+  '@vue/component-compiler-utils@3.3.0':
+    resolution: {integrity: sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==}
+
   '@vue/devtools-api@6.6.4':
   '@vue/devtools-api@6.6.4':
     resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
     resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
 
 
@@ -2471,6 +2496,172 @@ packages:
     resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
     resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
     engines: {node: ^14.18.0 || >=16.10.0}
     engines: {node: ^14.18.0 || >=16.10.0}
 
 
+  consolidate@0.15.1:
+    resolution: {integrity: sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==}
+    engines: {node: '>= 0.10.0'}
+    deprecated: Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog
+    peerDependencies:
+      arc-templates: ^0.5.3
+      atpl: '>=0.7.6'
+      babel-core: ^6.26.3
+      bracket-template: ^1.1.5
+      coffee-script: ^1.12.7
+      dot: ^1.1.3
+      dust: ^0.3.0
+      dustjs-helpers: ^1.7.4
+      dustjs-linkedin: ^2.7.5
+      eco: ^1.1.0-rc-3
+      ect: ^0.5.9
+      ejs: ^3.1.5
+      haml-coffee: ^1.14.1
+      hamlet: ^0.3.3
+      hamljs: ^0.6.2
+      handlebars: ^4.7.6
+      hogan.js: ^3.0.2
+      htmling: ^0.0.8
+      jade: ^1.11.0
+      jazz: ^0.0.18
+      jqtpl: ~1.1.0
+      just: ^0.1.8
+      liquid-node: ^3.0.1
+      liquor: ^0.0.5
+      lodash: ^4.17.20
+      marko: ^3.14.4
+      mote: ^0.2.0
+      mustache: ^3.0.0
+      nunjucks: ^3.2.2
+      plates: ~0.4.11
+      pug: ^3.0.0
+      qejs: ^3.0.5
+      ractive: ^1.3.12
+      razor-tmpl: ^1.3.1
+      react: ^16.13.1
+      react-dom: ^16.13.1
+      slm: ^2.0.0
+      squirrelly: ^5.1.0
+      swig: ^1.4.2
+      swig-templates: ^2.0.3
+      teacup: ^2.0.0
+      templayed: '>=0.2.3'
+      then-jade: '*'
+      then-pug: '*'
+      tinyliquid: ^0.2.34
+      toffee: ^0.3.6
+      twig: ^1.15.2
+      twing: ^5.0.2
+      underscore: ^1.11.0
+      vash: ^0.13.0
+      velocityjs: ^2.0.1
+      walrus: ^0.10.1
+      whiskers: ^0.4.0
+    peerDependenciesMeta:
+      arc-templates:
+        optional: true
+      atpl:
+        optional: true
+      babel-core:
+        optional: true
+      bracket-template:
+        optional: true
+      coffee-script:
+        optional: true
+      dot:
+        optional: true
+      dust:
+        optional: true
+      dustjs-helpers:
+        optional: true
+      dustjs-linkedin:
+        optional: true
+      eco:
+        optional: true
+      ect:
+        optional: true
+      ejs:
+        optional: true
+      haml-coffee:
+        optional: true
+      hamlet:
+        optional: true
+      hamljs:
+        optional: true
+      handlebars:
+        optional: true
+      hogan.js:
+        optional: true
+      htmling:
+        optional: true
+      jade:
+        optional: true
+      jazz:
+        optional: true
+      jqtpl:
+        optional: true
+      just:
+        optional: true
+      liquid-node:
+        optional: true
+      liquor:
+        optional: true
+      lodash:
+        optional: true
+      marko:
+        optional: true
+      mote:
+        optional: true
+      mustache:
+        optional: true
+      nunjucks:
+        optional: true
+      plates:
+        optional: true
+      pug:
+        optional: true
+      qejs:
+        optional: true
+      ractive:
+        optional: true
+      razor-tmpl:
+        optional: true
+      react:
+        optional: true
+      react-dom:
+        optional: true
+      slm:
+        optional: true
+      squirrelly:
+        optional: true
+      swig:
+        optional: true
+      swig-templates:
+        optional: true
+      teacup:
+        optional: true
+      templayed:
+        optional: true
+      then-jade:
+        optional: true
+      then-pug:
+        optional: true
+      tinyliquid:
+        optional: true
+      toffee:
+        optional: true
+      twig:
+        optional: true
+      twing:
+        optional: true
+      underscore:
+        optional: true
+      vash:
+        optional: true
+      velocityjs:
+        optional: true
+      walrus:
+        optional: true
+      whiskers:
+        optional: true
+
   constant-case@3.0.4:
   constant-case@3.0.4:
     resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==}
     resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==}
 
 
@@ -3444,6 +3635,9 @@ packages:
     resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
     resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
     engines: {node: '>=0.10.0'}
     engines: {node: '>=0.10.0'}
 
 
+  hash-sum@1.0.2:
+    resolution: {integrity: sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==}
+
   hasown@2.0.0:
   hasown@2.0.0:
     resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
     resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
     engines: {node: '>= 0.4'}
     engines: {node: '>= 0.4'}
@@ -3800,6 +3994,9 @@ packages:
   js-base64@2.6.4:
   js-base64@2.6.4:
     resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
     resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
 
 
+  js-pinyin@0.2.7:
+    resolution: {integrity: sha512-Dbm7qJDwlC2MRHRXQo7GrVrL5w975tEOX6sfc0M8Z3oL9VhR4uUqgkwaETMqh4bAJ14w4zVs3tXsi9pDxWUmNg==}
+
   js-tokens@4.0.0:
   js-tokens@4.0.0:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
 
 
@@ -3988,6 +4185,9 @@ packages:
     resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
     resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
     engines: {node: 14 || >=16.14}
     engines: {node: 14 || >=16.14}
 
 
+  lru-cache@4.1.5:
+    resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==}
+
   lru-cache@5.1.1:
   lru-cache@5.1.1:
     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
 
 
@@ -4079,6 +4279,9 @@ packages:
     resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
     resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
     engines: {node: '>=4'}
     engines: {node: '>=4'}
 
 
+  merge-source-map@1.1.0:
+    resolution: {integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==}
+
   merge-stream@2.0.0:
   merge-stream@2.0.0:
     resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
     resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
 
 
@@ -4592,6 +4795,9 @@ packages:
   perfect-debounce@1.0.0:
   perfect-debounce@1.0.0:
     resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
     resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
 
 
+  picocolors@0.2.1:
+    resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==}
+
   picocolors@1.1.1:
   picocolors@1.1.1:
     resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
     resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
 
 
@@ -4700,6 +4906,10 @@ packages:
     resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
     resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
     engines: {node: '>=0.12'}
     engines: {node: '>=0.12'}
 
 
+  postcss@7.0.39:
+    resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==}
+    engines: {node: '>=6.0.0'}
+
   postcss@8.4.49:
   postcss@8.4.49:
     resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
     resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
     engines: {node: ^10 || ^12 || >=14}
     engines: {node: ^10 || ^12 || >=14}
@@ -4725,6 +4935,11 @@ packages:
     resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
     resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
     engines: {node: '>= 0.8.0'}
     engines: {node: '>= 0.8.0'}
 
 
+  prettier@2.8.8:
+    resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+
   pretty-ms@9.2.0:
   pretty-ms@9.2.0:
     resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
     resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
     engines: {node: '>=18'}
     engines: {node: '>=18'}
@@ -4743,6 +4958,9 @@ packages:
   proxy-from-env@1.1.0:
   proxy-from-env@1.1.0:
     resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
     resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
 
 
+  pseudomap@1.0.2:
+    resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
+
   punycode@2.3.1:
   punycode@2.3.1:
     resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
     resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
@@ -5907,6 +6125,9 @@ packages:
   vscode-uri@3.0.8:
   vscode-uri@3.0.8:
     resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
     resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
 
 
+  vue-cropper@1.1.4:
+    resolution: {integrity: sha512-5m98vBsCEI9rbS4JxELxXidtAui3qNyTHLHg67Qbn7g8cg+E6LcnC+hh3SM/p94x6mFh6KRxT1ttnta+wCYqWA==}
+
   vue-demi@0.14.10:
   vue-demi@0.14.10:
     resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
     resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
     engines: {node: '>=12'}
     engines: {node: '>=12'}
@@ -5942,6 +6163,9 @@ packages:
     peerDependencies:
     peerDependencies:
       vue: ^3.2.0
       vue: ^3.2.0
 
 
+  vue-template-es2015-compiler@1.9.1:
+    resolution: {integrity: sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==}
+
   vue-tsc@2.1.10:
   vue-tsc@2.1.10:
     resolution: {integrity: sha512-RBNSfaaRHcN5uqVqJSZh++Gy/YUzryuv9u1aFWhsammDJXNtUiJMNoJ747lZcQ68wUQFx6E73y4FY3D8E7FGMA==}
     resolution: {integrity: sha512-RBNSfaaRHcN5uqVqJSZh++Gy/YUzryuv9u1aFWhsammDJXNtUiJMNoJ747lZcQ68wUQFx6E73y4FY3D8E7FGMA==}
     hasBin: true
     hasBin: true
@@ -6022,6 +6246,9 @@ packages:
     resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
     resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
     engines: {node: '>=10'}
     engines: {node: '>=10'}
 
 
+  yallist@2.1.2:
+    resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==}
+
   yallist@3.1.1:
   yallist@3.1.1:
     resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
     resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
 
 
@@ -7789,6 +8016,11 @@ snapshots:
       path-browserify: 1.0.1
       path-browserify: 1.0.1
       vscode-uri: 3.0.8
       vscode-uri: 3.0.8
 
 
+  '@vue-office/docx@1.6.3(vue-demi@0.14.10(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))':
+    dependencies:
+      vue: 3.5.13(typescript@5.6.3)
+      vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3))
+
   '@vue/babel-helper-vue-transform-on@1.2.5': {}
   '@vue/babel-helper-vue-transform-on@1.2.5': {}
 
 
   '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.0)':
   '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.0)':
@@ -7854,6 +8086,73 @@ snapshots:
       de-indent: 1.0.2
       de-indent: 1.0.2
       he: 1.2.0
       he: 1.2.0
 
 
+  '@vue/component-compiler-utils@3.3.0(handlebars@4.7.8)(lodash@4.17.21)':
+    dependencies:
+      consolidate: 0.15.1(handlebars@4.7.8)(lodash@4.17.21)
+      hash-sum: 1.0.2
+      lru-cache: 4.1.5
+      merge-source-map: 1.1.0
+      postcss: 7.0.39
+      postcss-selector-parser: 6.1.2
+      source-map: 0.6.1
+      vue-template-es2015-compiler: 1.9.1
+    optionalDependencies:
+      prettier: 2.8.8
+    transitivePeerDependencies:
+      - arc-templates
+      - atpl
+      - babel-core
+      - bracket-template
+      - coffee-script
+      - dot
+      - dust
+      - dustjs-helpers
+      - dustjs-linkedin
+      - eco
+      - ect
+      - ejs
+      - haml-coffee
+      - hamlet
+      - hamljs
+      - handlebars
+      - hogan.js
+      - htmling
+      - jade
+      - jazz
+      - jqtpl
+      - just
+      - liquid-node
+      - liquor
+      - lodash
+      - marko
+      - mote
+      - mustache
+      - nunjucks
+      - plates
+      - pug
+      - qejs
+      - ractive
+      - razor-tmpl
+      - react
+      - react-dom
+      - slm
+      - squirrelly
+      - swig
+      - swig-templates
+      - teacup
+      - templayed
+      - then-jade
+      - then-pug
+      - tinyliquid
+      - toffee
+      - twig
+      - twing
+      - underscore
+      - vash
+      - velocityjs
+      - walrus
+      - whiskers
+
   '@vue/devtools-api@6.6.4': {}
   '@vue/devtools-api@6.6.4': {}
 
 
   '@vue/devtools-core@7.6.7(vite@6.0.3(@types/node@22.5.5)(jiti@2.4.1)(sass-embedded@1.82.0)(sass@1.79.2)(terser@5.33.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.13(typescript@5.6.3))':
   '@vue/devtools-core@7.6.7(vite@6.0.3(@types/node@22.5.5)(jiti@2.4.1)(sass-embedded@1.82.0)(sass@1.79.2)(terser@5.33.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.13(typescript@5.6.3))':
@@ -8498,6 +8797,13 @@ snapshots:
 
 
   consola@3.2.3: {}
   consola@3.2.3: {}
 
 
+  consolidate@0.15.1(handlebars@4.7.8)(lodash@4.17.21):
+    dependencies:
+      bluebird: 3.7.2
+    optionalDependencies:
+      handlebars: 4.7.8
+      lodash: 4.17.21
+
   constant-case@3.0.4:
   constant-case@3.0.4:
     dependencies:
     dependencies:
       no-case: 3.0.4
       no-case: 3.0.4
@@ -9632,6 +9938,8 @@ snapshots:
       is-number: 3.0.0
       is-number: 3.0.0
       kind-of: 4.0.0
       kind-of: 4.0.0
 
 
+  hash-sum@1.0.2: {}
+
   hasown@2.0.0:
   hasown@2.0.0:
     dependencies:
     dependencies:
       function-bind: 1.1.2
       function-bind: 1.1.2
@@ -9961,6 +10269,8 @@ snapshots:
 
 
   js-base64@2.6.4: {}
   js-base64@2.6.4: {}
 
 
+  js-pinyin@0.2.7: {}
+
   js-tokens@4.0.0: {}
   js-tokens@4.0.0: {}
 
 
   js-tokens@9.0.1: {}
   js-tokens@9.0.1: {}
@@ -10148,6 +10458,11 @@ snapshots:
 
 
   lru-cache@10.2.0: {}
   lru-cache@10.2.0: {}
 
 
+  lru-cache@4.1.5:
+    dependencies:
+      pseudomap: 1.0.2
+      yallist: 2.1.2
+
   lru-cache@5.1.1:
   lru-cache@5.1.1:
     dependencies:
     dependencies:
       yallist: 3.1.1
       yallist: 3.1.1
@@ -10296,6 +10611,10 @@ snapshots:
     dependencies:
     dependencies:
       is-plain-obj: 1.1.0
       is-plain-obj: 1.1.0
 
 
+  merge-source-map@1.1.0:
+    dependencies:
+      source-map: 0.6.1
+
   merge-stream@2.0.0: {}
   merge-stream@2.0.0: {}
 
 
   merge2@1.4.1: {}
   merge2@1.4.1: {}
@@ -10922,6 +11241,8 @@ snapshots:
 
 
   perfect-debounce@1.0.0: {}
   perfect-debounce@1.0.0: {}
 
 
+  picocolors@0.2.1: {}
+
   picocolors@1.1.1: {}
   picocolors@1.1.1: {}
 
 
   picomatch@2.3.1: {}
   picomatch@2.3.1: {}
@@ -11029,6 +11350,11 @@ snapshots:
       source-map: 0.5.7
       source-map: 0.5.7
       supports-color: 3.2.3
       supports-color: 3.2.3
 
 
+  postcss@7.0.39:
+    dependencies:
+      picocolors: 0.2.1
+      source-map: 0.6.1
+
   postcss@8.4.49:
   postcss@8.4.49:
     dependencies:
     dependencies:
       nanoid: 3.3.8
       nanoid: 3.3.8
@@ -11060,6 +11386,9 @@ snapshots:
 
 
   prelude-ls@1.2.1: {}
   prelude-ls@1.2.1: {}
 
 
+  prettier@2.8.8:
+    optional: true
+
   pretty-ms@9.2.0:
   pretty-ms@9.2.0:
     dependencies:
     dependencies:
       parse-ms: 4.0.0
       parse-ms: 4.0.0
@@ -11075,6 +11404,8 @@ snapshots:
 
 
   proxy-from-env@1.1.0: {}
   proxy-from-env@1.1.0: {}
 
 
+  pseudomap@1.0.2: {}
+
   punycode@2.3.1: {}
   punycode@2.3.1: {}
 
 
   qs@6.13.1:
   qs@6.13.1:
@@ -12340,6 +12671,8 @@ snapshots:
 
 
   vscode-uri@3.0.8: {}
   vscode-uri@3.0.8: {}
 
 
+  vue-cropper@1.1.4: {}
+
   vue-demi@0.14.10(vue@3.5.13(typescript@5.6.3)):
   vue-demi@0.14.10(vue@3.5.13(typescript@5.6.3)):
     dependencies:
     dependencies:
       vue: 3.5.13(typescript@5.6.3)
       vue: 3.5.13(typescript@5.6.3)
@@ -12372,6 +12705,8 @@ snapshots:
       '@vue/devtools-api': 6.6.4
       '@vue/devtools-api': 6.6.4
       vue: 3.5.13(typescript@5.6.3)
       vue: 3.5.13(typescript@5.6.3)
 
 
+  vue-template-es2015-compiler@1.9.1: {}
+
   vue-tsc@2.1.10(typescript@5.6.3):
   vue-tsc@2.1.10(typescript@5.6.3):
     dependencies:
     dependencies:
       '@volar/typescript': 2.4.10
       '@volar/typescript': 2.4.10
@@ -12454,6 +12789,8 @@ snapshots:
 
 
   y18n@5.0.8: {}
   y18n@5.0.8: {}
 
 
+  yallist@2.1.2: {}
+
   yallist@3.1.1: {}
   yallist@3.1.1: {}
 
 
   yallist@4.0.0: {}
   yallist@4.0.0: {}

+ 4 - 0
src/assets/styles/globals.css

@@ -336,6 +336,10 @@ textarea {
 /* dialog对话框样式 */
 /* dialog对话框样式 */
 
 
 /* 全局样式 */
 /* 全局样式 */
+.el-message {
+  z-index: 9999999 !important;
+}
+
 .bg-\[var\(--g-sub-sidebar-menu-active-bg\)\]\! {
 .bg-\[var\(--g-sub-sidebar-menu-active-bg\)\]\! {
   background:
   background:
     var(--g-sub-sidebar-menu-active-bg)
     var(--g-sub-sidebar-menu-active-bg)

+ 20 - 10
src/components/ruleCondition/index.vue

@@ -62,6 +62,8 @@
 <script lang='ts' setup>
 <script lang='ts' setup>
 import { ref, reactive } from 'vue'
 import { ref, reactive } from 'vue'
 import api from '@/api'
 import api from '@/api'
+import { ElMessage } from 'element-plus'
+
 import { defineProps, defineEmits } from "vue";
 import { defineProps, defineEmits } from "vue";
 const props = defineProps<{
 const props = defineProps<{
   ruleConditionVisible: boolean,
   ruleConditionVisible: boolean,
@@ -76,6 +78,7 @@ const close = () => {
 }
 }
 watch(props, () => {
 watch(props, () => {
   if (props.attrIdList && props.attrIdList.length) {
   if (props.attrIdList && props.attrIdList.length) {
+    console.log(props.attrIdList)
     attractivelist.value = props.attrIdList;//获取编辑数据
     attractivelist.value = props.attrIdList;//获取编辑数据
     const matchedid = matchDataByIds(attractivelist.value);//
     const matchedid = matchDataByIds(attractivelist.value);//
     const matchedinfo = matchDataByInfos(attractivelist.value)
     const matchedinfo = matchDataByInfos(attractivelist.value)
@@ -99,6 +102,13 @@ const save = () => {
     ...checkeddata.InsuranceInformation,
     ...checkeddata.InsuranceInformation,
     ...checkeddata.InsuranceCostFactor,
     ...checkeddata.InsuranceCostFactor,
   ]
   ]
+  if (mergedData.length == 0) {
+    return ElMessage({
+      type: 'error',
+      message: '至少选一个',
+      plain: true,
+    })
+  }
   emits("save", mergedData)// 返回已选集合
   emits("save", mergedData)// 返回已选集合
 }
 }
 const attractivelist = ref();
 const attractivelist = ref();
@@ -126,6 +136,7 @@ const matchDataByInfos = (idCollection: any) => {
         // 如果找到匹配项,将 minArray 和 min 赋值给 item
         // 如果找到匹配项,将 minArray 和 min 赋值给 item
         item.minArray = match.minArray;
         item.minArray = match.minArray;
         item.min = match.min;
         item.min = match.min;
+        item.max = match.max;
         return true; // 保留该项
         return true; // 保留该项
       }
       }
       return false; // 不保留该项
       return false; // 不保留该项
@@ -212,21 +223,20 @@ interface dataStore {
 }
 }
 
 
 onMounted(() => {
 onMounted(() => {
-    ruleAttr();
-    regionLicenseRegion('0');//车牌地区
-    regionLicenseNumber('14');//车牌号
+  ruleAttr();
+  regionLicenseRegion('0');//车牌地区
+  regionLicenseNumber('14');//车牌号
 })
 })
 
 
 const ruleAttr = () => {
 const ruleAttr = () => {
   api.agreementApi.ruleAttrGroup({ attrName: attrName.value }).then((res: any) => {
   api.agreementApi.ruleAttrGroup({ attrName: attrName.value }).then((res: any) => {
     if (res.code == '200') {
     if (res.code == '200') {
-      dataStore.VehicleInformation = processArray(res.data.VehicleInformation);
-      dataStore.VehicleOwnerInformation = processArray(res.data.VehicleOwnerInformation);
-      dataStore.PolicyholderInformation = processArray(res.data.PolicyholderInformation);
-      dataStore.InsuredInformation = processArray(res.data.InsuredInformation);
-      dataStore.InsuranceInformation = processArray(res.data.InsuranceInformation);
-      dataStore.InsuranceCostFactor = processArray(res.data.InsuranceCostFactor);
-    } else {
+      dataStore.VehicleInformation = res.data.VehicleInformation ? processArray(res.data.VehicleInformation) : [];
+      dataStore.VehicleOwnerInformation = res.data.VehicleOwnerInformation ? processArray(res.data.VehicleOwnerInformation) : [];
+      dataStore.PolicyholderInformation = res.data.PolicyholderInformation ? processArray(res.data.PolicyholderInformation) : [];
+      dataStore.InsuredInformation = res.data.InsuredInformation ? processArray(res.data.InsuredInformation) : [];
+      dataStore.InsuranceInformation = res.data.InsuranceInformation ? processArray(res.data.InsuranceInformation) : [];
+      dataStore.InsuranceCostFactor = res.data.InsuranceCostFactor ? processArray(res.data.InsuranceCostFactor) : [];
     }
     }
   });
   });
 }
 }

+ 5 - 3
src/layouts/components/DrivingType/index.vue

@@ -24,7 +24,7 @@
             show-checkbox
             show-checkbox
             node-key="id"
             node-key="id"
             @check="handleCheckChange"
             @check="handleCheckChange"
-            :check-strictly="true"
+            :check-strictly="false"
             :default-expand-all="true"
             :default-expand-all="true"
             :default-checked-keys="selectedKeys"
             :default-checked-keys="selectedKeys"
             :filter-node-method="handleSearchName"
             :filter-node-method="handleSearchName"
@@ -86,6 +86,8 @@ const defaultProps = {
   label: 'productName',
   label: 'productName',
 }
 }
 const handleCheckChange = (data, row) => {
 const handleCheckChange = (data, row) => {
+  console.log(11111, data)
+  console.log(22222, row)
   if(row.checkedNodes.length > 0) {
   if(row.checkedNodes.length > 0) {
     let list1 = row.checkedNodes.filter(a => a.parentId == '0')
     let list1 = row.checkedNodes.filter(a => a.parentId == '0')
     let list2 = row.checkedNodes.filter(a => a.parentId != '0')
     let list2 = row.checkedNodes.filter(a => a.parentId != '0')
@@ -95,7 +97,7 @@ const handleCheckChange = (data, row) => {
     } else {
     } else {
       selectedList.value = list2
       selectedList.value = list2
     }
     }
-    selectedList.value .forEach(item => {
+    selectedList.value.forEach(item => {
       item.drivingIntentionId = item.id
       item.drivingIntentionId = item.id
     })
     })
   }
   }
@@ -158,7 +160,7 @@ const initEditData = (data, index, id) => {
   // })
   // })
   // let list = [...JYXList.value]
   // let list = [...JYXList.value]
   api.projectApi.jyxList({
   api.projectApi.jyxList({
-    company: id?id:'1738811735599380291'
+    company: '1738811735599380291'
   }).then(res => {
   }).then(res => {
     if(res.code == 200) {
     if(res.code == 200) {
       if(res.data && res.data.length > 0) {
       if(res.data && res.data.length > 0) {

+ 3 - 6
src/store/modules/user.ts

@@ -46,15 +46,12 @@ const useUserStore = defineStore(
     }
     }
     //获取运营交付菜单
     //获取运营交付菜单
     async function getMenu(codeItem) {
     async function getMenu(codeItem) {
-        const res = await api.menuApi.getTenantConfig({...codeItem})
-
-
-
-       if(res.code===200){
+      const res = await api.menuApi.getTenantConfig({...codeItem})
+      if(res.code===200){
         // staticRouter.value=JSON.parse(res.data.sysConfig)
         // staticRouter.value=JSON.parse(res.data.sysConfig)
         localStorage.setItem("menu",res.data.sysConfig)
         localStorage.setItem("menu",res.data.sysConfig)
         // routeStore.routesRaw=JSON.parse(res.data.sysConfig)
         // routeStore.routesRaw=JSON.parse(res.data.sysConfig)
-       }
+      }
     }
     }
     // 登出
     // 登出
     async function logout(redirect = router.currentRoute.value.fullPath) {
     async function logout(redirect = router.currentRoute.value.fullPath) {

+ 30 - 2
src/views/externalAgreement/agreement/agreementAdd.vue

@@ -84,6 +84,13 @@
               }}</el-input>
               }}</el-input>
             </el-form-item>
             </el-form-item>
           </ElCol>
           </ElCol>
+          <ElCol :md="24" :lg="6">
+            <el-form-item label="api类型" prop="apiType">
+              <el-select v-model="agreementFrom.apiType">
+                <el-option v-for="item in apiOptions" :label="item.label" :value="item.value" :key="item.value"></el-option>
+              </el-select>
+            </el-form-item>
+          </ElCol>
         </el-form>
         </el-form>
       </ElRow>
       </ElRow>
 
 
@@ -156,7 +163,7 @@ const agreementFrom: AgreementForm = reactive({
   companyId: "",//保险公司id
   companyId: "",//保险公司id
   agreementType: "",//协议类型
   agreementType: "",//协议类型
   custodianId: "",//管理人id
   custodianId: "",//管理人id
-
+  apiType: ''
 })
 })
 const validatepassword = (_rule: any, value: any, callback: any) => {
 const validatepassword = (_rule: any, value: any, callback: any) => {
   // 定义正则表达式,例如:只允许字母、数字,长度在4到10个字符之间
   // 定义正则表达式,例如:只允许字母、数字,长度在4到10个字符之间
@@ -218,7 +225,9 @@ const agreementFromRules = ref<FormRules>({
   attributionId: [
   attributionId: [
     { required: true, trigger: 'change', message: '请选择出单账号' },
     { required: true, trigger: 'change', message: '请选择出单账号' },
   ],
   ],
-
+  apiType: [
+    { required: true, trigger: 'change', message: '请选择api类型' },
+  ]
 });
 });
 onBeforeMount(async () => {
 onBeforeMount(async () => {
   await loadDicts(['agreement_type', 'with_tax']);//获取多个字典
   await loadDicts(['agreement_type', 'with_tax']);//获取多个字典
@@ -241,7 +250,9 @@ const detailsInfo = () => {
           agreementFrom[key as keyof AgreementForm] = res.data.agreement[key] as AgreementForm[keyof AgreementForm];
           agreementFrom[key as keyof AgreementForm] = res.data.agreement[key] as AgreementForm[keyof AgreementForm];
         }
         }
       });
       });
+      managerName.value = res.data.agreement.managerName + ' - ' + res.data.agreement.deptName;
     } else {
     } else {
+
     }
     }
   });
   });
 }
 }
@@ -356,9 +367,26 @@ const managerModalsave = (id: string, name: string, deptName: string) => {
   agreementFrom.custodianId = id;
   agreementFrom.custodianId = id;
   managerName.value = name + ' - ' + deptName;
   managerName.value = name + ' - ' + deptName;
   managerModalVisible.value = false;
   managerModalVisible.value = false;
+}
 
 
+let apiOptions = ref([])
+const getApi = () => {
+  api.commonApi.personInfo('api_type').then(res => {
+    if(res.code == 200) {
+      apiOptions.value = res.data
+    } else {
+      ElMessage({
+        message: res.msg,
+        type: 'warning'
+      })
+    }
+  })
 }
 }
 
 
+onMounted(() => {
+  getApi()
+})
+
 </script>
 </script>
 <style lang="scss" scoped>
 <style lang="scss" scoped>
 .disabled :deep(.el-upload--picture-card) {
 .disabled :deep(.el-upload--picture-card) {

+ 0 - 5
src/views/externalAgreement/agreement/agreementDetails.vue

@@ -19,7 +19,6 @@
                     <el-dropdown-item command="启用" v-if="agreementInfo.isEnable == '1'">启用</el-dropdown-item>
                     <el-dropdown-item command="启用" v-if="agreementInfo.isEnable == '1'">启用</el-dropdown-item>
                     <el-dropdown-item command="禁用" v-else>禁用</el-dropdown-item>
                     <el-dropdown-item command="禁用" v-else>禁用</el-dropdown-item>
                     <el-dropdown-item command="删除">删除</el-dropdown-item>
                     <el-dropdown-item command="删除">删除</el-dropdown-item>
-                    <el-dropdown-item command="分配管理人">复制协议</el-dropdown-item>
                   </el-dropdown-menu>
                   </el-dropdown-menu>
                 </template>
                 </template>
               </el-dropdown>
               </el-dropdown>
@@ -67,8 +66,6 @@
             <el-descriptions-item label="保险公司:"> {{ agreementInfo.companyId }}</el-descriptions-item>
             <el-descriptions-item label="保险公司:"> {{ agreementInfo.companyId }}</el-descriptions-item>
             <el-descriptions-item label="协议类型:">{{ agreementInfo.agreementType }} </el-descriptions-item>
             <el-descriptions-item label="协议类型:">{{ agreementInfo.agreementType }} </el-descriptions-item>
             <el-descriptions-item label="管理人:"> {{ agreementInfo.custodianId }}</el-descriptions-item>
             <el-descriptions-item label="管理人:"> {{ agreementInfo.custodianId }}</el-descriptions-item>
-            <el-descriptions-item label="对接人:"> {{ agreementInfo.dockingPerson }} </el-descriptions-item>
-            <el-descriptions-item label="对接人手机号:"> {{ agreementInfo.dockingPhone }} </el-descriptions-item>
           </el-descriptions>
           </el-descriptions>
         </el-tab-pane>
         </el-tab-pane>
         <el-tab-pane label="费用管理" name="costManagement">
         <el-tab-pane label="费用管理" name="costManagement">
@@ -310,8 +307,6 @@ const dropdownCommand = (e: any) => {
           });
           });
         })
         })
       break;
       break;
-    case '复制协议':
-      break;
     default:
     default:
       break;
       break;
   }
   }

+ 1 - 10
src/views/externalAgreement/agreement/agreementIndex.vue

@@ -41,7 +41,6 @@
                 <el-dropdown-item @click="enable(scope.operationData.id)">启用</el-dropdown-item>
                 <el-dropdown-item @click="enable(scope.operationData.id)">启用</el-dropdown-item>
                 <el-dropdown-item @click="disable(scope.operationData.id)">禁用</el-dropdown-item>
                 <el-dropdown-item @click="disable(scope.operationData.id)">禁用</el-dropdown-item>
                 <el-dropdown-item @click="del(scope.operationData.id)">删除</el-dropdown-item>
                 <el-dropdown-item @click="del(scope.operationData.id)">删除</el-dropdown-item>
-                <el-dropdown-item @click="agreemenCopy(scope.operationData.id)">复制协议</el-dropdown-item>
                 <el-dropdown-item @click="batchAuthorization(scope.operationData.id)">协议授权</el-dropdown-item>
                 <el-dropdown-item @click="batchAuthorization(scope.operationData.id)">协议授权</el-dropdown-item>
               </el-dropdown-menu>
               </el-dropdown-menu>
             </template>
             </template>
@@ -319,15 +318,7 @@ const batchAuthorization = (value: string) => {
   });
   });
 
 
 }
 }
-//复制协议
-const agreemenCopy = (id:string) => {
-  router.push({
-    name: 'AgreementCopy',
-    query: {
-      id: id
-    }
-  })
-}
+
 //禁用
 //禁用
 const disable = (value: string) => {
 const disable = (value: string) => {
   ElMessageBox.confirm(
   ElMessageBox.confirm(

+ 12 - 2
src/views/externalAgreement/agreement/components/contactPersonFeeDialog.vue

@@ -12,7 +12,7 @@
             class="flex a-c f-wrap" :size="fromSize">
             class="flex a-c f-wrap" :size="fromSize">
             <ElCol :md="24" :lg="18">
             <ElCol :md="24" :lg="18">
               <el-form-item label="协议" :prop="addMethod == 'list' ? 'ptlAgreementId' : ''">
               <el-form-item label="协议" :prop="addMethod == 'list' ? 'ptlAgreementId' : ''">
-                <el-select v-if="addMethod == 'list'" v-model="ruleFeeinfo.ptlAgreementId" placeholder="选择协议"
+                <el-select v-if="addMethod == 'list'" v-model="ruleFeeinfo.ptlAgreementId" placeholder="选择协议" @change="ptlAgreementIdChange"
                   :disabled="props.title != '添加'">
                   :disabled="props.title != '添加'">
                   <el-option v-for="item in agreementselect" :key="item.id" :label="item.agreementTitle"
                   <el-option v-for="item in agreementselect" :key="item.id" :label="item.agreementTitle"
                     :value="item.id" />
                     :value="item.id" />
@@ -185,6 +185,7 @@ const props = defineProps<{
 interface ruleFeeinfo {
 interface ruleFeeinfo {
   ptlAgreementId: string,
   ptlAgreementId: string,
   contactPerson: string,
   contactPerson: string,
+  agreementTitle:string,
   contactMobile: string,
   contactMobile: string,
   ptlAgreementCostExternalAddList: any[],
   ptlAgreementCostExternalAddList: any[],
 }
 }
@@ -192,6 +193,7 @@ interface ruleFeeinfo {
 const emits = defineEmits(["cancel", 'save']);
 const emits = defineEmits(["cancel", 'save']);
 const ruleFeeinfo = reactive<ruleFeeinfo>({
 const ruleFeeinfo = reactive<ruleFeeinfo>({
   ptlAgreementId: "",//协议id
   ptlAgreementId: "",//协议id
+  agreementTitle:"",
   contactPerson: "",//对接人
   contactPerson: "",//对接人
   contactMobile: "",//手机号
   contactMobile: "",//手机号
   ptlAgreementCostExternalAddList: [],//费用集合
   ptlAgreementCostExternalAddList: [],//费用集合
@@ -229,6 +231,10 @@ watch(props, () => {
     Object.assign(ruleFeeinfo, props.contactPersonEditInfo);
     Object.assign(ruleFeeinfo, props.contactPersonEditInfo);
     activeName.value = ruleFeeinfo.ptlAgreementCostExternalAddList[0].productName;
     activeName.value = ruleFeeinfo.ptlAgreementCostExternalAddList[0].productName;
   }
   }
+  if(props.agreementInfo){
+  agreementActiveId.value=props.agreementInfo.id;
+
+  }
 })
 })
 onMounted(async () => {
 onMounted(async () => {
   await loadDicts(['insurance_type'])
   await loadDicts(['insurance_type'])
@@ -249,6 +255,10 @@ onMounted(async () => {
     }
     }
   })
   })
 })
 })
+const ptlAgreementIdChange=(value:any)=>{
+let info=agreementselect.value.find((val:any)=>val.id==value);
+ruleFeeinfo.agreementTitle= info.agreementTitle;
+}
 // 协议列表
 // 协议列表
 const agreementList = () => {
 const agreementList = () => {
   api.agreementApi.agreementList({ pages: 1, size: 100, isExternal: '1' }).then((res: any) => {
   api.agreementApi.agreementList({ pages: 1, size: 100, isExternal: '1' }).then((res: any) => {
@@ -398,7 +408,7 @@ const filterCostTypeList = (name: string) => {
     if (name === "单交" && item.costType === "商业险") {
     if (name === "单交" && item.costType === "商业险") {
       return false; // 当 name 为 "单交" 且 costType 为 "商业险" 时,返回 false,不包含该项
       return false; // 当 name 为 "单交" 且 costType 为 "商业险" 时,返回 false,不包含该项
     }
     }
-    if (name === "单三" && item.costType === "商业险") {
+    if (name === "单三" && item.costType === "交强险") {
       return false; // 当 name 为 "单交" 且 costType 为 "商业险" 时,返回 false,不包含该项
       return false; // 当 name 为 "单交" 且 costType 为 "商业险" 时,返回 false,不包含该项
     }
     }
     if (name === "单商" && item.costType === "交强险") {
     if (name === "单商" && item.costType === "交强险") {

+ 0 - 1
src/views/externalAgreement/agreement/components/contactPersonFeeDialogEdit.vue

@@ -69,7 +69,6 @@
             </ElCol>
             </ElCol>
           </el-form>
           </el-form>
         </ElRow>
         </ElRow>
-
         <el-table :data="contactPersonEditInfo.costExternalTypeAdds" style="width: 100%;" border
         <el-table :data="contactPersonEditInfo.costExternalTypeAdds" style="width: 100%;" border
           :header-cell-style="{ 'background-color': '#F7F7F9', 'border-bottom': '1px solid #EEF1F6', 'font-size': '15px', 'color': '#333', 'padding': '10px 0' }">
           :header-cell-style="{ 'background-color': '#F7F7F9', 'border-bottom': '1px solid #EEF1F6', 'font-size': '15px', 'color': '#333', 'padding': '10px 0' }">
           <template #empty>
           <template #empty>

+ 4 - 4
src/views/externalAgreement/agreement/components/managerModal.vue

@@ -14,9 +14,9 @@
         <div class="area">
         <div class="area">
           <el-radio-group v-model="userId">
           <el-radio-group v-model="userId">
             <div class="flex f-c">
             <div class="flex f-c">
-              <el-radio :value="item.id" v-for="(item,index) in managerlist" @change="radioChange" :key="index" class="m-btn-20">
+              <el-radio :value="item.userId" v-for="(item,index) in managerlist" @change="radioChange" :key="index" class="m-btn-20">
                 <div>{{ item.name }}</div>
                 <div>{{ item.name }}</div>
-                <div>{{ item.id }}</div>
+                <div>{{ item.userId }}</div>
               </el-radio>
               </el-radio>
             </div>
             </div>
           </el-radio-group>
           </el-radio-group>
@@ -86,8 +86,8 @@ const searchValueclick=()=>{
   emits('query',searchValue.value)
   emits('query',searchValue.value)
 }
 }
 const radioChange=(value:any)=>{
 const radioChange=(value:any)=>{
-  let name=props.managerlist.find(val=>val.id==value)?.name;
-  let deptname=props.managerlist.find(val=>val.id==value)?.deptName;
+  let name=props.managerlist.find(val=>val.userId==value)?.name;
+  let deptname=props.managerlist.find(val=>val.userId==value)?.deptName;
   username.value=name;
   username.value=name;
   deptName.value=deptname;
   deptName.value=deptname;
 }
 }

+ 0 - 1
src/views/externalAgreement/costManagement.vue

@@ -292,7 +292,6 @@ const agreementSelection = () => {//添加对接人
 
 
 //费用提交
 //费用提交
 const contactPersonSave = (data: object) => {
 const contactPersonSave = (data: object) => {
-  console.log(data);
     api.agreementApi.ptlAgreementCostExternalsave(data).then((res: any) => {
     api.agreementApi.ptlAgreementCostExternalsave(data).then((res: any) => {
       if (res.code == '200') {
       if (res.code == '200') {
         addcontactPersonShow.value = false;
         addcontactPersonShow.value = false;

+ 8 - 7
src/views/personnel/institutionManage.vue

@@ -231,13 +231,14 @@ const columns = [
     prop: "comAttribute",
     prop: "comAttribute",
     label: "展业范围",
     label: "展业范围",
     formatter: (row: any, column: any, cellValue: any) => {
     formatter: (row: any, column: any, cellValue: any) => {
+      let newArr = []
       let comType = "";
       let comType = "";
-      exhibitionScopeTypeList.value.map((ele) => {
-        if (ele.value == row.exhibitionScope) {
-          comType = ele.label;
-        }
-      });
-
+      newArr = exhibitionScopeTypeList.value.filter(item => row.exhibitionScope.some(sub => sub !=item.value))
+      if(newArr.length > 0) {
+        newArr.forEach(item => {
+          comType+=`${item.label} `
+        })
+      }
       return () => h("div", {}, comType);
       return () => h("div", {}, comType);
     },
     },
   },
   },
@@ -512,7 +513,7 @@ onMounted(() => {
   getInstitutionList(); //机构列表
   getInstitutionList(); //机构列表
   // getAreaList(); //省市区级联数据
   // getAreaList(); //省市区级联数据
   getSystemList(); //机构类型字典
   getSystemList(); //机构类型字典
-  // getExhibitionScopeSystemList(); //展业范围字段
+  getExhibitionScopeSystemList(); //展业范围字段
   getAllMemberList();//成员列表
   getAllMemberList();//成员列表
 });
 });
 </script>
 </script>

+ 36 - 4
src/views/quoteConfig/agreement/agreementAdd.vue

@@ -81,7 +81,7 @@
           <ElCol :md="24" :lg="6">
           <ElCol :md="24" :lg="6">
             <el-form-item label="管理人" prop="custodianId">
             <el-form-item label="管理人" prop="custodianId">
               <el-input v-model="managerName" @click="managerModalVisible = true">{{ agreementFrom.custodianId
               <el-input v-model="managerName" @click="managerModalVisible = true">{{ agreementFrom.custodianId
-              }}</el-input>
+                }}</el-input>
             </el-form-item>
             </el-form-item>
           </ElCol>
           </ElCol>
           <ElCol :md="24" :lg="6">
           <ElCol :md="24" :lg="6">
@@ -98,7 +98,14 @@
           <ElCol :md="24" :lg="6">
           <ElCol :md="24" :lg="6">
             <el-form-item label="出单账号" prop="attributionId">
             <el-form-item label="出单账号" prop="attributionId">
               <el-input v-model="attributionName" placeholder="请选择" type="textarea"
               <el-input v-model="attributionName" placeholder="请选择" type="textarea"
-                @click="orderAccountVisible = true" />
+                        @click="orderAccountVisible = true" />
+            </el-form-item>
+          </ElCol>
+          <ElCol :md="24" :lg="6">
+            <el-form-item label="api类型" prop="apiType">
+              <el-select v-model="agreementFrom.apiType">
+                <el-option v-for="item in apiOptions" :label="item.label" :value="item.value" :key="item.value"></el-option>
+              </el-select>
             </el-form-item>
             </el-form-item>
           </ElCol>
           </ElCol>
           <ElCol :md="24" :lg="12">
           <ElCol :md="24" :lg="12">
@@ -228,6 +235,7 @@ const agreementFrom: AgreementForm = reactive({
   dockingPhone: "",//对接人手机号
   dockingPhone: "",//对接人手机号
   attributionId: "",//出单账号id
   attributionId: "",//出单账号id
   fileId: '',//文件
   fileId: '',//文件
+  apiType: ''
 })
 })
 const validatepassword = (_rule: any, value: any, callback: any) => {
 const validatepassword = (_rule: any, value: any, callback: any) => {
   // 定义正则表达式,例如:只允许字母、数字,长度在4到10个字符之间
   // 定义正则表达式,例如:只允许字母、数字,长度在4到10个字符之间
@@ -289,7 +297,9 @@ const agreementFromRules = ref<FormRules>({
   attributionId: [
   attributionId: [
     { required: true, trigger: 'change', message: '请选择出单账号' },
     { required: true, trigger: 'change', message: '请选择出单账号' },
   ],
   ],
-
+  apiType: [
+    { required: true, trigger: 'change', message: '请选择api类型' },
+  ]
 });
 });
 onBeforeMount(async () => {
 onBeforeMount(async () => {
   await loadDicts(['agreement_type', 'with_tax']);//获取多个字典
   await loadDicts(['agreement_type', 'with_tax']);//获取多个字典
@@ -312,6 +322,8 @@ const detailsInfo = () => {
           agreementFrom[key as keyof AgreementForm] = res.data.agreement[key] as AgreementForm[keyof AgreementForm];
           agreementFrom[key as keyof AgreementForm] = res.data.agreement[key] as AgreementForm[keyof AgreementForm];
         }
         }
       });
       });
+      managerName.value = res.data.agreement.managerName + ' - ' + res.data.agreement.deptName;
+      attributionName.value = `用户名:${res.data.agreement.username}\n简称:${res.data.agreement.userAbbr}`;
     } else {
     } else {
     }
     }
   });
   });
@@ -419,7 +431,7 @@ const company = () => {
 //选择管理人
 //选择管理人
 interface managerlist {
 interface managerlist {
   id: string,
   id: string,
-  userId:string,
+  userId: string,
   name: string,
   name: string,
   deptName: string,
   deptName: string,
 }
 }
@@ -460,6 +472,26 @@ const orderAccountSave = (id: string, name: string, userAbbr: string) => {
   attributionUserAbbr.value = userAbbr;
   attributionUserAbbr.value = userAbbr;
   orderAccountVisible.value = false;
   orderAccountVisible.value = false;
 }
 }
+
+let apiOptions = ref([])
+const getApi = () => {
+  api.commonApi.personInfo('api_type').then(res => {
+    console.log(123123213123, res.data)
+    if(res.code == 200) {
+      apiOptions.value = res.data
+    } else {
+      ElMessage({
+        message: res.msg,
+        type: 'warning'
+      })
+    }
+  })
+}
+
+onMounted(() => {
+  getApi()
+})
+
 </script>
 </script>
 <style lang="scss" scoped>
 <style lang="scss" scoped>
 .disabled :deep(.el-upload--picture-card) {
 .disabled :deep(.el-upload--picture-card) {

+ 5 - 6
src/views/quoteConfig/agreement/agreementCopy.vue

@@ -29,7 +29,7 @@
             </el-button>
             </el-button>
             <template #dropdown>
             <template #dropdown>
               <el-dropdown-menu>
               <el-dropdown-menu>
-                <el-dropdown-item :command="item.label" v-for="(item, index) in getDict('valid_status')" :key="index">{{
+                <el-dropdown-item :command="item.label" v-for="(item, index) in valid_status" :key="index">{{
                   item.label }}</el-dropdown-item>
                   item.label }}</el-dropdown-item>
               </el-dropdown-menu>
               </el-dropdown-menu>
             </template>
             </template>
@@ -72,7 +72,7 @@
 import { ref, reactive } from 'vue'
 import { ref, reactive } from 'vue'
 import api from '@/api'
 import api from '@/api'
 import { useRoute, useRouter } from 'vue-router';
 import { useRoute, useRouter } from 'vue-router';
-import { ElMessage, ElMessageBox } from 'element-plus'
+import { ElMessage } from 'element-plus'
 import { loadDicts, getDict } from '@/utils/composables/dictService';//字典组件
 import { loadDicts, getDict } from '@/utils/composables/dictService';//字典组件
 const route = useRoute();
 const route = useRoute();
 const router = useRouter();
 const router = useRouter();
@@ -158,16 +158,15 @@ onBeforeMount(async () => {
   if (id.value) {
   if (id.value) {
     detailsInfo();//协议信息
     detailsInfo();//协议信息
     findpage();
     findpage();
-    valid_status.value = getDict('valid_status')
-    is_enable.value = getDict('is_enable')
+    valid_status.value =[{label:"全部",value:""},...getDict('valid_status')]
+
+    is_enable.value =[{label:"全部",value:""},...getDict('is_enable')]
   }
   }
 })
 })
 //协议详情
 //协议详情
 const detailsInfo = () => {
 const detailsInfo = () => {
   api.agreementApi.agreementGet(id.value).then((res: any) => {
   api.agreementApi.agreementGet(id.value).then((res: any) => {
     if (res.code == '200') {
     if (res.code == '200') {
-      res.data.agreement.fileName = processFileName(res.data.agreement.fileName)
-      res.data.agreement.fileSize = formatFileSize(res.data.agreement.fileSize);
       agreementInfo.value = res.data.agreement;
       agreementInfo.value = res.data.agreement;
       authDeptlength.value = res.data.dept.length;
       authDeptlength.value = res.data.dept.length;
     } else {
     } else {

+ 58 - 34
src/views/quoteConfig/agreement/agreementDetails.vue

@@ -19,7 +19,7 @@
                     <el-dropdown-item command="启用" v-if="agreementInfo.isEnable == '1'">启用</el-dropdown-item>
                     <el-dropdown-item command="启用" v-if="agreementInfo.isEnable == '1'">启用</el-dropdown-item>
                     <el-dropdown-item command="禁用" v-else>禁用</el-dropdown-item>
                     <el-dropdown-item command="禁用" v-else>禁用</el-dropdown-item>
                     <el-dropdown-item command="删除">删除</el-dropdown-item>
                     <el-dropdown-item command="删除">删除</el-dropdown-item>
-                    <el-dropdown-item command="分配管理人">复制协议</el-dropdown-item>
+                    <el-dropdown-item command="复制协议">复制协议</el-dropdown-item>
                   </el-dropdown-menu>
                   </el-dropdown-menu>
                 </template>
                 </template>
               </el-dropdown>
               </el-dropdown>
@@ -57,42 +57,47 @@
             <el-descriptions-item label="协议生效时间:">{{ agreementInfo.startDate }}</el-descriptions-item>
             <el-descriptions-item label="协议生效时间:">{{ agreementInfo.startDate }}</el-descriptions-item>
             <el-descriptions-item label="协议失效时间:">{{ agreementInfo.endDate }}</el-descriptions-item>
             <el-descriptions-item label="协议失效时间:">{{ agreementInfo.endDate }}</el-descriptions-item>
             <el-descriptions-item label="是否含增值税结算:">
             <el-descriptions-item label="是否含增值税结算:">
-              {{ agreementInfo.withTax }}
+              {{  getDict('with_tax').find(val => val.value == agreementInfo.withTax)?.label }}
+
             </el-descriptions-item>
             </el-descriptions-item>
             <el-descriptions-item label="结算周期:">T{{ agreementInfo.moneyTime }} </el-descriptions-item>
             <el-descriptions-item label="结算周期:">T{{ agreementInfo.moneyTime }} </el-descriptions-item>
             <el-descriptions-item label="协议描述:">{{ agreementInfo.agreementName }}</el-descriptions-item>
             <el-descriptions-item label="协议描述:">{{ agreementInfo.agreementName }}</el-descriptions-item>
           </el-descriptions>
           </el-descriptions>
           <el-descriptions title="其他信息" class="m-top-20" :column="3">
           <el-descriptions title="其他信息" class="m-top-20" :column="3">
             <el-descriptions-item label="协议归属:">{{ agreementInfo.deptName }} </el-descriptions-item>
             <el-descriptions-item label="协议归属:">{{ agreementInfo.deptName }} </el-descriptions-item>
-            <el-descriptions-item label="保险公司:"> {{ agreementInfo.companyId }}</el-descriptions-item>
-            <el-descriptions-item label="协议类型:">{{ agreementInfo.agreementType }} </el-descriptions-item>
-            <el-descriptions-item label="管理人:"> {{ agreementInfo.custodianId }}</el-descriptions-item>
+            <el-descriptions-item label="保险公司:"> {{ agreementInfo.company }}</el-descriptions-item>
+            <el-descriptions-item label="协议类型:">{{ getDict('agreement_type').find(val => val.value == agreementInfo.agreementType)?.label}} </el-descriptions-item>
+
+            <el-descriptions-item label="管理人:"> {{ agreementInfo.managerName }}</el-descriptions-item>
             <el-descriptions-item label="对接人:"> {{ agreementInfo.dockingPerson }} </el-descriptions-item>
             <el-descriptions-item label="对接人:"> {{ agreementInfo.dockingPerson }} </el-descriptions-item>
             <el-descriptions-item label="对接人手机号:"> {{ agreementInfo.dockingPhone }} </el-descriptions-item>
             <el-descriptions-item label="对接人手机号:"> {{ agreementInfo.dockingPhone }} </el-descriptions-item>
             <el-descriptions-item label="出单账号:"> {{ agreementInfo.attributionId }} </el-descriptions-item>
             <el-descriptions-item label="出单账号:"> {{ agreementInfo.attributionId }} </el-descriptions-item>
           </el-descriptions>
           </el-descriptions>
-          <span class="strong" style="font-size: 16px;color: #303133;">协议文件</span>
-          <span class="strong m-top-20 m-btn-10" style="display: block;">协议费用政策告知单</span>
-          <div class="agreementNotice flex a-c j-s">
-            <div class="flex  a-c">
-              <img src="../../../assets/images/pdf.png" alt="">
-              <div class="flex f-c j-s">
-                <span>{{ agreementInfo.fileName }}</span>
-                <span>{{ agreementInfo.fileSize }}</span>
+          <div v-if="agreementInfo.fileUrl">
+            <span class="strong" style="font-size: 16px;color: #303133;">协议文件</span>
+            <span class="strong m-top-20 m-btn-10" style="display: block;">协议费用政策告知单</span>
+            <div class="agreementNotice flex a-c j-s">
+              <div class="flex  a-c">
+                <img src="../../../assets/images/pdf.png" alt="">
+                <div class="flex f-c j-s">
+                  <span>{{ agreementInfo.fileName }}</span>
+                  <span>{{ agreementInfo.fileSize }}</span>
+                </div>
               </div>
               </div>
-            </div>
-            <div class="fileBtn flex a-c">
-              <el-upload :show-file-list="false" :auto-upload="false" accept=".pdf, .doc, .docx, .xls, .xlsx"
-                @change="uploadImage($event)" style="display: flex; align-items: center;">
-                <el-icon class="btn-icon">
-                  <Refresh />
+              <div class="fileBtn flex a-c">
+                <el-upload :show-file-list="false" :auto-upload="false" accept=".pdf, .doc, .docx, .xls, .xlsx"
+                  @change="uploadImage($event)" style="display: flex; align-items: center;">
+                  <el-icon class="btn-icon">
+                    <Refresh />
+                  </el-icon>
+                </el-upload>
+                <el-icon class="btn-icon" @click="Fileonload(agreementInfo.fileUrl, agreementInfo.fileName)">
+                  <Download />
                 </el-icon>
                 </el-icon>
-              </el-upload>
-              <el-icon class="btn-icon" @click="Fileonload(agreementInfo.fileUrl, agreementInfo.fileName)">
-                <Download />
-              </el-icon>
+              </div>
             </div>
             </div>
           </div>
           </div>
+
         </el-tab-pane>
         </el-tab-pane>
         <el-tab-pane label="费用管理" name="costManagement">
         <el-tab-pane label="费用管理" name="costManagement">
           <span class="strong m-right-20">规则与费用</span>
           <span class="strong m-right-20">规则与费用</span>
@@ -188,10 +193,10 @@
     </el-drawer>
     </el-drawer>
     <!-- 协议授权弹窗 -->
     <!-- 协议授权弹窗 -->
     <auth-Drawer :Drawer="agreementAuthDrawer" @cancel="agreementAuthDrawer = false" @save="DrawerSave"
     <auth-Drawer :Drawer="agreementAuthDrawer" @cancel="agreementAuthDrawer = false" @save="DrawerSave"
-      @query="Drawerquery" :deptlist="deptauthList" :checkedKeys="checkedKeys" :checkedIds="checkedIds"></auth-Drawer>
+      @query="Drawerquery" @echoValue="echoValue" :deptlist="deptauthList" :checkedKeys="checkedKeys" :checkedIds="checkedIds"></auth-Drawer>
     <!-- 规则条件弹窗 -->
     <!-- 规则条件弹窗 -->
-    <RuleCondition v-if="ruleConditionVisible" :ruleConditionVisible="ruleConditionVisible"
-      @cancel="ruleConditionVisible = false" @save="ruleConditionSave" :attrIdList="rulesAttrListInfo.rulesAttrList" />
+    <RuleCondition :ruleConditionVisible="ruleConditionVisible" @cancel="ruleConditionVisible = false"
+      @save="ruleConditionSave" :attrIdList="rulesAttrListInfo.rulesAttrList" />
     <!-- 规则费用抽屉组件 -->
     <!-- 规则费用抽屉组件 -->
     <ruleFeeDialog v-if="ruleFeeVisible" :ruleFeeVisible="ruleFeeVisible" :agreementInfo="agreementInfo"
     <ruleFeeDialog v-if="ruleFeeVisible" :ruleFeeVisible="ruleFeeVisible" :agreementInfo="agreementInfo"
       :RulesInfo="RulesInfo" @save="ruleFeeSave" @cancel="ruleFeeVisible = false" />
       :RulesInfo="RulesInfo" @save="ruleFeeSave" @cancel="ruleFeeVisible = false" />
@@ -209,7 +214,7 @@ import { ElMessage, ElMessageBox, DrawerProps, TabsInstance } from 'element-plus
 import { ref, reactive } from 'vue'
 import { ref, reactive } from 'vue'
 import { useRoute, useRouter } from 'vue-router';
 import { useRoute, useRouter } from 'vue-router';
 import { loadDicts, getDict } from '@/utils/composables/dictService';//字典组件
 import { loadDicts, getDict } from '@/utils/composables/dictService';//字典组件
-import { Fileonload, formatFileSize,processFileName } from '@/utils/composables/fileProcessing';//文件处理工具
+import { Fileonload, formatFileSize, processFileName } from '@/utils/composables/fileProcessing';//文件处理工具
 import authDrawer from "./components/agreementAuth.vue";
 import authDrawer from "./components/agreementAuth.vue";
 import ruleFeeDialog from "./components/ruleFeeDialog.vue";
 import ruleFeeDialog from "./components/ruleFeeDialog.vue";
 import ruleFeeDialogEdit from "./components/ruleFeeDialogEdit.vue";
 import ruleFeeDialogEdit from "./components/ruleFeeDialogEdit.vue";
@@ -238,8 +243,10 @@ onBeforeMount(async () => {
 const detailsInfo = () => {
 const detailsInfo = () => {
   api.agreementApi.agreementGet(id.value).then((res: any) => {
   api.agreementApi.agreementGet(id.value).then((res: any) => {
     if (res.code == '200') {
     if (res.code == '200') {
-      res.data.agreement.fileName=processFileName(res.data.agreement.fileName)
-      res.data.agreement.fileSize=formatFileSize(res.data.agreement.fileSize);
+      if (res.data.fileUrl) {
+        res.data.agreement.fileName = processFileName(res.data.agreement.fileName)
+        res.data.agreement.fileSize = formatFileSize(res.data.agreement.fileSize);
+      }
       agreementInfo.value = res.data.agreement;
       agreementInfo.value = res.data.agreement;
 
 
       authDeptlength.value = res.data.dept.length;
       authDeptlength.value = res.data.dept.length;
@@ -268,8 +275,14 @@ const checkedIds = ref<string[]>([])//授权机构回显id
 const Drawerquery = (name: any) => {
 const Drawerquery = (name: any) => {
   agreementAuth(name)
   agreementAuth(name)
 }
 }
+//全选赋值
+const echoValue=(ids:any[])=>{
+  checkedKeys.value=ids;
+}
 //授权保存
 //授权保存
 const DrawerSave = (list: any) => {
 const DrawerSave = (list: any) => {
+  console.log(list)
+  return;
   api.agreementApi.authSave({ deptIds: list, id: id.value }).then((res: any) => {
   api.agreementApi.authSave({ deptIds: list, id: id.value }).then((res: any) => {
     if (res.code == '200') {
     if (res.code == '200') {
       ElMessage({
       ElMessage({
@@ -314,6 +327,7 @@ function getUncheckedIds(data: any[]): string[] {
 
 
 //更多操作集合
 //更多操作集合
 const dropdownCommand = (e: any) => {
 const dropdownCommand = (e: any) => {
+  console.log(e)
   switch (e) {
   switch (e) {
     case '启用':
     case '启用':
       api.agreementApi.sysUpAndDown({ ids: [id.value], opType: '0' }).then((res: any) => {
       api.agreementApi.sysUpAndDown({ ids: [id.value], opType: '0' }).then((res: any) => {
@@ -382,6 +396,12 @@ const dropdownCommand = (e: any) => {
         })
         })
       break;
       break;
     case '复制协议':
     case '复制协议':
+      router.push({
+        name: 'AgreementCopy',
+        query: {
+          id: id.value
+        }
+      })
       break;
       break;
     default:
     default:
       break;
       break;
@@ -487,6 +507,7 @@ const ruleEdit = (id: string) => {
   api.agreementApi.agreementRulesGet(id).then((res: any) => {
   api.agreementApi.agreementRulesGet(id).then((res: any) => {
     if (res.code == '200') {
     if (res.code == '200') {
       rulesAttrListInfo.rulesAttrList = processArray(res.data.costsAttrLinks);
       rulesAttrListInfo.rulesAttrList = processArray(res.data.costsAttrLinks);
+      console.log(rulesAttrListInfo.rulesAttrList)
     } else {
     } else {
     }
     }
   });
   });
@@ -623,11 +644,15 @@ const ruleFeeAdd = (item: any) => {
 }
 }
 //费用提交
 //费用提交
 const ruleFeeSave = (data: object) => {
 const ruleFeeSave = (data: object) => {
-
   api.agreementApi.ptlAgreementCostsave(data).then((res: any) => {
   api.agreementApi.ptlAgreementCostsave(data).then((res: any) => {
     if (res.code == '200') {
     if (res.code == '200') {
       ruleFeeVisible.value = false;
       ruleFeeVisible.value = false;
     } else {
     } else {
+      ElMessage({
+        type: 'error',
+        message: res.msg,
+        plain: true,
+      });
     }
     }
   });
   });
 }
 }
@@ -644,9 +669,9 @@ const ruleFeeEditSave = (data: object) => {
   });
   });
 }
 }
 //编辑删除费用
 //编辑删除费用
-const costitemEdit =  (id: string, item: any) => {
+const costitemEdit = (id: string, item: any) => {
   RulesInfo.value = item;
   RulesInfo.value = item;
-   api.agreementApi.AgreementFeeById(id).then((res: any) => {
+  api.agreementApi.AgreementFeeById(id).then((res: any) => {
     if (res.code == '200') {
     if (res.code == '200') {
       res.data.ruleConditions = processArray(res.data.ruleConditions);
       res.data.ruleConditions = processArray(res.data.ruleConditions);
       ruleFeeHeaderTitle.value = res.data.productName;
       ruleFeeHeaderTitle.value = res.data.productName;
@@ -695,7 +720,6 @@ const rulesAttrListInfo = reactive<rulesAttrListInfo>({
   rulesAttrList: []
   rulesAttrList: []
 });//规则条件列表数据
 });//规则条件列表数据
 const ruleConditionSave = (list: string[]) => {//获取规则条件选中集合
 const ruleConditionSave = (list: string[]) => {//获取规则条件选中集合
-
   rulesAttrListInfo.rulesAttrList = list;
   rulesAttrListInfo.rulesAttrList = list;
   ruleConditionVisible.value = false;
   ruleConditionVisible.value = false;
 }
 }
@@ -716,7 +740,7 @@ const rulesAttrselectChange = (item: any) => {
 }
 }
 //协议文件处理
 //协议文件处理
 //上传
 //上传
-const uploadImage =  (file: any) => {
+const uploadImage = (file: any) => {
   let files = file.raw
   let files = file.raw
   const params = new FormData(); // 声明formData数据类型
   const params = new FormData(); // 声明formData数据类型
   params.append("file", files);
   params.append("file", files);

+ 24 - 3
src/views/quoteConfig/agreement/agreementIndex.vue

@@ -183,7 +183,8 @@ function findpage() {
   });
   });
 }
 }
 const columns = [
 const columns = [
-  { prop: "agreementCode", label: "协议编号", width: '200', },
+  { prop: "agreementCode", label: "协议编号", width: '200',component: "RouterLink",
+  formatter: (row: any) => ({ name: 'AgreementDetails', query: { id: row.id} }) },
   {
   {
     prop: "agreementTitle", label: "协议名称", width: '200',
     prop: "agreementTitle", label: "协议名称", width: '200',
   },
   },
@@ -240,8 +241,14 @@ const columns = [
     }
     }
   },
   },
   { prop: "company", label: "保险公司", width: '200' },
   { prop: "company", label: "保险公司", width: '200' },
-  { prop: "dockingPerson", label: "对接人", width: '200' },
-  { prop: "custodianId", label: "管理人", width: '200' },
+  { prop: "dockingPerson", label: "对接人", width: '200', formatter: (row: any) => {
+      return `${row.dockingPerson}-${row.dockingPhone}`
+    } },
+  { prop: "custodianId", label: "管理人", width: '200',
+  formatter: (row: any) => {
+      return `${row.managerName}-${row.managerDeptName}`
+    }
+  },
   { prop: "startDate", label: "生效时间", width: '200' },
   { prop: "startDate", label: "生效时间", width: '200' },
   { prop: "endDate", label: "失效时间", width: '200' },
   { prop: "endDate", label: "失效时间", width: '200' },
   { prop: "createTime", label: "添加时间", width: '200' },
   { prop: "createTime", label: "添加时间", width: '200' },
@@ -467,6 +474,20 @@ const sysUpAndDown = async (type: string, list?: string[]) => {
 }
 }
 const resetForm = () => {
 const resetForm = () => {
   formInline.searchValue = '';
   formInline.searchValue = '';
+  formInline.deptId = '';
+  formInline.companyId = '';
+  formInline.agreementType = '';
+  formInline.validStatus = '';
+  formInline.isEnable = '';
+  formInline.withTax = '';
+  formInline.dockingPerson = '';
+  formInline.attributionName = '';
+  formInline.takeStartDate = '';
+  formInline.takeEndDate = '';
+  formInline.loseStartDate = '';
+  formInline.loseEndDate = '';
+  formInline.value1 = [];
+  formInline.value2 = [];
   provinceoptions.value = [];
   provinceoptions.value = [];
   findpage();
   findpage();
 }
 }

+ 29 - 6
src/views/quoteConfig/agreement/components/agreementAuth.vue

@@ -12,7 +12,7 @@
               :prefix-icon="Search" />
               :prefix-icon="Search" />
             <el-button @click="query">查询</el-button>
             <el-button @click="query">查询</el-button>
           </div>
           </div>
-          <el-checkbox v-model="checkedALL" label="全选" size="large" />
+          <el-checkbox v-model="checkedALL" label="全选" size="large" @change="TreeselectAll" />
           <el-tree :data="props.deptlist" show-checkbox node-key="id" ref="treeRef" :props="defaultProps"
           <el-tree :data="props.deptlist" show-checkbox node-key="id" ref="treeRef" :props="defaultProps"
             :default-expand-all="true" @check="handleCheck" :default-checked-keys="props.checkedKeys"
             :default-expand-all="true" @check="handleCheck" :default-checked-keys="props.checkedKeys"
             :check-strictly="true" />
             :check-strictly="true" />
@@ -31,7 +31,7 @@
 <!-- 行为区域 -->
 <!-- 行为区域 -->
 <script lang="ts" setup>
 <script lang="ts" setup>
 import { defineProps, defineEmits } from "vue";
 import { defineProps, defineEmits } from "vue";
-import { DrawerProps } from 'element-plus';
+import { DrawerProps,ElTree } from 'element-plus';
 import { Search } from '@element-plus/icons-vue'
 import { Search } from '@element-plus/icons-vue'
 const props = defineProps<{
 const props = defineProps<{
   Drawer: boolean,
   Drawer: boolean,
@@ -39,15 +39,14 @@ const props = defineProps<{
   checkedKeys: string[]
   checkedKeys: string[]
   checkedIds: string[]
   checkedIds: string[]
 }>();
 }>();
-const emits = defineEmits(["cancel", 'save', 'DrawerOpen', 'query']);
+const emits = defineEmits(["cancel", 'save', 'DrawerOpen', 'query','echoValue']);
 const defaultProps = {
 const defaultProps = {
   children: 'children',
   children: 'children',
   label: 'name',
   label: 'name',
 }
 }
 const direction = ref<DrawerProps['direction']>('rtl')
 const direction = ref<DrawerProps['direction']>('rtl')
 const deptName = ref('');
 const deptName = ref('');
-
-
+const treeRef = ref<InstanceType<typeof ElTree>>();
 const checkedALL = ref(false)
 const checkedALL = ref(false)
 const ids = ref()//id集合
 const ids = ref()//id集合
 const DrawerOpen = () => {
 const DrawerOpen = () => {
@@ -57,7 +56,9 @@ watch(props, () => {
   if (props.Drawer) {
   if (props.Drawer) {
     ids.value = props.checkedIds;
     ids.value = props.checkedIds;
   }
   }
-
+  if(props.checkedKeys){
+    ids.value=props.checkedKeys;
+  }
 })
 })
 const cancel = () => {
 const cancel = () => {
   emits('cancel')
   emits('cancel')
@@ -80,4 +81,26 @@ const handleCheck = (
 ) => {
 ) => {
   ids.value = checkedInfo.checkedKeys;
   ids.value = checkedInfo.checkedKeys;
 };
 };
+//全选
+const TreeselectAll = (value: string | number | boolean) => {
+  ids.value = [];//全选操作是清空历史数据
+  const allKeys = getAllKeys(props.deptlist, 'id');//递归id集合
+  if (value) {
+    emits('echoValue',allKeys)
+  } else {
+    treeRef.value?.setCheckedKeys([]);
+    ids.value = [];
+  }
+}
+//递归
+const getAllKeys = (data: any[], type: string) => {
+  let keys: any = [];
+  data.forEach(item => {
+    keys.push(type == 'id' ? item.id : item); // 假设每个节点有 id 属性
+    if (item.children) {
+      keys = keys.concat(getAllKeys(item.children, type == 'id' ? 'id' : 'perms'));
+    }
+  });
+  return keys;
+}
 </script>
 </script>

+ 30 - 3
src/views/quoteConfig/agreement/components/ruleFeeDialog.vue

@@ -1,7 +1,8 @@
 <!-- 模板区域 -->
 <!-- 模板区域 -->
 <template>
 <template>
   <div>
   <div>
-    <el-drawer v-model="props.ruleFeeVisible" :direction="direction" :close-on-click-modal="false" size="57%" @close="close">
+    <el-drawer v-model="props.ruleFeeVisible" :direction="direction" :close-on-click-modal="false" size="57%"
+      @close="close">
       <template #header>
       <template #header>
         <h4>添加费用</h4>
         <h4>添加费用</h4>
       </template>
       </template>
@@ -202,6 +203,9 @@ const feerules = ref<FormRules>({
   ],
   ],
 
 
 })
 })
+interface RuleCondition {
+  min: number | string;
+}
 onMounted(async () => {
 onMounted(async () => {
   await loadDicts(['insurance_type'])
   await loadDicts(['insurance_type'])
   const dict = getDict('insurance_type');
   const dict = getDict('insurance_type');
@@ -259,7 +263,7 @@ const ruleConditionSave = (list: string[]) => {//获取规则条件选中集合
 const cancel = () => {
 const cancel = () => {
   emits("cancel")
   emits("cancel")
 }
 }
-const close=()=>{
+const close = () => {
   emits("cancel")
   emits("cancel")
 }
 }
 const save = async (formEl: FormInstance | undefined | any) => {
 const save = async (formEl: FormInstance | undefined | any) => {
@@ -279,6 +283,16 @@ const save = async (formEl: FormInstance | undefined | any) => {
             } else {
             } else {
               resolve(true);
               resolve(true);
             }
             }
+            const result = checkArrayValues(ruleFeeinfo.value[insuranceTypeIndex.value].ptlAgreementCostAddList[index].ruleConditions as RuleCondition[], "min");
+            if(!result){
+              ElMessage({
+                type: 'error',
+                message: `规则条件不能为空值`,
+                plain: true,
+              });
+            }else{
+              resolve(true);
+            }
           } else {
           } else {
             reject(index);
             reject(index);
           }
           }
@@ -295,9 +309,12 @@ const save = async (formEl: FormInstance | undefined | any) => {
     ruleFeeinfo.value.map((val: any) => {
     ruleFeeinfo.value.map((val: any) => {
       val.ptlAgreementId = props.agreementInfo.id;
       val.ptlAgreementId = props.agreementInfo.id;
       val.coverRuleId = props.RulesInfo.id;
       val.coverRuleId = props.RulesInfo.id;
+
       return val;
       return val;
     })
     })
-    emits("save", ruleFeeinfo.value)
+    // console.log(ruleFeeinfo.value)
+    // return;
+    emits("save",{ptlAgreementCode:props.agreementInfo.agreementCode,ptlAgreementName:props.agreementInfo.agreementTitle,costAddList:ruleFeeinfo.value} )
   } catch (error) {
   } catch (error) {
     const invalidIndex: any = error; // 获取未通过校验的表单索引
     const invalidIndex: any = error; // 获取未通过校验的表单索引
     // const invalidForm = ruleFeeinfo.value[insuranceTypeIndex.value].ptlAgreementCostAddList[invalidIndex]; // 获取未通过校验的表单对象
     // const invalidForm = ruleFeeinfo.value[insuranceTypeIndex.value].ptlAgreementCostAddList[invalidIndex]; // 获取未通过校验的表单对象
@@ -312,6 +329,16 @@ const save = async (formEl: FormInstance | undefined | any) => {
     });
     });
   }
   }
 };
 };
+const checkArrayValues = <T, K extends keyof T>(arr: T[], key: K) => {
+  // 遍历数组
+  for (let item of arr) {
+    // 检查指定键的值是否为空
+    if (item[key] === null || item[key] === undefined || item[key] === "") {
+      return false; // 如果为空,返回 false
+    }
+  }
+  return true; // 如果所有值都不为空,返回 true
+}
 //添加规则条件
 //添加规则条件
 const addRuleCondition = (index: number, Costindex: number) => {
 const addRuleCondition = (index: number, Costindex: number) => {
   insuranceTypeIndex.value = index;
   insuranceTypeIndex.value = index;

+ 1 - 2
src/views/quoteConfig/agreement/components/ruleFeeDialogEdit.vue

@@ -128,7 +128,7 @@
           <el-button @click="cancel">取消</el-button>
           <el-button @click="cancel">取消</el-button>
           <el-button type="primary" @click="save">提交审核</el-button>
           <el-button type="primary" @click="save">提交审核</el-button>
         </div>
         </div>
-        <div class="flex f-c " v-if="!costitemEditInfo?.reviewDescription">
+        <div class="flex f-c " v-if="!costitemEditInfo?.reviewDescription && props.operationType == 'audit'">
           <el-checkbox v-model="automatic" label="审核后,自动跳支审核下一条费用" size="large" />
           <el-checkbox v-model="automatic" label="审核后,自动跳支审核下一条费用" size="large" />
           <div class="flex a-c">
           <div class="flex a-c">
             <el-button @click="rejectOperation">审核驳回</el-button>
             <el-button @click="rejectOperation">审核驳回</el-button>
@@ -218,7 +218,6 @@ const rulesAttrselectChange = (item: any) => {
 }
 }
 //获取到的规则条件列表数据
 //获取到的规则条件列表数据
 const ruleConditionSave = (list: string[]) => {//获取规则条件选中集合
 const ruleConditionSave = (list: string[]) => {//获取规则条件选中集合
-  console.log(list)
   costitemEditInfo.value.ruleConditions = list;
   costitemEditInfo.value.ruleConditions = list;
   ruleConditionVisible.value = false;
   ruleConditionVisible.value = false;
 }
 }

+ 5 - 3
src/views/quoteConfig/costManagement.vue

@@ -78,7 +78,7 @@
       <template #footer>
       <template #footer>
         <div class="dialog-footer">
         <div class="dialog-footer">
           <el-button @click="agreementSelectionVisible = false">取消</el-button>
           <el-button @click="agreementSelectionVisible = false">取消</el-button>
-          <el-button type="primary" @click="agreementSelectionConfirm">
+          <el-button type="primary" @click="agreementSelectionConfirm" :disabled="!ruleInfo">
             确定
             确定
           </el-button>
           </el-button>
         </div>
         </div>
@@ -155,7 +155,7 @@ const formInline = reactive({
 
 
 //表格字段数据
 //表格字段数据
 const fields = ref([
 const fields = ref([
-  { label: "所属协议", model: "agreement", type: "input", placeholder: "输入代码,名称,简称查找" },
+  { label: "所属协议", model: "agreement", type: "input", placeholder: "输入协议号,名称,简称查找" },
   {
   {
     label: "险种", model: "productId", type: "select", options: insurance_type,
     label: "险种", model: "productId", type: "select", options: insurance_type,
   },
   },
@@ -295,6 +295,7 @@ const agreemenUpdate = async (item: any) => {
       res.data.ruleConditions = processArray(res.data.ruleConditions);
       res.data.ruleConditions = processArray(res.data.ruleConditions);
       costitemEditInfo.value = res.data;
       costitemEditInfo.value = res.data;
       ruleFeeEditVisible.value = true;
       ruleFeeEditVisible.value = true;
+      console.log(costitemEditInfo.value)
     } else {
     } else {
     }
     }
   });
   });
@@ -523,6 +524,8 @@ const agreementSelection = () => {
   agreementSelectionVisible.value = true;
   agreementSelectionVisible.value = true;
 }
 }
 const ItemClick = (item: any) => {
 const ItemClick = (item: any) => {
+  console.log(item)
+  console.log(ruleInfo.value)
   AgreementInfo.value = item;
   AgreementInfo.value = item;
   AgreementId.value = item.id;
   AgreementId.value = item.id;
   api.agreementApi.agreementRulesList(AgreementId.value).then((res: any) => {
   api.agreementApi.agreementRulesList(AgreementId.value).then((res: any) => {
@@ -542,7 +545,6 @@ const agreementSelectionConfirm = () => {
 }
 }
 //规则弹窗回调方法
 //规则弹窗回调方法
 const ruleFeeSave = (data: object) => {
 const ruleFeeSave = (data: object) => {
-  console.log(data)
   api.agreementApi.ptlAgreementCostsave(data).then((res: any) => {
   api.agreementApi.ptlAgreementCostsave(data).then((res: any) => {
     if (res.code == '200') {
     if (res.code == '200') {
       ElMessage({
       ElMessage({

+ 7 - 3
src/views/quoteConfig/project/index.vue

@@ -50,7 +50,7 @@
           <el-table-column label="方案描述" prop="description"></el-table-column>
           <el-table-column label="方案描述" prop="description"></el-table-column>
           <el-table-column label="方案类型" prop="schemeType">
           <el-table-column label="方案类型" prop="schemeType">
             <template #default="scope">
             <template #default="scope">
-              {{ scope.row.schemeType == '1'?'基础方案':scope.row.schemeType == '1'?'自选方案':'' }}
+              {{ scope.row.schemeType == '1'?'基础方案':scope.row.schemeType == '2'?'自选方案':'' }}
             </template>
             </template>
           </el-table-column>
           </el-table-column>
           <el-table-column label="险种" prop="productName"></el-table-column>
           <el-table-column label="险种" prop="productName"></el-table-column>
@@ -127,7 +127,10 @@ const companyChose = (item, index) => {
 
 
 const addProject = () => {
 const addProject = () => {
   myRouter.push({
   myRouter.push({
-    path: '/quoteConfig/agreement/project/projectAdd'
+    path: '/quoteConfig/agreement/project/projectAdd',
+    query: {
+      companyId: companyId.value
+    }
   })
   })
 }
 }
 
 
@@ -185,7 +188,8 @@ const handleEdit = (row) => {
     myRouter.push({
     myRouter.push({
       path: '/quoteConfig/agreement/project/projectAdd',
       path: '/quoteConfig/agreement/project/projectAdd',
       query: {
       query: {
-        id: row.id
+        id: row.id,
+        companyId: companyId.value
       }
       }
     })
     })
 }
 }

+ 17 - 6
src/views/quoteConfig/project/modules/projectAdd.vue

@@ -36,7 +36,7 @@
             <div style="width: 60%">
             <div style="width: 60%">
               <rule-condition-container :rulesAttrList="rulesAttrList" @Del="handleDel"></rule-condition-container>
               <rule-condition-container :rulesAttrList="rulesAttrList" @Del="handleDel"></rule-condition-container>
             </div>
             </div>
-            <rule-condition :ruleConditionVisible="rulesShow" :attrIdList="rulesAttrList" @save="saveRule"></rule-condition>
+            <rule-condition :ruleConditionVisible="rulesShow" :attrIdList="rulesAttrList" @save="saveRule" @cancel="cancelRule"></rule-condition>
           </div>
           </div>
           <el-button style="margin: 10px 10%" plain type="primary" icon="plus" @click="addRules">添加条件</el-button>
           <el-button style="margin: 10px 10%" plain type="primary" icon="plus" @click="addRules">添加条件</el-button>
           <el-descriptions>
           <el-descriptions>
@@ -109,10 +109,10 @@
                     </el-table-column>
                     </el-table-column>
                     <el-table-column label="保额" prop="optionId">
                     <el-table-column label="保额" prop="optionId">
                       <template #default="scope">
                       <template #default="scope">
-                        <el-select :disabled="projectAddFrom.productId == '0330' || projectAddFrom.productId == '0330034002' || projectAddFrom.productId == '0330034001'" v-if="projectAddFrom.schemeType === 2" v-model="scope.row.moneyId" style="width: 150px" multiple>
+                        <el-select :disabled="scope.row.insuranceId == '19'" v-if="projectAddFrom.schemeType === 2" v-model="scope.row.moneyId" style="width: 150px" multiple>
                           <el-option v-for="m in scope.row.options" :label="m.label" :key="m.id" :value="m.id"></el-option>
                           <el-option v-for="m in scope.row.options" :label="m.label" :key="m.id" :value="m.id"></el-option>
                         </el-select>
                         </el-select>
-                        <el-select :disabled="projectAddFrom.productId == '0330' || projectAddFrom.productId == '0330034002' || projectAddFrom.productId == '0330034001'" v-else v-model="scope.row.moneyId" style="width: 150px" @change="">
+                        <el-select :disabled="scope.row.insuranceId == '19'" v-else v-model="scope.row.moneyId" style="width: 150px" @change="">
                           <el-option v-for="m in scope.row.options" :label="m.label" :key="m.id" :value="m.id"></el-option>
                           <el-option v-for="m in scope.row.options" :label="m.label" :key="m.id" :value="m.id"></el-option>
                         </el-select>
                         </el-select>
                       </template>
                       </template>
@@ -222,7 +222,6 @@ const numberChange = (e, row) => {
 
 
 // 新增的时候初始化已有的方案
 // 新增的时候初始化已有的方案
 const initProduct = (e) => {
 const initProduct = (e) => {
-  console.log(123, e)
   if(e == '034002') {
   if(e == '034002') {
     let obj = insuranceTypeList.value.find(item => item.id == '2')
     let obj = insuranceTypeList.value.find(item => item.id == '2')
     obj.insuranceId = obj.id
     obj.insuranceId = obj.id
@@ -235,6 +234,9 @@ const initProduct = (e) => {
     if(obj) {
     if(obj) {
       obj.forEach(item => {
       obj.forEach(item => {
         item.insuranceId = item.id
         item.insuranceId = item.id
+        if(item.id == '19') {
+          item.moneyId = item.options[0].id
+        }
       })
       })
       projectAddFrom.value.schemeList.forEach(item => {
       projectAddFrom.value.schemeList.forEach(item => {
         item.drivingList = []
         item.drivingList = []
@@ -372,8 +374,15 @@ const saveRule = (data) => {
   }
   }
   rulesShow.value = false
   rulesShow.value = false
 }
 }
+const cancelRule = (data) => {
+  rulesShow.value = false
+}
 const handleDel = (index) => {
 const handleDel = (index) => {
-  rulesAttrList.value.splice(index, 1)
+  if(rulesAttrList.value[index].attrName === '能源类型' || rulesAttrList.value[index].attrName === '使用性质' || rulesAttrList.value[index].attrName === '车辆种类') {
+    return
+  } else {
+    rulesAttrList.value.splice(index, 1)
+  }
 }
 }
 
 
 // 险种类型
 // 险种类型
@@ -431,6 +440,7 @@ let drivingShow = ref(false)
 const handleDriving = (item, index) => {
 const handleDriving = (item, index) => {
   drivingShow.value = true
   drivingShow.value = true
   nextTick(() => {
   nextTick(() => {
+    DrivingTypeRef.value.initEditData(item.drivingList, index, myRoute.query.companyId)
     DrivingTypeRef.value.initEditData(item.drivingList, index, projectAddFrom.value.companyId)
     DrivingTypeRef.value.initEditData(item.drivingList, index, projectAddFrom.value.companyId)
   })
   })
 }
 }
@@ -462,7 +472,7 @@ const handlePopover = (item, index) => {
 const initAttr = () => {
 const initAttr = () => {
   api.agreementApi.ruleAttrGroup({ attrName: '' }).then(res => {
   api.agreementApi.ruleAttrGroup({ attrName: '' }).then(res => {
     if(res.code == 200) {
     if(res.code == 200) {
-      let list = res.data?.VehicleInformation?.filter(e => e.attrName === '能源类型' || e.attrName === '使用性质' || e.attrName === '车辆类')
+      let list = res.data?.VehicleInformation?.filter(e => e.attrName === '能源类型' || e.attrName === '使用性质' || e.attrName === '车辆类')
       rulesAttrList.value = [...list]
       rulesAttrList.value = [...list]
       defaultAttrList.value = [...list]
       defaultAttrList.value = [...list]
     } else {
     } else {
@@ -577,6 +587,7 @@ onMounted(() => {
   // initAttr()
   // initAttr()
   if(myRoute.query.id) {
   if(myRoute.query.id) {
     isEdit.value = true
     isEdit.value = true
+    projectAddFrom.value.id = myRoute.query.id
     initEdit()
     initEdit()
   } else {
   } else {
     isEdit.value = false
     isEdit.value = false