From 4b1304917b0b16b09dd50191fab59d96933c0cf3 Mon Sep 17 00:00:00 2001
From: 曹睿 <360930172@qq.com>
Date: 星期二, 17 六月 2025 17:31:11 +0800
Subject: [PATCH] feat: 6月15日任务完90%

---
 src/views/procurementManagement/procurementInvoiceLedger/index.vue     |  331 +
 src/views/basicData/supplierManage/index.vue                           |  459 +
 src/views/basicData/product/index.vue                                  |  463 +
 src/views/procurementManagement/invoiceEntry/index.vue                 |  698 ++-
 src/views/salesManagement/receiptPaymentLedger/index.vue               |  279 
 src/hooks/usePaginationApi.jsx                                         |  144 
 src/views/procurementManagement/paymentEntry/index.vue                 |  478 +
 pnpm-lock.yaml                                                         | 4316 ++++++++++++++++++++
 src/views/salesManagement/invoiceLedger/index.vue                      |  553 +-
 src/components/Upload/FileUpload.vue                                   |   80 
 src/api/procurementManagement/projectProfit.js                         |   10 
 vite.config.js                                                         |    6 
 src/views/basicData/product/ImportExcel/index.vue                      |   67 
 src/components/Upload/index.js                                         |    1 
 src/components/ImageUpload/index.vue                                   |  200 
 src/hooks/useFormData.js                                               |   15 
 src/views/salesManagement/receiptPayment/index.vue                     |  567 +
 src/components/PIMTable/PIMTable.vue                                   |  351 +
 src/views/procurementManagement/reportAnalysis/projectProfit/index.vue |  102 
 src/views/salesManagement/invoiceRegistration/index.vue                |  557 +
 src/views/procurementManagement/paymentLedger/index.vue                |  159 
 src/views/procurementManagement/procurementLedger/index.vue            | 1038 +++-
 src/views/system/user/index.vue                                        |  793 ++-
 src/api/salesManagement/salesLedger.js                                 |  133 
 package.json                                                           |  104 
 src/utils/index.js                                                     |  300 
 src/views/salesManagement/receiptPaymentHistory/index.vue              |  191 
 27 files changed, 9,619 insertions(+), 2,776 deletions(-)

diff --git a/package.json b/package.json
index 5775249..871409b 100644
--- a/package.json
+++ b/package.json
@@ -1,51 +1,53 @@
-{
-  "name": "ruoyi",
-  "version": "3.8.9",
-  "description": "MIS绯荤粺锛堢鐞嗕俊鎭郴缁燂級",
-  "author": "鑻ヤ緷",
-  "license": "MIT",
-  "type": "module",
-  "scripts": {
-    "dev": "vite",
-    "build:prod": "vite build",
-    "build:stage": "vite build --mode staging",
-    "preview": "vite preview"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://gitee.com/y_project/RuoYi-Vue.git"
-  },
-  "dependencies": {
-    "@element-plus/icons-vue": "2.3.1",
-    "@vueup/vue-quill": "1.2.0",
-    "@vueuse/core": "10.11.0",
-    "axios": "0.28.1",
-    "clipboard": "2.0.11",
-    "echarts": "5.5.1",
-    "element-plus": "2.7.6",
-    "file-saver": "2.0.5",
-    "fuse.js": "6.6.2",
-    "js-beautify": "1.14.11",
-    "js-cookie": "3.0.5",
-    "jsencrypt": "3.3.2",
-    "nprogress": "0.2.0",
-    "pinia": "2.1.7",
-    "splitpanes": "3.1.5",
-    "vue": "3.4.31",
-    "vue-cropper": "1.1.1",
-    "vue-router": "4.4.0",
-    "vuedraggable": "4.1.0"
-  },
-  "devDependencies": {
-    "@vitejs/plugin-vue": "5.0.5",
-    "sass": "1.77.5",
-    "unplugin-auto-import": "0.17.6",
-    "unplugin-vue-setup-extend-plus": "1.0.1",
-    "vite": "5.3.2",
-    "vite-plugin-compression": "0.5.1",
-    "vite-plugin-svg-icons": "2.0.1"
-  },
-  "overrides": {
-    "quill": "2.0.2"
-  }
-}
+{
+  "name": "ruoyi",
+  "version": "3.8.9",
+  "description": "MIS绯荤粺锛堢鐞嗕俊鎭郴缁燂級",
+  "author": "鑻ヤ緷",
+  "license": "MIT",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build:prod": "vite build",
+    "build:stage": "vite build --mode staging",
+    "preview": "vite preview"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://gitee.com/y_project/RuoYi-Vue.git"
+  },
+  "dependencies": {
+    "@element-plus/icons-vue": "2.3.1",
+    "@vueup/vue-quill": "1.2.0",
+    "@vueuse/core": "10.11.0",
+    "axios": "0.28.1",
+    "clipboard": "2.0.11",
+    "dayjs": "^1.11.13",
+    "echarts": "5.5.1",
+    "element-plus": "2.7.7",
+    "file-saver": "2.0.5",
+    "fuse.js": "6.6.2",
+    "js-beautify": "1.14.11",
+    "js-cookie": "3.0.5",
+    "jsencrypt": "3.3.2",
+    "nprogress": "0.2.0",
+    "pinia": "2.1.7",
+    "sortablejs": "^1.15.6",
+    "splitpanes": "3.1.5",
+    "vue": "3.4.31",
+    "vue-cropper": "1.1.1",
+    "vue-router": "4.4.0",
+    "vuedraggable": "4.1.0"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-vue": "5.0.5",
+    "sass": "1.77.5",
+    "unplugin-auto-import": "0.17.6",
+    "unplugin-vue-setup-extend-plus": "1.0.1",
+    "vite": "5.3.2",
+    "vite-plugin-compression": "0.5.1",
+    "vite-plugin-svg-icons": "2.0.1"
+  },
+  "overrides": {
+    "quill": "2.0.2"
+  }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..871e5c2
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,4316 @@
+lockfileVersion: '9.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+importers:
+
+  .:
+    dependencies:
+      '@element-plus/icons-vue':
+        specifier: 2.3.1
+        version: 2.3.1(vue@3.4.31)
+      '@vueup/vue-quill':
+        specifier: 1.2.0
+        version: 1.2.0(vue@3.4.31)
+      '@vueuse/core':
+        specifier: 10.11.0
+        version: 10.11.0(vue@3.4.31)
+      axios:
+        specifier: 0.28.1
+        version: 0.28.1
+      clipboard:
+        specifier: 2.0.11
+        version: 2.0.11
+      dayjs:
+        specifier: ^1.11.13
+        version: 1.11.13
+      echarts:
+        specifier: 5.5.1
+        version: 5.5.1
+      element-plus:
+        specifier: 2.7.7
+        version: 2.7.7(vue@3.4.31)
+      file-saver:
+        specifier: 2.0.5
+        version: 2.0.5
+      fuse.js:
+        specifier: 6.6.2
+        version: 6.6.2
+      js-beautify:
+        specifier: 1.14.11
+        version: 1.14.11
+      js-cookie:
+        specifier: 3.0.5
+        version: 3.0.5
+      jsencrypt:
+        specifier: 3.3.2
+        version: 3.3.2
+      nprogress:
+        specifier: 0.2.0
+        version: 0.2.0
+      pinia:
+        specifier: 2.1.7
+        version: 2.1.7(vue@3.4.31)
+      sortablejs:
+        specifier: ^1.15.6
+        version: 1.15.6
+      splitpanes:
+        specifier: 3.1.5
+        version: 3.1.5
+      vue:
+        specifier: 3.4.31
+        version: 3.4.31
+      vue-cropper:
+        specifier: 1.1.1
+        version: 1.1.1
+      vue-router:
+        specifier: 4.4.0
+        version: 4.4.0(vue@3.4.31)
+      vuedraggable:
+        specifier: 4.1.0
+        version: 4.1.0(vue@3.4.31)
+    devDependencies:
+      '@vitejs/plugin-vue':
+        specifier: 5.0.5
+        version: 5.0.5(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5))(vue@3.4.31)
+      sass:
+        specifier: 1.77.5
+        version: 1.77.5
+      unplugin-auto-import:
+        specifier: 0.17.6
+        version: 0.17.6(@vueuse/core@10.11.0(vue@3.4.31))(rollup@4.40.2)
+      unplugin-vue-setup-extend-plus:
+        specifier: 1.0.1
+        version: 1.0.1
+      vite:
+        specifier: 5.3.2
+        version: 5.3.2(@types/node@22.15.18)(sass@1.77.5)
+      vite-plugin-compression:
+        specifier: 0.5.1
+        version: 0.5.1(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5))
+      vite-plugin-svg-icons:
+        specifier: 2.0.1
+        version: 2.0.1(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5))
+
+packages:
+
+  '@antfu/utils@0.7.10':
+    resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
+
+  '@babel/helper-string-parser@7.27.1':
+    resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-identifier@7.27.1':
+    resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/parser@7.27.2':
+    resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  '@babel/types@7.27.1':
+    resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==}
+    engines: {node: '>=6.9.0'}
+
+  '@ctrl/tinycolor@3.6.1':
+    resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+    engines: {node: '>=10'}
+
+  '@element-plus/icons-vue@2.3.1':
+    resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  '@esbuild/aix-ppc64@0.21.5':
+    resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [aix]
+
+  '@esbuild/android-arm64@0.21.5':
+    resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+
+  '@esbuild/android-arm@0.21.5':
+    resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+
+  '@esbuild/android-x64@0.21.5':
+    resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+
+  '@esbuild/darwin-arm64@0.21.5':
+    resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@esbuild/darwin-x64@0.21.5':
+    resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@esbuild/freebsd-arm64@0.21.5':
+    resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@esbuild/freebsd-x64@0.21.5':
+    resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@esbuild/linux-arm64@0.21.5':
+    resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.21.5':
+    resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.21.5':
+    resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.21.5':
+    resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.21.5':
+    resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.21.5':
+    resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.21.5':
+    resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.21.5':
+    resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.21.5':
+    resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/netbsd-x64@0.21.5':
+    resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/openbsd-x64@0.21.5':
+    resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/sunos-x64@0.21.5':
+    resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/win32-arm64@0.21.5':
+    resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.21.5':
+    resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.21.5':
+    resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+
+  '@floating-ui/core@1.7.0':
+    resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==}
+
+  '@floating-ui/dom@1.7.0':
+    resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==}
+
+  '@floating-ui/utils@0.2.9':
+    resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
+
+  '@isaacs/cliui@8.0.2':
+    resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+    engines: {node: '>=12'}
+
+  '@jridgewell/sourcemap-codec@1.5.0':
+    resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+  '@nodelib/fs.scandir@2.1.5':
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.stat@2.0.5':
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.walk@1.2.8':
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+
+  '@one-ini/wasm@0.1.1':
+    resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
+
+  '@pkgjs/parseargs@0.11.0':
+    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+    engines: {node: '>=14'}
+
+  '@rollup/pluginutils@5.1.4':
+    resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/rollup-android-arm-eabi@4.40.2':
+    resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==}
+    cpu: [arm]
+    os: [android]
+
+  '@rollup/rollup-android-arm64@4.40.2':
+    resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==}
+    cpu: [arm64]
+    os: [android]
+
+  '@rollup/rollup-darwin-arm64@4.40.2':
+    resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rollup/rollup-darwin-x64@4.40.2':
+    resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rollup/rollup-freebsd-arm64@4.40.2':
+    resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@rollup/rollup-freebsd-x64@4.40.2':
+    resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.40.2':
+    resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm-musleabihf@4.40.2':
+    resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm64-gnu@4.40.2':
+    resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm64-musl@4.40.2':
+    resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rollup/rollup-linux-loongarch64-gnu@4.40.2':
+    resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==}
+    cpu: [loong64]
+    os: [linux]
+
+  '@rollup/rollup-linux-powerpc64le-gnu@4.40.2':
+    resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@rollup/rollup-linux-riscv64-gnu@4.40.2':
+    resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@rollup/rollup-linux-riscv64-musl@4.40.2':
+    resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@rollup/rollup-linux-s390x-gnu@4.40.2':
+    resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==}
+    cpu: [s390x]
+    os: [linux]
+
+  '@rollup/rollup-linux-x64-gnu@4.40.2':
+    resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rollup/rollup-linux-x64-musl@4.40.2':
+    resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rollup/rollup-win32-arm64-msvc@4.40.2':
+    resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rollup/rollup-win32-ia32-msvc@4.40.2':
+    resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@rollup/rollup-win32-x64-msvc@4.40.2':
+    resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==}
+    cpu: [x64]
+    os: [win32]
+
+  '@sxzz/popperjs-es@2.11.7':
+    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+
+  '@trysound/sax@0.2.0':
+    resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+    engines: {node: '>=10.13.0'}
+
+  '@types/estree@1.0.7':
+    resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
+
+  '@types/lodash-es@4.17.12':
+    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+  '@types/lodash@4.17.16':
+    resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==}
+
+  '@types/node@22.15.18':
+    resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==}
+
+  '@types/svgo@2.6.4':
+    resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
+
+  '@types/web-bluetooth@0.0.16':
+    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+
+  '@types/web-bluetooth@0.0.20':
+    resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
+
+  '@vitejs/plugin-vue@5.0.5':
+    resolution: {integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    peerDependencies:
+      vite: ^5.0.0
+      vue: ^3.2.25
+
+  '@vue/compiler-core@3.4.31':
+    resolution: {integrity: sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==}
+
+  '@vue/compiler-core@3.5.14':
+    resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==}
+
+  '@vue/compiler-dom@3.4.31':
+    resolution: {integrity: sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==}
+
+  '@vue/compiler-dom@3.5.14':
+    resolution: {integrity: sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==}
+
+  '@vue/compiler-sfc@3.4.31':
+    resolution: {integrity: sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==}
+
+  '@vue/compiler-sfc@3.5.14':
+    resolution: {integrity: sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==}
+
+  '@vue/compiler-ssr@3.4.31':
+    resolution: {integrity: sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==}
+
+  '@vue/compiler-ssr@3.5.14':
+    resolution: {integrity: sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==}
+
+  '@vue/devtools-api@6.6.4':
+    resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
+  '@vue/reactivity@3.4.31':
+    resolution: {integrity: sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==}
+
+  '@vue/runtime-core@3.4.31':
+    resolution: {integrity: sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==}
+
+  '@vue/runtime-dom@3.4.31':
+    resolution: {integrity: sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==}
+
+  '@vue/server-renderer@3.4.31':
+    resolution: {integrity: sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==}
+    peerDependencies:
+      vue: 3.4.31
+
+  '@vue/shared@3.4.31':
+    resolution: {integrity: sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==}
+
+  '@vue/shared@3.5.14':
+    resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==}
+
+  '@vueup/vue-quill@1.2.0':
+    resolution: {integrity: sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==}
+    peerDependencies:
+      vue: ^3.2.41
+
+  '@vueuse/core@10.11.0':
+    resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==}
+
+  '@vueuse/core@9.13.0':
+    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
+
+  '@vueuse/metadata@10.11.0':
+    resolution: {integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==}
+
+  '@vueuse/metadata@9.13.0':
+    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
+
+  '@vueuse/shared@10.11.0':
+    resolution: {integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==}
+
+  '@vueuse/shared@9.13.0':
+    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
+
+  abbrev@2.0.0:
+    resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+  acorn@8.14.1:
+    resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  ansi-regex@2.1.1:
+    resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
+    engines: {node: '>=0.10.0'}
+
+  ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  ansi-regex@6.1.0:
+    resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+    engines: {node: '>=12'}
+
+  ansi-styles@2.2.1:
+    resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
+    engines: {node: '>=0.10.0'}
+
+  ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+
+  ansi-styles@6.2.1:
+    resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+    engines: {node: '>=12'}
+
+  anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
+  arr-diff@4.0.0:
+    resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
+    engines: {node: '>=0.10.0'}
+
+  arr-flatten@1.1.0:
+    resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
+    engines: {node: '>=0.10.0'}
+
+  arr-union@3.1.0:
+    resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
+    engines: {node: '>=0.10.0'}
+
+  array-buffer-byte-length@1.0.2:
+    resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+    engines: {node: '>= 0.4'}
+
+  array-unique@0.3.2:
+    resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
+    engines: {node: '>=0.10.0'}
+
+  arraybuffer.prototype.slice@1.0.4:
+    resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+    engines: {node: '>= 0.4'}
+
+  assign-symbols@1.0.0:
+    resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
+    engines: {node: '>=0.10.0'}
+
+  async-function@1.0.0:
+    resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+    engines: {node: '>= 0.4'}
+
+  async-validator@4.2.5:
+    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+  asynckit@0.4.0:
+    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+  atob@2.1.2:
+    resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
+    engines: {node: '>= 4.5.0'}
+    hasBin: true
+
+  available-typed-arrays@1.0.7:
+    resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+    engines: {node: '>= 0.4'}
+
+  axios@0.28.1:
+    resolution: {integrity: sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==}
+
+  balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  base@0.11.2:
+    resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
+    engines: {node: '>=0.10.0'}
+
+  big.js@5.2.2:
+    resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+
+  binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
+  bluebird@3.7.2:
+    resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+
+  boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+  brace-expansion@2.0.1:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+  braces@2.3.2:
+    resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
+    engines: {node: '>=0.10.0'}
+
+  braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
+
+  cache-base@1.0.1:
+    resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
+    engines: {node: '>=0.10.0'}
+
+  call-bind-apply-helpers@1.0.2:
+    resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+    engines: {node: '>= 0.4'}
+
+  call-bind@1.0.8:
+    resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+    engines: {node: '>= 0.4'}
+
+  call-bound@1.0.4:
+    resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+    engines: {node: '>= 0.4'}
+
+  chalk@1.1.3:
+    resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
+    engines: {node: '>=0.10.0'}
+
+  chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
+
+  chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+
+  class-utils@0.3.6:
+    resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
+    engines: {node: '>=0.10.0'}
+
+  clipboard@2.0.11:
+    resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==}
+
+  clone@2.1.2:
+    resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+    engines: {node: '>=0.8'}
+
+  collection-visit@1.0.0:
+    resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
+    engines: {node: '>=0.10.0'}
+
+  color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+
+  color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+  combined-stream@1.0.8:
+    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+    engines: {node: '>= 0.8'}
+
+  commander@10.0.1:
+    resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+    engines: {node: '>=14'}
+
+  commander@7.2.0:
+    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+    engines: {node: '>= 10'}
+
+  component-emitter@1.3.1:
+    resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
+
+  confbox@0.1.8:
+    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+  confbox@0.2.2:
+    resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+
+  config-chain@1.1.13:
+    resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+
+  copy-descriptor@0.1.1:
+    resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
+    engines: {node: '>=0.10.0'}
+
+  cors@2.8.5:
+    resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+    engines: {node: '>= 0.10'}
+
+  cross-spawn@7.0.6:
+    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+    engines: {node: '>= 8'}
+
+  css-select@4.3.0:
+    resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+
+  css-tree@1.1.3:
+    resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+    engines: {node: '>=8.0.0'}
+
+  css-what@6.1.0:
+    resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+    engines: {node: '>= 6'}
+
+  csso@4.2.0:
+    resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
+    engines: {node: '>=8.0.0'}
+
+  csstype@3.1.3:
+    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+  data-view-buffer@1.0.2:
+    resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+    engines: {node: '>= 0.4'}
+
+  data-view-byte-length@1.0.2:
+    resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+    engines: {node: '>= 0.4'}
+
+  data-view-byte-offset@1.0.1:
+    resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+    engines: {node: '>= 0.4'}
+
+  dayjs@1.11.13:
+    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+  debug@2.6.9:
+    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  debug@4.4.1:
+    resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  decode-uri-component@0.2.2:
+    resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+    engines: {node: '>=0.10'}
+
+  deep-equal@1.1.2:
+    resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
+    engines: {node: '>= 0.4'}
+
+  define-data-property@1.1.4:
+    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+    engines: {node: '>= 0.4'}
+
+  define-properties@1.2.1:
+    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+    engines: {node: '>= 0.4'}
+
+  define-property@0.2.5:
+    resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
+    engines: {node: '>=0.10.0'}
+
+  define-property@1.0.0:
+    resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
+    engines: {node: '>=0.10.0'}
+
+  define-property@2.0.2:
+    resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
+    engines: {node: '>=0.10.0'}
+
+  delayed-stream@1.0.0:
+    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+    engines: {node: '>=0.4.0'}
+
+  delegate@3.2.0:
+    resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
+
+  dom-serializer@0.2.2:
+    resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
+
+  dom-serializer@1.4.1:
+    resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+
+  domelementtype@1.3.1:
+    resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
+
+  domelementtype@2.3.0:
+    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+  domhandler@2.4.2:
+    resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
+
+  domhandler@4.3.1:
+    resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+    engines: {node: '>= 4'}
+
+  domutils@1.7.0:
+    resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
+
+  domutils@2.8.0:
+    resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+
+  dunder-proto@1.0.1:
+    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+    engines: {node: '>= 0.4'}
+
+  eastasianwidth@0.2.0:
+    resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+  echarts@5.5.1:
+    resolution: {integrity: sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==}
+
+  editorconfig@1.0.4:
+    resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  element-plus@2.7.7:
+    resolution: {integrity: sha512-7ucUiDAxevyBE8JbXBTe9ofHhS047VmWMLoksE45zZ08XSnhnyG7WUuk3gmDbAklfVMHedb9sEV3OovPUWt+Sw==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+  emoji-regex@9.2.2:
+    resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+  emojis-list@3.0.0:
+    resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+    engines: {node: '>= 4'}
+
+  entities@1.1.2:
+    resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==}
+
+  entities@2.2.0:
+    resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+
+  entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+
+  es-abstract@1.23.9:
+    resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==}
+    engines: {node: '>= 0.4'}
+
+  es-define-property@1.0.1:
+    resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+    engines: {node: '>= 0.4'}
+
+  es-errors@1.3.0:
+    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+    engines: {node: '>= 0.4'}
+
+  es-object-atoms@1.1.1:
+    resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+    engines: {node: '>= 0.4'}
+
+  es-set-tostringtag@2.1.0:
+    resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+    engines: {node: '>= 0.4'}
+
+  es-to-primitive@1.3.0:
+    resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+    engines: {node: '>= 0.4'}
+
+  esbuild@0.21.5:
+    resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
+    engines: {node: '>=12'}
+    hasBin: true
+
+  escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+  escape-string-regexp@1.0.5:
+    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+    engines: {node: '>=0.8.0'}
+
+  escape-string-regexp@5.0.0:
+    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+    engines: {node: '>=12'}
+
+  estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+  estree-walker@3.0.3:
+    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+  etag@1.8.1:
+    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+    engines: {node: '>= 0.6'}
+
+  eventemitter3@2.0.3:
+    resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==}
+
+  expand-brackets@2.1.4:
+    resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
+    engines: {node: '>=0.10.0'}
+
+  exsolve@1.0.5:
+    resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==}
+
+  extend-shallow@2.0.1:
+    resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+    engines: {node: '>=0.10.0'}
+
+  extend-shallow@3.0.2:
+    resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
+    engines: {node: '>=0.10.0'}
+
+  extend@3.0.2:
+    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+  extglob@2.0.4:
+    resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
+    engines: {node: '>=0.10.0'}
+
+  fast-diff@1.1.2:
+    resolution: {integrity: sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==}
+
+  fast-diff@1.2.0:
+    resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
+
+  fast-glob@3.3.3:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+    engines: {node: '>=8.6.0'}
+
+  fastq@1.19.1:
+    resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+  file-saver@2.0.5:
+    resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
+
+  fill-range@4.0.0:
+    resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
+    engines: {node: '>=0.10.0'}
+
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  follow-redirects@1.15.9:
+    resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+
+  for-each@0.3.5:
+    resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+    engines: {node: '>= 0.4'}
+
+  for-in@1.0.2:
+    resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
+    engines: {node: '>=0.10.0'}
+
+  foreground-child@3.3.1:
+    resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+    engines: {node: '>=14'}
+
+  form-data@4.0.2:
+    resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
+    engines: {node: '>= 6'}
+
+  fragment-cache@0.2.1:
+    resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
+    engines: {node: '>=0.10.0'}
+
+  fs-extra@10.1.0:
+    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+    engines: {node: '>=12'}
+
+  fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+
+  function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+  function.prototype.name@1.1.8:
+    resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+    engines: {node: '>= 0.4'}
+
+  functions-have-names@1.2.3:
+    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+  fuse.js@6.6.2:
+    resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==}
+    engines: {node: '>=10'}
+
+  get-intrinsic@1.3.0:
+    resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+    engines: {node: '>= 0.4'}
+
+  get-proto@1.0.1:
+    resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+    engines: {node: '>= 0.4'}
+
+  get-symbol-description@1.1.0:
+    resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+    engines: {node: '>= 0.4'}
+
+  get-value@2.0.6:
+    resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
+    engines: {node: '>=0.10.0'}
+
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  glob@10.4.5:
+    resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+    hasBin: true
+
+  globalthis@1.0.4:
+    resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+    engines: {node: '>= 0.4'}
+
+  good-listener@1.2.2:
+    resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==}
+
+  gopd@1.2.0:
+    resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+    engines: {node: '>= 0.4'}
+
+  graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  has-ansi@2.0.0:
+    resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
+    engines: {node: '>=0.10.0'}
+
+  has-bigints@1.1.0:
+    resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+    engines: {node: '>= 0.4'}
+
+  has-flag@1.0.0:
+    resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==}
+    engines: {node: '>=0.10.0'}
+
+  has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  has-property-descriptors@1.0.2:
+    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+  has-proto@1.2.0:
+    resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+    engines: {node: '>= 0.4'}
+
+  has-symbols@1.1.0:
+    resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+    engines: {node: '>= 0.4'}
+
+  has-tostringtag@1.0.2:
+    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+    engines: {node: '>= 0.4'}
+
+  has-value@0.3.1:
+    resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
+    engines: {node: '>=0.10.0'}
+
+  has-value@1.0.0:
+    resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
+    engines: {node: '>=0.10.0'}
+
+  has-values@0.1.4:
+    resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
+    engines: {node: '>=0.10.0'}
+
+  has-values@1.0.0:
+    resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
+    engines: {node: '>=0.10.0'}
+
+  hasown@2.0.2:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
+
+  he@1.2.0:
+    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+    hasBin: true
+
+  htmlparser2@3.10.1:
+    resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
+
+  image-size@0.5.5:
+    resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+    engines: {node: '>=0.10.0'}
+    hasBin: true
+
+  immutable@4.3.7:
+    resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==}
+
+  inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+  ini@1.3.8:
+    resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+  internal-slot@1.1.0:
+    resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+    engines: {node: '>= 0.4'}
+
+  is-accessor-descriptor@1.0.1:
+    resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==}
+    engines: {node: '>= 0.10'}
+
+  is-arguments@1.2.0:
+    resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+    engines: {node: '>= 0.4'}
+
+  is-array-buffer@3.0.5:
+    resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+    engines: {node: '>= 0.4'}
+
+  is-async-function@2.1.1:
+    resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+    engines: {node: '>= 0.4'}
+
+  is-bigint@1.1.0:
+    resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+    engines: {node: '>= 0.4'}
+
+  is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
+  is-boolean-object@1.2.2:
+    resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+    engines: {node: '>= 0.4'}
+
+  is-buffer@1.1.6:
+    resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+
+  is-callable@1.2.7:
+    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+    engines: {node: '>= 0.4'}
+
+  is-data-descriptor@1.0.1:
+    resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==}
+    engines: {node: '>= 0.4'}
+
+  is-data-view@1.0.2:
+    resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+    engines: {node: '>= 0.4'}
+
+  is-date-object@1.1.0:
+    resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+    engines: {node: '>= 0.4'}
+
+  is-descriptor@0.1.7:
+    resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==}
+    engines: {node: '>= 0.4'}
+
+  is-descriptor@1.0.3:
+    resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==}
+    engines: {node: '>= 0.4'}
+
+  is-extendable@0.1.1:
+    resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+    engines: {node: '>=0.10.0'}
+
+  is-extendable@1.0.1:
+    resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+    engines: {node: '>=0.10.0'}
+
+  is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  is-finalizationregistry@1.1.1:
+    resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+    engines: {node: '>= 0.4'}
+
+  is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+
+  is-generator-function@1.1.0:
+    resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
+    engines: {node: '>= 0.4'}
+
+  is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  is-map@2.0.3:
+    resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+    engines: {node: '>= 0.4'}
+
+  is-number-object@1.1.1:
+    resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+    engines: {node: '>= 0.4'}
+
+  is-number@3.0.0:
+    resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
+    engines: {node: '>=0.10.0'}
+
+  is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  is-plain-obj@1.1.0:
+    resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+    engines: {node: '>=0.10.0'}
+
+  is-plain-object@2.0.4:
+    resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+    engines: {node: '>=0.10.0'}
+
+  is-regex@1.2.1:
+    resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+    engines: {node: '>= 0.4'}
+
+  is-set@2.0.3:
+    resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+    engines: {node: '>= 0.4'}
+
+  is-shared-array-buffer@1.0.4:
+    resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+    engines: {node: '>= 0.4'}
+
+  is-string@1.1.1:
+    resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+    engines: {node: '>= 0.4'}
+
+  is-symbol@1.1.1:
+    resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+    engines: {node: '>= 0.4'}
+
+  is-typed-array@1.1.15:
+    resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+    engines: {node: '>= 0.4'}
+
+  is-weakmap@2.0.2:
+    resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+    engines: {node: '>= 0.4'}
+
+  is-weakref@1.1.1:
+    resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+    engines: {node: '>= 0.4'}
+
+  is-weakset@2.0.4:
+    resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+    engines: {node: '>= 0.4'}
+
+  is-windows@1.0.2:
+    resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+    engines: {node: '>=0.10.0'}
+
+  isarray@1.0.0:
+    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+  isarray@2.0.5:
+    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+  isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  isobject@2.1.0:
+    resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
+    engines: {node: '>=0.10.0'}
+
+  isobject@3.0.1:
+    resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+    engines: {node: '>=0.10.0'}
+
+  jackspeak@3.4.3:
+    resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+  js-base64@2.6.4:
+    resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
+
+  js-beautify@1.14.11:
+    resolution: {integrity: sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  js-cookie@3.0.5:
+    resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
+    engines: {node: '>=14'}
+
+  js-tokens@9.0.1:
+    resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+  jsencrypt@3.3.2:
+    resolution: {integrity: sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==}
+
+  json5@1.0.2:
+    resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+    hasBin: true
+
+  jsonfile@6.1.0:
+    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+  kind-of@3.2.2:
+    resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+    engines: {node: '>=0.10.0'}
+
+  kind-of@4.0.0:
+    resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
+    engines: {node: '>=0.10.0'}
+
+  kind-of@5.1.0:
+    resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==}
+    engines: {node: '>=0.10.0'}
+
+  kind-of@6.0.3:
+    resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+    engines: {node: '>=0.10.0'}
+
+  loader-utils@1.4.2:
+    resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
+    engines: {node: '>=4.0.0'}
+
+  local-pkg@0.5.1:
+    resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
+    engines: {node: '>=14'}
+
+  local-pkg@1.1.1:
+    resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
+    engines: {node: '>=14'}
+
+  lodash-es@4.17.21:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+  lodash-unified@1.0.3:
+    resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
+    peerDependencies:
+      '@types/lodash-es': '*'
+      lodash: '*'
+      lodash-es: '*'
+
+  lodash.clonedeep@4.5.0:
+    resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
+  lodash.isequal@4.5.0:
+    resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+    deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
+
+  lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+  lru-cache@10.4.3:
+    resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+  magic-string@0.26.7:
+    resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==}
+    engines: {node: '>=12'}
+
+  magic-string@0.30.17:
+    resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
+  map-cache@0.2.2:
+    resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+    engines: {node: '>=0.10.0'}
+
+  map-visit@1.0.0:
+    resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
+    engines: {node: '>=0.10.0'}
+
+  math-intrinsics@1.1.0:
+    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+    engines: {node: '>= 0.4'}
+
+  mdn-data@2.0.14:
+    resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+
+  memoize-one@6.0.0:
+    resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+
+  merge-options@1.0.1:
+    resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
+    engines: {node: '>=4'}
+
+  merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
+  micromatch@3.1.0:
+    resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==}
+    engines: {node: '>=0.10.0'}
+
+  micromatch@4.0.8:
+    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+    engines: {node: '>=8.6'}
+
+  mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+
+  mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
+
+  minimatch@9.0.1:
+    resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minimatch@9.0.5:
+    resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minimist@1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+  minipass@7.1.2:
+    resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  mixin-deep@1.3.2:
+    resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
+    engines: {node: '>=0.10.0'}
+
+  mlly@1.7.4:
+    resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
+
+  ms@2.0.0:
+    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+  ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  nanoid@3.3.11:
+    resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  nanomatch@1.2.13:
+    resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
+    engines: {node: '>=0.10.0'}
+
+  nopt@7.2.1:
+    resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+    hasBin: true
+
+  normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
+  normalize-wheel-es@1.2.0:
+    resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
+
+  nprogress@0.2.0:
+    resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
+
+  nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+  object-assign@4.1.1:
+    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+    engines: {node: '>=0.10.0'}
+
+  object-copy@0.1.0:
+    resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
+    engines: {node: '>=0.10.0'}
+
+  object-inspect@1.13.4:
+    resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+    engines: {node: '>= 0.4'}
+
+  object-is@1.1.6:
+    resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+    engines: {node: '>= 0.4'}
+
+  object-keys@1.1.1:
+    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+    engines: {node: '>= 0.4'}
+
+  object-visit@1.0.1:
+    resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
+    engines: {node: '>=0.10.0'}
+
+  object.assign@4.1.7:
+    resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+    engines: {node: '>= 0.4'}
+
+  object.pick@1.3.0:
+    resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+    engines: {node: '>=0.10.0'}
+
+  own-keys@1.0.1:
+    resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+    engines: {node: '>= 0.4'}
+
+  package-json-from-dist@1.0.1:
+    resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+  parchment@1.1.4:
+    resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==}
+
+  pascalcase@0.1.1:
+    resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
+    engines: {node: '>=0.10.0'}
+
+  path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  path-scurry@1.11.1:
+    resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+    engines: {node: '>=16 || 14 >=14.18'}
+
+  pathe@0.2.0:
+    resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==}
+
+  pathe@2.0.3:
+    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+  picocolors@1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+  picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  picomatch@4.0.2:
+    resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+    engines: {node: '>=12'}
+
+  pinia@2.1.7:
+    resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==}
+    peerDependencies:
+      '@vue/composition-api': ^1.4.0
+      typescript: '>=4.4.4'
+      vue: ^2.6.14 || ^3.3.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+      typescript:
+        optional: true
+
+  pkg-types@1.3.1:
+    resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+  pkg-types@2.1.0:
+    resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==}
+
+  posix-character-classes@0.1.1:
+    resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
+    engines: {node: '>=0.10.0'}
+
+  possible-typed-array-names@1.1.0:
+    resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+    engines: {node: '>= 0.4'}
+
+  postcss-prefix-selector@1.16.1:
+    resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==}
+    peerDependencies:
+      postcss: '>4 <9'
+
+  postcss@5.2.18:
+    resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
+    engines: {node: '>=0.12'}
+
+  postcss@8.5.3:
+    resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  posthtml-parser@0.2.1:
+    resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==}
+
+  posthtml-rename-id@1.0.12:
+    resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==}
+
+  posthtml-render@1.4.0:
+    resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==}
+    engines: {node: '>=10'}
+
+  posthtml-svg-mode@1.0.3:
+    resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==}
+
+  posthtml@0.9.2:
+    resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==}
+    engines: {node: '>=0.10.0'}
+
+  proto-list@1.2.4:
+    resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+
+  proxy-from-env@1.1.0:
+    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+  quansync@0.2.10:
+    resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==}
+
+  query-string@4.3.4:
+    resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==}
+    engines: {node: '>=0.10.0'}
+
+  queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  quill-delta@3.6.3:
+    resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==}
+    engines: {node: '>=0.10'}
+
+  quill-delta@4.2.2:
+    resolution: {integrity: sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==}
+
+  quill@1.3.7:
+    resolution: {integrity: sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==}
+
+  readable-stream@3.6.2:
+    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+    engines: {node: '>= 6'}
+
+  readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
+  reflect.getprototypeof@1.0.10:
+    resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+    engines: {node: '>= 0.4'}
+
+  regex-not@1.0.2:
+    resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
+    engines: {node: '>=0.10.0'}
+
+  regexp.prototype.flags@1.5.4:
+    resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+    engines: {node: '>= 0.4'}
+
+  repeat-element@1.1.4:
+    resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
+    engines: {node: '>=0.10.0'}
+
+  repeat-string@1.6.1:
+    resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+    engines: {node: '>=0.10'}
+
+  resolve-url@0.2.1:
+    resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
+    deprecated: https://github.com/lydell/resolve-url#deprecated
+
+  ret@0.1.15:
+    resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+    engines: {node: '>=0.12'}
+
+  reusify@1.1.0:
+    resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+  rollup@4.40.2:
+    resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
+
+  run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+  safe-array-concat@1.1.3:
+    resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+    engines: {node: '>=0.4'}
+
+  safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+  safe-push-apply@1.0.0:
+    resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+    engines: {node: '>= 0.4'}
+
+  safe-regex-test@1.1.0:
+    resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+    engines: {node: '>= 0.4'}
+
+  safe-regex@1.1.0:
+    resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
+
+  sass@1.77.5:
+    resolution: {integrity: sha512-oDfX1mukIlxacPdQqNb6mV2tVCrnE+P3nVYioy72V5tlk56CPNcO4TCuFcaCRKKfJ1M3lH95CleRS+dVKL2qMg==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
+
+  scule@1.3.0:
+    resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+  select@1.1.2:
+    resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==}
+
+  semver@7.7.2:
+    resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  set-function-length@1.2.2:
+    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+    engines: {node: '>= 0.4'}
+
+  set-function-name@2.0.2:
+    resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+    engines: {node: '>= 0.4'}
+
+  set-proto@1.0.0:
+    resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+    engines: {node: '>= 0.4'}
+
+  set-value@2.0.1:
+    resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
+    engines: {node: '>=0.10.0'}
+
+  shebang-command@2.0.0:
+    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+    engines: {node: '>=8'}
+
+  shebang-regex@3.0.0:
+    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+    engines: {node: '>=8'}
+
+  side-channel-list@1.0.0:
+    resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+    engines: {node: '>= 0.4'}
+
+  side-channel-map@1.0.1:
+    resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+    engines: {node: '>= 0.4'}
+
+  side-channel-weakmap@1.0.2:
+    resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+    engines: {node: '>= 0.4'}
+
+  side-channel@1.1.0:
+    resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+    engines: {node: '>= 0.4'}
+
+  signal-exit@4.1.0:
+    resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+    engines: {node: '>=14'}
+
+  snapdragon-node@2.1.1:
+    resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
+    engines: {node: '>=0.10.0'}
+
+  snapdragon-util@3.0.1:
+    resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
+    engines: {node: '>=0.10.0'}
+
+  snapdragon@0.8.2:
+    resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
+    engines: {node: '>=0.10.0'}
+
+  sortablejs@1.14.0:
+    resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==}
+
+  sortablejs@1.15.6:
+    resolution: {integrity: sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==}
+
+  source-map-js@1.2.1:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
+
+  source-map-resolve@0.5.3:
+    resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
+    deprecated: See https://github.com/lydell/source-map-resolve#deprecated
+
+  source-map-url@0.4.1:
+    resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
+    deprecated: See https://github.com/lydell/source-map-url#deprecated
+
+  source-map@0.5.7:
+    resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+    engines: {node: '>=0.10.0'}
+
+  source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+
+  sourcemap-codec@1.4.8:
+    resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+    deprecated: Please use @jridgewell/sourcemap-codec instead
+
+  split-string@3.1.0:
+    resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
+    engines: {node: '>=0.10.0'}
+
+  splitpanes@3.1.5:
+    resolution: {integrity: sha512-r3Mq2ITFQ5a2VXLOy4/Sb2Ptp7OfEO8YIbhVJqJXoFc9hc5nTXXkCvtVDjIGbvC0vdE7tse+xTM9BMjsszP6bw==}
+
+  stable@0.1.8:
+    resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
+    deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
+
+  static-extend@0.1.2:
+    resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
+    engines: {node: '>=0.10.0'}
+
+  strict-uri-encode@1.1.0:
+    resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
+    engines: {node: '>=0.10.0'}
+
+  string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+
+  string-width@5.1.2:
+    resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+    engines: {node: '>=12'}
+
+  string.prototype.trim@1.2.10:
+    resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.trimend@1.0.9:
+    resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.trimstart@1.0.8:
+    resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+    engines: {node: '>= 0.4'}
+
+  string_decoder@1.3.0:
+    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+  strip-ansi@3.0.1:
+    resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
+    engines: {node: '>=0.10.0'}
+
+  strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+
+  strip-ansi@7.1.0:
+    resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+    engines: {node: '>=12'}
+
+  strip-literal@2.1.1:
+    resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==}
+
+  supports-color@2.0.0:
+    resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
+    engines: {node: '>=0.8.0'}
+
+  supports-color@3.2.3:
+    resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==}
+    engines: {node: '>=0.8.0'}
+
+  supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
+
+  svg-baker@1.7.0:
+    resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==}
+
+  svgo@2.8.0:
+    resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+
+  tiny-emitter@2.1.0:
+    resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
+
+  to-object-path@0.3.0:
+    resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
+    engines: {node: '>=0.10.0'}
+
+  to-regex-range@2.1.1:
+    resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
+    engines: {node: '>=0.10.0'}
+
+  to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+
+  to-regex@3.0.2:
+    resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
+    engines: {node: '>=0.10.0'}
+
+  traverse@0.6.11:
+    resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==}
+    engines: {node: '>= 0.4'}
+
+  tslib@2.3.0:
+    resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
+
+  typed-array-buffer@1.0.3:
+    resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-byte-length@1.0.3:
+    resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-byte-offset@1.0.4:
+    resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-length@1.0.7:
+    resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+    engines: {node: '>= 0.4'}
+
+  typedarray.prototype.slice@1.0.5:
+    resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==}
+    engines: {node: '>= 0.4'}
+
+  ufo@1.6.1:
+    resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
+
+  unbox-primitive@1.1.0:
+    resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+    engines: {node: '>= 0.4'}
+
+  undici-types@6.21.0:
+    resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+  unimport@3.14.6:
+    resolution: {integrity: sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==}
+
+  union-value@1.0.1:
+    resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
+    engines: {node: '>=0.10.0'}
+
+  universalify@2.0.1:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+
+  unplugin-auto-import@0.17.6:
+    resolution: {integrity: sha512-dmX0Pex5DzMzVuALkexboOZvh51fL/BD6aoPO7qHoTYGlQp0GRKsREv2KMF1lzYI9SXKQiRxAjwzbQnrFFNydQ==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@nuxt/kit': ^3.2.2
+      '@vueuse/core': '*'
+    peerDependenciesMeta:
+      '@nuxt/kit':
+        optional: true
+      '@vueuse/core':
+        optional: true
+
+  unplugin-vue-setup-extend-plus@1.0.1:
+    resolution: {integrity: sha512-mW2IzkyJITyspAV/LEdnEyE1CJip9jB5fCeaVv7Q6X0oJyDrOxXoB+jyet0q5pRJNjErbjQx950/8NPTvbqLTQ==}
+
+  unplugin@1.16.1:
+    resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
+    engines: {node: '>=14.0.0'}
+
+  unset-value@1.0.0:
+    resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
+    engines: {node: '>=0.10.0'}
+
+  urix@0.1.0:
+    resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
+    deprecated: Please see https://github.com/lydell/urix#deprecated
+
+  use@3.1.1:
+    resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
+    engines: {node: '>=0.10.0'}
+
+  util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+  vary@1.1.2:
+    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+    engines: {node: '>= 0.8'}
+
+  vite-plugin-compression@0.5.1:
+    resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
+    peerDependencies:
+      vite: '>=2.0.0'
+
+  vite-plugin-svg-icons@2.0.1:
+    resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
+    peerDependencies:
+      vite: '>=2.0.0'
+
+  vite@5.3.2:
+    resolution: {integrity: sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': ^18.0.0 || >=20.0.0
+      less: '*'
+      lightningcss: ^1.21.0
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      lightningcss:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+
+  vue-cropper@1.1.1:
+    resolution: {integrity: sha512-WsqKMpaBf9Osi1LQlE/5AKdD0nHWOy1asLXocaG8NomOWO07jiZi968+/PbMmnD0QbPJOumDQaGuGa13qys85A==}
+
+  vue-demi@0.14.10:
+    resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
+    engines: {node: '>=12'}
+    hasBin: true
+    peerDependencies:
+      '@vue/composition-api': ^1.0.0-rc.1
+      vue: ^3.0.0-0 || ^2.6.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+
+  vue-router@4.4.0:
+    resolution: {integrity: sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  vue@3.4.31:
+    resolution: {integrity: sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  vuedraggable@4.1.0:
+    resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
+    peerDependencies:
+      vue: ^3.0.1
+
+  webpack-virtual-modules@0.6.2:
+    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+  which-boxed-primitive@1.1.1:
+    resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+    engines: {node: '>= 0.4'}
+
+  which-builtin-type@1.2.1:
+    resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+    engines: {node: '>= 0.4'}
+
+  which-collection@1.0.2:
+    resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+    engines: {node: '>= 0.4'}
+
+  which-typed-array@1.1.19:
+    resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
+    engines: {node: '>= 0.4'}
+
+  which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+
+  wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+
+  wrap-ansi@8.1.0:
+    resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+    engines: {node: '>=12'}
+
+  zrender@5.6.0:
+    resolution: {integrity: sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==}
+
+snapshots:
+
+  '@antfu/utils@0.7.10': {}
+
+  '@babel/helper-string-parser@7.27.1': {}
+
+  '@babel/helper-validator-identifier@7.27.1': {}
+
+  '@babel/parser@7.27.2':
+    dependencies:
+      '@babel/types': 7.27.1
+
+  '@babel/types@7.27.1':
+    dependencies:
+      '@babel/helper-string-parser': 7.27.1
+      '@babel/helper-validator-identifier': 7.27.1
+
+  '@ctrl/tinycolor@3.6.1': {}
+
+  '@element-plus/icons-vue@2.3.1(vue@3.4.31)':
+    dependencies:
+      vue: 3.4.31
+
+  '@esbuild/aix-ppc64@0.21.5':
+    optional: true
+
+  '@esbuild/android-arm64@0.21.5':
+    optional: true
+
+  '@esbuild/android-arm@0.21.5':
+    optional: true
+
+  '@esbuild/android-x64@0.21.5':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.21.5':
+    optional: true
+
+  '@esbuild/darwin-x64@0.21.5':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.21.5':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.21.5':
+    optional: true
+
+  '@esbuild/linux-arm64@0.21.5':
+    optional: true
+
+  '@esbuild/linux-arm@0.21.5':
+    optional: true
+
+  '@esbuild/linux-ia32@0.21.5':
+    optional: true
+
+  '@esbuild/linux-loong64@0.21.5':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.21.5':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.21.5':
+    optional: true
+
+  '@esbuild/linux-riscv64@0.21.5':
+    optional: true
+
+  '@esbuild/linux-s390x@0.21.5':
+    optional: true
+
+  '@esbuild/linux-x64@0.21.5':
+    optional: true
+
+  '@esbuild/netbsd-x64@0.21.5':
+    optional: true
+
+  '@esbuild/openbsd-x64@0.21.5':
+    optional: true
+
+  '@esbuild/sunos-x64@0.21.5':
+    optional: true
+
+  '@esbuild/win32-arm64@0.21.5':
+    optional: true
+
+  '@esbuild/win32-ia32@0.21.5':
+    optional: true
+
+  '@esbuild/win32-x64@0.21.5':
+    optional: true
+
+  '@floating-ui/core@1.7.0':
+    dependencies:
+      '@floating-ui/utils': 0.2.9
+
+  '@floating-ui/dom@1.7.0':
+    dependencies:
+      '@floating-ui/core': 1.7.0
+      '@floating-ui/utils': 0.2.9
+
+  '@floating-ui/utils@0.2.9': {}
+
+  '@isaacs/cliui@8.0.2':
+    dependencies:
+      string-width: 5.1.2
+      string-width-cjs: string-width@4.2.3
+      strip-ansi: 7.1.0
+      strip-ansi-cjs: strip-ansi@6.0.1
+      wrap-ansi: 8.1.0
+      wrap-ansi-cjs: wrap-ansi@7.0.0
+
+  '@jridgewell/sourcemap-codec@1.5.0': {}
+
+  '@nodelib/fs.scandir@2.1.5':
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+
+  '@nodelib/fs.stat@2.0.5': {}
+
+  '@nodelib/fs.walk@1.2.8':
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.19.1
+
+  '@one-ini/wasm@0.1.1': {}
+
+  '@pkgjs/parseargs@0.11.0':
+    optional: true
+
+  '@rollup/pluginutils@5.1.4(rollup@4.40.2)':
+    dependencies:
+      '@types/estree': 1.0.7
+      estree-walker: 2.0.2
+      picomatch: 4.0.2
+    optionalDependencies:
+      rollup: 4.40.2
+
+  '@rollup/rollup-android-arm-eabi@4.40.2':
+    optional: true
+
+  '@rollup/rollup-android-arm64@4.40.2':
+    optional: true
+
+  '@rollup/rollup-darwin-arm64@4.40.2':
+    optional: true
+
+  '@rollup/rollup-darwin-x64@4.40.2':
+    optional: true
+
+  '@rollup/rollup-freebsd-arm64@4.40.2':
+    optional: true
+
+  '@rollup/rollup-freebsd-x64@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-arm-musleabihf@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-gnu@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-musl@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-loongarch64-gnu@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-powerpc64le-gnu@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-gnu@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-musl@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-s390x-gnu@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-x64-gnu@4.40.2':
+    optional: true
+
+  '@rollup/rollup-linux-x64-musl@4.40.2':
+    optional: true
+
+  '@rollup/rollup-win32-arm64-msvc@4.40.2':
+    optional: true
+
+  '@rollup/rollup-win32-ia32-msvc@4.40.2':
+    optional: true
+
+  '@rollup/rollup-win32-x64-msvc@4.40.2':
+    optional: true
+
+  '@sxzz/popperjs-es@2.11.7': {}
+
+  '@trysound/sax@0.2.0': {}
+
+  '@types/estree@1.0.7': {}
+
+  '@types/lodash-es@4.17.12':
+    dependencies:
+      '@types/lodash': 4.17.16
+
+  '@types/lodash@4.17.16': {}
+
+  '@types/node@22.15.18':
+    dependencies:
+      undici-types: 6.21.0
+
+  '@types/svgo@2.6.4':
+    dependencies:
+      '@types/node': 22.15.18
+
+  '@types/web-bluetooth@0.0.16': {}
+
+  '@types/web-bluetooth@0.0.20': {}
+
+  '@vitejs/plugin-vue@5.0.5(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5))(vue@3.4.31)':
+    dependencies:
+      vite: 5.3.2(@types/node@22.15.18)(sass@1.77.5)
+      vue: 3.4.31
+
+  '@vue/compiler-core@3.4.31':
+    dependencies:
+      '@babel/parser': 7.27.2
+      '@vue/shared': 3.4.31
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
+  '@vue/compiler-core@3.5.14':
+    dependencies:
+      '@babel/parser': 7.27.2
+      '@vue/shared': 3.5.14
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
+  '@vue/compiler-dom@3.4.31':
+    dependencies:
+      '@vue/compiler-core': 3.4.31
+      '@vue/shared': 3.4.31
+
+  '@vue/compiler-dom@3.5.14':
+    dependencies:
+      '@vue/compiler-core': 3.5.14
+      '@vue/shared': 3.5.14
+
+  '@vue/compiler-sfc@3.4.31':
+    dependencies:
+      '@babel/parser': 7.27.2
+      '@vue/compiler-core': 3.4.31
+      '@vue/compiler-dom': 3.4.31
+      '@vue/compiler-ssr': 3.4.31
+      '@vue/shared': 3.4.31
+      estree-walker: 2.0.2
+      magic-string: 0.30.17
+      postcss: 8.5.3
+      source-map-js: 1.2.1
+
+  '@vue/compiler-sfc@3.5.14':
+    dependencies:
+      '@babel/parser': 7.27.2
+      '@vue/compiler-core': 3.5.14
+      '@vue/compiler-dom': 3.5.14
+      '@vue/compiler-ssr': 3.5.14
+      '@vue/shared': 3.5.14
+      estree-walker: 2.0.2
+      magic-string: 0.30.17
+      postcss: 8.5.3
+      source-map-js: 1.2.1
+
+  '@vue/compiler-ssr@3.4.31':
+    dependencies:
+      '@vue/compiler-dom': 3.4.31
+      '@vue/shared': 3.4.31
+
+  '@vue/compiler-ssr@3.5.14':
+    dependencies:
+      '@vue/compiler-dom': 3.5.14
+      '@vue/shared': 3.5.14
+
+  '@vue/devtools-api@6.6.4': {}
+
+  '@vue/reactivity@3.4.31':
+    dependencies:
+      '@vue/shared': 3.4.31
+
+  '@vue/runtime-core@3.4.31':
+    dependencies:
+      '@vue/reactivity': 3.4.31
+      '@vue/shared': 3.4.31
+
+  '@vue/runtime-dom@3.4.31':
+    dependencies:
+      '@vue/reactivity': 3.4.31
+      '@vue/runtime-core': 3.4.31
+      '@vue/shared': 3.4.31
+      csstype: 3.1.3
+
+  '@vue/server-renderer@3.4.31(vue@3.4.31)':
+    dependencies:
+      '@vue/compiler-ssr': 3.4.31
+      '@vue/shared': 3.4.31
+      vue: 3.4.31
+
+  '@vue/shared@3.4.31': {}
+
+  '@vue/shared@3.5.14': {}
+
+  '@vueup/vue-quill@1.2.0(vue@3.4.31)':
+    dependencies:
+      quill: 1.3.7
+      quill-delta: 4.2.2
+      vue: 3.4.31
+
+  '@vueuse/core@10.11.0(vue@3.4.31)':
+    dependencies:
+      '@types/web-bluetooth': 0.0.20
+      '@vueuse/metadata': 10.11.0
+      '@vueuse/shared': 10.11.0(vue@3.4.31)
+      vue-demi: 0.14.10(vue@3.4.31)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  '@vueuse/core@9.13.0(vue@3.4.31)':
+    dependencies:
+      '@types/web-bluetooth': 0.0.16
+      '@vueuse/metadata': 9.13.0
+      '@vueuse/shared': 9.13.0(vue@3.4.31)
+      vue-demi: 0.14.10(vue@3.4.31)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  '@vueuse/metadata@10.11.0': {}
+
+  '@vueuse/metadata@9.13.0': {}
+
+  '@vueuse/shared@10.11.0(vue@3.4.31)':
+    dependencies:
+      vue-demi: 0.14.10(vue@3.4.31)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  '@vueuse/shared@9.13.0(vue@3.4.31)':
+    dependencies:
+      vue-demi: 0.14.10(vue@3.4.31)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  abbrev@2.0.0: {}
+
+  acorn@8.14.1: {}
+
+  ansi-regex@2.1.1: {}
+
+  ansi-regex@5.0.1: {}
+
+  ansi-regex@6.1.0: {}
+
+  ansi-styles@2.2.1: {}
+
+  ansi-styles@4.3.0:
+    dependencies:
+      color-convert: 2.0.1
+
+  ansi-styles@6.2.1: {}
+
+  anymatch@3.1.3:
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+
+  arr-diff@4.0.0: {}
+
+  arr-flatten@1.1.0: {}
+
+  arr-union@3.1.0: {}
+
+  array-buffer-byte-length@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      is-array-buffer: 3.0.5
+
+  array-unique@0.3.2: {}
+
+  arraybuffer.prototype.slice@1.0.4:
+    dependencies:
+      array-buffer-byte-length: 1.0.2
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      is-array-buffer: 3.0.5
+
+  assign-symbols@1.0.0: {}
+
+  async-function@1.0.0: {}
+
+  async-validator@4.2.5: {}
+
+  asynckit@0.4.0: {}
+
+  atob@2.1.2: {}
+
+  available-typed-arrays@1.0.7:
+    dependencies:
+      possible-typed-array-names: 1.1.0
+
+  axios@0.28.1:
+    dependencies:
+      follow-redirects: 1.15.9
+      form-data: 4.0.2
+      proxy-from-env: 1.1.0
+    transitivePeerDependencies:
+      - debug
+
+  balanced-match@1.0.2: {}
+
+  base@0.11.2:
+    dependencies:
+      cache-base: 1.0.1
+      class-utils: 0.3.6
+      component-emitter: 1.3.1
+      define-property: 1.0.0
+      isobject: 3.0.1
+      mixin-deep: 1.3.2
+      pascalcase: 0.1.1
+
+  big.js@5.2.2: {}
+
+  binary-extensions@2.3.0: {}
+
+  bluebird@3.7.2: {}
+
+  boolbase@1.0.0: {}
+
+  brace-expansion@2.0.1:
+    dependencies:
+      balanced-match: 1.0.2
+
+  braces@2.3.2:
+    dependencies:
+      arr-flatten: 1.1.0
+      array-unique: 0.3.2
+      extend-shallow: 2.0.1
+      fill-range: 4.0.0
+      isobject: 3.0.1
+      repeat-element: 1.1.4
+      snapdragon: 0.8.2
+      snapdragon-node: 2.1.1
+      split-string: 3.1.0
+      to-regex: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  braces@3.0.3:
+    dependencies:
+      fill-range: 7.1.1
+
+  cache-base@1.0.1:
+    dependencies:
+      collection-visit: 1.0.0
+      component-emitter: 1.3.1
+      get-value: 2.0.6
+      has-value: 1.0.0
+      isobject: 3.0.1
+      set-value: 2.0.1
+      to-object-path: 0.3.0
+      union-value: 1.0.1
+      unset-value: 1.0.0
+
+  call-bind-apply-helpers@1.0.2:
+    dependencies:
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+
+  call-bind@1.0.8:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-define-property: 1.0.1
+      get-intrinsic: 1.3.0
+      set-function-length: 1.2.2
+
+  call-bound@1.0.4:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      get-intrinsic: 1.3.0
+
+  chalk@1.1.3:
+    dependencies:
+      ansi-styles: 2.2.1
+      escape-string-regexp: 1.0.5
+      has-ansi: 2.0.0
+      strip-ansi: 3.0.1
+      supports-color: 2.0.0
+
+  chalk@4.1.2:
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
+  chokidar@3.6.0:
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.3
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+
+  class-utils@0.3.6:
+    dependencies:
+      arr-union: 3.1.0
+      define-property: 0.2.5
+      isobject: 3.0.1
+      static-extend: 0.1.2
+
+  clipboard@2.0.11:
+    dependencies:
+      good-listener: 1.2.2
+      select: 1.1.2
+      tiny-emitter: 2.1.0
+
+  clone@2.1.2: {}
+
+  collection-visit@1.0.0:
+    dependencies:
+      map-visit: 1.0.0
+      object-visit: 1.0.1
+
+  color-convert@2.0.1:
+    dependencies:
+      color-name: 1.1.4
+
+  color-name@1.1.4: {}
+
+  combined-stream@1.0.8:
+    dependencies:
+      delayed-stream: 1.0.0
+
+  commander@10.0.1: {}
+
+  commander@7.2.0: {}
+
+  component-emitter@1.3.1: {}
+
+  confbox@0.1.8: {}
+
+  confbox@0.2.2: {}
+
+  config-chain@1.1.13:
+    dependencies:
+      ini: 1.3.8
+      proto-list: 1.2.4
+
+  copy-descriptor@0.1.1: {}
+
+  cors@2.8.5:
+    dependencies:
+      object-assign: 4.1.1
+      vary: 1.1.2
+
+  cross-spawn@7.0.6:
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
+  css-select@4.3.0:
+    dependencies:
+      boolbase: 1.0.0
+      css-what: 6.1.0
+      domhandler: 4.3.1
+      domutils: 2.8.0
+      nth-check: 2.1.1
+
+  css-tree@1.1.3:
+    dependencies:
+      mdn-data: 2.0.14
+      source-map: 0.6.1
+
+  css-what@6.1.0: {}
+
+  csso@4.2.0:
+    dependencies:
+      css-tree: 1.1.3
+
+  csstype@3.1.3: {}
+
+  data-view-buffer@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  data-view-byte-length@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  data-view-byte-offset@1.0.1:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  dayjs@1.11.13: {}
+
+  debug@2.6.9:
+    dependencies:
+      ms: 2.0.0
+
+  debug@4.4.1:
+    dependencies:
+      ms: 2.1.3
+
+  decode-uri-component@0.2.2: {}
+
+  deep-equal@1.1.2:
+    dependencies:
+      is-arguments: 1.2.0
+      is-date-object: 1.1.0
+      is-regex: 1.2.1
+      object-is: 1.1.6
+      object-keys: 1.1.1
+      regexp.prototype.flags: 1.5.4
+
+  define-data-property@1.1.4:
+    dependencies:
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  define-properties@1.2.1:
+    dependencies:
+      define-data-property: 1.1.4
+      has-property-descriptors: 1.0.2
+      object-keys: 1.1.1
+
+  define-property@0.2.5:
+    dependencies:
+      is-descriptor: 0.1.7
+
+  define-property@1.0.0:
+    dependencies:
+      is-descriptor: 1.0.3
+
+  define-property@2.0.2:
+    dependencies:
+      is-descriptor: 1.0.3
+      isobject: 3.0.1
+
+  delayed-stream@1.0.0: {}
+
+  delegate@3.2.0: {}
+
+  dom-serializer@0.2.2:
+    dependencies:
+      domelementtype: 2.3.0
+      entities: 2.2.0
+
+  dom-serializer@1.4.1:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+      entities: 2.2.0
+
+  domelementtype@1.3.1: {}
+
+  domelementtype@2.3.0: {}
+
+  domhandler@2.4.2:
+    dependencies:
+      domelementtype: 1.3.1
+
+  domhandler@4.3.1:
+    dependencies:
+      domelementtype: 2.3.0
+
+  domutils@1.7.0:
+    dependencies:
+      dom-serializer: 0.2.2
+      domelementtype: 1.3.1
+
+  domutils@2.8.0:
+    dependencies:
+      dom-serializer: 1.4.1
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+
+  dunder-proto@1.0.1:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  eastasianwidth@0.2.0: {}
+
+  echarts@5.5.1:
+    dependencies:
+      tslib: 2.3.0
+      zrender: 5.6.0
+
+  editorconfig@1.0.4:
+    dependencies:
+      '@one-ini/wasm': 0.1.1
+      commander: 10.0.1
+      minimatch: 9.0.1
+      semver: 7.7.2
+
+  element-plus@2.7.7(vue@3.4.31):
+    dependencies:
+      '@ctrl/tinycolor': 3.6.1
+      '@element-plus/icons-vue': 2.3.1(vue@3.4.31)
+      '@floating-ui/dom': 1.7.0
+      '@popperjs/core': '@sxzz/popperjs-es@2.11.7'
+      '@types/lodash': 4.17.16
+      '@types/lodash-es': 4.17.12
+      '@vueuse/core': 9.13.0(vue@3.4.31)
+      async-validator: 4.2.5
+      dayjs: 1.11.13
+      escape-html: 1.0.3
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+      lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21)
+      memoize-one: 6.0.0
+      normalize-wheel-es: 1.2.0
+      vue: 3.4.31
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+
+  emoji-regex@8.0.0: {}
+
+  emoji-regex@9.2.2: {}
+
+  emojis-list@3.0.0: {}
+
+  entities@1.1.2: {}
+
+  entities@2.2.0: {}
+
+  entities@4.5.0: {}
+
+  es-abstract@1.23.9:
+    dependencies:
+      array-buffer-byte-length: 1.0.2
+      arraybuffer.prototype.slice: 1.0.4
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      data-view-buffer: 1.0.2
+      data-view-byte-length: 1.0.2
+      data-view-byte-offset: 1.0.1
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      es-set-tostringtag: 2.1.0
+      es-to-primitive: 1.3.0
+      function.prototype.name: 1.1.8
+      get-intrinsic: 1.3.0
+      get-proto: 1.0.1
+      get-symbol-description: 1.1.0
+      globalthis: 1.0.4
+      gopd: 1.2.0
+      has-property-descriptors: 1.0.2
+      has-proto: 1.2.0
+      has-symbols: 1.1.0
+      hasown: 2.0.2
+      internal-slot: 1.1.0
+      is-array-buffer: 3.0.5
+      is-callable: 1.2.7
+      is-data-view: 1.0.2
+      is-regex: 1.2.1
+      is-shared-array-buffer: 1.0.4
+      is-string: 1.1.1
+      is-typed-array: 1.1.15
+      is-weakref: 1.1.1
+      math-intrinsics: 1.1.0
+      object-inspect: 1.13.4
+      object-keys: 1.1.1
+      object.assign: 4.1.7
+      own-keys: 1.0.1
+      regexp.prototype.flags: 1.5.4
+      safe-array-concat: 1.1.3
+      safe-push-apply: 1.0.0
+      safe-regex-test: 1.1.0
+      set-proto: 1.0.0
+      string.prototype.trim: 1.2.10
+      string.prototype.trimend: 1.0.9
+      string.prototype.trimstart: 1.0.8
+      typed-array-buffer: 1.0.3
+      typed-array-byte-length: 1.0.3
+      typed-array-byte-offset: 1.0.4
+      typed-array-length: 1.0.7
+      unbox-primitive: 1.1.0
+      which-typed-array: 1.1.19
+
+  es-define-property@1.0.1: {}
+
+  es-errors@1.3.0: {}
+
+  es-object-atoms@1.1.1:
+    dependencies:
+      es-errors: 1.3.0
+
+  es-set-tostringtag@2.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      has-tostringtag: 1.0.2
+      hasown: 2.0.2
+
+  es-to-primitive@1.3.0:
+    dependencies:
+      is-callable: 1.2.7
+      is-date-object: 1.1.0
+      is-symbol: 1.1.1
+
+  esbuild@0.21.5:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.21.5
+      '@esbuild/android-arm': 0.21.5
+      '@esbuild/android-arm64': 0.21.5
+      '@esbuild/android-x64': 0.21.5
+      '@esbuild/darwin-arm64': 0.21.5
+      '@esbuild/darwin-x64': 0.21.5
+      '@esbuild/freebsd-arm64': 0.21.5
+      '@esbuild/freebsd-x64': 0.21.5
+      '@esbuild/linux-arm': 0.21.5
+      '@esbuild/linux-arm64': 0.21.5
+      '@esbuild/linux-ia32': 0.21.5
+      '@esbuild/linux-loong64': 0.21.5
+      '@esbuild/linux-mips64el': 0.21.5
+      '@esbuild/linux-ppc64': 0.21.5
+      '@esbuild/linux-riscv64': 0.21.5
+      '@esbuild/linux-s390x': 0.21.5
+      '@esbuild/linux-x64': 0.21.5
+      '@esbuild/netbsd-x64': 0.21.5
+      '@esbuild/openbsd-x64': 0.21.5
+      '@esbuild/sunos-x64': 0.21.5
+      '@esbuild/win32-arm64': 0.21.5
+      '@esbuild/win32-ia32': 0.21.5
+      '@esbuild/win32-x64': 0.21.5
+
+  escape-html@1.0.3: {}
+
+  escape-string-regexp@1.0.5: {}
+
+  escape-string-regexp@5.0.0: {}
+
+  estree-walker@2.0.2: {}
+
+  estree-walker@3.0.3:
+    dependencies:
+      '@types/estree': 1.0.7
+
+  etag@1.8.1: {}
+
+  eventemitter3@2.0.3: {}
+
+  expand-brackets@2.1.4:
+    dependencies:
+      debug: 2.6.9
+      define-property: 0.2.5
+      extend-shallow: 2.0.1
+      posix-character-classes: 0.1.1
+      regex-not: 1.0.2
+      snapdragon: 0.8.2
+      to-regex: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  exsolve@1.0.5: {}
+
+  extend-shallow@2.0.1:
+    dependencies:
+      is-extendable: 0.1.1
+
+  extend-shallow@3.0.2:
+    dependencies:
+      assign-symbols: 1.0.0
+      is-extendable: 1.0.1
+
+  extend@3.0.2: {}
+
+  extglob@2.0.4:
+    dependencies:
+      array-unique: 0.3.2
+      define-property: 1.0.0
+      expand-brackets: 2.1.4
+      extend-shallow: 2.0.1
+      fragment-cache: 0.2.1
+      regex-not: 1.0.2
+      snapdragon: 0.8.2
+      to-regex: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  fast-diff@1.1.2: {}
+
+  fast-diff@1.2.0: {}
+
+  fast-glob@3.3.3:
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.8
+
+  fastq@1.19.1:
+    dependencies:
+      reusify: 1.1.0
+
+  file-saver@2.0.5: {}
+
+  fill-range@4.0.0:
+    dependencies:
+      extend-shallow: 2.0.1
+      is-number: 3.0.0
+      repeat-string: 1.6.1
+      to-regex-range: 2.1.1
+
+  fill-range@7.1.1:
+    dependencies:
+      to-regex-range: 5.0.1
+
+  follow-redirects@1.15.9: {}
+
+  for-each@0.3.5:
+    dependencies:
+      is-callable: 1.2.7
+
+  for-in@1.0.2: {}
+
+  foreground-child@3.3.1:
+    dependencies:
+      cross-spawn: 7.0.6
+      signal-exit: 4.1.0
+
+  form-data@4.0.2:
+    dependencies:
+      asynckit: 0.4.0
+      combined-stream: 1.0.8
+      es-set-tostringtag: 2.1.0
+      mime-types: 2.1.35
+
+  fragment-cache@0.2.1:
+    dependencies:
+      map-cache: 0.2.2
+
+  fs-extra@10.1.0:
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 6.1.0
+      universalify: 2.0.1
+
+  fsevents@2.3.3:
+    optional: true
+
+  function-bind@1.1.2: {}
+
+  function.prototype.name@1.1.8:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      functions-have-names: 1.2.3
+      hasown: 2.0.2
+      is-callable: 1.2.7
+
+  functions-have-names@1.2.3: {}
+
+  fuse.js@6.6.2: {}
+
+  get-intrinsic@1.3.0:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      function-bind: 1.1.2
+      get-proto: 1.0.1
+      gopd: 1.2.0
+      has-symbols: 1.1.0
+      hasown: 2.0.2
+      math-intrinsics: 1.1.0
+
+  get-proto@1.0.1:
+    dependencies:
+      dunder-proto: 1.0.1
+      es-object-atoms: 1.1.1
+
+  get-symbol-description@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+
+  get-value@2.0.6: {}
+
+  glob-parent@5.1.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  glob@10.4.5:
+    dependencies:
+      foreground-child: 3.3.1
+      jackspeak: 3.4.3
+      minimatch: 9.0.5
+      minipass: 7.1.2
+      package-json-from-dist: 1.0.1
+      path-scurry: 1.11.1
+
+  globalthis@1.0.4:
+    dependencies:
+      define-properties: 1.2.1
+      gopd: 1.2.0
+
+  good-listener@1.2.2:
+    dependencies:
+      delegate: 3.2.0
+
+  gopd@1.2.0: {}
+
+  graceful-fs@4.2.11: {}
+
+  has-ansi@2.0.0:
+    dependencies:
+      ansi-regex: 2.1.1
+
+  has-bigints@1.1.0: {}
+
+  has-flag@1.0.0: {}
+
+  has-flag@4.0.0: {}
+
+  has-property-descriptors@1.0.2:
+    dependencies:
+      es-define-property: 1.0.1
+
+  has-proto@1.2.0:
+    dependencies:
+      dunder-proto: 1.0.1
+
+  has-symbols@1.1.0: {}
+
+  has-tostringtag@1.0.2:
+    dependencies:
+      has-symbols: 1.1.0
+
+  has-value@0.3.1:
+    dependencies:
+      get-value: 2.0.6
+      has-values: 0.1.4
+      isobject: 2.1.0
+
+  has-value@1.0.0:
+    dependencies:
+      get-value: 2.0.6
+      has-values: 1.0.0
+      isobject: 3.0.1
+
+  has-values@0.1.4: {}
+
+  has-values@1.0.0:
+    dependencies:
+      is-number: 3.0.0
+      kind-of: 4.0.0
+
+  hasown@2.0.2:
+    dependencies:
+      function-bind: 1.1.2
+
+  he@1.2.0: {}
+
+  htmlparser2@3.10.1:
+    dependencies:
+      domelementtype: 1.3.1
+      domhandler: 2.4.2
+      domutils: 1.7.0
+      entities: 1.1.2
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+
+  image-size@0.5.5: {}
+
+  immutable@4.3.7: {}
+
+  inherits@2.0.4: {}
+
+  ini@1.3.8: {}
+
+  internal-slot@1.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      hasown: 2.0.2
+      side-channel: 1.1.0
+
+  is-accessor-descriptor@1.0.1:
+    dependencies:
+      hasown: 2.0.2
+
+  is-arguments@1.2.0:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-array-buffer@3.0.5:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+
+  is-async-function@2.1.1:
+    dependencies:
+      async-function: 1.0.0
+      call-bound: 1.0.4
+      get-proto: 1.0.1
+      has-tostringtag: 1.0.2
+      safe-regex-test: 1.1.0
+
+  is-bigint@1.1.0:
+    dependencies:
+      has-bigints: 1.1.0
+
+  is-binary-path@2.1.0:
+    dependencies:
+      binary-extensions: 2.3.0
+
+  is-boolean-object@1.2.2:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-buffer@1.1.6: {}
+
+  is-callable@1.2.7: {}
+
+  is-data-descriptor@1.0.1:
+    dependencies:
+      hasown: 2.0.2
+
+  is-data-view@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+      is-typed-array: 1.1.15
+
+  is-date-object@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-descriptor@0.1.7:
+    dependencies:
+      is-accessor-descriptor: 1.0.1
+      is-data-descriptor: 1.0.1
+
+  is-descriptor@1.0.3:
+    dependencies:
+      is-accessor-descriptor: 1.0.1
+      is-data-descriptor: 1.0.1
+
+  is-extendable@0.1.1: {}
+
+  is-extendable@1.0.1:
+    dependencies:
+      is-plain-object: 2.0.4
+
+  is-extglob@2.1.1: {}
+
+  is-finalizationregistry@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+
+  is-fullwidth-code-point@3.0.0: {}
+
+  is-generator-function@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      get-proto: 1.0.1
+      has-tostringtag: 1.0.2
+      safe-regex-test: 1.1.0
+
+  is-glob@4.0.3:
+    dependencies:
+      is-extglob: 2.1.1
+
+  is-map@2.0.3: {}
+
+  is-number-object@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-number@3.0.0:
+    dependencies:
+      kind-of: 3.2.2
+
+  is-number@7.0.0: {}
+
+  is-plain-obj@1.1.0: {}
+
+  is-plain-object@2.0.4:
+    dependencies:
+      isobject: 3.0.1
+
+  is-regex@1.2.1:
+    dependencies:
+      call-bound: 1.0.4
+      gopd: 1.2.0
+      has-tostringtag: 1.0.2
+      hasown: 2.0.2
+
+  is-set@2.0.3: {}
+
+  is-shared-array-buffer@1.0.4:
+    dependencies:
+      call-bound: 1.0.4
+
+  is-string@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-symbol@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+      has-symbols: 1.1.0
+      safe-regex-test: 1.1.0
+
+  is-typed-array@1.1.15:
+    dependencies:
+      which-typed-array: 1.1.19
+
+  is-weakmap@2.0.2: {}
+
+  is-weakref@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+
+  is-weakset@2.0.4:
+    dependencies:
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+
+  is-windows@1.0.2: {}
+
+  isarray@1.0.0: {}
+
+  isarray@2.0.5: {}
+
+  isexe@2.0.0: {}
+
+  isobject@2.1.0:
+    dependencies:
+      isarray: 1.0.0
+
+  isobject@3.0.1: {}
+
+  jackspeak@3.4.3:
+    dependencies:
+      '@isaacs/cliui': 8.0.2
+    optionalDependencies:
+      '@pkgjs/parseargs': 0.11.0
+
+  js-base64@2.6.4: {}
+
+  js-beautify@1.14.11:
+    dependencies:
+      config-chain: 1.1.13
+      editorconfig: 1.0.4
+      glob: 10.4.5
+      nopt: 7.2.1
+
+  js-cookie@3.0.5: {}
+
+  js-tokens@9.0.1: {}
+
+  jsencrypt@3.3.2: {}
+
+  json5@1.0.2:
+    dependencies:
+      minimist: 1.2.8
+
+  jsonfile@6.1.0:
+    dependencies:
+      universalify: 2.0.1
+    optionalDependencies:
+      graceful-fs: 4.2.11
+
+  kind-of@3.2.2:
+    dependencies:
+      is-buffer: 1.1.6
+
+  kind-of@4.0.0:
+    dependencies:
+      is-buffer: 1.1.6
+
+  kind-of@5.1.0: {}
+
+  kind-of@6.0.3: {}
+
+  loader-utils@1.4.2:
+    dependencies:
+      big.js: 5.2.2
+      emojis-list: 3.0.0
+      json5: 1.0.2
+
+  local-pkg@0.5.1:
+    dependencies:
+      mlly: 1.7.4
+      pkg-types: 1.3.1
+
+  local-pkg@1.1.1:
+    dependencies:
+      mlly: 1.7.4
+      pkg-types: 2.1.0
+      quansync: 0.2.10
+
+  lodash-es@4.17.21: {}
+
+  lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
+    dependencies:
+      '@types/lodash-es': 4.17.12
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+
+  lodash.clonedeep@4.5.0: {}
+
+  lodash.isequal@4.5.0: {}
+
+  lodash@4.17.21: {}
+
+  lru-cache@10.4.3: {}
+
+  magic-string@0.26.7:
+    dependencies:
+      sourcemap-codec: 1.4.8
+
+  magic-string@0.30.17:
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.0
+
+  map-cache@0.2.2: {}
+
+  map-visit@1.0.0:
+    dependencies:
+      object-visit: 1.0.1
+
+  math-intrinsics@1.1.0: {}
+
+  mdn-data@2.0.14: {}
+
+  memoize-one@6.0.0: {}
+
+  merge-options@1.0.1:
+    dependencies:
+      is-plain-obj: 1.1.0
+
+  merge2@1.4.1: {}
+
+  micromatch@3.1.0:
+    dependencies:
+      arr-diff: 4.0.0
+      array-unique: 0.3.2
+      braces: 2.3.2
+      define-property: 1.0.0
+      extend-shallow: 2.0.1
+      extglob: 2.0.4
+      fragment-cache: 0.2.1
+      kind-of: 5.1.0
+      nanomatch: 1.2.13
+      object.pick: 1.3.0
+      regex-not: 1.0.2
+      snapdragon: 0.8.2
+      to-regex: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  micromatch@4.0.8:
+    dependencies:
+      braces: 3.0.3
+      picomatch: 2.3.1
+
+  mime-db@1.52.0: {}
+
+  mime-types@2.1.35:
+    dependencies:
+      mime-db: 1.52.0
+
+  minimatch@9.0.1:
+    dependencies:
+      brace-expansion: 2.0.1
+
+  minimatch@9.0.5:
+    dependencies:
+      brace-expansion: 2.0.1
+
+  minimist@1.2.8: {}
+
+  minipass@7.1.2: {}
+
+  mixin-deep@1.3.2:
+    dependencies:
+      for-in: 1.0.2
+      is-extendable: 1.0.1
+
+  mlly@1.7.4:
+    dependencies:
+      acorn: 8.14.1
+      pathe: 2.0.3
+      pkg-types: 1.3.1
+      ufo: 1.6.1
+
+  ms@2.0.0: {}
+
+  ms@2.1.3: {}
+
+  nanoid@3.3.11: {}
+
+  nanomatch@1.2.13:
+    dependencies:
+      arr-diff: 4.0.0
+      array-unique: 0.3.2
+      define-property: 2.0.2
+      extend-shallow: 3.0.2
+      fragment-cache: 0.2.1
+      is-windows: 1.0.2
+      kind-of: 6.0.3
+      object.pick: 1.3.0
+      regex-not: 1.0.2
+      snapdragon: 0.8.2
+      to-regex: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  nopt@7.2.1:
+    dependencies:
+      abbrev: 2.0.0
+
+  normalize-path@3.0.0: {}
+
+  normalize-wheel-es@1.2.0: {}
+
+  nprogress@0.2.0: {}
+
+  nth-check@2.1.1:
+    dependencies:
+      boolbase: 1.0.0
+
+  object-assign@4.1.1: {}
+
+  object-copy@0.1.0:
+    dependencies:
+      copy-descriptor: 0.1.1
+      define-property: 0.2.5
+      kind-of: 3.2.2
+
+  object-inspect@1.13.4: {}
+
+  object-is@1.1.6:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+
+  object-keys@1.1.1: {}
+
+  object-visit@1.0.1:
+    dependencies:
+      isobject: 3.0.1
+
+  object.assign@4.1.7:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+      has-symbols: 1.1.0
+      object-keys: 1.1.1
+
+  object.pick@1.3.0:
+    dependencies:
+      isobject: 3.0.1
+
+  own-keys@1.0.1:
+    dependencies:
+      get-intrinsic: 1.3.0
+      object-keys: 1.1.1
+      safe-push-apply: 1.0.0
+
+  package-json-from-dist@1.0.1: {}
+
+  parchment@1.1.4: {}
+
+  pascalcase@0.1.1: {}
+
+  path-key@3.1.1: {}
+
+  path-scurry@1.11.1:
+    dependencies:
+      lru-cache: 10.4.3
+      minipass: 7.1.2
+
+  pathe@0.2.0: {}
+
+  pathe@2.0.3: {}
+
+  picocolors@1.1.1: {}
+
+  picomatch@2.3.1: {}
+
+  picomatch@4.0.2: {}
+
+  pinia@2.1.7(vue@3.4.31):
+    dependencies:
+      '@vue/devtools-api': 6.6.4
+      vue: 3.4.31
+      vue-demi: 0.14.10(vue@3.4.31)
+
+  pkg-types@1.3.1:
+    dependencies:
+      confbox: 0.1.8
+      mlly: 1.7.4
+      pathe: 2.0.3
+
+  pkg-types@2.1.0:
+    dependencies:
+      confbox: 0.2.2
+      exsolve: 1.0.5
+      pathe: 2.0.3
+
+  posix-character-classes@0.1.1: {}
+
+  possible-typed-array-names@1.1.0: {}
+
+  postcss-prefix-selector@1.16.1(postcss@5.2.18):
+    dependencies:
+      postcss: 5.2.18
+
+  postcss@5.2.18:
+    dependencies:
+      chalk: 1.1.3
+      js-base64: 2.6.4
+      source-map: 0.5.7
+      supports-color: 3.2.3
+
+  postcss@8.5.3:
+    dependencies:
+      nanoid: 3.3.11
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  posthtml-parser@0.2.1:
+    dependencies:
+      htmlparser2: 3.10.1
+      isobject: 2.1.0
+
+  posthtml-rename-id@1.0.12:
+    dependencies:
+      escape-string-regexp: 1.0.5
+
+  posthtml-render@1.4.0: {}
+
+  posthtml-svg-mode@1.0.3:
+    dependencies:
+      merge-options: 1.0.1
+      posthtml: 0.9.2
+      posthtml-parser: 0.2.1
+      posthtml-render: 1.4.0
+
+  posthtml@0.9.2:
+    dependencies:
+      posthtml-parser: 0.2.1
+      posthtml-render: 1.4.0
+
+  proto-list@1.2.4: {}
+
+  proxy-from-env@1.1.0: {}
+
+  quansync@0.2.10: {}
+
+  query-string@4.3.4:
+    dependencies:
+      object-assign: 4.1.1
+      strict-uri-encode: 1.1.0
+
+  queue-microtask@1.2.3: {}
+
+  quill-delta@3.6.3:
+    dependencies:
+      deep-equal: 1.1.2
+      extend: 3.0.2
+      fast-diff: 1.1.2
+
+  quill-delta@4.2.2:
+    dependencies:
+      fast-diff: 1.2.0
+      lodash.clonedeep: 4.5.0
+      lodash.isequal: 4.5.0
+
+  quill@1.3.7:
+    dependencies:
+      clone: 2.1.2
+      deep-equal: 1.1.2
+      eventemitter3: 2.0.3
+      extend: 3.0.2
+      parchment: 1.1.4
+      quill-delta: 3.6.3
+
+  readable-stream@3.6.2:
+    dependencies:
+      inherits: 2.0.4
+      string_decoder: 1.3.0
+      util-deprecate: 1.0.2
+
+  readdirp@3.6.0:
+    dependencies:
+      picomatch: 2.3.1
+
+  reflect.getprototypeof@1.0.10:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      get-intrinsic: 1.3.0
+      get-proto: 1.0.1
+      which-builtin-type: 1.2.1
+
+  regex-not@1.0.2:
+    dependencies:
+      extend-shallow: 3.0.2
+      safe-regex: 1.1.0
+
+  regexp.prototype.flags@1.5.4:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-errors: 1.3.0
+      get-proto: 1.0.1
+      gopd: 1.2.0
+      set-function-name: 2.0.2
+
+  repeat-element@1.1.4: {}
+
+  repeat-string@1.6.1: {}
+
+  resolve-url@0.2.1: {}
+
+  ret@0.1.15: {}
+
+  reusify@1.1.0: {}
+
+  rollup@4.40.2:
+    dependencies:
+      '@types/estree': 1.0.7
+    optionalDependencies:
+      '@rollup/rollup-android-arm-eabi': 4.40.2
+      '@rollup/rollup-android-arm64': 4.40.2
+      '@rollup/rollup-darwin-arm64': 4.40.2
+      '@rollup/rollup-darwin-x64': 4.40.2
+      '@rollup/rollup-freebsd-arm64': 4.40.2
+      '@rollup/rollup-freebsd-x64': 4.40.2
+      '@rollup/rollup-linux-arm-gnueabihf': 4.40.2
+      '@rollup/rollup-linux-arm-musleabihf': 4.40.2
+      '@rollup/rollup-linux-arm64-gnu': 4.40.2
+      '@rollup/rollup-linux-arm64-musl': 4.40.2
+      '@rollup/rollup-linux-loongarch64-gnu': 4.40.2
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2
+      '@rollup/rollup-linux-riscv64-gnu': 4.40.2
+      '@rollup/rollup-linux-riscv64-musl': 4.40.2
+      '@rollup/rollup-linux-s390x-gnu': 4.40.2
+      '@rollup/rollup-linux-x64-gnu': 4.40.2
+      '@rollup/rollup-linux-x64-musl': 4.40.2
+      '@rollup/rollup-win32-arm64-msvc': 4.40.2
+      '@rollup/rollup-win32-ia32-msvc': 4.40.2
+      '@rollup/rollup-win32-x64-msvc': 4.40.2
+      fsevents: 2.3.3
+
+  run-parallel@1.2.0:
+    dependencies:
+      queue-microtask: 1.2.3
+
+  safe-array-concat@1.1.3:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+      has-symbols: 1.1.0
+      isarray: 2.0.5
+
+  safe-buffer@5.2.1: {}
+
+  safe-push-apply@1.0.0:
+    dependencies:
+      es-errors: 1.3.0
+      isarray: 2.0.5
+
+  safe-regex-test@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-regex: 1.2.1
+
+  safe-regex@1.1.0:
+    dependencies:
+      ret: 0.1.15
+
+  sass@1.77.5:
+    dependencies:
+      chokidar: 3.6.0
+      immutable: 4.3.7
+      source-map-js: 1.2.1
+
+  scule@1.3.0: {}
+
+  select@1.1.2: {}
+
+  semver@7.7.2: {}
+
+  set-function-length@1.2.2:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.3.0
+      gopd: 1.2.0
+      has-property-descriptors: 1.0.2
+
+  set-function-name@2.0.2:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      functions-have-names: 1.2.3
+      has-property-descriptors: 1.0.2
+
+  set-proto@1.0.0:
+    dependencies:
+      dunder-proto: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+
+  set-value@2.0.1:
+    dependencies:
+      extend-shallow: 2.0.1
+      is-extendable: 0.1.1
+      is-plain-object: 2.0.4
+      split-string: 3.1.0
+
+  shebang-command@2.0.0:
+    dependencies:
+      shebang-regex: 3.0.0
+
+  shebang-regex@3.0.0: {}
+
+  side-channel-list@1.0.0:
+    dependencies:
+      es-errors: 1.3.0
+      object-inspect: 1.13.4
+
+  side-channel-map@1.0.1:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      object-inspect: 1.13.4
+
+  side-channel-weakmap@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      object-inspect: 1.13.4
+      side-channel-map: 1.0.1
+
+  side-channel@1.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      object-inspect: 1.13.4
+      side-channel-list: 1.0.0
+      side-channel-map: 1.0.1
+      side-channel-weakmap: 1.0.2
+
+  signal-exit@4.1.0: {}
+
+  snapdragon-node@2.1.1:
+    dependencies:
+      define-property: 1.0.0
+      isobject: 3.0.1
+      snapdragon-util: 3.0.1
+
+  snapdragon-util@3.0.1:
+    dependencies:
+      kind-of: 3.2.2
+
+  snapdragon@0.8.2:
+    dependencies:
+      base: 0.11.2
+      debug: 2.6.9
+      define-property: 0.2.5
+      extend-shallow: 2.0.1
+      map-cache: 0.2.2
+      source-map: 0.5.7
+      source-map-resolve: 0.5.3
+      use: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
+
+  sortablejs@1.14.0: {}
+
+  sortablejs@1.15.6: {}
+
+  source-map-js@1.2.1: {}
+
+  source-map-resolve@0.5.3:
+    dependencies:
+      atob: 2.1.2
+      decode-uri-component: 0.2.2
+      resolve-url: 0.2.1
+      source-map-url: 0.4.1
+      urix: 0.1.0
+
+  source-map-url@0.4.1: {}
+
+  source-map@0.5.7: {}
+
+  source-map@0.6.1: {}
+
+  sourcemap-codec@1.4.8: {}
+
+  split-string@3.1.0:
+    dependencies:
+      extend-shallow: 3.0.2
+
+  splitpanes@3.1.5: {}
+
+  stable@0.1.8: {}
+
+  static-extend@0.1.2:
+    dependencies:
+      define-property: 0.2.5
+      object-copy: 0.1.0
+
+  strict-uri-encode@1.1.0: {}
+
+  string-width@4.2.3:
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+
+  string-width@5.1.2:
+    dependencies:
+      eastasianwidth: 0.2.0
+      emoji-regex: 9.2.2
+      strip-ansi: 7.1.0
+
+  string.prototype.trim@1.2.10:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-data-property: 1.1.4
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-object-atoms: 1.1.1
+      has-property-descriptors: 1.0.2
+
+  string.prototype.trimend@1.0.9:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  string.prototype.trimstart@1.0.8:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  string_decoder@1.3.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  strip-ansi@3.0.1:
+    dependencies:
+      ansi-regex: 2.1.1
+
+  strip-ansi@6.0.1:
+    dependencies:
+      ansi-regex: 5.0.1
+
+  strip-ansi@7.1.0:
+    dependencies:
+      ansi-regex: 6.1.0
+
+  strip-literal@2.1.1:
+    dependencies:
+      js-tokens: 9.0.1
+
+  supports-color@2.0.0: {}
+
+  supports-color@3.2.3:
+    dependencies:
+      has-flag: 1.0.0
+
+  supports-color@7.2.0:
+    dependencies:
+      has-flag: 4.0.0
+
+  svg-baker@1.7.0:
+    dependencies:
+      bluebird: 3.7.2
+      clone: 2.1.2
+      he: 1.2.0
+      image-size: 0.5.5
+      loader-utils: 1.4.2
+      merge-options: 1.0.1
+      micromatch: 3.1.0
+      postcss: 5.2.18
+      postcss-prefix-selector: 1.16.1(postcss@5.2.18)
+      posthtml-rename-id: 1.0.12
+      posthtml-svg-mode: 1.0.3
+      query-string: 4.3.4
+      traverse: 0.6.11
+    transitivePeerDependencies:
+      - supports-color
+
+  svgo@2.8.0:
+    dependencies:
+      '@trysound/sax': 0.2.0
+      commander: 7.2.0
+      css-select: 4.3.0
+      css-tree: 1.1.3
+      csso: 4.2.0
+      picocolors: 1.1.1
+      stable: 0.1.8
+
+  tiny-emitter@2.1.0: {}
+
+  to-object-path@0.3.0:
+    dependencies:
+      kind-of: 3.2.2
+
+  to-regex-range@2.1.1:
+    dependencies:
+      is-number: 3.0.0
+      repeat-string: 1.6.1
+
+  to-regex-range@5.0.1:
+    dependencies:
+      is-number: 7.0.0
+
+  to-regex@3.0.2:
+    dependencies:
+      define-property: 2.0.2
+      extend-shallow: 3.0.2
+      regex-not: 1.0.2
+      safe-regex: 1.1.0
+
+  traverse@0.6.11:
+    dependencies:
+      gopd: 1.2.0
+      typedarray.prototype.slice: 1.0.5
+      which-typed-array: 1.1.19
+
+  tslib@2.3.0: {}
+
+  typed-array-buffer@1.0.3:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-typed-array: 1.1.15
+
+  typed-array-byte-length@1.0.3:
+    dependencies:
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      has-proto: 1.2.0
+      is-typed-array: 1.1.15
+
+  typed-array-byte-offset@1.0.4:
+    dependencies:
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      has-proto: 1.2.0
+      is-typed-array: 1.1.15
+      reflect.getprototypeof: 1.0.10
+
+  typed-array-length@1.0.7:
+    dependencies:
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      is-typed-array: 1.1.15
+      possible-typed-array-names: 1.1.0
+      reflect.getprototypeof: 1.0.10
+
+  typedarray.prototype.slice@1.0.5:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      get-proto: 1.0.1
+      math-intrinsics: 1.1.0
+      typed-array-buffer: 1.0.3
+      typed-array-byte-offset: 1.0.4
+
+  ufo@1.6.1: {}
+
+  unbox-primitive@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      has-bigints: 1.1.0
+      has-symbols: 1.1.0
+      which-boxed-primitive: 1.1.1
+
+  undici-types@6.21.0: {}
+
+  unimport@3.14.6(rollup@4.40.2):
+    dependencies:
+      '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
+      acorn: 8.14.1
+      escape-string-regexp: 5.0.0
+      estree-walker: 3.0.3
+      fast-glob: 3.3.3
+      local-pkg: 1.1.1
+      magic-string: 0.30.17
+      mlly: 1.7.4
+      pathe: 2.0.3
+      picomatch: 4.0.2
+      pkg-types: 1.3.1
+      scule: 1.3.0
+      strip-literal: 2.1.1
+      unplugin: 1.16.1
+    transitivePeerDependencies:
+      - rollup
+
+  union-value@1.0.1:
+    dependencies:
+      arr-union: 3.1.0
+      get-value: 2.0.6
+      is-extendable: 0.1.1
+      set-value: 2.0.1
+
+  universalify@2.0.1: {}
+
+  unplugin-auto-import@0.17.6(@vueuse/core@10.11.0(vue@3.4.31))(rollup@4.40.2):
+    dependencies:
+      '@antfu/utils': 0.7.10
+      '@rollup/pluginutils': 5.1.4(rollup@4.40.2)
+      fast-glob: 3.3.3
+      local-pkg: 0.5.1
+      magic-string: 0.30.17
+      minimatch: 9.0.5
+      unimport: 3.14.6(rollup@4.40.2)
+      unplugin: 1.16.1
+    optionalDependencies:
+      '@vueuse/core': 10.11.0(vue@3.4.31)
+    transitivePeerDependencies:
+      - rollup
+
+  unplugin-vue-setup-extend-plus@1.0.1:
+    dependencies:
+      '@vue/compiler-sfc': 3.5.14
+      magic-string: 0.26.7
+      unplugin: 1.16.1
+
+  unplugin@1.16.1:
+    dependencies:
+      acorn: 8.14.1
+      webpack-virtual-modules: 0.6.2
+
+  unset-value@1.0.0:
+    dependencies:
+      has-value: 0.3.1
+      isobject: 3.0.1
+
+  urix@0.1.0: {}
+
+  use@3.1.1: {}
+
+  util-deprecate@1.0.2: {}
+
+  vary@1.1.2: {}
+
+  vite-plugin-compression@0.5.1(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5)):
+    dependencies:
+      chalk: 4.1.2
+      debug: 4.4.1
+      fs-extra: 10.1.0
+      vite: 5.3.2(@types/node@22.15.18)(sass@1.77.5)
+    transitivePeerDependencies:
+      - supports-color
+
+  vite-plugin-svg-icons@2.0.1(vite@5.3.2(@types/node@22.15.18)(sass@1.77.5)):
+    dependencies:
+      '@types/svgo': 2.6.4
+      cors: 2.8.5
+      debug: 4.4.1
+      etag: 1.8.1
+      fs-extra: 10.1.0
+      pathe: 0.2.0
+      svg-baker: 1.7.0
+      svgo: 2.8.0
+      vite: 5.3.2(@types/node@22.15.18)(sass@1.77.5)
+    transitivePeerDependencies:
+      - supports-color
+
+  vite@5.3.2(@types/node@22.15.18)(sass@1.77.5):
+    dependencies:
+      esbuild: 0.21.5
+      postcss: 8.5.3
+      rollup: 4.40.2
+    optionalDependencies:
+      '@types/node': 22.15.18
+      fsevents: 2.3.3
+      sass: 1.77.5
+
+  vue-cropper@1.1.1: {}
+
+  vue-demi@0.14.10(vue@3.4.31):
+    dependencies:
+      vue: 3.4.31
+
+  vue-router@4.4.0(vue@3.4.31):
+    dependencies:
+      '@vue/devtools-api': 6.6.4
+      vue: 3.4.31
+
+  vue@3.4.31:
+    dependencies:
+      '@vue/compiler-dom': 3.4.31
+      '@vue/compiler-sfc': 3.4.31
+      '@vue/runtime-dom': 3.4.31
+      '@vue/server-renderer': 3.4.31(vue@3.4.31)
+      '@vue/shared': 3.4.31
+
+  vuedraggable@4.1.0(vue@3.4.31):
+    dependencies:
+      sortablejs: 1.14.0
+      vue: 3.4.31
+
+  webpack-virtual-modules@0.6.2: {}
+
+  which-boxed-primitive@1.1.1:
+    dependencies:
+      is-bigint: 1.1.0
+      is-boolean-object: 1.2.2
+      is-number-object: 1.1.1
+      is-string: 1.1.1
+      is-symbol: 1.1.1
+
+  which-builtin-type@1.2.1:
+    dependencies:
+      call-bound: 1.0.4
+      function.prototype.name: 1.1.8
+      has-tostringtag: 1.0.2
+      is-async-function: 2.1.1
+      is-date-object: 1.1.0
+      is-finalizationregistry: 1.1.1
+      is-generator-function: 1.1.0
+      is-regex: 1.2.1
+      is-weakref: 1.1.1
+      isarray: 2.0.5
+      which-boxed-primitive: 1.1.1
+      which-collection: 1.0.2
+      which-typed-array: 1.1.19
+
+  which-collection@1.0.2:
+    dependencies:
+      is-map: 2.0.3
+      is-set: 2.0.3
+      is-weakmap: 2.0.2
+      is-weakset: 2.0.4
+
+  which-typed-array@1.1.19:
+    dependencies:
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      for-each: 0.3.5
+      get-proto: 1.0.1
+      gopd: 1.2.0
+      has-tostringtag: 1.0.2
+
+  which@2.0.2:
+    dependencies:
+      isexe: 2.0.0
+
+  wrap-ansi@7.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  wrap-ansi@8.1.0:
+    dependencies:
+      ansi-styles: 6.2.1
+      string-width: 5.1.2
+      strip-ansi: 7.1.0
+
+  zrender@5.6.0:
+    dependencies:
+      tslib: 2.3.0
diff --git a/src/api/procurementManagement/projectProfit.js b/src/api/procurementManagement/projectProfit.js
new file mode 100644
index 0000000..7fb1660
--- /dev/null
+++ b/src/api/procurementManagement/projectProfit.js
@@ -0,0 +1,10 @@
+import request from "@/utils/request";
+
+// 鍒嗛〉鏌ヨ
+export function getPurchaseList(query) {
+  return request({
+    url: "/purchase/report/list",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/api/salesManagement/salesLedger.js b/src/api/salesManagement/salesLedger.js
index 272a5f7..3a2fa22 100644
--- a/src/api/salesManagement/salesLedger.js
+++ b/src/api/salesManagement/salesLedger.js
@@ -1,102 +1,111 @@
 // 閿�鍞彴璐﹂〉闈㈡帴鍙�
-import request from '@/utils/request'
+import request from "@/utils/request";
 
 // 鍒嗛〉鏌ヨ
 export function ledgerList(query) {
-    return request({
-        url: '/sales/ledger/list',
-        method: 'get',
-        params: query
-    })
+  return request({
+    url: "/sales/ledger/list",
+    method: "get",
+    params: query,
+  });
 }
 // 瀛愯〃鏍兼煡璇�
 export function productList(query) {
-    return request({
-        url: '/sales/product/list',
-        method: 'get',
-        params: query
-    })
+  return request({
+    url: "/sales/product/list",
+    method: "get",
+    params: query,
+  });
 }
 // 鏌ヨ瀹㈡埛鍚嶇О鍒楄〃
 export function customerList(query) {
-    return request({
-        url: '/basic/customer/customerList',
-        method: 'get',
-        params: query
-    })
+  return request({
+    url: "/basic/customer/customerList",
+    method: "get",
+    params: query,
+  });
 }
 // 鏂板銆佷慨鏀归攢鍞彴璐�
 export function addOrUpdateSalesLedger(query) {
-    return request({
-        url: '/sales/ledger/addOrUpdateSalesLedger',
-        method: 'post',
-        data: query
-    })
+  return request({
+    url: "/sales/ledger/addOrUpdateSalesLedger",
+    method: "post",
+    data: query,
+  });
 }
 // 鍒犻櫎閿�鍞彴璐�
 export function delLedger(query) {
-    return request({
-        url: '/sales/ledger/delLedger',
-        method: 'delete',
-        data: query
-    })
+  return request({
+    url: "/sales/ledger/delLedger",
+    method: "delete",
+    data: query,
+  });
 }
 // 鏌ヨ閿�鍞彴璐﹁鎯�
 export function getSalesLedgerWithProducts(query) {
-    return request({
-        url: '/sales/ledger/getSalesLedgerWithProducts',
-        method: 'get',
-        params: query
-    })
+  return request({
+    url: "/sales/ledger/getSalesLedgerWithProducts",
+    method: "get",
+    params: query,
+  });
 }
 // 瀹炴椂淇敼浜у搧淇℃伅
 export function addOrUpdateSalesLedgerProduct(query) {
-    return request({
-        url: '/sales/product/addOrUpdateSalesLedgerProduct',
-        method: 'post',
-        data: query
-    })
+  return request({
+    url: "/sales/product/addOrUpdateSalesLedgerProduct",
+    method: "post",
+    data: query,
+  });
 }
 // 鍒犻櫎浜у搧
 export function delProduct(query) {
-    return request({
-        url: '/sales/product/delProduct',
-        method: 'delete',
-        data: query
-    })
+  return request({
+    url: "/sales/product/delProduct",
+    method: "delete",
+    data: query,
+  });
 }
 // 涓婁紶闄勪欢
 export function upload(query) {
-    return request({
-        url: '/file/upload',
-        method: 'post',
-        data: query,
-        responseType: 'blob'
-    })
+  return request({
+    url: "/file/upload",
+    method: "post",
+    data: query,
+    responseType: "blob",
+  });
 }
 // 缂栬緫鏃跺垹闄ら檮浠�
 export function delLedgerFile(query) {
-    return request({
-        url: '/sales/ledger/delLedgerFile',
-        method: 'delete',
-        data: query,
-    })
+  return request({
+    url: "/sales/ledger/delLedgerFile",
+    method: "delete",
+    data: query,
+  });
 }
 
 // 閿�鍞笉鍒嗛〉鏌ヨ
 export function ledgerListNoPage(query) {
-    return request({
-        url: '/sales/ledger/listNoPage',
-        method: 'get',
-        params: query
-    })
+  return request({
+    url: "/sales/ledger/listNoPage",
+    method: "get",
+    params: query,
+  });
 }
 
 // 鍒嗛〉鏌ヨ
 export function ledgerListPage(query) {
-    return request({
-        url: '/sales/ledger/listPage',
-        method: 'get',
-        params: query
-    })
+  return request({
+    url: "/sales/ledger/listPage",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏍规嵁閿�鍞悎鍚屽彿鏌ヤ骇鍝佷俊鎭�
+export function getProductInfoByContractNo(query) {
+  return request({
+    url: "/purchase/ledger/getProductBySalesNo",
+    method: "get",
+    params: query,
+  });
 }
diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue
index 89cc790..9670c72 100644
--- a/src/components/ImageUpload/index.vue
+++ b/src/components/ImageUpload/index.vue
@@ -47,202 +47,210 @@
 </template>
 
 <script setup>
-import { getToken } from "@/utils/auth"
-import { isExternal } from "@/utils/validate"
-import Sortable from 'sortablejs'
+import { getToken } from "@/utils/auth";
+import { isExternal } from "@/utils/validate";
+import Sortable from "sortablejs";
 
 const props = defineProps({
   modelValue: [String, Object, Array],
   // 涓婁紶鎺ュ彛鍦板潃
   action: {
     type: String,
-    default: "/common/upload"
+    default: "/common/upload",
   },
   // 涓婁紶鎼哄甫鐨勫弬鏁�
   data: {
-    type: Object
+    type: Object,
   },
   // 鍥剧墖鏁伴噺闄愬埗
   limit: {
     type: Number,
-    default: 5
+    default: 5,
   },
   // 澶у皬闄愬埗(MB)
   fileSize: {
     type: Number,
-    default: 5
+    default: 5,
   },
   // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg']
   fileType: {
     type: Array,
-    default: () => ["png", "jpg", "jpeg"]
+    default: () => ["png", "jpg", "jpeg"],
   },
   // 鏄惁鏄剧ず鎻愮ず
   isShowTip: {
     type: Boolean,
-    default: true
+    default: true,
   },
   // 鎷栧姩鎺掑簭
   drag: {
     type: Boolean,
-    default: true
-  }
-})
+    default: true,
+  },
+});
 
-const { proxy } = getCurrentInstance()
-const emit = defineEmits()
-const number = ref(0)
-const uploadList = ref([])
-const dialogImageUrl = ref("")
-const dialogVisible = ref(false)
-const baseUrl = import.meta.env.VITE_APP_BASE_API
-const uploadImgUrl = ref(import.meta.env.VITE_APP_BASE_API + props.action) // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-const headers = ref({ Authorization: "Bearer " + getToken() })
-const fileList = ref([])
+const { proxy } = getCurrentInstance();
+const emit = defineEmits();
+const number = ref(0);
+const uploadList = ref([]);
+const dialogImageUrl = ref("");
+const dialogVisible = ref(false);
+const baseUrl = import.meta.env.VITE_APP_BASE_API;
+const uploadImgUrl = ref(import.meta.env.VITE_APP_BASE_API + props.action); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
+const headers = ref({ Authorization: "Bearer " + getToken() });
+const fileList = ref([]);
 const showTip = computed(
   () => props.isShowTip && (props.fileType || props.fileSize)
-)
+);
 
-watch(() => props.modelValue, val => {
-  if (val) {
-    // 棣栧厛灏嗗�艰浆涓烘暟缁�
-    const list = Array.isArray(val) ? val : props.modelValue.split(",")
-    // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁�
-    fileList.value = list.map(item => {
-      if (typeof item === "string") {
-        if (item.indexOf(baseUrl) === -1 && !isExternal(item)) {
-          item = { name: baseUrl + item, url: baseUrl + item }
-        } else {
-          item = { name: item, url: item }
+watch(
+  () => props.modelValue,
+  (val) => {
+    if (val) {
+      // 棣栧厛灏嗗�艰浆涓烘暟缁�
+      const list = Array.isArray(val) ? val : props.modelValue.split(",");
+      // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁�
+      fileList.value = list.map((item) => {
+        if (typeof item === "string") {
+          if (item.indexOf(baseUrl) === -1 && !isExternal(item)) {
+            item = { name: baseUrl + item, url: baseUrl + item };
+          } else {
+            item = { name: item, url: item };
+          }
         }
-      }
-      return item
-    })
-  } else {
-    fileList.value = []
-    return []
-  }
-},{ deep: true, immediate: true })
+        return item;
+      });
+    } else {
+      fileList.value = [];
+      return [];
+    }
+  },
+  { deep: true, immediate: true }
+);
 
 // 涓婁紶鍓峫oading鍔犺浇
 function handleBeforeUpload(file) {
-  let isImg = false
+  let isImg = false;
   if (props.fileType.length) {
-    let fileExtension = ""
+    let fileExtension = "";
     if (file.name.lastIndexOf(".") > -1) {
-      fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1)
+      fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
     }
-    isImg = props.fileType.some(type => {
-      if (file.type.indexOf(type) > -1) return true
-      if (fileExtension && fileExtension.indexOf(type) > -1) return true
-      return false
-    })
+    isImg = props.fileType.some((type) => {
+      if (file.type.indexOf(type) > -1) return true;
+      if (fileExtension && fileExtension.indexOf(type) > -1) return true;
+      return false;
+    });
   } else {
-    isImg = file.type.indexOf("image") > -1
+    isImg = file.type.indexOf("image") > -1;
   }
   if (!isImg) {
-    proxy.$modal.msgError(`鏂囦欢鏍煎紡涓嶆纭紝璇蜂笂浼�${props.fileType.join("/")}鍥剧墖鏍煎紡鏂囦欢!`)
-    return false
+    proxy.$modal.msgError(
+      `鏂囦欢鏍煎紡涓嶆纭紝璇蜂笂浼�${props.fileType.join("/")}鍥剧墖鏍煎紡鏂囦欢!`
+    );
+    return false;
   }
-  if (file.name.includes(',')) {
-    proxy.$modal.msgError('鏂囦欢鍚嶄笉姝g‘锛屼笉鑳藉寘鍚嫳鏂囬�楀彿!')
-    return false
+  if (file.name.includes(",")) {
+    proxy.$modal.msgError("鏂囦欢鍚嶄笉姝g‘锛屼笉鑳藉寘鍚嫳鏂囬�楀彿!");
+    return false;
   }
   if (props.fileSize) {
-    const isLt = file.size / 1024 / 1024 < props.fileSize
+    const isLt = file.size / 1024 / 1024 < props.fileSize;
     if (!isLt) {
-      proxy.$modal.msgError(`涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`)
-      return false
+      proxy.$modal.msgError(`涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`);
+      return false;
     }
   }
-  proxy.$modal.loading("姝e湪涓婁紶鍥剧墖锛岃绋嶅��...")
-  number.value++
+  proxy.$modal.loading("姝e湪涓婁紶鍥剧墖锛岃绋嶅��...");
+  number.value++;
 }
 
 // 鏂囦欢涓暟瓒呭嚭
 function handleExceed() {
-  proxy.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`)
+  proxy.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`);
 }
 
 // 涓婁紶鎴愬姛鍥炶皟
 function handleUploadSuccess(res, file) {
   if (res.code === 200) {
-    uploadList.value.push({ name: res.fileName, url: res.fileName })
-    uploadedSuccessfully()
+    uploadList.value.push({ name: res.fileName, url: res.fileName });
+    uploadedSuccessfully();
   } else {
-    number.value--
-    proxy.$modal.closeLoading()
-    proxy.$modal.msgError(res.msg)
-    proxy.$refs.imageUpload.handleRemove(file)
-    uploadedSuccessfully()
+    number.value--;
+    proxy.$modal.closeLoading();
+    proxy.$modal.msgError(res.msg);
+    proxy.$refs.imageUpload.handleRemove(file);
+    uploadedSuccessfully();
   }
 }
 
 // 鍒犻櫎鍥剧墖
 function handleDelete(file) {
-  const findex = fileList.value.map(f => f.name).indexOf(file.name)
+  const findex = fileList.value.map((f) => f.name).indexOf(file.name);
   if (findex > -1 && uploadList.value.length === number.value) {
-    fileList.value.splice(findex, 1)
-    emit("update:modelValue", listToString(fileList.value))
-    return false
+    fileList.value.splice(findex, 1);
+    emit("update:modelValue", listToString(fileList.value));
+    return false;
   }
 }
 
 // 涓婁紶缁撴潫澶勭悊
 function uploadedSuccessfully() {
   if (number.value > 0 && uploadList.value.length === number.value) {
-    fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value)
-    uploadList.value = []
-    number.value = 0
-    emit("update:modelValue", listToString(fileList.value))
-    proxy.$modal.closeLoading()
+    fileList.value = fileList.value
+      .filter((f) => f.url !== undefined)
+      .concat(uploadList.value);
+    uploadList.value = [];
+    number.value = 0;
+    emit("update:modelValue", listToString(fileList.value));
+    proxy.$modal.closeLoading();
   }
 }
 
 // 涓婁紶澶辫触
 function handleUploadError() {
-  proxy.$modal.msgError("涓婁紶鍥剧墖澶辫触")
-  proxy.$modal.closeLoading()
+  proxy.$modal.msgError("涓婁紶鍥剧墖澶辫触");
+  proxy.$modal.closeLoading();
 }
 
 // 棰勮
 function handlePictureCardPreview(file) {
-  dialogImageUrl.value = file.url
-  dialogVisible.value = true
+  dialogImageUrl.value = file.url;
+  dialogVisible.value = true;
 }
 
 // 瀵硅薄杞垚鎸囧畾瀛楃涓插垎闅�
 function listToString(list, separator) {
-  let strs = ""
-  separator = separator || ","
+  let strs = "";
+  separator = separator || ",";
   for (let i in list) {
     if (undefined !== list[i].url && list[i].url.indexOf("blob:") !== 0) {
-      strs += list[i].url.replace(baseUrl, "") + separator
+      strs += list[i].url.replace(baseUrl, "") + separator;
     }
   }
-  return strs != "" ? strs.substr(0, strs.length - 1) : ""
+  return strs != "" ? strs.substr(0, strs.length - 1) : "";
 }
 
 // 鍒濆鍖栨嫋鎷芥帓搴�
 onMounted(() => {
   if (props.drag) {
     nextTick(() => {
-      const element = document.querySelector('.el-upload-list')
+      const element = document.querySelector(".el-upload-list");
       Sortable.create(element, {
         onEnd: (evt) => {
-          const movedItem = fileList.value.splice(evt.oldIndex, 1)[0]
-          fileList.value.splice(evt.newIndex, 0, movedItem)
-          emit('update:modelValue', listToString(fileList.value))
-        }
-      })
-    })
+          const movedItem = fileList.value.splice(evt.oldIndex, 1)[0];
+          fileList.value.splice(evt.newIndex, 0, movedItem);
+          emit("update:modelValue", listToString(fileList.value));
+        },
+      });
+    });
   }
-})
+});
 </script>
 
 <style scoped lang="scss">
 // .el-upload--picture-card 鎺у埗鍔犲彿閮ㄥ垎
 :deep(.hide .el-upload--picture-card) {
-    display: none;
+  display: none;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue
index ab817f8..3c9e756 100644
--- a/src/components/PIMTable/PIMTable.vue
+++ b/src/components/PIMTable/PIMTable.vue
@@ -1,25 +1,70 @@
 <template>
-  <el-table ref="multipleTable" v-loading="tableLoading" :border="border" :data="tableData"
-    :header-cell-style="{ background: '#F0F1F5', color: '#333333' }" height="calc(100vh - 18.5em)"
-    :highlight-current-row="highlightCurrentRow" :row-class-name="rowClassName" :row-style="rowStyle" :row-key="rowKey"
-    style="width: 100%" tooltip-effect="dark" @row-click="rowClick" @current-change="currentChange" :show-summary="isShowSummary"
-            :summary-method="summaryMethod"
-    @selection-change="handleSelectionChange" class="lims-table">
-    <el-table-column align="center" type="selection" width="55"  v-if="isSelection"/>
+  <el-table
+    ref="multipleTable"
+    v-loading="tableLoading"
+    :border="border"
+    :data="tableData"
+    :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
+    height="calc(100vh - 18.5em)"
+    :highlight-current-row="highlightCurrentRow"
+    :row-class-name="rowClassName"
+    :row-style="rowStyle"
+    :row-key="rowKey"
+    style="width: 100%"
+    tooltip-effect="dark"
+    @row-click="rowClick"
+    @current-change="currentChange"
+    :show-summary="isShowSummary"
+    :summary-method="summaryMethod"
+    @selection-change="handleSelectionChange"
+    class="lims-table"
+  >
+    <el-table-column
+      align="center"
+      type="selection"
+      width="55"
+      v-if="isSelection"
+    />
     <el-table-column align="center" label="搴忓彿" type="index" width="60" />
 
-    <el-table-column v-for="(item, index) in column" :key="index" :column-key="item.columnKey"
-      :filter-method="item.filterHandler" :filter-multiple="item.filterMultiple" :filtered-value="item.filteredValue"
-      :filters="item.filters" :fixed="item.fixed" :label="item.label" :prop="item.prop" show-overflow-tooltip
-      :align="item.align" :sortable="!!item.sortable" :type="item.type" :width="item.width">
-      <template v-if="item.hasOwnProperty('colunmTemplate')" #[item.colunmTemplate]="scope">
-        <slot v-if="item.theadSlot" :name="item.theadSlot" :index="scope.$index" :row="scope.row" />
+    <el-table-column
+      v-for="(item, index) in column"
+      :key="index"
+      :column-key="item.columnKey"
+      :filter-method="item.filterHandler"
+      :filter-multiple="item.filterMultiple"
+      :filtered-value="item.filteredValue"
+      :filters="item.filters"
+      :fixed="item.fixed"
+      :label="item.label"
+      :prop="item.prop"
+      show-overflow-tooltip
+      :align="item.align"
+      :sortable="!!item.sortable"
+      :type="item.type"
+      :width="item.width"
+    >
+      <template
+        v-if="item.hasOwnProperty('colunmTemplate')"
+        #[item.colunmTemplate]="scope"
+      >
+        <slot
+          v-if="item.theadSlot"
+          :name="item.theadSlot"
+          :index="scope.$index"
+          :row="scope.row"
+        />
       </template>
 
       <template #default="scope">
         <!-- 鎻掓Ы -->
         <div v-if="item.dataType == 'slot'">
-          <slot v-if="item.slot" :index="scope.$index" :name="item.slot" :row="scope.row" />
+          <slot
+            v-if="item.slot"
+            :index="scope.$index"
+            :name="item.slot"
+            :row="scope.row"
+          />
         </div>
         <!-- 杩涘害鏉� -->
         <div v-else-if="item.dataType == 'progress'">
@@ -27,26 +72,47 @@
         </div>
         <!-- 鍥剧墖 -->
         <div v-else-if="item.dataType == 'image'">
-          <img :src="javaApi + '/img/' + scope.row[item.prop]" alt=""
-            style="width: 40px; height: 40px; margin-top: 10px" />
+          <img
+            :src="javaApi + '/img/' + scope.row[item.prop]"
+            alt=""
+            style="width: 40px; height: 40px; margin-top: 10px"
+          />
         </div>
 
         <!-- tag -->
         <div v-else-if="item.dataType == 'tag'">
-          <el-tag v-if="typeof dataTypeFn(scope.row[item.prop], item.formatData) === 'string'"
+          <el-tag
+            v-if="
+              typeof dataTypeFn(scope.row[item.prop], item.formatData) ===
+              'string'
+            "
             :title="formatters(scope.row[item.prop], item.formatData)"
-            :type="formatType(scope.row[item.prop], item.formatType)">
+            :type="formatType(scope.row[item.prop], item.formatType)"
+          >
             {{ formatters(scope.row[item.prop], item.formatData) }}
           </el-tag>
 
-          <el-tag v-for="(tag, index) in dataTypeFn(scope.row[item.prop], item.formatData)"
-            v-else-if="typeof dataTypeFn(scope.row[item.prop], item.formatData) === 'object'" :key="index"
-            :title="formatters(scope.row[item.prop], item.formatData)" :type="formatType(tag, item.formatType)">
+          <el-tag
+            v-for="(tag, index) in dataTypeFn(
+              scope.row[item.prop],
+              item.formatData
+            )"
+            v-else-if="
+              typeof dataTypeFn(scope.row[item.prop], item.formatData) ===
+              'object'
+            "
+            :key="index"
+            :title="formatters(scope.row[item.prop], item.formatData)"
+            :type="formatType(tag, item.formatType)"
+          >
             {{ item.tagGroup ? tag[item.tagGroup.label] ?? tag : tag }}
           </el-tag>
 
-          <el-tag v-else :title="formatters(scope.row[item.prop], item.formatData)"
-            :type="formatType(scope.row[item.prop], item.formatType)">
+          <el-tag
+            v-else
+            :title="formatters(scope.row[item.prop], item.formatData)"
+            :type="formatType(scope.row[item.prop], item.formatType)"
+          >
             {{ formatters(scope.row[item.prop], item.formatData) }}
           </el-tag>
         </div>
@@ -54,91 +120,146 @@
         <!-- 鎸夐挳 -->
         <div v-else-if="item.dataType == 'action'">
           <template v-for="(o, key) in item.operation" :key="key">
-            <el-button v-show="o.type != 'upload'" size="small" v-if="o.showHide ? o.showHide(scope.row) : true"
-              :disabled="o.disabled ? o.disabled(scope.row) : false" :plain="o.plain" type="primary"
-              :style="{ color: (o.name === '鍒犻櫎' || o.name === 'delete') ? '#f56c6c' : o.color }" link
-              @click="o.clickFun(scope.row)" :key="key">
+            <el-button
+              v-show="o.type != 'upload'"
+              size="small"
+              v-if="o.showHide ? o.showHide(scope.row) : true"
+              :disabled="o.disabled ? o.disabled(scope.row) : false"
+              :plain="o.plain"
+              type="primary"
+              :style="{
+                color:
+                  o.name === '鍒犻櫎' || o.name === 'delete'
+                    ? '#f56c6c'
+                    : o.color,
+              }"
+              link
+              @click="o.clickFun(scope.row)"
+              :key="key"
+            >
               {{ o.name }}
             </el-button>
-            <el-upload :action="javaApi + o.url + '?id=' + (o.uploadIdFun ? o.uploadIdFun(scope.row) : scope.row.id)"
-              ref="uploadRef" size="small" :multiple="o.multiple ? o.multiple : false" :limit="1"
+            <el-upload
+              :action="
+                javaApi +
+                o.url +
+                '?id=' +
+                (o.uploadIdFun ? o.uploadIdFun(scope.row) : scope.row.id)
+              "
+              ref="uploadRef"
+              size="small"
+              :multiple="o.multiple ? o.multiple : false"
+              :limit="1"
               :disabled="o.disabled ? o.disabled(scope.row) : false"
-              :accept="o.accept ? o.accept : '.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'"
-              v-if="o.type == 'upload'" style="display: inline-block; width: 50px"
-              v-show="o.showHide ? o.showHide(scope.row) : true" :headers="uploadHeader"
+              :accept="
+                o.accept
+                  ? o.accept
+                  : '.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'
+              "
+              v-if="o.type == 'upload'"
+              style="display: inline-block; width: 50px"
+              v-show="o.showHide ? o.showHide(scope.row) : true"
+              :headers="uploadHeader"
               :before-upload="(file) => beforeUpload(file, scope.$index)"
-              :on-change="(file, fileList) => handleChange(file, fileList, scope.$index)"
-              :on-error="(error, file, fileList) => onError(error, file, fileList, scope.$index)"
-              :on-success="(response, file, fileList) => handleSuccessUp(response, file, fileList, scope.$index)"
-              :on-exceed="onExceed" :show-file-list="false">
-              <el-button :size="o.size ? o.size : 'small'" link type="primary"
-                :disabled="o.disabled ? o.disabled(scope.row) : false">{{ o.name }}</el-button>
+              :on-change="
+                (file, fileList) => handleChange(file, fileList, scope.$index)
+              "
+              :on-error="
+                (error, file, fileList) =>
+                  onError(error, file, fileList, scope.$index)
+              "
+              :on-success="
+                (response, file, fileList) =>
+                  handleSuccessUp(response, file, fileList, scope.$index)
+              "
+              :on-exceed="onExceed"
+              :show-file-list="false"
+            >
+              <el-button
+                :size="o.size ? o.size : 'small'"
+                link
+                type="primary"
+                :disabled="o.disabled ? o.disabled(scope.row) : false"
+                >{{ o.name }}</el-button
+              >
             </el-upload>
           </template>
         </div>
         <!-- 鍙偣鍑荤殑鏂囧瓧 -->
-        <div v-else-if="item.dataType == 'link'" class="cell link" style="width: 100%"
-          @click="goLink(scope.row, item.linkMethod)">
+        <div
+          v-else-if="item.dataType == 'link'"
+          class="cell link"
+          style="width: 100%"
+          @click="goLink(scope.row, item.linkMethod)"
+        >
           <span v-if="!item.formatData">{{ scope.row[item.prop] }}</span>
         </div>
         <!-- 榛樿绾睍绀烘暟鎹� -->
         <div v-else class="cell" style="width: 100%">
           <span v-if="!item.formatData">{{ scope.row[item.prop] }}</span>
-          <span v-else>{{ formatters(scope.row[item.prop], item.formatData) }}</span>
+          <span v-else>{{
+            formatters(scope.row[item.prop], item.formatData)
+          }}</span>
         </div>
       </template>
     </el-table-column>
   </el-table>
-  <pagination v-show="total > 0" :total="total" :layout="page.layout" :page="page.current" :limit="page.size"
-    @pagination="paginationSearch" />
+  <pagination
+    v-show="total > 0"
+    :total="total"
+    :layout="page.layout"
+    :page="page.current"
+    :limit="page.size"
+    @pagination="paginationSearch"
+  />
 </template>
 
 <script setup>
-import pagination from './Pagination.vue'
-import { ref, inject, getCurrentInstance } from "vue"
-import { ElMessage } from "element-plus"
+import pagination from "./Pagination.vue";
+import { ref, inject, getCurrentInstance } from "vue";
+import { ElMessage } from "element-plus";
 
 // 鑾峰彇鍏ㄥ眬鐨� uploadHeader
-const { proxy } = getCurrentInstance()
-const uploadHeader = proxy.uploadHeader
-const javaApi = proxy.javaApi
+const { proxy } = getCurrentInstance();
+const uploadHeader = proxy.uploadHeader;
+const javaApi = proxy.javaApi;
 
 const emit = defineEmits(["pagination"]);
 
 // Filters
 const typeFn = (val, row) => {
-  return typeof val === 'function' ? val(row) : val
-}
+  return typeof val === "function" ? val(row) : val;
+};
 
 const formatters = (val, format) => {
-  return typeof format === 'function' ? format(val) : val
-}
+  return typeof format === "function" ? format(val) : val;
+};
 
 // Props锛堜娇鐢� defineProps 鐨勯潪 TS 褰㈠紡锛�
 const props = defineProps({
   tableLoading: {
     type: Boolean,
-    default: false
+    default: false,
   },
   handleSelectionChange: {
     type: Function,
-    default: () => { }
+    default: () => {},
   },
   summaryMethod: {
     type: Function,
-    default: () => { }
+    default: () => {},
   },
   rowClick: {
     type: Function,
-    default: () => { }
+    default: () => {},
   },
   currentChange: {
     type: Function,
-    default: () => { }
+    default: () => {},
   },
   border: {
     type: Boolean,
-    default: true
+    default: true,
   },
   isSelection: {
     type: Boolean,
@@ -150,31 +271,31 @@
   },
   highlightCurrentRow: {
     type: Boolean,
-    default: false
+    default: false,
   },
   headerCellStyle: {
     type: Object,
-    default: () => ({})
+    default: () => ({}),
   },
   column: {
     type: Array,
-    default: () => []
+    default: () => [],
   },
   rowClassName: {
     type: Function,
-    default: () => ''
+    default: () => "",
   },
   rowStyle: {
     type: [Object, Function],
-    default: () => ({})
+    default: () => ({}),
   },
   tableData: {
     type: Array,
-    default: () => []
+    default: () => [],
   },
   rowKey: {
     type: String,
-    default: undefined
+    default: undefined,
   },
   page: {
     type: Object,
@@ -182,108 +303,108 @@
       total: 0,
       current: 0,
       size: 10,
-      layout: 'total, sizes, prev, pager, next, jumper'
-    })
+      layout: "total, sizes, prev, pager, next, jumper",
+    }),
   },
   total: {
     type: Number,
-    default: 0
-  }
-})
+    default: 0,
+  },
+});
 
 // Data
-const uploadRefs = ref([])
-const currentFiles = ref({})
-const uploadKeys = ref({})
+const uploadRefs = ref([]);
+const currentFiles = ref({});
+const uploadKeys = ref({});
 
 const indexMethod = (index) => {
-  return (props.page.current - 1) * props.page.size + index + 1
-}
+  return (props.page.current - 1) * props.page.size + index + 1;
+};
 
 // 鐐瑰嚮 link 浜嬩欢
 const goLink = (row, linkMethod) => {
   if (!linkMethod) {
-    return ElMessage.warning("璇烽厤缃� link 浜嬩欢")
+    return ElMessage.warning("璇烽厤缃� link 浜嬩欢");
   }
-  const parentMethod = getParentMethod(linkMethod)
-  if (typeof parentMethod === 'function') {
-    parentMethod(row)
+  const parentMethod = getParentMethod(linkMethod);
+  if (typeof parentMethod === "function") {
+    parentMethod(row);
   } else {
-    console.warn(`鐖剁粍浠朵腑鏈壘鍒版柟娉�: ${linkMethod}`)
+    console.warn(`鐖剁粍浠朵腑鏈壘鍒版柟娉�: ${linkMethod}`);
   }
-}
+};
 
 // 鑾峰彇鐖剁粍浠舵柟娉曪紙绀轰緥瀹炵幇锛�
 const getParentMethod = (methodName) => {
-  const parentMethods = inject('parentMethods', {})
-  return parentMethods[methodName]
-}
+  const parentMethods = inject("parentMethods", {});
+  return parentMethods[methodName];
+};
 
 const dataTypeFn = (val, format) => {
   if (typeof format === "function") {
-    return format(val)
-  } else return val
-}
+    return format(val);
+  } else return val;
+};
 
 const formatType = (val, format) => {
   if (typeof format === "function") {
-    return format(val)
-  } else return ""
-}
+    return format(val);
+  } else return "";
+};
 
 // 鏂囦欢鍙樺寲澶勭悊
 const handleChange = (file, fileList, index) => {
   if (fileList.length > 1) {
-    const earliestFile = fileList[0]
-    uploadRefs.value[index]?.handleRemove(earliestFile)
+    const earliestFile = fileList[0];
+    uploadRefs.value[index]?.handleRemove(earliestFile);
   }
-  currentFiles.value[index] = file
-}
+  currentFiles.value[index] = file;
+};
 
 // 鏂囦欢涓婁紶鍓嶆牎楠�
 const beforeUpload = (rawFile, index) => {
-  currentFiles.value[index] = {}
+  currentFiles.value[index] = {};
   if (rawfile.size > 1024 * 1024 * 10 * 10) {
-    ElMessage.error('涓婁紶鏂囦欢涓嶈秴杩�10M')
-    return false
+    ElMessage.error("涓婁紶鏂囦欢涓嶈秴杩�10M");
+    return false;
   }
-  return true
-}
+  return true;
+};
 
 // 涓婁紶鎴愬姛
 const handleSuccessUp = (response, file, fileList, index) => {
   if (response.code == 200) {
     if (uploadRefs[index]) {
-      uploadRefs[index].clearFiles()
+      uploadRefs[index].clearFiles();
     }
-    currentFiles[index] = file
-    ElMessage.success("涓婁紶鎴愬姛")
-    resetUploadComponent(index)
+    currentFiles[index] = file;
+    ElMessage.success("涓婁紶鎴愬姛");
+    resetUploadComponent(index);
   } else {
-    ElMessage.error(response.message)
+    ElMessage.error(response.message);
   }
-}
+};
 
 const resetUploadComponent = (index) => {
-  uploadKeys[index] = Date.now()
-}
+  uploadKeys[index] = Date.now();
+};
 
 // 涓婁紶澶辫触
 const onError = (error, file, fileList, index) => {
-  ElMessage.error('鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯')
+  ElMessage.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
   if (uploadRefs.value[index]) {
-    uploadRefs.value[index].clearFiles()
+    uploadRefs.value[index].clearFiles();
   }
-}
+};
 
 // 鏂囦欢鏁伴噺瓒呴檺鎻愮ず
 const onExceed = () => {
-  ElMessage.warning('瓒呭嚭鏂囦欢涓暟')
-}
+  ElMessage.warning("瓒呭嚭鏂囦欢涓暟");
+};
 
 const paginationSearch = ({ page, limit }) => {
   emit("pagination", { page: page, limit: limit });
-}
+};
 </script>
 
 <style scoped lang="scss">
@@ -294,4 +415,4 @@
   padding-right: 0 !important;
   padding-left: 0 !important;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/components/Upload/FileUpload.vue b/src/components/Upload/FileUpload.vue
new file mode 100644
index 0000000..53de217
--- /dev/null
+++ b/src/components/Upload/FileUpload.vue
@@ -0,0 +1,80 @@
+<script setup>
+import { ref } from "vue";
+
+defineOptions({
+  name: "鏂囦欢涓婁紶缁勪欢",
+});
+
+const props = defineProps({
+  downloadTemplate: Function,
+  showTips: Boolean,
+  accept: {
+    type: String,
+    default: ".xls, .xlsx",
+  },
+  headers: Object,
+  action: String,
+  disabled: {
+    type: Boolean,
+    default: false,
+  },
+});
+const emits = defineEmits(["success", "error"]);
+
+const uploadRef = ref();
+const fileList = ref([]);
+
+const uploadApi = () => {
+  uploadRef.value.submit();
+};
+
+const handleFileSuccess = (response, file, fileList) => {
+  upload.open = false;
+  upload.isUploading = false;
+  uploadRef.value.handleRemove(file);
+  emits("success", response, file, fileList);
+};
+
+defineExpose({
+  fileList,
+  uploadApi,
+});
+</script>
+
+<template>
+  <el-upload
+    ref="uploadRef"
+    v-model:file-list="fileList"
+    drag
+    multiple
+    :action="action"
+    :accept="accept"
+    :headers="headers"
+    :disabled="disabled"
+    :auto-upload="false"
+    :limit="1"
+    :drag="true"
+    :on-success="handleFileSuccess"
+  >
+    <div class="el-upload__text">
+      <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+      <div class="el-upload__text">
+        灏嗘枃浠舵嫋鍒版澶勶紝鎴�
+        <em>鐐瑰嚮瀵煎叆鏁版嵁</em>
+      </div>
+    </div>
+    <template #tip>
+      <div class="el-upload__tip text-center">
+        鍙兘涓婁紶xlsx/xls鏂囦欢锛屼笖涓嶈秴杩�10M
+        <el-button
+          type="primary"
+          link
+          class="reset-margin"
+          @click="props.downloadTemplate()"
+        >
+          <span style="font-size: 12px; font-weight: normal">涓嬭浇妯℃澘</span>
+        </el-button>
+      </div>
+    </template>
+  </el-upload>
+</template>
diff --git a/src/components/Upload/index.js b/src/components/Upload/index.js
new file mode 100644
index 0000000..0ea60da
--- /dev/null
+++ b/src/components/Upload/index.js
@@ -0,0 +1 @@
+export { default as FileUpload } from "./FileUpload.vue";
diff --git a/src/hooks/useFormData.js b/src/hooks/useFormData.js
new file mode 100644
index 0000000..d22204b
--- /dev/null
+++ b/src/hooks/useFormData.js
@@ -0,0 +1,15 @@
+import { reactive } from "vue";
+import { deepClone } from "@/utils/index.js"
+
+export default function useFormData(initData) {
+  const form = reactive(deepClone(initData, true));
+
+  function resetForm() {
+    const initData2 = JSON.parse(JSON.stringify(initData));
+    Object.keys(initData).forEach(key => {
+      form[key] = initData2[key];
+    });
+  }
+
+  return { form, resetForm };
+}
diff --git a/src/hooks/usePaginationApi.jsx b/src/hooks/usePaginationApi.jsx
new file mode 100644
index 0000000..e28c816
--- /dev/null
+++ b/src/hooks/usePaginationApi.jsx
@@ -0,0 +1,144 @@
+import { ref, reactive, watchEffect, unref } from "vue";
+import useFormData from "@/hooks/useFormData";
+import { deepClone, isEqual } from "@/utils/index.js"
+
+/**
+ * 鍒嗛〉api
+ * @param api 鎺ュ彛
+ * @param initalFilters 鍒濆鍖栫瓫閫夋潯浠�
+ * @param sorters
+ * @param filterTransformer
+ */
+export function usePaginationApi(
+  api,
+  initalFilters,
+  columns,
+  sorters,
+  filterTransformer,
+  cb
+) {
+  const dataList = ref([]);
+  const { form: filters, resetForm } = useFormData(initalFilters);
+  let lastFilters = deepClone(initalFilters);
+  const sorter = reactive(sorters || {});
+  const others = ref({});
+  const loading = ref(true);
+  const paginationAlign = ref("right");
+
+  /** 鍒嗛〉閰嶇疆 */
+  const pagination = reactive({
+    pageSize: 10,
+    currentPage: 1,
+    pageSizes: [10, 15, 20],
+    total: 0,
+    align: "right",
+    background: true
+  });
+
+  /** 鍔犺浇鍔ㄧ敾閰嶇疆 */
+  const loadingConfig = reactive({
+    text: "姝e湪鍔犺浇绗竴椤�...",
+    viewBox: "-10, -10, 50, 50",
+    spinner: `
+        <path class="path" d="
+          M 30 15
+          L 28 17
+          M 25.61 25.61
+          A 15 15, 0, 0, 1, 15 30
+          A 15 15, 0, 1, 1, 27.99 7.5
+          L 15 15
+        " style="stroke-width: 4px; fill: rgba(0, 0, 0, 0)"/>
+      `
+    // svg: "",
+    // background: rgba()
+  });
+
+  function getFinalParams() {
+    const finalFilters = {};
+    const beforeParams = unref(filters);
+    if (filterTransformer) {
+      Object.keys(beforeParams).forEach(key => {
+        if (filterTransformer[key]) {
+          Object.assign(
+            finalFilters,
+            filterTransformer[key](beforeParams[key], beforeParams)
+          );
+        } else {
+          finalFilters[key] = beforeParams[key];
+        }
+      });
+    }
+
+    return filterTransformer
+      ? { ...finalFilters, ...sorter }
+      : { ...beforeParams, ...sorter };
+  }
+
+  async function getTableData() {
+    // 濡傛灉杩欐鍜屼笂娆$殑filter涓嶅悓锛岄偅涔堝氨閲嶇疆椤电爜
+    if (!isEqual(unref(filters), lastFilters)) {
+      pagination.currentPage = 1;
+      lastFilters = deepClone(unref(filters));
+    }
+    loading.value = true;
+    api({
+      ...getFinalParams(),
+      current: pagination.currentPage,
+      size: pagination.pageSize
+    }).then(({ code, data, ...rest }) => {
+      if (code == 200) {
+        // pagination.currentPage = meta.current_page;
+        // pagination.pageSize = meta.per_page;
+        pagination.total = data.total;
+        others.value = rest;
+        dataList.value = data.records;
+        cb && cb(data);
+        loading.value = false;
+      } else {
+        loading.value = false;
+        ElMessage({ message: data.msg, type: "error" });
+      }
+    });
+  }
+
+  function onSizeChange(val) {
+    pagination.pageSize = val;
+    pagination.currentPage = 1;
+    getTableData();
+  }
+
+  function onCurrentChange(val) {
+    loadingConfig.text = `姝e湪鍔犺浇绗�${val}椤�...`;
+    loading.value = true;
+    getTableData();
+  }
+  function resetFilters() {
+    resetForm();
+    pagination.currentPage = 1;
+    getTableData();
+  }
+
+  watchEffect(() => {
+    pagination.align = paginationAlign.value
+  });
+
+  // onMounted(() => {
+  //   getTableData();
+  // });
+
+  return {
+    loading,
+    columns,
+    dataList,
+    pagination,
+    loadingConfig,
+    paginationAlign,
+    filters,
+    sorter,
+    others,
+    onSizeChange,
+    onCurrentChange,
+    getTableData,
+    resetFilters
+  };
+}
diff --git a/src/utils/index.js b/src/utils/index.js
index da79665..e522c3c 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -1,18 +1,25 @@
-import { parseTime } from './ruoyi'
+import { parseTime } from "./ruoyi";
 
 /**
  * 琛ㄦ牸鏃堕棿鏍煎紡鍖�
  */
 export function formatDate(cellValue) {
-  if (cellValue == null || cellValue == "") return ""
-  var date = new Date(cellValue) 
-  var year = date.getFullYear()
-  var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
-  var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() 
-  var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() 
-  var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() 
-  var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
-  return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
+  if (cellValue == null || cellValue == "") return "";
+  var date = new Date(cellValue);
+  var year = date.getFullYear();
+  var month =
+    date.getMonth() + 1 < 10
+      ? "0" + (date.getMonth() + 1)
+      : date.getMonth() + 1;
+  var day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
+  var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
+  var minutes =
+    date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
+  var seconds =
+    date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
+  return (
+    year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds
+  );
 }
 
 /**
@@ -21,40 +28,40 @@
  * @returns {string}
  */
 export function formatTime(time, option) {
-  if (('' + time).length === 10) {
-    time = parseInt(time) * 1000
+  if (("" + time).length === 10) {
+    time = parseInt(time) * 1000;
   } else {
-    time = +time
+    time = +time;
   }
-  const d = new Date(time)
-  const now = Date.now()
+  const d = new Date(time);
+  const now = Date.now();
 
-  const diff = (now - d) / 1000
+  const diff = (now - d) / 1000;
 
   if (diff < 30) {
-    return '鍒氬垰'
+    return "鍒氬垰";
   } else if (diff < 3600) {
     // less 1 hour
-    return Math.ceil(diff / 60) + '鍒嗛挓鍓�'
+    return Math.ceil(diff / 60) + "鍒嗛挓鍓�";
   } else if (diff < 3600 * 24) {
-    return Math.ceil(diff / 3600) + '灏忔椂鍓�'
+    return Math.ceil(diff / 3600) + "灏忔椂鍓�";
   } else if (diff < 3600 * 24 * 2) {
-    return '1澶╁墠'
+    return "1澶╁墠";
   }
   if (option) {
-    return parseTime(time, option)
+    return parseTime(time, option);
   } else {
     return (
       d.getMonth() +
       1 +
-      '鏈�' +
+      "鏈�" +
       d.getDate() +
-      '鏃�' +
+      "鏃�" +
       d.getHours() +
-      '鏃�' +
+      "鏃�" +
       d.getMinutes() +
-      '鍒�'
-    )
+      "鍒�"
+    );
   }
 }
 
@@ -63,18 +70,18 @@
  * @returns {Object}
  */
 export function getQueryObject(url) {
-  url = url == null ? window.location.href : url
-  const search = url.substring(url.lastIndexOf('?') + 1)
-  const obj = {}
-  const reg = /([^?&=]+)=([^?&=]*)/g
+  url = url == null ? window.location.href : url;
+  const search = url.substring(url.lastIndexOf("?") + 1);
+  const obj = {};
+  const reg = /([^?&=]+)=([^?&=]*)/g;
   search.replace(reg, (rs, $1, $2) => {
-    const name = decodeURIComponent($1)
-    let val = decodeURIComponent($2)
-    val = String(val)
-    obj[name] = val
-    return rs
-  })
-  return obj
+    const name = decodeURIComponent($1);
+    let val = decodeURIComponent($2);
+    val = String(val);
+    obj[name] = val;
+    return rs;
+  });
+  return obj;
 }
 
 /**
@@ -83,14 +90,14 @@
  */
 export function byteLength(str) {
   // returns the byte length of an utf8 string
-  let s = str.length
+  let s = str.length;
   for (var i = str.length - 1; i >= 0; i--) {
-    const code = str.charCodeAt(i)
-    if (code > 0x7f && code <= 0x7ff) s++
-    else if (code > 0x7ff && code <= 0xffff) s += 2
-    if (code >= 0xDC00 && code <= 0xDFFF) i--
+    const code = str.charCodeAt(i);
+    if (code > 0x7f && code <= 0x7ff) s++;
+    else if (code > 0x7ff && code <= 0xffff) s += 2;
+    if (code >= 0xdc00 && code <= 0xdfff) i--;
   }
-  return s
+  return s;
 }
 
 /**
@@ -98,13 +105,13 @@
  * @returns {Array}
  */
 export function cleanArray(actual) {
-  const newArray = []
+  const newArray = [];
   for (let i = 0; i < actual.length; i++) {
     if (actual[i]) {
-      newArray.push(actual[i])
+      newArray.push(actual[i]);
     }
   }
-  return newArray
+  return newArray;
 }
 
 /**
@@ -112,13 +119,13 @@
  * @returns {Array}
  */
 export function param(json) {
-  if (!json) return ''
+  if (!json) return "";
   return cleanArray(
-    Object.keys(json).map(key => {
-      if (json[key] === undefined) return ''
-      return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+    Object.keys(json).map((key) => {
+      if (json[key] === undefined) return "";
+      return encodeURIComponent(key) + "=" + encodeURIComponent(json[key]);
     })
-  ).join('&')
+  ).join("&");
 }
 
 /**
@@ -126,21 +133,21 @@
  * @returns {Object}
  */
 export function param2Obj(url) {
-  const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+  const search = decodeURIComponent(url.split("?")[1]).replace(/\+/g, " ");
   if (!search) {
-    return {}
+    return {};
   }
-  const obj = {}
-  const searchArr = search.split('&')
-  searchArr.forEach(v => {
-    const index = v.indexOf('=')
+  const obj = {};
+  const searchArr = search.split("&");
+  searchArr.forEach((v) => {
+    const index = v.indexOf("=");
     if (index !== -1) {
-      const name = v.substring(0, index)
-      const val = v.substring(index + 1, v.length)
-      obj[name] = val
+      const name = v.substring(0, index);
+      const val = v.substring(index + 1, v.length);
+      obj[name] = val;
     }
-  })
-  return obj
+  });
+  return obj;
 }
 
 /**
@@ -148,9 +155,9 @@
  * @returns {string}
  */
 export function html2Text(val) {
-  const div = document.createElement('div')
-  div.innerHTML = val
-  return div.textContent || div.innerText
+  const div = document.createElement("div");
+  div.innerHTML = val;
+  return div.textContent || div.innerText;
 }
 
 /**
@@ -160,21 +167,21 @@
  * @returns {Object}
  */
 export function objectMerge(target, source) {
-  if (typeof target !== 'object') {
-    target = {}
+  if (typeof target !== "object") {
+    target = {};
   }
   if (Array.isArray(source)) {
-    return source.slice()
+    return source.slice();
   }
-  Object.keys(source).forEach(property => {
-    const sourceProperty = source[property]
-    if (typeof sourceProperty === 'object') {
-      target[property] = objectMerge(target[property], sourceProperty)
+  Object.keys(source).forEach((property) => {
+    const sourceProperty = source[property];
+    if (typeof sourceProperty === "object") {
+      target[property] = objectMerge(target[property], sourceProperty);
     } else {
-      target[property] = sourceProperty
+      target[property] = sourceProperty;
     }
-  })
-  return target
+  });
+  return target;
 }
 
 /**
@@ -183,18 +190,18 @@
  */
 export function toggleClass(element, className) {
   if (!element || !className) {
-    return
+    return;
   }
-  let classString = element.className
-  const nameIndex = classString.indexOf(className)
+  let classString = element.className;
+  const nameIndex = classString.indexOf(className);
   if (nameIndex === -1) {
-    classString += '' + className
+    classString += "" + className;
   } else {
     classString =
       classString.substr(0, nameIndex) +
-      classString.substr(nameIndex + className.length)
+      classString.substr(nameIndex + className.length);
   }
-  element.className = classString
+  element.className = classString;
 }
 
 /**
@@ -202,10 +209,10 @@
  * @returns {Date}
  */
 export function getTime(type) {
-  if (type === 'start') {
-    return new Date().getTime() - 3600 * 1000 * 24 * 90
+  if (type === "start") {
+    return new Date().getTime() - 3600 * 1000 * 24 * 90;
   } else {
-    return new Date(new Date().toDateString())
+    return new Date(new Date().toDateString());
   }
 }
 
@@ -216,38 +223,38 @@
  * @return {*}
  */
 export function debounce(func, wait, immediate) {
-  let timeout, args, context, timestamp, result
+  let timeout, args, context, timestamp, result;
 
-  const later = function() {
+  const later = function () {
     // 鎹笂涓�娆¤Е鍙戞椂闂撮棿闅�
-    const last = +new Date() - timestamp
+    const last = +new Date() - timestamp;
 
     // 涓婃琚寘瑁呭嚱鏁拌璋冪敤鏃堕棿闂撮殧 last 灏忎簬璁惧畾鏃堕棿闂撮殧 wait
     if (last < wait && last > 0) {
-      timeout = setTimeout(later, wait - last)
+      timeout = setTimeout(later, wait - last);
     } else {
-      timeout = null
+      timeout = null;
       // 濡傛灉璁惧畾涓篿mmediate===true锛屽洜涓哄紑濮嬭竟鐣屽凡缁忚皟鐢ㄨ繃浜嗘澶勬棤闇�璋冪敤
       if (!immediate) {
-        result = func.apply(context, args)
-        if (!timeout) context = args = null
+        result = func.apply(context, args);
+        if (!timeout) context = args = null;
       }
     }
-  }
+  };
 
-  return function(...args) {
-    context = this
-    timestamp = +new Date()
-    const callNow = immediate && !timeout
+  return function (...args) {
+    context = this;
+    timestamp = +new Date();
+    const callNow = immediate && !timeout;
     // 濡傛灉寤舵椂涓嶅瓨鍦紝閲嶆柊璁惧畾寤舵椂
-    if (!timeout) timeout = setTimeout(later, wait)
+    if (!timeout) timeout = setTimeout(later, wait);
     if (callNow) {
-      result = func.apply(context, args)
-      context = args = null
+      result = func.apply(context, args);
+      context = args = null;
     }
 
-    return result
-  }
+    return result;
+  };
 }
 
 /**
@@ -258,18 +265,18 @@
  * @returns {Object}
  */
 export function deepClone(source) {
-  if (!source && typeof source !== 'object') {
-    throw new Error('error arguments', 'deepClone')
+  if (!source && typeof source !== "object") {
+    throw new Error("error arguments", "deepClone");
   }
-  const targetObj = source.constructor === Array ? [] : {}
-  Object.keys(source).forEach(keys => {
-    if (source[keys] && typeof source[keys] === 'object') {
-      targetObj[keys] = deepClone(source[keys])
+  const targetObj = source.constructor === Array ? [] : {};
+  Object.keys(source).forEach((keys) => {
+    if (source[keys] && typeof source[keys] === "object") {
+      targetObj[keys] = deepClone(source[keys]);
     } else {
-      targetObj[keys] = source[keys]
+      targetObj[keys] = source[keys];
     }
-  })
-  return targetObj
+  });
+  return targetObj;
 }
 
 /**
@@ -277,16 +284,16 @@
  * @returns {Array}
  */
 export function uniqueArr(arr) {
-  return Array.from(new Set(arr))
+  return Array.from(new Set(arr));
 }
 
 /**
  * @returns {string}
  */
 export function createUniqueString() {
-  const timestamp = +new Date() + ''
-  const randomNum = parseInt((1 + Math.random()) * 65536) + ''
-  return (+(randomNum + timestamp)).toString(32)
+  const timestamp = +new Date() + "";
+  const randomNum = parseInt((1 + Math.random()) * 65536) + "";
+  return (+(randomNum + timestamp)).toString(32);
 }
 
 /**
@@ -296,7 +303,7 @@
  * @returns {boolean}
  */
 export function hasClass(ele, cls) {
-  return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+  return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)"));
 }
 
 /**
@@ -305,7 +312,7 @@
  * @param {string} cls
  */
 export function addClass(ele, cls) {
-  if (!hasClass(ele, cls)) ele.className += ' ' + cls
+  if (!hasClass(ele, cls)) ele.className += " " + cls;
 }
 
 /**
@@ -315,76 +322,77 @@
  */
 export function removeClass(ele, cls) {
   if (hasClass(ele, cls)) {
-    const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
-    ele.className = ele.className.replace(reg, ' ')
+    const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");
+    ele.className = ele.className.replace(reg, " ");
   }
 }
 
 export function makeMap(str, expectsLowerCase) {
-  const map = Object.create(null)
-  const list = str.split(',')
+  const map = Object.create(null);
+  const list = str.split(",");
   for (let i = 0; i < list.length; i++) {
-    map[list[i]] = true
+    map[list[i]] = true;
   }
-  return expectsLowerCase
-    ? val => map[val.toLowerCase()]
-    : val => map[val]
+  return expectsLowerCase ? (val) => map[val.toLowerCase()] : (val) => map[val];
 }
- 
-export const exportDefault = 'export default '
+
+export const exportDefault = "export default ";
 
 export const beautifierConf = {
   html: {
-    indent_size: '2',
-    indent_char: ' ',
-    max_preserve_newlines: '-1',
+    indent_size: "2",
+    indent_char: " ",
+    max_preserve_newlines: "-1",
     preserve_newlines: false,
     keep_array_indentation: false,
     break_chained_methods: false,
-    indent_scripts: 'separate',
-    brace_style: 'end-expand',
+    indent_scripts: "separate",
+    brace_style: "end-expand",
     space_before_conditional: true,
     unescape_strings: false,
     jslint_happy: false,
     end_with_newline: true,
-    wrap_line_length: '110',
+    wrap_line_length: "110",
     indent_inner_html: true,
     comma_first: false,
     e4x: true,
-    indent_empty_lines: true
+    indent_empty_lines: true,
   },
   js: {
-    indent_size: '2',
-    indent_char: ' ',
-    max_preserve_newlines: '-1',
+    indent_size: "2",
+    indent_char: " ",
+    max_preserve_newlines: "-1",
     preserve_newlines: false,
     keep_array_indentation: false,
     break_chained_methods: false,
-    indent_scripts: 'normal',
-    brace_style: 'end-expand',
+    indent_scripts: "normal",
+    brace_style: "end-expand",
     space_before_conditional: true,
     unescape_strings: false,
     jslint_happy: true,
     end_with_newline: true,
-    wrap_line_length: '110',
+    wrap_line_length: "110",
     indent_inner_html: true,
     comma_first: false,
     e4x: true,
-    indent_empty_lines: true
-  }
-}
+    indent_empty_lines: true,
+  },
+};
 
 // 棣栧瓧姣嶅ぇ灏�
 export function titleCase(str) {
-  return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
+  return str.replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
 }
 
 // 涓嬪垝杞┘宄�
 export function camelCase(str) {
-  return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
+  return str.replace(/_[a-z]/g, (str1) => str1.substr(-1).toUpperCase());
 }
 
 export function isNumberStr(str) {
-  return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
+  return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str);
 }
- 
+
+export function isEqual(obj1, obj2) {
+  return JSON.stringify(obj1) === JSON.stringify(obj2);
+}
diff --git a/src/views/basicData/product/ImportExcel/index.vue b/src/views/basicData/product/ImportExcel/index.vue
new file mode 100644
index 0000000..f1d6213
--- /dev/null
+++ b/src/views/basicData/product/ImportExcel/index.vue
@@ -0,0 +1,67 @@
+<template>
+  <el-button type="info" plain icon="Upload" @click="handleImport">
+    瀵煎叆
+  </el-button>
+  <el-dialog v-model="upload.open" :title="upload.title">
+    <FileUpload
+      ref="fileUploadRef"
+      accept=".xlsx, .xls"
+      :headers="upload.headers"
+      :action="upload.url + '?updateSupport=' + upload.updateSupport"
+      :disabled="upload.isUploading"
+      @success="handleFileSuccess"
+    />
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+        <el-button @click="upload.open = false">鍙� 娑�</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { reactive } from "vue";
+import { getToken } from "@/utils/auth.js";
+import { FileUpload } from "@/components/Upload";
+import { ElMessage } from "element-plus";
+
+defineOptions({
+  name: "浜у搧缁存姢瀵煎叆",
+});
+
+const emits = defineEmits(["uploadSuccess"]);
+const fileUploadRef = ref();
+const upload = reactive({
+  // 鏄惁鏄剧ず寮瑰嚭灞傦紙渚涘簲鍟嗗鍏ワ級
+  open: false,
+  // 寮瑰嚭灞傛爣棰橈紙渚涘簲鍟嗗鍏ワ級
+  title: "",
+  // 鏄惁绂佺敤涓婁紶
+  isUploading: false,
+  // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+  headers: { Authorization: "Bearer " + getToken() },
+  // 涓婁紶鐨勫湴鍧�
+  url: import.meta.env.VITE_APP_BASE_API + "/system/supplier/import",
+});
+// 鐐瑰嚮瀵煎叆
+const handleImport = () => {
+  upload.open = true;
+  upload.title = "浜у搧瀵煎叆";
+};
+
+const submitFileForm = () => {
+  fileUploadRef.value.uploadApi();
+};
+
+const handleFileSuccess = (response) => {
+  const { code, msg } = response;
+  if (code == 200) {
+    ElMessage({ message: "瀵煎叆鎴愬姛", type: "success" });
+    upload.open = false;
+    emits("uploadSuccess");
+  } else {
+    ElMessage({ message: msg, type: "error" });
+  }
+};
+</script>
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index 0da3e12..506c1db 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -3,38 +3,61 @@
     <div class="left">
       <div>
         <el-input
-            v-model="search"
-            style="width: 210px"
-            placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
-            @change="searchFilter"
-            @clear="searchFilter"
-            clearable
-            prefix-icon="Search"
+          v-model="search"
+          style="width: 210px"
+          placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
+          @change="searchFilter"
+          @clear="searchFilter"
+          clearable
+          prefix-icon="Search"
         />
-        <el-button type="primary" @click="openProDia('addOne')" style="margin-left: 10px">鏂板浜у搧澶х被</el-button>
+        <el-button
+          type="primary"
+          @click="openProDia('addOne')"
+          style="margin-left: 10px"
+          >鏂板浜у搧澶х被</el-button
+        >
       </div>
       <div ref="containerRef">
-        <el-tree ref="tree" v-loading="treeLoad" :data="list" @node-click="handleNodeClick"
-                 :expand-on-click-node="false" default-expand-all
-                 :default-expanded-keys="expandedKeys" :draggable="true" :filter-node-method="filterNode"
-                 :props="{ children: 'children', label: 'label' }" highlight-current node-key="id"
-                 style="height: calc(100vh - 190px);overflow-y: scroll;scrollbar-width: none;">
+        <el-tree
+          ref="tree"
+          v-loading="treeLoad"
+          :data="list"
+          @node-click="handleNodeClick"
+          :expand-on-click-node="false"
+          default-expand-all
+          :default-expanded-keys="expandedKeys"
+          :draggable="true"
+          :filter-node-method="filterNode"
+          :props="{ children: 'children', label: 'label' }"
+          highlight-current
+          node-key="id"
+          style="
+            height: calc(100vh - 190px);
+            overflow-y: scroll;
+            scrollbar-width: none;
+          "
+        >
           <template #default="{ node, data }">
             <div class="custom-tree-node">
               <span>{{ node.label }}</span>
               <div>
-                <el-button type="primary" link @click="openProDia('edit', data)">
+                <el-button
+                  type="primary"
+                  link
+                  @click="openProDia('edit', data)"
+                >
                   缂栬緫
                 </el-button>
                 <el-button type="primary" link @click="openProDia('add', data)">
                   娣诲姞浜у搧
                 </el-button>
                 <el-button
-                    v-if="!node.childNodes.length"
-                    style="margin-left: 4px"
-                    type="danger"
-                    link
-                    @click="remove(node, data)"
+                  v-if="!node.childNodes.length"
+                  style="margin-left: 4px"
+                  type="danger"
+                  link
+                  @click="remove(node, data)"
                 >
                   鍒犻櫎
                 </el-button>
@@ -46,18 +69,46 @@
     </div>
     <div class="right">
       <div style="margin-bottom: 10px" v-if="isShowButton">
-        <el-button type="primary" @click="openModelDia('add')">鏂板瑙勬牸鍨嬪彿</el-button>
-        <el-button type="danger" @click="handleDelete" style="margin-left: 10px" plain>鍒犻櫎</el-button>
+        <el-button type="primary" @click="openModelDia('add')">
+          鏂板瑙勬牸鍨嬪彿
+        </el-button>
+        <ImportExcel @uploadSuccess="getModelList" />
+        <el-button
+          type="danger"
+          @click="handleDelete"
+          style="margin-left: 10px"
+          plain
+        >
+          鍒犻櫎
+        </el-button>
       </div>
-      <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true" :handleSelectionChange="handleSelectionChange"
-                :tableLoading="tableLoading" @pagination="pagination" :total="total"></PIMTable>
+      <PIMTable
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="true"
+        :handleSelectionChange="handleSelectionChange"
+        :tableLoading="tableLoading"
+        @pagination="pagination"
+        :total="total"
+      ></PIMTable>
     </div>
     <el-dialog v-model="productDia" title="浜у搧" width="400px">
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+      <el-form
+        :model="form"
+        label-width="140px"
+        label-position="top"
+        :rules="rules"
+        ref="formRef"
+      >
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="浜у搧鍚嶇О锛�" prop="productName">
-              <el-input v-model="form.productName" placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�" clearable/>
+              <el-input
+                v-model="form.productName"
+                placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -69,19 +120,38 @@
         </div>
       </template>
     </el-dialog>
-    <el-dialog v-model="modelDia" title="瑙勬牸鍨嬪彿" width="400px" @close="closeModelDia">
-      <el-form :model="modelForm" label-width="140px" label-position="top" :rules="modelRules" ref="modelFormRef">
+    <el-dialog
+      v-model="modelDia"
+      title="瑙勬牸鍨嬪彿"
+      width="400px"
+      @close="closeModelDia"
+    >
+      <el-form
+        :model="modelForm"
+        label-width="140px"
+        label-position="top"
+        :rules="modelRules"
+        ref="modelFormRef"
+      >
         <el-row>
           <el-col :span="24">
             <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
-              <el-input v-model="modelForm.model" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" clearable/>
+              <el-input
+                v-model="modelForm.model"
+                placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="24">
             <el-form-item label="鍗曚綅锛�" prop="unit">
-              <el-input v-model="modelForm.unit" placeholder="璇疯緭鍏ュ崟浣�" clearable/>
+              <el-input
+                v-model="modelForm.unit"
+                placeholder="璇疯緭鍏ュ崟浣�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -97,283 +167,290 @@
 </template>
 
 <script setup>
-import {ref} from "vue";
-import {ElMessageBox} from "element-plus";
+import { ref } from "vue";
+import { ElMessageBox } from "element-plus";
 import {
   addOrEditProduct,
   addOrEditProductModel,
-  delProduct, delProductModel,
+  delProduct,
+  delProductModel,
   modelListPage,
-  productTreeList
+  productTreeList,
 } from "@/api/basicData/product.js";
-const { proxy } = getCurrentInstance()
-const tree = ref(null)
-const containerRef = ref(null)
+import ImportExcel from "./ImportExcel/index.vue";
 
-const productDia = ref(false)
-const modelDia = ref(false)
-const modelOperationType = ref('')
-const search = ref('')
-const currentId = ref('')
-const currentParentId = ref('')
-const operationType = ref('')
-const treeLoad = ref(false)
-const list = ref([])
-const expandedKeys = ref([])
+const { proxy } = getCurrentInstance();
+const tree = ref(null);
+const containerRef = ref(null);
+
+const productDia = ref(false);
+const modelDia = ref(false);
+const modelOperationType = ref("");
+const search = ref("");
+const currentId = ref("");
+const currentParentId = ref("");
+const operationType = ref("");
+const treeLoad = ref(false);
+const list = ref([]);
+const expandedKeys = ref([]);
 const tableColumn = ref([
   {
-    label: '瑙勬牸鍨嬪彿',
-    prop: 'model',
+    label: "瑙勬牸鍨嬪彿",
+    prop: "model",
   },
   {
-    label: '鍗曚綅',
-    prop: 'unit',
+    label: "鍗曚綅",
+    prop: "unit",
   },
   {
     dataType: "action",
     label: "鎿嶄綔",
-    align: 'center',
+    align: "center",
     operation: [
       {
         name: "缂栬緫",
         type: "text",
         clickFun: (row) => {
-          openModelDia('edit', row);
+          openModelDia("edit", row);
         },
       },
     ],
   },
-])
-const tableData = ref([])
-const tableLoading = ref(false)
-const isShowButton = ref(false)
-const total = ref(0)
-const selectedRows = ref([])
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+const isShowButton = ref(false);
+const total = ref(0);
+const selectedRows = ref([]);
 const page = reactive({
   current: 1,
   size: 10,
-})
+});
 const data = reactive({
   form: {
-    productName: '',
+    productName: "",
   },
   rules: {
     productName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
   },
   modelForm: {
-    model: '',
-    unit: '',
+    model: "",
+    unit: "",
   },
   modelRules: {
     model: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-  }
-})
-const { form, rules, modelForm, modelRules } = toRefs(data)
+  },
+});
+const { form, rules, modelForm, modelRules } = toRefs(data);
 // 鏌ヨ浜у搧鏍�
 const getProductTreeList = () => {
   treeLoad.value = true;
-  productTreeList().then(res => {
-    list.value = res
-    list.value.forEach((a) => {
-      expandedKeys.value.push(a.label);
+  productTreeList()
+    .then((res) => {
+      list.value = res;
+      list.value.forEach((a) => {
+        expandedKeys.value.push(a.label);
+      });
+      treeLoad.value = false;
+    })
+    .catch((err) => {
+      treeLoad.value = false;
     });
-    treeLoad.value = false;
-  }).catch(err => {
-    treeLoad.value = false;
-  })
-}
+};
 // 杩囨护浜у搧鏍�
 const searchFilter = () => {
   proxy.$refs.tree.filter(search.value);
-}
+};
 // 鎵撳紑浜у搧寮规
 const openProDia = (type, data) => {
   operationType.value = type;
-  productDia.value = true
-  form.value.productName = ''
-  if (type === 'edit') {
-    form.value.productName = data.productName
+  productDia.value = true;
+  form.value.productName = "";
+  if (type === "edit") {
+    form.value.productName = data.productName;
   }
-}
+};
 // 鎵撳紑瑙勬牸鍨嬪彿寮规
 const openModelDia = (type, data) => {
   modelOperationType.value = type;
-  modelDia.value = true
-  modelForm.value.model = ''
-  modelForm.value.model = ''
-  modelForm.value.id = ''
-  if (type === 'edit') {
-    modelForm.value = {...data}
+  modelDia.value = true;
+  modelForm.value.model = "";
+  modelForm.value.model = "";
+  modelForm.value.id = "";
+  if (type === "edit") {
+    modelForm.value = { ...data };
   }
-}
+};
 // 鎻愪氦浜у搧鍚嶇О淇敼
 const submitForm = () => {
-  proxy.$refs.formRef.validate(valid => {
+  proxy.$refs.formRef.validate((valid) => {
     if (valid) {
-      if (operationType.value === 'add') {
-        form.value.parentId = currentId.value
-        form.value.id = ''
-      } else if (operationType.value === 'addOne') {
-        form.value.id = ''
-        form.value.parentId = ''
+      if (operationType.value === "add") {
+        form.value.parentId = currentId.value;
+        form.value.id = "";
+      } else if (operationType.value === "addOne") {
+        form.value.id = "";
+        form.value.parentId = "";
       } else {
-        form.value.id = currentId.value
-        form.value.parentId = ''
+        form.value.id = currentId.value;
+        form.value.parentId = "";
       }
-      addOrEditProduct(form.value).then(res => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-        closeProDia()
-        getProductTreeList()
-      })
+      addOrEditProduct(form.value).then((res) => {
+        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        closeProDia();
+        getProductTreeList();
+      });
     }
-  })
-}
+  });
+};
 // 鍏抽棴浜у搧寮规
 const closeProDia = () => {
   proxy.$refs.formRef.resetFields();
   productDia.value = false;
-}
+};
 // 鍒犻櫎浜у搧
 const remove = (node, data) => {
-  let ids = []
-  ids.push(data.id)
-  ElMessageBox.confirm(
-      '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
-      '鍒犻櫎鎻愮ず', {
-        confirmButtonText: '纭',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning',
-      }
-  ).then(() => {
-    tableLoading.value = true
-    delProduct(ids).then(res => {
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
-      getProductTreeList()
-    }).finally(() => {
-      tableLoading.value = false
-    })
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  let ids = [];
+  ids.push(data.id);
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      tableLoading.value = true;
+      delProduct(ids)
+        .then((res) => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          getProductTreeList();
+        })
+        .finally(() => {
+          tableLoading.value = false;
+        });
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 // 閫夋嫨浜у搧
 const handleNodeClick = (val, node, el) => {
   // 鍒ゆ柇鏄惁涓哄彾瀛愯妭鐐�
   isShowButton.value = !(val.children && val.children.length > 0);
   // 鍙湁鍙跺瓙鑺傜偣鎵嶆墽琛屼互涓嬮�昏緫
-  currentId.value = val.id
-  currentParentId.value = val.parentId
-  getModelList()
-}
-
+  currentId.value = val.id;
+  currentParentId.value = val.parentId;
+  getModelList();
+};
 
 // 鎻愪氦瑙勬牸鍨嬪彿淇敼
 const submitModelForm = () => {
-  proxy.$refs.modelFormRef.validate(valid => {
+  proxy.$refs.modelFormRef.validate((valid) => {
     if (valid) {
-      modelForm.value.productId = currentId.value
-      addOrEditProductModel(modelForm.value).then(res => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-        closeModelDia()
-        getModelList()
-      })
+      modelForm.value.productId = currentId.value;
+      addOrEditProductModel(modelForm.value).then((res) => {
+        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        closeModelDia();
+        getModelList();
+      });
     }
-  })
-}
+  });
+};
 // 鍏抽棴鍨嬪彿寮规
 const closeModelDia = () => {
   proxy.$refs.modelFormRef.resetFields();
   modelDia.value = false;
-}
+};
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  selectedRows.value = selection
-}
+  selectedRows.value = selection;
+};
 
 // 鏌ヨ瑙勬牸鍨嬪彿
 const pagination = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
-  getModelList()
-}
+  getModelList();
+};
 const getModelList = () => {
-  tableLoading.value = true
-  modelListPage({id: currentId.value,
-                       current: page.current,
-                       size: page.size,
-                      }
-            ).then(res => {
-    console.log('res',res)
-    tableData.value = res.records
-    total.value = res.total
-    tableLoading.value = false
-  })
-}
+  tableLoading.value = true;
+  modelListPage({
+    id: currentId.value,
+    current: page.current,
+    size: page.size,
+  }).then((res) => {
+    console.log("res", res);
+    tableData.value = res.records;
+    total.value = res.total;
+    tableLoading.value = false;
+  });
+};
 // 鍒犻櫎瑙勬牸鍨嬪彿
 const handleDelete = () => {
-  let ids = []
+  let ids = [];
   if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map(item => item.id);
+    ids = selectedRows.value.map((item) => item.id);
   } else {
-    proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
-    return
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
   }
-  ElMessageBox.confirm(
-      '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
-      '鍒犻櫎鎻愮ず', {
-        confirmButtonText: '纭',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning',
-      }
-  ).then(() => {
-    tableLoading.value = true
-    delProductModel(ids).then(res => {
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
-      getModelList()
-    }).finally(() => {
-      tableLoading.value = false
-    })
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      tableLoading.value = true;
+      delProductModel(ids)
+        .then((res) => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          getModelList();
+        })
+        .finally(() => {
+          tableLoading.value = false;
+        });
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 // 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
 const filterNode = (value, data, node) => {
-  if (!value) {銆�銆�銆�銆�//濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
-    return true
+  if (!value) {
+    //濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
+    return true;
   }
   // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
-  let val = value.toLowerCase()
-  return chooseNode(val, data, node) // 璋冪敤杩囨护浜屽眰鏂规硶
-}
+  let val = value.toLowerCase();
+  return chooseNode(val, data, node); // 璋冪敤杩囨护浜屽眰鏂规硶
+};
 // 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
 const chooseNode = (value, data, node) => {
   if (data.label.indexOf(value) !== -1) {
-    return true
+    return true;
   }
-  const level = node.level
+  const level = node.level;
   // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜�
   if (level === 1) {
-    return false
+    return false;
   }
   // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
-  let parentData = node.parent
+  let parentData = node.parent;
   // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣
-  let index = 0
+  let index = 0;
   while (index < level - 1) {
     // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护
     if (parentData.data.label.indexOf(value) !== -1) {
-      return true
+      return true;
     }
     // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤
-    parentData = parentData.parent
-    index++
+    parentData = parentData.parent;
+    index++;
   }
   // 娌″尮閰嶅埌杩斿洖false
-  return false
-}
-getProductTreeList()
+  return false;
+};
+getProductTreeList();
 </script>
 
 <style scoped>
diff --git a/src/views/basicData/supplierManage/index.vue b/src/views/basicData/supplierManage/index.vue
index 6270639..63a179c 100644
--- a/src/views/basicData/supplierManage/index.vue
+++ b/src/views/basicData/supplierManage/index.vue
@@ -4,95 +4,165 @@
       <div>
         <span class="search_title">渚涘簲鍟嗘。妗堬細</span>
         <el-input
-            v-model="searchForm.supplierName"
-            style="width: 240px"
-            placeholder="杈撳叆渚涘簲鍟嗗悕绉版悳绱�"
-            @change="handleQuery"
-            clearable
-            :prefix-icon="Search"
+          v-model="searchForm.supplierName"
+          style="width: 240px"
+          placeholder="杈撳叆渚涘簲鍟嗗悕绉版悳绱�"
+          @change="handleQuery"
+          clearable
+          :prefix-icon="Search"
         />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+          >鎼滅储</el-button
+        >
       </div>
       <div>
-        <el-button type="primary" @click="openForm('add')">鏂板渚涘簲鍟�</el-button>
+        <el-button type="primary" @click="openForm('add')"
+          >鏂板渚涘簲鍟�</el-button
+        >
         <el-button @click="handleOut">瀵煎嚭</el-button>
-        <el-button type="info" plain icon="Upload" @click="handleImport">瀵煎叆</el-button>
+        <el-button type="info" plain icon="Upload" @click="handleImport"
+          >瀵煎叆</el-button
+        >
         <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
       </div>
     </div>
     <div class="table_list">
-      <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true" :handleSelectionChange="handleSelectionChange"
-                :tableLoading="tableLoading" @pagination="pagination" :total="total"></PIMTable>
+      <PIMTable
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="true"
+        :handleSelectionChange="handleSelectionChange"
+        :tableLoading="tableLoading"
+        @pagination="pagination"
+        :total="total"
+      ></PIMTable>
     </div>
-    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板渚涘簲鍟嗕俊鎭�' : '缂栬緫渚涘簲鍟嗕俊鎭�'" width="70%" @close="closeDia">
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+    <el-dialog
+      v-model="dialogFormVisible"
+      :title="operationType === 'add' ? '鏂板渚涘簲鍟嗕俊鎭�' : '缂栬緫渚涘簲鍟嗕俊鎭�'"
+      width="70%"
+      @close="closeDia"
+    >
+      <el-form
+        :model="form"
+        label-width="140px"
+        label-position="top"
+        :rules="rules"
+        ref="formRef"
+      >
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
-              <el-input v-model="form.supplierName" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="form.supplierName"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="绾崇◣浜鸿瘑鍒彿锛�" prop="taxpayerIdentificationNum">
-              <el-input v-model="form.taxpayerIdentificationNum" placeholder="璇疯緭鍏�" clearable/>
+            <el-form-item
+              label="绾崇◣浜鸿瘑鍒彿锛�"
+              prop="taxpayerIdentificationNum"
+            >
+              <el-input
+                v-model="form.taxpayerIdentificationNum"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍏徃鍦板潃锛�" prop="companyAddress">
-              <el-input v-model="form.companyAddress" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="form.companyAddress"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鍏徃鐢佃瘽锛�" prop="companyPhone">
-              <el-input v-model="form.companyPhone" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="form.companyPhone"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="寮�鎴疯锛�" prop="bankAccountName">
-              <el-input v-model="form.bankAccountName" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="form.bankAccountName"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="璐﹀彿锛�" prop="bankAccountNum">
-              <el-input v-model="form.bankAccountNum" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="form.bankAccountNum"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鑱旂郴浜猴細" prop="contactUserName">
-              <el-input v-model="form.contactUserName" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="form.contactUserName"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="contactUserPhone">
-              <el-input v-model="form.contactUserPhone" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="form.contactUserPhone"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="缁存姢浜猴細" prop="maintainUserId">
-              <el-select v-model="form.maintainUserId" placeholder="璇烽�夋嫨" clearable disabled>
-                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.userId"/>
+              <el-select
+                v-model="form.maintainUserId"
+                placeholder="璇烽�夋嫨"
+                clearable
+                disabled
+              >
+                <el-option
+                  v-for="item in userList"
+                  :key="item.nickName"
+                  :label="item.nickName"
+                  :value="item.userId"
+                />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="缁存姢鏃堕棿锛�" prop="maintainTime">
               <el-date-picker
-                  style="width: 100%"
-                  v-model="form.maintainTime"
-                  value-format="YYYY-MM-DD"
-                  format="YYYY-MM-DD"
-                  type="date"
-                  placeholder="璇烽�夋嫨"
-                  clearable
-                  disabled
+                style="width: 100%"
+                v-model="form.maintainTime"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                type="date"
+                placeholder="璇烽�夋嫨"
+                clearable
+                disabled
               />
             </el-form-item>
           </el-col>
@@ -107,14 +177,36 @@
     </el-dialog>
 
     <!-- 渚涘簲鍟嗗鍏ュ璇濇 -->
-    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
-      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+    <el-dialog
+      :title="upload.title"
+      v-model="upload.open"
+      width="400px"
+      append-to-body
+    >
+      <el-upload
+        ref="uploadRef"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
         <el-icon class="el-icon--upload"><upload-filled /></el-icon>
         <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
         <template #tip>
           <div class="el-upload__tip text-center">
             <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
-            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">涓嬭浇妯℃澘</el-link>
+            <el-link
+              type="primary"
+              :underline="false"
+              style="font-size: 12px; vertical-align: baseline"
+              @click="importTemplate"
+              >涓嬭浇妯℃澘</el-link
+            >
           </div>
         </template>
       </el-upload>
@@ -129,104 +221,111 @@
 </template>
 
 <script setup>
-import { ref } from 'vue'
-import {Search} from "@element-plus/icons-vue";
-import { delSupplier} from "@/api/basicData/supplierManageFile.js";
-import {ElMessageBox } from "element-plus";
-import {userListNoPage} from "@/api/system/user.js";
-import {addSupplier,getSupplier,listSupplier,updateSupplier} from "@/api/basicData/supplierManageFile.js";
-import useUserStore from "@/store/modules/user"
-import {getToken} from "@/utils/auth.js";
-const { proxy } = getCurrentInstance()
-const userStore = useUserStore()
+import { ref } from "vue";
+import { Search } from "@element-plus/icons-vue";
+import { delSupplier } from "@/api/basicData/supplierManageFile.js";
+import { ElMessageBox } from "element-plus";
+import { userListNoPage } from "@/api/system/user.js";
+import {
+  addSupplier,
+  getSupplier,
+  listSupplier,
+  updateSupplier,
+} from "@/api/basicData/supplierManageFile.js";
+import useUserStore from "@/store/modules/user";
+import { getToken } from "@/utils/auth.js";
+const { proxy } = getCurrentInstance();
+const userStore = useUserStore();
 
 const tableColumn = ref([
   {
-    label: '渚涘簲鍟嗗悕绉�',
-    prop: 'supplierName',
+    label: "渚涘簲鍟嗗悕绉�",
+    prop: "supplierName",
     width: 250,
   },
   {
-    label: '鍏徃鍦板潃',
-    prop: 'companyAddress',
+    label: "鍏徃鍦板潃",
+    prop: "companyAddress",
     width: 220,
   },
   {
-    label: '鑱旂郴鏂瑰紡',
-    prop: 'companyPhone'
+    label: "鑱旂郴鏂瑰紡",
+    prop: "companyPhone",
   },
   {
-    label: '寮�鎴疯',
-    prop: 'bankAccountName'
+    label: "寮�鎴疯",
+    prop: "bankAccountName",
   },
   {
-    label: '璐﹀彿',
-    prop: 'bankAccountNum'
+    label: "璐﹀彿",
+    prop: "bankAccountNum",
   },
   {
-    label: '鑱旂郴浜�',
-    prop: 'contactUserName',
+    label: "鑱旂郴浜�",
+    prop: "contactUserName",
   },
   {
-    label: '鑱旂郴鐢佃瘽',
-    prop: 'contactUserPhone',
+    label: "鑱旂郴鐢佃瘽",
+    prop: "contactUserPhone",
   },
   {
-    label: '缁存姢浜�',
-    prop: 'maintainUserName',
+    label: "缁存姢浜�",
+    prop: "maintainUserName",
   },
 
   {
-    label: '缁存姢鏃堕棿',
-    prop: 'maintainTime',
+    label: "缁存姢鏃堕棿",
+    prop: "maintainTime",
   },
   {
     dataType: "action",
     label: "鎿嶄綔",
-    align: 'center',
+    align: "center",
     operation: [
       {
         name: "缂栬緫",
         type: "text",
         clickFun: (row) => {
-          openForm('edit', row);
+          openForm("edit", row);
         },
       },
     ],
   },
-])
-const tableData = ref([])
-const selectedRows = ref([])
-const userList = ref([])
-const tableLoading = ref(false)
+]);
+const tableData = ref([]);
+const selectedRows = ref([]);
+const userList = ref([]);
+const tableLoading = ref(false);
 const page = reactive({
   current: 1,
   size: 10,
-})
-const total = ref(0)
+});
+const total = ref(0);
 
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref('')
-const dialogFormVisible = ref(false)
+const operationType = ref("");
+const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    supplierName: '',
+    supplierName: "",
   },
   form: {
-    supplierName: '',
-    taxpayerIdentificationNum: '',
-    companyAddress: '',
-    companyPhone: '',
-    bankAccountName:'',
-    bankAccountNum:'',
-    contactUserName: '',
-    contactUserPhone: '',
-    maintainUserId: '',
-    maintainTime: '',
+    supplierName: "",
+    taxpayerIdentificationNum: "",
+    companyAddress: "",
+    companyPhone: "",
+    bankAccountName: "",
+    bankAccountNum: "",
+    contactUserName: "",
+    contactUserPhone: "",
+    maintainUserId: "",
+    maintainTime: "",
   },
   rules: {
     supplierName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    taxpayerIdentificationNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    taxpayerIdentificationNum: [
+      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+    ],
     companyAddress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     companyPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     bankAccountName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
@@ -235,33 +334,33 @@
     contactUserPhone: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     maintainUserId: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
     maintainTime: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
-  }
-})
-const { searchForm, form, rules } = toRefs(data)
+  },
+});
+const { searchForm, form, rules } = toRefs(data);
 
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1
-  getList()
-}
+  page.current = 1;
+  getList();
+};
 const pagination = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
-  getList()
-}
+  getList();
+};
 /** 鎻愪氦涓婁紶鏂囦欢 */
 function submitFileForm() {
-  proxy.$refs["uploadRef"].submit()
+  proxy.$refs["uploadRef"].submit();
 }
 const getList = () => {
-  tableLoading.value = true
-  listSupplier({...searchForm.value, ...page}).then(res => {
-    tableLoading.value = false
-    tableData.value = res.data.records
-    total.value = res.data.total
-  })
-}
+  tableLoading.value = true;
+  listSupplier({ ...searchForm.value, ...page }).then((res) => {
+    tableLoading.value = false;
+    tableData.value = res.data.records;
+    total.value = res.data.total;
+  });
+};
 const upload = reactive({
   // 鏄惁鏄剧ず寮瑰嚭灞傦紙渚涘簲鍟嗗鍏ワ級
   open: false,
@@ -272,122 +371,122 @@
   // 璁剧疆涓婁紶鐨勮姹傚ご閮�
   headers: { Authorization: "Bearer " + getToken() },
   // 涓婁紶鐨勫湴鍧�
-  url: import.meta.env.VITE_APP_BASE_API + "/system/supplier/import"
-})
+  url: import.meta.env.VITE_APP_BASE_API + "/system/supplier/import",
+});
 /** 瀵煎叆鎸夐挳鎿嶄綔 */
 function handleImport() {
-  upload.title = "渚涘簲鍟嗗鍏�"
-  upload.open = true
+  upload.title = "渚涘簲鍟嗗鍏�";
+  upload.open = true;
 }
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  selectedRows.value = selection
-}
+  selectedRows.value = selection;
+};
 // 鎵撳紑寮规
 const openForm = (type, row) => {
-  operationType.value = type
-  form.value = {}
-  form.value.maintainUserId = userStore.id
+  operationType.value = type;
+  form.value = {};
+  form.value.maintainUserId = userStore.id;
   form.value.maintainTime = getCurrentDate();
-  userListNoPage().then(res => {
-    userList.value = res.data
-  })
-  if (type === 'edit') {
-    getSupplier(row.id).then(res => {
-      form.value = {...res.data}
-    })
+  userListNoPage().then((res) => {
+    userList.value = res.data;
+  });
+  if (type === "edit") {
+    getSupplier(row.id).then((res) => {
+      form.value = { ...res.data };
+    });
   }
-  dialogFormVisible.value = true
-}
+  dialogFormVisible.value = true;
+};
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate(valid => {
+  proxy.$refs["formRef"].validate((valid) => {
     if (valid) {
       if (operationType.value === "edit") {
-        submitEdit()
+        submitEdit();
       } else {
-        submitAdd()
+        submitAdd();
       }
     }
-  })
-}
+  });
+};
 // 鎻愪氦鏂板
 const submitAdd = () => {
-  addSupplier(form.value).then(res => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-    closeDia()
-    getList()
-  })
-}
+  addSupplier(form.value).then((res) => {
+    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+    closeDia();
+    getList();
+  });
+};
 // 鎻愪氦淇敼
 const submitEdit = () => {
-  updateSupplier(form.value).then(res => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-    closeDia()
-    getList()
-  })
-}
+  updateSupplier(form.value).then((res) => {
+    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+    closeDia();
+    getList();
+  });
+};
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef")
-  dialogFormVisible.value = false
-}
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+};
 // 瀵煎嚭
 const handleOut = () => {
-  ElMessageBox.confirm(
-      '閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�',
-      '瀵煎嚭', {
-        confirmButtonText: '纭',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning',
-      }
-  ).then(() => {
-    proxy.download("/system/supplier/export", {}, '渚涘簲鍟嗘。妗�.xlsx')
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      proxy.download("/system/supplier/export", {}, "渚涘簲鍟嗘。妗�.xlsx");
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 // 鍒犻櫎
 const handleDelete = () => {
-  let ids = []
+  let ids = [];
   if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map(item => item.id);
+    ids = selectedRows.value.map((item) => item.id);
   } else {
-    proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
-    return
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
   }
-  ElMessageBox.confirm(
-      '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
-      '鍒犻櫎鎻愮ず', {
-        confirmButtonText: '纭',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning',
-      }
-  ).then(() => {
-    tableLoading.value = true
-    delSupplier(ids).then(res => {
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
-      getList()
-    }).finally(() => {
-      tableLoading.value = false
-    })
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      tableLoading.value = true;
+      delSupplier(ids)
+        .then((res) => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          getList();
+        })
+        .finally(() => {
+          tableLoading.value = false;
+        });
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 
 // 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
 function getCurrentDate() {
   const today = new Date();
   const year = today.getFullYear();
-  const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮�
-  const day = String(today.getDate()).padStart(2, '0');
+  const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
+  const day = String(today.getDate()).padStart(2, "0");
   return `${year}-${month}-${day}`;
 }
 
-getList()
+onMounted(() => {
+  getList();
+});
 </script>
 
-<style scoped lang="scss">
-
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue
index 88ff50c..89628e6 100644
--- a/src/views/procurementManagement/invoiceEntry/index.vue
+++ b/src/views/procurementManagement/invoiceEntry/index.vue
@@ -3,9 +3,17 @@
     <div class="search_form">
       <div>
         <span class="search_title">閲囪喘鍚堝悓鍙凤細</span>
-        <el-input v-model="searchForm.purchaseContractNumber" style="width: 240px" placeholder="璇疯緭鍏�"
-          @change="handleQuery" clearable prefix-icon="Search" />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+        <el-input
+          v-model="searchForm.purchaseContractNumber"
+          style="width: 240px"
+          placeholder="璇疯緭鍏�"
+          @change="handleQuery"
+          clearable
+          prefix-icon="Search"
+        />
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+          >鎼滅储</el-button
+        >
       </div>
       <div>
         <el-button type="primary" @click="handleAdd">鏂板鐧昏</el-button>
@@ -14,47 +22,123 @@
       </div>
     </div>
     <div class="table_list">
-      <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
-        :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary :summary-method="summarizeMainTable"
-        @expand-change="expandChange" height="calc(100vh - 18.5em)">
+      <el-table
+        :data="tableData"
+        border
+        v-loading="tableLoading"
+        @selection-change="handleSelectionChange"
+        :expand-row-keys="expandedRowKeys"
+        :row-key="(row) => row.id"
+        show-summary
+        :summary-method="summarizeMainTable"
+        @expand-change="expandChange"
+        height="calc(100vh - 18.5em)"
+      >
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column type="expand">
           <template #default="props">
-            <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable">
-              <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+            <el-table
+              :data="props.row.children"
+              border
+              show-summary
+              :summary-method="summarizeChildrenTable"
+            >
+              <el-table-column
+                align="center"
+                label="搴忓彿"
+                type="index"
+                width="60"
+              />
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
               <el-table-column label="鍗曚綅" prop="unit" />
               <el-table-column label="鏁伴噺" prop="quantity" />
               <el-table-column label="绋庣巼(%)" prop="taxRate" />
-              <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
-              <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
-              <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
+              <el-table-column
+                label="鍚◣鍗曚环(鍏�)"
+                prop="taxInclusiveUnitPrice"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="鍚◣鎬讳环(鍏�)"
+                prop="taxInclusiveTotalPrice"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="涓嶅惈绋庢�讳环(鍏�)"
+                prop="taxExclusiveTotalPrice"
+                :formatter="formattedNumber"
+              />
               <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" />
-              <el-table-column label="鏈鏉ョエ閲戦(鍏�)" prop="ticketsAmount" :formatter="formattedNumber" />
+              <el-table-column
+                label="鏈鏉ョエ閲戦(鍏�)"
+                prop="ticketsAmount"
+                :formatter="formattedNumber"
+              />
               <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets" />
-              <el-table-column label="鏈潵绁ㄩ噾棰�(鍏�)" prop="futureTicketsAmount" :formatter="formattedNumber" />
+              <el-table-column
+                label="鏈潵绁ㄩ噾棰�(鍏�)"
+                prop="futureTicketsAmount"
+                :formatter="formattedNumber"
+              />
             </el-table>
           </template>
         </el-table-column>
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" show-overflow-tooltip />
-        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip />
-        <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" show-overflow-tooltip />
-        <el-table-column label="椤圭洰鍚嶇О" prop="projectName" show-overflow-tooltip />
-        <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" show-overflow-tooltip :formatter="formattedNumber" />
+        <el-table-column
+          label="閲囪喘鍚堝悓鍙�"
+          prop="purchaseContractNumber"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="閿�鍞悎鍚屽彿"
+          prop="salesContractNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="渚涘簲鍟嗗悕绉�"
+          prop="supplierName"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="椤圭洰鍚嶇О"
+          prop="projectName"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍚堝悓閲戦(鍏�)"
+          prop="contractAmount"
+          show-overflow-tooltip
+          :formatter="formattedNumber"
+        />
         <!-- <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
           <template #default="scope">
             <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">缂栬緫</el-button>
           </template>
         </el-table-column> -->
       </el-table>
-      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
-        :page="page.current" :limit="page.size" @pagination="paginationChange" />
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current"
+        :limit="page.size"
+        @pagination="paginationChange"
+      />
     </div>
-    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板鏉ョエ鐧昏' : '缂栬緫鏉ョエ鐧昏'" width="80%"
-      @close="closeDia">
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+    <el-dialog
+      v-model="dialogFormVisible"
+      :title="operationType === 'add' ? '鏂板鏉ョエ鐧昏' : '缂栬緫鏉ョエ鐧昏'"
+      width="80%"
+      @close="closeDia"
+    >
+      <el-form
+        :model="form"
+        label-width="140px"
+        label-position="top"
+        :rules="rules"
+        ref="formRef"
+      >
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo">
@@ -63,77 +147,190 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input v-model="form.salesContractNo" placeholder="鑷姩濉厖" clearable disabled />
+              <el-input
+                v-model="form.salesContractNo"
+                placeholder="鑷姩濉厖"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
-              <el-input v-model="form.supplierName" placeholder="鑷姩濉厖" clearable disabled />
+              <el-input
+                v-model="form.supplierName"
+                placeholder="鑷姩濉厖"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input v-model="form.projectName" placeholder="鑷姩濉厖" clearable disabled />
+              <el-input
+                v-model="form.projectName"
+                placeholder="鑷姩濉厖"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
-              <el-input v-model="form.invoiceNumber" placeholder="璇疯緭鍏�" clearable />
+              <el-input
+                v-model="form.invoiceNumber"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
-              <el-input type="number" :step="0.01" v-model="form.invoiceAmount" placeholder="璇疯緭鍏�" clearable />
+              <el-input
+                type="number"
+                :step="0.01"
+                v-model="form.invoiceAmount"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="寮�绁ㄤ汉锛�" prop="issUer">
-              <el-input v-model="form.issUer" placeholder="璇疯緭鍏�" clearable disabled />
+            <el-form-item label="褰曞叆浜猴細" prop="issUer">
+              <el-input
+                v-model="form.issUer"
+                placeholder="璇疯緭鍏�"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="issueDate">
-                <el-date-picker disabled style="width: 100%" v-model="form.issueDate" type="date" clearable />
+              <el-date-picker
+                style="width: 100%"
+                v-model="form.issueDate"
+                type="date"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime">
+              <el-date-picker
+                style="width: 100%"
+                v-model="form.createTime"
+                type="date"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
-          </el-form-item>
+          <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item>
         </el-row>
-        <el-table :data="productData" border @selection-change="productSelected" show-summary style="width: 100%" :summary-method="summarizeChildrenTable">
-          <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table
+          :data="productData"
+          border
+          @selection-change="productSelected"
+          show-summary
+          style="width: 100%"
+          :summary-method="summarizeChildrenTable"
+        >
+          <el-table-column
+            align="center"
+            label="搴忓彿"
+            type="index"
+            width="60"
+          />
           <el-table-column label="浜у搧澶х被" prop="productCategory" />
           <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
           <el-table-column label="鍗曚綅" prop="unit" width="70" />
-          <el-table-column label="鏁伴噺" prop="quantity" width="70"/>
+          <el-table-column label="鏁伴噺" prop="quantity" width="70" />
           <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
-          <el-table-column label="鍚◣鍗曚环(鍏�)" width="150" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
-          <el-table-column label="鍚◣鎬讳环(鍏�)" width="150" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
-          <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" width="150" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
+          <el-table-column
+            label="鍚◣鍗曚环(鍏�)"
+            width="150"
+            prop="taxInclusiveUnitPrice"
+            :formatter="formattedNumber"
+          />
+          <el-table-column
+            label="鍚◣鎬讳环(鍏�)"
+            width="150"
+            prop="taxInclusiveTotalPrice"
+            :formatter="formattedNumber"
+          />
+          <el-table-column
+            label="涓嶅惈绋庢�讳环(鍏�)"
+            width="150"
+            prop="taxExclusiveTotalPrice"
+            :formatter="formattedNumber"
+          />
           <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" width="170">
             <template #default="scope">
-              <el-input-number v-model="scope.row.ticketsNum" placeholder="璇烽�夋嫨" :min="0" :step="0.1" clearable style="width: 100%"
-                @change="invoiceNumBlur(scope.row)" />
+              <el-input-number
+                v-model="scope.row.ticketsNum"
+                placeholder="璇烽�夋嫨"
+                :min="0"
+                :step="0.1"
+                clearable
+                style="width: 100%"
+                @change="invoiceNumBlur(scope.row)"
+              />
             </template>
           </el-table-column>
-          <el-table-column label="鏈鏉ョエ閲戦(鍏�)" prop="ticketsAmount" :min="0" :step="0.1" :formatter="formattedNumber" @change="invoiceAmountBlur"  width="170">
+          <el-table-column
+            label="鏈鏉ョエ閲戦(鍏�)"
+            prop="ticketsAmount"
+            :min="0"
+            :step="0.1"
+            :formatter="formattedNumber"
+            @change="invoiceAmountBlur"
+            width="170"
+          >
             <template #default="scope">
-              <el-input-number v-model="scope.row.ticketsAmount" placeholder="璇烽�夋嫨" :min="0" :step="0.1" clearable style="width: 100%"
-                               @change="invoiceAmountBlur(scope.row)" />
+              <el-input-number
+                v-model="scope.row.ticketsAmount"
+                placeholder="璇烽�夋嫨"
+                :min="0"
+                :step="0.1"
+                clearable
+                style="width: 100%"
+                @change="invoiceAmountBlur(scope.row)"
+              />
             </template>
           </el-table-column>
-          <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets"
-            : ="(row) => row.futureTickets == null || row.futureTickets === '' ? row.quantity : row.futureTickets">
+          <el-table-column
+            label="鏈潵绁ㄦ暟"
+            prop="futureTickets"
+            :="
+              (row) =>
+                row.futureTickets == null || row.futureTickets === ''
+                  ? row.quantity
+                  : row.futureTickets
+            "
+          >
           </el-table-column>
-          <el-table-column label="鏈潵绁ㄩ噾棰�(鍏�)" prop="futureTicketsAmount"
-            :formatter="(row) => (row.futureTicketsAmount !== undefined && row.futureTicketsAmount !== null && row.futureTicketsAmount !== '' ? row.futureTicketsAmount : row.taxExclusiveTotalPrice)">
+          <el-table-column
+            label="鏈潵绁ㄩ噾棰�(鍏�)"
+            prop="futureTicketsAmount"
+            :formatter="
+              (row) =>
+                row.futureTicketsAmount !== undefined &&
+                row.futureTicketsAmount !== null &&
+                row.futureTicketsAmount !== ''
+                  ? row.futureTicketsAmount
+                  : row.taxExclusiveTotalPrice
+            "
+          >
           </el-table-column>
         </el-table>
       </el-form>
@@ -148,27 +345,27 @@
 </template>
 
 <script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import {ElMessageBox } from "element-plus";
-import {userListNoPage} from "@/api/system/user.js";
-import {productList} from "@/api/procurementManagement/procurementLedger.js";
-import useUserStore from '@/store/modules/user';
-const userStore = useUserStore()
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const productData = ref([])
-const selectedRows = ref([])
-const productSelectedRows = ref([])
-const userList = ref([])
-const purchaseLedgerList = ref([])
-const tableLoading = ref(false)
+import pagination from "@/components/PIMTable/Pagination.vue";
+import { ref } from "vue";
+import { ElMessageBox } from "element-plus";
+import { userListNoPage } from "@/api/system/user.js";
+import { productList } from "@/api/procurementManagement/procurementLedger.js";
+import useUserStore from "@/store/modules/user";
+const userStore = useUserStore();
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const productData = ref([]);
+const selectedRows = ref([]);
+const productSelectedRows = ref([]);
+const userList = ref([]);
+const purchaseLedgerList = ref([]);
+const tableLoading = ref(false);
 const page = reactive({
   current: 1,
   size: 100,
-})
-const total = ref(0)
-const fileList = ref([])
+});
+const total = ref(0);
+const fileList = ref([]);
 import {
   addOrUpdateRegistration,
   delRegistration,
@@ -176,288 +373,305 @@
   getInfo,
   getProduct,
   getPurchaseNoById,
-  getRegistrationById
+  getRegistrationById,
 } from "@/api/procurementManagement/invoiceEntry.js";
 
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref('')
-const dialogFormVisible = ref(false)
+const operationType = ref("");
+const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    purchaseContractNumber: '',
+    purchaseContractNumber: "",
   },
   form: {
-    issueDate:"",// 寮�绁ㄦ棩鏈�
-    purchaseLedgerId: '',
-    purchaseLedgerNo: '',
-    issUerId: '', // 寮�绁ㄤ汉id
-    issUer: '' ,// 寮�绁ㄤ汉濮撳悕
-    invoiceNumber:"", // 鍙戠エ鍙�
-    invoiceAmount:"", // 鍙戠エ閲戦
+    issueDate: "", // 寮�绁ㄦ棩鏈�
+    purchaseLedgerId: "",
+    purchaseLedgerNo: "",
+    issUerId: "", // 寮�绁ㄤ汉id
+    issUer: "", // 寮�绁ㄤ汉濮撳悕
+    invoiceNumber: "", // 鍙戠エ鍙�
+    invoiceAmount: "", // 鍙戠エ閲戦
+    createTime: "", // 褰曞叆鏃ユ湡
   },
   rules: {
-    invoiceNumber: [{ required: true, message: '璇疯緭鍏ュ彂绁ㄥ彿' , trigger: 'blur' },{type:"string"}],
-    invoiceAmount: [{ required: true, message: '璇疯緭鍏ュ彂绁ㄩ噾棰�' , trigger: 'blur'}],
-
-  }
-})
-const { searchForm, form, rules } = toRefs(data)
+    invoiceNumber: [
+      { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" },
+      { type: "string" },
+    ],
+    invoiceAmount: [
+      { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" },
+    ],
+  },
+});
+const { searchForm, form, rules } = toRefs(data);
 // 浜у搧琛ㄥ崟寮规鏁版嵁
-const productFormVisible = ref(false)
-const productOperationType = ref('')
-const currentId = ref('')
+const productFormVisible = ref(false);
+const productOperationType = ref("");
+const currentId = ref("");
 
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1
-  getList()
-}
+  page.current = 1;
+  getList();
+};
 const paginationChange = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
-  getList()
-}
+  getList();
+};
 const getList = () => {
-  tableLoading.value = true
-  gePurchaseListPage({ ...searchForm.value, ...page }).then(res => {
-    tableLoading.value = false
-    tableData.value = res.records;
-    tableData.value.map(item => {
-      item.children = []
+  tableLoading.value = true;
+  gePurchaseListPage({ ...searchForm.value, ...page })
+    .then((res) => {
+      tableLoading.value = false;
+      tableData.value = res.records;
+      tableData.value.map((item) => {
+        item.children = [];
+      });
+      total.value = res.total;
+      expandedRowKeys.value = [];
     })
-    total.value = res.total
-    expandedRowKeys.value = []
-  }).catch(() => {
-    tableLoading.value = false
-  })
-}
+    .catch(() => {
+      tableLoading.value = false;
+    });
+};
 const formattedNumber = (row, column, cellValue) => {
   return parseFloat(cellValue).toFixed(2);
 };
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  selectedRows.value = selection.filter(item => item.purchaseContractNumber !== undefined);
-}
+  selectedRows.value = selection.filter(
+    (item) => item.purchaseContractNumber !== undefined
+  );
+};
 const productSelected = (selectedRows) => {
-  productSelectedRows.value = selectedRows
-}
-const expandedRowKeys = ref([])
+  productSelectedRows.value = selectedRows;
+};
+const expandedRowKeys = ref([]);
 // 灞曞紑琛�
 const expandChange = (row, expandedRows) => {
   if (expandedRows.length > 0) {
-    expandedRowKeys.value = []
+    expandedRowKeys.value = [];
     try {
-      productList({ salesLedgerId: row.id, type: 2 }).then(res => {
-        const index = tableData.value.findIndex(item => item.id === row.id);
+      productList({ salesLedgerId: row.id, type: 2 }).then((res) => {
+        const index = tableData.value.findIndex((item) => item.id === row.id);
         if (index > -1) {
           tableData.value[index].children = res;
         }
-        expandedRowKeys.value.push(row.id)
-      })
+        expandedRowKeys.value.push(row.id);
+      });
     } catch (error) {
-      console.log(error)
+      console.log(error);
     }
   } else {
-    expandedRowKeys.value = []
+    expandedRowKeys.value = [];
   }
-}
+};
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ['contractAmount'], {
+  return proxy.summarizeTable(param, ["contractAmount"], {
     ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
     futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
   });
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeChildrenTable = (param) => {
-  return proxy.summarizeTable(param, ['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice', 'ticketsNum', 'ticketsAmount', 'futureTickets', 'futureTicketsAmount'], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
+  return proxy.summarizeTable(
+    param,
+    [
+      "taxInclusiveUnitPrice",
+      "taxInclusiveTotalPrice",
+      "taxExclusiveTotalPrice",
+      "ticketsNum",
+      "ticketsAmount",
+      "futureTickets",
+      "futureTicketsAmount",
+    ],
+    {
+      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+    }
+  );
 };
 
 const handleAdd = () => {
   if (selectedRows.value.length !== 1) {
-    proxy.$modal.msgWarning('璇峰厛閫変腑涓�鏉℃暟鎹�');
+    proxy.$modal.msgWarning("璇峰厛閫変腑涓�鏉℃暟鎹�");
     return;
   }
-  openForm('add', selectedRows.value[0]);
-}
+  openForm("add", selectedRows.value[0]);
+};
 
 // 鎵撳紑寮规
 const openForm = (type, row) => {
-  invoiceNumBlur(row)
-  operationType.value = type
-  form.value = {}
-  productData.value = []
-  fileList.value = []
-  form.value.issUerId = userStore.id
-  form.value.issUer = userStore.name
-  form.value.issueDate = getNowFormatDate()
-  userListNoPage().then(res => {
-    userList.value = res.data
-  })
+  invoiceNumBlur(row);
+  operationType.value = type;
+  form.value = {};
+  productData.value = [];
+  fileList.value = [];
+  form.value.issUerId = userStore.id;
+  form.value.issUer = userStore.name;
+  form.value.issueDate = getNowFormatDate();
+  userListNoPage().then((res) => {
+    userList.value = res.data;
+  });
   // 鏂板鏃朵紶鍏ュ綋鍓嶈id骞舵煡璇㈤噰璐悎鍚屽彿
-  if (type === 'add' && row && row.id) {
-    form.value.purchaseLedgerId = row.id
-    getPurchaseNoById({ id: row.id }).then(res => {
-      let result = res.data
-      purchaseLedgerList.value = result,
-        form.value.purchaseLedgerNo = result.purchaseContractNumber;
-        form.value.invoiceAmount = result.invoiceAmount;
-        form.value.invoiceNumber = result.invoiceNumber;
-      setInfo(result.id)
-    })
+  if (type === "add" && row && row.id) {
+    form.value.purchaseLedgerId = row.id;
+    getPurchaseNoById({ id: row.id }).then((res) => {
+      let result = res.data;
+      (purchaseLedgerList.value = result),
+        (form.value.purchaseLedgerNo = result.purchaseContractNumber);
+      form.value.invoiceAmount = result.invoiceAmount;
+      form.value.invoiceNumber = result.invoiceNumber;
+      setInfo(result.id);
+    });
   } else {
-    getProduct().then(res => {
-      purchaseLedgerList.value = res
-    })
+    getProduct().then((res) => {
+      purchaseLedgerList.value = res;
+    });
   }
-  if (type === 'edit') {
+  if (type === "edit") {
     currentId.value = row.id;
-    getRegistrationById({ id: row.id }).then(res => {
-      form.value = { ...res }
-      productData.value = form.value.productData
+    getRegistrationById({ id: row.id }).then((res) => {
+      form.value = { ...res };
+      productData.value = form.value.productData;
       if (form.value.salesLedgerFiles) {
-        fileList.value = form.value.salesLedgerFiles
+        fileList.value = form.value.salesLedgerFiles;
       } else {
-        fileList.value = []
+        fileList.value = [];
       }
-    })
+    });
   }
-  dialogFormVisible.value = true
-}
+  dialogFormVisible.value = true;
+};
 // 閫夋嫨閲囪喘鍚堝悓鍙疯祴鍊�
 const setInfo = (value) => {
-  getInfo({ id: value }).then(res => {
-    let result = res.data
-    form.value.salesContractNo = result.salesContractNo
-    form.value.projectName = result.projectName
-    productData.value = result.productData
-    form.value.supplierName = result.supplierName
-  })
-}
+  getInfo({ id: value }).then((res) => {
+    let result = res.data;
+    form.value.salesContractNo = result.salesContractNo;
+    form.value.projectName = result.projectName;
+    productData.value = result.productData;
+    form.value.supplierName = result.supplierName;
+  });
+};
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate(valid => {
+  proxy.$refs["formRef"].validate((valid) => {
     if (valid) {
-      form.value.productData = proxy.HaveJson(productData.value)
-      addOrUpdateRegistration(form.value).then(res => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-        closeDia()
-        getList()
-      })
+      form.value.productData = proxy.HaveJson(productData.value);
+      addOrUpdateRegistration(form.value).then((res) => {
+        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        closeDia();
+        getList();
+      });
     }
-  })
-}
+  });
+};
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef")
-  dialogFormVisible.value = false
-}
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+};
 // 瀵煎嚭
 const handleOut = () => {
-  ElMessageBox.confirm(
-    '閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�',
-    '瀵煎嚭', {
-    confirmButtonText: '纭',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning',
-  }
-  ).then(() => {
-    proxy.download("/purchase/registration/export", {}, '鏉ョエ鐧昏.xlsx')
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 // 鍒犻櫎
 const handleDelete = () => {
-  let ids = []
+  let ids = [];
   if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map(item => item.id);
+    ids = selectedRows.value.map((item) => item.id);
   } else {
-    proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
-    return
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
   }
-  ElMessageBox.confirm(
-    '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
-    '瀵煎嚭', {
-    confirmButtonText: '纭',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning',
-  }
-  ).then(() => {
-    delRegistration(ids).then(res => {
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
-      getList()
-    })
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      delRegistration(ids).then((res) => {
+        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        getList();
+      });
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 //鏈鏉ョエ鏁板け鐒︽搷浣�
 const invoiceNumBlur = (row) => {
-  if (!row.ticketsNum || row.ticketsNum === '') {
-      row.ticketsNum = 0
+  if (!row.ticketsNum || row.ticketsNum === "") {
+    row.ticketsNum = 0;
   }
   if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
-    proxy.$modal.msgWarning('鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟')
-    row.ticketsNum = 0
-    return
+    proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
+    row.ticketsNum = 0;
+    return;
   }
   // 璁$畻鏈鏉ョエ閲戦
-  row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice
+  row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice;
   // 璁$畻鏈潵绁ㄦ暟
-  row.futureTickets = row.tempFutureTickets - row.ticketsNum
+  row.futureTickets = row.tempFutureTickets - row.ticketsNum;
   // 璁$畻鏈潵绁ㄩ噾棰�
-  row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount
-  calculateinvoiceAmount()
-}
+  row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount;
+  calculateinvoiceAmount();
+};
 // 鏈鏉ョエ閲戦澶辩劍鎿嶄綔
 const invoiceAmountBlur = (row) => {
-  if(!row.ticketsAmount){
-    row.ticketsAmount = 0
+  if (!row.ticketsAmount) {
+    row.ticketsAmount = 0;
   }
   // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰�
-  if(row.ticketsAmount > row.tempFutureTicketsAmount){
-    proxy.$modal.msgWarning('鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�')
-    row.ticketsAmount = 0
+  if (row.ticketsAmount > row.tempFutureTicketsAmount) {
+    proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�");
+    row.ticketsAmount = 0;
   }
   // 璁$畻鏈鏉ョエ鏁�
-  row.ticketsNum = (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2)
+  row.ticketsNum = (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2);
   // 璁$畻鏈潵绁ㄦ暟
-  row.futureTickets = row.tempFutureTickets - row.ticketsNum
+  row.futureTickets = row.tempFutureTickets - row.ticketsNum;
   // 璁$畻鏈潵绁ㄩ噾棰�
-  row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount
-  calculateinvoiceAmount()
-}
+  row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount;
+  calculateinvoiceAmount();
+};
 
 // 鑾峰彇褰撳墠鏃ユ湡鍑芥暟
 function getNowFormatDate() {
   let date = new Date(),
     year = date.getFullYear(), //鑾峰彇瀹屾暣鐨勫勾浠�(4浣�)
     month = date.getMonth() + 1, //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�)
-    strDate = date.getDate() // 鑾峰彇褰撳墠鏃�(1-31)
-  if (month < 10) month = `0${month}` // 濡傛灉鏈堜唤鏄釜浣嶆暟锛屽湪鍓嶉潰琛�0
-  if (strDate < 10) strDate = `0${strDate}` // 濡傛灉鏃ユ槸涓綅鏁帮紝鍦ㄥ墠闈㈣ˉ0
-  return `${year}-${month}-${strDate}`
+    strDate = date.getDate(); // 鑾峰彇褰撳墠鏃�(1-31)
+  if (month < 10) month = `0${month}`; // 濡傛灉鏈堜唤鏄釜浣嶆暟锛屽湪鍓嶉潰琛�0
+  if (strDate < 10) strDate = `0${strDate}`; // 濡傛灉鏃ユ槸涓綅鏁帮紝鍦ㄥ墠闈㈣ˉ0
+  return `${year}-${month}-${strDate}`;
 }
-
 
 function calculateinvoiceAmount() {
-  console.log('productData',productData.value)
-  var invoiceAmountTotal = 0
-  productData.value.forEach(item => {
-    if(item.ticketsAmount){
-      invoiceAmountTotal += item.ticketsAmount
+  console.log("productData", productData.value);
+  var invoiceAmountTotal = 0;
+  productData.value.forEach((item) => {
+    if (item.ticketsAmount) {
+      invoiceAmountTotal += item.ticketsAmount;
     }
-  })
-  form.value.invoiceAmount = invoiceAmountTotal.toFixed(2)
-
+  });
+  form.value.invoiceAmount = invoiceAmountTotal.toFixed(2);
 }
 
-getList()
+getList();
 </script>
 
 <style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
index 82bc96d..8c64037 100644
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ b/src/views/procurementManagement/paymentEntry/index.vue
@@ -1,67 +1,169 @@
 <template>
   <div class="app-container">
     <div class="search_form">
-      <div>
+      <el-form :inline="true" :model="searchForm" style="width: 100%">
+        <el-row justify="space-between">
+          <el-col :span="20">
+            <el-form-item label="渚涘簲鍟嗗悕绉�/鍚堝悓鍙�">
+              <el-input
+                v-model="searchForm.supplierNameOrContractNo"
+                style="width: 240px"
+                placeholder="杈撳叆渚涘簲鍟嗗悕绉�/鍚堝悓鍙锋悳绱�"
+                clearable
+                prefix-icon="Search"
+                @change="handleQuery"
+              />
+            </el-form-item>
+            <el-form-item label="涓嶆樉绀哄緟鍥炴">
+              <el-checkbox
+                v-model="searchForm.status"
+                :label="0"
+                @change="handleQuery"
+              />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item style="float: right; margin-right: unset">
+              <el-button type="primary" @click="openForm('add')">
+                鏂板浠樻
+              </el-button>
+              <el-button type="danger" plain @click="handleDelete">
+                鍒犻櫎
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <!-- <div>
         <span class="search_title">渚涘簲鍟嗗悕绉�/鍚堝悓鍙凤細</span>
-        <el-input v-model="searchForm.supplierNameOrContractNo" style="width: 240px" placeholder="杈撳叆渚涘簲鍟嗗悕绉�/鍚堝悓鍙锋悳绱�"
-          @change="handleQuery" clearable :prefix-icon="Search" />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+        <el-input
+          v-model="searchForm.supplierNameOrContractNo"
+          style="width: 240px"
+          placeholder="杈撳叆渚涘簲鍟嗗悕绉�/鍚堝悓鍙锋悳绱�"
+          @change="handleQuery"
+          clearable
+          :prefix-icon="Search"
+        />
+        <el-button
+          type="primary"
+          @click="handleQuery"
+          style="margin-left: 10px"
+        >
+          鎼滅储
+        </el-button>
       </div>
       <div>
         <el-button type="primary" @click="openForm('add')">鏂板浠樻</el-button>
         <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
-      </div>
+      </div> -->
     </div>
     <div class="table_list">
-      <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true"
-                :isShowSummary="isShowSummarySon"
-                :summaryMethod="summarizeMainTable1"
-        :handleSelectionChange="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination"
-        :total="total"></PIMTable>
+      <PIMTable
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="true"
+        :isShowSummary="isShowSummarySon"
+        :summaryMethod="summarizeMainTable1"
+        :handleSelectionChange="handleSelectionChange"
+        :tableLoading="tableLoading"
+        @pagination="pagination"
+        :total="total"
+      ></PIMTable>
     </div>
-    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板浠樻鐧昏' : '缂栬緫浠樻鐧昏'" width="60%"
-      @close="closeDia">
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+    <el-dialog
+      v-model="dialogFormVisible"
+      :title="operationType === 'add' ? '鏂板浠樻鐧昏' : '缂栬緫浠樻鐧昏'"
+      width="60%"
+      @close="closeDia"
+    >
+      <el-form
+        :model="form"
+        label-width="140px"
+        label-position="top"
+        :rules="rules"
+        ref="formRef"
+      >
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="鑷姩濉厖" clearable disabled />
+              <el-input
+                v-model="form.purchaseContractNumber"
+                placeholder="鑷姩濉厖"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input v-model="form.salesContractNo" placeholder="鑷姩濉厖" clearable disabled />
+              <el-input
+                v-model="form.salesContractNo"
+                placeholder="鑷姩濉厖"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
-              <el-input v-model="form.supplierName" placeholder="鑷姩濉厖" clearable disabled />
+              <el-input
+                v-model="form.supplierName"
+                placeholder="鑷姩濉厖"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
-              <el-input v-model="form.invoiceNumber" placeholder="鑷姩濉厖" clearable disabled />
+              <el-input
+                v-model="form.invoiceNumber"
+                placeholder="鑷姩濉厖"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
-              <el-input type="number" :step="0.01" v-model="form.invoiceAmount" placeholder="鑷姩濉厖" clearable disabled />
+              <el-input
+                type="number"
+                :step="0.01"
+                v-model="form.invoiceAmount"
+                placeholder="鑷姩濉厖"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鏈浠樻閲戦锛�" prop="currentPaymentAmount">
-              <el-input type="number" :step="0.01" v-model="form.currentPaymentAmount" placeholder="璇疯緭鍏�" clearable />
+              <el-input
+                type="number"
+                :step="0.01"
+                v-model="form.currentPaymentAmount"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="浠樻鏂瑰紡锛�" prop="paymentMethod">
-              <el-select v-model="form.paymentMethod" placeholder="璇烽�夋嫨" clearable>
+              <el-select
+                v-model="form.paymentMethod"
+                placeholder="璇烽�夋嫨"
+                clearable
+              >
                 <el-option label="鐢垫眹" value="鐢垫眹" />
                 <el-option label="鎵垮厬" value="鎵垮厬" />
               </el-select>
@@ -69,20 +171,38 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="鐧昏浜猴細" prop="registrant">
-              <el-input v-model="form.registrant" placeholder="璇疯緭鍏�" clearable disabled />
+              <el-input
+                v-model="form.registrant"
+                placeholder="璇疯緭鍏�"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="浠樻鏃ユ湡锛�" prop="paymentDate">
-              <el-date-picker disabled style="width: 100%" v-model="form.paymentDate" value-format="YYYY-MM-DD"
-                format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable />
+              <el-date-picker
+                disabled
+                style="width: 100%"
+                v-model="form.paymentDate"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                type="date"
+                placeholder="璇烽�夋嫨"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鐧昏鏃ユ湡锛�" prop="registrationtDate">
-              <el-input v-model="form.registrationtDate" placeholder="璇疯緭鍏�" clearable disabled />
+              <el-input
+                v-model="form.registrationtDate"
+                placeholder="璇疯緭鍏�"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -98,249 +218,269 @@
 </template>
 
 <script setup>
-import { ref } from 'vue'
+import { ref } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessageBox } from "element-plus";
 import useUserStore from "@/store/modules/user.js";
 import {
   byPurchaseId,
-  paymentRegistrationAdd, paymentRegistrationDel,
+  paymentRegistrationAdd,
+  paymentRegistrationDel,
   paymentRegistrationEdit,
-  getTicketNo
+  getTicketNo,
 } from "@/api/procurementManagement/paymentEntry.js";
-import {invoiceListPage} from "@/api/procurementManagement/procurementInvoiceLedger.js"
-const { proxy } = getCurrentInstance()
+import { invoiceListPage } from "@/api/procurementManagement/procurementInvoiceLedger.js";
+import useFormData from "@/hooks/useFormData";
+
+const { proxy } = getCurrentInstance();
 const tableColumn = ref([
   {
-    label: '閲囪喘鍚堝悓鍙�',
-    prop: 'purchaseContractNumber',
+    label: "閲囪喘鍚堝悓鍙�",
+    prop: "purchaseContractNumber",
   },
   {
-    label: '閿�鍞悎鍚屽彿',
-    prop: 'salesContractNo',
+    label: "閿�鍞悎鍚屽彿",
+    prop: "salesContractNo",
   },
   {
-    label: '渚涘簲鍟嗗悕绉�',
-    prop: 'supplierName',
+    label: "渚涘簲鍟嗗悕绉�",
+    prop: "supplierName",
   },
   {
-    label: '鍙戠エ鍙�',
-    prop: 'invoiceNumber'
+    label: "鍙戠エ鍙�",
+    prop: "invoiceNumber",
   },
   {
-    label: '鍙戠エ閲戦(鍏�)',
-    prop: 'invoiceAmount',
+    label: "鍙戠エ閲戦(鍏�)",
+    prop: "invoiceAmount",
     formatData: (params) => {
       return parseFloat(params).toFixed(2);
-    }
+    },
   },
   {
-    label: '宸蹭粯娆鹃噾棰�(鍏�)',
-    prop: 'paymentAmountTotal',
+    label: "宸蹭粯娆鹃噾棰�(鍏�)",
+    prop: "paymentAmountTotal",
     formatData: (params) => {
       return parseFloat(params).toFixed(2);
-    }
+    },
   },
   {
-    label: '寰呬粯娆鹃噾棰�(鍏�)',
-    prop: 'unPaymentAmountTotal',
+    label: "寰呬粯娆鹃噾棰�(鍏�)",
+    prop: "unPaymentAmountTotal",
     formatData: (params) => {
       return parseFloat(params).toFixed(2);
-    }
+    },
   },
-])
-const tableData = ref([])
-const selectedRows = ref([])
-const tableLoading = ref(false)
-const invoiceNumberList = ref([])
-const userStore = useUserStore()
+]);
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+const invoiceNumberList = ref([]);
+const userStore = useUserStore();
 const page = reactive({
   current: 1,
   size: 100,
-})
-const total = ref(0)
+});
+const total = ref(0);
 
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref('')
-const dialogFormVisible = ref(false)
+const operationType = ref("");
+const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    supplierNameOrContractNo: '',
+    supplierNameOrContractNo: "",
+    status: false,
   },
   form: {
-    purchaseContractNumber:'',
-    purchaseLedgerId: '',
-    salesContractNo: '',
-    supplierName: '',
-    invoiceNumber: '',
-    invoiceAmount: '',
-    taxRate: '',
-    currentPaymentAmount: '',
-    paymentMethod: '',
-    registrant: '',
-    registrantId: '',
-    paymentDate: '',
+    purchaseContractNumber: "",
+    purchaseLedgerId: "",
+    salesContractNo: "",
+    supplierName: "",
+    invoiceNumber: "",
+    invoiceAmount: "",
+    taxRate: "",
+    currentPaymentAmount: "",
+    paymentMethod: "",
+    registrant: "",
+    registrantId: "",
+    paymentDate: "",
     registrationtDate: "",
   },
   rules: {
-    purchaseLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    currentPaymentAmount: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    purchaseLedgerId: [
+      { required: true, message: "璇烽�夋嫨", trigger: "change" },
+    ],
+    currentPaymentAmount: [
+      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+    ],
     paymentMethod: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    invoiceNumber: [{ required: true, message: "璇烽�夋嫨閲囪喘鍚堝悓鍙�", trigger: "change" }],
-  }
-})
-const { searchForm, form, rules } = toRefs(data)
+    invoiceNumber: [
+      { required: true, message: "璇烽�夋嫨閲囪喘鍚堝悓鍙�", trigger: "change" },
+    ],
+  },
+});
+const { form, rules } = toRefs(data);
+const { form: searchForm, resetForm } = useFormData(data.searchForm);
 const isShowSummarySon = ref(true);
 
 // 瀛愯〃鍚堣鏂规硶
 const summarizeMainTable1 = (param) => {
-  return proxy.summarizeTable(param, ['invoiceAmount', 'paymentAmountTotal', 'unPaymentAmountTotal'], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
+  return proxy.summarizeTable(
+    param,
+    ["invoiceAmount", "paymentAmountTotal", "unPaymentAmountTotal"],
+    {
+      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+    }
+  );
 };
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1
-  getList()
-}
+  page.current = 1;
+  getList();
+};
 const pagination = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
-  getList()
-}
+  getList();
+};
 const getList = () => {
-  tableLoading.value = true
-  invoiceListPage({ ...searchForm.value, ...page }).then(res => {
-    tableLoading.value = false
-    tableData.value = res.records
-    total.value = res.total
-  })
-}
+  tableLoading.value = true;
+  invoiceListPage({ ...searchForm, ...page }).then((res) => {
+    tableLoading.value = false;
+    tableData.value = res.records;
+    total.value = res.total;
+  });
+};
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  selectedRows.value = selection
-}
+  selectedRows.value = selection;
+};
 // 鎵撳紑寮规
 const openForm = (type, row) => {
-  if(selectedRows.value.length !== 1 ) {
-    proxy.$message.error("璇烽�夋嫨涓�鏉″彂绁ㄦ暟鎹�")
-    return
+  if (selectedRows.value.length !== 1) {
+    proxy.$message.error("璇烽�夋嫨涓�鏉″彂绁ㄦ暟鎹�");
+    return;
   }
-  operationType.value = type
-  form.value = {}
-  form.value = {...selectedRows.value[0]}
-  form.value.ticketRegistrationId = selectedRows.value[0].id
-  form.value.id = null
+  operationType.value = type;
+  form.value = {};
+  form.value = { ...selectedRows.value[0] };
+  form.value.ticketRegistrationId = selectedRows.value[0].id;
+  form.value.id = null;
   // 鏌ヨ閲囪喘鍚堝悓鍙�
   form.value.registrationtDate = getCurrentDate();
   form.value.paymentDate = getCurrentDate();
-  form.value.registrant = userStore.name
-  dialogFormVisible.value = true
-}
+  form.value.registrant = userStore.name;
+  dialogFormVisible.value = true;
+};
 // 閫夋嫨鍙戠エ鍙蜂互鍚庣粰鍙戠エ閲戦璧嬪��
 const setInvoiceAmount = (value) => {
   if (value) {
-    invoiceNumberList.value.forEach(item => {
+    invoiceNumberList.value.forEach((item) => {
       if (item.invoiceNumber === value) {
-        form.value.invoiceAmount = item.invoiceAmount
-        form.value.ticketRegistrationId = item.id
+        form.value.invoiceAmount = item.invoiceAmount;
+        form.value.ticketRegistrationId = item.id;
       }
-    })
+    });
   } else {
-    form.value.invoiceAmount = ''
+    form.value.invoiceAmount = "";
   }
-}
+};
 // 閫夋嫨閲囪喘鍚堝悓鍙疯祴鍊�
 const setInfo = (value) => {
   getTicketNo({ id: value }).then((res) => {
-    invoiceNumberList.value = res.data
-  })
+    invoiceNumberList.value = res.data;
+  });
   if (value) {
-    byPurchaseId(value).then(res => {
-      form.value.salesContractNo = res.data.salesContractNo
-      form.value.supplierName = res.data.supplierName
-      form.value.taxRate = res.data.taxRate
-      form.value.supplierId = res.data.supplierId
-    })
+    byPurchaseId(value).then((res) => {
+      form.value.salesContractNo = res.data.salesContractNo;
+      form.value.supplierName = res.data.supplierName;
+      form.value.taxRate = res.data.taxRate;
+      form.value.supplierId = res.data.supplierId;
+    });
   } else {
-    form.value.salesContractNo = ''
-    form.value.supplierName = ''
-    form.value.taxRate = ''
-    form.value.supplierId = ''
+    form.value.salesContractNo = "";
+    form.value.supplierName = "";
+    form.value.taxRate = "";
+    form.value.supplierId = "";
   }
-}
+};
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate(valid => {
+  proxy.$refs["formRef"].validate((valid) => {
     if (valid) {
       if (operationType.value === "edit") {
-        submitEdit()
+        submitEdit();
       } else {
-        submitAdd()
+        submitAdd();
       }
     }
-  })
-}
+  });
+};
 // 鎻愪氦鏂板
 const submitAdd = () => {
-  paymentRegistrationAdd(form.value).then(res => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-    closeDia()
-    getList()
-  })
-}
+  paymentRegistrationAdd(form.value).then((res) => {
+    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+    closeDia();
+    getList();
+  });
+};
 // 鎻愪氦淇敼
 const submitEdit = () => {
-  paymentRegistrationEdit(form.value).then(res => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-    closeDia()
-    getList()
-  })
-}
+  paymentRegistrationEdit(form.value).then((res) => {
+    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+    closeDia();
+    getList();
+  });
+};
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef")
-  dialogFormVisible.value = false
-}
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+};
 // 鍒犻櫎
 const handleDelete = () => {
-  let ids = []
+  let ids = [];
   if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map(item => item.id);
+    ids = selectedRows.value.map((item) => item.id);
   } else {
-    proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
-    return
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
   }
-  ElMessageBox.confirm(
-    '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
-    '鍒犻櫎鎻愮ず', {
-    confirmButtonText: '纭',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning',
-  }
-  ).then(() => {
-    tableLoading.value = true
-    paymentRegistrationDel(ids).then(res => {
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
-      getList()
-    }).finally(() => {
-      tableLoading.value = false
-    })
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      tableLoading.value = true;
+      paymentRegistrationDel(ids)
+        .then((res) => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          getList();
+        })
+        .finally(() => {
+          tableLoading.value = false;
+        });
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 // 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
 function getCurrentDate() {
   const today = new Date();
   const year = today.getFullYear();
-  const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮�
-  const day = String(today.getDate()).padStart(2, '0');
+  const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
+  const day = String(today.getDate()).padStart(2, "0");
   return `${year}-${month}-${day}`;
 }
-getList()
+getList();
 </script>
 
-<style scoped lang="scss"></style>
+<style scoped lang="scss">
+.table_list {
+  margin-top: unset;
+}
+</style>
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index b0f9a92..69a0947 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -41,33 +41,38 @@
               type="index"
               width="60"
             />
+            <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
             <el-table-column
-              v-for="(item, index) in tableColumn"
-              :key="index"
-              :column-key="item.columnKey"
-              :filter-method="item.filterHandler"
-              :filter-multiple="item.filterMultiple"
-              :filtered-value="item.filteredValue"
-              :filters="item.filters"
-              :fixed="item.fixed"
-              :label="item.label"
-              :prop="item.prop"
+              label="鍙戠エ閲戦(鍏�)"
+              prop="invoiceAmount"
               show-overflow-tooltip
-              :align="item.align"
-              :sortable="!!item.sortable"
-              :type="item.type"
-              :width="item.width"
               :formatter="formattedNumber"
+            />
+            <el-table-column
+              label="浠樻閲戦(鍏�)"
+              prop="paymentAmount"
+              show-overflow-tooltip
+              :formatter="formattedNumber"
+            />
+            <el-table-column
+              label="搴斾粯閲戦(鍏�)"
+              prop="payableAmount"
+              show-overflow-tooltip
             >
+              <template #default="{ row, column }">
+                <el-text type="danger">
+                  {{ formattedNumber(row, column, row.payableAmount) }}
+                </el-text>
+              </template>
             </el-table-column>
           </el-table>
           <pagination
-              v-show="total > 0"
-              @pagination="paginationSearch"
-              :total="total"
-              :layout="page.layout"
-              :page="page.current"
-              :limit="page.size"
+            v-show="total > 0"
+            @pagination="paginationSearch"
+            :total="total"
+            :layout="page.layout"
+            :page="page.current"
+            :limit="page.size"
           />
         </div>
       </el-col>
@@ -80,14 +85,20 @@
             :tableLoading="tableLoadingSon"
             :isShowSummary="isShowSummarySon"
             :summaryMethod="summarizeMainTable1"
-          ></PIMTable>
+          >
+            <template #payableAmountSlot="{ row }">
+              <el-text type="danger">
+                {{ parseFloat(row.payableAmount).toFixed(2) }}
+              </el-text>
+            </template>
+          </PIMTable>
           <pagination
-              v-show="sonTotal > 0"
-              :total="sonTotal"
-              @pagination="sonPaginationSearch"
-              :layout="page.layout"
-              :page="sonPage.current"
-              :limit="sonPage.size"
+            v-show="sonTotal > 0"
+            :total="sonTotal"
+            @pagination="sonPaginationSearch"
+            :layout="page.layout"
+            :page="sonPage.current"
+            :limit="sonPage.size"
           />
         </div>
       </el-col>
@@ -98,7 +109,10 @@
 <script setup>
 import { ref, toRefs } from "vue";
 import { Search } from "@element-plus/icons-vue";
-import { paymentLedgerList,paymentRecordList } from "@/api/procurementManagement/paymentLedger.js";
+import {
+  paymentLedgerList,
+  paymentRecordList,
+} from "@/api/procurementManagement/paymentLedger.js";
 import Pagination from "../../../components/PIMTable/Pagination.vue";
 
 const tableColumn = ref([
@@ -138,10 +152,10 @@
 const sonTotal = ref(0);
 const isShowSummary = ref(true);
 const { searchForm } = toRefs(data);
-const currentSupplierId = ref('')
+const currentSupplierId = ref("");
 const rowClick = (row) => {
   currentSupplierId.value = row.supplierId;
-  getPaymenRecordtList(row.supplierId)
+  getPaymenRecordtList(row.supplierId);
 };
 // 瀛愭ā鍧�
 const tableColumnSon = ref([
@@ -154,21 +168,19 @@
     prop: "invoiceAmount",
     formatData: (params) => {
       return parseFloat(params).toFixed(2);
-    }
+    },
   },
   {
     label: "浠樻閲戦(鍏�)",
     prop: "currentPaymentAmount",
     formatData: (params) => {
       return parseFloat(params).toFixed(2);
-    }
+    },
   },
   {
     label: "搴斾粯閲戦(鍏�)",
-    prop: "payableAmount",
-    formatData: (params) => {
-      return parseFloat(params).toFixed(2);
-    }
+    dataType: "slot",
+    slot: "payableAmountSlot",
   },
 ]);
 const tableDataSon = ref([]);
@@ -177,34 +189,45 @@
 const isShowSummarySon = ref(true);
 const detailPageNum = ref(1);
 const detailPageSize = ref(10);
-const { proxy } = getCurrentInstance()
+const { proxy } = getCurrentInstance();
 
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ['invoiceAmount', 'paymentAmount', 'payableAmount'], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
+  return proxy.summarizeTable(
+    param,
+    ["invoiceAmount", "paymentAmount", "payableAmount"],
+    {
+      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+    }
+  );
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeMainTable1 = (param) => {
-  let summarizeTable = proxy.summarizeTable(param, ['invoiceAmount', 'currentPaymentAmount'], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
-  if(originalTableDataSon.value.length > 0) {
-    summarizeTable[summarizeTable.length -1] = originalTableDataSon.value[originalTableDataSon.value.length - 1].payableAmount.toFixed(2)
-  }else {
-    summarizeTable[summarizeTable.length -1] = 0.00
+  let summarizeTable = proxy.summarizeTable(
+    param,
+    ["invoiceAmount", "currentPaymentAmount"],
+    {
+      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+    }
+  );
+  if (originalTableDataSon.value.length > 0) {
+    summarizeTable[summarizeTable.length - 1] =
+      originalTableDataSon.value[
+        originalTableDataSon.value.length - 1
+      ].payableAmount.toFixed(2);
+  } else {
+    summarizeTable[summarizeTable.length - 1] = 0.0;
   }
-  return summarizeTable
+  return summarizeTable;
 };
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
   page.current = 1;
   getList();
 };
-const paginationSearch = ( obj) => {
+const paginationSearch = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
   getList();
@@ -221,25 +244,26 @@
     tableLoading.value = false;
     tableData.value = result.records || [];
     total.value = result.total || 0;
-    if(tableData.value.length > 0) {
+    if (tableData.value.length > 0) {
       getPaymenRecordtList(tableData.value[0].supplierId);
-      currentSupplierId.value = tableData.value[0].supplierId
+      currentSupplierId.value = tableData.value[0].supplierId;
     }
-
   });
 };
 
 const getPaymenRecordtList = (supplierId) => {
   tableLoadingSon.value = true;
-  paymentRecordList(supplierId).then(res => {
-    tableLoadingSon.value = false;
-    tableDataSon.value = res.data
-    handlePagination({ page: 1, limit: sonPage.size });
-    sonTotal.value = res.data.length
-  }).catch((e) => {
-    tableLoadingSon.value = false;
-  })
-}
+  paymentRecordList(supplierId)
+    .then((res) => {
+      tableLoadingSon.value = false;
+      tableDataSon.value = res.data;
+      handlePagination({ page: 1, limit: sonPage.size });
+      sonTotal.value = res.data.length;
+    })
+    .catch((e) => {
+      tableLoadingSon.value = false;
+    });
+};
 const handlePagination = ({ page, limit }) => {
   sonPage.current = page;
   sonPage.size = limit;
@@ -248,24 +272,23 @@
   const end = start + limit;
 
   originalTableDataSon.value = tableDataSon.value.slice(start, end);
-}
+};
 
 const sonPaginationSearch = (pagination) => {
   // 鎺ユ敹鍒嗛〉鍣ㄥ弬鏁� { page, limit }
   handlePagination(pagination);
-}
+};
 const formattedNumber = (row, column, cellValue) => {
-  if (column.property !== 'supplierName') {
+  if (column.property !== "supplierName") {
     return parseFloat(cellValue).toFixed(2);
   } else {
-    return cellValue
+    return cellValue;
   }
 };
 getList();
 </script>
 
 <style scoped lang="scss">
-
 .el-pagination {
   width: 100%;
   height: 55px;
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/index.vue b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
index ff9af3b..6ae4766 100644
--- a/src/views/procurementManagement/procurementInvoiceLedger/index.vue
+++ b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
@@ -4,193 +4,306 @@
       <div>
         <span class="search_title">閲囪喘鍚堝悓鍙凤細</span>
         <el-input
-            v-model="searchForm.purchaseContractNumber"
-            style="width: 240px"
-            placeholder="璇疯緭鍏�"
-            @change="handleQuery"
-            clearable
-            :prefix-icon="Search"
+          v-model="searchForm.purchaseContractNumber"
+          style="width: 240px"
+          placeholder="璇疯緭鍏�"
+          @change="handleQuery"
+          clearable
+          :prefix-icon="Search"
         />
         <span class="search_title" style="margin-left: 10px">渚涘簲鍟嗭細</span>
         <el-input
-            v-model="searchForm.supplierName"
-            style="width: 240px"
-            placeholder="璇疯緭鍏�"
-            @change="handleQuery"
-            clearable
-            :prefix-icon="Search"
+          v-model="searchForm.supplierName"
+          style="width: 240px"
+          placeholder="璇疯緭鍏�"
+          @change="handleQuery"
+          clearable
+          :prefix-icon="Search"
         />
         <span class="search_title" style="margin-left: 10px">鏉ョエ鏃ユ湡锛�</span>
         <el-date-picker
-            style="width: 240px"
-            v-model="searchForm.issueDate"
-            value-format="YYYY-MM-DD"
-            format="YYYY-MM-DD"
-            type="date"
-            placeholder="璇烽�夋嫨"
-            clearable
+          style="width: 240px"
+          v-model="searchForm.issueDate"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+          type="daterange"
+          start-placeholder="寮�濮嬫椂闂�"
+          end-placeholder="缁撴潫鏃堕棿"
+          clearable
+          @change="changeDateRange"
+          @clear="clearRange"
         />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+          >鎼滅储</el-button
+        >
       </div>
       <div>
         <el-button @click="handleOut">瀵煎嚭</el-button>
       </div>
     </div>
     <div class="table_list">
-      <el-table :data="tableData" border v-loading="tableLoading"
-        :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary :summary-method="summarizeMainTable"
-        @expand-change="expandChange" height="calc(100vh - 18.5em)">
-        <el-table-column align="center"  label="搴忓彿" type="index" width="55" />
+      <el-table
+        :data="tableData"
+        border
+        v-loading="tableLoading"
+        :expand-row-keys="expandedRowKeys"
+        :row-key="(row) => row.id"
+        show-summary
+        :summary-method="summarizeMainTable"
+        @expand-change="expandChange"
+        height="calc(100vh - 18.5em)"
+      >
+        <el-table-column align="center" label="搴忓彿" type="index" width="55" />
         <el-table-column type="expand">
           <template #default="props">
-            <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable">
-              <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+            <el-table
+              :data="props.row.children"
+              border
+              show-summary
+              :summary-method="summarizeChildrenTable"
+            >
+              <el-table-column
+                align="center"
+                label="搴忓彿"
+                type="index"
+                width="60"
+              />
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
               <el-table-column label="鍗曚綅" prop="unit" />
               <el-table-column label="鏁伴噺" prop="quantity" />
               <el-table-column label="绋庣巼(%)" prop="taxRate" />
-              <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
-              <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
-              <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
+              <el-table-column
+                label="鍚◣鍗曚环(鍏�)"
+                prop="taxInclusiveUnitPrice"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="鍚◣鎬讳环(鍏�)"
+                prop="taxInclusiveTotalPrice"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="涓嶅惈绋庢�讳环(鍏�)"
+                prop="taxExclusiveTotalPrice"
+                :formatter="formattedNumber"
+              />
               <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" />
-              <el-table-column label="鏈鏉ョエ閲戦(鍏�)" prop="ticketsAmount" :formatter="formattedNumber" />
+              <el-table-column
+                label="鏈鏉ョエ閲戦(鍏�)"
+                prop="ticketsAmount"
+                :formatter="formattedNumber"
+              />
               <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets" />
-              <el-table-column label="鏈潵绁ㄩ噾棰�(鍏�)" prop="futureTicketsAmount" :formatter="formattedNumber" />
+              <el-table-column
+                label="鏈潵绁ㄩ噾棰�(鍏�)"
+                prop="futureTicketsAmount"
+                :formatter="formattedNumber"
+              />
             </el-table>
           </template>
         </el-table-column>
-        <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" show-overflow-tooltip />
-        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip />
-        <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" show-overflow-tooltip />
-        <el-table-column label="鍙戠エ鍙�" prop="invoiceNumber" show-overflow-tooltip />
-        <el-table-column label="鍚堝悓閲戦(鍏�)" prop="invoiceAmount" show-overflow-tooltip :formatter="formattedNumber" />
+        <el-table-column
+          label="閲囪喘鍚堝悓鍙�"
+          prop="purchaseContractNumber"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="閿�鍞悎鍚屽彿"
+          prop="salesContractNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="渚涘簲鍟嗗悕绉�"
+          prop="supplierName"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍙戠エ鍙�"
+          prop="invoiceNumber"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍚堝悓閲戦(鍏�)"
+          prop="invoiceAmount"
+          show-overflow-tooltip
+          :formatter="formattedNumber"
+        />
         <el-table-column label="寮�绁ㄤ汉" prop="issUer" show-overflow-tooltip />
-        <el-table-column label="寮�绁ㄦ棩鏈�" prop="issueDate" show-overflow-tooltip />
+        <el-table-column
+          label="寮�绁ㄦ棩鏈�"
+          prop="issueDate"
+          show-overflow-tooltip
+        />
       </el-table>
-      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
-        :page="page.current" :limit="page.size" @pagination="paginationChange" />
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current"
+        :limit="page.size"
+        @pagination="paginationChange"
+      />
     </div>
   </div>
 </template>
 
 <script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import {Search} from "@element-plus/icons-vue";
-import {ElMessageBox } from "element-plus";
-import {productRecordList} from "@/api/procurementManagement/procurementInvoiceLedger.js";
-import {
-  invoiceListPage
-} from "@/api/procurementManagement/procurementInvoiceLedger.js";
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const tableLoading = ref(false)
+import pagination from "@/components/PIMTable/Pagination.vue";
+import { ref } from "vue";
+import { Search } from "@element-plus/icons-vue";
+import { ElMessageBox } from "element-plus";
+import { productRecordList } from "@/api/procurementManagement/procurementInvoiceLedger.js";
+import { invoiceListPage } from "@/api/procurementManagement/procurementInvoiceLedger.js";
+import dayjs from "dayjs";
+
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const tableLoading = ref(false);
 const page = reactive({
   current: 1,
   size: 100,
-})
-const total = ref(0)
+});
+const total = ref(0);
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-  const data = reactive({
+const data = reactive({
   searchForm: {
-    purchaseContractNumber: '',
-    supplierName: '',
-    issueDate:''
+    purchaseContractNumber: "",
+    supplierName: "",
+    issueDate: [
+      dayjs().startOf("month").format("YYYY-MM-DD"),
+      dayjs().endOf("month").format("YYYY-MM-DD"),
+    ],
+    issueDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
+    issueDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
   },
   form: {
-    issueDate:"",// 寮�绁ㄦ棩鏈�
-    purchaseLedgerId: '',
-    purchaseLedgerNo: '',
-    issUerId: '', // 寮�绁ㄤ汉id
-    issUer: '' ,// 寮�绁ㄤ汉濮撳悕
+    issueDate: "", // 寮�绁ㄦ棩鏈�
+    purchaseLedgerId: "",
+    purchaseLedgerNo: "",
+    issUerId: "", // 寮�绁ㄤ汉id
+    issUer: "", // 寮�绁ㄤ汉濮撳悕
   },
   rules: {
-    purchaseLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-  }
-})
-const { searchForm } = toRefs(data)
+    purchaseLedgerId: [
+      { required: true, message: "璇烽�夋嫨", trigger: "change" },
+    ],
+  },
+});
+const { searchForm } = toRefs(data);
 
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1
-  getList()
-}
+  page.current = 1;
+  getList();
+};
 const paginationChange = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
-  getList()
-}
+  getList();
+};
 const getList = () => {
-  tableLoading.value = true
-  invoiceListPage({ ...searchForm.value, ...page }).then(res => {
-    tableLoading.value = false
-    tableData.value = res.records
-    tableData.value.map(item => {
-      item.children = []
+  tableLoading.value = true;
+  const { issueDate, ...rest } = searchForm.value;
+  invoiceListPage({ ...rest, ...page })
+    .then((res) => {
+      tableLoading.value = false;
+      tableData.value = res.records;
+      tableData.value.map((item) => {
+        item.children = [];
+      });
+      total.value = res.total;
+      expandedRowKeys.value = [];
     })
-    total.value = res.total
-    expandedRowKeys.value = []
-  }).catch(() => {
-    tableLoading.value = false
-  })
-}
+    .catch(() => {
+      tableLoading.value = false;
+    });
+};
 const formattedNumber = (row, column, cellValue) => {
   return parseFloat(cellValue).toFixed(2);
 };
 // 琛ㄦ牸閫夋嫨鏁版嵁
-const expandedRowKeys = ref([])
+const expandedRowKeys = ref([]);
 // 灞曞紑琛�
 const expandChange = (row, expandedRows) => {
   if (expandedRows.length > 0) {
-    expandedRowKeys.value = []
+    expandedRowKeys.value = [];
     try {
-      productRecordList({ id: row.id }).then(res => {
-        const index = tableData.value.findIndex(item => item.id === row.id);
+      productRecordList({ id: row.id }).then((res) => {
+        const index = tableData.value.findIndex((item) => item.id === row.id);
         if (index > -1) {
           tableData.value[index].children = res;
         }
-        expandedRowKeys.value.push(row.id)
-      })
+        expandedRowKeys.value.push(row.id);
+      });
     } catch (error) {
-      console.log(error)
+      console.log(error);
     }
   } else {
-    expandedRowKeys.value = []
+    expandedRowKeys.value = [];
   }
-}
+};
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ['invoiceAmount'], {
+  return proxy.summarizeTable(param, ["invoiceAmount"], {
     ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
     futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
   });
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeChildrenTable = (param) => {
-  return proxy.summarizeTable(param, ['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice', 'ticketsNum', 'ticketsAmount', 'futureTickets', 'futureTicketsAmount'], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
+  return proxy.summarizeTable(
+    param,
+    [
+      "taxInclusiveUnitPrice",
+      "taxInclusiveTotalPrice",
+      "taxExclusiveTotalPrice",
+      "ticketsNum",
+      "ticketsAmount",
+      "futureTickets",
+      "futureTicketsAmount",
+    ],
+    {
+      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+    }
+  );
 };
 
 // 瀵煎嚭
 const handleOut = () => {
-  ElMessageBox.confirm(
-    '閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�',
-    '瀵煎嚭', {
-    confirmButtonText: '纭',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning',
-  }
-  ).then(() => {
-    proxy.download("/purchase/registration/export", {}, '鏉ョエ鐧昏.xlsx')
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
-getList()
+    .then(() => {
+      proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
+
+const changeDateRange = (date) => {
+  if (date) {
+    searchForm.receiptPaymentDateStart = date[0];
+    searchForm.receiptPaymentDateEnd = date[1];
+    getList();
+  }
+};
+
+const clearRange = () => {
+  searchForm.value.issueDate = [];
+  searchForm.value.issueDateStart = undefined;
+  searchForm.value.issueDateEnd = undefined;
+  getList();
+};
+
+onMounted(() => {
+  getList();
+});
 </script>
 
 <style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 86e9e86..d360763 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -4,14 +4,16 @@
       <div>
         <span class="search_title">閲囪喘鍚堝悓鍙凤細</span>
         <el-input
-            v-model="searchForm.purchaseContractNumber"
-            style="width: 240px"
-            placeholder="璇疯緭鍏�"
-            @change="handleQuery"
-            clearable
-            prefix-icon="Search"
+          v-model="searchForm.purchaseContractNumber"
+          style="width: 240px"
+          placeholder="璇疯緭鍏�"
+          @change="handleQuery"
+          clearable
+          prefix-icon="Search"
         />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+          >鎼滅储</el-button
+        >
       </div>
       <div>
         <el-button type="primary" @click="openForm('add')">鏂板鍙拌处</el-button>
@@ -20,61 +22,156 @@
       </div>
     </div>
     <div class="table_list">
-      <el-table :data="tableData" border v-loading="tableLoading"
-                @selection-change="handleSelectionChange"
-                :expand-row-keys="expandedRowKeys"
-                :row-key="row => row.id"
-                show-summary
-                :summary-method="summarizeMainTable"
-                @expand-change="expandChange"
-                height="calc(100vh - 18.5em)">
+      <el-table
+        :data="tableData"
+        border
+        v-loading="tableLoading"
+        @selection-change="handleSelectionChange"
+        :expand-row-keys="expandedRowKeys"
+        :row-key="(row) => row.id"
+        show-summary
+        :summary-method="summarizeMainTable"
+        @expand-change="expandChange"
+        height="calc(100vh - 18.5em)"
+      >
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column type="expand">
           <template #default="props">
-            <el-table :data="props.row.children" border
-                      show-summary
-                      :summary-method="summarizeChildrenTable">
-              <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+            <el-table
+              :data="props.row.children"
+              border
+              show-summary
+              :summary-method="summarizeChildrenTable"
+            >
+              <el-table-column
+                align="center"
+                label="搴忓彿"
+                type="index"
+                width="60"
+              />
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
               <el-table-column label="鍗曚綅" prop="unit" />
               <el-table-column label="鏁伴噺" prop="quantity" />
               <el-table-column label="绋庣巼(%)" prop="taxRate" />
-              <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
-              <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
-              <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
+              <el-table-column
+                label="鍚◣鍗曚环(鍏�)"
+                prop="taxInclusiveUnitPrice"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="鍚◣鎬讳环(鍏�)"
+                prop="taxInclusiveTotalPrice"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="涓嶅惈绋庢�讳环(鍏�)"
+                prop="taxExclusiveTotalPrice"
+                :formatter="formattedNumber"
+              />
             </el-table>
           </template>
         </el-table-column>
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" show-overflow-tooltip/>
-        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip/>
-        <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" show-overflow-tooltip/>
-        <el-table-column label="椤圭洰鍚嶇О" prop="projectName" show-overflow-tooltip/>
-        <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" show-overflow-tooltip :formatter="formattedNumber"/>
-        <el-table-column label="褰曞叆浜�" prop="recorderName" show-overflow-tooltip/>
-        <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" show-overflow-tooltip/>
-        <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
+        <el-table-column
+          label="閲囪喘鍚堝悓鍙�"
+          prop="purchaseContractNumber"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="閿�鍞悎鍚屽彿"
+          prop="salesContractNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="渚涘簲鍟嗗悕绉�"
+          prop="supplierName"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="椤圭洰鍚嶇О"
+          prop="projectName"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍚堝悓閲戦(鍏�)"
+          prop="contractAmount"
+          show-overflow-tooltip
+          :formatter="formattedNumber"
+        />
+        <el-table-column
+          label="褰曞叆浜�"
+          prop="recorderName"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="褰曞叆鏃ユ湡"
+          prop="entryDate"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          fixed="right"
+          label="鎿嶄綔"
+          min-width="60"
+          align="center"
+        >
           <template #default="scope">
-            <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">缂栬緫</el-button>
+            <el-button
+              link
+              type="primary"
+              size="small"
+              @click="openForm('edit', scope.row)"
+              >缂栬緫</el-button
+            >
           </template>
         </el-table-column>
       </el-table>
-      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current"
-                  :limit="page.size" @pagination="paginationChange" />
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current"
+        :limit="page.size"
+        @pagination="paginationChange"
+      />
     </div>
-    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板閲囪喘鍙拌处椤甸潰' : '缂栬緫閲囪喘鍙拌处椤甸潰'" width="70%" @close="closeDia">
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+    <el-dialog
+      v-model="dialogFormVisible"
+      :title="operationType === 'add' ? '鏂板閲囪喘鍙拌处椤甸潰' : '缂栬緫閲囪喘鍙拌处椤甸潰'"
+      width="70%"
+      @close="closeDia"
+    >
+      <el-form
+        :model="form"
+        label-width="140px"
+        label-position="top"
+        :rules="rules"
+        ref="formRef"
+      >
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
-              <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="form.purchaseContractNumber"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesLedgerId">
-              <el-select v-model="form.salesLedgerId" placeholder="璇烽�夋嫨" clearable @change="salesLedgerChange">
-                <el-option v-for="item in salesContractList" :key="item.id" :label="item.salesContractNo" :value="item.id"/>
+              <el-select
+                v-model="form.salesLedgerId"
+                placeholder="璇烽�夋嫨"
+                clearable
+                @change="salesLedgerChange"
+              >
+                <el-option
+                  v-for="item in salesContractList"
+                  :key="item.id"
+                  :label="item.salesContractNo"
+                  :value="item.id"
+                />
               </el-select>
             </el-form-item>
           </el-col>
@@ -82,67 +179,137 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierId">
-              <el-select v-model="form.supplierId" placeholder="璇烽�夋嫨" clearable>
-                <el-option v-for="item in supplierList" :key="item.id" :label="item.supplierName" :value="item.id"/>
+              <el-select
+                v-model="form.supplierId"
+                placeholder="璇烽�夋嫨"
+                clearable
+              >
+                <el-option
+                  v-for="item in supplierList"
+                  :key="item.id"
+                  :label="item.supplierName"
+                  :value="item.id"
+                />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="form.projectName"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="褰曞叆浜猴細" prop="recorderId">
-              <el-select v-model="form.recorderId" placeholder="璇烽�夋嫨" clearable disabled>
-                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/>
+              <el-select
+                v-model="form.recorderId"
+                placeholder="璇烽�夋嫨"
+                clearable
+                disabled
+              >
+                <el-option
+                  v-for="item in userList"
+                  :key="item.userId"
+                  :label="item.nickName"
+                  :value="item.userId"
+                />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
               <el-date-picker
-                  disabled
-                  style="width: 100%"
-                  v-model="form.entryDate"
-                  value-format="YYYY-MM-DD"
-                  format="YYYY-MM-DD"
-                  type="date"
-                  placeholder="璇烽�夋嫨"
-                  clearable
+                disabled
+                style="width: 100%"
+                v-model="form.entryDate"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                type="date"
+                placeholder="璇烽�夋嫨"
+                clearable
               />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
-            <el-button type="primary" @click="openProductForm('add')">娣诲姞</el-button>
-            <el-button plain type="danger" @click="deleteProduct">鍒犻櫎</el-button>
+            <el-button type="primary" @click="openProductForm('add')"
+              >娣诲姞</el-button
+            >
+            <el-button plain type="danger" @click="deleteProduct"
+              >鍒犻櫎</el-button
+            >
           </el-form-item>
         </el-row>
-        <el-table :data="productData" border @selection-change="productSelected" show-summary :summary-method="summarizeProTable">
+        <el-table
+          :data="productData"
+          border
+          @selection-change="productSelected"
+          show-summary
+          :summary-method="summarizeProTable"
+        >
           <el-table-column align="center" type="selection" width="55" />
-          <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+          <el-table-column
+            align="center"
+            label="搴忓彿"
+            type="index"
+            width="60"
+          />
           <el-table-column label="浜у搧澶х被" prop="productCategory" />
           <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
           <el-table-column label="鍗曚綅" prop="unit" width="70" />
           <el-table-column label="鏁伴噺" prop="quantity" width="70" />
           <el-table-column label="绋庣巼(%)" prop="taxRate" width="70" />
-          <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" width="150"/>
-          <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" width="150"/>
-          <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" width="150"/>
-          <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
+          <el-table-column
+            label="鍚◣鍗曚环(鍏�)"
+            prop="taxInclusiveUnitPrice"
+            :formatter="formattedNumber"
+            width="150"
+          />
+          <el-table-column
+            label="鍚◣鎬讳环(鍏�)"
+            prop="taxInclusiveTotalPrice"
+            :formatter="formattedNumber"
+            width="150"
+          />
+          <el-table-column
+            label="涓嶅惈绋庢�讳环(鍏�)"
+            prop="taxExclusiveTotalPrice"
+            :formatter="formattedNumber"
+            width="150"
+          />
+          <el-table-column
+            fixed="right"
+            label="鎿嶄綔"
+            min-width="60"
+            align="center"
+          >
             <template #default="scope">
-              <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row, scope.$index);">缂栬緫</el-button>
+              <el-button
+                link
+                type="primary"
+                size="small"
+                @click="openProductForm('edit', scope.row, scope.$index)"
+                >缂栬緫</el-button
+              >
             </template>
           </el-table-column>
         </el-table>
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="澶囨敞路锛�" prop="remark">
-              <el-input v-model="form.remark" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2"/>
+              <el-input
+                v-model="form.remark"
+                placeholder="璇疯緭鍏�"
+                clearable
+                type="textarea"
+                :rows="2"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -150,21 +317,22 @@
           <el-col :span="24">
             <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
               <el-upload
-                  v-model:file-list="fileList"
-                  :action="upload.url"
-                  multiple
-                  ref="fileUpload"
-                  auto-upload
-                  :headers="upload.headers"
-                  :before-upload="handleBeforeUpload"
-                  :on-error="handleUploadError"
-                  :on-success="handleUploadSuccess"
-                  :on-remove="handleRemove"
+                v-model:file-list="fileList"
+                :action="upload.url"
+                multiple
+                ref="fileUpload"
+                auto-upload
+                :headers="upload.headers"
+                :before-upload="handleBeforeUpload"
+                :on-error="handleUploadError"
+                :on-success="handleUploadSuccess"
+                :on-remove="handleRemove"
               >
                 <el-button type="primary">涓婁紶</el-button>
                 <template #tip>
                   <div class="el-upload__tip">
-                    鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
+                    鏂囦欢鏍煎紡鏀寔
+                    doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
                   </div>
                 </template>
               </el-upload>
@@ -179,19 +347,31 @@
         </div>
       </template>
     </el-dialog>
-    <el-dialog v-model="productFormVisible" :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'" width="40%" @close="closeProductDia">
-      <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
+    <el-dialog
+      v-model="productFormVisible"
+      :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'"
+      width="40%"
+      @close="closeProductDia"
+    >
+      <el-form
+        :model="productForm"
+        label-width="140px"
+        label-position="top"
+        :rules="productRules"
+        ref="productFormRef"
+      >
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="浜у搧澶х被锛�" prop="productId">
               <el-tree-select
-                  v-model="productForm.productId"
-                  placeholder="璇烽�夋嫨" clearable
-                  check-strictly
-                  @change="getModels"
-                  :data="productOptions"
-                  :render-after-expand="false"
-                  style="width: 100%"
+                v-model="productForm.productId"
+                placeholder="璇烽�夋嫨"
+                clearable
+                check-strictly
+                @change="getModels"
+                :data="productOptions"
+                :render-after-expand="false"
+                style="width: 100%"
               />
             </el-form-item>
           </el-col>
@@ -199,8 +379,18 @@
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
-              <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable @change="getProductModel">
-                <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id"/>
+              <el-select
+                v-model="productForm.productModelId"
+                placeholder="璇烽�夋嫨"
+                clearable
+                @change="getProductModel"
+              >
+                <el-option
+                  v-for="item in modelOptions"
+                  :key="item.id"
+                  :label="item.model"
+                  :value="item.id"
+                />
               </el-select>
             </el-form-item>
           </el-col>
@@ -208,27 +398,48 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍗曚綅锛�" prop="unit">
-              <el-input v-model="productForm.unit" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="productForm.unit"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鏁伴噺锛�" prop="quantity">
-              <el-input v-model="productForm.quantity" placeholder="璇疯緭鍏�" clearable @change="mathNum"/>
+              <el-input
+                v-model="productForm.quantity"
+                placeholder="璇疯緭鍏�"
+                clearable
+                @change="mathNum"
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
-              <el-input-number v-model="productForm.taxInclusiveUnitPrice" :precision="2" :step="0.1" clearable style="width: 100%" @change="mathNum"/>
+              <el-input-number
+                v-model="productForm.taxInclusiveUnitPrice"
+                :precision="2"
+                :step="0.1"
+                clearable
+                style="width: 100%"
+                @change="mathNum"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="绋庣巼(%)锛�" prop="taxRate">
-              <el-select v-model="productForm.taxRate" placeholder="璇烽�夋嫨" clearable @change="mathNum">
-                <el-option label="1" value="1"/>
-                <el-option label="6" value="6"/>
-                <el-option label="13" value="13"/>
+              <el-select
+                v-model="productForm.taxRate"
+                placeholder="璇烽�夋嫨"
+                clearable
+                @change="mathNum"
+              >
+                <el-option label="1" value="1" />
+                <el-option label="6" value="6" />
+                <el-option label="13" value="13" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -236,21 +447,35 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
-              <el-input-number v-model="productForm.taxInclusiveTotalPrice" :precision="2" :step="0.1" clearable style="width: 100%" disabled/>
+              <el-input-number
+                v-model="productForm.taxInclusiveTotalPrice"
+                :precision="2"
+                :step="0.1"
+                clearable
+                style="width: 100%"
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�" prop="taxExclusiveTotalPrice">
-              <el-input v-model="productForm.taxExclusiveTotalPrice" disabled/>
+            <el-form-item
+              label="涓嶅惈绋庢�讳环(鍏�)锛�"
+              prop="taxExclusiveTotalPrice"
+            >
+              <el-input v-model="productForm.taxExclusiveTotalPrice" disabled />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍙戠エ绫诲瀷锛�" prop="invoiceType">
-              <el-select v-model="productForm.invoiceType" placeholder="璇烽�夋嫨" clearable>
-                <el-option label="澧炴櫘绁�" value="澧炴櫘绁�"/>
-                <el-option label="澧炰笓绁�" value="澧炰笓绁�"/>
+              <el-select
+                v-model="productForm.invoiceType"
+                placeholder="璇烽�夋嫨"
+                clearable
+              >
+                <el-option label="澧炴櫘绁�" value="澧炴櫘绁�" />
+                <el-option label="澧炰笓绁�" value="澧炰笓绁�" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -267,106 +492,120 @@
 </template>
 
 <script setup>
-import { getToken } from "@/utils/auth"
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import {Search} from "@element-plus/icons-vue";
-import {ElMessageBox } from "element-plus";
-import {userListNoPage} from "@/api/system/user.js";
+import { getToken } from "@/utils/auth";
+import pagination from "@/components/PIMTable/Pagination.vue";
+import { ref, onMounted } from "vue";
+import { Search } from "@element-plus/icons-vue";
+import { ElMessageBox } from "element-plus";
+import { userListNoPage } from "@/api/system/user.js";
 import {
-  getSalesLedgerWithProducts, addOrUpdateSalesLedgerProduct, delProduct, delLedgerFile
+  getSalesLedgerWithProducts,
+  addOrUpdateSalesLedgerProduct,
+  delProduct,
+  delLedgerFile,
+  getProductInfoByContractNo,
 } from "@/api/salesManagement/salesLedger.js";
 import {
   addOrEditPurchase,
   delPurchase,
   getSalesNo,
   purchaseListPage,
-  productList, getPurchaseById, getOptions
+  productList,
+  getPurchaseById,
+  getOptions,
 } from "@/api/procurementManagement/procurementLedger.js";
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const productData = ref([])
-const selectedRows = ref([])
-const productSelectedRows = ref([])
-const modelOptions = ref([])
-const userList = ref([])
-const productOptions = ref([])
-const salesContractList = ref([])
-const supplierList = ref([])
-const tableLoading = ref(false)
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const productData = ref([]);
+const selectedRows = ref([]);
+const productSelectedRows = ref([]);
+const modelOptions = ref([]);
+const userList = ref([]);
+const productOptions = ref([]);
+const salesContractList = ref([]);
+const supplierList = ref([]);
+const tableLoading = ref(false);
 const page = reactive({
   current: 1,
   size: 100,
-})
-const total = ref(0)
-const fileList = ref([])
-import useUserStore from "@/store/modules/user"
-import {modelList, productTreeList} from "@/api/basicData/product.js";
+});
+const total = ref(0);
+const fileList = ref([]);
+import useUserStore from "@/store/modules/user";
+import { modelList, productTreeList } from "@/api/basicData/product.js";
 
-const userStore = useUserStore()
+const userStore = useUserStore();
 
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref('')
-const dialogFormVisible = ref(false)
+const operationType = ref("");
+const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    purchaseContractNumber: '',
+    purchaseContractNumber: "",
   },
   form: {
-    purchaseContractNumber: '',
-    salesLedgerId: '',
-    projectName: '',
-    recorderId: '',
-    entryDate: '',
+    purchaseContractNumber: "",
+    salesLedgerId: "",
+    projectName: "",
+    recorderId: "",
+    entryDate: "",
     productData: [],
-    supplierName: '',
-    supplierId: '',
+    supplierName: "",
+    supplierId: "",
   },
   rules: {
-    purchaseContractNumber: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    purchaseContractNumber: [
+      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+    ],
     projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-  }
-})
-const { searchForm, form, rules } = toRefs(data)
+  },
+});
+const { searchForm, form, rules } = toRefs(data);
 // 浜у搧琛ㄥ崟寮规鏁版嵁
-const productFormVisible = ref(false)
-const productOperationType = ref('')
-const productOperationIndex = ref('')
-const currentId = ref('')
+const productFormVisible = ref(false);
+const productOperationType = ref("");
+const productOperationIndex = ref("");
+const currentId = ref("");
 const productFormData = reactive({
   productForm: {
-    productId: '',
-    productCategory: '',
-    productModelId: '',
-    specificationModel: '',
-    unit: '',
-    quantity: '',
-    taxInclusiveUnitPrice: '',
-    taxRate: '',
-    taxInclusiveTotalPrice: '',
-    taxExclusiveTotalPrice: '',
-    invoiceType: '',
+    productId: "",
+    productCategory: "",
+    productModelId: "",
+    specificationModel: "",
+    unit: "",
+    quantity: "",
+    taxInclusiveUnitPrice: "",
+    taxRate: "",
+    taxInclusiveTotalPrice: "",
+    taxExclusiveTotalPrice: "",
+    invoiceType: "",
   },
   productRules: {
     productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    taxInclusiveUnitPrice: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    taxInclusiveUnitPrice: [
+      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+    ],
     taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    taxInclusiveTotalPrice: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    taxExclusiveTotalPrice: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    taxInclusiveTotalPrice: [
+      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+    ],
+    taxExclusiveTotalPrice: [
+      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+    ],
     invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-  }
-})
-const { productForm, productRules } = toRefs(productFormData)
+  },
+});
+const { productForm, productRules } = toRefs(productFormData);
 const upload = reactive({
   // 涓婁紶鐨勫湴鍧�
   url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
   // 璁剧疆涓婁紶鐨勮姹傚ご閮�
   headers: { Authorization: "Bearer " + getToken() },
-})
+});
 
 const formattedNumber = (row, column, cellValue) => {
   return parseFloat(cellValue).toFixed(2);
@@ -374,200 +613,218 @@
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1
-  getList()
-}
+  page.current = 1;
+  getList();
+};
 // 瀛愯〃鍚堣鏂规硶
 const summarizeChildrenTable = (param) => {
-  return proxy.summarizeTable(param, ['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice', 'ticketsNum', 'ticketsAmount', 'futureTickets', 'futureTicketsAmount'], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
+  return proxy.summarizeTable(
+    param,
+    [
+      "taxInclusiveUnitPrice",
+      "taxInclusiveTotalPrice",
+      "taxExclusiveTotalPrice",
+      "ticketsNum",
+      "ticketsAmount",
+      "futureTickets",
+      "futureTicketsAmount",
+    ],
+    {
+      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+    }
+  );
 };
 const paginationChange = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
-  getList()
-}
+  getList();
+};
 const getList = () => {
-  tableLoading.value = true
-  purchaseListPage({...searchForm.value, ...page}).then(res => {
-    tableLoading.value = false
-    tableData.value = res.records
-    tableData.value.map(item => {
-      item.children = []
+  tableLoading.value = true;
+  purchaseListPage({ ...searchForm.value, ...page })
+    .then((res) => {
+      tableLoading.value = false;
+      tableData.value = res.records;
+      tableData.value.map((item) => {
+        item.children = [];
+      });
+      total.value = res.total;
+      expandedRowKeys.value = [];
     })
-    total.value = res.total
-    expandedRowKeys.value = []
-  }).catch(() => {
-    tableLoading.value = false
-  })
-}
+    .catch(() => {
+      tableLoading.value = false;
+    });
+};
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  selectedRows.value = selection
-}
+  selectedRows.value = selection;
+};
 const productSelected = (selectedRows) => {
-  productSelectedRows.value = selectedRows
-}
-const expandedRowKeys = ref([])
+  productSelectedRows.value = selectedRows;
+};
+const expandedRowKeys = ref([]);
 // 灞曞紑琛�
 const expandChange = (row, expandedRows) => {
   if (expandedRows.length > 0) {
-    expandedRowKeys.value = []
+    expandedRowKeys.value = [];
     try {
-      productList({salesLedgerId: row.id, type: 2}).then(res => {
-        const index = tableData.value.findIndex(item => item.id === row.id);
+      productList({ salesLedgerId: row.id, type: 2 }).then((res) => {
+        const index = tableData.value.findIndex((item) => item.id === row.id);
         if (index > -1) {
           tableData.value[index].children = res;
         }
-        expandedRowKeys.value.push(row.id)
-      })
+        expandedRowKeys.value.push(row.id);
+      });
     } catch (error) {
-      console.log(error)
+      console.log(error);
     }
   } else {
-    expandedRowKeys.value = []
+    expandedRowKeys.value = [];
   }
-}
+};
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ['contractAmount']);
+  return proxy.summarizeTable(param, ["contractAmount"]);
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeProTable = (param) => {
-  return proxy.summarizeTable(param, ['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']);
+  return proxy.summarizeTable(param, [
+    "taxInclusiveUnitPrice",
+    "taxInclusiveTotalPrice",
+    "taxExclusiveTotalPrice",
+  ]);
 };
 // 鎵撳紑寮规
 const openForm = (type, row) => {
-  operationType.value = type
-  form.value = {}
-  productData.value = []
-  fileList.value = []
-  userListNoPage().then(res => {
-    userList.value = res.data
-  })
-  getSalesNo().then(res => {
-    salesContractList.value = res
-  })
-  getOptions().then(res => {
-    supplierList.value = res.data
-  })
-  form.value.recorderId = userStore.id
+  operationType.value = type;
+  form.value = {};
+  productData.value = [];
+  fileList.value = [];
+  userListNoPage().then((res) => {
+    userList.value = res.data;
+  });
+  getSalesNo().then((res) => {
+    salesContractList.value = res;
+  });
+  getOptions().then((res) => {
+    supplierList.value = res.data;
+  });
+  form.value.recorderId = userStore.id;
   form.value.entryDate = getCurrentDate();
-  if (type === 'edit') {
+  if (type === "edit") {
     currentId.value = row.id;
-    getPurchaseById({id: row.id, type: 2}).then(res => {
-      form.value = {...res}
-      productData.value = form.value.productData
-      if(form.value.salesLedgerFiles) {
-        fileList.value = form.value.salesLedgerFiles
+    getPurchaseById({ id: row.id, type: 2 }).then((res) => {
+      form.value = { ...res };
+      productData.value = form.value.productData;
+      if (form.value.salesLedgerFiles) {
+        fileList.value = form.value.salesLedgerFiles;
       } else {
-        fileList.value = []
+        fileList.value = [];
       }
-    })
+    });
   }
-  dialogFormVisible.value = true
-}
+  dialogFormVisible.value = true;
+};
 // 涓婁紶鍓嶆牎妫�
 function handleBeforeUpload(file) {
   // 鏍℃鏂囦欢澶у皬
   if (file.size > 1024 * 1024 * 10) {
-    proxy.$modal.msgError('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!')
-    return false
+    proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
+    return false;
   }
-  proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...")
-  return true
+  proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
+  return true;
 }
 // 涓婁紶澶辫触
 function handleUploadError(err) {
-  proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触")
-  proxy.$modal.closeLoading()
+  proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
+  proxy.$modal.closeLoading();
 }
 // 涓婁紶鎴愬姛鍥炶皟
 function handleUploadSuccess(res, file, uploadFiles) {
-  proxy.$modal.closeLoading()
+  proxy.$modal.closeLoading();
   if (res.code === 200) {
-    file.tempId = res.data.tempId
-    proxy.$modal.msgSuccess("涓婁紶鎴愬姛")
+    file.tempId = res.data.tempId;
+    proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
   } else {
-    proxy.$modal.msgError(res.msg)
-    proxy.$refs.fileUpload.handleRemove(file)
+    proxy.$modal.msgError(res.msg);
+    proxy.$refs.fileUpload.handleRemove(file);
   }
 }
 // 绉婚櫎鏂囦欢
-function handleRemove (file) {
-  console.log('handleRemove', file.id)
-  if (operationType.value === 'edit') {
-    let ids = []
-    ids.push(file.id)
-    delLedgerFile(ids).then(res => {
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
-    })
+function handleRemove(file) {
+  console.log("handleRemove", file.id);
+  if (operationType.value === "edit") {
+    let ids = [];
+    ids.push(file.id);
+    delLedgerFile(ids).then((res) => {
+      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+    });
   }
 }
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate(valid => {
+  proxy.$refs["formRef"].validate((valid) => {
     if (valid) {
       if (productData.value.length > 0) {
-        form.value.productData = proxy.HaveJson(productData.value)
+        form.value.productData = proxy.HaveJson(productData.value);
       } else {
-        proxy.$modal.msgWarning('璇锋坊鍔犱骇鍝佷俊鎭�')
-        return
+        proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
+        return;
       }
-      let tempFileIds = []
+      let tempFileIds = [];
       if (fileList.value.length > 0) {
-        tempFileIds = fileList.value.map(item => item.tempId)
+        tempFileIds = fileList.value.map((item) => item.tempId);
       }
-      form.value.tempFileIds = tempFileIds
-      form.value.type = 2
-      addOrEditPurchase(form.value).then(res => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-        closeDia()
-        getList()
-      })
+      form.value.tempFileIds = tempFileIds;
+      form.value.type = 2;
+      addOrEditPurchase(form.value).then((res) => {
+        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        closeDia();
+        getList();
+      });
     }
-  })
-}
+  });
+};
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef")
-  dialogFormVisible.value = false
-}
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+};
 // 鎵撳紑浜у搧寮规
 const openProductForm = (type, row, index) => {
-  productOperationType.value = type
-  productOperationIndex.value = index
-  productForm.value = {}
-  proxy.resetForm("productFormRef")
-  if (type === 'edit') {
-    productForm.value = {...row}
+  productOperationType.value = type;
+  productOperationIndex.value = index;
+  productForm.value = {};
+  proxy.resetForm("productFormRef");
+  if (type === "edit") {
+    productForm.value = { ...row };
   }
-  productFormVisible.value = true
-  getProductOptions()
-}
+  productFormVisible.value = true;
+  getProductOptions();
+};
 const getProductOptions = () => {
-  productTreeList().then(res => {
-    productOptions.value = convertIdToValue(res)
-  })
-}
-const getModels =(value) => {
-  productForm.value.productCategory = findNodeById(productOptions.value, value)
-  modelList({id: value}).then(res => {
-    modelOptions.value = res
-  })
-}
-const getProductModel =(value) => {
-  const index = modelOptions.value.findIndex(item => item.id === value);
+  productTreeList().then((res) => {
+    productOptions.value = convertIdToValue(res);
+  });
+};
+const getModels = (value) => {
+  productForm.value.productCategory = findNodeById(productOptions.value, value);
+  modelList({ id: value }).then((res) => {
+    modelOptions.value = res;
+  });
+};
+const getProductModel = (value) => {
+  const index = modelOptions.value.findIndex((item) => item.id === value);
   if (index !== -1) {
     productForm.value.specificationModel = modelOptions.value[index].model;
     productForm.value.unit = modelOptions.value[index].unit;
   } else {
     productForm.value.specificationModel = null;
-    productForm.value.unit = null
+    productForm.value.unit = null;
   }
-}
+};
 const findNodeById = (nodes, productId) => {
   for (let i = 0; i < nodes.length; i++) {
     if (nodes[i].value === productId) {
@@ -583,11 +840,11 @@
   return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
 };
 function convertIdToValue(data) {
-  return data.map(item => {
+  return data.map((item) => {
     const { id, children, ...rest } = item;
     const newItem = {
       ...rest,
-      value: id // 灏� id 鏀逛负 value
+      value: id, // 灏� id 鏀逛负 value
     };
     if (children && children.length > 0) {
       newItem.children = convertIdToValue(children);
@@ -598,152 +855,173 @@
 }
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitProduct = () => {
-  proxy.$refs["productFormRef"].validate(valid => {
+  proxy.$refs["productFormRef"].validate((valid) => {
     if (valid) {
       if (operationType.value === "edit") {
-        submitProductEdit()
+        submitProductEdit();
       } else {
-        if (productOperationType.value === 'add') {
-          productData.value.push({...productForm.value})
-          console.log('productData.value---', productData.value)
+        if (productOperationType.value === "add") {
+          productData.value.push({ ...productForm.value });
+          console.log("productData.value---", productData.value);
         } else {
-          productData.value[productOperationIndex.value] = {...productForm.value}
+          productData.value[productOperationIndex.value] = {
+            ...productForm.value,
+          };
         }
-        closeProductDia()
+        closeProductDia();
       }
     }
-  })
-}
+  });
+};
 const submitProductEdit = () => {
-  productForm.value.salesLedgerId = currentId.value
-  productForm.value.type = 2
-  addOrUpdateSalesLedgerProduct(productForm.value).then(res => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-    closeProductDia()
-    getPurchaseById({id: currentId.value, type: 2}).then(res => {
-      productData.value = res.productData
-    })
-  })
-}
+  productForm.value.salesLedgerId = currentId.value;
+  productForm.value.type = 2;
+  addOrUpdateSalesLedgerProduct(productForm.value).then((res) => {
+    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+    closeProductDia();
+    getPurchaseById({ id: currentId.value, type: 2 }).then((res) => {
+      productData.value = res.productData;
+    });
+  });
+};
 // 鍒犻櫎浜у搧
 const deleteProduct = () => {
   if (productSelectedRows.value.length === 0) {
-    proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
-    return
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
   }
-  if (operationType.value === 'add') {
-    productSelectedRows.value.forEach(selectedRow => {
-      const index = productData.value.findIndex(product => product.id === selectedRow.id);
+  if (operationType.value === "add") {
+    productSelectedRows.value.forEach((selectedRow) => {
+      const index = productData.value.findIndex(
+        (product) => product.id === selectedRow.id
+      );
       if (index !== -1) {
         productData.value.splice(index, 1);
       }
     });
   } else {
-    let ids = []
+    let ids = [];
     if (productSelectedRows.value.length > 0) {
-      ids = productSelectedRows.value.map(item => item.id);
+      ids = productSelectedRows.value.map((item) => item.id);
     }
-    ElMessageBox.confirm(
-        '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
-        '瀵煎嚭', {
-          confirmButtonText: '纭',
-          cancelButtonText: '鍙栨秷',
-          type: 'warning',
-        }
-    ).then(() => {
-      delProduct(ids).then(res => {
-        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
-        closeProductDia()
-        getSalesLedgerWithProducts({id: currentId.value, type: 2}).then(res => {
-          productData.value = res.productData
-        })
-      })
-    }).catch(() => {
-      proxy.$modal.msg("宸插彇娑�")
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
     })
-
+      .then(() => {
+        delProduct(ids).then((res) => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          closeProductDia();
+          getSalesLedgerWithProducts({ id: currentId.value, type: 2 }).then(
+            (res) => {
+              productData.value = res.productData;
+            }
+          );
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
   }
-}
+};
 // 鍏抽棴浜у搧寮规
 const closeProductDia = () => {
-  proxy.resetForm("productFormRef")
-  productFormVisible.value = false
-}
+  proxy.resetForm("productFormRef");
+  productFormVisible.value = false;
+};
 // 瀵煎嚭
 const handleOut = () => {
-  ElMessageBox.confirm(
-      '閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�',
-      '瀵煎嚭', {
-        confirmButtonText: '纭',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning',
-      }
-  ).then(() => {
-    proxy.download("/purchase/ledger/export", {}, '閲囪喘鍙拌处.xlsx')
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      proxy.download("/purchase/ledger/export", {}, "閲囪喘鍙拌处.xlsx");
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 // 鍒犻櫎
 const handleDelete = () => {
-  let ids = []
+  let ids = [];
   if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map(item => item.id);
+    ids = selectedRows.value.map((item) => item.id);
   } else {
-    proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
-    return
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
   }
-  ElMessageBox.confirm(
-      '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
-      '瀵煎嚭', {
-        confirmButtonText: '纭',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning',
-      }
-  ).then(() => {
-    delPurchase(ids).then(res => {
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
-      getList()
-    })
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      delPurchase(ids).then((res) => {
+        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        getList();
+      });
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 // 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
 function getCurrentDate() {
   const today = new Date();
   const year = today.getFullYear();
-  const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮�
-  const day = String(today.getDate()).padStart(2, '0');
+  const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
+  const day = String(today.getDate()).padStart(2, "0");
   return `${year}-${month}-${day}`;
 }
 const mathNum = () => {
-  console.log('productForm.value',productForm.value)
-  if(!productForm.value.taxInclusiveUnitPrice){
-    return
+  console.log("productForm.value", productForm.value);
+  if (!productForm.value.taxInclusiveUnitPrice) {
+    return;
   }
-  if(!productForm.value.quantity){
-    return
+  if (!productForm.value.quantity) {
+    return;
   }
   // 鍚◣鎬讳环璁$畻
-  productForm.value.taxInclusiveTotalPrice = proxy.calculateTaxIncludeTotalPrice(productForm.value.taxInclusiveUnitPrice, productForm.value.quantity)
-  if(productForm.value.taxRate){
+  productForm.value.taxInclusiveTotalPrice =
+    proxy.calculateTaxIncludeTotalPrice(
+      productForm.value.taxInclusiveUnitPrice,
+      productForm.value.quantity
+    );
+  if (productForm.value.taxRate) {
     // 涓嶅惈绋庢�讳环璁$畻
-    productForm.value.taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(productForm.value.taxInclusiveTotalPrice, productForm.value.taxRate)
+    productForm.value.taxExclusiveTotalPrice =
+      proxy.calculateTaxExclusiveTotalPrice(
+        productForm.value.taxInclusiveTotalPrice,
+        productForm.value.taxRate
+      );
   }
-}
+};
 // 閿�鍞悎鍚岄�夋嫨鏀瑰彉鏂规硶
-const salesLedgerChange = (row) => {
-  console.log('row',row)
-  var index = salesContractList.value.findIndex(item => item.id == row);
-  console.log('index',index)
-  if(index > -1){
-    form.value.projectName = salesContractList.value[index].projectName
+const salesLedgerChange = async (row) => {
+  console.log("row", row);
+  var index = salesContractList.value.findIndex((item) => item.id == row);
+  console.log("index", index);
+  if (index > -1) {
+    form.value.projectName = salesContractList.value[index].projectName;
+    await querygProductInfoByContractNo();
   }
-}
-getList()
+};
+
+const querygProductInfoByContractNo = async () => {
+  const { code, data } = await getProductInfoByContractNo({
+    contractNo: form.value.salesLedgerId,
+  });
+  if (code == 200) {
+    productData.value = data;
+  }
+};
+
+onMounted(() => {
+  getList();
+});
 </script>
 
-<style scoped lang="scss">
-
-</style>
+<style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/reportAnalysis/projectProfit/index.vue b/src/views/procurementManagement/reportAnalysis/projectProfit/index.vue
new file mode 100644
index 0000000..0f10543
--- /dev/null
+++ b/src/views/procurementManagement/reportAnalysis/projectProfit/index.vue
@@ -0,0 +1,102 @@
+<template>
+  <div class="app-container">
+    <el-form class="search_form" :inline="true" label-width="80px">
+      <el-form-item label="瀹㈡埛鍚嶇О">
+        <el-input v-model="filters.customerName" placeholder="璇疯緭鍏ュ鎴峰悕绉�" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button>
+        <el-button @click="resetFilters"> 閲嶇疆 </el-button>
+      </el-form-item>
+    </el-form>
+    <div class="table_list">
+      <PIMTable
+        :column="columns"
+        :tableLoading="loading"
+        :tableData="dataList"
+        :page="{
+          current: pagination.currentPage,
+          size: pagination.pageSize,
+        }"
+        @pagination="onCurrentChange"
+      ></PIMTable>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { usePaginationApi } from "@/hooks/usePaginationApi";
+import { getPurchaseList } from "@/api/procurementManagement/projectProfit";
+import { onMounted } from "vue";
+
+defineOptions({
+  name: "椤圭洰鍒╂鼎",
+});
+
+const {
+  loading,
+  filters,
+  columns,
+  dataList,
+  pagination,
+  getTableData,
+  resetFilters,
+  onCurrentChange,
+} = usePaginationApi(
+  getPurchaseList,
+  {
+    customerName: undefined,
+  },
+  [
+    {
+      label: "閿�鍞悎鍚屽彿",
+      align: "center",
+      prop: "customerContractNo",
+    },
+    {
+      label: "瀹㈡埛鍚嶇О",
+      align: "center",
+      prop: "customerName",
+    },
+    {
+      label: "椤圭洰鍚嶇О",
+      align: "center",
+      prop: "projectName",
+    },
+    {
+      label: "鍚堝悓閲戦",
+      align: "center",
+      prop: "contractAmount",
+    },
+    {
+      label: "閲囪喘閲戦",
+      align: "center",
+      prop: "purchaseAmount",
+    },
+    {
+      label: "鍒╂鼎",
+      align: "center",
+      prop: "balance",
+    },
+    {
+      label: "鍒╂鼎鐜�",
+      align: "center",
+      prop: "balanceRatio",
+    },
+    {
+      label: "澧炲�肩◣",
+      align: "center",
+      prop: "balanceAmount",
+    },
+  ]
+);
+
+onMounted(() => {
+  getTableData();
+});
+</script>
+<style lang="scss" scoped>
+.table_list {
+  margin-top: unset;
+}
+</style>
diff --git a/src/views/salesManagement/invoiceLedger/index.vue b/src/views/salesManagement/invoiceLedger/index.vue
index d5f5d76..fe2ca15 100644
--- a/src/views/salesManagement/invoiceLedger/index.vue
+++ b/src/views/salesManagement/invoiceLedger/index.vue
@@ -1,69 +1,149 @@
 <template>
   <div class="app-container">
     <div class="search_form">
-      <div>
-        <span class="search_title">瀹㈡埛鍚嶇О/鍚堝悓鍙凤細</span>
-        <el-input
+      <el-form :inline="true" :model="searchForm">
+        <el-form-item label="瀹㈡埛鍚嶇О/鍚堝悓鍙�">
+          <el-input
             v-model="searchForm.searchText"
             style="width: 240px"
             placeholder="杈撳叆瀹㈡埛鍚嶇О/鍚堝悓鍙锋悳绱�"
             @change="handleQuery"
             clearable
             :prefix-icon="Search"
-        />
-        <span class="search_title" style="margin-left: 10px">寮�绁ㄦ棩鏈燂細</span>
-        <el-date-picker
+          />
+        </el-form-item>
+        <el-form-item label="寮�绁ㄦ棩鏈�">
+          <el-date-picker
             style="width: 240px"
             v-model="searchForm.invoiceDate"
             value-format="YYYY-MM-DD"
             format="YYYY-MM-DD"
-            type="date"
-            placeholder="璇烽�夋嫨"
+            type="daterange"
+            start-placeholder="寮�濮嬫椂闂�"
+            end-placeholder="缁撴潫鏃堕棿"
             clearable
-        />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
-      </div>
-      <div>
-        <el-button @click="handleOut" type="primary" style="width: 100px">瀵煎嚭</el-button>
-      </div>
+            @change="changeDateRange"
+            @clear="clearRange"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
+          <el-button @click="resetForm"> 閲嶇疆 </el-button>
+          <el-button @click="handleOut" type="primary">瀵煎嚭</el-button>
+        </el-form-item>
+      </el-form>
     </div>
     <div class="table_list">
-      <el-table :data="tableData" border v-loading="tableLoading"
-                @selection-change="handleSelectionChange"
-                :row-key="row => row.id"
-                show-summary
-                :summary-method="summarizeMainTable"
-                height="calc(100vh - 18.5em)">
+      <el-table
+        :data="tableData"
+        border
+        v-loading="tableLoading"
+        @selection-change="handleSelectionChange"
+        :row-key="(row) => row.id"
+        show-summary
+        :summary-method="summarizeMainTable"
+        height="calc(100vh - 18.5em)"
+      >
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip/>
-        <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" show-overflow-tooltip/>
-        <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip/>
+        <el-table-column
+          label="閿�鍞悎鍚屽彿"
+          prop="salesContractNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="瀹㈡埛鍚堝悓鍙�"
+          prop="customerContractNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="瀹㈡埛鍚嶇О"
+          prop="customerName"
+          show-overflow-tooltip
+        />
         <el-table-column label="浜у搧澶х被" prop="productCategory" />
         <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
-        <el-table-column label="鍙戠エ鍙�" prop="invoiceNo" show-overflow-tooltip/>
-        <el-table-column label="鍙戠エ閲戦(鍏�)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber"/>
-        <el-table-column label="绋庣巼" prop="taxRate" show-overflow-tooltip/>
-        <el-table-column label="寮�绁ㄤ汉" prop="invoicePerson" show-overflow-tooltip/>
-        <el-table-column label="寮�绁ㄦ棩鏈�" prop="invoiceDate" show-overflow-tooltip/>
-        <el-table-column label="鍙戠エ" prop="invoiceFileName" show-overflow-tooltip>
+        <el-table-column
+          label="鍙戠エ鍙�"
+          prop="invoiceNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍙戠エ閲戦(鍏�)"
+          prop="invoiceTotal"
+          show-overflow-tooltip
+          :formatter="formattedNumber"
+        />
+        <el-table-column label="绋庣巼" prop="taxRate" show-overflow-tooltip />
+        <el-table-column
+          label="寮�绁ㄤ汉"
+          prop="invoicePerson"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="寮�绁ㄦ棩鏈�"
+          prop="invoiceDate"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍙戠エ"
+          prop="invoiceFileName"
+          show-overflow-tooltip
+        >
           <template #default="scope">
-            <span v-if="scope.row.invoiceFileName">{{ scope.row.invoiceFileName }}</span>
-            <el-button v-else link type="primary" @click="handleDownload(scope.row)">涓婁紶</el-button>
+            <span v-if="scope.row.invoiceFileName">{{
+              scope.row.invoiceFileName
+            }}</span>
+            <el-button
+              v-else
+              link
+              type="primary"
+              @click="handleDownload(scope.row)"
+              >涓婁紶</el-button
+            >
           </template>
         </el-table-column>
-        <el-table-column fixed="right" label="鎿嶄綔" width="150" align="center" >
+        <el-table-column fixed="right" label="鎿嶄綔" width="150" align="center">
           <template #default="scope">
-            <el-button link type="primary" size="small" @click="openForm(scope.row);">缂栬緫</el-button>
-            <el-button link type="primary" size="small" @click="delInvoiceLedger(scope.row);">鍒犻櫎</el-button>
+            <el-button
+              link
+              type="primary"
+              size="small"
+              @click="openForm(scope.row)"
+              >缂栬緫</el-button
+            >
+            <el-button
+              link
+              type="primary"
+              size="small"
+              @click="delInvoiceLedger(scope.row)"
+              >鍒犻櫎</el-button
+            >
           </template>
         </el-table-column>
       </el-table>
-      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current"
-                  :limit="page.size" @pagination="paginationChange" />
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current"
+        :limit="page.size"
+        @pagination="paginationChange"
+      />
     </div>
-    <el-dialog v-model="dialogFormVisible" title="寮�绁ㄥ彴璐﹂〉闈�" width="70%" @close="closeDia">
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+    <el-dialog
+      v-model="dialogFormVisible"
+      title="寮�绁ㄥ彴璐﹂〉闈�"
+      width="70%"
+      @close="closeDia"
+    >
+      <el-form
+        :model="form"
+        label-width="140px"
+        label-position="top"
+        :rules="rules"
+        ref="formRef"
+      >
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
@@ -72,39 +152,58 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
-              <el-input v-model="form.customerName" placeholder="鑷姩濉厖" clearable disabled/>
+              <el-input
+                v-model="form.customerName"
+                placeholder="鑷姩濉厖"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNo">
-              <el-input v-model="form.invoiceNo" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                v-model="form.invoiceNo"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceTotal">
-              <el-input type="number" :step="0.01" v-model="form.invoiceTotal" placeholder="璇疯緭鍏�" clearable/>
+              <el-input
+                type="number"
+                :step="0.01"
+                v-model="form.invoiceTotal"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="寮�绁ㄤ汉锛�" prop="invoicePerson">
-              <el-input v-model="form.invoicePerson" placeholder="璇疯緭鍏�" clearable disabled/>
+              <el-input
+                v-model="form.invoicePerson"
+                placeholder="璇疯緭鍏�"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="invoiceDate">
               <el-date-picker
-                  style="width: 100%"
-                  v-model="form.invoiceDate"
-                  value-format="YYYY-MM-DD"
-                  format="YYYY-MM-DD"
-                  type="date"
-                  placeholder="璇烽�夋嫨"
-                  clearable
-                  disabled
+                style="width: 100%"
+                v-model="form.invoiceDate"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                type="date"
+                placeholder="璇烽�夋嫨"
+                clearable
               />
             </el-form-item>
           </el-col>
@@ -113,25 +212,23 @@
           <el-col :span="24">
             <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
               <el-upload
-                  v-model:file-list="fileList"
-                  :action="upload.url"
-                  multiple
-                  ref="fileUpload"
-                  auto-upload
-                  :headers="upload.headers"
-                  accept=".pdf"
-                  :limit="1"
-                  :before-upload="handleBeforeUpload"
-                  :on-error="handleUploadError"
-                  :on-success="handleUploadSuccess"
-                  :on-remove="handleRemove"
+                v-model:file-list="fileList"
+                :action="upload.url"
+                multiple
+                ref="fileUpload"
+                auto-upload
+                :headers="upload.headers"
+                accept=".pdf"
+                :limit="1"
+                :before-upload="handleBeforeUpload"
+                :on-error="handleUploadError"
+                :on-success="handleUploadSuccess"
+                :on-remove="handleRemove"
               >
                 <el-button type="primary">涓婁紶</el-button>
                 <template #tip>
-<!--                  鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
-                  <div class="el-upload__tip">
-                    鏂囦欢鏍煎紡鏀寔 pdf
-                  </div>
+                  <!--                  鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
+                  <div class="el-upload__tip">鏂囦欢鏍煎紡鏀寔 pdf</div>
                 </template>
               </el-upload>
             </el-form-item>
@@ -150,26 +247,24 @@
         <el-col :span="24">
           <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
             <el-upload
-                v-model:file-list="fileList"
-                :action="upload.url"
-                multiple
-                ref="fileUpload"
-                auto-upload
-                :headers="upload.headers"
-                accept=".pdf"
-                :limit="1"
-                style="width: 100%"
-                :on-exceed="handleExceed"
-                :before-upload="handleBeforeUpload"
-                :on-error="handleUploadError"
-                :on-success="handleUploadSuccess"
-                :on-remove="handleRemove"
+              v-model:file-list="fileList"
+              :action="upload.url"
+              multiple
+              ref="fileUpload"
+              auto-upload
+              :headers="upload.headers"
+              accept=".pdf"
+              :limit="1"
+              style="width: 100%"
+              :on-exceed="handleExceed"
+              :before-upload="handleBeforeUpload"
+              :on-error="handleUploadError"
+              :on-success="handleUploadSuccess"
+              :on-remove="handleRemove"
             >
               <el-button type="primary">涓婁紶</el-button>
               <template #tip>
-                <div class="el-upload__tip">
-                  鏂囦欢鏍煎紡浠呮敮鎸� pdf
-                </div>
+                <div class="el-upload__tip">鏂囦欢鏍煎紡浠呮敮鎸� pdf</div>
               </template>
             </el-upload>
           </el-form-item>
@@ -178,7 +273,7 @@
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="commiInvoicetFile" type="primary">纭</el-button>
-          <el-button  @click="uploadModal = false">鍙栨秷</el-button>
+          <el-button @click="uploadModal = false">鍙栨秷</el-button>
         </div>
       </template>
     </el-dialog>
@@ -186,45 +281,54 @@
 </template>
 
 <script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import {Search} from "@element-plus/icons-vue";
-import {ElMessageBox } from "element-plus";
-import { getToken } from "@/utils/auth"
+import pagination from "@/components/PIMTable/Pagination.vue";
+import { ref } from "vue";
+import { Search } from "@element-plus/icons-vue";
+import { ElMessageBox } from "element-plus";
+import { getToken } from "@/utils/auth";
 import {
   invoiceLedgerSaveOrUpdate,
   invoiceLedgerProductInfo,
   commitFile,
-  registrationProductPage, delInvoiceLedgerByRegProductId
+  registrationProductPage,
+  delInvoiceLedgerByRegProductId,
 } from "../../../api/salesManagement/invoiceLedger.js";
 import useUserStore from "@/store/modules/user.js";
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const productData = ref([])
-const selectedRows = ref([])
-const tableLoading = ref(false)
+import useFormData from "@/hooks/useFormData";
+import dayjs from "dayjs";
+
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const productData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
 const page = reactive({
   current: 1,
   size: 100,
-})
-const total = ref(0)
-const fileList = ref([])
-const dialogFormVisible = ref(false)
+});
+const total = ref(0);
+const fileList = ref([]);
+const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    searchText: '',
-    invoiceDate:''
+    searchText: "",
+    invoiceDate: [
+      dayjs().startOf("month").format("YYYY-MM-DD"),
+      dayjs().endOf("month").format("YYYY-MM-DD"),
+    ],
+    invoiceDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
+    invoiceDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
   },
   form: {
-    salesLedgerId: '',
-    customerId: '',
-    invoiceNo: '',
-    invoiceTotal: '',
-    taxRate: '',
-    invoicePerson: '',
-    invoiceDate: '',
-    customerName:'',
-    fileList:[]
+    salesLedgerId: "",
+    customerId: "",
+    invoiceNo: "",
+    invoiceTotal: "",
+    taxRate: "",
+    invoicePerson: "",
+    invoiceDate: "",
+    customerName: "",
+    fileList: [],
   },
   rules: {
     salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -235,72 +339,74 @@
     invoicePerson: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     invoiceDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     customerName: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-  }
-})
-const { searchForm, form, rules } = toRefs(data)
-const currentId = ref('')
-const userStore = useUserStore()
+  },
+});
+const { form, rules } = toRefs(data);
+const { form: searchForm, resetForm } = useFormData(data.searchForm);
+const currentId = ref("");
+const userStore = useUserStore();
 const upload = reactive({
   // 涓婁紶鐨勫湴鍧�
   url: import.meta.env.VITE_APP_BASE_API + "/invoiceLedger/uploadFile",
   // 璁剧疆涓婁紶鐨勮姹傚ご閮�
   headers: { Authorization: "Bearer " + getToken() },
-})
-const matchFileType = ref(['pdf'])
-const uploadModal = ref(false)
+});
+const matchFileType = ref(["pdf"]);
+const uploadModal = ref(false);
 const formattedNumber = (row, column, cellValue) => {
   return parseFloat(cellValue).toFixed(2);
 };
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1
-  getList()
-}
+  page.current = 1;
+  getList();
+};
 const paginationChange = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
-  getList()
-}
+  getList();
+};
 const getList = () => {
-  tableLoading.value = true
-  registrationProductPage({...searchForm.value, ...page}).then(res => {
-    tableLoading.value = false
+  tableLoading.value = true;
+  const { invoiceDate, ...rest } = searchForm;
+  registrationProductPage({ ...rest, ...page }).then((res) => {
+    tableLoading.value = false;
     tableData.value = res.data.records;
     total.value = res.data.total;
-  })
-}
+  });
+};
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  selectedRows.value = selection
-}
+  selectedRows.value = selection;
+};
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ['invoiceTotal'], {
+  return proxy.summarizeTable(param, ["invoiceTotal"], {
     ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
     futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
   });
 };
 // 鎵撳紑寮规
 const openForm = (row) => {
-  form.value = {}
-  productData.value = []
-  fileList.value = []
+  form.value = {};
+  productData.value = [];
+  fileList.value = [];
   currentId.value = row.id;
 
-  invoiceLedgerProductInfo({id: row.id}).then(res => {
-    form.value = {...res.data}
+  invoiceLedgerProductInfo({ id: row.id }).then((res) => {
+    form.value = { ...res.data };
     fileList.value = res.data.fileList;
-    if(!form.value.invoicePerson){
-      form.value.invoicePerson = userStore.nickName
+    if (!form.value.invoicePerson) {
+      form.value.invoicePerson = userStore.nickName;
       form.value.entryDate = getCurrentDate();
     }
-    if(!form.value.invoiceDate){
+    if (!form.value.invoiceDate) {
       form.value.invoiceDate = getCurrentDate();
     }
-  })
-  dialogFormVisible.value = true
-}
+  });
+  dialogFormVisible.value = true;
+};
 // 涓婁紶澶氫釜鏂囦欢灏辫鐩栧師鏉ョ殑
 const handleExceed = (files) => {
   proxy.$refs["fileUpload"].clearFiles();
@@ -310,131 +416,148 @@
 };
 // 涓婁紶鍓嶆牎妫�
 function handleBeforeUpload(file) {
-  console.log('file',file)
+  console.log("file", file);
   // 鏍℃鏂囦欢澶у皬
   if (file.size > 1024 * 1024 * 10) {
-    proxy.$modal.msgError('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!')
-    return false
+    proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
+    return false;
   }
   // 鍒ゆ柇鏂囦欢鏍煎紡鏄惁绗﹀悎
-  const fileType = file.name.split('.').pop().toLowerCase();
-  if(!matchFileType.value.includes(fileType)) {
-    proxy.$modal.msgError('鏂囦欢鏍煎紡涓嶅尮閰�')
-    return false
+  const fileType = file.name.split(".").pop().toLowerCase();
+  if (!matchFileType.value.includes(fileType)) {
+    proxy.$modal.msgError("鏂囦欢鏍煎紡涓嶅尮閰�");
+    return false;
   }
-  proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...")
-  return true
+  proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
+  return true;
 }
 // 涓婁紶澶辫触
 function handleUploadError(err) {
-  proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触")
-  proxy.$modal.closeLoading()
+  proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
+  proxy.$modal.closeLoading();
 }
 // 涓婁紶鎴愬姛鍥炶皟
 function handleUploadSuccess(res, file, uploadFiles) {
-  proxy.$modal.closeLoading()
+  proxy.$modal.closeLoading();
   if (res.code === 200) {
-    proxy.$refs["fileUpload"].handleRemove(file)
-    fileList.value.push(res.data)
-    proxy.$modal.msgSuccess("涓婁紶鎴愬姛")
+    proxy.$refs["fileUpload"].handleRemove(file);
+    fileList.value.push(res.data);
+    proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
   } else {
-    proxy.$modal.msgError(res.msg)
-    proxy.$refs.fileUpload.handleRemove(file)
+    proxy.$modal.msgError(res.msg);
+    proxy.$refs.fileUpload.handleRemove(file);
   }
 }
 // 绉婚櫎鏂囦欢
-function handleRemove (file) {
-  let index = fileList.value.findIndex(item => item.url === file.url)
-  if(index > -1) {
-    fileList.value.splice(index, 1)
+function handleRemove(file) {
+  let index = fileList.value.findIndex((item) => item.url === file.url);
+  if (index > -1) {
+    fileList.value.splice(index, 1);
   }
 }
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate(valid => {
+  proxy.$refs["formRef"].validate((valid) => {
     if (valid) {
       form.value.fileList = fileList.value;
-      invoiceLedgerSaveOrUpdate(form.value).then(res => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-        closeDia()
-        getList()
-      })
+      invoiceLedgerSaveOrUpdate(form.value).then((res) => {
+        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        closeDia();
+        getList();
+      });
     }
-  })
-}
+  });
+};
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef")
-  dialogFormVisible.value = false
-}
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+};
 // 瀵煎嚭
 const handleOut = () => {
-  ElMessageBox.confirm(
-      '閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�',
-      '瀵煎嚭', {
-        confirmButtonText: '纭',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning',
-      }
-  ).then(() => {
-    proxy.download("/invoiceLedger/export", {}, '寮�绁ㄥ彴璐�.xlsx')
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      proxy.download("/invoiceLedger/export", {}, "寮�绁ㄥ彴璐�.xlsx");
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 
 // 鎵撳紑闄勪欢涓婁紶寮圭獥
 const handleDownload = (val) => {
-  fileList.value = []
-  uploadModal.value = true
-  currentId.value = val.id
-}
+  fileList.value = [];
+  uploadModal.value = true;
+  currentId.value = val.id;
+};
 
 // 纭鏂囦欢涓婁紶
 const commiInvoicetFile = () => {
   const object = {
     fileList: fileList.value,
     id: currentId.value,
-  }
-  commitFile(object).then(res => {
+  };
+  commitFile(object).then((res) => {
     if (res.code === 200) {
-      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-      uploadModal.value = false
+      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+      uploadModal.value = false;
     }
     getList();
-    currentId.value = ''
-    fileList.value = []
-  })
-}
+    currentId.value = "";
+    fileList.value = [];
+  });
+};
 // 鍒犻櫎寮�绁ㄥ彴璐�
 const delInvoiceLedger = (row) => {
-  ElMessageBox.confirm(
-      '璇ュ彂绁ㄥ彴璐﹀皢琚垹闄�,鏄惁纭鍒犻櫎', {
-        confirmButtonText: '纭',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning',
-      }
-  ).then(() => {
-    delInvoiceLedgerByRegProductId(row.id).then(res => {
-      getList()
-    })
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("璇ュ彂绁ㄥ彴璐﹀皢琚垹闄�,鏄惁纭鍒犻櫎", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      delInvoiceLedgerByRegProductId(row.id).then((res) => {
+        getList();
+      });
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 
 // 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
 function getCurrentDate() {
   const today = new Date();
   const year = today.getFullYear();
-  const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮�
-  const day = String(today.getDate()).padStart(2, '0');
+  const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
+  const day = String(today.getDate()).padStart(2, "0");
   return `${year}-${month}-${day}`;
 }
+const changeDateRange = (date) => {
+  if (date) {
+    searchForm.invoiceDateStart = date[0];
+    searchForm.invoiceDateEnd = date[1];
+    getList();
+  }
+};
 
-getList()
+const clearRange = () => {
+  searchForm.invoiceDate = [];
+  searchForm.invoiceDateStart = undefined;
+  searchForm.invoiceDateEnd = undefined;
+  getList();
+};
+
+onMounted(() => {
+  getList();
+});
 </script>
 
 <style scoped lang="scss">
-
+.table_list {
+  margin-top: unset;
+}
 </style>
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
index 77596d7..8f1005c 100644
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ b/src/views/salesManagement/invoiceRegistration/index.vue
@@ -1,68 +1,181 @@
 <template>
   <div class="app-container">
     <div class="search_form">
-      <div>
-        <span class="search_title">寮�绁ㄧ櫥璁帮細</span>
-        <el-input
+      <el-form :inline="true" :model="searchForm">
+        <el-form-item label="寮�绁ㄧ櫥璁�">
+          <el-input
             v-model="searchForm.customerName"
             style="width: 240px"
             placeholder="璇疯緭鍏ュ悕绉版悳绱�"
-            @change="handleQuery"
             clearable
             :prefix-icon="Search"
-        />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
-      </div>
-      <div>
-        <el-button type="primary" @click="openForm">鏂板鐧昏</el-button>
-      </div>
+            @change="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="鏈紑绁ㄩ噾棰濇槸鍚︿负0">
+          <el-select v-model="searchForm.status" style="width: 90px" clearable>
+            <el-option label="鍚�" :value="0" />
+            <el-option label="鏄�" :value="1" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="瀹㈡埛鍚堝悓鍙�">
+          <el-input
+            v-model="searchForm.customerContractNo"
+            placeholder="璇疯緭鍏ュ鎴峰悎鍚屽彿"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item label="椤圭洰鍚嶇О">
+          <el-input
+            v-model="searchForm.projectName"
+            placeholder="璇疯緭鍏ラ」鐩悕绉�"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
+          <el-button @click="resetForm"> 閲嶇疆 </el-button>
+        </el-form-item>
+      </el-form>
     </div>
     <div class="table_list">
-      <el-table :data="tableData" border v-loading="tableLoading"
-                @selection-change="handleSelectionChange"
-                :expand-row-keys="expandedRowKeys"
-                :row-key="row => row.id"
-                show-summary
-                :summary-method="summarizeMainTable"
-                @expand-change="expandChange"
-                height="calc(100vh - 18.5em)">
+      <el-button type="primary" @click="openForm" style="margin-bottom: 8px">
+        鏂板鐧昏
+      </el-button>
+      <el-table
+        :data="tableData"
+        :border="true"
+        height="calc(100vh - 21em)"
+        v-loading="tableLoading"
+        :expand-row-keys="expandedRowKeys"
+        :row-key="(row) => row.id"
+        show-summary
+        :summary-method="summarizeMainTable"
+        @expand-change="expandChange"
+        @selection-change="handleSelectionChange"
+      >
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column type="expand">
           <template #default="props">
-            <el-table :data="props.row.children" border
-                      show-summary
-                      :summary-method="summarizeChildrenTable">
-              <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+            <el-table
+              :data="props.row.children"
+              border
+              show-summary
+              :summary-method="summarizeChildrenTable"
+            >
+              <el-table-column
+                align="center"
+                label="搴忓彿"
+                type="index"
+                width="60"
+              />
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
-              <el-table-column label="鍗曚綅" prop="unit" width="70"/>
-              <el-table-column label="鏁伴噺" prop="quantity" width="70"/>
+              <el-table-column label="鍗曚綅" prop="unit" width="70" />
+              <el-table-column label="鏁伴噺" prop="quantity" width="70" />
               <el-table-column label="绋庣巼" prop="taxRate" width="70" />
-              <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
-              <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
-              <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
-              <el-table-column label="寮�绁ㄦ暟" prop="invoiceNum" :formatter="formattedNumber" />
-              <el-table-column label="寮�绁ㄩ噾棰�(鍏�)" prop="invoiceAmount" :formatter="formattedNumber" />
-              <el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum" :formatter="formattedNumber" />
-              <el-table-column label="鏈紑绁ㄩ噾棰�(鍏�)" prop="noInvoiceAmount" :formatter="formattedNumber"/>
+              <el-table-column
+                label="鍚◣鍗曚环(鍏�)"
+                prop="taxInclusiveUnitPrice"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="鍚◣鎬讳环(鍏�)"
+                prop="taxInclusiveTotalPrice"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="涓嶅惈绋庢�讳环(鍏�)"
+                prop="taxExclusiveTotalPrice"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="寮�绁ㄦ暟"
+                prop="invoiceNum"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="寮�绁ㄩ噾棰�(鍏�)"
+                prop="invoiceAmount"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="鏈紑绁ㄦ暟"
+                prop="noInvoiceNum"
+                :formatter="formattedNumber"
+              />
+              <el-table-column
+                label="鏈紑绁ㄩ噾棰�(鍏�)"
+                prop="noInvoiceAmount"
+                :formatter="formattedNumber"
+              />
             </el-table>
           </template>
         </el-table-column>
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip/>
-        <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" show-overflow-tooltip/>
-        <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip/>
-        <el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip/>
-        <el-table-column label="椤圭洰鍚嶇О" prop="projectName" show-overflow-tooltip/>
-        <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" show-overflow-tooltip :formatter="formattedNumber"/>
-        <el-table-column label="宸插紑绁ㄩ噾棰�(鍏�)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber"/>
-        <el-table-column label="鏈紑绁ㄩ噾棰�(鍏�)" prop="noInvoiceAmountTotal" show-overflow-tooltip :formatter="formattedNumber"/>
+        <el-table-column
+          label="閿�鍞悎鍚屽彿"
+          prop="salesContractNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="瀹㈡埛鍚堝悓鍙�"
+          prop="customerContractNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="瀹㈡埛鍚嶇О"
+          prop="customerName"
+          show-overflow-tooltip
+        />
+        <el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip />
+        <el-table-column
+          label="椤圭洰鍚嶇О"
+          prop="projectName"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍚堝悓閲戦(鍏�)"
+          prop="contractAmount"
+          show-overflow-tooltip
+          :formatter="formattedNumber"
+        />
+        <el-table-column
+          label="宸插紑绁ㄩ噾棰�(鍏�)"
+          prop="invoiceTotal"
+          show-overflow-tooltip
+          :formatter="formattedNumber"
+        />
+        <el-table-column label="鏈紑绁ㄩ噾棰�(鍏�)" show-overflow-tooltip>
+          <template #default="{ row, column }">
+            <el-text type="danger">
+              {{ formattedNumber(row, column, row.noInvoiceAmountTotal) }}
+            </el-text>
+          </template>
+        </el-table-column>
       </el-table>
-      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current"
-                  :limit="page.size" @pagination="paginationChange" />
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current"
+        :limit="page.size"
+        @pagination="paginationChange"
+      />
     </div>
-    <el-dialog v-model="dialogFormVisible" title="鏂板寮�绁ㄧ櫥璁伴〉闈�" width="85%" @close="closeDia">
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+    <el-dialog
+      v-model="dialogFormVisible"
+      title="鏂板寮�绁ㄧ櫥璁伴〉闈�"
+      width="85%"
+      @close="closeDia"
+    >
+      <el-form
+        :model="form"
+        label-width="140px"
+        label-position="top"
+        :rules="rules"
+        ref="formRef"
+      >
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
@@ -71,54 +184,120 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
-                <el-input v-model="form.customerName" placeholder="鑷姩濉厖" disabled></el-input>
+              <el-input
+                v-model="form.customerName"
+                placeholder="鑷姩濉厖"
+                disabled
+              ></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="涓氬姟鍛橈細" prop="salesman">
-              <el-input v-model="form.salesman" placeholder="鑷姩濉厖" disabled/>
+              <el-input
+                v-model="form.salesman"
+                placeholder="鑷姩濉厖"
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input v-model="form.projectName" placeholder="鑷姩濉厖" disabled/>
+              <el-input
+                v-model="form.projectName"
+                placeholder="鑷姩濉厖"
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
-          </el-form-item>
+          <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item>
         </el-row>
-        <el-table :data="productData" border show-summary :summary-method="summarizeChildrenTable">
-          <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table
+          :data="productData"
+          border
+          show-summary
+          :summary-method="summarizeChildrenTable"
+        >
+          <el-table-column
+            align="center"
+            label="搴忓彿"
+            type="index"
+            width="60"
+          />
           <el-table-column label="浜у搧澶х被" prop="productCategory" />
           <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
           <el-table-column label="鍗曚綅" prop="unit" />
           <el-table-column label="鏁伴噺" prop="quantity" width="70" />
           <el-table-column label="绋庣巼" prop="taxRate" width="70" />
-          <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
-          <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
-          <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" width="150" />
+          <el-table-column
+            label="鍚◣鍗曚环(鍏�)"
+            prop="taxInclusiveUnitPrice"
+            :formatter="formattedNumber"
+          />
+          <el-table-column
+            label="鍚◣鎬讳环(鍏�)"
+            prop="taxInclusiveTotalPrice"
+            :formatter="formattedNumber"
+          />
+          <el-table-column
+            label="涓嶅惈绋庢�讳环(鍏�)"
+            prop="taxExclusiveTotalPrice"
+            :formatter="formattedNumber"
+            width="150"
+          />
           <el-table-column label="鏈寮�绁ㄦ暟" prop="currentInvoiceNum">
             <template #default="scope">
-              <el-input type="number" :step="0.1" min="0" v-model="scope.row.currentInvoiceNum" @blur="invoiceNumBlur(scope.row)"></el-input>
+              <el-input
+                type="number"
+                :step="0.1"
+                min="0"
+                v-model="scope.row.currentInvoiceNum"
+                @blur="invoiceNumBlur(scope.row)"
+              ></el-input>
             </template>
           </el-table-column>
-          <el-table-column label="鏈寮�绁ㄩ噾棰�(鍏�)" prop="currentInvoiceAmount" width="150">
+          <el-table-column
+            label="鏈寮�绁ㄩ噾棰�(鍏�)"
+            prop="currentInvoiceAmount"
+            width="150"
+          >
             <template #default="scope">
-              <el-input type="number" :step="0.01" min="0" v-model="scope.row.currentInvoiceAmount" @blur="invoiceAmountBlur(scope.row)" ></el-input>
+              <el-input
+                type="number"
+                :step="0.01"
+                min="0"
+                v-model="scope.row.currentInvoiceAmount"
+                @blur="invoiceAmountBlur(scope.row)"
+              ></el-input>
             </template>
           </el-table-column>
-          <el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum" >
+          <el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum">
             <template #default="scope">
-              <el-input type="number" min="0" disabled v-model="scope.row.noInvoiceNum"></el-input>
+              <el-input
+                type="number"
+                min="0"
+                disabled
+                v-model="scope.row.noInvoiceNum"
+              ></el-input>
             </template>
           </el-table-column>
-          <el-table-column label="鏈紑绁ㄩ噾棰�(鍏�)" prop="noInvoiceAmount"  width="150" >
+          <el-table-column
+            label="鏈紑绁ㄩ噾棰�(鍏�)"
+            prop="noInvoiceAmount"
+            width="150"
+          >
             <template #default="scope">
-              <el-input type="number" min="0" disabled v-model="scope.row.noInvoiceAmount" :precision="2" :step="0.01"></el-input>
+              <el-input
+                type="number"
+                min="0"
+                disabled
+                v-model="scope.row.noInvoiceAmount"
+                :precision="2"
+                :step="0.01"
+              ></el-input>
             </template>
           </el-table-column>
         </el-table>
@@ -134,48 +313,52 @@
 </template>
 
 <script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import {Search} from "@element-plus/icons-vue";
-import {ElMessageBox } from "element-plus";
+import pagination from "@/components/PIMTable/Pagination.vue";
+import { ref } from "vue";
+import { Search } from "@element-plus/icons-vue";
+import { ElMessageBox } from "element-plus";
 // import {userListNoPage} from "@/api/system/user.js";
 import {
   getSalesLedgerWithProducts,
   ledgerListPage,
   productList,
 } from "@/api/salesManagement/salesLedger.js";
-import {
-  invoiceRegistrationSave,
-} from "@/api/salesManagement/invoiceRegistration.js";
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const productData = ref([])
-const selectedRows = ref([])
-const tableLoading = ref(false)
+import { invoiceRegistrationSave } from "@/api/salesManagement/invoiceRegistration.js";
+import useFormData from "@/hooks/useFormData";
+
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const productData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
 const page = reactive({
   current: 1,
   size: 100,
-})
-const total = ref(0)
+});
+const total = ref(0);
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref('')
-const dialogFormVisible = ref(false)
+const operationType = ref("");
+const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    customerName: '',
+    customerName: "",
+    status: 0,
+    customerContractNo: undefined, // 瀹㈡埛鍚堝悓鍙�
+    projectName: undefined, // 椤圭洰鍚嶇О
   },
   form: {
-    salesLedgerId: '',
-    customerName: '',
-    salesman: '',
-    projectName: '',
-    productData: []
+    salesLedgerId: "",
+    customerName: "",
+    salesman: "",
+    projectName: "",
+    productData: [],
   },
   rules: {
-    salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }]
-  }
-})
-const { searchForm, form, rules } = toRefs(data)
+    salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+  },
+});
+const { form, rules } = toRefs(data);
+const { form: searchForm, resetForm } = useFormData(data.searchForm);
 
 const formattedNumber = (row, column, cellValue) => {
   if (cellValue == 0) {
@@ -190,149 +373,175 @@
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1
-  getList()
-}
+  page.current = 1;
+  getList();
+};
 const paginationChange = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
-  getList()
-}
+  getList();
+};
 const getList = () => {
-  tableLoading.value = true
-  ledgerListPage({...searchForm.value, ...page}).then(res => {
-    tableLoading.value = false
+  tableLoading.value = true;
+  ledgerListPage({ ...searchForm, ...page }).then((res) => {
+    tableLoading.value = false;
     tableData.value = res.records;
-    total.value = res.total
-    expandedRowKeys.value = []
-  })
-}
+    total.value = res.total;
+    expandedRowKeys.value = [];
+  });
+};
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  console.log('selection', selection)
-  selectedRows.value = selection.filter(item => item.salesContractNo !== undefined);
-}
-const expandedRowKeys = ref([])
+  console.log("selection", selection);
+  selectedRows.value = selection.filter(
+    (item) => item.salesContractNo !== undefined
+  );
+};
+const expandedRowKeys = ref([]);
 // 灞曞紑琛�
 const expandChange = (row, expandedRows) => {
   if (expandedRows.length > 0) {
-    expandedRowKeys.value = []
+    expandedRowKeys.value = [];
     try {
-      productList({salesLedgerId: row.id,
-                   type: 1 }).then(res => {
-        const index = tableData.value.findIndex(item => item.id === row.id);
+      productList({ salesLedgerId: row.id, type: 1 }).then((res) => {
+        const index = tableData.value.findIndex((item) => item.id === row.id);
         if (index > -1) {
           tableData.value[index].children = res;
         }
-        expandedRowKeys.value.push(row.id)
-      })
+        expandedRowKeys.value.push(row.id);
+      });
     } catch (error) {
-      console.log(error)
+      console.log(error);
     }
   } else {
-    expandedRowKeys.value = []
+    expandedRowKeys.value = [];
   }
-}
+};
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ['contractAmount','noInvoiceAmountTotal','invoiceTotal']);
+  return proxy.summarizeTable(param, [
+    "contractAmount",
+    "noInvoiceAmountTotal",
+    "invoiceTotal",
+  ]);
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeChildrenTable = (param) => {
-  return proxy.summarizeTable(param, ['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice','invoiceNum','invoiceAmount','noInvoiceNum','noInvoiceAmount']);
-}
+  return proxy.summarizeTable(param, [
+    "taxInclusiveUnitPrice",
+    "taxInclusiveTotalPrice",
+    "taxExclusiveTotalPrice",
+    "invoiceNum",
+    "invoiceAmount",
+    "currentInvoiceAmount",
+    "noInvoiceNum",
+    "noInvoiceAmount",
+  ]);
+};
 // 鎵撳紑寮规
 const openForm = () => {
   // 鍒ゆ柇鏄惁澶氶��
-  if(selectedRows.value.length != 1) {
-    proxy.$modal.msgError("璇烽�夋嫨涓�鏉″悎鍚�")
+  if (selectedRows.value.length != 1) {
+    proxy.$modal.msgError("璇烽�夋嫨涓�鏉″悎鍚�");
     return;
   }
-  form.value = {}
-  productData.value = []
-  getSalesLedgerWithProducts({id: selectedRows.value[0].id}).then(res => {
-    form.value = {...res}
-    productData.value = form.value.productData.map(item => {
-      return item
-    })
-    dialogFormVisible.value = true
-    console.log('productData.value ',productData.value )
-  })
-
-}
+  form.value = {};
+  productData.value = [];
+  getSalesLedgerWithProducts({ id: selectedRows.value[0].id }).then((res) => {
+    form.value = { ...res };
+    productData.value = form.value.productData.map((item) => {
+      return item;
+    });
+    dialogFormVisible.value = true;
+    console.log("productData.value ", productData.value);
+  });
+};
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate(valid => {
+  proxy.$refs["formRef"].validate((valid) => {
     if (valid) {
-      form.value.productData = proxy.HaveJson(productData.value)
-      invoiceRegistrationSave(form.value).then(res => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-        closeDia()
-        getList()
-      })
+      form.value.productData = proxy.HaveJson(productData.value);
+      invoiceRegistrationSave(form.value).then((res) => {
+        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        closeDia();
+        getList();
+      });
     }
-  })
-}
+  });
+};
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef")
-  dialogFormVisible.value = false
-}
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+};
 // 瀵煎嚭
 const handleOut = () => {
-  ElMessageBox.confirm(
-      '閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�',
-      '瀵煎嚭', {
-        confirmButtonText: '纭',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning',
-      }
-  ).then(() => {
-    proxy.download("/invoiceRegistration/export", {}, '寮�绁ㄧ櫥璁颁俊鎭�.xlsx')
-  }).catch(() => {
-    proxy.$modal.msg("宸插彇娑�")
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
   })
-}
+    .then(() => {
+      proxy.download("/invoiceRegistration/export", {}, "寮�绁ㄧ櫥璁颁俊鎭�.xlsx");
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 
 //鏈寮�绁ㄥけ鐒︽搷浣�
 const invoiceNumBlur = (row) => {
-  if(!row.currentInvoiceNum){
-    row.currentInvoiceNum = 0
+  if (!row.currentInvoiceNum) {
+    row.currentInvoiceNum = 0;
   }
-  if(row.currentInvoiceNum > row.tempNoInvoiceNum){
-    proxy.$modal.msgWarning('鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟')
-    row.currentInvoiceNum = 0
+  if (row.currentInvoiceNum > row.tempNoInvoiceNum) {
+    proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
+    row.currentInvoiceNum = 0;
   }
   // 璁$畻鏈寮�绁ㄩ噾棰�
-  row.currentInvoiceAmount = (row.currentInvoiceNum * row.taxInclusiveUnitPrice).toFixed(2)
+  row.currentInvoiceAmount = (
+    row.currentInvoiceNum * row.taxInclusiveUnitPrice
+  ).toFixed(2);
   // 璁$畻鏈紑绁ㄦ暟
-  row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(2)
+  row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
+    2
+  );
   // 璁$畻鏈紑绁ㄩ噾棰�
-  row.noInvoiceAmount = (row.tempnoInvoiceAmount -  row.currentInvoiceAmount).toFixed(2)
-}
+  row.noInvoiceAmount = (
+    row.tempnoInvoiceAmount - row.currentInvoiceAmount
+  ).toFixed(2);
+};
 // 鏈寮�绁ㄩ噾棰濆け鐒︽搷浣�
 const invoiceAmountBlur = (row) => {
-  if(!row.currentInvoiceAmount){
-    row.currentInvoiceAmount = 0
+  if (!row.currentInvoiceAmount) {
+    row.currentInvoiceAmount = 0;
   }
   // 璁$畻鏄惁瓒呰繃寮�绁ㄦ�婚噾棰�
-  if(row.currentInvoiceAmount > row.tempnoInvoiceAmount){
-    proxy.$modal.msgWarning('鏈寮�绁ㄩ噾棰濅笉寰楀ぇ浜庢湭寮�绁ㄩ噾棰�')
-    row.currentInvoiceAmount = 0
+  if (row.currentInvoiceAmount > row.tempnoInvoiceAmount) {
+    proxy.$modal.msgWarning("鏈寮�绁ㄩ噾棰濅笉寰楀ぇ浜庢湭寮�绁ㄩ噾棰�");
+    row.currentInvoiceAmount = 0;
   }
   // 璁$畻鏈寮�绁ㄦ暟
-  row.currentInvoiceNum = (row.currentInvoiceAmount / row.taxInclusiveUnitPrice).toFixed(2)
-  console.log('row.currentInvoiceNum ',row.currentInvoiceNum )
-  console.log(' row.originalNoInvoiceNum  ', row.originalNoInvoiceNum  )
+  row.currentInvoiceNum = (
+    row.currentInvoiceAmount / row.taxInclusiveUnitPrice
+  ).toFixed(2);
+  console.log("row.currentInvoiceNum ", row.currentInvoiceNum);
+  console.log(" row.originalNoInvoiceNum  ", row.originalNoInvoiceNum);
   // 璁$畻鏈紑绁ㄦ暟
-  row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(2)
+  row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
+    2
+  );
   // 璁$畻鏈紑绁ㄩ噾棰�
-  row.noInvoiceAmount = (row.tempnoInvoiceAmount -  row.currentInvoiceAmount).toFixed(2)
-}
+  row.noInvoiceAmount = (
+    row.tempnoInvoiceAmount - row.currentInvoiceAmount
+  ).toFixed(2);
+};
 
-getList()
+getList();
 </script>
 
 <style scoped lang="scss">
-
+.table_list {
+  margin-top: unset;
+}
 </style>
diff --git a/src/views/salesManagement/receiptPayment/index.vue b/src/views/salesManagement/receiptPayment/index.vue
index 8057675..4c6fd8d 100644
--- a/src/views/salesManagement/receiptPayment/index.vue
+++ b/src/views/salesManagement/receiptPayment/index.vue
@@ -1,126 +1,296 @@
 <template>
   <div class="app-container">
     <div class="search_form">
-      <div>
-        <span class="search_title">鍥炴鐧昏锛�</span>
-        <el-input
-            v-model="searchForm.searchText"
-            style="width: 240px"
-            placeholder="杈撳叆瀹㈡埛鍚嶇О/鍚堝悓鍙锋悳绱�"
-            @change="handleQuery"
-            clearable
-            prefix-icon="Search"
-        />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
-      </div>
-      <div>
-        <el-button type="primary" @click="openForm('add')">鏂板鍥炴</el-button>
-      </div>
+      <el-form :inline="true" :model="searchForm" style="width: 100%">
+        <el-row justify="space-between">
+          <el-col :span="20">
+            <el-form-item label="鍥炴鐧昏">
+              <el-input
+                v-model="searchForm.searchText"
+                style="width: 240px"
+                placeholder="杈撳叆瀹㈡埛鍚嶇О/鍚堝悓鍙锋悳绱�"
+                clearable
+                prefix-icon="Search"
+                @change="handleQuery"
+              />
+            </el-form-item>
+            <el-form-item label="涓嶆樉绀哄緟鍥炴">
+              <el-checkbox
+                v-model="searchForm.status"
+                :label="0"
+                @change="handleQuery"
+              />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item style="float: right; margin-right: unset">
+              <el-button type="primary" @click="openForm('add')">
+                鏂板鍥炴
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
     </div>
     <div class="table_list">
-      <el-table :data="tableData" border v-loading="tableLoading"
-                @selection-change="handleSelectionChange"
-                :row-key="row => row.id"
-                show-summary
-                :summary-method="summarizeMainTable"
-                :expand-row-keys="expandedRowKeys"
-                @expand-change="expandChange"
-                height="calc(100vh - 18.5em)">
+      <el-table
+        :data="tableData"
+        border
+        v-loading="tableLoading"
+        @selection-change="handleSelectionChange"
+        :row-key="(row) => row.id"
+        show-summary
+        :summary-method="summarizeMainTable"
+        :expand-row-keys="expandedRowKeys"
+        @expand-change="expandChange"
+        height="calc(100vh - 18.5em)"
+      >
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column type="expand">
           <template #default="props">
-            <el-table :data="props.row.children" border
-                      show-summary
-                      :summary-method="summarizeChildrenTable">
-              <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+            <el-table
+              :data="props.row.children"
+              border
+              show-summary
+              :summary-method="summarizeChildrenTable"
+            >
+              <el-table-column
+                align="center"
+                label="搴忓彿"
+                type="index"
+                width="60"
+              />
               <el-table-column label="鍥炴鏃ユ湡" prop="receiptPaymentDate" />
               <el-table-column label="鍥炴閲戦" prop="receiptPaymentAmount">
                 <template #default="scope">
-                  <el-input v-model="scope.row.receiptPaymentAmount" :disabled="!scope.row.editType"></el-input>
+                  <el-input
+                    v-model="scope.row.receiptPaymentAmount"
+                    :disabled="!scope.row.editType"
+                  ></el-input>
                 </template>
               </el-table-column>
-              <el-table-column label="鍥炴鏂瑰紡" prop="receiptPaymentType"  >
+              <el-table-column label="鍥炴鏂瑰紡" prop="receiptPaymentType">
                 <template #default="scope">
-                  <el-select v-model="scope.row.receiptPaymentType" placeholder="璇烽�夋嫨" clearable :disabled="!scope.row.editType">
-                    <el-option v-for="item in receipt_payment_type" :key="item.value" :label="item.label" :value="item.value"/>
+                  <el-select
+                    v-model="scope.row.receiptPaymentType"
+                    placeholder="璇烽�夋嫨"
+                    clearable
+                    :disabled="!scope.row.editType"
+                  >
+                    <el-option
+                      v-for="item in receipt_payment_type"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value"
+                    />
                   </el-select>
                 </template>
               </el-table-column>
               <el-table-column label="鐧昏浜�" prop="registrant" />
-              <el-table-column label="鐧昏鏃ユ湡" prop="createTime"  />
+              <el-table-column label="鐧昏鏃ユ湡" prop="createTime" />
               <el-table-column label="鎿嶄綔" width="150">
                 <template #default="scope">
-                  <el-button link type="primary" size="small" @click="changeEditType(scope.row)" v-if="!scope.row.editType">缂栬緫</el-button>
-                  <el-button link type="primary" size="small" @click="saveReceiptPayment(scope.row)" v-if="scope.row.editType">淇濆瓨</el-button>
-                  <el-button link type="primary" size="small" @click="delReceiptRecord(scope.row)">鍒犻櫎</el-button>
+                  <el-button
+                    link
+                    type="primary"
+                    size="small"
+                    @click="changeEditType(scope.row)"
+                    v-if="!scope.row.editType"
+                    >缂栬緫</el-button
+                  >
+                  <el-button
+                    link
+                    type="primary"
+                    size="small"
+                    @click="saveReceiptPayment(scope.row)"
+                    v-if="scope.row.editType"
+                    >淇濆瓨</el-button
+                  >
+                  <el-button
+                    link
+                    type="primary"
+                    size="small"
+                    @click="delReceiptRecord(scope.row)"
+                    >鍒犻櫎</el-button
+                  >
                 </template>
               </el-table-column>
             </el-table>
           </template>
         </el-table-column>
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip/>
-        <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" show-overflow-tooltip/>
-        <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip/>
-        <el-table-column label="浜у搧澶х被" prop="productCategory" show-overflow-tooltip/>
-        <el-table-column label="鍙戠エ鍙�" prop="invoiceNo" show-overflow-tooltip/>
-        <el-table-column label="鍙戠エ閲戦(鍏�)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber"/>
-        <el-table-column label="绋庣巼" prop="taxRate" show-overflow-tooltip/>
-        <el-table-column label="鍥炴閲戦(鍏�)" prop="receiptPaymentAmountTotal" show-overflow-tooltip :formatter="formattedNumber"/>
-        <el-table-column label="寰呭洖娆鹃噾棰�(鍏�)" prop="noReceiptAmount" show-overflow-tooltip :formatter="formattedNumber"/>
+        <el-table-column
+          label="閿�鍞悎鍚屽彿"
+          prop="salesContractNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="瀹㈡埛鍚堝悓鍙�"
+          prop="customerContractNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="瀹㈡埛鍚嶇О"
+          prop="customerName"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="椤圭洰鍚嶇О"
+          prop="customerName"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="浜у搧澶х被"
+          prop="productCategory"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍙戠エ鍙�"
+          prop="invoiceNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍙戠エ閲戦(鍏�)"
+          prop="invoiceTotal"
+          show-overflow-tooltip
+          :formatter="formattedNumber"
+        />
+        <el-table-column label="绋庣巼" prop="taxRate" show-overflow-tooltip />
+        <el-table-column
+          label="鍥炴閲戦(鍏�)"
+          prop="receiptPaymentAmountTotal"
+          show-overflow-tooltip
+          :formatter="formattedNumber"
+        />
+        <el-table-column
+          label="寰呭洖娆鹃噾棰�(鍏�)"
+          prop="noReceiptAmount"
+          show-overflow-tooltip
+        >
+          <template #default="{ row, column }">
+            <el-text type="danger">
+              {{ formattedNumber(row, column, row.noReceiptAmount) }}
+            </el-text>
+          </template>
+        </el-table-column>
       </el-table>
-      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current"
-                  :limit="page.size" @pagination="paginationChange" />
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current"
+        :limit="page.size"
+        @pagination="paginationChange"
+      />
     </div>
-    <el-dialog v-model="dialogFormVisible" title="鏂板鍙戠エ鍙烽〉闈�" width="70%" @close="closeDia">
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+    <el-dialog
+      v-model="dialogFormVisible"
+      title="鏂板鍙戠エ鍙烽〉闈�"
+      width="70%"
+      @close="closeDia"
+    >
+      <el-form
+        :model="form"
+        label-width="140px"
+        label-position="top"
+        :rules="rules"
+        ref="formRef"
+      >
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input v-model="form.salesContractNo" placeholder="鑷姩濉厖" disabled />
+              <el-input
+                v-model="form.salesContractNo"
+                placeholder="鑷姩濉厖"
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
-              <el-input v-model="form.customerName" placeholder="鑷姩濉厖" disabled />
+              <el-input
+                v-model="form.customerName"
+                placeholder="鑷姩濉厖"
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNo">
-              <el-input v-model="form.invoiceNo" placeholder="鑷姩濉厖" disabled/>
+              <el-input
+                v-model="form.invoiceNo"
+                placeholder="鑷姩濉厖"
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceTotal">
-              <el-input type="number" v-model="form.invoiceTotal" placeholder="鑷姩濉厖" :step="0.01" disabled/>
+              <el-input
+                type="number"
+                v-model="form.invoiceTotal"
+                placeholder="鑷姩濉厖"
+                :step="0.01"
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="绋庣巼锛�" prop="taxRate">
-              <el-input type="number" v-model="form.taxRate" placeholder="鑷姩濉厖" :step="0.01" disabled/>
+              <el-input
+                type="number"
+                v-model="form.taxRate"
+                placeholder="鑷姩濉厖"
+                :step="0.01"
+                disabled
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鏈鍥炴閲戦锛�" prop="receiptPaymentAmount">
-              <el-input type="number" min="0" v-model="form.receiptPaymentAmount" placeholder="璇疯緭鍏�" :step="0.01" clearable/>
+              <el-input
+                type="number"
+                min="0"
+                v-model="form.receiptPaymentAmount"
+                placeholder="璇疯緭鍏�"
+                :step="0.01"
+                clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍥炴褰㈠紡锛�" prop="receiptPaymentType">
-              <el-select v-model="form.receiptPaymentType" placeholder="璇烽�夋嫨" clearable>
-                <el-option v-for="item in receipt_payment_type" :key="item.value" :label="item.label" :value="item.value"/>
+              <el-select
+                v-model="form.receiptPaymentType"
+                placeholder="璇烽�夋嫨"
+                clearable
+              >
+                <el-option
+                  v-for="item in receipt_payment_type"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鐧昏浜猴細" prop="registrant">
-              <el-input v-model="form.registrant" placeholder="璇疯緭鍏�" clearable disabled/>
+              <el-input
+                v-model="form.registrant"
+                placeholder="璇疯緭鍏�"
+                clearable
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -128,13 +298,13 @@
           <el-col :span="12">
             <el-form-item label="鏉ユ鏃ユ湡锛�" prop="receiptPaymentDate">
               <el-date-picker
-                  style="width: 100%"
-                  v-model="form.receiptPaymentDate"
-                  value-format="YYYY-MM-DD"
-                  format="YYYY-MM-DD"
-                  type="date"
-                  placeholder="璇烽�夋嫨"
-                  clearable
+                style="width: 100%"
+                v-model="form.receiptPaymentDate"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                type="date"
+                placeholder="璇烽�夋嫨"
+                clearable
               />
             </el-form-item>
           </el-col>
@@ -151,45 +321,48 @@
 </template>
 
 <script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
+import pagination from "@/components/PIMTable/Pagination.vue";
+import { ref } from "vue";
 import {
   receiptPaymentSaveOrUpdate,
   bindInvoiceNoRegPage,
   invoiceInfo,
   receiptPaymentHistoryListNoPage,
-  receiptPaymentDel
+  receiptPaymentDel,
 } from "../../../api/salesManagement/receiptPayment.js";
-import useUserStore from '@/store/modules/user'
-import { ElMessage,ElMessageBox } from 'element-plus'
-const userStore = useUserStore()
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const selectedRows = ref([])
-const tableLoading = ref(false)
+import useUserStore from "@/store/modules/user";
+import { ElMessage, ElMessageBox } from "element-plus";
+import useFormData from "@/hooks/useFormData";
+
+const userStore = useUserStore();
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
 const page = reactive({
   current: 1,
   size: 100,
-})
-const total = ref(0)
-const expandedRowKeys = ref([])
+});
+const total = ref(0);
+const expandedRowKeys = ref([]);
 
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const dialogFormVisible = ref(false)
+const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    searchText: '',
+    searchText: "",
+    status: false,
   },
   form: {
-    salesContractNo: '',
-    customerName: '',
-    invoiceNo: '',
-    invoiceTotal: '',
-    taxRate: '',
-    receiptPaymentAmount: '',
-    receiptPaymentType: '',
-    registrant: '',
-    receiptPaymentDate: ''
+    salesContractNo: "",
+    customerName: "",
+    invoiceNo: "",
+    invoiceTotal: "",
+    taxRate: "",
+    receiptPaymentAmount: "",
+    receiptPaymentType: "",
+    registrant: "",
+    receiptPaymentDate: "",
   },
   rules: {
     salesContractNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -197,14 +370,21 @@
     invoiceNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     invoiceTotal: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    receiptPaymentAmount: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    receiptPaymentType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    receiptPaymentAmount: [
+      { required: true, message: "璇烽�夋嫨", trigger: "change" },
+    ],
+    receiptPaymentType: [
+      { required: true, message: "璇烽�夋嫨", trigger: "change" },
+    ],
     registrant: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    receiptPaymentDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-  }
-})
-const { searchForm, form, rules } = toRefs(data)
-const { receipt_payment_type } = proxy.useDict("receipt_payment_type")
+    receiptPaymentDate: [
+      { required: true, message: "璇烽�夋嫨", trigger: "change" },
+    ],
+  },
+});
+const { form, rules } = toRefs(data);
+const { form: searchForm, resetForm } = useFormData(data.searchForm);
+const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
 
 const formattedNumber = (row, column, cellValue) => {
   return parseFloat(cellValue).toFixed(2);
@@ -212,151 +392,162 @@
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1
-  getList()
-}
+  page.current = 1;
+  getList();
+};
 const paginationChange = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
-  getList()
-}
+  getList();
+};
 const getList = () => {
-  expandedRowKeys.value = []
-  tableLoading.value = true
-  bindInvoiceNoRegPage({...searchForm.value, ...page}).then(res => {
-    tableLoading.value = false
-    tableData.value = res.data.records
-    total.value = res.data.total
-  }).catch(() => {
-    tableLoading.value = false
-  })
-}
+  expandedRowKeys.value = [];
+  tableLoading.value = true;
+  bindInvoiceNoRegPage({ ...searchForm, ...page })
+    .then((res) => {
+      tableLoading.value = false;
+      tableData.value = res.data.records;
+      total.value = res.data.total;
+    })
+    .catch(() => {
+      tableLoading.value = false;
+    });
+};
 // 灞曞紑琛�
 const expandChange = (row, expandedRows) => {
   if (expandedRows.length > 0) {
-    expandedRowKeys.value = []
+    expandedRowKeys.value = [];
     try {
-      receiptPaymentHistoryListNoPage({invoiceLedgerId: row.id,
-        type: 1 }).then(res => {
-        const index = tableData.value.findIndex(item => item.id === row.id);
+      receiptPaymentHistoryListNoPage({
+        invoiceLedgerId: row.id,
+        type: 1,
+      }).then((res) => {
+        const index = tableData.value.findIndex((item) => item.id === row.id);
         if (index > -1) {
-          if(res?.length > 0) {
-            res.forEach(item => {
-              item.editType = false
-            })
+          if (res?.length > 0) {
+            res.forEach((item) => {
+              item.editType = false;
+            });
           }
           tableData.value[index].children = res;
         }
-        expandedRowKeys.value.push(row.id)
-      })
+        expandedRowKeys.value.push(row.id);
+      });
     } catch (error) {
-      console.log(error)
+      console.log(error);
     }
   } else {
-    expandedRowKeys.value = []
+    expandedRowKeys.value = [];
   }
-}
+};
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  console.log('selection', selection)
-  selectedRows.value = selection.filter(item => item.customerContractNo !== null);
-}
+  console.log("selection", selection);
+  selectedRows.value = selection.filter(
+    (item) => item.customerContractNo !== null
+  );
+};
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ['invoiceTotal', 'receiptPaymentAmountTotal', 'noReceiptAmount'], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
+  return proxy.summarizeTable(
+    param,
+    ["invoiceTotal", "receiptPaymentAmountTotal", "noReceiptAmount"],
+    {
+      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+    }
+  );
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeChildrenTable = (param) => {
-  return proxy.summarizeTable(param, ['receiptPaymentAmount']);
-}
+  return proxy.summarizeTable(param, ["receiptPaymentAmount"]);
+};
 // 鎵撳紑寮规
 const openForm = () => {
-  form.value = {}
-  if(selectedRows.value.length !== 1) {
-    proxy.$modal.msgError("璇烽�夋嫨涓�鏉℃暟鎹�")
-    return
+  form.value = {};
+  if (selectedRows.value.length !== 1) {
+    proxy.$modal.msgError("璇烽�夋嫨涓�鏉℃暟鎹�");
+    return;
   }
   //
-  console.log('(selectedRows.value',selectedRows.value)
-  if(selectedRows.value[0].noReceiptAmount === 0){
-    proxy.$modal.msgError("寰呭洖娆鹃噾棰濅负0鍏�")
-    return
+  console.log("(selectedRows.value", selectedRows.value);
+  if (selectedRows.value[0].noReceiptAmount === 0) {
+    proxy.$modal.msgError("寰呭洖娆鹃噾棰濅负0鍏�");
+    return;
   }
-  invoiceInfo({id: selectedRows.value[0].id}).then(res => {
-    form.value = {...res.data}
-    form.value.invoiceLedgerId = form.value.id
-    form.value.id = ''
-    form.value.registrant = userStore.nickName
-  })
-  dialogFormVisible.value = true
-}
+  invoiceInfo({ id: selectedRows.value[0].id }).then((res) => {
+    form.value = { ...res.data };
+    form.value.invoiceLedgerId = form.value.id;
+    form.value.id = "";
+    form.value.registrant = userStore.nickName;
+  });
+  dialogFormVisible.value = true;
+};
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate(valid => {
+  proxy.$refs["formRef"].validate((valid) => {
     if (valid) {
-      receiptPaymentSaveOrUpdate(form.value).then(res => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-        closeDia()
-        getList()
-      })
+      receiptPaymentSaveOrUpdate(form.value).then((res) => {
+        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        closeDia();
+        getList();
+      });
     }
-  })
-}
+  });
+};
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef")
-  dialogFormVisible.value = false
-}
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+};
 
 // 鍒犻櫎鍥炴璁板綍
 const delReceiptRecord = (row) => {
-  console.log('row',row)
+  console.log("row", row);
   ElMessageBox.confirm("纭鍒犻櫎璇ヨ褰曞悧锛�", "鎻愮ず", {
     confirmButtonText: "纭畾",
     cancelButtonText: "鍙栨秷",
     type: "warning",
   })
-      .then(async () => {
-        try {
-          let ids = []
-          ids.push(row.id)
-          await receiptPaymentDel(ids);
-          ElMessage.success("鍒犻櫎鎴愬姛");
-          getList();
-        } catch (error) {
-          console.error("鍒犻櫎澶辫触:", error);
-          ElMessage.error("鍒犻櫎澶辫触");
-        }
-      })
-      .catch(() => {
-        ElMessage.info("宸插彇娑堝垹闄�");
-      });
-
-}
+    .then(async () => {
+      try {
+        let ids = [];
+        ids.push(row.id);
+        await receiptPaymentDel(ids);
+        ElMessage.success("鍒犻櫎鎴愬姛");
+        getList();
+      } catch (error) {
+        console.error("鍒犻櫎澶辫触:", error);
+        ElMessage.error("鍒犻櫎澶辫触");
+      }
+    })
+    .catch(() => {
+      ElMessage.info("宸插彇娑堝垹闄�");
+    });
+};
 
 // 缂栬緫淇敼鐘舵��
 const changeEditType = (row) => {
-  row.editType = !row.editType
-}
+  row.editType = !row.editType;
+};
 
 // 淇濆瓨鍥炴璁板綍
 const saveReceiptPayment = (row) => {
   let updateData = {
-    id:row.id,
+    id: row.id,
     receiptPaymentType: row.receiptPaymentType,
-    receiptPaymentAmount: row.receiptPaymentAmount
-  }
-  receiptPaymentSaveOrUpdate(updateData).then(res => {
-    row.editType = !row.editType
-  })
-}
+    receiptPaymentAmount: row.receiptPaymentAmount,
+  };
+  receiptPaymentSaveOrUpdate(updateData).then((res) => {
+    row.editType = !row.editType;
+  });
+};
 
-getList()
+getList();
 </script>
 
 <style scoped lang="scss">
-
+.table_list {
+  margin-top: unset;
+}
 </style>
diff --git a/src/views/salesManagement/receiptPaymentHistory/index.vue b/src/views/salesManagement/receiptPaymentHistory/index.vue
index 290fb31..5dd4e7a 100644
--- a/src/views/salesManagement/receiptPaymentHistory/index.vue
+++ b/src/views/salesManagement/receiptPaymentHistory/index.vue
@@ -1,119 +1,174 @@
 <template>
   <div class="app-container">
-    <div class="search_form">
-      <div>
-        <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
-        <el-input v-model="searchForm.searchText" style="width: 240px" placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
-                  @change="handleQuery" clearable :prefix-icon="Search" />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
-      </div>
-    </div>
+    <el-form :model="searchForm" :inline="true">
+      <el-form-item label="瀹㈡埛鍚嶇О">
+        <el-input
+          v-model="searchForm.searchText"
+          style="width: 240px"
+          placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
+          @change="handleQuery"
+          clearable
+          :prefix-icon="Search"
+        />
+      </el-form-item>
+      <el-form-item label="鍥炴鏃ユ湡">
+        <el-date-picker
+          v-model="searchForm.receiptPaymentDate"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+          type="daterange"
+          start-placeholder="寮�濮嬫椂闂�"
+          end-placeholder="缁撴潫鏃堕棿"
+          clearable
+          @change="changeDateRange"
+          @clear="clearRange"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
+      </el-form-item>
+    </el-form>
     <div class="table_list">
-      <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true"
-                :isShowSummary="isShowSummarySon"
-                :summaryMethod="summarizeMainTable1"
-                :handleSelectionChange="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination"
-                :total="total"></PIMTable>
+      <PIMTable
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="true"
+        :isShowSummary="isShowSummarySon"
+        :summaryMethod="summarizeMainTable1"
+        :handleSelectionChange="handleSelectionChange"
+        :tableLoading="tableLoading"
+        @pagination="pagination"
+        :total="total"
+      ></PIMTable>
     </div>
   </div>
 </template>
 
 <script setup>
-import { ref } from 'vue'
+import { ref } from "vue";
 import { Search } from "@element-plus/icons-vue";
-import {
-  receiptPaymentHistoryListPage
-} from "@/api/salesManagement/receiptPayment.js";
-const { proxy } = getCurrentInstance()
+import { receiptPaymentHistoryListPage } from "@/api/salesManagement/receiptPayment.js";
+import useFormData from "@/hooks/useFormData";
+import dayjs from "dayjs";
+
+const { proxy } = getCurrentInstance();
 const tableColumn = ref([
   {
-    label: '鍥炴鏃ユ湡',
-    prop: 'receiptPaymentDate',
+    label: "鍥炴鏃ユ湡",
+    prop: "receiptPaymentDate",
   },
   {
-    label: '瀹㈡埛鍚嶇О',
-    prop: 'customerName',
+    label: "瀹㈡埛鍚嶇О",
+    prop: "customerName",
   },
   {
-    label: '鍥炴閲戦',
-    prop: 'receiptPaymentAmount',
+    label: "鍥炴閲戦锛堝厓锛�",
+    prop: "receiptPaymentAmount",
     formatData: (params) => {
       return parseFloat(params).toFixed(2);
-    }
+    },
   },
   {
-    label: '鍥炴鏂瑰紡',
-    prop: 'receiptPaymentType',
-    dataType: 'tag',
+    label: "鍥炴鏂瑰紡",
+    prop: "receiptPaymentType",
+    dataType: "tag",
     formatData: (params) => {
       if (params == 0) {
-        return '鐢垫眹';
+        return "鐢垫眹";
       } else if (params == 1) {
-        return '鎵垮厬';
+        return "鎵垮厬";
       } else {
-        return null
+        return null;
       }
     },
     formatType: (params) => {
-      return "info"
-    }
+      return "info";
+    },
   },
   {
-    label: '鐧昏浜�',
-    prop: 'registrant'
+    label: "鐧昏浜�",
+    prop: "registrant",
   },
   {
-    label: '鐧昏鏃ユ湡',
-    prop: 'createTime'
-  }
-])
-const tableData = ref([])
-const selectedRows = ref([])
-const tableLoading = ref(false)
+    label: "鐧昏鏃ユ湡",
+    prop: "createTime",
+  },
+]);
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
 const page = reactive({
   current: 1,
   size: 100,
-})
-const total = ref(0)
-const data = reactive({
-  searchForm: {
-    searchText: '',
-  },
-})
-const { searchForm } = toRefs(data)
-const { receipt_payment_type } = proxy.useDict("receipt_payment_type")
+});
+const total = ref(0);
+
+const { form: searchForm } = useFormData({
+  searchText: undefined,
+  receiptPaymentDate: [
+    dayjs().startOf("month").format("YYYY-MM-DD"),
+    dayjs().endOf("month").format("YYYY-MM-DD"),
+  ],
+  receiptPaymentDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
+  receiptPaymentDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
+});
+const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
 const isShowSummarySon = ref(true);
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1
-  getList()
-}
+  page.current = 1;
+  getList();
+};
 const pagination = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
-  getList()
-}
+  getList();
+};
 const getList = () => {
-  tableLoading.value = true
-  receiptPaymentHistoryListPage({ ...searchForm.value, ...page }).then(res => {
-    tableLoading.value = false
-    tableData.value = res.records
-    total.value = res.total
-  })
-}
+  tableLoading.value = true;
+  const { receiptPaymentDate, ...rest } = searchForm;
+  receiptPaymentHistoryListPage({ ...rest, ...page }).then((res) => {
+    tableLoading.value = false;
+    tableData.value = res.records;
+    total.value = res.total;
+  });
+};
 // 瀛愯〃鍚堣鏂规硶
 const summarizeMainTable1 = (param) => {
-  return proxy.summarizeTable(param, ['receiptPaymentAmount'], {
+  return proxy.summarizeTable(param, ["receiptPaymentAmount"], {
     ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
     futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
   });
 };
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  selectedRows.value = selection
-}
-getList()
+  selectedRows.value = selection;
+};
+
+const changeDateRange = (date) => {
+  if (date) {
+    searchForm.receiptPaymentDateStart = date[0];
+    searchForm.receiptPaymentDateEnd = date[1];
+    getList();
+  }
+};
+
+const clearRange = () => {
+  searchForm.receiptPaymentDate = [];
+  searchForm.receiptPaymentDateStart = undefined;
+  searchForm.receiptPaymentDateEnd = undefined;
+  getList();
+};
+
+onMounted(() => {
+  getList();
+});
 </script>
 
-<style scoped lang="scss"></style>
+<style scoped lang="scss">
+.table_list {
+  margin-top: unset;
+}
+</style>
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index 2155737..aa6ffb3 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -4,158 +4,244 @@
       <div>
         <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
         <el-input
-            v-model="searchForm.searchText"
-            style="width: 240px"
-            placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
-            @change="handleQuery"
-            clearable
-            prefix-icon="Search"
+          v-model="searchForm.searchText"
+          style="width: 240px"
+          placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
+          @change="handleQuery"
+          clearable
+          prefix-icon="Search"
         />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+          >鎼滅储</el-button
+        >
       </div>
     </div>
     <div style="display: flex">
       <div class="table_list">
-        <el-table :data="tableData" border v-loading="tableLoading"
-                  :row-key="row => row.id"
-                  show-summary
-                  :summary-method="summarizeMainTable"
-                  @row-click = "rowClickMethod"
-                  height="calc(100vh - 18.5em)">
-          <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-          <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip/>
-          <el-table-column label="寮�绁ㄩ噾棰�(鍏�)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber"/>
-          <el-table-column label="鍥炴閲戦(鍏�)" prop="receiptPaymentAmount" show-overflow-tooltip :formatter="formattedNumber"/>
-          <el-table-column label="鏈洖娆鹃噾棰�(鍏�)" prop="unReceiptPaymentAmount" show-overflow-tooltip :formatter="formattedNumber"/>
+        <el-table
+          :data="tableData"
+          border
+          v-loading="tableLoading"
+          :row-key="(row) => row.id"
+          show-summary
+          :summary-method="summarizeMainTable"
+          @row-click="rowClickMethod"
+          height="calc(100vh - 18.5em)"
+        >
+          <el-table-column
+            align="center"
+            label="搴忓彿"
+            type="index"
+            width="60"
+          />
+          <el-table-column
+            label="瀹㈡埛鍚嶇О"
+            prop="customerName"
+            show-overflow-tooltip
+          />
+          <el-table-column
+            label="寮�绁ㄩ噾棰�(鍏�)"
+            prop="invoiceTotal"
+            show-overflow-tooltip
+            :formatter="formattedNumber"
+          />
+          <el-table-column
+            label="鍥炴閲戦(鍏�)"
+            prop="receiptPaymentAmount"
+            show-overflow-tooltip
+            :formatter="formattedNumber"
+          />
+          <el-table-column
+            label="搴旀敹閲戦(鍏�)"
+            prop="unReceiptPaymentAmount"
+            show-overflow-tooltip
+          >
+            <template #default="{ row, column }">
+              <el-text type="danger">
+                {{ formattedNumber(row, column, row.unReceiptPaymentAmount) }}
+              </el-text>
+            </template>
+          </el-table-column>
         </el-table>
-        <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current"
-                    :limit="page.size" @pagination="paginationChange" />
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          layout="total, sizes, prev, pager, next, jumper"
+          :page="page.current"
+          :limit="page.size"
+          @pagination="paginationChange"
+        />
       </div>
       <div class="table_list">
-        <el-table :data="receiptRecord" border
-                  :row-key="row => row.id"
-                  show-summary
-                  :summary-method="summarizeMainTable1"
-                  height="calc(100vh - 18.5em)">
-          <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-          <el-table-column label="鍙戠敓鏃ユ湡" prop="happenTime" show-overflow-tooltip/>
-          <el-table-column label="寮�绁ㄩ噾棰�(鍏�)" prop="invoiceAmount" show-overflow-tooltip :formatter="formattedNumber"/>
-          <el-table-column label="鍥炴閲戦(鍏�)" prop="receiptAmount" show-overflow-tooltip :formatter="formattedNumber"/>
-          <el-table-column label="搴旀敹閲戦(鍏�)" prop="unReceiptAmount" show-overflow-tooltip :formatter="formattedNumber"/>
+        <el-table
+          :data="receiptRecord"
+          border
+          :row-key="(row) => row.id"
+          show-summary
+          :summary-method="summarizeMainTable1"
+          height="calc(100vh - 18.5em)"
+        >
+          <el-table-column
+            align="center"
+            label="搴忓彿"
+            type="index"
+            width="60"
+          />
+          <el-table-column
+            label="鍙戠敓鏃ユ湡"
+            prop="happenTime"
+            show-overflow-tooltip
+          />
+          <el-table-column
+            label="寮�绁ㄩ噾棰�(鍏�)"
+            prop="invoiceAmount"
+            show-overflow-tooltip
+            :formatter="formattedNumber"
+          />
+          <el-table-column
+            label="鍥炴閲戦(鍏�)"
+            prop="receiptAmount"
+            show-overflow-tooltip
+            :formatter="formattedNumber"
+          />
+          <el-table-column
+            label="搴旀敹閲戦(鍏�)"
+            prop="unReceiptAmount"
+            show-overflow-tooltip
+          >
+            <template #default="{ row, column }">
+              <el-text type="danger">
+                {{ formattedNumber(row, column, row.unReceiptAmount) }}
+              </el-text>
+            </template>
+          </el-table-column>
         </el-table>
-        <pagination v-show="recordTotal > 0" :total="recordTotal" layout="total, sizes, prev, pager, next, jumper" :page="recordPage.current"
-                    :limit="recordPage.size" @pagination="recordPaginationChange" />
+        <pagination
+          v-show="recordTotal > 0"
+          :total="recordTotal"
+          layout="total, sizes, prev, pager, next, jumper"
+          :page="recordPage.current"
+          :limit="recordPage.size"
+          @pagination="recordPaginationChange"
+        />
       </div>
     </div>
-
   </div>
 </template>
 
 <script setup>
-import { ref } from 'vue'
-import {
-  invoiceLedgerSalesAccount,
-} from "../../../api/salesManagement/invoiceLedger.js";
-import {
-  customerInteractions
-} from "../../../api/salesManagement/receiptPayment.js";
+import { ref } from "vue";
+import { invoiceLedgerSalesAccount } from "../../../api/salesManagement/invoiceLedger.js";
+import { customerInteractions } from "../../../api/salesManagement/receiptPayment.js";
 import Pagination from "../../../components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const receiptRecord = ref([])
-const tableLoading = ref(false)
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const receiptRecord = ref([]);
+const tableLoading = ref(false);
 const page = reactive({
   current: 1,
   size: 100,
-})
+});
 const recordPage = reactive({
   current: 1,
   size: 100,
-})
-const total = ref(0)
-const recordTotal = ref(0)
+});
+const total = ref(0);
+const recordTotal = ref(0);
 const data = reactive({
   searchForm: {
-    searchText: '',
-    invoiceDate:''
-  }
-})
-const customerId = ref('')
-const { searchForm } = toRefs(data)
-const originReceiptRecord = ref([])
+    searchText: "",
+    invoiceDate: "",
+  },
+});
+const customerId = ref("");
+const { searchForm } = toRefs(data);
+const originReceiptRecord = ref([]);
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1
-  getList()
-}
+  page.current = 1;
+  getList();
+};
 const paginationChange = (obj) => {
-  console.log('paginationChange', current,limit)
+  console.log("paginationChange", current, limit);
   page.current = obj.page;
   page.size = obj.limit;
-  getList()
-}
+  getList();
+};
 const getList = () => {
-  tableLoading.value = true
-  invoiceLedgerSalesAccount({...searchForm.value, ...page}).then(res => {
-    tableLoading.value = false
+  tableLoading.value = true;
+  invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => {
+    tableLoading.value = false;
     tableData.value = res.data.records;
     total.value = res.data.total;
-    if(tableData.value.length > 0) {
-      recordPage.current = 1
-      customerId.value = tableData.value[0].id
+    if (tableData.value.length > 0) {
+      recordPage.current = 1;
+      customerId.value = tableData.value[0].id;
       receiptPaymentList(customerId.value);
     }
-  })
-}
+  });
+};
 const formattedNumber = (row, column, cellValue) => {
   return parseFloat(cellValue).toFixed(2);
 };
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ['invoiceTotal', 'receiptPaymentAmount', 'unReceiptPaymentAmount'], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
+  return proxy.summarizeTable(
+    param,
+    ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
+    {
+      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+    }
+  );
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeMainTable1 = (param) => {
-  var summarizeTable = proxy.summarizeTable(param, ['invoiceAmount', 'receiptAmount'], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
-  console.log('summarizeTable',summarizeTable)
-  // 鍙栨渶鍚庝竴琛屾暟鎹�
-  if(receiptRecord.value?.length > 0) {
-    summarizeTable[summarizeTable.length - 1] = receiptRecord.value[receiptRecord.value.length - 1].unReceiptAmount.toFixed(2);
-  }else {
-    summarizeTable[summarizeTable.length - 1] = 0.00
+  var summarizeTable = proxy.summarizeTable(
+    param,
+    ["invoiceAmount", "receiptAmount"],
+    {
+      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+    }
+  );
+  // 鍙栨渶鍚庝竴琛屾暟鎹�;
+  if (receiptRecord.value?.length > 0) {
+    const index = tableData.value.findIndex(
+      (item) => item.id == customerId.value
+    );
+    summarizeTable[summarizeTable.length - 1] =
+      tableData.value[index].unReceiptPaymentAmount.toFixed(2);
+  } else {
+    summarizeTable[summarizeTable.length - 1] = 0.0;
   }
-
-  return summarizeTable
+  // const sb = tableData.findIndex((item) => item.id == customerId.value);
+  // console.log(sb);
+  return summarizeTable;
 };
 
 const receiptPaymentList = (id) => {
   const param = {
-    customerId:id
-  }
-  console.log('param', param)
-  customerInteractions(param).then(res => {
+    customerId: id,
+  };
+  console.log("param", param);
+  customerInteractions(param).then((res) => {
     originReceiptRecord.value = res.data;
     handlePagination({ page: 1, limit: recordPage.size });
     recordTotal.value = res.data.length;
-  })
-}
+  });
+};
 
 // 姹囨璁板綍鍒楄〃鍒嗛〉
 const recordPaginationChange = (pagination) => {
   handlePagination(pagination);
-}
+};
 
 const rowClickMethod = (row) => {
   customerId.value = row.id;
   receiptPaymentList(customerId.value);
-}
+};
 
 const handlePagination = ({ page, limit }) => {
   recordPage.current = page;
@@ -165,16 +251,13 @@
   const end = start + limit;
 
   receiptRecord.value = originReceiptRecord.value.slice(start, end);
-}
+};
 
-
-getList()
+getList();
 </script>
 
 <style scoped lang="scss">
-
 .table_list {
   width: 50%;
 }
-
 </style>
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 4120fc3..8363b68 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -1,69 +1,209 @@
 <template>
   <div class="app-container">
     <el-row :gutter="20" style="height: calc(100vh - 8em)">
-      <splitpanes :horizontal="appStore.device === 'mobile'" class="default-theme">
+      <splitpanes
+        :horizontal="appStore.device === 'mobile'"
+        class="default-theme"
+      >
         <!--閮ㄩ棬鏁版嵁-->
         <pane size="16">
           <el-col style="padding: 10px">
             <div class="head-container">
-              <el-input v-model="deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" clearable prefix-icon="Search" style="margin-bottom: 20px" />
+              <el-input
+                v-model="deptName"
+                placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
+                clearable
+                prefix-icon="Search"
+                style="margin-bottom: 20px"
+              />
             </div>
             <div class="head-container">
-              <el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }" :expand-on-click-node="false" :filter-node-method="filterNode" ref="deptTreeRef" node-key="id" highlight-current default-expand-all @node-click="handleNodeClick" />
+              <el-tree
+                :data="deptOptions"
+                :props="{ label: 'label', children: 'children' }"
+                :expand-on-click-node="false"
+                :filter-node-method="filterNode"
+                ref="deptTreeRef"
+                node-key="id"
+                highlight-current
+                default-expand-all
+                @node-click="handleNodeClick"
+              />
             </div>
           </el-col>
         </pane>
         <!--鐢ㄦ埛鏁版嵁-->
         <pane size="84">
           <el-col style="padding: 10px">
-            <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+            <el-form
+              :model="queryParams"
+              ref="queryRef"
+              :inline="true"
+              v-show="showSearch"
+              label-width="68px"
+            >
               <el-form-item label="鐧诲綍璐﹀彿" prop="userName">
-                <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ櫥褰曡处鍙�" clearable style="width: 240px" @keyup.enter="handleQuery" />
+                <el-input
+                  v-model="queryParams.userName"
+                  placeholder="璇疯緭鍏ョ櫥褰曡处鍙�"
+                  clearable
+                  style="width: 240px"
+                  @keyup.enter="handleQuery"
+                />
               </el-form-item>
               <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
-                <el-input v-model="queryParams.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" clearable style="width: 240px" @keyup.enter="handleQuery" />
+                <el-input
+                  v-model="queryParams.phonenumber"
+                  placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�"
+                  clearable
+                  style="width: 240px"
+                  @keyup.enter="handleQuery"
+                />
               </el-form-item>
               <el-form-item label="鐘舵��" prop="status">
-                <el-select v-model="queryParams.status" placeholder="鐢ㄦ埛鐘舵��" clearable style="width: 240px">
-                  <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-select
+                  v-model="queryParams.status"
+                  placeholder="鐢ㄦ埛鐘舵��"
+                  clearable
+                  style="width: 240px"
+                >
+                  <el-option
+                    v-for="dict in sys_normal_disable"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
                 </el-select>
               </el-form-item>
               <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px">
-                <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡"></el-date-picker>
+                <el-date-picker
+                  v-model="dateRange"
+                  value-format="YYYY-MM-DD"
+                  type="daterange"
+                  range-separator="-"
+                  start-placeholder="寮�濮嬫棩鏈�"
+                  end-placeholder="缁撴潫鏃ユ湡"
+                ></el-date-picker>
               </el-form-item>
               <el-form-item>
-                <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+                <el-button type="primary" icon="Search" @click="handleQuery"
+                  >鎼滅储</el-button
+                >
                 <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
               </el-form-item>
             </el-form>
 
             <el-row :gutter="10" class="mb8">
               <el-col :span="1.5">
-                <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:user:add']">鏂板</el-button>
+                <el-button
+                  type="primary"
+                  plain
+                  icon="Plus"
+                  @click="handleAdd"
+                  v-hasPermi="['system:user:add']"
+                  >鏂板</el-button
+                >
               </el-col>
               <el-col :span="1.5">
-                <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:user:edit']">淇敼</el-button>
+                <el-button
+                  type="success"
+                  plain
+                  icon="Edit"
+                  :disabled="single"
+                  @click="handleUpdate"
+                  v-hasPermi="['system:user:edit']"
+                  >淇敼</el-button
+                >
               </el-col>
               <el-col :span="1.5">
-                <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:user:remove']">鍒犻櫎</el-button>
+                <el-button
+                  type="danger"
+                  plain
+                  icon="Delete"
+                  :disabled="multiple"
+                  @click="handleDelete"
+                  v-hasPermi="['system:user:remove']"
+                  >鍒犻櫎</el-button
+                >
               </el-col>
               <el-col :span="1.5">
-                <el-button type="info" plain icon="Upload" @click="handleImport" v-hasPermi="['system:user:import']">瀵煎叆</el-button>
+                <el-button
+                  type="info"
+                  plain
+                  icon="Upload"
+                  @click="handleImport"
+                  v-hasPermi="['system:user:import']"
+                  >瀵煎叆</el-button
+                >
               </el-col>
               <el-col :span="1.5">
-                <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:user:export']">瀵煎嚭</el-button>
+                <el-button
+                  type="warning"
+                  plain
+                  icon="Download"
+                  @click="handleExport"
+                  v-hasPermi="['system:user:export']"
+                  >瀵煎嚭</el-button
+                >
               </el-col>
-              <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+              <right-toolbar
+                v-model:showSearch="showSearch"
+                @queryTable="getList"
+                :columns="columns"
+              ></right-toolbar>
             </el-row>
 
-            <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
+            <el-table
+              v-loading="loading"
+              :data="userList"
+              @selection-change="handleSelectionChange"
+            >
               <el-table-column type="selection" width="50" align="center" />
-              <el-table-column label="鐢ㄦ埛缂栧彿" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
-              <el-table-column label="鐧诲綍璐﹀彿" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
-              <el-table-column label="鐢ㄦ埛鏄电О" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
-              <el-table-column label="閮ㄩ棬" align="center" key="deptNames" prop="deptNames" v-if="columns[3].visible" :show-overflow-tooltip="true" />
-              <el-table-column label="鎵嬫満鍙风爜" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
-              <el-table-column label="鐘舵��" align="center" key="status" v-if="columns[5].visible">
+              <el-table-column
+                label="鐢ㄦ埛缂栧彿"
+                align="center"
+                key="userId"
+                prop="userId"
+                v-if="columns[0].visible"
+              />
+              <el-table-column
+                label="鐧诲綍璐﹀彿"
+                align="center"
+                key="userName"
+                prop="userName"
+                v-if="columns[1].visible"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="鐢ㄦ埛鏄电О"
+                align="center"
+                key="nickName"
+                prop="nickName"
+                v-if="columns[2].visible"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="閮ㄩ棬"
+                align="center"
+                key="deptNames"
+                prop="deptNames"
+                v-if="columns[3].visible"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="鎵嬫満鍙风爜"
+                align="center"
+                key="phonenumber"
+                prop="phonenumber"
+                v-if="columns[4].visible"
+                width="120"
+              />
+              <el-table-column
+                label="鐘舵��"
+                align="center"
+                key="status"
+                v-if="columns[5].visible"
+              >
                 <template #default="scope">
                   <el-switch
                     v-model="scope.row.status"
@@ -73,29 +213,86 @@
                   ></el-switch>
                 </template>
               </el-table-column>
-              <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" v-if="columns[6].visible" width="160">
+              <el-table-column
+                label="鍒涘缓鏃堕棿"
+                align="center"
+                prop="createTime"
+                v-if="columns[6].visible"
+                width="160"
+              >
                 <template #default="scope">
                   <span>{{ parseTime(scope.row.createTime) }}</span>
                 </template>
               </el-table-column>
-              <el-table-column label="鎿嶄綔" align="center" width="150" class-name="small-padding fixed-width">
+              <el-table-column
+                label="鎿嶄綔"
+                align="center"
+                width="150"
+                class-name="small-padding fixed-width"
+              >
                 <template #default="scope">
-                  <el-tooltip content="淇敼" placement="top" v-if="scope.row.userId !== 1">
-                    <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']"></el-button>
+                  <el-tooltip
+                    content="淇敼"
+                    placement="top"
+                    v-if="scope.row.userId !== 1"
+                  >
+                    <el-button
+                      link
+                      type="primary"
+                      icon="Edit"
+                      @click="handleUpdate(scope.row)"
+                      v-hasPermi="['system:user:edit']"
+                    ></el-button>
                   </el-tooltip>
-                  <el-tooltip content="鍒犻櫎" placement="top" v-if="scope.row.userId !== 1">
-                    <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']"></el-button>
+                  <el-tooltip
+                    content="鍒犻櫎"
+                    placement="top"
+                    v-if="scope.row.userId !== 1"
+                  >
+                    <el-button
+                      link
+                      type="primary"
+                      icon="Delete"
+                      @click="handleDelete(scope.row)"
+                      v-hasPermi="['system:user:remove']"
+                    ></el-button>
                   </el-tooltip>
-                  <el-tooltip content="閲嶇疆瀵嗙爜" placement="top" v-if="scope.row.userId !== 1">
-                    <el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)" v-hasPermi="['system:user:resetPwd']"></el-button>
+                  <el-tooltip
+                    content="閲嶇疆瀵嗙爜"
+                    placement="top"
+                    v-if="scope.row.userId !== 1"
+                  >
+                    <el-button
+                      link
+                      type="primary"
+                      icon="Key"
+                      @click="handleResetPwd(scope.row)"
+                      v-hasPermi="['system:user:resetPwd']"
+                    ></el-button>
                   </el-tooltip>
-                  <el-tooltip content="鍒嗛厤瑙掕壊" placement="top" v-if="scope.row.userId !== 1">
-                    <el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)" v-hasPermi="['system:user:edit']"></el-button>
+                  <el-tooltip
+                    content="鍒嗛厤瑙掕壊"
+                    placement="top"
+                    v-if="scope.row.userId !== 1"
+                  >
+                    <el-button
+                      link
+                      type="primary"
+                      icon="CircleCheck"
+                      @click="handleAuthRole(scope.row)"
+                      v-hasPermi="['system:user:edit']"
+                    ></el-button>
                   </el-tooltip>
                 </template>
               </el-table-column>
             </el-table>
-            <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+            <pagination
+              v-show="total > 0"
+              :total="total"
+              v-model:page="queryParams.pageNum"
+              v-model:limit="queryParams.pageSize"
+              @pagination="getList"
+            />
           </el-col>
         </pane>
       </splitpanes>
@@ -107,42 +304,73 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
-              <el-input v-model="form.nickName" placeholder="璇疯緭鍏ョ敤鎴锋樀绉�" maxlength="30" />
+              <el-input
+                v-model="form.nickName"
+                placeholder="璇疯緭鍏ョ敤鎴锋樀绉�"
+                maxlength="30"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="褰掑睘鍏徃" prop="deptIds">
               <el-tree-select
-                  v-model="form.deptIds"
-                  :data="enabledDeptOptions"
-                  :render-after-expand="false"
-                  show-checkbox
-                  multiple
-                  placeholder="璇烽�夋嫨褰掑睘鍏徃" />
+                v-model="form.deptIds"
+                :data="enabledDeptOptions"
+                :render-after-expand="false"
+                show-checkbox
+                multiple
+                placeholder="璇烽�夋嫨褰掑睘鍏徃"
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
-              <el-input v-model="form.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="11" />
+              <el-input
+                v-model="form.phonenumber"
+                placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�"
+                maxlength="11"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="閭" prop="email">
-              <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />
+              <el-input
+                v-model="form.email"
+                placeholder="璇疯緭鍏ラ偖绠�"
+                maxlength="50"
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item v-if="form.userId == undefined" label="鐧诲綍璐﹀彿" prop="userName">
-              <el-input v-model="form.userName" placeholder="璇疯緭鍏ョ櫥褰曡处鍙�" maxlength="30" />
+            <el-form-item
+              v-if="form.userId == undefined"
+              label="鐧诲綍璐﹀彿"
+              prop="userName"
+            >
+              <el-input
+                v-model="form.userName"
+                placeholder="璇疯緭鍏ョ櫥褰曡处鍙�"
+                maxlength="30"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item v-if="form.userId == undefined" label="鐢ㄦ埛瀵嗙爜" prop="password">
-              <el-input v-model="form.password" placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" type="password" maxlength="20" show-password />
+            <el-form-item
+              v-if="form.userId == undefined"
+              label="鐢ㄦ埛瀵嗙爜"
+              prop="password"
+            >
+              <el-input
+                v-model="form.password"
+                placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�"
+                type="password"
+                maxlength="20"
+                show-password
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -150,14 +378,24 @@
           <el-col :span="12">
             <el-form-item label="鐢ㄦ埛鎬у埆">
               <el-select v-model="form.sex" placeholder="璇烽�夋嫨">
-                <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+                <el-option
+                  v-for="dict in sys_user_sex"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鐘舵��">
               <el-radio-group v-model="form.status">
-                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+                <el-radio
+                  v-for="dict in sys_normal_disable"
+                  :key="dict.value"
+                  :value="dict.value"
+                  >{{ dict.label }}</el-radio
+                >
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -166,14 +404,26 @@
           <el-col :span="12">
             <el-form-item label="宀椾綅">
               <el-select v-model="form.postIds" multiple placeholder="璇烽�夋嫨">
-                <el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId" :disabled="item.status == 1"></el-option>
+                <el-option
+                  v-for="item in postOptions"
+                  :key="item.postId"
+                  :label="item.postName"
+                  :value="item.postId"
+                  :disabled="item.status == 1"
+                ></el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="瑙掕壊">
               <el-select v-model="form.roleIds" multiple placeholder="璇烽�夋嫨">
-                <el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
+                <el-option
+                  v-for="item in roleOptions"
+                  :key="item.roleId"
+                  :label="item.roleName"
+                  :value="item.roleId"
+                  :disabled="item.status == 1"
+                ></el-option>
               </el-select>
             </el-form-item>
           </el-col>
@@ -181,7 +431,11 @@
         <el-row>
           <el-col :span="24">
             <el-form-item label="澶囨敞">
-              <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+              <el-input
+                v-model="form.remark"
+                type="textarea"
+                placeholder="璇疯緭鍏ュ唴瀹�"
+              ></el-input>
             </el-form-item>
           </el-col>
         </el-row>
@@ -195,17 +449,41 @@
     </el-dialog>
 
     <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
-    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
-      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+    <el-dialog
+      :title="upload.title"
+      v-model="upload.open"
+      width="400px"
+      append-to-body
+    >
+      <el-upload
+        ref="uploadRef"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
         <el-icon class="el-icon--upload"><upload-filled /></el-icon>
         <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
         <template #tip>
           <div class="el-upload__tip text-center">
             <div class="el-upload__tip">
-              <el-checkbox v-model="upload.updateSupport" />鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+              <el-checkbox
+                v-model="upload.updateSupport"
+              />鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
             </div>
             <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
-            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">涓嬭浇妯℃澘</el-link>
+            <el-link
+              type="primary"
+              :underline="false"
+              style="font-size: 12px; vertical-align: baseline"
+              @click="importTemplate"
+              >涓嬭浇妯℃澘</el-link
+            >
           </div>
         </template>
       </el-upload>
@@ -220,33 +498,45 @@
 </template>
 
 <script setup name="User">
-import { getToken } from "@/utils/auth"
-import useAppStore from '@/store/modules/app'
-import { changeUserStatus, listUser, resetUserPwd, delUser, getUser, updateUser, addUser, deptTreeSelect } from "@/api/system/user"
-import { Splitpanes, Pane } from "splitpanes"
-import "splitpanes/dist/splitpanes.css"
+import { getToken } from "@/utils/auth";
+import useAppStore from "@/store/modules/app";
+import {
+  changeUserStatus,
+  listUser,
+  resetUserPwd,
+  delUser,
+  getUser,
+  updateUser,
+  addUser,
+  deptTreeSelect,
+} from "@/api/system/user";
+import { Splitpanes, Pane } from "splitpanes";
+import "splitpanes/dist/splitpanes.css";
 
-const router = useRouter()
-const appStore = useAppStore()
-const { proxy } = getCurrentInstance()
-const { sys_normal_disable, sys_user_sex } = proxy.useDict("sys_normal_disable", "sys_user_sex")
+const router = useRouter();
+const appStore = useAppStore();
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable, sys_user_sex } = proxy.useDict(
+  "sys_normal_disable",
+  "sys_user_sex"
+);
 
-const userList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
-const dateRange = ref([])
-const deptName = ref("")
-const deptOptions = ref(undefined)
-const enabledDeptOptions = ref(undefined)
-const initPassword = ref(undefined)
-const postOptions = ref([])
-const roleOptions = ref([])
+const userList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+const dateRange = ref([]);
+const deptName = ref("");
+const deptOptions = ref(undefined);
+const enabledDeptOptions = ref(undefined);
+const initPassword = ref(undefined);
+const postOptions = ref([]);
+const roleOptions = ref([]);
 /*** 鐢ㄦ埛瀵煎叆鍙傛暟 */
 const upload = reactive({
   // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛�
@@ -260,8 +550,8 @@
   // 璁剧疆涓婁紶鐨勮姹傚ご閮�
   headers: { Authorization: "Bearer " + getToken() },
   // 涓婁紶鐨勫湴鍧�
-  url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
-})
+  url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData",
+});
 // 鍒楁樉闅愪俊鎭�
 const columns = ref([
   { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
@@ -270,8 +560,8 @@
   { key: 3, label: `閮ㄩ棬`, visible: true },
   { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
   { key: 5, label: `鐘舵�乣, visible: true },
-  { key: 6, label: `鍒涘缓鏃堕棿`, visible: true }
-])
+  { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
+]);
 
 const data = reactive({
   form: {},
@@ -281,189 +571,252 @@
     userName: undefined,
     phonenumber: undefined,
     status: undefined,
-    deptId: undefined
+    deptId: undefined,
   },
   rules: {
-    userName: [{ required: true, message: "鐧诲綍璐﹀彿涓嶈兘涓虹┖", trigger: "blur" }, { min: 2, max: 20, message: "鐧诲綍璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", trigger: "blur" }],
-    nickName: [{ required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }],
+    userName: [
+      { required: true, message: "鐧诲綍璐﹀彿涓嶈兘涓虹┖", trigger: "blur" },
+      {
+        min: 2,
+        max: 20,
+        message: "鐧诲綍璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+        trigger: "blur",
+      },
+    ],
+    nickName: [
+      { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+    ],
     deptIds: [{ required: true, message: "鍏徃涓嶈兘涓虹┖", trigger: "change" }],
-    password: [{ required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, { min: 5, max: 20, message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" }],
-    email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
-    phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }]
-  }
-})
+    password: [
+      { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+      {
+        min: 5,
+        max: 20,
+        message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+        trigger: "blur",
+      },
+      {
+        pattern: /^[^<>"'|\\]+$/,
+        message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |",
+        trigger: "blur",
+      },
+    ],
+    email: [
+      {
+        type: "email",
+        message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+        trigger: ["blur", "change"],
+      },
+    ],
+    phonenumber: [
+      {
+        pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+        message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+        trigger: "blur",
+      },
+    ],
+  },
+});
 
-const { queryParams, form, rules } = toRefs(data)
+const { queryParams, form, rules } = toRefs(data);
 
 /** 閫氳繃鏉′欢杩囨护鑺傜偣  */
 const filterNode = (value, data) => {
-  if (!value) return true
-  return data.label.indexOf(value) !== -1
-}
+  if (!value) return true;
+  return data.label.indexOf(value) !== -1;
+};
 
 /** 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲 */
-watch(deptName, val => {
-  proxy.$refs["deptTreeRef"].filter(val)
-})
+watch(deptName, (val) => {
+  proxy.$refs["deptTreeRef"].filter(val);
+});
 
 /** 鏌ヨ鐢ㄦ埛鍒楄〃 */
 function getList() {
-  loading.value = true
-  listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
-    loading.value = false
-    userList.value = res.rows
-    total.value = res.total
-  })
+  loading.value = true;
+  listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(
+    (res) => {
+      loading.value = false;
+      userList.value = res.rows;
+      total.value = res.total;
+    }
+  );
 }
 
 /** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */
 function getDeptTree() {
-  deptTreeSelect().then(response => {
-    deptOptions.value = response.data
-    enabledDeptOptions.value = filterDisabledDept(JSON.parse(JSON.stringify(response.data)))
-  })
+  deptTreeSelect().then((response) => {
+    deptOptions.value = response.data;
+    enabledDeptOptions.value = filterDisabledDept(
+      JSON.parse(JSON.stringify(response.data))
+    );
+  });
 }
 
 /** 杩囨护绂佺敤鐨勯儴闂� */
 function filterDisabledDept(deptList) {
-  return deptList.filter(dept => {
+  return deptList.filter((dept) => {
     if (dept.disabled) {
-      return false
+      return false;
     }
     if (dept.children && dept.children.length) {
-      dept.children = filterDisabledDept(dept.children)
+      dept.children = filterDisabledDept(dept.children);
     }
-    return true
-  })
+    return true;
+  });
 }
 
 /** 鑺傜偣鍗曞嚮浜嬩欢 */
 function handleNodeClick(data) {
-  queryParams.value.deptId = data.id
-  handleQuery()
+  queryParams.value.deptId = data.id;
+  handleQuery();
 }
 
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 function handleQuery() {
-  queryParams.value.pageNum = 1
-  getList()
+  queryParams.value.pageNum = 1;
+  getList();
 }
 
 /** 閲嶇疆鎸夐挳鎿嶄綔 */
 function resetQuery() {
-  dateRange.value = []
-  proxy.resetForm("queryRef")
-  queryParams.value.deptId = undefined
-  proxy.$refs.deptTreeRef.setCurrentKey(null)
-  handleQuery()
+  dateRange.value = [];
+  proxy.resetForm("queryRef");
+  queryParams.value.deptId = undefined;
+  proxy.$refs.deptTreeRef.setCurrentKey(null);
+  handleQuery();
 }
 
 /** 鍒犻櫎鎸夐挳鎿嶄綔 */
 function handleDelete(row) {
-  const userIds = row.userId || ids.value
-  proxy.$modal.confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�').then(function () {
-    return delUser(userIds)
-  }).then(() => {
-    getList()
-    proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
-  }).catch(() => {})
+  const userIds = row.userId || ids.value;
+  proxy.$modal
+    .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+    .then(function () {
+      return delUser(userIds);
+    })
+    .then(() => {
+      getList();
+      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+    })
+    .catch(() => {});
 }
 
 /** 瀵煎嚭鎸夐挳鎿嶄綔 */
 function handleExport() {
-  proxy.download("system/user/export", {
-    ...queryParams.value,
-  },`user_${new Date().getTime()}.xlsx`)
+  proxy.download(
+    "system/user/export",
+    {
+      ...queryParams.value,
+    },
+    `user_${new Date().getTime()}.xlsx`
+  );
 }
 
 /** 鐢ㄦ埛鐘舵�佷慨鏀�  */
 function handleStatusChange(row) {
-  let text = row.status === "0" ? "鍚敤" : "鍋滅敤"
-  proxy.$modal.confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚�?').then(function () {
-    return changeUserStatus(row.userId, row.status)
-  }).then(() => {
-    proxy.$modal.msgSuccess(text + "鎴愬姛")
-  }).catch(function () {
-    row.status = row.status === "0" ? "1" : "0"
-  })
+  let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+  proxy.$modal
+    .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚�?')
+    .then(function () {
+      return changeUserStatus(row.userId, row.status);
+    })
+    .then(() => {
+      proxy.$modal.msgSuccess(text + "鎴愬姛");
+    })
+    .catch(function () {
+      row.status = row.status === "0" ? "1" : "0";
+    });
 }
 
 /** 鏇村鎿嶄綔 */
 function handleCommand(command, row) {
   switch (command) {
     case "handleResetPwd":
-      handleResetPwd(row)
-      break
+      handleResetPwd(row);
+      break;
     case "handleAuthRole":
-      handleAuthRole(row)
-      break
+      handleAuthRole(row);
+      break;
     default:
-      break
+      break;
   }
 }
 
 /** 璺宠浆瑙掕壊鍒嗛厤 */
 function handleAuthRole(row) {
-  const userId = row.userId
-  router.push("/system/user-auth/role/" + userId)
+  const userId = row.userId;
+  router.push("/system/user-auth/role/" + userId);
 }
 
 /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
 function handleResetPwd(row) {
-  proxy.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
-    confirmButtonText: "纭畾",
-    cancelButtonText: "鍙栨秷",
-    closeOnClickModal: false,
-    inputPattern: /^.{5,20}$/,
-    inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
-    inputValidator: (value) => {
-      if (/<|>|"|'|\||\\/.test(value)) {
-        return "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |"
-      }
-    },
-  }).then(({ value }) => {
-    resetUserPwd(row.userId, value).then(response => {
-      proxy.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value)
+  proxy
+    .$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+      confirmButtonText: "纭畾",
+      cancelButtonText: "鍙栨秷",
+      closeOnClickModal: false,
+      inputPattern: /^.{5,20}$/,
+      inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      inputValidator: (value) => {
+        if (/<|>|"|'|\||\\/.test(value)) {
+          return "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |";
+        }
+      },
     })
-  }).catch(() => {})
+    .then(({ value }) => {
+      resetUserPwd(row.userId, value).then((response) => {
+        proxy.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+      });
+    })
+    .catch(() => {});
 }
 
 /** 閫夋嫨鏉℃暟  */
 function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.userId)
-  single.value = selection.length != 1
-  multiple.value = !selection.length
+  ids.value = selection.map((item) => item.userId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
 }
 
 /** 瀵煎叆鎸夐挳鎿嶄綔 */
 function handleImport() {
-  upload.title = "鐢ㄦ埛瀵煎叆"
-  upload.open = true
+  upload.title = "鐢ㄦ埛瀵煎叆";
+  upload.open = true;
 }
 
 /** 涓嬭浇妯℃澘鎿嶄綔 */
 function importTemplate() {
-  proxy.download("system/user/importTemplate", {
-  }, `user_template_${new Date().getTime()}.xlsx`)
+  proxy.download(
+    "system/user/importTemplate",
+    {},
+    `user_template_${new Date().getTime()}.xlsx`
+  );
 }
 
 /**鏂囦欢涓婁紶涓鐞� */
 const handleFileUploadProgress = (event, file, fileList) => {
-  upload.isUploading = true
-}
+  upload.isUploading = true;
+};
 
 /** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
 const handleFileSuccess = (response, file, fileList) => {
-  upload.open = false
-  upload.isUploading = false
-  proxy.$refs["uploadRef"].handleRemove(file)
-  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "瀵煎叆缁撴灉", { dangerouslyUseHTMLString: true })
-  getList()
-}
+  upload.open = false;
+  upload.isUploading = false;
+  proxy.$refs["uploadRef"].handleRemove(file);
+  proxy.$alert(
+    "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
+      response.msg +
+      "</div>",
+    "瀵煎叆缁撴灉",
+    { dangerouslyUseHTMLString: true }
+  );
+  getList();
+};
 
 /** 鎻愪氦涓婁紶鏂囦欢 */
 function submitFileForm() {
-  proxy.$refs["uploadRef"].submit()
+  proxy.$refs["uploadRef"].submit();
 }
 
 /** 閲嶇疆鎿嶄綔琛ㄥ崟 */
@@ -480,67 +833,67 @@
     status: "0",
     remark: undefined,
     postIds: [],
-    roleIds: []
-  }
-  proxy.resetForm("userRef")
+    roleIds: [],
+  };
+  proxy.resetForm("userRef");
 }
 
 /** 鍙栨秷鎸夐挳 */
 function cancel() {
-  open.value = false
-  reset()
+  open.value = false;
+  reset();
 }
 
 /** 鏂板鎸夐挳鎿嶄綔 */
 function handleAdd() {
-  reset()
-  getUser().then(response => {
-    postOptions.value = response.posts
-    roleOptions.value = response.roles
-    open.value = true
-    title.value = "娣诲姞鐢ㄦ埛"
-    form.value.password = initPassword.value
-  })
+  reset();
+  getUser().then((response) => {
+    postOptions.value = response.posts;
+    roleOptions.value = response.roles;
+    open.value = true;
+    title.value = "娣诲姞鐢ㄦ埛";
+    form.value.password = initPassword.value;
+  });
 }
 
 /** 淇敼鎸夐挳鎿嶄綔 */
 function handleUpdate(row) {
-  reset()
-  const userId = row.userId || ids.value
-  getUser(userId).then(response => {
-    form.value = response.data
-    postOptions.value = response.posts
-    roleOptions.value = response.roles
-    form.value.postIds = response.postIds
-    form.value.roleIds = response.roleIds
-    form.value.deptIds = response.deptIds
-    open.value = true
-    title.value = "淇敼鐢ㄦ埛"
-    form.password = ""
-  })
+  reset();
+  const userId = row.userId || ids.value;
+  getUser(userId).then((response) => {
+    form.value = response.data;
+    postOptions.value = response.posts;
+    roleOptions.value = response.roles;
+    form.value.postIds = response.postIds;
+    form.value.roleIds = response.roleIds;
+    form.value.deptIds = response.deptIds;
+    open.value = true;
+    title.value = "淇敼鐢ㄦ埛";
+    form.password = "";
+  });
 }
 
 /** 鎻愪氦鎸夐挳 */
 function submitForm() {
-  proxy.$refs["userRef"].validate(valid => {
+  proxy.$refs["userRef"].validate((valid) => {
     if (valid) {
       if (form.value.userId != undefined) {
-        updateUser(form.value).then(response => {
-          proxy.$modal.msgSuccess("淇敼鎴愬姛")
-          open.value = false
-          getList()
-        })
+        updateUser(form.value).then((response) => {
+          proxy.$modal.msgSuccess("淇敼鎴愬姛");
+          open.value = false;
+          getList();
+        });
       } else {
-        addUser(form.value).then(response => {
-          proxy.$modal.msgSuccess("鏂板鎴愬姛")
-          open.value = false
-          getList()
-        })
+        addUser(form.value).then((response) => {
+          proxy.$modal.msgSuccess("鏂板鎴愬姛");
+          open.value = false;
+          getList();
+        });
       }
     }
-  })
+  });
 }
 
-getDeptTree()
-getList()
+getDeptTree();
+getList();
 </script>
diff --git a/vite.config.js b/vite.config.js
index 01fd0b1..2c84c9f 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -2,12 +2,14 @@
 import path from 'path'
 import createVitePlugins from './vite/plugins'
 
-const baseUrl = 'http://127.0.0.1:7003' // 鍚庣鎺ュ彛
-
 // https://vitejs.dev/config/
 export default defineConfig(({ mode, command }) => {
   const env = loadEnv(mode, process.cwd())
   const { VITE_APP_ENV } = env
+  const baseUrl = VITE_APP_ENV == 'development' 
+    ? 'http://192.168.10.2:7003' // 寮�鍙戠幆澧冨悗绔帴鍙�
+    : 'http://114.132.189.42:7004' // 鐢熶骇鐜鍚庣鎺ュ彛
+
   return {
     // 閮ㄧ讲鐢熶骇鐜鍜屽紑鍙戠幆澧冧笅鐨刄RL銆�
     // 榛樿鎯呭喌涓嬶紝vite 浼氬亣璁句綘鐨勫簲鐢ㄦ槸琚儴缃插湪涓�涓煙鍚嶇殑鏍硅矾寰勪笂

--
Gitblit v1.9.3