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