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 0000000..b7358a5 Binary files /dev/null and b/public/assets/templates/purchase-contract-template.docx differ diff --git a/public/assets/templates/sales-contract-template.docx b/public/assets/templates/sales-contract-template.docx new file mode 100644 index 0000000..8dbb937 Binary files /dev/null and b/public/assets/templates/sales-contract-template.docx differ diff --git a/scripts/generate-contract-templates.mjs b/scripts/generate-contract-templates.mjs new file mode 100644 index 0000000..555b2b4 --- /dev/null +++ b/scripts/generate-contract-templates.mjs @@ -0,0 +1,213 @@ +import { mkdir, writeFile } from 'node:fs/promises' +import path from 'node:path' +import { + AlignmentType, + BorderStyle, + Document, + Footer, + HeadingLevel, + Packer, + Paragraph, + Table, + TableCell, + TableRow, + TextRun, + WidthType, +} from 'docx' + +const outputDir = path.resolve(process.cwd(), 'public/assets/templates') + +function createInfoTable() { + const rows = [ + ['合同名称', '{contractName}'], + ['合同编码', '{contractCode}'], + ['合同类型', '{contractType}'], + ['合同金额', '人民币 {contractAmountDisplay}'], + ['有效期', '{effectivePeriod}'], + ['付款方式', '{paymentMethod}'], + ['合同相对方', '{counterpartySummary}'], + ['附件情况', '{attachmentSummary}'], + ] + + return new Table({ + width: { + size: 100, + type: WidthType.PERCENTAGE, + }, + rows: rows.map( + ([label, value]) => + 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, + }, + }, + }, +})