From a6f7ad12dad72d8026608e51931c685aa346d598 Mon Sep 17 00:00:00 2001 From: zhouxiaofeng <2946471396@qq.com> Date: Tue, 26 May 2026 10:10:32 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 7 + .gitignore | 25 + index.html | 12 + package.json | 31 + pnpm-lock.yaml | 1569 +++++++++++ .../templates/purchase-contract-template.docx | Bin 0 -> 10390 bytes .../templates/sales-contract-template.docx | Bin 0 -> 10324 bytes scripts/generate-contract-templates.mjs | 213 ++ src/App.vue | 3 + src/api/manifest.js | 73 + src/api/partner.js | 45 + src/api/seal.js | 185 ++ src/layouts/ContractManageLayout.vue | 194 ++ src/main.js | 18 + src/router/index.js | 67 + src/stores/useCounter.js | 17 + src/styles/global.css | 12 + src/utils/request.js | 72 + src/views/Home.vue | 311 +++ src/views/bak/preSign.vue | 1844 +++++++++++++ src/views/bak/preSignModal.vue | 496 ++++ src/views/bak/standardSign.vue | 1862 +++++++++++++ src/views/bak/standardSignModal.vue | 577 ++++ src/views/bak/trusteeshipSign.vue | 769 ++++++ src/views/bak/trusteeshipSignModal.vue | 449 +++ src/views/contract/launch/api.js | 309 +++ .../ContractPartyPlaceholderModal.vue | 1761 ++++++++++++ .../ContractTemplateFillDemoModal.vue | 1297 +++++++++ .../launch/components/mixedSignModal.vue | 18 + src/views/contract/launch/index.vue | 577 ++++ .../ContractTemplateManageModal.vue | 1165 ++++++++ src/views/contract/manifest/index.vue | 422 +++ .../partner/components/PartnerModal.vue | 628 +++++ src/views/contract/partner/index.vue | 579 ++++ src/views/seal/externalSign.vue | 42 + src/views/seal/mixedSignModal copy.vue | 1709 ++++++++++++ src/views/seal/mixedSignModal.vue | 2428 +++++++++++++++++ src/views/seal/preSign.vue | 1844 +++++++++++++ src/views/seal/preSignModal.vue | 554 ++++ src/views/seal/standardSign.vue | 1862 +++++++++++++ src/views/seal/standardSignModal.vue | 1897 +++++++++++++ src/views/seal/trusteeshipSign.vue | 769 ++++++ src/views/seal/trusteeshipSignModal.vue | 463 ++++ task.txt | 220 ++ vite.config.js | 40 + 45 files changed, 27435 insertions(+) create mode 100644 .claude/settings.local.json create mode 100644 .gitignore create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/assets/templates/purchase-contract-template.docx create mode 100644 public/assets/templates/sales-contract-template.docx create mode 100644 scripts/generate-contract-templates.mjs create mode 100644 src/App.vue create mode 100644 src/api/manifest.js create mode 100644 src/api/partner.js create mode 100644 src/api/seal.js create mode 100644 src/layouts/ContractManageLayout.vue create mode 100644 src/main.js create mode 100644 src/router/index.js create mode 100644 src/stores/useCounter.js create mode 100644 src/styles/global.css create mode 100644 src/utils/request.js create mode 100644 src/views/Home.vue create mode 100644 src/views/bak/preSign.vue create mode 100644 src/views/bak/preSignModal.vue create mode 100644 src/views/bak/standardSign.vue create mode 100644 src/views/bak/standardSignModal.vue create mode 100644 src/views/bak/trusteeshipSign.vue create mode 100644 src/views/bak/trusteeshipSignModal.vue create mode 100644 src/views/contract/launch/api.js create mode 100644 src/views/contract/launch/components/ContractPartyPlaceholderModal.vue create mode 100644 src/views/contract/launch/components/ContractTemplateFillDemoModal.vue create mode 100644 src/views/contract/launch/components/mixedSignModal.vue create mode 100644 src/views/contract/launch/index.vue create mode 100644 src/views/contract/manifest/components/ContractTemplateManageModal.vue create mode 100644 src/views/contract/manifest/index.vue create mode 100644 src/views/contract/partner/components/PartnerModal.vue create mode 100644 src/views/contract/partner/index.vue create mode 100644 src/views/seal/externalSign.vue create mode 100644 src/views/seal/mixedSignModal copy.vue create mode 100644 src/views/seal/mixedSignModal.vue create mode 100644 src/views/seal/preSign.vue create mode 100644 src/views/seal/preSignModal.vue create mode 100644 src/views/seal/standardSign.vue create mode 100644 src/views/seal/standardSignModal.vue create mode 100644 src/views/seal/trusteeshipSign.vue create mode 100644 src/views/seal/trusteeshipSignModal.vue create mode 100644 task.txt create mode 100644 vite.config.js diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..da5b91c --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,7 @@ +{ + "permissions": { + "allow": [ + "Bash(npm install *)" + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..092808d --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +**/dist.zip + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock diff --git a/index.html b/index.html new file mode 100644 index 0000000..f6d9399 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + 盖章 + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..9cf469a --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "antd-vue3-project", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@ant-design/icons-vue": "^7.0.1", + "ant-design-vue": "^4.2.6", + "axios": "^1.16.0", + "dayjs": "^1.11.20", + "docx-preview": "^0.3.7", + "docxtemplater": "^3.68.7", + "file-saver": "^2.0.5", + "pinia": "^2.3.1", + "pizzip": "^3.2.0", + "vue": "^3.5.13", + "vue-router": "^4.5.0", + "vxe-table": "^4.18.13", + "xe-utils": "^4.0.7" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.3", + "docx": "^9.6.1", + "vite": "^6.3.5" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..21a89a8 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1569 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@ant-design/icons-vue': + specifier: ^7.0.1 + version: 7.0.1(vue@3.5.34) + ant-design-vue: + specifier: ^4.2.6 + version: 4.2.6(vue@3.5.34) + axios: + specifier: ^1.16.0 + version: 1.16.1 + dayjs: + specifier: ^1.11.20 + version: 1.11.20 + docx-preview: + specifier: ^0.3.7 + version: 0.3.7 + docxtemplater: + specifier: ^3.68.7 + version: 3.68.7 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + pinia: + specifier: ^2.3.1 + version: 2.3.1(vue@3.5.34) + pizzip: + specifier: ^3.2.0 + version: 3.2.0 + vue: + specifier: ^3.5.13 + version: 3.5.34 + vue-router: + specifier: ^4.5.0 + version: 4.6.4(vue@3.5.34) + vxe-table: + specifier: ^4.18.13 + version: 4.18.13(vue@3.5.34) + xe-utils: + specifier: ^4.0.7 + version: 4.0.8 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^5.2.3 + version: 5.2.4(vite@6.4.2(@types/node@25.9.1))(vue@3.5.34) + docx: + specifier: ^9.6.1 + version: 9.6.1 + vite: + specifier: ^6.3.5 + version: 6.4.2(@types/node@25.9.1) + +packages: + + '@ant-design/colors@6.0.0': + resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} + + '@ant-design/icons-svg@4.4.2': + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + + '@ant-design/icons-vue@7.0.1': + resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==} + peerDependencies: + vue: '>=3.0.3' + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@rollup/rollup-android-arm-eabi@4.60.4': + resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.4': + resolution: {integrity: sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.4': + resolution: {integrity: sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.4': + resolution: {integrity: sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.4': + resolution: {integrity: sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.4': + resolution: {integrity: sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.60.4': + resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.60.4': + resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.4': + resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.4': + resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.4': + resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.60.4': + resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.60.4': + resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.60.4': + resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.60.4': + resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.4': + resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.4': + resolution: {integrity: sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.4': + resolution: {integrity: sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.4': + resolution: {integrity: sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.4': + resolution: {integrity: sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.4': + resolution: {integrity: sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==} + cpu: [x64] + os: [win32] + + '@simonwep/pickr@1.8.2': + resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.34': + resolution: {integrity: sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==} + + '@vue/compiler-dom@3.5.34': + resolution: {integrity: sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==} + + '@vue/compiler-sfc@3.5.34': + resolution: {integrity: sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==} + + '@vue/compiler-ssr@3.5.34': + resolution: {integrity: sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/reactivity@3.5.34': + resolution: {integrity: sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==} + + '@vue/runtime-core@3.5.34': + resolution: {integrity: sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==} + + '@vue/runtime-dom@3.5.34': + resolution: {integrity: sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==} + + '@vue/server-renderer@3.5.34': + resolution: {integrity: sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==} + peerDependencies: + vue: 3.5.34 + + '@vue/shared@3.5.34': + resolution: {integrity: sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==} + + '@vxe-ui/core@4.4.12': + resolution: {integrity: sha512-GWRo732PmlIHrdjysSSbOudQh3ROAHS6wJ+OfcymYkbI/WcPqK+An2da/7pNlRiUwsZInesmn9eMo2lxMSmCSg==} + peerDependencies: + vue: ^3.2.0 + + '@xmldom/xmldom@0.9.10': + resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} + engines: {node: '>=14.6'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ant-design-vue@4.2.6: + resolution: {integrity: sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + vue: '>=3.2.0' + + array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.16.1: + resolution: {integrity: sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + + core-js@3.49.0: + resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + docx-preview@0.3.7: + resolution: {integrity: sha512-Lav69CTA/IYZPJTsKH7oYeoZjyg96N0wEJMNslGJnZJ+dMUZK85Lt5ASC79yUlD48ecWjuv+rkcmFt6EVPV0Xg==} + + docx@9.6.1: + resolution: {integrity: sha512-ZJja9/KBUuFC109sCMzovoq2GR2wCG/AuxivjA+OHj/q0TEgJIm3S7yrlUxIy3B+bV8YDj/BiHfWyrRFmyWpDQ==} + engines: {node: '>=10'} + + docxtemplater@3.68.7: + resolution: {integrity: sha512-FwgeAKqY2vc9eVm2V2XGg8bq25B0OQjtSDITGi9zNnvu5GbtR4WvGjM5QNld/ALB6ZbsSuHskBPK9SvPpKhsbA==} + engines: {node: '>=0.10'} + + dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} + + dom-scroll-into-view@2.0.1: + resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==} + + dom-zindex@1.0.6: + resolution: {integrity: sha512-FKWIhiU96bi3xpP9ewRMgANsoVmMUBnMnmpCT6dPMZOunVYJQmJhSRruoI0XSPoHeIif3kyEuiHbFrOJwEJaEA==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + 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'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-saver@2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + 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==} + + 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'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + 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'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-plain-object@3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + 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'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.11: + resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} + engines: {node: ^18 || >=20} + hasBin: true + + nanopop@2.4.2: + resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pinia@2.3.1: + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pizzip@3.2.0: + resolution: {integrity: sha512-X4NPNICxCfIK8VYhF6wbksn81vTiziyLbvKuORVAmolvnUzl1A1xmz9DAWKxPRq9lZg84pJOOAMq3OE61bD8IQ==} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + rollup@4.60.4: + resolution: {integrity: sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + + scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shallow-equal@1.2.1: + resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + stylis@4.4.0: + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} + + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite@6.4.2: + resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + 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.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + + vue-types@3.0.2: + resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==} + engines: {node: '>=10.15.0'} + peerDependencies: + vue: ^3.0.0 + + vue@3.5.34: + resolution: {integrity: sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vxe-pc-ui@4.14.15: + resolution: {integrity: sha512-u/XYQfXmRsRZING8xBG00fTrIp7Pp2OCBFWqFlPOXr75Nii1h6KOq1MHLOWVKtYP8PWSNhqJP2/o9l5jvDnJ1Q==} + + vxe-table@4.18.13: + resolution: {integrity: sha512-aSq+Gl8cbRbDfja5G40ZOmr+uS9aaQ5pMyzsLX2e0gI2ybcUM20ARspX+U0ZMPaidFwt8FRLDJsKoeGxdy470Q==} + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + xe-utils@4.0.8: + resolution: {integrity: sha512-l+p++9iPtSxpf/5ZCzkPXsyV0avE34KzieAC9oAhi+3e98PLJaBQHNiY2V8Lnbiux4JFAbU10p8AT6oujXkP9A==} + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + + xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + +snapshots: + + '@ant-design/colors@6.0.0': + dependencies: + '@ctrl/tinycolor': 3.6.1 + + '@ant-design/icons-svg@4.4.2': {} + + '@ant-design/icons-vue@7.0.1(vue@3.5.34)': + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.4.2 + vue: 3.5.34 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.29.2': {} + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@ctrl/tinycolor@3.6.1': {} + + '@emotion/hash@0.9.2': {} + + '@emotion/unitless@0.8.1': {} + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@rollup/rollup-android-arm-eabi@4.60.4': + optional: true + + '@rollup/rollup-android-arm64@4.60.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.4': + optional: true + + '@rollup/rollup-darwin-x64@4.60.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.4': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.4': + optional: true + + '@simonwep/pickr@1.8.2': + dependencies: + core-js: 3.49.0 + nanopop: 2.4.2 + + '@types/estree@1.0.8': {} + + '@types/node@25.9.1': + dependencies: + undici-types: 7.24.6 + + '@vitejs/plugin-vue@5.2.4(vite@6.4.2(@types/node@25.9.1))(vue@3.5.34)': + dependencies: + vite: 6.4.2(@types/node@25.9.1) + vue: 3.5.34 + + '@vue/compiler-core@3.5.34': + dependencies: + '@babel/parser': 7.29.3 + '@vue/shared': 3.5.34 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.34': + dependencies: + '@vue/compiler-core': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/compiler-sfc@3.5.34': + dependencies: + '@babel/parser': 7.29.3 + '@vue/compiler-core': 3.5.34 + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-ssr': 3.5.34 + '@vue/shared': 3.5.34 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.15 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.34': + dependencies: + '@vue/compiler-dom': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/devtools-api@6.6.4': {} + + '@vue/reactivity@3.5.34': + dependencies: + '@vue/shared': 3.5.34 + + '@vue/runtime-core@3.5.34': + dependencies: + '@vue/reactivity': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/runtime-dom@3.5.34': + dependencies: + '@vue/reactivity': 3.5.34 + '@vue/runtime-core': 3.5.34 + '@vue/shared': 3.5.34 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.34(vue@3.5.34)': + dependencies: + '@vue/compiler-ssr': 3.5.34 + '@vue/shared': 3.5.34 + vue: 3.5.34 + + '@vue/shared@3.5.34': {} + + '@vxe-ui/core@4.4.12(vue@3.5.34)': + dependencies: + dom-zindex: 1.0.6 + vue: 3.5.34 + xe-utils: 4.0.8 + + '@xmldom/xmldom@0.9.10': {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + ant-design-vue@4.2.6(vue@3.5.34): + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-vue': 7.0.1(vue@3.5.34) + '@babel/runtime': 7.29.2 + '@ctrl/tinycolor': 3.6.1 + '@emotion/hash': 0.9.2 + '@emotion/unitless': 0.8.1 + '@simonwep/pickr': 1.8.2 + array-tree-filter: 2.1.0 + async-validator: 4.2.5 + csstype: 3.2.3 + dayjs: 1.11.20 + dom-align: 1.12.4 + dom-scroll-into-view: 2.0.1 + lodash: 4.18.1 + lodash-es: 4.18.1 + resize-observer-polyfill: 1.5.1 + scroll-into-view-if-needed: 2.2.31 + shallow-equal: 1.2.1 + stylis: 4.4.0 + throttle-debounce: 5.0.2 + vue: 3.5.34 + vue-types: 3.0.2(vue@3.5.34) + warning: 4.0.3 + + array-tree-filter@2.1.0: {} + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + axios@1.16.1: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + compute-scroll-into-view@1.0.20: {} + + core-js@3.49.0: {} + + core-util-is@1.0.3: {} + + csstype@3.2.3: {} + + dayjs@1.11.20: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + delayed-stream@1.0.0: {} + + docx-preview@0.3.7: + dependencies: + jszip: 3.10.1 + + docx@9.6.1: + dependencies: + '@types/node': 25.9.1 + hash.js: 1.1.7 + jszip: 3.10.1 + nanoid: 5.1.11 + xml: 1.0.1 + xml-js: 1.6.11 + + docxtemplater@3.68.7: + dependencies: + '@xmldom/xmldom': 0.9.10 + + dom-align@1.12.4: {} + + dom-scroll-into-view@2.0.1: {} + + dom-zindex@1.0.6: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + entities@7.0.1: {} + + 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.3 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + estree-walker@2.0.2: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-saver@2.0.5: {} + + follow-redirects@1.16.0: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.3 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.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.3 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + gopd@1.2.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + immediate@3.0.6: {} + + inherits@2.0.4: {} + + is-plain-object@3.0.1: {} + + isarray@1.0.0: {} + + js-tokens@4.0.0: {} + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + lodash-es@4.18.1: {} + + lodash@4.18.1: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimalistic-assert@1.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + nanoid@5.1.11: {} + + nanopop@2.4.2: {} + + pako@1.0.11: {} + + pako@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + pinia@2.3.1(vue@3.5.34): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.34 + vue-demi: 0.14.10(vue@3.5.34) + transitivePeerDependencies: + - '@vue/composition-api' + + pizzip@3.2.0: + dependencies: + pako: 2.1.0 + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + process-nextick-args@2.0.1: {} + + proxy-from-env@2.1.0: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + resize-observer-polyfill@1.5.1: {} + + rollup@4.60.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.4 + '@rollup/rollup-android-arm64': 4.60.4 + '@rollup/rollup-darwin-arm64': 4.60.4 + '@rollup/rollup-darwin-x64': 4.60.4 + '@rollup/rollup-freebsd-arm64': 4.60.4 + '@rollup/rollup-freebsd-x64': 4.60.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.4 + '@rollup/rollup-linux-arm-musleabihf': 4.60.4 + '@rollup/rollup-linux-arm64-gnu': 4.60.4 + '@rollup/rollup-linux-arm64-musl': 4.60.4 + '@rollup/rollup-linux-loong64-gnu': 4.60.4 + '@rollup/rollup-linux-loong64-musl': 4.60.4 + '@rollup/rollup-linux-ppc64-gnu': 4.60.4 + '@rollup/rollup-linux-ppc64-musl': 4.60.4 + '@rollup/rollup-linux-riscv64-gnu': 4.60.4 + '@rollup/rollup-linux-riscv64-musl': 4.60.4 + '@rollup/rollup-linux-s390x-gnu': 4.60.4 + '@rollup/rollup-linux-x64-gnu': 4.60.4 + '@rollup/rollup-linux-x64-musl': 4.60.4 + '@rollup/rollup-openbsd-x64': 4.60.4 + '@rollup/rollup-openharmony-arm64': 4.60.4 + '@rollup/rollup-win32-arm64-msvc': 4.60.4 + '@rollup/rollup-win32-ia32-msvc': 4.60.4 + '@rollup/rollup-win32-x64-gnu': 4.60.4 + '@rollup/rollup-win32-x64-msvc': 4.60.4 + fsevents: 2.3.3 + + safe-buffer@5.1.2: {} + + sax@1.6.0: {} + + scroll-into-view-if-needed@2.2.31: + dependencies: + compute-scroll-into-view: 1.0.20 + + setimmediate@1.0.5: {} + + shallow-equal@1.2.1: {} + + source-map-js@1.2.1: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + stylis@4.4.0: {} + + throttle-debounce@5.0.2: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + undici-types@7.24.6: {} + + util-deprecate@1.0.2: {} + + vite@6.4.2(@types/node@25.9.1): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.15 + rollup: 4.60.4 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 25.9.1 + fsevents: 2.3.3 + + vue-demi@0.14.10(vue@3.5.34): + dependencies: + vue: 3.5.34 + + vue-router@4.6.4(vue@3.5.34): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.34 + + vue-types@3.0.2(vue@3.5.34): + dependencies: + is-plain-object: 3.0.1 + vue: 3.5.34 + + vue@3.5.34: + dependencies: + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-sfc': 3.5.34 + '@vue/runtime-dom': 3.5.34 + '@vue/server-renderer': 3.5.34(vue@3.5.34) + '@vue/shared': 3.5.34 + + vxe-pc-ui@4.14.15(vue@3.5.34): + dependencies: + '@vxe-ui/core': 4.4.12(vue@3.5.34) + transitivePeerDependencies: + - vue + + vxe-table@4.18.13(vue@3.5.34): + dependencies: + vxe-pc-ui: 4.14.15(vue@3.5.34) + transitivePeerDependencies: + - vue + + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + + xe-utils@4.0.8: {} + + xml-js@1.6.11: + dependencies: + sax: 1.6.0 + + xml@1.0.1: {} diff --git a/public/assets/templates/purchase-contract-template.docx b/public/assets/templates/purchase-contract-template.docx new file mode 100644 index 0000000000000000000000000000000000000000..b7358a54b05187cc4f33e9dbab8f1272603c3f07 GIT binary patch literal 10390 zcmc(Fby!th)Bd5mB&1WiyOEaeZjkOcv>+W)(k)1rG#&&ANs*8a3F&S`LgG8~x;r?VGAsSZTabR= zV(4sU>+FWk zH|SLu;Ygr)mmpl;=>w23xJKWCvrX&iVC$ax} z+xLRp;=NEQMSW$rVL*C9fJYy~5PsknqxT`;A6lzHfY}S6e_-_g1f~r6FMe765od z0svtAUcI~PHl}T-I--SjMV~rwsyvbeSx3P~U%A=0$+NiYJ0l%G&6T!n9;a*VngXFo zLx;Fa_oB^OKgHF}^8h9Ia508ex|jO8?N$1OsK^&Su_}_ZydKY8msj2cJ?}u&3i|Ps z1teAtVTt8R%UV1gq`}<*MR|>)j}5O5ECo8&gH)jv+7LGpS7M3zTo1*W$c%*ODS}zp zvUrj;D!V8t>$4&{QuOjNdx~SV!XO+a6qnVS=@ZDr#1nyYOU59uI6ze*E7*@D>nSujdHvT#C0RO-tDMmHjb|oSPGj%963x+)aqz0#y zE9|jCo_@xbB`U2>#OM^EiY}wdd)~Y>#{g01Is_WlkE{yznD~-7QuE&uF0f_1Dweb@%MfYy za`eRG$ca*XfaK|=wo?(2=Ce-WiNN|!{4up_FjIuMC|T0npn7yDULe2T3sOtcoT^Hf zHN-u^f%bGFt8bd)aJ4P)D|TW48+9?h;dABnWsTQLo-IZSk!hGu$4hfKkHYaEOzXJ_ zyB(J1V^m~?tY$=fKQaN?lXx;1_p|SWxpplU>Z_g{2!2c^X=al-d2<}PG8MNJzpRw_yBqrTJa0J&w!|FOdFaO<3-%4KM~F3@99dR1=mhE!>QLOzTjF z>`P4OZ1tEqF(R<5Fo(0YmR>9_VJ47XO643ImdZ2H%@X3?65qM`%!rAP}ZeDu2@l|0snM^wzT2 zABEXeS?MRw`IEoP<8jYX?IvD(Hp%8yL6ly;bL~1=ecQdy?NNpvwbTQnAPMD-Y2*{7 zQ>NzWQ+;7llqlocUV7H3wAr6_HZiL~=ZaU^443~F5$&zPK&>!su3ELhV;0R2T*Dd? z(+qW~n4;1L$&Y6iwMRg2p5%^yJJRUDmB~j}?C=F*SdrtPf>gS`VA}YOr0H=^bnB8O zeOlQ-9q|-r3)QCsxe4mBCToaPjwe(w*d?iJA*}wWuI{r66~F)$*yGudlzk2Dk6qD# z@4{$1z{59o?Omxg6uR&~InQTpnE>Hjy`@5`G-2g(_txF58F$u}BA=DD*|PK#J6q6w z>iUV0B#?!w z;Ai@+$mZ|A(kb_43H>@a@nx|39sIH9+`-Y&d_R<{gD)|SHoHXEf^{@gDxX z+8KA9v_~;jGES&TsiYQWPD5I>sll;0r-t}0mnZ4S`(LxrZ5;d0 zFiv--5&RIx95BKlwQSk>>AdL+PTl6oYaw-2F~^uR5U<%jls3c&OA{H<^^)|WWr=M8 zgwzrDN{H9hgCM$eJhWp-;Odzj39N%L6%+GM#^Zm$6<3vRM?ePEv-7R%##6xceAM!^ zo}*2xf!Ug+|3sM@e9S+5EE{%3@1CueK}2a|K0r5A*(mZ7xkq$RQSX6tKTEg+QoLj@ zZ{BM1vGNm=9~WFN&)=+$5LTS8b(dENcR1wWQy;27dC1jE;P9r~<>js#P+yK-ko0`l zYYY7q>Kazpd>>_kD87ov@(D4djFUFPIU1t~sG!b8v@pKYx?!)O(E^iK;rdHIB^!s% zqMeghG$#ff2}?Wva)6XT?h)Z^!y~O=i>IvKqB}ls=7*>7k;*q#bsQ7@RYWEBkf+;u zYA<_%Nt4OO4)sXdspT#^^bkkDCp{>u5#$T(W6H}`AH06_+3qX;=(&dY%`tvahuSsD z>Lo}3AQv3~K>MBiT!5aoW-d3BVMRk%ahe79l3sa^EV%%N4)F^jw$w-nuI14LTinqLW0jfg&l>}w?;xy&e zNXbDC6HB5f2|!rFd--XZof+!l^+z<)UT4w+EKG)n2J1hdklNivjHLs}8jLDGq9?AL z5I+$oW1~~aK#Jh{3S&3mk>LUxi(c{ouXvx$&k6-o93>lBYyetz`SpXRxQR-eN3G1y z%}fynpA!gMLIBU6!ZIsCB9aGlouP0S6!t$G`-VSdwwH0H#N<3yOX$e5M5?IY9aO#) z>m5odvZ9P-%6Eo=zQy=C1=4?!WK^o(MBP}(sUDveAv)H&oNW>PC+GV0$^q;4{rFRq90!SG(wtD!K#w>0638hQEEGTfVG zxGWayJ<4lUXGsf`&8}IpJ*!~#fzRGOzU`uOqp_|7e47mI)Ah`}Z%6!!0|Fl$B%^4u zDzNxiy1kFK<(t(j;Os=mt(IZfN9m3%rHZ$~wU|(RMD4Qzbk>`>f_Bla0Lra8bNq&Xq7!?m+yS9eKnv*p>(4zf&?8>{mgRSY1 zlAz~KQ<2}J8qLjGJjXPIuWRIWHJc4oF!xM9Yv`W1PxM_quy_vmy&wKJEk^+F2QUv* za&~aM&$yp3acb~^8FwIf>)de0Kes(~a5lTyIEiuk4sE1ZA=fhPK1ipDQMD`+Q)zt-qzD5~PNP%(R{Vc&Ws> zUmSX{dQKSw);c^yzb6w>d}1iKA@9Djm=t~tid+NajtLNXiPYUl{3CuF*FwReWXI|{ zXcFO!@vYyJpuS3fnuIV&P}}ISBv6BHiheeRncqJSSBAytX)8zW=_kp3su`a_N~qy= z51`}2rXWEd_y)MGhJj6|P_9ebE4}7s_uPUnZ`0%aJjx%%6N{G#7*3BOLeX^x_PY7! z!#hpcdgY1;62Z-UE$bBAcKwmavlDiek`*fSPJ~ik+YNsw?pb7(p$1aN6H^Y^9*+EY z?AMV4lL@9Vz{4?(Mkl@eRlUWp;~TABvHRs`J2CCg@5Lu#+6^5?@FJTc0{{>|Zaic*WLNceVGk^San5Rk8GgX|mZ=dEa+r08SyOn>Q}h#erKY0(kl zJeZxQ&)TFfX^4-j$(Z-d3L}4hnlWtg===QKOT-YyecUro%ts!%7iK0{#8ni;LlT4( z#*ZyZ#nGui;oePYnaKoE3Q)*s5MG{htM9o>26gfIW4PiKiFzMiB9!%0?J@PgqF$YT zVfo@&FPY00a?i|~D73d?4WZ7%Lpy3#tcJvcczJiP8pqN1oCyN?G-b3o^U*$elq)ed z@(^kdP!T6w+7A`yx|&do_j+YfQITOu^r;<{LX>(bk7=6}Gb=j9xf^Z|vh7Yzp@fq9<{03w}zcho?+H~CiC zgSpH%Nr-puOsM`6?mx#1a19CgxAL4MH!f)v{J#OPAK%pRzwY@}jmLeKfnr4uHKgoo z;-A(K&$D7yS(ncf5|%P|59}wQQhnp#K=VRl^NUza>cwg=w-`>T*krNh;-cy(i=B=V zmYuWEcl=kNtsbJXqzLLSc*Wstr+R93;S%knaeEjML^LVGd2&^A!0^CWuVvzzD&_*} zjJh4hLq*sOwy`d&`Ka`OFU=MWL75E$x?WOlBs8B=seLKwrW_S>78t9APrJ-H@qu|oqZ_1 zkcCaeZYbk%$eK*@d&z!Lj$!u;kR5m#yulX%`1;xT__ZeH4h}#wXVyQ>3i(J8R7f&p zi3-sM_ZLi&tnGdFs7BuaC>o@w!Ad3q%?$ci?@zAY`ySZ~&2V5lIc6~6;uyY?4hZb_ z;ny?LUnSTZ4Smh3&Pjpcitb&ZDSjNwzM)3fOIk6^cFd~VDsv_8e_*B^e+c!r zmTLMJ(+%JVuLy3=fVt5xE$`@;pU`v@cDfBE=IvG4hDXsE;KBl7ryy&607(T5U5jwh zwF%#0W?qYhkm`nJ6IBDZu%JJVh)d6rCs_5I0U)Ujb`>7&xnD1d5N;Dj2+-i-mYW9T z*oQ$<72~_`N)JvjXYu*evJ)maS(7&C=)h;HL7JAA6uzQHJ>Vn|&yUX3l z1-C$Dgf#!i|VE|$7gXo(>f7FCHa%^e|ckT zwM%*~*v|Fv001V~&bnd__CRpM%uvnK(ac5v#ue){dKJJevx`I;&Cz;CVfeb0)+Knt zc_=;aczlxzGY7;A!L4s(Flj2;@5}_*`7!q-KP_+0j!!)hYkbNX!5Zi*on0K zFVyxlJIq|$P9~KPv@2x13<)U1!%a56CG$p(v(rG1GEy@|#(YJ_je_HShFx$T(^JV1 z1sPRR#X#$5z!f`{y;m>Y4b7?SZHM;$^#{w-n9l^TJ5Y3CvB}fpoj6s)^<(`4pM+0_ zogHG=O=PuOc1d~3eMZsU;k1metG_Y?v;io%zN3HK-e2;IiIj{D>wacDCNAoo;wmdx zz?)|`oQ+n!HXf+(h0_hyKg%7>8wm|RNBmLfD9B0IV-Q^+UJ#FKy)ugk{Xq3=C`b}6 zDtnMBo4O5_$b+ChHe+HCgks~dpBOaQ5`(V5eU)>Go$3Sm_ukd=oFRI9qevwnmHhX*v5h$yil4jHLdoLJl~3Y@r#5j$*>iHrMV~-_+;_VqKMTrmi zbGcPk<=#aSHc5MSNgwd=MQFY)eIm1|rfy-TDZP!h(EVYe6!eXmxAO9RyhTgscJX(V zzo)Qxk@+PatolvfxCuXhreN&o__zK++jb>LvBR|lPCGdbXg#$k9PDJ6vfkbl0dS6I zrwdDUmpC|8q9%$(D^(@=fZAmN1s$P~=>>8ai@*VfpzIY?h9Bik)GuCE!{NXPk2??W za>-O>lHr!ibg4+nd{|~1$+IME3Z|dZ1oUmHO<2I_!UE?}58yskOqQJ)j>cYIEUi^` zFBb3Kn?Oc*PwW7AU%dfm#XrRDCVtw3L;TO$ax9@=Vd*A7f_JKHsb4#^#COOyFq9w)I)%5G`yOSbPHs)Rzlqb}Vg7*iNVnh-Mu-?~e>v%M z-^UETu^n*cG6k(+0o%dUpmf({O~40XbRm&|15XQ2kxg`4h2pik!9M1?WmEw*;~o*! zBDx-!oz_HPqWK0(4Ql;9ar-Rm2%93g!nGn4JupKk9wEIXr_}^0!BGpausSUYrv9?)fz{$YH&~(#rZm;DvW2CwShP#VRI@upX8FYQ1lN>`#3?OK@s-MCL#Ic zK!jnAcKVvj6t8nkwrh?+RdpVn(|*Ih-S=*eCjz_gy&V6?2Y!;E|6-PZEE65|0qmu5 zU@!gC`!};U{i9%i!nFMoDSC)u=c3Su=!UURFGeDWHJVD(X5q4NyNg;$TfeXFxIcp* zc&nbk#ofeOnCftq%39`dWt~{t=7~^1I>kmA&O#_-Hpa?7eIZreeno|Uq@OI14FTS`XQNSqpepB2pWYO%tV@{DBFprHjW{nV5~BFs5{6J zH}wyd2RR4@W_X>RB=gTl;ZPxC6k{TC`W@8Oy5Jk;FBtpy)fUEC){$4iOpTcd*1MFo z8^gY$Xd%q3#ZSzlGT*=>+Q1lEB1E|E7N8lDOXJ;7mT^&=+3sEgl!5?_jb*$ogdA=K zJ-wDOtDM!5r&u=Dhfda4Y^>91+VB0-)?)afqMK;cf*55hH>Iz2<8vQUZyZ*FEa!vG zqG24NL8jU-CAcQ17LJzBKj?O`0`M#8;NQmSA@+~;y z+EyoNGAkiH$xX3PMhM-@O}U`b#ZWBVfse>pf*`^gS^uV7LMZpL0FO9jXS#M|FY7q; zTv5&F)sOzi|Jg6^os`|R`hVLk<+DD0dJT3<7clw!`?CV6*k8d=KGQj7gC8-VX#SD-yn0BRV2p*_q- z_H@M6-AT52mL&PXE#w=Cehw&vNJr@zZw1^51gs9uJnQ$B1k?WIi>D^BBtx+nP9J%? z+HCr#!eOE!_6uc>a_T!*to$NCfUg-78KLuhErZ`YYoE*zYArPi`PVrd_Lg=Y^$FC? zZ@}m%3vsPO3J^GpGxip3PMzx3I4w#MHTmywqo;>h`#UFhb-&!io_l@4xS|LXSD?+6 zAei!E%qYjCk$ogV%S~|vkgkZ69QhVLDbElk!BC-ubu<`LMo8vRBA)r^aP^+sMTGEn zbb{^K1tyt)?D^Ee?&f6nmpw;kofk=QVdr(7cr@d*RJliLsWW%Jc}yc^`?YagAZHIX z8mdrACub@IJlTBoH9mQwwS7dIBZ7i6iC#PKS)xBoq80|z38%;NA5Aj>!LCvdMrovN z91Cy+1chp`HAIy*w%eeFHBQx_Rx`>;Yg3f{w`Ck{6V&-ZhbN+S(@t_^tVPFM4AmE? zCLxiz)Pn?Pwx&?eKiDB-BPhN4KpsPw#VwYFX=6?PRci|Wl& zt8^-fiuhKHJdVVxMFl+njBBg!N~A}ggR*Eg%cpP-_59xK^iYBI7jja|gKL4NSo=2)RMCZ z2GZ^<949RK`iil$j-6pTv4-aA3WqN=a&L}_gbYgvTWJp}E+basE-Y9-Q(aIH4Jpcn z?_Z{ph3`8o?9b;}ORlV9qP+xQVJMmK9kil#eYX}C*d82MzywJ;ewte_UCs-}gGl0O zGpChU$9AjvNEX6C5CJqOlK-69Swzv)Vn^{F*L5(k%VESI^y!<#Bb=1P>$l}QcE(pM zd9;2p_d8d2Q{cT&bJz0!?NIY{$6%ZY?3!XwfAKVXpqjCX?ax+b=FqG?xRnXFuSqsT zUzZwXRW`>U>((L&fUFZoEnJu%1(CdYYqJK`CSxU#m=Gl1}t6$^> zUNodBPv&&6sHIsg+?MV8aDiULE2B1g#PK@yRiZJx$QU03=%u)@SNPMz+4=@UOt?S- zCA^$b*7`=c;qzGSCP5J+b>TKXCRO&B7hZIon%d8yPT7jpdWxSO z3l!oKl~NB}zeok-<=UImp0Q{SnVBU-<(bo^c}l!_vI{#KDV&(~Bu0c-FK&2TTZeGV z*ey%Xz48a!1*H6G44Loitjhpe$%P9XDa?{58HEtjj z;Oh>O0Z>FCNUX4HX*)8nXBeBAfDTlu%W?)NKyqX2-dKbW5$eEYC}@9f4SzchI63%K7uxD}v>eaF;K|8x`X3%Fms-wGhX zxg+48TK+!ze(8LRo(H4<%>GY}avy&;^V}3)w_^_Xf0^Nrlz%nE{rc!uR0!TbqVDqM z|4Wmb9C$n2z@6Va4sln=zbbN{5#LH80t@~r=`KIMugHA@b_?GDuh38U-K2aUes@Lx zp2q_CrLjBnxGUse=W##X-YODC`i~@Ya0BvB^8LRw`P;T*WPfS$my~~0f%zE$Z~?dg MDDXEQ@|%bM4}75?761SM literal 0 HcmV?d00001 diff --git a/public/assets/templates/sales-contract-template.docx b/public/assets/templates/sales-contract-template.docx new file mode 100644 index 0000000000000000000000000000000000000000..8dbb93782d6f981a5ee0435f364e68bdbe40ad06 GIT binary patch literal 10324 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 + new TableRow({ + children: [ + new TableCell({ + width: { + size: 22, + type: WidthType.PERCENTAGE, + }, + children: [ + new Paragraph({ + children: [ + new TextRun({ + text: label, + bold: true, + }), + ], + }), + ], + }), + new TableCell({ + width: { + size: 78, + type: WidthType.PERCENTAGE, + }, + children: [ + new Paragraph({ + text: value, + }), + ], + }), + ], + }), + ), + borders: { + top: { style: BorderStyle.SINGLE, size: 1, color: 'D9DDE7' }, + bottom: { style: BorderStyle.SINGLE, size: 1, color: 'D9DDE7' }, + left: { style: BorderStyle.SINGLE, size: 1, color: 'D9DDE7' }, + right: { style: BorderStyle.SINGLE, size: 1, color: 'D9DDE7' }, + insideHorizontal: { style: BorderStyle.SINGLE, size: 1, color: 'E5E7EB' }, + insideVertical: { style: BorderStyle.SINGLE, size: 1, color: 'E5E7EB' }, + }, + }) +} + +function sectionTitle(text) { + return new Paragraph({ + text, + heading: HeadingLevel.HEADING_2, + spacing: { + before: 280, + after: 160, + }, + }) +} + +function clause(text) { + return new Paragraph({ + text, + spacing: { + after: 160, + line: 360, + }, + }) +} + +async function writeTemplate(filename, config) { + const doc = new Document({ + sections: [ + { + properties: {}, + footers: { + default: new Footer({ + children: [ + new Paragraph({ + alignment: AlignmentType.CENTER, + children: [ + new TextRun({ + text: `${config.title} - 模板演示文档`, + color: '6B7280', + size: 18, + }), + ], + }), + ], + }), + }, + children: [ + new Paragraph({ + text: config.title, + heading: HeadingLevel.TITLE, + alignment: AlignmentType.CENTER, + spacing: { + after: 240, + }, + }), + new Paragraph({ + alignment: AlignmentType.CENTER, + children: [ + new TextRun({ + text: '用于演示合同发起模块模板填充与导出', + italics: true, + color: '64748B', + }), + ], + spacing: { + after: 280, + }, + }), + sectionTitle('一、合同基础信息'), + createInfoTable(), + sectionTitle('二、合同正文示例'), + ...config.clauses.map(clause), + sectionTitle('三、补充说明'), + clause('合同标的说明:{contractSubject}'), + clause('业务备注:{businessRemark}'), + clause('模板来源:{templateLabel}'), + new Paragraph({ + spacing: { + before: 360, + after: 180, + }, + children: [ + new TextRun({ + text: '甲方(业务方):__________________', + }), + ], + }), + new Paragraph({ + spacing: { + after: 180, + }, + children: [ + new TextRun({ + text: '乙方(相对方):__________________', + }), + ], + }), + new Paragraph({ + children: [ + new TextRun({ + text: '签署日期:{signDate}', + }), + ], + }), + ], + }, + ], + }) + + const buffer = await Packer.toBuffer(doc) + await writeFile(path.join(outputDir, filename), buffer) +} + +await mkdir(outputDir, { recursive: true }) + +await writeTemplate('purchase-contract-template.docx', { + title: '采购合同模板', + clauses: [ + '甲乙双方经友好协商,就 {contractName} 项下采购合作事宜达成一致,并共同遵守本合同。', + '第一条 合作内容:乙方根据甲方需求提供 {contractSubject},具体交付内容以双方确认的技术资料和补充协议为准。', + '第二条 合同金额:本合同总金额为人民币 {contractAmountDisplay},付款方式采用 {paymentMethod}。', + '第三条 合同期限:本合同自 {effectiveStart} 起生效,至 {effectiveEnd} 止。', + ], +}) + +await writeTemplate('sales-contract-template.docx', { + title: '销售合同模板', + clauses: [ + '为明确双方权利义务,甲乙双方就 {contractName} 相关销售事项签订本合同。', + '第一条 销售范围:甲方向乙方提供 {contractSubject},合同编码为 {contractCode}。', + '第二条 金额与结算:本合同金额合计人民币 {contractAmountDisplay},采用 {paymentMethod} 完成结算。', + '第三条 生效与终止:本合同有效期为 {effectivePeriod},双方应按约履约。', + ], +}) + +console.log(`Generated templates in ${outputDir}`) diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..98240ae --- /dev/null +++ b/src/App.vue @@ -0,0 +1,3 @@ + diff --git a/src/api/manifest.js b/src/api/manifest.js new file mode 100644 index 0000000..3abf8e4 --- /dev/null +++ b/src/api/manifest.js @@ -0,0 +1,73 @@ +import request from "@/utils/request"; + +function isSuccessResponse(res) { + return String(res?.code || "") === "0000"; +} + +function getResult(res) { + return res?.result; +} + +export function queryManifestList(data) { + return request({ + url: "/manifest/manage/list", + method: "post", + data, + }); +} + +export function queryPublishedManifestList() { + return request({ + url: "/manifest/manage/published", + method: "get", + }).then((res) => (isSuccessResponse(res) ? getResult(res) || [] : [])); +} + +export function queryManifestOrgOptions() { + return request({ + url: "/manifest/manage/org/options", + method: "get", + }).then((res) => (isSuccessResponse(res) ? getResult(res) || [] : [])); +} + +export function getManifestDetail(templateId) { + return request({ + url: `/manifest/manage/${templateId}`, + method: "get", + }); +} + +export function saveManifest(record, mode = "create") { + return request({ + url: "/manifest/manage", + method: mode === "edit" ? "put" : "post", + data: record, + }); +} + +export function changeManifestStatus(templateId, status) { + return request({ + url: `/manifest/manage/${templateId}/status/${status}`, + method: "put", + }); +} + +export function uploadTemplateFile(formData) { + return request({ + url: "/trans/minio/file/uploadOutie", + method: "post", + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); +} + +export function downloadTemplateFile(fileName) { + return request({ + url: "/trans/minio/file/download", + method: "get", + params: { fileName }, + responseType: "arraybuffer", + }); +} diff --git a/src/api/partner.js b/src/api/partner.js new file mode 100644 index 0000000..b7613f8 --- /dev/null +++ b/src/api/partner.js @@ -0,0 +1,45 @@ +import request from '@/utils/request' +export function queryPartnerList(params) { + return request({ + url: "/partner/manage/list", + method: "post", + data: params, + }); +} + +export function getPartnerInfo(id) { + return request({ + url: `/partner/manage/${id}`, + method: "get", + }); +} + +export function createPartner(data) { + return request({ + url: "/partner/manage", + method: "post", + data, + }); +} + +export function updatePartner(data) { + return request({ + url: "/partner/manage", + method: "put", + data, + }); +} + +export function deletePartnerByIds(ids) { + return request({ + url: `/partner/manage/${ids.join(",")}`, + method: "delete", + }); +} + +export function mockSyncPartner(id) { + return request({ + url: `/partner/manage/${id}/sync`, + method: "post", + }); +} diff --git a/src/api/seal.js b/src/api/seal.js new file mode 100644 index 0000000..f235130 --- /dev/null +++ b/src/api/seal.js @@ -0,0 +1,185 @@ +import request from '@/utils/request' + +// ======================================== +// Token管理 +// ======================================== +export function refreshToken() { + return request({ + url: '/seal/api/token/getAccessToken', + method: 'post', + }) +} + +// ======================================== +// 身份认证 +// ======================================== +export function getLoginQrCode(notifyUrl) { + return request({ + url: '/seal/api/qrcode/getLoginQrCode', + method: 'post', + data: { notifyUrl }, + }) +} + +// ======================================== +// 签署流程管理 +// ======================================== +export function startContract(formData) { + return request({ + url: '/seal/api/contract/start', + method: 'post', + data: formData, + headers: { 'Content-Type': 'multipart/form-data' }, + }) +} + +export function completeContract(contractId) { + return request({ + url: '/seal/api/contract/complete', + method: 'post', + data: { contractId }, + }) +} + +export function cancelContract(contractId) { + return request({ + url: '/seal/api/contract/cancel', + method: 'post', + data: { contractId }, + }) +} + +// ======================================== +// 标准签章 +// ======================================== +export function getStandardSignQrCode(params) { + return request({ + url: '/seal/api/qrcode/getStandardSignQrCode', + method: 'post', + data: params, + }) +} + +// ======================================== +// 预盖章 +// ======================================== +export function getPreSignQrCode(params) { + return request({ + url: '/seal/api/qrcode/getPreSignQrCode', + method: 'post', + data: params, + }) +} + +// ======================================== +// 托管签章 +// ======================================== +export function getTrusteeshipSealQrCode(notifyUrl) { + return request({ + url: '/seal/api/qrcode/getTrusteeshipSealQrCode', + method: 'post', + data: { notifyUrl }, + }) +} + +export function confirmSign(params) { + return request({ + url: '/seal/api/contract/confirmSign', + method: 'post', + data: params, + }) +} + +// ======================================== +// 时间签章 +// ======================================== +export function getTimestamp(formatPattern = 'yyyy-MM-dd') { + return request({ + url: '/seal/api/seal/getTimestamp', + method: 'post', + data: { formatPattern }, + }) +} + +export function signTimestamp(params) { + return request({ + url: '/seal/api/contract/signTimestamp', + method: 'post', + data: params, + }) +} + +// ======================================== +// 批注签章 +// ======================================== +export function getCommentSeal(params) { + return request({ + url: '/seal/api/seal/getCommentSeal', + method: 'post', + data: params, + }) +} + +export function signCommentSeal(params) { + return request({ + url: '/seal/api/contract/signCommentSeal', + method: 'post', + data: params, + }) +} + +// ======================================== +// 印章信息 +// ======================================== +export function getUserUniqueId(params) { + return request({ + url: '/seal/api/user/getUserUniqueId', + method: 'post', + data: params, + }) +} + +export function getSealBySignerId(params) { + return request({ + url: '/seal/api/seal/getSealBySignerId', + method: 'post', + data: params, + }) +} + +// ======================================== +// 文件信息 +// ======================================== +export function getContractDetail(contractId) { + return request({ + url: '/seal/api/contract/getDetail', + method: 'post', + data: { contractId }, + }) +} + +export function previewContract(contractId) { + return request({ + url: '/seal/api/contract/preview', + method: 'post', + data: { contractId }, + }) +} + +export function downloadContract(contractId) { + return request({ + url: '/seal/api/contract/download', + method: 'post', + data: { contractId }, + }) +} + +// ======================================== +// 回调轮询 +// ======================================== +export function pollCallback(requestId) { + return request({ + url: '/seal/callback/poll/' + requestId, + method: 'get', + }) +} diff --git a/src/layouts/ContractManageLayout.vue b/src/layouts/ContractManageLayout.vue new file mode 100644 index 0000000..bb5ab4b --- /dev/null +++ b/src/layouts/ContractManageLayout.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..5e33a14 --- /dev/null +++ b/src/main.js @@ -0,0 +1,18 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import Antd from 'ant-design-vue' +import VxeUITable from 'vxe-table' +import 'ant-design-vue/dist/reset.css' +import 'vxe-table/lib/style.css' +import App from './App.vue' +import router from './router' +import './styles/global.css' + +const app = createApp(App) + +app.use(createPinia()) +app.use(router) +app.use(Antd) +app.use(VxeUITable) + +app.mount('#app') diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..4f565e6 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,67 @@ +import { createRouter, createWebHistory } from 'vue-router' + +const routes = [ + { + path: '/', + name: 'Home', + component: () => import('@/views/Home.vue'), + }, + { + path: '/contract-console', + component: () => import('@/layouts/ContractManageLayout.vue'), + redirect: '/contract-console/launch', + children: [ + { + path: 'launch', + name: 'ContractInitiateManage', + component: () => import('@/views/contract/launch/index.vue'), + meta: { + title: '发起合同', + }, + }, + { + path: 'manifest', + name: 'ContractTemplateManage', + component: () => import('@/views/contract/manifest/index.vue'), + meta: { + title: '模板管理', + }, + }, + { + path: 'partner', + name: 'ContractPartnerManage', + component: () => import('@/views/contract/partner/index.vue'), + meta: { + title: '相关方管理', + }, + }, + ], + }, + { + path: '/standardSign', + name: 'StandardSign', + component: () => import('@/views/seal/standardSign.vue'), + }, + { + path: '/preSign', + name: 'PreSign', + component: () => import('@/views/seal/preSign.vue'), + }, + { + path: '/trusteeshipSign', + name: 'TrusteeshipSign', + component: () => import('@/views/seal/trusteeshipSign.vue'), + }, + { + path: '/external-sign/:contractId?', + name: 'ExternalSign', + component: () => import('@/views/seal/externalSign.vue'), + }, +] + +const router = createRouter({ + history: createWebHistory(), + routes, +}) + +export default router diff --git a/src/stores/useCounter.js b/src/stores/useCounter.js new file mode 100644 index 0000000..1dc9d38 --- /dev/null +++ b/src/stores/useCounter.js @@ -0,0 +1,17 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useCounterStore = defineStore('counter', () => { + const count = ref(0) + const doubleCount = computed(() => count.value * 2) + + function increment() { + count.value++ + } + + function decrement() { + count.value-- + } + + return { count, doubleCount, increment, decrement } +}) diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..9cb50fc --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,12 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + 'Helvetica Neue', Arial, 'Noto Sans', sans-serif; + background: #f0f2f5; + color: rgba(0, 0, 0, 0.88); +} diff --git a/src/utils/request.js b/src/utils/request.js new file mode 100644 index 0000000..699ceff --- /dev/null +++ b/src/utils/request.js @@ -0,0 +1,72 @@ +import axios from 'axios' +import { message, Modal, notification } from 'ant-design-vue' + +const service = axios.create({ + baseURL: import.meta.env.VITE_APP_BASE_API || '/', + timeout: 30000, +}) + +service.interceptors.request.use( + (config) => { + const token = localStorage.getItem('token') + if (token) { + config.headers['Authorization'] = 'Bearer ' + token + } + return config + }, + (error) => Promise.reject(error), +) + +service.interceptors.response.use( + (res) => { + if ( + res.request.responseType === 'blob' || + res.request.responseType === 'arraybuffer' + ) { + return res.data + } + const code = res.data?.code + const normalizedCode = + code === undefined || code === null ? undefined : String(code) + const msg = res.data?.message || res.data?.msg || '系统错误' + + if (normalizedCode === '401') { + Modal.confirm({ + title: '系统提示', + content: '登录状态已过期,请重新登录', + okText: '重新登录', + cancelText: '取消', + onOk: () => { + localStorage.removeItem('token') + location.reload() + }, + }) + return Promise.reject('无效的会话,或者会话已过期。') + } else if (normalizedCode === '500') { + message.error(msg) + return Promise.reject(new Error(msg)) + } else if ( + normalizedCode !== undefined && + normalizedCode !== '200' && + normalizedCode !== '0000' + ) { + notification.error({ message: '提示', description: msg }) + return Promise.reject('error') + } + return Promise.resolve(res.data) + }, + (error) => { + let msg = error.message + if (msg === 'Network Error') { + msg = '后端接口连接异常' + } else if (msg.includes('timeout')) { + msg = '系统接口请求超时' + } else if (msg.includes('Request failed with status code')) { + msg = '系统接口' + msg.substr(msg.length - 3) + '异常' + } + message.error(msg) + return Promise.reject(error) + }, +) + +export default service diff --git a/src/views/Home.vue b/src/views/Home.vue new file mode 100644 index 0000000..ec9df67 --- /dev/null +++ b/src/views/Home.vue @@ -0,0 +1,311 @@ + + + + + diff --git a/src/views/bak/preSign.vue b/src/views/bak/preSign.vue new file mode 100644 index 0000000..60a9593 --- /dev/null +++ b/src/views/bak/preSign.vue @@ -0,0 +1,1844 @@ + + + + + diff --git a/src/views/bak/preSignModal.vue b/src/views/bak/preSignModal.vue new file mode 100644 index 0000000..bd74313 --- /dev/null +++ b/src/views/bak/preSignModal.vue @@ -0,0 +1,496 @@ + + + + + diff --git a/src/views/bak/standardSign.vue b/src/views/bak/standardSign.vue new file mode 100644 index 0000000..c78d937 --- /dev/null +++ b/src/views/bak/standardSign.vue @@ -0,0 +1,1862 @@ + + + + + diff --git a/src/views/bak/standardSignModal.vue b/src/views/bak/standardSignModal.vue new file mode 100644 index 0000000..a89e66c --- /dev/null +++ b/src/views/bak/standardSignModal.vue @@ -0,0 +1,577 @@ + + + + + diff --git a/src/views/bak/trusteeshipSign.vue b/src/views/bak/trusteeshipSign.vue new file mode 100644 index 0000000..6fcb803 --- /dev/null +++ b/src/views/bak/trusteeshipSign.vue @@ -0,0 +1,769 @@ + + + + + diff --git a/src/views/bak/trusteeshipSignModal.vue b/src/views/bak/trusteeshipSignModal.vue new file mode 100644 index 0000000..bea4abe --- /dev/null +++ b/src/views/bak/trusteeshipSignModal.vue @@ -0,0 +1,449 @@ + + + + + diff --git a/src/views/contract/launch/api.js b/src/views/contract/launch/api.js new file mode 100644 index 0000000..38faf48 --- /dev/null +++ b/src/views/contract/launch/api.js @@ -0,0 +1,309 @@ +/** + * 合同发起模块 - API 层 + * + * 当前使用 mock 数据模拟接口返回。 + * 【接入后端】:直接替换每个函数内部实现为 axios 请求即可,函数签名不改。 + */ + +// ========== 合同发起列表 mock 数据 ========== + +const mockLaunchRecords = [ + { + id: 'INIT-202605-001', + // 合同编码 + contractCode: 'HT-2026-0008', + // 合同名称 + contractName: '智慧园区设备采购合同', + // 合同类型 + contractType: '采购合同', + // 合同金额(元) + contractAmount: 368000, + // 有效期起 YYYY-MM-DD + effectiveStart: '2026-05-10', + // 有效期止 YYYY-MM-DD + effectiveEnd: '2027-05-09', + // 付款方式 + paymentMethod: '银行转账(30%预付款,70%验收后支付)', + // 所选模板标识 + templateKey: 'purchase', + // 所选模板名称 + templateName: '采购合同模板', + // 合同标的 + contractSubject: '园区门禁一体机、访客终端及部署实施服务', + // 业务备注 + businessRemark: '首次发起,等待业务确认后提交法务。', + // 发起人 + initiator: '张晓明', + // 所属部门 + initiatorDept: '供应链运营部', + // 发起人公司 + companyName: '浙港物流平台有限公司', + // 状态: draft/reviewing/rejected/pending_sign/signing/completed + status: 'draft', + // 查询级别: personal/company/admin + queryScope: 'personal', + // 创建时间 + createTime: '2026-05-10 09:20:00', + // 更新时间 + updateTime: '2026-05-13 14:30:00', + // 附件列表 + attachmentList: [ + { uid: 'a1', name: '技术方案V1.pdf', size: 283011, status: 'done' }, + { uid: 'a2', name: '补充协议草案.docx', size: 125880, status: 'done' }, + ], + // 合同方信息(详见下方 partyState 结构) + partyState: { + isThreePartyContract: false, + partyA: { + companyName: '浙港物流平台有限公司', + contactPhone: '', + registeredAddress: '', + bankAccount: '', + bankName: '', + contactName: '', + legalRepresentative: '', + creditCode: '', + }, + partyB: { + companyName: '宁波港船务货运代理有限公司', + companyType: '供应商', + contactPhone: '15757460062', + registeredAddress: '', + bankAccount: '', + bankName: '', + contactName: '周经理', + legalRepresentative: '', + creditCode: '', + }, + partyC: { companyName: '' }, + }, + }, + { + id: 'INIT-202605-002', + contractCode: 'XS-2026-0015', + contractName: '保税燃料油销售合同', + contractType: '销售合同', + contractAmount: 1580000, + effectiveStart: '2026-05-01', + effectiveEnd: '2026-12-31', + paymentMethod: '银行转账(按月结算)', + templateKey: 'sales', + templateName: '销售合同模板', + contractSubject: '保税燃料油销售及船舶供油服务', + businessRemark: '已提交法务,等待审批中。', + initiator: '王倩', + initiatorDept: '国际贸易事业部', + companyName: '浙港物流平台有限公司', + status: 'reviewing', + queryScope: 'company', + createTime: '2026-05-08 16:15:00', + updateTime: '2026-05-14 08:30:00', + attachmentList: [ + { uid: 'a3', name: '报价确认函.pdf', size: 90211, status: 'done' }, + ], + partyState: { + isThreePartyContract: false, + partyA: { + companyName: '宁波浙港供应链科技有限公司', + contactPhone: '13900000088', + contactName: '陈经理', + }, + partyB: { + companyName: '上海远洋能源有限公司', + companyType: '客户', + legalRepresentative: '孙先生', + contactName: '吴经理', + contactPhone: '13600000015', + contactEmail: 'sales@oceanenergy.com', + bankName: '招商银行上海分行', + bankAccount: '621483000000000015', + }, + partyC: { companyName: '' }, + }, + }, + { + id: 'INIT-202605-003', + contractCode: 'FW-2026-0021', + contractName: '数字化平台运维服务合同', + contractType: '服务合同', + contractAmount: 520000, + effectiveStart: '2026-04-15', + effectiveEnd: '2027-04-14', + paymentMethod: '银行转账(一次性结清)', + templateKey: 'purchase', + templateName: '采购合同模板', + contractSubject: '合同管理板块运维与驻场实施服务', + businessRemark: '法务要求补充服务SLA附件后重新提交。', + initiator: '李娜', + initiatorDept: '数字化办公室', + companyName: '浙港物流平台有限公司', + status: 'rejected', + queryScope: 'company', + createTime: '2026-04-15 10:25:00', + updateTime: '2026-05-07 18:05:00', + attachmentList: [ + { uid: 'a4', name: '实施范围说明.pdf', size: 70123, status: 'done' }, + ], + partyState: { + isThreePartyContract: false, + partyA: { companyName: '浙港物流平台有限公司' }, + partyB: { + companyName: '杭州智云实施服务有限公司', + companyType: '供应商', + contactName: '刘经理', + contactPhone: '13888886666', + contactEmail: 'liu@cloudservice.com', + }, + partyC: { companyName: '' }, + }, + }, + { + id: 'INIT-202605-004', + contractCode: 'KJ-2026-0011', + contractName: '港口智能设备年度框架合同', + contractType: '框架合同', + contractAmount: 980000, + effectiveStart: '2026-03-01', + effectiveEnd: '2027-02-28', + paymentMethod: '银行转账(按月结算)', + templateKey: 'purchase', + templateName: '采购合同模板', + contractSubject: '港口智能硬件、集成服务及年度维保合作', + businessRemark: '审批完成,待发起线上签署。', + initiator: '周立', + initiatorDept: '装备采购中心', + companyName: '浙港物流平台有限公司', + status: 'pending_sign', + queryScope: 'admin', + createTime: '2026-03-01 11:12:00', + updateTime: '2026-05-11 09:45:00', + attachmentList: [ + { uid: 'a5', name: '年度采购清单.xlsx', size: 154933, status: 'done' }, + ], + partyState: { + isThreePartyContract: true, + partyA: { companyName: '浙港物流平台有限公司' }, + partyB: { + companyName: '宁波保税区港航设备有限公司', + companyType: '合作伙伴', + contactName: '赵主管', + contactPhone: '13500000021', + }, + partyC: { + companyName: '浙江临港数智科技有限公司', + companyType: '合作伙伴', + creditCode: '91330000MAABCDE123', + legalRepresentative: '钱先生', + registeredAddress: '浙江省杭州市滨江区江南大道2888号', + contactName: '何经理', + contactPhone: '13700000078', + contactAddress: '浙江省杭州市滨江区江南大道2888号', + contactEmail: 'hz@example.com', + }, + }, + }, + { + id: 'INIT-202605-005', + contractCode: 'XS-2026-0022', + contractName: '沿海航线供应服务合同', + contractType: '销售合同', + contractAmount: 760000, + effectiveStart: '2026-02-18', + effectiveEnd: '2026-11-30', + paymentMethod: '银行转账(按月结算)', + templateKey: 'sales', + templateName: '销售合同模板', + contractSubject: '沿海航线供应链服务与结算支持', + businessRemark: '甲方已签章,等待乙方签署。', + initiator: '徐晨', + initiatorDept: '客户服务中心', + companyName: '浙港物流平台有限公司', + status: 'signing', + queryScope: 'personal', + createTime: '2026-02-18 13:40:00', + updateTime: '2026-05-12 17:16:00', + attachmentList: [], + partyState: { + isThreePartyContract: false, + partyA: { + companyName: '宁波浙港供应链科技有限公司', + contactPhone: '13900000088', + contactName: '陈经理', + }, + partyB: { + companyName: '上海远洋能源有限公司', + companyType: '客户', + legalRepresentative: '孙先生', + contactName: '吴经理', + contactPhone: '13600000015', + contactEmail: 'sales@oceanenergy.com', + bankName: '招商银行上海分行', + bankAccount: '621483000000000015', + }, + partyC: { companyName: '' }, + }, + }, + { + id: 'INIT-202605-006', + contractCode: 'CG-2026-0033', + contractName: '港区安防升级采购合同', + contractType: '采购合同', + contractAmount: 2860000, + effectiveStart: '2026-01-10', + effectiveEnd: '2026-12-31', + paymentMethod: '银行转账(30%预付款,70%验收后支付)', + templateKey: 'purchase', + templateName: '采购合同模板', + contractSubject: '港区安防摄像头、门禁和施工实施采购', + businessRemark: '合同已签署完毕并推送法务归档。', + initiator: '高翔', + initiatorDept: '工程保障部', + companyName: '浙港物流平台有限公司', + status: 'completed', + queryScope: 'admin', + createTime: '2026-01-10 08:45:00', + updateTime: '2026-05-09 16:28:00', + attachmentList: [ + { uid: 'a6', name: '验收报告.pdf', size: 188221, status: 'done' }, + ], + partyState: { + isThreePartyContract: false, + partyA: { companyName: '浙港物流平台有限公司' }, + partyB: { + companyName: '宁波港船务货运代理有限公司', + companyType: '供应商', + contactPhone: '15757460062', + contactName: '周经理', + }, + partyC: { companyName: '' }, + }, + }, +] + +// ========== API 函数(接入后端时替换内部实现) ========== + +/** 查询合同发起列表 */ +export function queryLaunchList() { + return Promise.resolve(mockLaunchRecords) +} + +/** 查询合同发起详情 */ +export function getLaunchDetail(id) { + const record = mockLaunchRecords.find((item) => item.id === id) || null + return Promise.resolve(record) +} + +/** 保存合同发起 */ +export function saveLaunchRecord(record) { + return Promise.resolve(record) +} + +/** 提交合同到法务 */ +export function submitLaunchRecord(record) { + return Promise.resolve(record) +} + +/** 删除合同发起记录 */ +export function deleteLaunchRecord(idList) { + return Promise.resolve(idList) +} diff --git a/src/views/contract/launch/components/ContractPartyPlaceholderModal.vue b/src/views/contract/launch/components/ContractPartyPlaceholderModal.vue new file mode 100644 index 0000000..efe5c72 --- /dev/null +++ b/src/views/contract/launch/components/ContractPartyPlaceholderModal.vue @@ -0,0 +1,1761 @@ + + + + + diff --git a/src/views/contract/launch/components/ContractTemplateFillDemoModal.vue b/src/views/contract/launch/components/ContractTemplateFillDemoModal.vue new file mode 100644 index 0000000..c5fd43a --- /dev/null +++ b/src/views/contract/launch/components/ContractTemplateFillDemoModal.vue @@ -0,0 +1,1297 @@ + + + + + diff --git a/src/views/contract/launch/components/mixedSignModal.vue b/src/views/contract/launch/components/mixedSignModal.vue new file mode 100644 index 0000000..e6a930e --- /dev/null +++ b/src/views/contract/launch/components/mixedSignModal.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/views/contract/launch/index.vue b/src/views/contract/launch/index.vue new file mode 100644 index 0000000..42300e2 --- /dev/null +++ b/src/views/contract/launch/index.vue @@ -0,0 +1,577 @@ + + + + + diff --git a/src/views/contract/manifest/components/ContractTemplateManageModal.vue b/src/views/contract/manifest/components/ContractTemplateManageModal.vue new file mode 100644 index 0000000..450609c --- /dev/null +++ b/src/views/contract/manifest/components/ContractTemplateManageModal.vue @@ -0,0 +1,1165 @@ + + + + + diff --git a/src/views/contract/manifest/index.vue b/src/views/contract/manifest/index.vue new file mode 100644 index 0000000..6e5c5a3 --- /dev/null +++ b/src/views/contract/manifest/index.vue @@ -0,0 +1,422 @@ + + + + + diff --git a/src/views/contract/partner/components/PartnerModal.vue b/src/views/contract/partner/components/PartnerModal.vue new file mode 100644 index 0000000..105e9e1 --- /dev/null +++ b/src/views/contract/partner/components/PartnerModal.vue @@ -0,0 +1,628 @@ + + + + + diff --git a/src/views/contract/partner/index.vue b/src/views/contract/partner/index.vue new file mode 100644 index 0000000..f3b1044 --- /dev/null +++ b/src/views/contract/partner/index.vue @@ -0,0 +1,579 @@ + + + + + diff --git a/src/views/seal/externalSign.vue b/src/views/seal/externalSign.vue new file mode 100644 index 0000000..f4b7000 --- /dev/null +++ b/src/views/seal/externalSign.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/views/seal/mixedSignModal copy.vue b/src/views/seal/mixedSignModal copy.vue new file mode 100644 index 0000000..9618aa6 --- /dev/null +++ b/src/views/seal/mixedSignModal copy.vue @@ -0,0 +1,1709 @@ + + + + + diff --git a/src/views/seal/mixedSignModal.vue b/src/views/seal/mixedSignModal.vue new file mode 100644 index 0000000..b9f2f87 --- /dev/null +++ b/src/views/seal/mixedSignModal.vue @@ -0,0 +1,2428 @@ + + + + + diff --git a/src/views/seal/preSign.vue b/src/views/seal/preSign.vue new file mode 100644 index 0000000..60a9593 --- /dev/null +++ b/src/views/seal/preSign.vue @@ -0,0 +1,1844 @@ + + + + + diff --git a/src/views/seal/preSignModal.vue b/src/views/seal/preSignModal.vue new file mode 100644 index 0000000..6bcdcda --- /dev/null +++ b/src/views/seal/preSignModal.vue @@ -0,0 +1,554 @@ + + + + + diff --git a/src/views/seal/standardSign.vue b/src/views/seal/standardSign.vue new file mode 100644 index 0000000..c78d937 --- /dev/null +++ b/src/views/seal/standardSign.vue @@ -0,0 +1,1862 @@ + + + + + diff --git a/src/views/seal/standardSignModal.vue b/src/views/seal/standardSignModal.vue new file mode 100644 index 0000000..9b22061 --- /dev/null +++ b/src/views/seal/standardSignModal.vue @@ -0,0 +1,1897 @@ + + + + + diff --git a/src/views/seal/trusteeshipSign.vue b/src/views/seal/trusteeshipSign.vue new file mode 100644 index 0000000..6fcb803 --- /dev/null +++ b/src/views/seal/trusteeshipSign.vue @@ -0,0 +1,769 @@ + + + + + diff --git a/src/views/seal/trusteeshipSignModal.vue b/src/views/seal/trusteeshipSignModal.vue new file mode 100644 index 0000000..3a336d7 --- /dev/null +++ b/src/views/seal/trusteeshipSignModal.vue @@ -0,0 +1,463 @@ + + + + + diff --git a/task.txt b/task.txt new file mode 100644 index 0000000..13cb987 --- /dev/null +++ b/task.txt @@ -0,0 +1,220 @@ +文件信息 +获取合约签署信息 +请求方式 POST + +请求接口 / saas/api/contract/getDetail + +请求参数 +名称 位置 类型 必选 中文名 说明 +access_token header string 是 访问令牌 详见身份鉴权API +Content-Type header string 是 内容类型 application/json +body body object 是 Body 请求体 +» contractId body string 是 签署流程ID +参数示例 + +{ + "contractId": "CCFSENSDKGIUOLK" +} +返回参数 +返回参数 + +名称 类型 必选 中文名 说明 +» isSuccess boolean true 成功标志 true 成功 false失败 +» msg string true 消息 +» code integer true 状态码 +» data object true 数据体 +»» contractId string true 签署流程ID +»» contractName string true 合约名称 +»» status string true 合约状态 -1:已终⽌ +0:已取消 +10:等待签署 +20:签署中 +2000:已完成 +»» statusName string true 合约状态名称 已完成 +»» startTime string true 合约发起时间 +»» fileSize integer true 合约⼤⼩ +»» signatureList [object] true 签署列表 +»»» signatureId string true +»»» signer string true +»»»signatureTime string true +»»» entName string true +参数示例 + +{ + "isSuccess": true, + "msg": "成功", + "code": 200, + "data": { + "contractId": "123", + "contractName": "某某合同", + "status": 20, + "statusName": "签署中", + "startTime": "2021-10-10 10:10:10", + "fileSize": 23, + "signatureList": [ + { + "signatureId": "45642164816", + "signer": "张三", + "signatureTime": "2021-10-10 10:10:11", + "entName": "ZJCA" + } + ] + } +} +状态码 + +状态码 状态码含义 说明 +200 OK 成功 +400 HTTP 消息不可读 系统内部错误 +500 请求方式有误,请检查 GET/POST +401 Token失效 +查看合约文件 +请求方式 POST + +请求接口 /saas/api/contract/preview + +请求参数 +名称 位置 类型 必选 中文名 说明 +access_token header string 是 访问令牌 详见身份鉴权API +Content-Type header string 是 内容类型 application/json +body body object 是 Body 请求体 +» contractId body string 是 签署流程ID +参数示例 + +{ + "contractId": "CCFSENSDKGIUOLK" +} +返回参数 +返回参数 + +名称 类型 必选 中文名 说明 +» isSuccess boolean true 成功标志 true 成功 false失败 +» msg string true 消息 +» code integer true 状态码 +» data object true 数据体 +»» contractId string true 签署流程ID +»» imageHeight string true pdf转成图⽚的宽 +»» imageWidth string true pdf转成图⽚的⾼ +»» pdfUrl string true pdf预览地址 +»» pdfToImageList [string] true pdf转成图⽚的预览地址 +参数示例 + +{ + "isSuccess": true, + "msg": "成功", + "code": 200, + "data": { + "contractId": "5cf5ab68024063bb2ccf4f055549ef55", + "imageHeight": 1122, + "imageWidth": 793, + "pdfUrl": "https://testeseal.cert8.pdf", + "pdfToImageList": ["https://t/abc", + "https://t/dsd"] + } +} +状态码 + +状态码 状态码含义 说明 +200 OK 成功 +400 HTTP 消息不可读 系统内部错误 +500 请求方式有误,请检查 GET/POST +401 Token失效 +下载合约文件 +请求方式 POST + +请求接口 /saas/api/contract/download + +请求参数 +名称 位置 类型 必选 中文名 说明 +access_token header string 是 访问令牌 详见身份鉴权API +Content-Type header string 是 内容类型 application/json +body body object 是 Body 请求体 +» contractId body string 是 签署流程ID +参数示例 + +{ + "contractId": "CCFSENSDKGIUOLK" +} +返回参数 +返回参数 + +名称 类型 必选 中文名 说明 +» isSuccess boolean true 成功标志 true 成功 false失败 +» msg string true 消息 +» code integer true 状态码 +» data object true 数据体 +»» downloadUrl string true 下载链接 +参数示例 + +{ + "isSuccess": true, + "msg": "成功", + "code": 200, + "data": { + "downloadUrl": "https://tdas08.pdf" + } +} +状态码 + +状态码 状态码含义 说明 +200 OK 成功 +400 HTTP 消息不可读 系统内部错误 +500 请求方式有误,请检查 GET/POST +401 Token失效 +隐私信息 +获取用户隐私数据 +请求方式 POST + +请求接口 /api/user/getUserInfos + +请求参数 +名称 位置 类型 必选 中文名 说明 +access_token header string 是 访问令牌 详见身份鉴权API +Content-Type header string 是 内容类型 application/json +body body object 是 Body 请求体 +» requestId body string 是 二维码请求ID +参数示例 + +{ + "requestId": "8613F36DAF1B0B98" +} +返回参数 +返回参数 + +名称 类型 必选 中文名 说明 +» isSuccess boolean true 成功标志 true 成功 false失败 +» msg string true 消息 +» code integer true 状态码 +» data object true 数据体 +»» name string true 用户姓名 +»» mobile string true 手机号 +»» code string true 身份证号 +参数示例 + +{ + "isSuccess": true, + "msg": "成功", + "code": 200, + "data": + { + "name":"张三", + "mobile":"13888888888", + "code":"330111111111111111" + } +} +状态码 + +状态码 状态码含义 说明 +200 OK 成功 +400 HTTP 消息不可读 系统内部错误 +500 请求方式有误,请检查 GET/POST +401 Token失效 + + + +目前输入合约id打开合约文件没有显示出来,可能需要 调用接口获取文件和合约信息,相关接口在上方,然后打开的时候同样支持三种模式,这个你看看Home.vue怎么设计好 +src\views\seal\preSignModal.vue +src\views\seal\standardSignModal.vue +src\views\seal\trusteeshipSignModal.vue +src\views\Home.vue +修改这几个文件,同时要注意初始化的问题 \ No newline at end of file diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..c7bd768 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,40 @@ +import { defineConfig } from 'vite' +import { fileURLToPath, URL } from 'node:url' +import vue from '@vitejs/plugin-vue' + +export default defineConfig({ + plugins: [vue()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, + server: { + port: 1088, + host: true, + open: true, + proxy: { + '/manifest': { + target: 'http://127.0.0.1:8899', + changeOrigin: true, + }, + '/partner': { + target: 'http://127.0.0.1:8899', + changeOrigin: true, + }, + '/trans': { + target: 'http://127.0.0.1:8899', + changeOrigin: true, + }, + '/seal': { + target: 'http://127.0.0.1:8899', + changeOrigin: true, + }, + '/seal/ws': { + target: 'ws://127.0.0.1:8899', + ws: true, + changeOrigin: true, + }, + }, + }, +})