| | |
| | | "fast-xml-parser": "catalog:", |
| | | "gsap": "^3.15.0", |
| | | "highlight.js": "catalog:", |
| | | "html-to-image": "^1.11.13", |
| | | "jspdf": "^4.2.1", |
| | | "livekit-client": "^2.20.0", |
| | | "pinia": "catalog:", |
| | | "sortablejs": "catalog:", |
| | |
| | | version: 7.0.0 |
| | | '@types/codemirror': |
| | | specifier: ^5.60.17 |
| | | version: 5.60.17 |
| | | version: 5.60.18 |
| | | '@types/crypto-js': |
| | | specifier: ^4.2.2 |
| | | version: 4.2.2 |
| | |
| | | version: 4.5.9 |
| | | '@types/markdown-it': |
| | | specifier: ^14.1.2 |
| | | version: 14.1.2 |
| | | version: 14.2.0 |
| | | '@types/node': |
| | | specifier: ^25.9.4 |
| | | version: 25.9.4 |
| | |
| | | highlight.js: |
| | | specifier: 'catalog:' |
| | | version: 11.11.1 |
| | | html-to-image: |
| | | specifier: ^1.11.13 |
| | | version: 1.11.13 |
| | | jspdf: |
| | | specifier: ^4.2.1 |
| | | version: 4.2.1 |
| | | livekit-client: |
| | | specifier: ^2.20.0 |
| | | version: 2.20.0(@types/dom-mediacapture-record@1.0.22) |
| | |
| | | devDependencies: |
| | | '@types/codemirror': |
| | | specifier: 'catalog:' |
| | | version: 5.60.17 |
| | | version: 5.60.18 |
| | | '@types/markdown-it': |
| | | specifier: 'catalog:' |
| | | version: 14.1.2 |
| | | version: 14.2.0 |
| | | |
| | | src/packages/effects/request: |
| | | dependencies: |
| | |
| | | '@jridgewell/source-map@0.3.11': |
| | | resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} |
| | | |
| | | '@jridgewell/sourcemap-codec@1.4.10': |
| | | resolution: {integrity: sha512-Ht8wIW5v165atIX1p+JvKR5ONzUyF4Ac8DZIQ5kZs9zrb6M8SJNXpx1zn04rn65VjBMygRoMXcyYwNK0fT7bEg==} |
| | | |
| | | '@jridgewell/sourcemap-codec@1.4.14': |
| | | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} |
| | | |
| | | '@jridgewell/sourcemap-codec@1.5.0': |
| | | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} |
| | | |
| | | '@jridgewell/sourcemap-codec@1.5.5': |
| | | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} |
| | | |
| | | '@jridgewell/sourcemap-codec@1.6.0': |
| | | resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} |
| | | |
| | | '@jridgewell/trace-mapping@0.3.31': |
| | | resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} |
| | |
| | | '@types/archiver@7.0.0': |
| | | resolution: {integrity: sha512-/3vwGwx9n+mCQdYZ2IKGGHEFL30I96UgBlk8EtRDDFQ9uxM1l4O5Ci6r00EMAkiDaTqD9DQ6nVrWRICnBPtzzg==} |
| | | |
| | | '@types/codemirror@5.60.17': |
| | | resolution: {integrity: sha512-AZq2FIsUHVMlp7VSe2hTfl5w4pcUkoFkM3zVsRKsn1ca8CXRDYvnin04+HP2REkwsxemuHqvDofdlhUWNpbwfw==} |
| | | '@types/codemirror@5.60.18': |
| | | resolution: {integrity: sha512-aSBOPXH2PXRYixxUpVP1sJ5+S0vEfKDvR+lABZ7Kju/9Qb0SSbZk72NihWaKoQbANyibs92q4DBfYasywxnNkA==} |
| | | |
| | | '@types/conventional-commits-parser@5.0.2': |
| | | resolution: {integrity: sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==} |
| | |
| | | '@types/lodash@4.17.24': |
| | | resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} |
| | | |
| | | '@types/markdown-it@14.1.2': |
| | | resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} |
| | | '@types/markdown-it@14.2.0': |
| | | resolution: {integrity: sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==} |
| | | |
| | | '@types/mdurl@2.0.0': |
| | | resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} |
| | |
| | | '@types/nprogress@0.2.3': |
| | | resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} |
| | | |
| | | '@types/pako@2.0.0': |
| | | resolution: {integrity: sha512-10+iaz93qR5WYxTo+PMifD5TSxiOtdRaxBf7INGGXMQgTCu8Z/7GYWYFUOS3q/G0nE5boj1r4FEB+WSy7s5gbA==} |
| | | |
| | | '@types/qrcode@1.5.6': |
| | | resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} |
| | | |
| | | '@types/qs@6.15.1': |
| | | resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} |
| | | |
| | | '@types/raf@3.4.3': |
| | | resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} |
| | | |
| | | '@types/readdir-glob@1.1.5': |
| | | resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} |
| | |
| | | '@vue/devtools-api@6.5.0': |
| | | resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} |
| | | |
| | | '@vue/devtools-api@7.5.2': |
| | | resolution: {integrity: sha512-VxPbAQxJrYSIkoGVvQ2oOoKW8u4CMpvRLySTxhoJA38z8bQEGy9GO33eoRY/DulJbSFRfjZFNvH+dh8B4qpesQ==} |
| | | '@vue/devtools-api@7.7.10': |
| | | resolution: {integrity: sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==} |
| | | |
| | | '@vue/devtools-api@7.7.7': |
| | | resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==} |
| | |
| | | peerDependencies: |
| | | vue: ^3.0.0 |
| | | |
| | | '@vue/devtools-kit@7.5.2': |
| | | resolution: {integrity: sha512-0leUOE2HBfl8sHf9ePKzxqnCFskkU22tWWqd9OfeSlslAKE30/TViYvWcF4vgQmPlJnAAdHU0WfW5dYlCeOiuw==} |
| | | '@vue/devtools-kit@7.7.10': |
| | | resolution: {integrity: sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==} |
| | | |
| | | '@vue/devtools-kit@7.7.7': |
| | | resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==} |
| | |
| | | '@vue/devtools-kit@8.1.3': |
| | | resolution: {integrity: sha512-cRn7GXiCQkMYU2Z3h3pM4YO/ndbx9FY1yLDAqIqPLcmIq4H6zAOJHein6tvZU3AfPwgrodqLiPBEF+YQaS8AxA==} |
| | | |
| | | '@vue/devtools-shared@7.5.2': |
| | | resolution: {integrity: sha512-+zmcixnD6TAo+zwm30YuwZckhL9iIi4u+gFwbq9C8zpm3SMndTlEYZtNhAHUhOXB+bCkzyunxw80KQ/T0trF4w==} |
| | | |
| | | '@vue/devtools-shared@7.7.7': |
| | | resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} |
| | | '@vue/devtools-shared@7.7.10': |
| | | resolution: {integrity: sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==} |
| | | |
| | | '@vue/devtools-shared@8.1.3': |
| | | resolution: {integrity: sha512-CM3uIPL+v+lrJUk33+pxspYo0MhuMWlCvf7zC9fybifvCPyM2jUbYRPwoYEJgYbwRqPikm5HozbUhp60MF2QuA==} |
| | |
| | | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} |
| | | engines: {node: '>=8'} |
| | | |
| | | ansi-regex@6.2.2: |
| | | resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} |
| | | ansi-regex@6.3.0: |
| | | resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} |
| | | engines: {node: '>=12'} |
| | | |
| | | ansi-styles@4.3.0: |
| | |
| | | bare-url@2.4.5: |
| | | resolution: {integrity: sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==} |
| | | |
| | | base64-arraybuffer@1.0.2: |
| | | resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} |
| | | engines: {node: '>= 0.6.0'} |
| | | |
| | | base64-js@1.5.1: |
| | | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} |
| | | |
| | |
| | | |
| | | bindings@1.5.0: |
| | | resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} |
| | | |
| | | birpc@0.2.19: |
| | | resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} |
| | | |
| | | birpc@2.3.0: |
| | | resolution: {integrity: sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==} |
| | |
| | | caniuse-lite@1.0.30001799: |
| | | resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} |
| | | |
| | | canvg@3.0.11: |
| | | resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==} |
| | | engines: {node: '>=10.0.0'} |
| | | |
| | | chalk@4.1.2: |
| | | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} |
| | | engines: {node: '>=10'} |
| | |
| | | color-name@1.1.4: |
| | | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} |
| | | |
| | | colord@2.9.3: |
| | | resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} |
| | | colord@2.10.0: |
| | | resolution: {integrity: sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw==} |
| | | |
| | | colorjs.io@0.5.0: |
| | | resolution: {integrity: sha512-qekjTiBLM3F/sXKks/ih5aWaHIGu+Ftel0yKEvmpbKvmxpNOhojKgha5uiWEUOqEpRjC1Tq3nJRT7WgdBOxIGg==} |
| | |
| | | |
| | | crypto-js@4.2.0: |
| | | resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} |
| | | deprecated: Active development of CryptoJS has been discontinued. This library is no longer maintained. |
| | | |
| | | crypto-random-string@2.0.0: |
| | | resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} |
| | |
| | | css-functions-list@3.3.3: |
| | | resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} |
| | | engines: {node: '>=12'} |
| | | |
| | | css-line-break@2.1.0: |
| | | resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} |
| | | |
| | | css-select@5.1.0: |
| | | resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} |
| | |
| | | resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} |
| | | engines: {node: '>=18'} |
| | | |
| | | default-browser@5.5.0: |
| | | resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} |
| | | default-browser@5.5.1: |
| | | resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} |
| | | engines: {node: '>=18'} |
| | | |
| | | default-passive-events@2.0.0: |
| | |
| | | dot-case@3.0.4: |
| | | resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} |
| | | |
| | | dot-prop@10.1.0: |
| | | resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} |
| | | dot-prop@10.2.0: |
| | | resolution: {integrity: sha512-BTJ9aZYL3vCfZlZOBLy9v8TUqWGQ0pzFnygKwFZt5udj6viBoFIBviKPUoZLDCPn1FoXffv6McQFDenrm5Krfw==} |
| | | engines: {node: '>=20'} |
| | | |
| | | dot-prop@5.3.0: |
| | |
| | | error-stack-parser-es@1.0.5: |
| | | resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} |
| | | |
| | | errx@0.1.0: |
| | | resolution: {integrity: sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==} |
| | | errx@0.1.2: |
| | | resolution: {integrity: sha512-chfpPHmCerdo/rXr/nNvPZRkV4WwDRwzwnsJ0Uzz3tVi8Z41tDctRjduYy1138ii77AFlts1qvWtX3g/Acg91Q==} |
| | | |
| | | es-abstract-get@1.0.0: |
| | | resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} |
| | |
| | | resolution: {integrity: sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==} |
| | | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} |
| | | |
| | | esprima@2.7.3: |
| | | resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} |
| | | engines: {node: '>=0.10.0'} |
| | | hasBin: true |
| | | |
| | | esprima@4.0.1: |
| | | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} |
| | | engines: {node: '>=4'} |
| | |
| | | |
| | | fast-levenshtein@2.0.6: |
| | | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} |
| | | |
| | | fast-png@6.2.0: |
| | | resolution: {integrity: sha512-fO4DewoEd9WwuP8DQcfj8Tlc88Jno6lJAjlDYzvJSqMIZwxUpRT4zuzPXgqygjJqngBdCbeQRaL/FVz3InExhA==} |
| | | |
| | | fast-uri@3.1.2: |
| | | resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} |
| | |
| | | resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} |
| | | engines: {node: '>=12.0.0'} |
| | | |
| | | highlight.js@11.12.0: |
| | | resolution: {integrity: sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg==} |
| | | engines: {node: '>=12.0.0'} |
| | | |
| | | hookable@5.5.3: |
| | | resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} |
| | | |
| | |
| | | html-tags@5.1.0: |
| | | resolution: {integrity: sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==} |
| | | engines: {node: '>=20.10'} |
| | | |
| | | html-to-image@1.11.13: |
| | | resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==} |
| | | |
| | | html2canvas@1.4.1: |
| | | resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} |
| | | engines: {node: '>=8.0.0'} |
| | | |
| | | htmlparser2@10.1.0: |
| | | resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} |
| | |
| | | |
| | | ignore@5.3.2: |
| | | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} |
| | | engines: {node: '>= 4'} |
| | | |
| | | ignore@7.0.5: |
| | | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} |
| | | engines: {node: '>= 4'} |
| | | |
| | | ignore@7.0.6: |
| | |
| | | internmap@2.0.3: |
| | | resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} |
| | | engines: {node: '>=12'} |
| | | |
| | | iobuffer@5.4.0: |
| | | resolution: {integrity: sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==} |
| | | |
| | | ioredis@5.11.1: |
| | | resolution: {integrity: sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==} |
| | |
| | | resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} |
| | | engines: {node: '>=0.10.0'} |
| | | |
| | | is-plain-object@5.0.0: |
| | | resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} |
| | | is-plain-object@5.1.0: |
| | | resolution: {integrity: sha512-bUi/yjmtKYcRVUtWRGr0UA6xEFh2I6zWUwMrUXB3s7bmYCaZ8a+0ZsTRkrawh/mzlSD1Y0Ph8bp/U+TvBpWDNw==} |
| | | engines: {node: '>=0.10.0'} |
| | | |
| | | is-reference@1.2.1: |
| | |
| | | js-tokens@9.0.1: |
| | | resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} |
| | | |
| | | js-yaml@3.6.1: |
| | | resolution: {integrity: sha512-BLv3oxhfET+w5fjPwq3PsAsxzi9i3qzU//HMpWVz0A6KplF86HdR9x2TGnv9DXhSUrO7LO8czUiTd3yb3mLSvg==} |
| | | js-yaml@3.15.2: |
| | | resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} |
| | | hasBin: true |
| | | |
| | | js-yaml@4.2.0: |
| | |
| | | jsonpointer@5.0.1: |
| | | resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} |
| | | engines: {node: '>=0.10.0'} |
| | | |
| | | jspdf@4.2.1: |
| | | resolution: {integrity: sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ==} |
| | | |
| | | katex@0.16.47: |
| | | resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} |
| | |
| | | mdn-data@2.28.1: |
| | | resolution: {integrity: sha512-U9w+PzSZ00Z5m9rZ5ARVFL5xOfuCHdKYi/1RRwDCJsboFgJDNT3zT6PIPD7mZQYaQLhsZM3GfDRgSMRHhSmVng==} |
| | | |
| | | mdurl@2.0.0: |
| | | resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} |
| | | mdurl@2.1.0: |
| | | resolution: {integrity: sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==} |
| | | |
| | | meow@12.0.1: |
| | | resolution: {integrity: sha512-/QOqMALNoKQcJAOOdIXjNLtfcCdLXbMFyB1fOOPdm6RzfBTlsuodOCTBDjVbeUSmgDQb8UI2oONqYGtq1PKKKA==} |
| | |
| | | resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} |
| | | hasBin: true |
| | | |
| | | node-mock-http@1.0.4: |
| | | resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} |
| | | node-mock-http@1.0.5: |
| | | resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} |
| | | |
| | | node-releases@2.0.48: |
| | | resolution: {integrity: sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==} |
| | |
| | | ofetch@1.5.1: |
| | | resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} |
| | | |
| | | ohash@2.0.11: |
| | | resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} |
| | | ohash@2.0.12: |
| | | resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} |
| | | |
| | | on-finished@2.4.1: |
| | | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} |
| | |
| | | resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} |
| | | engines: {node: '>=18'} |
| | | |
| | | open@11.0.0: |
| | | resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} |
| | | open@11.0.2: |
| | | resolution: {integrity: sha512-RWqF+pBSkqecEvCKOn8QYhaNdRMJDZRIrlS/7rTDdLHaPcfXGCZ/h8zb413NfvdeAV0MR7T1yJcA34/q+CSm1Q==} |
| | | engines: {node: '>=20'} |
| | | |
| | | optionator@0.9.4: |
| | |
| | | package-json-from-dist@1.0.1: |
| | | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} |
| | | |
| | | package-manager-detector@1.6.0: |
| | | resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} |
| | | package-manager-detector@1.8.0: |
| | | resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} |
| | | |
| | | pako@2.2.0: |
| | | resolution: {integrity: sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==} |
| | |
| | | |
| | | perfect-debounce@2.1.0: |
| | | resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} |
| | | |
| | | performance-now@2.1.0: |
| | | resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} |
| | | |
| | | picocolors@1.1.1: |
| | | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} |
| | |
| | | resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} |
| | | engines: {node: '>=20'} |
| | | |
| | | powershell-utils@0.2.1: |
| | | resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==} |
| | | engines: {node: '>=20'} |
| | | |
| | | preact@10.29.2: |
| | | resolution: {integrity: sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ==} |
| | | |
| | |
| | | resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} |
| | | engines: {node: ^14.13.1 || >=16.0.0} |
| | | |
| | | pretty-bytes@7.1.0: |
| | | resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} |
| | | pretty-bytes@7.1.2: |
| | | resolution: {integrity: sha512-spZIOSORH9joSPGN0L/tYfvINH+xbOpnI3kdcEkq0mzGMjFvDZzyRVbqEOV0wACF0gggdKE9RWO2mosGsBh/Rg==} |
| | | engines: {node: '>=20'} |
| | | |
| | | pretty-ms@9.3.0: |
| | | resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} |
| | | pretty-ms@9.3.1: |
| | | resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==} |
| | | engines: {node: '>=18'} |
| | | |
| | | prismjs@1.30.0: |
| | |
| | | prosemirror-changeset@2.4.1: |
| | | resolution: {integrity: sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==} |
| | | |
| | | prosemirror-commands@1.7.1: |
| | | resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} |
| | | prosemirror-commands@1.7.2: |
| | | resolution: {integrity: sha512-q6Q6szxqdu9Xd6EcdKsqXghu5nQdZTpB4Q9yd04WRc7/jt763e/rT60Owh0L1GYY+T46o5rD+9lEN36dZS43tw==} |
| | | |
| | | prosemirror-dropcursor@1.8.2: |
| | | resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} |
| | | prosemirror-dropcursor@1.8.3: |
| | | resolution: {integrity: sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==} |
| | | |
| | | prosemirror-gapcursor@1.4.1: |
| | | resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} |
| | |
| | | radix3@1.1.2: |
| | | resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} |
| | | |
| | | raf@3.4.1: |
| | | resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} |
| | | |
| | | randomcolor@0.6.2: |
| | | resolution: {integrity: sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==} |
| | | |
| | | range-parser@1.2.1: |
| | | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} |
| | | range-parser@1.3.0: |
| | | resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} |
| | | engines: {node: '>= 0.6'} |
| | | |
| | | rc9@3.0.1: |
| | |
| | | |
| | | regenerate@1.4.2: |
| | | resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} |
| | | |
| | | regenerator-runtime@0.13.11: |
| | | resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} |
| | | |
| | | regexp.prototype.flags@1.5.4: |
| | | resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} |
| | |
| | | |
| | | rfdc@1.4.1: |
| | | resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} |
| | | |
| | | rgbcolor@1.0.1: |
| | | resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==} |
| | | engines: {node: '>= 0.8.15'} |
| | | |
| | | rimraf@5.0.5: |
| | | resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} |
| | |
| | | sprintf-js@1.0.3: |
| | | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} |
| | | |
| | | stackblur-canvas@2.0.0: |
| | | resolution: {integrity: sha512-660gH1SpjeKyfUYnne9nuIya7CDGds6NdIrxzOToSgaSlOqbh7UYGP9VlxlQ8IX7af/nPuAHLkN03l84OesX7Q==} |
| | | deprecated: Fixed build bug in 2.2.0 as not converting ES6 source for older browsers |
| | | |
| | | standard-as-callback@2.1.0: |
| | | resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} |
| | | |
| | |
| | | resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} |
| | | engines: {node: '>=20'} |
| | | |
| | | string.prototype.matchall@4.0.12: |
| | | resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} |
| | | string.prototype.matchall@4.1.0: |
| | | resolution: {integrity: sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==} |
| | | engines: {node: '>= 0.4'} |
| | | |
| | | string.prototype.trim@1.2.11: |
| | |
| | | style-value-types@5.1.2: |
| | | resolution: {integrity: sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==} |
| | | |
| | | stylelint-config-html@1.1.0: |
| | | resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} |
| | | engines: {node: ^12 || >=14} |
| | | stylelint-config-html@2.0.0: |
| | | resolution: {integrity: sha512-Lk1NPEdUxzHkPv3ehktjpiOk4MPaqQ3H8fkvhxdWlQpaZCm9ze0SoMbRQLqkUxEMfPE1G9/x968uxm/+d2njoA==} |
| | | engines: {node: ^22.12 || >=24} |
| | | peerDependencies: |
| | | postcss-html: ^1.0.0 |
| | | stylelint: '>=14.0.0' |
| | | postcss-html: ^2.0.0 |
| | | stylelint: '>=16.0.0' |
| | | |
| | | stylelint-config-recess-order@7.7.0: |
| | | resolution: {integrity: sha512-TWRkg+BrwHOki4pi9y1emWgx6pFwZXOYZhNsbEObke/mzYUJVJvDEzJJQXhH7ajslQJGcrExy8ZvJqDiUbhFpA==} |
| | |
| | | sver@2.0.1: |
| | | resolution: {integrity: sha512-zqIx4tK5+gR8xE8VgLNr+IA0mqKDgMNdsfX86DTfNNnVKyuVUhjGdz6KA0rO3q445WUfGpEeJym1m3Xym7ot6w==} |
| | | |
| | | svg-pathdata@6.0.3: |
| | | resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} |
| | | engines: {node: '>=12.0.0'} |
| | | |
| | | svg-tags@1.0.0: |
| | | resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} |
| | | |
| | |
| | | text-extensions@2.4.0: |
| | | resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} |
| | | engines: {node: '>=8'} |
| | | |
| | | text-segmentation@1.0.3: |
| | | resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} |
| | | |
| | | theme-colors@0.1.0: |
| | | resolution: {integrity: sha512-6gTEHQqWlQNiOEGHCSSQmU//E5SnXHJ4H7oHQOD8x77CvNYNQAmt73dqR71mzw5ULV87zaHLxK5pIBnsToFuZw==} |
| | |
| | | ufo@1.6.4: |
| | | resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} |
| | | |
| | | ultrahtml@1.6.0: |
| | | resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} |
| | | ultrahtml@1.7.0: |
| | | resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} |
| | | |
| | | unbox-primitive@1.1.0: |
| | | resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} |
| | |
| | | |
| | | unplugin-utils@0.3.1: |
| | | resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} |
| | | engines: {node: '>=20.19.0'} |
| | | |
| | | unplugin-utils@0.3.2: |
| | | resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} |
| | | engines: {node: '>=20.19.0'} |
| | | |
| | | unplugin-vue@7.2.0: |
| | |
| | | |
| | | util-deprecate@1.0.2: |
| | | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} |
| | | |
| | | utrie@1.0.2: |
| | | resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} |
| | | |
| | | valibot@1.4.1: |
| | | resolution: {integrity: sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g==} |
| | |
| | | resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} |
| | | engines: {node: ^20.17.0 || >=22.9.0} |
| | | |
| | | wsl-utils@0.3.1: |
| | | resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} |
| | | wsl-utils@1.0.0: |
| | | resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==} |
| | | engines: {node: '>=20'} |
| | | |
| | | xe-utils@3.9.1: |
| | |
| | | resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} |
| | | engines: {node: '>=12'} |
| | | |
| | | yargs@18.0.0: |
| | | resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} |
| | | yargs@18.1.0: |
| | | resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} |
| | | engines: {node: ^20.19.0 || ^22.12.0 || >=23} |
| | | |
| | | yocto-queue@1.2.2: |
| | | resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} |
| | | engines: {node: '>=12.20'} |
| | | |
| | | yoctocolors@2.1.2: |
| | | resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} |
| | | yoctocolors@2.2.0: |
| | | resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} |
| | | engines: {node: '>=18'} |
| | | |
| | | youch-core@0.3.3: |
| | |
| | | |
| | | '@antfu/install-pkg@1.1.0': |
| | | dependencies: |
| | | package-manager-detector: 1.6.0 |
| | | package-manager-detector: 1.8.0 |
| | | tinyexec: 1.2.4 |
| | | |
| | | '@apideck/better-ajv-errors@0.3.7(ajv@8.20.0)': |
| | |
| | | dependencies: |
| | | escape-string-regexp: 4.0.0 |
| | | eslint: 10.5.0(jiti@2.7.0) |
| | | ignore: 7.0.5 |
| | | ignore: 7.0.6 |
| | | |
| | | '@eslint-community/eslint-utils@4.9.1(eslint@10.5.0(jiti@2.7.0))': |
| | | dependencies: |
| | |
| | | |
| | | '@jridgewell/gen-mapping@0.3.13': |
| | | dependencies: |
| | | '@jridgewell/sourcemap-codec': 1.5.0 |
| | | '@jridgewell/sourcemap-codec': 1.6.0 |
| | | '@jridgewell/trace-mapping': 0.3.31 |
| | | |
| | | '@jridgewell/gen-mapping@0.3.5': |
| | | dependencies: |
| | | '@jridgewell/set-array': 1.2.1 |
| | | '@jridgewell/sourcemap-codec': 1.4.10 |
| | | '@jridgewell/sourcemap-codec': 1.6.0 |
| | | '@jridgewell/trace-mapping': 0.3.31 |
| | | |
| | | '@jridgewell/remapping@2.3.5': |
| | |
| | | '@jridgewell/gen-mapping': 0.3.5 |
| | | '@jridgewell/trace-mapping': 0.3.31 |
| | | |
| | | '@jridgewell/sourcemap-codec@1.4.10': {} |
| | | |
| | | '@jridgewell/sourcemap-codec@1.4.14': {} |
| | | |
| | | '@jridgewell/sourcemap-codec@1.5.0': {} |
| | | |
| | | '@jridgewell/sourcemap-codec@1.5.5': {} |
| | | |
| | | '@jridgewell/sourcemap-codec@1.6.0': {} |
| | | |
| | | '@jridgewell/trace-mapping@0.3.31': |
| | | dependencies: |
| | | '@jridgewell/resolve-uri': 3.1.2 |
| | | '@jridgewell/sourcemap-codec': 1.4.14 |
| | | '@jridgewell/sourcemap-codec': 1.6.0 |
| | | |
| | | '@jspm/fetch@0.1.0': {} |
| | | |
| | |
| | | consola: 3.4.2 |
| | | defu: 6.1.7 |
| | | destr: 2.0.5 |
| | | errx: 0.1.0 |
| | | errx: 0.1.2 |
| | | exsolve: 1.1.0 |
| | | ignore: 7.0.6 |
| | | jiti: 2.7.0 |
| | | klona: 2.0.6 |
| | | knitwork: 1.3.0 |
| | | mlly: 1.8.2 |
| | | ohash: 2.0.11 |
| | | ohash: 2.0.12 |
| | | pathe: 2.0.3 |
| | | pkg-types: 2.3.1 |
| | | rc9: 3.0.1 |
| | |
| | | '@tiptap/pm@3.27.1': |
| | | dependencies: |
| | | prosemirror-changeset: 2.4.1 |
| | | prosemirror-commands: 1.7.1 |
| | | prosemirror-dropcursor: 1.8.2 |
| | | prosemirror-commands: 1.7.2 |
| | | prosemirror-dropcursor: 1.8.3 |
| | | prosemirror-gapcursor: 1.4.1 |
| | | prosemirror-history: 1.5.0 |
| | | prosemirror-inputrules: 1.5.1 |
| | |
| | | ejs: 3.1.10 |
| | | json5: 2.2.3 |
| | | magic-string: 0.30.21 |
| | | string.prototype.matchall: 4.0.12 |
| | | string.prototype.matchall: 4.1.0 |
| | | |
| | | '@tybys/wasm-util@0.10.2': |
| | | dependencies: |
| | |
| | | dependencies: |
| | | '@types/readdir-glob': 1.1.5 |
| | | |
| | | '@types/codemirror@5.60.17': |
| | | '@types/codemirror@5.60.18': |
| | | dependencies: |
| | | '@types/tern': 0.23.9 |
| | | |
| | |
| | | |
| | | '@types/lodash@4.17.24': {} |
| | | |
| | | '@types/markdown-it@14.1.2': |
| | | '@types/markdown-it@14.2.0': |
| | | dependencies: |
| | | '@types/linkify-it': 5.0.0 |
| | | '@types/mdurl': 2.0.0 |
| | |
| | | |
| | | '@types/nprogress@0.2.3': {} |
| | | |
| | | '@types/pako@2.0.0': {} |
| | | |
| | | '@types/qrcode@1.5.6': |
| | | dependencies: |
| | | '@types/node': 25.9.4 |
| | | |
| | | '@types/qs@6.15.1': {} |
| | | |
| | | '@types/raf@3.4.3': |
| | | optional: true |
| | | |
| | | '@types/readdir-glob@1.1.5': |
| | | dependencies: |
| | |
| | | '@typescript-eslint/utils': 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@6.0.3) |
| | | '@typescript-eslint/visitor-keys': 8.62.0 |
| | | eslint: 10.5.0(jiti@2.7.0) |
| | | ignore: 7.0.5 |
| | | ignore: 7.0.6 |
| | | natural-compare: 1.4.0 |
| | | ts-api-utils: 2.5.0(typescript@6.0.3) |
| | | typescript: 6.0.3 |
| | |
| | | |
| | | '@vue/devtools-api@6.5.0': {} |
| | | |
| | | '@vue/devtools-api@7.5.2': |
| | | '@vue/devtools-api@7.7.10': |
| | | dependencies: |
| | | '@vue/devtools-kit': 7.5.2 |
| | | '@vue/devtools-kit': 7.7.10 |
| | | |
| | | '@vue/devtools-api@7.7.7': |
| | | dependencies: |
| | |
| | | '@vue/devtools-shared': 8.1.3 |
| | | vue: 3.5.38(typescript@6.0.3) |
| | | |
| | | '@vue/devtools-kit@7.5.2': |
| | | '@vue/devtools-kit@7.7.10': |
| | | dependencies: |
| | | '@vue/devtools-shared': 7.5.2 |
| | | birpc: 0.2.19 |
| | | '@vue/devtools-shared': 7.7.10 |
| | | birpc: 2.3.0 |
| | | hookable: 5.5.3 |
| | | mitt: 3.0.1 |
| | | perfect-debounce: 1.0.0 |
| | |
| | | |
| | | '@vue/devtools-kit@7.7.7': |
| | | dependencies: |
| | | '@vue/devtools-shared': 7.7.7 |
| | | '@vue/devtools-shared': 7.7.10 |
| | | birpc: 2.3.0 |
| | | hookable: 5.5.3 |
| | | mitt: 3.0.1 |
| | |
| | | hookable: 5.5.3 |
| | | perfect-debounce: 2.1.0 |
| | | |
| | | '@vue/devtools-shared@7.5.2': |
| | | dependencies: |
| | | rfdc: 1.4.1 |
| | | |
| | | '@vue/devtools-shared@7.7.7': |
| | | '@vue/devtools-shared@7.7.10': |
| | | dependencies: |
| | | rfdc: 1.4.1 |
| | | |
| | |
| | | |
| | | ansi-regex@5.0.1: {} |
| | | |
| | | ansi-regex@6.2.2: {} |
| | | ansi-regex@6.3.0: {} |
| | | |
| | | ansi-styles@4.3.0: |
| | | dependencies: |
| | |
| | | dependencies: |
| | | bare-path: 3.0.1 |
| | | |
| | | base64-arraybuffer@1.0.2: |
| | | optional: true |
| | | |
| | | base64-js@1.5.1: {} |
| | | |
| | | baseline-browser-mapping@2.10.38: {} |
| | |
| | | bindings@1.5.0: |
| | | dependencies: |
| | | file-uri-to-path: 1.0.0 |
| | | |
| | | birpc@0.2.19: {} |
| | | |
| | | birpc@2.3.0: {} |
| | | |
| | |
| | | exsolve: 1.1.0 |
| | | giget: 3.3.0 |
| | | jiti: 2.7.0 |
| | | ohash: 2.0.11 |
| | | ohash: 2.0.12 |
| | | pathe: 2.0.3 |
| | | perfect-debounce: 2.1.0 |
| | | pkg-types: 2.3.1 |
| | |
| | | camunda-bpmn-moddle@7.0.1: {} |
| | | |
| | | caniuse-lite@1.0.30001799: {} |
| | | |
| | | canvg@3.0.11: |
| | | dependencies: |
| | | '@babel/runtime': 7.29.7 |
| | | '@types/raf': 3.4.3 |
| | | core-js: 3.49.0 |
| | | raf: 3.4.1 |
| | | regenerator-runtime: 0.13.11 |
| | | rgbcolor: 1.0.1 |
| | | stackblur-canvas: 2.0.0 |
| | | svg-pathdata: 6.0.3 |
| | | optional: true |
| | | |
| | | chalk@4.1.2: |
| | | dependencies: |
| | |
| | | |
| | | color-name@1.1.4: {} |
| | | |
| | | colord@2.9.3: {} |
| | | colord@2.10.0: {} |
| | | |
| | | colorjs.io@0.5.0: {} |
| | | |
| | |
| | | crypto-random-string@2.0.0: {} |
| | | |
| | | css-functions-list@3.3.3: {} |
| | | |
| | | css-line-break@2.1.0: |
| | | dependencies: |
| | | utrie: 1.0.2 |
| | | optional: true |
| | | |
| | | css-select@5.1.0: |
| | | dependencies: |
| | |
| | | |
| | | default-browser-id@5.0.1: {} |
| | | |
| | | default-browser@5.5.0: |
| | | default-browser@5.5.1: |
| | | dependencies: |
| | | bundle-name: 4.1.0 |
| | | default-browser-id: 5.0.1 |
| | |
| | | no-case: 3.0.4 |
| | | tslib: 2.8.1 |
| | | |
| | | dot-prop@10.1.0: |
| | | dot-prop@10.2.0: |
| | | dependencies: |
| | | type-fest: 5.7.0 |
| | | |
| | |
| | | |
| | | error-stack-parser-es@1.0.5: {} |
| | | |
| | | errx@0.1.0: |
| | | errx@0.1.2: |
| | | optional: true |
| | | |
| | | es-abstract-get@1.0.0: |
| | |
| | | acorn-jsx: 5.3.2(acorn@8.17.0) |
| | | eslint-visitor-keys: 3.0.0 |
| | | |
| | | esprima@2.7.3: {} |
| | | |
| | | esprima@4.0.1: {} |
| | | |
| | | esquery@1.7.0: |
| | |
| | | |
| | | esrap@2.2.12(@typescript-eslint/types@8.62.0): |
| | | dependencies: |
| | | '@jridgewell/sourcemap-codec': 1.5.0 |
| | | '@jridgewell/sourcemap-codec': 1.6.0 |
| | | optionalDependencies: |
| | | '@typescript-eslint/types': 8.62.0 |
| | | |
| | |
| | | is-plain-obj: 4.1.0 |
| | | is-stream: 4.0.1 |
| | | npm-run-path: 6.0.0 |
| | | pretty-ms: 9.3.0 |
| | | pretty-ms: 9.3.1 |
| | | signal-exit: 4.1.0 |
| | | strip-final-newline: 4.0.0 |
| | | yoctocolors: 2.1.2 |
| | | yoctocolors: 2.2.0 |
| | | |
| | | exsolve@1.1.0: {} |
| | | |
| | |
| | | fast-json-stable-stringify@2.1.0: {} |
| | | |
| | | fast-levenshtein@2.0.6: {} |
| | | |
| | | fast-png@6.2.0: |
| | | dependencies: |
| | | '@types/pako': 2.0.0 |
| | | iobuffer: 5.4.0 |
| | | pako: 2.2.0 |
| | | |
| | | fast-uri@3.1.2: {} |
| | | |
| | |
| | | dependencies: |
| | | '@sindresorhus/merge-streams': 4.0.0 |
| | | fast-glob: 3.3.3 |
| | | ignore: 7.0.5 |
| | | ignore: 7.0.6 |
| | | is-path-inside: 4.0.0 |
| | | slash: 5.1.0 |
| | | unicorn-magic: 0.4.0 |
| | |
| | | defu: 6.1.7 |
| | | destr: 2.0.5 |
| | | iron-webcrypto: 1.2.1 |
| | | node-mock-http: 1.0.4 |
| | | node-mock-http: 1.0.5 |
| | | radix3: 1.1.2 |
| | | ufo: 1.6.4 |
| | | uncrypto: 0.1.3 |
| | |
| | | |
| | | highlight.js@11.11.1: {} |
| | | |
| | | highlight.js@11.12.0: {} |
| | | |
| | | hookable@5.5.3: {} |
| | | |
| | | hookable@6.1.1: {} |
| | |
| | | html-tags@3.3.1: {} |
| | | |
| | | html-tags@5.1.0: {} |
| | | |
| | | html-to-image@1.11.13: {} |
| | | |
| | | html2canvas@1.4.1: |
| | | dependencies: |
| | | css-line-break: 2.1.0 |
| | | text-segmentation: 1.0.3 |
| | | optional: true |
| | | |
| | | htmlparser2@10.1.0: |
| | | dependencies: |
| | |
| | | |
| | | ignore@5.3.2: {} |
| | | |
| | | ignore@7.0.5: {} |
| | | |
| | | ignore@7.0.6: |
| | | optional: true |
| | | ignore@7.0.6: {} |
| | | |
| | | immutable@5.1.7: {} |
| | | |
| | |
| | | side-channel: 1.1.1 |
| | | |
| | | internmap@2.0.3: {} |
| | | |
| | | iobuffer@5.4.0: {} |
| | | |
| | | ioredis@5.11.1: |
| | | dependencies: |
| | |
| | | |
| | | is-plain-object@3.0.1: {} |
| | | |
| | | is-plain-object@5.0.0: {} |
| | | is-plain-object@5.1.0: {} |
| | | |
| | | is-reference@1.2.1: |
| | | dependencies: |
| | |
| | | |
| | | js-tokens@9.0.1: {} |
| | | |
| | | js-yaml@3.6.1: |
| | | js-yaml@3.15.2: |
| | | dependencies: |
| | | argparse: 1.0.10 |
| | | esprima: 2.7.3 |
| | | esprima: 4.0.1 |
| | | |
| | | js-yaml@4.2.0: |
| | | dependencies: |
| | |
| | | jsonparse@1.3.1: {} |
| | | |
| | | jsonpointer@5.0.1: {} |
| | | |
| | | jspdf@4.2.1: |
| | | dependencies: |
| | | '@babel/runtime': 7.29.7 |
| | | fast-png: 6.2.0 |
| | | fflate: 0.8.3 |
| | | optionalDependencies: |
| | | canvg: 3.0.11 |
| | | core-js: 3.49.0 |
| | | dompurify: 3.4.11 |
| | | html2canvas: 1.4.1 |
| | | |
| | | katex@0.16.47: |
| | | dependencies: |
| | |
| | | log-symbols@7.0.1: |
| | | dependencies: |
| | | is-unicode-supported: 2.1.0 |
| | | yoctocolors: 2.1.2 |
| | | yoctocolors: 2.2.0 |
| | | |
| | | loglevel@1.9.2: {} |
| | | |
| | |
| | | argparse: 2.0.1 |
| | | entities: 4.4.0 |
| | | linkify-it: 5.0.1 |
| | | mdurl: 2.0.0 |
| | | mdurl: 2.1.0 |
| | | punycode.js: 2.3.1 |
| | | uc.micro: 2.1.0 |
| | | |
| | |
| | | dependencies: |
| | | '@babel/runtime': 7.29.7 |
| | | '@vscode/markdown-it-katex': 1.1.2 |
| | | highlight.js: 11.11.1 |
| | | highlight.js: 11.12.0 |
| | | katex: 0.16.47 |
| | | markdown-it: 14.2.0 |
| | | markdown-it-ins: 4.0.0 |
| | |
| | | |
| | | mdn-data@2.28.1: {} |
| | | |
| | | mdurl@2.0.0: {} |
| | | mdurl@2.1.0: {} |
| | | |
| | | meow@12.0.1: |
| | | dependencies: |
| | |
| | | db0: 0.3.4 |
| | | defu: 6.1.7 |
| | | destr: 2.0.5 |
| | | dot-prop: 10.1.0 |
| | | dot-prop: 10.2.0 |
| | | esbuild: 0.28.1 |
| | | escape-string-regexp: 5.0.0 |
| | | etag: 1.8.1 |
| | |
| | | mime: 4.1.0 |
| | | mlly: 1.8.2 |
| | | node-fetch-native: 1.6.7 |
| | | node-mock-http: 1.0.4 |
| | | node-mock-http: 1.0.5 |
| | | ofetch: 1.5.1 |
| | | ohash: 2.0.11 |
| | | ohash: 2.0.12 |
| | | pathe: 2.0.3 |
| | | perfect-debounce: 2.1.0 |
| | | pkg-types: 2.3.1 |
| | | pretty-bytes: 7.1.0 |
| | | pretty-bytes: 7.1.2 |
| | | radix3: 1.1.2 |
| | | rollup: 4.62.2 |
| | | rollup-plugin-visualizer: 7.0.1(rolldown@1.1.2)(rollup@4.62.2) |
| | |
| | | source-map: 0.7.6 |
| | | std-env: 4.1.0 |
| | | ufo: 1.6.4 |
| | | ultrahtml: 1.6.0 |
| | | ultrahtml: 1.7.0 |
| | | uncrypto: 0.1.3 |
| | | unctx: 2.5.0 |
| | | unenv: 2.0.0-rc.24 |
| | | unimport: 6.3.0(rolldown@1.1.2) |
| | | unplugin-utils: 0.3.1 |
| | | unplugin-utils: 0.3.2 |
| | | unstorage: 1.17.5(db0@0.3.4)(ioredis@5.11.1) |
| | | untyped: 2.0.0 |
| | | unwasm: 0.5.3 |
| | |
| | | |
| | | node-gyp-build@4.8.4: {} |
| | | |
| | | node-mock-http@1.0.4: {} |
| | | node-mock-http@1.0.5: {} |
| | | |
| | | node-releases@2.0.48: {} |
| | | |
| | |
| | | node-fetch-native: 1.6.7 |
| | | ufo: 1.6.4 |
| | | |
| | | ohash@2.0.11: {} |
| | | ohash@2.0.12: {} |
| | | |
| | | on-finished@2.4.1: |
| | | dependencies: |
| | |
| | | dependencies: |
| | | mimic-function: 5.0.1 |
| | | |
| | | open@11.0.0: |
| | | open@11.0.2: |
| | | dependencies: |
| | | default-browser: 5.5.0 |
| | | default-browser: 5.5.1 |
| | | define-lazy-prop: 3.0.0 |
| | | is-in-ssh: 1.0.0 |
| | | is-inside-container: 1.0.0 |
| | | powershell-utils: 0.1.0 |
| | | wsl-utils: 0.3.1 |
| | | powershell-utils: 0.2.1 |
| | | wsl-utils: 1.0.0 |
| | | |
| | | optionator@0.9.4: |
| | | dependencies: |
| | |
| | | |
| | | package-json-from-dist@1.0.1: {} |
| | | |
| | | package-manager-detector@1.6.0: {} |
| | | package-manager-detector@1.8.0: {} |
| | | |
| | | pako@2.2.0: {} |
| | | |
| | |
| | | perfect-debounce@1.0.0: {} |
| | | |
| | | perfect-debounce@2.1.0: {} |
| | | |
| | | performance-now@2.1.0: |
| | | optional: true |
| | | |
| | | picocolors@1.1.1: {} |
| | | |
| | |
| | | |
| | | powershell-utils@0.1.0: {} |
| | | |
| | | powershell-utils@0.2.1: {} |
| | | |
| | | preact@10.29.2: {} |
| | | |
| | | prelude-ls@1.2.1: {} |
| | |
| | | |
| | | pretty-bytes@6.1.1: {} |
| | | |
| | | pretty-bytes@7.1.0: {} |
| | | pretty-bytes@7.1.2: {} |
| | | |
| | | pretty-ms@9.3.0: |
| | | pretty-ms@9.3.1: |
| | | dependencies: |
| | | parse-ms: 4.0.0 |
| | | |
| | |
| | | dependencies: |
| | | prosemirror-transform: 1.12.0 |
| | | |
| | | prosemirror-commands@1.7.1: |
| | | prosemirror-commands@1.7.2: |
| | | dependencies: |
| | | prosemirror-model: 1.25.9 |
| | | prosemirror-state: 1.4.4 |
| | | prosemirror-transform: 1.12.0 |
| | | |
| | | prosemirror-dropcursor@1.8.2: |
| | | prosemirror-dropcursor@1.8.3: |
| | | dependencies: |
| | | prosemirror-state: 1.4.4 |
| | | prosemirror-transform: 1.12.0 |
| | |
| | | |
| | | radix3@1.1.2: {} |
| | | |
| | | raf@3.4.1: |
| | | dependencies: |
| | | performance-now: 2.1.0 |
| | | optional: true |
| | | |
| | | randomcolor@0.6.2: {} |
| | | |
| | | range-parser@1.2.1: {} |
| | | range-parser@1.3.0: {} |
| | | |
| | | rc9@3.0.1: |
| | | dependencies: |
| | |
| | | read-yaml-file@1.1.0: |
| | | dependencies: |
| | | graceful-fs: 4.2.11 |
| | | js-yaml: 3.6.1 |
| | | js-yaml: 3.15.2 |
| | | pify: 4.0.1 |
| | | strip-bom: 3.0.0 |
| | | |
| | |
| | | |
| | | regenerate@1.4.2: {} |
| | | |
| | | regenerator-runtime@0.13.11: |
| | | optional: true |
| | | |
| | | regexp.prototype.flags@1.5.4: |
| | | dependencies: |
| | | call-bind: 1.0.9 |
| | |
| | | '@vueuse/shared': 14.3.0(vue@3.5.38(typescript@6.0.3)) |
| | | aria-hidden: 1.2.6 |
| | | defu: 6.1.7 |
| | | ohash: 2.0.11 |
| | | ohash: 2.0.12 |
| | | vue: 3.5.38(typescript@6.0.3) |
| | | transitivePeerDependencies: |
| | | - '@vue/composition-api' |
| | |
| | | reusify@1.1.0: {} |
| | | |
| | | rfdc@1.4.1: {} |
| | | |
| | | rgbcolor@1.0.1: |
| | | optional: true |
| | | |
| | | rimraf@5.0.5: |
| | | dependencies: |
| | |
| | | |
| | | rollup-plugin-visualizer@7.0.1(rolldown@1.1.2)(rollup@4.62.2): |
| | | dependencies: |
| | | open: 11.0.0 |
| | | open: 11.0.2 |
| | | picomatch: 4.0.4 |
| | | source-map: 0.7.6 |
| | | yargs: 18.0.0 |
| | | yargs: 18.1.0 |
| | | optionalDependencies: |
| | | rolldown: 1.1.2 |
| | | rollup: 4.62.2 |
| | |
| | | mime-types: 3.0.2 |
| | | ms: 2.1.3 |
| | | on-finished: 2.4.1 |
| | | range-parser: 1.2.1 |
| | | range-parser: 1.3.0 |
| | | statuses: 2.0.2 |
| | | transitivePeerDependencies: |
| | | - supports-color |
| | |
| | | |
| | | sprintf-js@1.0.3: {} |
| | | |
| | | stackblur-canvas@2.0.0: |
| | | optional: true |
| | | |
| | | standard-as-callback@2.1.0: {} |
| | | |
| | | statuses@2.0.2: {} |
| | |
| | | get-east-asian-width: 1.6.0 |
| | | strip-ansi: 7.2.0 |
| | | |
| | | string.prototype.matchall@4.0.12: |
| | | string.prototype.matchall@4.1.0: |
| | | dependencies: |
| | | call-bind: 1.0.9 |
| | | call-bound: 1.0.4 |
| | |
| | | |
| | | strip-ansi@7.2.0: |
| | | dependencies: |
| | | ansi-regex: 6.2.2 |
| | | ansi-regex: 6.3.0 |
| | | |
| | | strip-bom@3.0.0: {} |
| | | |
| | |
| | | hey-listen: 1.0.8 |
| | | tslib: 2.4.0 |
| | | |
| | | stylelint-config-html@1.1.0(postcss-html@1.8.1)(stylelint@17.13.0(typescript@6.0.3)): |
| | | stylelint-config-html@2.0.0(postcss-html@1.8.1)(stylelint@17.13.0(typescript@6.0.3)): |
| | | dependencies: |
| | | postcss-html: 1.8.1 |
| | | stylelint: 17.13.0(typescript@6.0.3) |
| | |
| | | postcss-html: 1.8.1 |
| | | semver: 7.8.5 |
| | | stylelint: 17.13.0(typescript@6.0.3) |
| | | stylelint-config-html: 1.1.0(postcss-html@1.8.1)(stylelint@17.13.0(typescript@6.0.3)) |
| | | stylelint-config-html: 2.0.0(postcss-html@1.8.1)(stylelint@17.13.0(typescript@6.0.3)) |
| | | stylelint-config-recommended: 18.0.0(stylelint@17.13.0(typescript@6.0.3)) |
| | | |
| | | stylelint-config-recommended@18.0.0(stylelint@17.13.0(typescript@6.0.3)): |
| | |
| | | '@csstools/css-syntax-patches-for-csstree': 1.1.5(css-tree@3.2.1) |
| | | '@csstools/css-tokenizer': 4.0.0 |
| | | css-tree: 3.2.1 |
| | | is-plain-object: 5.0.0 |
| | | is-plain-object: 5.1.0 |
| | | known-css-properties: 0.37.0 |
| | | postcss-media-query-parser: 0.2.3 |
| | | postcss-resolve-nested-selector: 0.1.6 |
| | |
| | | '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) |
| | | '@csstools/selector-resolve-nested': 4.0.0(postcss-selector-parser@7.1.4) |
| | | '@csstools/selector-specificity': 6.0.0(postcss-selector-parser@7.1.4) |
| | | colord: 2.9.3 |
| | | colord: 2.10.0 |
| | | cosmiconfig: 9.0.2(typescript@6.0.3) |
| | | css-functions-list: 3.3.3 |
| | | css-tree: 3.2.1 |
| | |
| | | globby: 16.2.0 |
| | | globjoin: 0.1.4 |
| | | html-tags: 5.1.0 |
| | | ignore: 7.0.5 |
| | | ignore: 7.0.6 |
| | | import-meta-resolve: 4.2.0 |
| | | mathml-tag-names: 4.0.0 |
| | | meow: 14.1.0 |
| | |
| | | svelte@5.56.3(@typescript-eslint/types@8.62.0): |
| | | dependencies: |
| | | '@jridgewell/remapping': 2.3.5 |
| | | '@jridgewell/sourcemap-codec': 1.5.0 |
| | | '@jridgewell/sourcemap-codec': 1.6.0 |
| | | '@sveltejs/acorn-typescript': 1.0.10(acorn@8.17.0) |
| | | '@types/estree': 1.0.9 |
| | | '@types/trusted-types': 2.0.7 |
| | |
| | | - '@typescript-eslint/types' |
| | | |
| | | sver@2.0.1: {} |
| | | |
| | | svg-pathdata@6.0.3: |
| | | optional: true |
| | | |
| | | svg-tags@1.0.0: {} |
| | | |
| | |
| | | - react-native-b4a |
| | | |
| | | text-extensions@2.4.0: {} |
| | | |
| | | text-segmentation@1.0.3: |
| | | dependencies: |
| | | utrie: 1.0.2 |
| | | optional: true |
| | | |
| | | theme-colors@0.1.0: {} |
| | | |
| | |
| | | |
| | | ufo@1.6.4: {} |
| | | |
| | | ultrahtml@1.6.0: {} |
| | | ultrahtml@1.7.0: {} |
| | | |
| | | unbox-primitive@1.1.0: |
| | | dependencies: |
| | |
| | | strip-literal: 3.1.0 |
| | | tinyglobby: 0.2.17 |
| | | unplugin: 3.0.0 |
| | | unplugin-utils: 0.3.1 |
| | | unplugin-utils: 0.3.2 |
| | | optionalDependencies: |
| | | rolldown: 1.1.2 |
| | | |
| | |
| | | - supports-color |
| | | |
| | | unplugin-utils@0.3.1: |
| | | dependencies: |
| | | pathe: 2.0.3 |
| | | picomatch: 4.0.4 |
| | | |
| | | unplugin-utils@0.3.2: |
| | | dependencies: |
| | | pathe: 2.0.3 |
| | | picomatch: 4.0.4 |
| | |
| | | |
| | | util-deprecate@1.0.2: {} |
| | | |
| | | utrie@1.0.2: |
| | | dependencies: |
| | | base64-arraybuffer: 1.0.2 |
| | | optional: true |
| | | |
| | | valibot@1.4.1(typescript@6.0.3): |
| | | optionalDependencies: |
| | | typescript: 6.0.3 |
| | |
| | | |
| | | vee-validate@4.15.1(vue@3.5.38(typescript@6.0.3)): |
| | | dependencies: |
| | | '@vue/devtools-api': 7.5.2 |
| | | '@vue/devtools-api': 7.7.10 |
| | | type-fest: 4.8.3 |
| | | vue: 3.5.38(typescript@6.0.3) |
| | | |
| | |
| | | ansis: 4.3.1 |
| | | error-stack-parser-es: 1.0.5 |
| | | obug: 2.1.3 |
| | | ohash: 2.0.11 |
| | | open: 11.0.0 |
| | | ohash: 2.0.12 |
| | | open: 11.0.2 |
| | | perfect-debounce: 2.1.0 |
| | | sirv: 3.0.2 |
| | | unplugin-utils: 0.3.1 |
| | | unplugin-utils: 0.3.2 |
| | | vite: 8.0.10(@types/node@25.9.4)(esbuild@0.28.1)(jiti@2.7.0)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) |
| | | vite-dev-rpc: 2.0.0(vite@8.0.10(@types/node@25.9.4)(esbuild@0.28.1)(jiti@2.7.0)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) |
| | | |
| | |
| | | dependencies: |
| | | signal-exit: 4.1.0 |
| | | |
| | | wsl-utils@0.3.1: |
| | | wsl-utils@1.0.0: |
| | | dependencies: |
| | | is-wsl: 3.1.1 |
| | | powershell-utils: 0.1.0 |
| | |
| | | y18n: 5.0.8 |
| | | yargs-parser: 21.1.1 |
| | | |
| | | yargs@18.0.0: |
| | | yargs@18.1.0: |
| | | dependencies: |
| | | cliui: 9.0.1 |
| | | escalade: 3.2.0 |
| | | get-caller-file: 2.0.5 |
| | | string-width: 7.2.0 |
| | | string-width: 8.2.1 |
| | | y18n: 5.0.8 |
| | | yargs-parser: 22.0.0 |
| | | |
| | | yocto-queue@1.2.2: {} |
| | | |
| | | yoctocolors@2.1.2: {} |
| | | yoctocolors@2.2.0: {} |
| | | |
| | | youch-core@0.3.3: |
| | | dependencies: |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | | export namespace ManagementCockpitApi { |
| | | /** éç¨åç§°-æ°éåå¸é¡¹ */ |
| | | export interface NameCountItem { |
| | | name: string; // åç§°ï¼ä»åº/åç§/ç¶æ/ç»éå/ç份/æ¸ éçï¼ |
| | | count: number; // æ°é |
| | | } |
| | | |
| | | /** ææ¥æ°éè¶å¿é¡¹ */ |
| | | export interface DailyCountItem { |
| | | date: string; // æ¥æ yyyy-MM-dd |
| | | count: number; // æ°é |
| | | } |
| | | |
| | | /** è´¨æ£ææ åå¼é¡¹ */ |
| | | export interface IndicatorAvgItem { |
| | | indicatorCode: string; // ææ ç¼ç |
| | | indicatorName: string; // ææ åç§°ï¼çº¯åº¦/å度/åè½ç/æ°´åï¼ |
| | | checkCount: number; // æ£éªæ¬¡æ° |
| | | averageValue: number; // ææ å¹³åå¼ |
| | | passRate: number; // ææ åæ ¼çï¼%ï¼ |
| | | } |
| | | |
| | | /** äºç»´åº¦æ±æ»ç»è®¡ */ |
| | | export interface Summary { |
| | | // ç产 |
| | | batchTotal: number; // æ¹æ¬¡æ»æ° |
| | | batchDraft: number; // èç¨¿æ¹æ¬¡ |
| | | batchProducing: number; // çäº§ä¸æ¹æ¬¡ |
| | | batchFinished: number; // å·²å®ææ¹æ¬¡ |
| | | batchCanceled: number; // å·²ä½åºæ¹æ¬¡ |
| | | bagCodeTotal: number; // è¢ç æ»æ° |
| | | bagCodeGenerated: number; // å·²çæè¢ç |
| | | bagCodePrinted: number; // 已导åºå°å·è¢ç |
| | | bagCodeCanceled: number; // å·²ä½åºè¢ç |
| | | palletTotal: number; // æçç æ»æ° |
| | | todayInboundBagCount: number; // 仿¥æ«ç å
¥åºè¢æ° |
| | | // è´¨æ£ |
| | | qualityTotal: number; // æ£éªè®°å½æ»æ° |
| | | qualityPending: number; // å¤çä¸ |
| | | qualityPass: number; // åæ ¼ |
| | | qualityFail: number; // ä¸åæ ¼ |
| | | qualityPassRate: number; // æ£éªåæ ¼çï¼%ï¼ |
| | | // åºå |
| | | stockTotal: number; // å½ååºåæ»é |
| | | stockTemporary: number; // æååºåé |
| | | stockQualified: number; // åæ ¼åºåé |
| | | stockOutbound: number; // å·²åºåºæ°é |
| | | lowStockCount: number; // ä½åºåé¢è¦æ° |
| | | // åºåº |
| | | outboundOrderTotal: number; // åºåºåæ»æ° |
| | | outboundQuantityTotal: number; // åºåºæ»é |
| | | todayOutboundQuantity: number; // 仿¥åºåºé |
| | | // 追溯 |
| | | scanTotal: number; // æ«ç æ»æ° |
| | | todayScanCount: number; // 仿¥æ«ç æ° |
| | | scanSuccessCount: number; // æ«ç æåæ° |
| | | crossRegionWarningTotal: number; // çªè´§é¢è¦æ»æ° |
| | | crossRegionPendingCount: number; // å¾
å¤ççªè´§é¢è¦æ° |
| | | } |
| | | |
| | | /** ç产è¶å¿é¡¹ */ |
| | | export interface ProductionTrendItem { |
| | | date: string; |
| | | batchCount: number; // æ°å¢æ¹æ¬¡ |
| | | bagCodeCount: number; // æ°å¢è¢ç |
| | | palletCount: number; // æ°å¢æç |
| | | inboundBagQuantity: number; // æ«ç å
¥åºè¢æ° |
| | | } |
| | | |
| | | /** è´¨æ£ç»´åº¦ç»è®¡ */ |
| | | export interface QualityStatistics { |
| | | resultDistribution: NameCountItem[]; // æ£éªç»æåå¸ |
| | | indicatorList: IndicatorAvgItem[]; // åé¡¹ææ åå¼ |
| | | } |
| | | |
| | | /** åºå维度ç»è®¡ */ |
| | | export interface InventoryStatistics { |
| | | warehouseDistribution: NameCountItem[]; // æä»åº |
| | | itemDistribution: NameCountItem[]; // æåç§ |
| | | stateDistribution: NameCountItem[]; // æç¶æ |
| | | } |
| | | |
| | | /** åºåºç»´åº¦ç»è®¡ */ |
| | | export interface OutboundStatistics { |
| | | trend: DailyCountItem[]; // ææ¥åºåºè¶å¿ |
| | | dealerDistribution: NameCountItem[]; // æç»éå |
| | | } |
| | | |
| | | /** çªè´§é¢è¦æ±æ» */ |
| | | export interface CrossRegionSummary { |
| | | total: number; |
| | | pending: number; |
| | | handled: number; |
| | | falseAlarm: number; |
| | | crossProvince: number; |
| | | crossCity: number; |
| | | } |
| | | |
| | | /** 追溯维度ç»è®¡ */ |
| | | export interface TraceStatistics { |
| | | scanTrend: DailyCountItem[]; // æ«ç ææ¥è¶å¿ |
| | | provinceDistribution: NameCountItem[]; // ç份åå¸ |
| | | channelDistribution: NameCountItem[]; // æ¸ éåå¸ |
| | | crossRegionSummary: CrossRegionSummary; // çªè´§é¢è¦æ±æ» |
| | | } |
| | | } |
| | | |
| | | /** è·å¾ç®¡ç驾驶è±äºç»´åº¦æ±æ»ç»è®¡ */ |
| | | export function getManagementCockpitSummary() { |
| | | return requestClient.get<ManagementCockpitApi.Summary>( |
| | | '/mes/dashboard/summary', |
| | | ); |
| | | } |
| | | |
| | | /** è·å¾ç产è¶å¿ */ |
| | | export function getManagementCockpitProductionTrend(days?: number) { |
| | | return requestClient.get<ManagementCockpitApi.ProductionTrendItem[]>( |
| | | '/mes/dashboard/production-trend', |
| | | { params: { days } }, |
| | | ); |
| | | } |
| | | |
| | | /** è·å¾è´¨æ£ç»´åº¦ç»è®¡ */ |
| | | export function getManagementCockpitQuality() { |
| | | return requestClient.get<ManagementCockpitApi.QualityStatistics>( |
| | | '/mes/dashboard/quality-statistics', |
| | | ); |
| | | } |
| | | |
| | | /** è·å¾åºå维度ç»è®¡ */ |
| | | export function getManagementCockpitInventory() { |
| | | return requestClient.get<ManagementCockpitApi.InventoryStatistics>( |
| | | '/mes/dashboard/inventory-statistics', |
| | | ); |
| | | } |
| | | |
| | | /** è·å¾åºåºç»´åº¦ç»è®¡ */ |
| | | export function getManagementCockpitOutbound(days?: number) { |
| | | return requestClient.get<ManagementCockpitApi.OutboundStatistics>( |
| | | '/mes/dashboard/outbound-statistics', |
| | | { params: { days } }, |
| | | ); |
| | | } |
| | | |
| | | /** è·å¾è¿½æº¯ç»´åº¦ç»è®¡ */ |
| | | export function getManagementCockpitTrace(days?: number) { |
| | | return requestClient.get<ManagementCockpitApi.TraceStatistics>( |
| | | '/mes/dashboard/trace-statistics', |
| | | { params: { days } }, |
| | | ); |
| | | } |
| | | |
| | | /** 导åºç®¡çé©¾é©¶è± Excel æ¥è¡¨ï¼è¿å Blobï¼ */ |
| | | export function exportManagementCockpitExcel() { |
| | | return requestClient.download('/mes/dashboard/export-excel'); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | | export namespace MesTraceConsumerScanApi { |
| | | /** æ¶è´¹è
æ«ç è®¿é®æ±æ» */ |
| | | export interface Summary { |
| | | total: number; // æ»è®¿é®æ¬¡æ° |
| | | success: number; // æåæ¬¡æ° |
| | | failed: number; // å¤±è´¥æ¬¡æ° |
| | | uniqueBatchCount: number; // éç©ºæ¹æ¬¡å»éæ°é |
| | | } |
| | | |
| | | /** æ¶è´¹è
æ«ç 访é®è¶å¿ */ |
| | | export interface Trend { |
| | | date: string; // æ¥æ yyyy-MM-dd |
| | | total: number; // 彿¥æ»è®¿é®æ¬¡æ° |
| | | success: number; // 彿¥æåæ¬¡æ° |
| | | failed: number; // 彿¥å¤±è´¥æ¬¡æ° |
| | | } |
| | | |
| | | /** æ¶è´¹è
æ«ç 访é®åå¸ */ |
| | | export interface Distribution { |
| | | name: string; // åç»åç§° |
| | | count: number; // è®¿é®æ¬¡æ° |
| | | } |
| | | } |
| | | |
| | | /** è·å¾æ¶è´¹è
æ«ç è®¿é®æ±æ» */ |
| | | export function getTraceConsumerScanSummary( |
| | | startTime?: string, |
| | | endTime?: string, |
| | | ) { |
| | | return requestClient.get<MesTraceConsumerScanApi.Summary>( |
| | | '/mes/trace-consumer-scan/summary', |
| | | { params: { startTime, endTime } }, |
| | | ); |
| | | } |
| | | |
| | | /** è·å¾æ¶è´¹è
æ«ç 访é®è¶å¿ */ |
| | | export function getTraceConsumerScanTrend( |
| | | startTime?: string, |
| | | endTime?: string, |
| | | ) { |
| | | return requestClient.get<MesTraceConsumerScanApi.Trend[]>( |
| | | '/mes/trace-consumer-scan/trend', |
| | | { params: { startTime, endTime } }, |
| | | ); |
| | | } |
| | | |
| | | /** è·å¾æ¶è´¹è
æ«ç 访é®åå¸ */ |
| | | export function getTraceConsumerScanDistribution( |
| | | groupBy: string, |
| | | startTime?: string, |
| | | endTime?: string, |
| | | ) { |
| | | return requestClient.get<MesTraceConsumerScanApi.Distribution[]>( |
| | | '/mes/trace-consumer-scan/distribution', |
| | | { params: { groupBy, startTime, endTime } }, |
| | | ); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | | export namespace MesTraceConfigApi { |
| | | /** æº¯æº H5 页é¢åºç¡å°åï¼äºç»´ç å
容åç¼ï¼ */ |
| | | export interface QrConfig { |
| | | traceBaseUrl?: string; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·å¾æº¯æº H5 页é¢åºç¡å°åï¼äºç»´ç å
容åç¼ï¼ |
| | | * ç¨äº"æ¥çäºç»´ç "é¢è§/ä¸è½½æ¶çæä¸æå°æ ç¾ä¸è´ç H5 URL äºç»´ç |
| | | */ |
| | | export function getQrConfig() { |
| | | return requestClient.get<MesTraceConfigApi.QrConfig>( |
| | | '/mes/trace-config/qr-config', |
| | | ); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import type { PageParam, PageResult } from '@vben/request'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | | export namespace MesTraceCrossRegionApi { |
| | | /** çªè´§é¢è¦ */ |
| | | export interface Warning { |
| | | id?: number; // ç¼å· |
| | | warningNo?: string; // é¢è¦ç¼å· |
| | | bagCodeId?: number; // è¢ç ç¼å· |
| | | bagCode?: string; // è¢ç |
| | | palletCodeId?: number; // æçç ç¼å· |
| | | palletCode?: string; // æçç |
| | | batchId?: number; // çäº§æ¹æ¬¡ç¼å· |
| | | batchCode?: string; // æ¹æ¬¡å· |
| | | itemId?: number; // ç©æç¼å· |
| | | itemCode?: string; // ç©æç¼ç |
| | | itemName?: string; // ç©æåç§° |
| | | salesId?: number; // éå®åºåºåç¼å· |
| | | salesCode?: string; // åºåºåå· |
| | | clientId?: number; // ç»éåç¼å· |
| | | clientName?: string; // ç»éååç§° |
| | | dealerProvince?: string; // ç»éåç份 |
| | | dealerCity?: string; // ç»éååå¸ |
| | | scanProvince?: string; // æ«ç ç份 |
| | | scanCity?: string; // æ«ç åå¸ |
| | | warningType?: string; // é¢è¦ç±»åï¼CROSS_PROVINCE / CROSS_CITY |
| | | warningTypeName?: string; // é¢è¦ç±»ååç§° |
| | | scanEventId?: number; // å
³èæ¶è´¹è
æ«ç äºä»¶ç¼å· |
| | | status?: number; // ç¶æï¼10 å¾
å¤ç / 20 å·²å¤ç / 30 è¯¯æ¥ |
| | | statusName?: string; // ç¶æåç§° |
| | | handleUserId?: number; // å¤ç人ç¼å· |
| | | handleUserName?: string; // å¤ç人å§å |
| | | handleTime?: string; // å¤çæ¶é´ |
| | | handleRemark?: string; // å¤ç夿³¨ |
| | | eventTime?: string; // é¢è¦äº§çæ¶é´ |
| | | } |
| | | |
| | | /** çªè´§é¢è¦å页æ¥è¯¢åæ° */ |
| | | export interface PageParams extends PageParam { |
| | | status?: number; |
| | | warningType?: string; |
| | | batchCode?: string; |
| | | bagCode?: string; |
| | | clientName?: string; |
| | | eventTime?: string[]; |
| | | } |
| | | |
| | | /** çªè´§é¢è¦æ±æ» */ |
| | | export interface Summary { |
| | | [key: string]: number | undefined; // æ±æ»ææ ï¼æåæ®µååå¼ï¼ |
| | | total?: number; // é¢è¦æ»æ° |
| | | pending?: number; // å¾
å¤çæ°é |
| | | handled?: number; // å·²å¤çæ°é |
| | | falseAlarm?: number; // è¯¯æ¥æ°é |
| | | crossProvince?: number; // è·¨ççªè´§æ°é |
| | | crossCity?: number; // è·¨å¸çªè´§æ°é |
| | | } |
| | | |
| | | /** çªè´§é¢è¦åå¸ç»è®¡é¡¹ */ |
| | | export interface StatisticsItem { |
| | | name?: string; // åç»åç§° |
| | | count?: number; // é¢è¦æ°é |
| | | } |
| | | |
| | | /** é²çªè´§è§åé
ç½® */ |
| | | export interface AntiConfig { |
| | | warningLevel?: string; // å¤å®ç²åº¦ï¼PROVINCE è·¨ç / CITY è·¨å¸ |
| | | remark?: string; // é
置说æ |
| | | } |
| | | } |
| | | |
| | | /** è·å¾çªè´§é¢è¦å页 */ |
| | | export function getTraceCrossRegionPage( |
| | | params: MesTraceCrossRegionApi.PageParams, |
| | | ) { |
| | | return requestClient.get<PageResult<MesTraceCrossRegionApi.Warning>>( |
| | | '/mes/trace-cross-region/page', |
| | | { params }, |
| | | ); |
| | | } |
| | | |
| | | /** å¤ççªè´§é¢è¦ */ |
| | | export function handleTraceCrossRegion(data: { |
| | | id: number; |
| | | status: number; |
| | | handleRemark?: string; |
| | | }) { |
| | | return requestClient.put('/mes/trace-cross-region/handle', data); |
| | | } |
| | | |
| | | /** è·å¾çªè´§é¢è¦æ±æ» */ |
| | | export function getTraceCrossRegionSummary(startTime?: string, endTime?: string) { |
| | | return requestClient.get<MesTraceCrossRegionApi.Summary>( |
| | | '/mes/trace-cross-region/summary', |
| | | { params: { startTime, endTime } }, |
| | | ); |
| | | } |
| | | |
| | | /** è·å¾çªè´§é¢è¦åå¸ç»è®¡ */ |
| | | export function getTraceCrossRegionStatistics( |
| | | groupBy: string, |
| | | startTime?: string, |
| | | endTime?: string, |
| | | ) { |
| | | return requestClient.get<MesTraceCrossRegionApi.StatisticsItem[]>( |
| | | '/mes/trace-cross-region/statistics', |
| | | { params: { groupBy, startTime, endTime } }, |
| | | ); |
| | | } |
| | | |
| | | /** è·å¾é²çªè´§è§åé
ç½® */ |
| | | export function getTraceCrossRegionConfig() { |
| | | return requestClient.get<MesTraceCrossRegionApi.AntiConfig>( |
| | | '/mes/trace-cross-region/config', |
| | | ); |
| | | } |
| | | |
| | | /** æ´æ°é²çªè´§è§åé
ç½® */ |
| | | export function updateTraceCrossRegionConfig(warningLevel: string) { |
| | | return requestClient.put( |
| | | `/mes/trace-cross-region/config?warningLevel=${warningLevel}`, |
| | | ); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import type { PageParam, PageResult } from '@vben/request'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | | export namespace MesTraceIntegrityApi { |
| | | /** æ°æ®å®æ´æ§æ ¡éªç»æ */ |
| | | export interface VerifyResult { |
| | | bizType?: string; // ä¸å¡ç±»åï¼BATCH / SALES / SCAN |
| | | bizId?: number; // ä¸å¡è®°å½ç¼å· |
| | | bizCode?: string; // ä¸å¡ç¼ç |
| | | matched?: boolean; // æ¯å¦æ ¡éªéè¿ |
| | | storedHash?: string; // åå¨çæè¦ SHA-256 |
| | | currentHash?: string; // å½åæ°æ®éç®æè¦ SHA-256 |
| | | bagSetHash?: string; // æ¹æ¬¡å½åè¢ç éåæè¦ï¼ä»
BATCH æ ¡éªè¿åï¼ |
| | | message?: string; // æ ¡éªè¯´æ |
| | | } |
| | | |
| | | /** æ°æ®å®æ´æ§è®°å½ */ |
| | | export interface Record { |
| | | id?: number; // ç¼å· |
| | | bizType?: string; // ä¸å¡ç±»å |
| | | bizId?: number; // ä¸å¡è®°å½ç¼å· |
| | | bizCode?: string; // ä¸å¡ç¼ç |
| | | contentHash?: string; // å
容æè¦ SHA-256 |
| | | eventTime?: string; // æè¦çææ¶é´ |
| | | } |
| | | |
| | | /** æ°æ®å®æ´æ§è®°å½å页æ¥è¯¢åæ° */ |
| | | export interface PageParams extends PageParam { |
| | | bizType?: string; |
| | | bizId?: number; |
| | | bizCode?: string; |
| | | } |
| | | } |
| | | |
| | | /** æ ¡éªæ°æ®å®æ´æ§ï¼éç®æè¦æ¯å¯¹ï¼ */ |
| | | export function verifyTraceIntegrity(bizType: string, bizId: number) { |
| | | return requestClient.get<MesTraceIntegrityApi.VerifyResult>( |
| | | '/mes/trace-integrity/verify', |
| | | { params: { bizType, bizId } }, |
| | | ); |
| | | } |
| | | |
| | | /** è·å¾æ°æ®å®æ´æ§è®°å½å页 */ |
| | | export function getTraceIntegrityPage( |
| | | params: MesTraceIntegrityApi.PageParams, |
| | | ) { |
| | | return requestClient.get<PageResult<MesTraceIntegrityApi.Record>>( |
| | | '/mes/trace-integrity/page', |
| | | { params }, |
| | | ); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import type { EChartsOption } from '@vben/plugins/echarts'; |
| | | |
| | | /** ç产è¶å¿å¾é
ç½®ï¼å¤ç³»åæ±ç¶/æçº¿ï¼ */ |
| | | export function getProductionTrendChartOptions( |
| | | dates: string[], |
| | | batchCounts: number[], |
| | | bagCodeCounts: number[], |
| | | palletCounts: number[], |
| | | inboundCounts: number[], |
| | | ): EChartsOption { |
| | | return { |
| | | color: ['#409EFF', '#36cfc9', '#f59e0b', '#67c23a'], |
| | | grid: { bottom: 40, left: 50, right: 30, top: 30 }, |
| | | legend: { bottom: 0, type: 'scroll' }, |
| | | series: [ |
| | | { barMaxWidth: 24, data: batchCounts, name: 'æ°å¢æ¹æ¬¡', type: 'bar' }, |
| | | { barMaxWidth: 24, data: bagCodeCounts, name: 'æ°å¢è¢ç ', type: 'bar' }, |
| | | { barMaxWidth: 24, data: palletCounts, name: 'æ°å¢æç', type: 'bar' }, |
| | | { data: inboundCounts, name: 'å
¥åºè¢æ°', smooth: true, type: 'line' }, |
| | | ], |
| | | tooltip: { trigger: 'axis' }, |
| | | xAxis: { axisTick: { show: false }, data: dates, type: 'category' }, |
| | | yAxis: { minInterval: 1, type: 'value' }, |
| | | }; |
| | | } |
| | | |
| | | /** éç¨é¥¼å¾/ç¯å½¢å¾é
ç½® */ |
| | | export function getPieChartOptions( |
| | | data: Array<{ name: string; value: number }>, |
| | | ): EChartsOption { |
| | | return { |
| | | legend: { bottom: 0, type: 'scroll' }, |
| | | series: [ |
| | | { |
| | | avoidLabelOverlap: true, |
| | | data, |
| | | emphasis: { label: { fontSize: 14, fontWeight: 'bold', show: true } }, |
| | | itemStyle: { borderColor: '#fff', borderRadius: 6, borderWidth: 2 }, |
| | | label: { formatter: '{b}\n{c}', show: true }, |
| | | radius: ['40%', '70%'], |
| | | type: 'pie', |
| | | }, |
| | | ], |
| | | tooltip: { formatter: '{b}: {c} ({d}%)', trigger: 'item' }, |
| | | }; |
| | | } |
| | | |
| | | /** éç¨æ±ç¶å¾é
ç½® */ |
| | | export function getBarChartOptions( |
| | | categories: string[], |
| | | values: number[], |
| | | name: string, |
| | | color = '#409EFF', |
| | | ): EChartsOption { |
| | | return { |
| | | grid: { bottom: 50, left: 60, right: 20, top: 30 }, |
| | | series: [ |
| | | { |
| | | barMaxWidth: 36, |
| | | data: values, |
| | | itemStyle: { borderRadius: 4, color }, |
| | | name, |
| | | type: 'bar', |
| | | }, |
| | | ], |
| | | tooltip: { axisPointer: { type: 'shadow' }, trigger: 'axis' }, |
| | | xAxis: { |
| | | axisLabel: { interval: 0, rotate: categories.length > 6 ? 30 : 0 }, |
| | | axisTick: { show: false }, |
| | | data: categories, |
| | | type: 'category', |
| | | }, |
| | | yAxis: { minInterval: 1, type: 'value' }, |
| | | }; |
| | | } |
| | | |
| | | /** éç¨æçº¿å¾é
ç½® */ |
| | | export function getLineChartOptions( |
| | | dates: string[], |
| | | values: number[], |
| | | name: string, |
| | | color = '#36cfc9', |
| | | ): EChartsOption { |
| | | return { |
| | | grid: { bottom: 40, left: 60, right: 20, top: 30 }, |
| | | series: [ |
| | | { areaStyle: { opacity: 0.12 }, data: values, itemStyle: { color }, name, smooth: true, type: 'line' }, |
| | | ], |
| | | tooltip: { trigger: 'axis' }, |
| | | xAxis: { axisTick: { show: false }, data: dates, type: 'category' }, |
| | | yAxis: { minInterval: 1, type: 'value' }, |
| | | }; |
| | | } |
| | | |
| | | /** è´¨æ£ææ åå¼ + åæ ¼çåç³»åæ±ç¶å¾é
ç½® */ |
| | | export function getQualityIndicatorChartOptions( |
| | | labels: string[], |
| | | avgValues: number[], |
| | | passRates: number[], |
| | | ): EChartsOption { |
| | | return { |
| | | color: ['#409EFF', '#67c23a'], |
| | | grid: { bottom: 40, left: 60, right: 60, top: 30 }, |
| | | legend: { bottom: 0, data: ['å¹³åå¼', 'åæ ¼ç(%)'] }, |
| | | series: [ |
| | | { barMaxWidth: 30, data: avgValues, name: 'å¹³åå¼', type: 'bar' }, |
| | | { barMaxWidth: 30, data: passRates, name: 'åæ ¼ç(%)', type: 'bar' }, |
| | | ], |
| | | tooltip: { trigger: 'axis' }, |
| | | xAxis: { axisTick: { show: false }, data: labels, type: 'category' }, |
| | | yAxis: [{ minInterval: 1, type: 'value' }], |
| | | }; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { ManagementCockpitApi } from '#/api/mes/management-cockpit'; |
| | | |
| | | import { ref } from 'vue'; |
| | | |
| | | import { Page } from '@vben/common-ui'; |
| | | import { IconifyIcon } from '@vben/icons'; |
| | | import { downloadFileFromBlobPart } from '@vben/utils'; |
| | | |
| | | import { Button, message, Space } from 'ant-design-vue'; |
| | | // åéå vPrintï¼v å¼å¤´ï¼å¨ <script setup> ä¸ä¼è¢« Vue èªå¨æ³¨å为å±é¨æä»¤ v-print |
| | | // @ts-expect-error - vue3-print-nb æªæä¾ç±»å声æ |
| | | import vPrint from 'vue3-print-nb'; |
| | | |
| | | import { |
| | | exportManagementCockpitExcel, |
| | | getManagementCockpitSummary, |
| | | } from '#/api/mes/management-cockpit'; |
| | | |
| | | import KpiCards from './modules/kpi-cards.vue'; |
| | | import InventoryChart from './modules/inventory-chart.vue'; |
| | | import OutboundChart from './modules/outbound-chart.vue'; |
| | | import ProductionTrend from './modules/production-trend.vue'; |
| | | import QualityChart from './modules/quality-chart.vue'; |
| | | import TraceChart from './modules/trace-chart.vue'; |
| | | |
| | | defineOptions({ name: 'ManagementCockpit' }); |
| | | |
| | | // æå°é
ç½®ï¼æå°æ¥è¡¨å®¹å¨ï¼ |
| | | const printObj = ref({ |
| | | id: 'management-cockpit-report', |
| | | popTitle: ' ', |
| | | extraCss: '/print.css', |
| | | zIndex: 20_003, |
| | | }); |
| | | |
| | | const summary = ref<ManagementCockpitApi.Summary>({ |
| | | batchTotal: 0, |
| | | batchDraft: 0, |
| | | batchProducing: 0, |
| | | batchFinished: 0, |
| | | batchCanceled: 0, |
| | | bagCodeTotal: 0, |
| | | bagCodeGenerated: 0, |
| | | bagCodePrinted: 0, |
| | | bagCodeCanceled: 0, |
| | | palletTotal: 0, |
| | | todayInboundBagCount: 0, |
| | | qualityTotal: 0, |
| | | qualityPending: 0, |
| | | qualityPass: 0, |
| | | qualityFail: 0, |
| | | qualityPassRate: 0, |
| | | stockTotal: 0, |
| | | stockTemporary: 0, |
| | | stockQualified: 0, |
| | | stockOutbound: 0, |
| | | lowStockCount: 0, |
| | | outboundOrderTotal: 0, |
| | | outboundQuantityTotal: 0, |
| | | todayOutboundQuantity: 0, |
| | | scanTotal: 0, |
| | | todayScanCount: 0, |
| | | scanSuccessCount: 0, |
| | | crossRegionWarningTotal: 0, |
| | | crossRegionPendingCount: 0, |
| | | }); |
| | | |
| | | // éè¿éå¢ key 触ååç»ä»¶éæ°æè½½å®ç°æ´ä½å·æ° |
| | | const reloadKey = ref(0); |
| | | |
| | | const loading = ref(false); |
| | | |
| | | /** å è½½æ±æ»ç»è®¡ */ |
| | | async function loadSummary() { |
| | | try { |
| | | summary.value = await getManagementCockpitSummary(); |
| | | } catch { |
| | | // æ¥å£å¼å¸¸æ¶ä¿çé»è®¤å¼ï¼é¿å
页é¢å´©æº |
| | | } |
| | | } |
| | | |
| | | /** å·æ°å
¨é¨æ°æ® */ |
| | | async function handleRefresh() { |
| | | loading.value = true; |
| | | try { |
| | | await Promise.all([loadSummary()]); |
| | | reloadKey.value += 1; |
| | | message.success('已巿°'); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | } |
| | | |
| | | /** å¯¼åº Excel æ¥è¡¨ï¼å端çæå¤ sheet å·¥ä½ç°¿ï¼ */ |
| | | async function handleExportExcel() { |
| | | try { |
| | | const data = await exportManagementCockpitExcel(); |
| | | downloadFileFromBlobPart({ |
| | | fileName: `管ç驾驶è±ç»è®¡æ¥è¡¨-${new Date().toLocaleDateString()}.xls`, |
| | | source: data, |
| | | }); |
| | | message.success('Excel æ¥è¡¨å·²å¯¼åº'); |
| | | } catch { |
| | | // éè¯¯å·²ç± requestClient ç»ä¸æç¤º |
| | | } |
| | | } |
| | | |
| | | /** å¯¼åº PDF æ¥è¡¨ï¼å端 html2canvas + jspdf çæå¯ä¸è½½æä»¶ï¼ */ |
| | | async function handleExportPdf() { |
| | | const target = document.getElementById('management-cockpit-report'); |
| | | if (!target) { |
| | | message.warning('æ¥è¡¨åºåæªå°±ç»ª'); |
| | | return; |
| | | } |
| | | const hide = message.loading('æ£å¨çæ PDFï¼è¯·ç¨åâ¦', 0); |
| | | try { |
| | | // 卿å è½½ï¼é¿å
ææ
¢é¦å±ï¼html-to-image éè¿ SVG foreignObject 让æµè§å¨åçæ¸²æï¼ |
| | | // è§é¿ html2canvas 䏿¯æ oklch çç°ä»£ CSS é¢è²å½æ°çé®é¢ï¼ |
| | | const [{ toPng }, { jsPDF }] = await Promise.all([ |
| | | import('html-to-image'), |
| | | import('jspdf'), |
| | | ]); |
| | | const dataUrl = await toPng(target, { |
| | | backgroundColor: '#ffffff', |
| | | cacheBust: true, |
| | | pixelRatio: 2, |
| | | }); |
| | | const pdf = new jsPDF({ compress: true, format: 'a4', orientation: 'p', unit: 'mm' }); |
| | | const pageWidth = pdf.internal.pageSize.getWidth(); |
| | | const pageHeight = pdf.internal.pageSize.getHeight(); |
| | | const imgWidth = pageWidth; |
| | | const imgHeight = (target.offsetHeight * imgWidth) / target.offsetWidth; |
| | | |
| | | let heightLeft = imgHeight; |
| | | let position = 0; |
| | | pdf.addImage(dataUrl, 'PNG', 0, position, imgWidth, imgHeight); |
| | | heightLeft -= pageHeight; |
| | | while (heightLeft > 0) { |
| | | position -= pageHeight; |
| | | pdf.addPage(); |
| | | pdf.addImage(dataUrl, 'PNG', 0, position, imgWidth, imgHeight); |
| | | heightLeft -= pageHeight; |
| | | } |
| | | pdf.save(`管ç驾驶è±ç»è®¡æ¥è¡¨-${new Date().toLocaleDateString()}.pdf`); |
| | | message.success('PDF æ¥è¡¨å·²å¯¼åº'); |
| | | } catch (error) { |
| | | console.error('[management-cockpit] PDF 导åºå¤±è´¥ï¼', error); |
| | | message.error( |
| | | `PDF 导åºå¤±è´¥ï¼${error instanceof Error ? error.message : 'æªç¥é误'}ï¼è¯·æå¼æµè§å¨æ§å¶å°(F12)æ¥ç详æ
`, |
| | | ); |
| | | } finally { |
| | | hide(); |
| | | } |
| | | } |
| | | |
| | | /** å è½½æ±æ»ç»è®¡ */ |
| | | async function loadInitial() { |
| | | await loadSummary(); |
| | | } |
| | | loadInitial(); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page> |
| | | <!-- å·¥å
·æ --> |
| | | <div class="mb-4 flex flex-wrap items-center justify-between gap-3"> |
| | | <div class="flex items-center gap-2"> |
| | | <IconifyIcon class="text-xl text-blue-500" icon="lucide:gauge" /> |
| | | <span class="text-base font-semibold">管ç驾驶è±ä¸ç»è®¡åæ</span> |
| | | </div> |
| | | <Space> |
| | | <Button :loading="loading" @click="handleRefresh"> |
| | | <template #icon><IconifyIcon icon="lucide:refresh-cw" /></template> |
| | | å·æ° |
| | | </Button> |
| | | <Button v-access:code="['mes:dashboard:export']" type="primary" @click="handleExportExcel"> |
| | | <template #icon><IconifyIcon icon="lucide:file-spreadsheet" /></template> |
| | | å¯¼åº Excel |
| | | </Button> |
| | | <Button v-access:code="['mes:dashboard:export']" type="primary" ghost @click="handleExportPdf"> |
| | | <template #icon><IconifyIcon icon="lucide:file-down" /></template> |
| | | å¯¼åº PDF |
| | | </Button> |
| | | <Button v-print="printObj"> |
| | | <template #icon><IconifyIcon icon="lucide:printer" /></template> |
| | | æå° |
| | | </Button> |
| | | </Space> |
| | | </div> |
| | | |
| | | <!-- æ¥è¡¨å
容ï¼Excel/PDF/æå° ååºäºæ¤åºåï¼ --> |
| | | <div id="management-cockpit-report" class="rounded-lg bg-white p-4 dark:bg-gray-800"> |
| | | <!-- äºç»´åº¦ KPI --> |
| | | <KpiCards :key="`kpi-${reloadKey}`" :summary="summary" class="mb-2" /> |
| | | |
| | | <!-- ç产è¶å¿ --> |
| | | <ProductionTrend :key="`pt-${reloadKey}`" class="mb-4" /> |
| | | |
| | | <QualityChart :key="`qc-${reloadKey}`" class="mb-4" /> |
| | | |
| | | <InventoryChart :key="`iv-${reloadKey}`" class="mb-4" /> |
| | | <OutboundChart :key="`ob-${reloadKey}`" class="mb-4" /> |
| | | <TraceChart :key="`tr-${reloadKey}`" class="mb-4" /> |
| | | </div> |
| | | </Page> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { EchartsUIType } from '@vben/plugins/echarts'; |
| | | |
| | | import { onMounted, ref } from 'vue'; |
| | | |
| | | import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; |
| | | |
| | | import { Card, Col, Row, Spin } from 'ant-design-vue'; |
| | | |
| | | import { getManagementCockpitInventory } from '#/api/mes/management-cockpit'; |
| | | |
| | | import { getBarChartOptions, getPieChartOptions } from '../chart-options'; |
| | | |
| | | defineOptions({ name: 'ManagementCockpitInventoryChart' }); |
| | | |
| | | const loading = ref(false); |
| | | const warehouseRef = ref<EchartsUIType>(); |
| | | const itemRef = ref<EchartsUIType>(); |
| | | const stateRef = ref<EchartsUIType>(); |
| | | const { renderEcharts: renderWarehouse } = useEcharts(warehouseRef); |
| | | const { renderEcharts: renderItem } = useEcharts(itemRef); |
| | | const { renderEcharts: renderState } = useEcharts(stateRef); |
| | | |
| | | /** å è½½åºåç»è®¡å¹¶æ¸²æ */ |
| | | async function loadData() { |
| | | loading.value = true; |
| | | try { |
| | | const data = await getManagementCockpitInventory(); |
| | | const warehouses = data.warehouseDistribution || []; |
| | | const items = data.itemDistribution || []; |
| | | const states = data.stateDistribution || []; |
| | | await renderWarehouse( |
| | | getBarChartOptions( |
| | | warehouses.map((w) => w.name), |
| | | warehouses.map((w) => w.count), |
| | | 'åºåæ°é', |
| | | '#409EFF', |
| | | ), |
| | | ); |
| | | await renderItem( |
| | | getBarChartOptions( |
| | | items.map((i) => i.name), |
| | | items.map((i) => i.count), |
| | | 'åºåæ°é', |
| | | '#36cfc9', |
| | | ), |
| | | ); |
| | | await renderState( |
| | | getPieChartOptions( |
| | | states.map((s) => ({ name: s.name, value: s.count })), |
| | | ), |
| | | ); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | } |
| | | |
| | | onMounted(() => { |
| | | loadData(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Card title="åºå维度ç»è®¡" class="h-full"> |
| | | <Spin :spinning="loading"> |
| | | <Row :gutter="16"> |
| | | <Col :lg="9" :md="24" :sm="24" :xs="24"> |
| | | <div class="mb-1 text-sm text-gray-500">æä»åºåå¸</div> |
| | | <EchartsUI ref="warehouseRef" class="h-[280px] w-full" /> |
| | | </Col> |
| | | <Col :lg="9" :md="24" :sm="24" :xs="24"> |
| | | <div class="mb-1 text-sm text-gray-500">æåç§åå¸</div> |
| | | <EchartsUI ref="itemRef" class="h-[280px] w-full" /> |
| | | </Col> |
| | | <Col :lg="6" :md="24" :sm="24" :xs="24"> |
| | | <div class="mb-1 text-sm text-gray-500">æåºåç¶æ</div> |
| | | <EchartsUI ref="stateRef" class="h-[280px] w-full" /> |
| | | </Col> |
| | | </Row> |
| | | </Spin> |
| | | </Card> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { ManagementCockpitApi } from '#/api/mes/management-cockpit'; |
| | | |
| | | import { CountTo } from '@vben/common-ui'; |
| | | import { IconifyIcon } from '@vben/icons'; |
| | | |
| | | import { Card, Col, Row } from 'ant-design-vue'; |
| | | |
| | | defineOptions({ name: 'ManagementCockpitKpiCards' }); |
| | | |
| | | const props = defineProps<{ |
| | | summary: ManagementCockpitApi.Summary; |
| | | }>(); |
| | | |
| | | /** ä¿ç两ä½å°æ° */ |
| | | function fmt(value?: number): number { |
| | | return Number((value ?? 0).toFixed(2)); |
| | | } |
| | | |
| | | /** äºç»´åº¦ KPI å¡é
ç½® */ |
| | | const cards = [ |
| | | { |
| | | dimension: 'ç产', |
| | | gradient: 'linear-gradient(135deg, #0ea5e9, #38bdf8)', |
| | | icon: 'lucide:factory', |
| | | mainLabel: 'çäº§æ¹æ¬¡', |
| | | mainValue: () => props.summary.batchTotal, |
| | | items: [ |
| | | { label: 'è¢ç ', value: () => props.summary.bagCodeTotal }, |
| | | { label: 'æçç ', value: () => props.summary.palletTotal }, |
| | | { label: '仿¥å
¥åº', value: () => props.summary.todayInboundBagCount }, |
| | | ], |
| | | }, |
| | | { |
| | | dimension: 'è´¨æ£', |
| | | gradient: 'linear-gradient(135deg, #67c23a, #95d475)', |
| | | icon: 'lucide:clipboard-check', |
| | | mainLabel: 'åæ ¼ç(%)', |
| | | mainValue: () => fmt(props.summary.qualityPassRate), |
| | | items: [ |
| | | { label: 'åæ ¼', value: () => props.summary.qualityPass }, |
| | | { label: 'ä¸åæ ¼', value: () => props.summary.qualityFail }, |
| | | { label: 'å¤çä¸', value: () => props.summary.qualityPending }, |
| | | ], |
| | | }, |
| | | { |
| | | dimension: 'åºå', |
| | | gradient: 'linear-gradient(135deg, #f59e0b, #fbbf24)', |
| | | icon: 'lucide:warehouse', |
| | | mainLabel: 'åºåæ»é', |
| | | mainValue: () => fmt(props.summary.stockTotal), |
| | | items: [ |
| | | { label: 'æååº', value: () => fmt(props.summary.stockTemporary) }, |
| | | { label: 'åæ ¼åº', value: () => fmt(props.summary.stockQualified) }, |
| | | { label: 'ä½åºåé¢è¦', value: () => props.summary.lowStockCount }, |
| | | ], |
| | | }, |
| | | { |
| | | dimension: 'åºåº', |
| | | gradient: 'linear-gradient(135deg, #ec4899, #f472b6)', |
| | | icon: 'lucide:package-open', |
| | | mainLabel: 'åºåºæ»é', |
| | | mainValue: () => fmt(props.summary.outboundQuantityTotal), |
| | | items: [ |
| | | { label: 'åºåºåæ°', value: () => props.summary.outboundOrderTotal }, |
| | | { label: '仿¥åºåº', value: () => fmt(props.summary.todayOutboundQuantity) }, |
| | | ], |
| | | }, |
| | | { |
| | | dimension: '追溯', |
| | | gradient: 'linear-gradient(135deg, #14b8a6, #2dd4bf)', |
| | | icon: 'lucide:scan-search', |
| | | mainLabel: 'æ«ç æ»æ°', |
| | | mainValue: () => props.summary.scanTotal, |
| | | items: [ |
| | | { label: '仿¥æ«ç ', value: () => props.summary.todayScanCount }, |
| | | { label: 'çªè´§é¢è¦', value: () => props.summary.crossRegionWarningTotal }, |
| | | { label: 'å¾
å¤ç', value: () => props.summary.crossRegionPendingCount }, |
| | | ], |
| | | }, |
| | | ]; |
| | | </script> |
| | | |
| | | <template> |
| | | <Row :gutter="16"> |
| | | <Col |
| | | v-for="card in cards" |
| | | :key="card.dimension" |
| | | :lg="8" |
| | | :md="12" |
| | | :sm="12" |
| | | :xl="8" |
| | | :xs="24" |
| | | class="mb-4" |
| | | > |
| | | <Card class="kpi-card h-full"> |
| | | <div class="flex items-start justify-between"> |
| | | <div class="flex items-center gap-3"> |
| | | <div |
| | | class="flex size-12 flex-shrink-0 items-center justify-center rounded-xl text-white" |
| | | :style="{ background: card.gradient }" |
| | | > |
| | | <IconifyIcon class="size-6" :icon="card.icon" /> |
| | | </div> |
| | | <div> |
| | | <div class="text-muted-foreground text-sm">{{ card.dimension }}</div> |
| | | <CountTo |
| | | class="text-xl font-bold leading-tight" |
| | | :end-val="card.mainValue()" |
| | | :duration="1200" |
| | | /> |
| | | <div class="text-muted-foreground text-xs">{{ card.mainLabel }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="mt-3 flex flex-wrap gap-x-4 gap-y-1 border-t border-dashed pt-3"> |
| | | <span v-for="item in card.items" :key="item.label" class="text-xs text-gray-500"> |
| | | {{ item.label }}ï¼ |
| | | <b class="text-sm text-gray-800 dark:text-gray-200">{{ item.value() }}</b> |
| | | </span> |
| | | </div> |
| | | </Card> |
| | | </Col> |
| | | </Row> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { EchartsUIType } from '@vben/plugins/echarts'; |
| | | |
| | | import { onMounted, ref } from 'vue'; |
| | | |
| | | import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; |
| | | |
| | | import { Card, Col, RadioButton, RadioGroup, Row, Spin } from 'ant-design-vue'; |
| | | |
| | | import { getManagementCockpitOutbound } from '#/api/mes/management-cockpit'; |
| | | |
| | | import { getLineChartOptions, getPieChartOptions } from '../chart-options'; |
| | | |
| | | defineOptions({ name: 'ManagementCockpitOutboundChart' }); |
| | | |
| | | const trendDays = ref(30); |
| | | const loading = ref(false); |
| | | const trendRef = ref<EchartsUIType>(); |
| | | const dealerRef = ref<EchartsUIType>(); |
| | | const { renderEcharts: renderTrend } = useEcharts(trendRef); |
| | | const { renderEcharts: renderDealer } = useEcharts(dealerRef); |
| | | |
| | | /** å è½½åºåºç»è®¡å¹¶æ¸²æ */ |
| | | async function loadData() { |
| | | loading.value = true; |
| | | try { |
| | | const data = await getManagementCockpitOutbound(trendDays.value); |
| | | const trend = data.trend || []; |
| | | const dealers = data.dealerDistribution || []; |
| | | await renderTrend( |
| | | getLineChartOptions( |
| | | trend.map((d) => d.date.slice(5)), |
| | | trend.map((d) => Number(d.count ?? 0)), |
| | | 'åºåºæ°é', |
| | | ), |
| | | ); |
| | | await renderDealer( |
| | | getPieChartOptions(dealers.map((d) => ({ name: d.name, value: d.count }))), |
| | | ); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | } |
| | | |
| | | /** 忢天æ°èå´ */ |
| | | function handleDaysChange() { |
| | | loadData(); |
| | | } |
| | | |
| | | onMounted(() => { |
| | | loadData(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Card title="åºåºç»´åº¦ç»è®¡" class="h-full"> |
| | | <template #extra> |
| | | <RadioGroup v-model:value="trendDays" size="small" @change="handleDaysChange"> |
| | | <RadioButton :value="7">è¿ 7 天</RadioButton> |
| | | <RadioButton :value="30">è¿ 30 天</RadioButton> |
| | | <RadioButton :value="90">è¿ 90 天</RadioButton> |
| | | </RadioGroup> |
| | | </template> |
| | | <Spin :spinning="loading"> |
| | | <Row :gutter="16"> |
| | | <Col :lg="15" :md="24" :sm="24" :xs="24"> |
| | | <div class="mb-1 text-sm text-gray-500">åºåºè¶å¿</div> |
| | | <EchartsUI ref="trendRef" class="h-[280px] w-full" /> |
| | | </Col> |
| | | <Col :lg="9" :md="24" :sm="24" :xs="24"> |
| | | <div class="mb-1 text-sm text-gray-500">ç»éååºåºå æ¯ï¼TOP 20ï¼</div> |
| | | <EchartsUI ref="dealerRef" class="h-[280px] w-full" /> |
| | | </Col> |
| | | </Row> |
| | | </Spin> |
| | | </Card> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { EchartsUIType } from '@vben/plugins/echarts'; |
| | | |
| | | import { onMounted, ref } from 'vue'; |
| | | |
| | | import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; |
| | | |
| | | import { Card, RadioButton, RadioGroup } from 'ant-design-vue'; |
| | | |
| | | import { getManagementCockpitProductionTrend } from '#/api/mes/management-cockpit'; |
| | | |
| | | import { getProductionTrendChartOptions } from '../chart-options'; |
| | | |
| | | defineOptions({ name: 'ManagementCockpitProductionTrend' }); |
| | | |
| | | const trendDays = ref(30); // å½å天æ°èå´ |
| | | const chartRef = ref<EchartsUIType>(); |
| | | const { renderEcharts } = useEcharts(chartRef); |
| | | |
| | | /** å è½½ç产è¶å¿æ°æ®å¹¶æ¸²æ */ |
| | | async function loadData() { |
| | | const data = await getManagementCockpitProductionTrend(trendDays.value); |
| | | const dates = data.map((d) => d.date.slice(5)); |
| | | await renderEcharts( |
| | | getProductionTrendChartOptions( |
| | | dates, |
| | | data.map((d) => d.batchCount), |
| | | data.map((d) => d.bagCodeCount), |
| | | data.map((d) => d.palletCount), |
| | | data.map((d) => Number(d.inboundBagQuantity ?? 0)), |
| | | ), |
| | | ); |
| | | } |
| | | |
| | | /** 忢天æ°èå´ */ |
| | | function handleDaysChange() { |
| | | loadData(); |
| | | } |
| | | |
| | | onMounted(() => { |
| | | loadData(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Card title="ç产è¶å¿ï¼è¿ N 天ï¼" class="h-full"> |
| | | <template #extra> |
| | | <RadioGroup v-model:value="trendDays" size="small" @change="handleDaysChange"> |
| | | <RadioButton :value="7">è¿ 7 天</RadioButton> |
| | | <RadioButton :value="30">è¿ 30 天</RadioButton> |
| | | <RadioButton :value="90">è¿ 90 天</RadioButton> |
| | | </RadioGroup> |
| | | </template> |
| | | <EchartsUI ref="chartRef" class="h-[320px] w-full" /> |
| | | </Card> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { EchartsUIType } from '@vben/plugins/echarts'; |
| | | |
| | | import { onMounted, ref } from 'vue'; |
| | | |
| | | import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; |
| | | |
| | | import { Card, Col, Row, Spin } from 'ant-design-vue'; |
| | | |
| | | import { getManagementCockpitQuality } from '#/api/mes/management-cockpit'; |
| | | |
| | | import { getPieChartOptions, getQualityIndicatorChartOptions } from '../chart-options'; |
| | | |
| | | defineOptions({ name: 'ManagementCockpitQualityChart' }); |
| | | |
| | | const loading = ref(false); |
| | | const resultChartRef = ref<EchartsUIType>(); |
| | | const indicatorChartRef = ref<EchartsUIType>(); |
| | | const { renderEcharts: renderResult } = useEcharts(resultChartRef); |
| | | const { renderEcharts: renderIndicator } = useEcharts(indicatorChartRef); |
| | | |
| | | /** å 载质æ£ç»è®¡å¹¶æ¸²æ */ |
| | | async function loadData() { |
| | | loading.value = true; |
| | | try { |
| | | const data = await getManagementCockpitQuality(); |
| | | // 1. æ£éªç»æåå¸ç¯å½¢å¾ |
| | | const pieData = (data.resultDistribution || []).map((item) => ({ |
| | | name: item.name, |
| | | value: item.count, |
| | | })); |
| | | await renderResult(getPieChartOptions(pieData)); |
| | | // 2. åé¡¹ææ åå¼ + åæ ¼çæ±ç¶å¾ |
| | | const indicators = data.indicatorList || []; |
| | | await renderIndicator( |
| | | getQualityIndicatorChartOptions( |
| | | indicators.map((i) => i.indicatorName || i.indicatorCode), |
| | | indicators.map((i) => Number(i.averageValue ?? 0)), |
| | | indicators.map((i) => Number(i.passRate ?? 0)), |
| | | ), |
| | | ); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | } |
| | | |
| | | onMounted(() => { |
| | | loadData(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Card title="è´¨æ£ç»´åº¦ç»è®¡" class="h-full"> |
| | | <Spin :spinning="loading"> |
| | | <Row :gutter="16"> |
| | | <Col :lg="10" :md="24" :sm="24" :xs="24"> |
| | | <div class="mb-1 text-sm text-gray-500">æ£éªç»æåå¸</div> |
| | | <EchartsUI ref="resultChartRef" class="h-[280px] w-full" /> |
| | | </Col> |
| | | <Col :lg="14" :md="24" :sm="24" :xs="24"> |
| | | <div class="mb-1 text-sm text-gray-500">åé¡¹ææ åå¼ä¸åæ ¼ç</div> |
| | | <EchartsUI ref="indicatorChartRef" class="h-[280px] w-full" /> |
| | | </Col> |
| | | </Row> |
| | | </Spin> |
| | | </Card> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { EchartsUIType } from '@vben/plugins/echarts'; |
| | | |
| | | import { onMounted, ref } from 'vue'; |
| | | |
| | | import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; |
| | | |
| | | import { Card, Col, Row, Spin, Statistic } from 'ant-design-vue'; |
| | | |
| | | import { getManagementCockpitTrace } from '#/api/mes/management-cockpit'; |
| | | |
| | | import { getBarChartOptions, getLineChartOptions, getPieChartOptions } from '../chart-options'; |
| | | |
| | | defineOptions({ name: 'ManagementCockpitTraceChart' }); |
| | | |
| | | const loading = ref(false); |
| | | const scanTrendRef = ref<EchartsUIType>(); |
| | | const provinceRef = ref<EchartsUIType>(); |
| | | const channelRef = ref<EchartsUIType>(); |
| | | const { renderEcharts: renderScanTrend } = useEcharts(scanTrendRef); |
| | | const { renderEcharts: renderProvince } = useEcharts(provinceRef); |
| | | const { renderEcharts: renderChannel } = useEcharts(channelRef); |
| | | |
| | | // çªè´§é¢è¦æ±æ»ï¼ç¨äºå±ç¤ºå¡çï¼ |
| | | const crossRegion = ref({ |
| | | total: 0, |
| | | pending: 0, |
| | | handled: 0, |
| | | falseAlarm: 0, |
| | | crossProvince: 0, |
| | | crossCity: 0, |
| | | }); |
| | | |
| | | /** å 载追溯ç»è®¡å¹¶æ¸²æ */ |
| | | async function loadData() { |
| | | loading.value = true; |
| | | try { |
| | | const data = await getManagementCockpitTrace(30); |
| | | const scanTrend = data.scanTrend || []; |
| | | const provinces = data.provinceDistribution || []; |
| | | const channels = data.channelDistribution || []; |
| | | crossRegion.value = data.crossRegionSummary || crossRegion.value; |
| | | await renderScanTrend( |
| | | getLineChartOptions( |
| | | scanTrend.map((d) => d.date.slice(5)), |
| | | scanTrend.map((d) => Number(d.count ?? 0)), |
| | | 'æ«ç 次æ°', |
| | | '#409EFF', |
| | | ), |
| | | ); |
| | | await renderProvince( |
| | | getBarChartOptions( |
| | | provinces.map((p) => p.name), |
| | | provinces.map((p) => p.count), |
| | | 'æ«ç 次æ°', |
| | | '#67c23a', |
| | | ), |
| | | ); |
| | | await renderChannel( |
| | | getPieChartOptions(channels.map((c) => ({ name: c.name, value: c.count }))), |
| | | ); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | } |
| | | |
| | | onMounted(() => { |
| | | loadData(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Card title="追溯维度ç»è®¡" class="h-full"> |
| | | <Spin :spinning="loading"> |
| | | <!-- çªè´§é¢è¦æ±æ»å¡ç --> |
| | | <Row :gutter="16" class="mb-2"> |
| | | <Col :lg="4" :md="8" :sm="12" :xs="24" class="mb-2"> |
| | | <Card size="small"> |
| | | <Statistic title="é¢è¦æ»æ°" :value="crossRegion.total" /> |
| | | </Card> |
| | | </Col> |
| | | <Col :lg="4" :md="8" :sm="12" :xs="24" class="mb-2"> |
| | | <Card size="small"> |
| | | <Statistic title="å¾
å¤ç" :value="crossRegion.pending" :value-style="{ color: '#f5222d' }" /> |
| | | </Card> |
| | | </Col> |
| | | <Col :lg="4" :md="8" :sm="12" :xs="24" class="mb-2"> |
| | | <Card size="small"> |
| | | <Statistic title="å·²å¤ç" :value="crossRegion.handled" /> |
| | | </Card> |
| | | </Col> |
| | | <Col :lg="4" :md="8" :sm="12" :xs="24" class="mb-2"> |
| | | <Card size="small"> |
| | | <Statistic title="误æ¥" :value="crossRegion.falseAlarm" /> |
| | | </Card> |
| | | </Col> |
| | | <Col :lg="4" :md="8" :sm="12" :xs="24" class="mb-2"> |
| | | <Card size="small"> |
| | | <Statistic title="è·¨ç" :value="crossRegion.crossProvince" /> |
| | | </Card> |
| | | </Col> |
| | | <Col :lg="4" :md="8" :sm="12" :xs="24" class="mb-2"> |
| | | <Card size="small"> |
| | | <Statistic title="è·¨å¸" :value="crossRegion.crossCity" /> |
| | | </Card> |
| | | </Col> |
| | | </Row> |
| | | <!-- æ«ç è¶å¿ + ç份åå¸ + æ¸ éåå¸ --> |
| | | <Row :gutter="16"> |
| | | <Col :lg="10" :md="24" :sm="24" :xs="24"> |
| | | <div class="mb-1 text-sm text-gray-500">æ¶è´¹è
æ«ç è¶å¿</div> |
| | | <EchartsUI ref="scanTrendRef" class="h-[280px] w-full" /> |
| | | </Col> |
| | | <Col :lg="9" :md="24" :sm="24" :xs="24"> |
| | | <div class="mb-1 text-sm text-gray-500">æ«ç ç份åå¸</div> |
| | | <EchartsUI ref="provinceRef" class="h-[280px] w-full" /> |
| | | </Col> |
| | | <Col :lg="5" :md="24" :sm="24" :xs="24"> |
| | | <div class="mb-1 text-sm text-gray-500">æ«ç æ¸ éåå¸</div> |
| | | <EchartsUI ref="channelRef" class="h-[280px] w-full" /> |
| | | </Col> |
| | | </Row> |
| | | </Spin> |
| | | </Card> |
| | | </template> |
| | |
| | | import type { MesProBatchApi } from "#/api/mes/pro/batch"; |
| | | import type { MesProPalletApi } from "#/api/mes/pro/pallet"; |
| | | |
| | | import { ref } from "vue"; |
| | | import { computed, ref } from "vue"; |
| | | |
| | | import { Barcode, useVbenModal } from "@vben/common-ui"; |
| | | import { DICT_TYPE } from "@vben/constants"; |
| | |
| | | import { getBagCodeByCode } from "#/api/mes/pro/bagCode"; |
| | | import { getBatchByCode } from "#/api/mes/pro/batch"; |
| | | import { getPalletByCode } from "#/api/mes/pro/pallet"; |
| | | import { getQrConfig } from "#/api/mes/trace/config"; |
| | | import { useDescription } from "#/components/description"; |
| | | |
| | | defineOptions({ name: "MesProQrTraceModal" }); |
| | |
| | | const barcodeRef = ref<InstanceType<typeof Barcode>>(); |
| | | |
| | | const traceTypeLabel = ref(""); |
| | | |
| | | /** æº¯æº H5 页é¢åºç¡å°åï¼ä¼è¯å
åªæå䏿¬¡ï¼ */ |
| | | const traceBaseUrl = ref<string>(""); |
| | | |
| | | async function ensureTraceBaseUrl() { |
| | | if (traceBaseUrl.value) return; |
| | | try { |
| | | const res = await getQrConfig(); |
| | | traceBaseUrl.value = res.traceBaseUrl || ""; |
| | | } catch { |
| | | traceBaseUrl.value = ""; |
| | | } |
| | | } |
| | | |
| | | /** äºç»´ç å±ç¤ºå
容ï¼é
ç½®äºæº¯æºå°ååæ¼ H5 URLï¼å¦ååé纯ç å¼ï¼ä¸å端 buildQrCodeContent ä¸è´ï¼ */ |
| | | const qrContent = computed(() => { |
| | | if (!currentCode.value) return ""; |
| | | return traceBaseUrl.value |
| | | ? `${traceBaseUrl.value}?code=${encodeURIComponent(currentCode.value)}` |
| | | : currentCode.value; |
| | | }); |
| | | |
| | | /** ä»å®æ´ H5 龿¥ä¸æå追溯ç ï¼å
¼å®¹æ«ç æªæ«ææå°æ ç¾é¾æ¥ï¼ */ |
| | | function extractCodeFromUrl(raw: string): string { |
| | | const trimmed = raw.trim(); |
| | | if (/^https?:\/\//i.test(trimmed)) { |
| | | try { |
| | | const url = new URL(trimmed); |
| | | const code = url.searchParams.get("code"); |
| | | if (code) return code; |
| | | } catch { |
| | | // è§£æå¤±è´¥æåå§è¾å
¥å¤ç |
| | | } |
| | | } |
| | | return trimmed; |
| | | } |
| | | |
| | | /** è¯å«äºç»´ç å
容类åï¼æ¹æ¬¡å·ï¼å«ä¸´æ¶æ¹æ¬¡ç ï¼/ æçç ï¼å«ä¸´æ¶æçç ï¼/ è¢ç */ |
| | | function resolveCodeType(raw: string): TraceType | undefined { |
| | |
| | | |
| | | /** æ«ç /è¾å
¥äºç»´ç å
容æ¥è¯¢è¿½æº¯ä¿¡æ¯ */ |
| | | async function handleSearch(raw?: string) { |
| | | const value = (raw ?? codeInput.value)?.trim().toUpperCase(); |
| | | const input = (raw ?? codeInput.value)?.trim() ?? ""; |
| | | const value = extractCodeFromUrl(input).toUpperCase(); |
| | | if (!value) { |
| | | message.warning("è¯·æ«ææè¾å
¥äºç»´ç å
容"); |
| | | return; |
| | |
| | | if (!isOpen) { |
| | | return; |
| | | } |
| | | ensureTraceBaseUrl(); |
| | | const data = modalApi.getData<{ code?: string }>() || {}; |
| | | codeInput.value = data.code ?? undefined; |
| | | resetState(); |
| | |
| | | class="mb-4 flex items-center gap-6 rounded bg-gray-100 p-5" |
| | | > |
| | | <div class="flex-shrink-0"> |
| | | <Barcode ref="barcodeRef" :content="currentCode" :width="200" /> |
| | | <Barcode ref="barcodeRef" :content="qrContent" :width="200" /> |
| | | </div> |
| | | <div class="min-w-0 flex-1"> |
| | | <p class="text-lg font-bold break-all">{{ currentCode }}</p> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import type { EChartsOption } from '@vben/plugins/echarts'; |
| | | |
| | | /** æ¶è´¹è
æ«ç 访é®è¶å¿æçº¿å¾é
ç½® */ |
| | | export function getScanTrendChartOptions( |
| | | dates: string[], |
| | | totals: number[], |
| | | success: number[], |
| | | failed: number[], |
| | | ): EChartsOption { |
| | | return { |
| | | grid: { bottom: 40, left: 50, right: 20, top: 20 }, |
| | | legend: { bottom: 0, data: ['æ»è®¿é®', 'æå', '失败'] }, |
| | | series: [ |
| | | { |
| | | areaStyle: { color: 'rgba(64,158,255,0.15)' }, |
| | | data: totals, |
| | | itemStyle: { color: '#409EFF' }, |
| | | name: 'æ»è®¿é®', |
| | | smooth: true, |
| | | type: 'line', |
| | | }, |
| | | { |
| | | data: success, |
| | | itemStyle: { color: '#67C23A' }, |
| | | name: 'æå', |
| | | smooth: true, |
| | | type: 'line', |
| | | }, |
| | | { |
| | | data: failed, |
| | | itemStyle: { color: '#F56C6C' }, |
| | | name: '失败', |
| | | smooth: true, |
| | | type: 'line', |
| | | }, |
| | | ], |
| | | tooltip: { axisPointer: { type: 'cross' }, trigger: 'axis' }, |
| | | xAxis: { boundaryGap: false, data: dates, type: 'category' }, |
| | | yAxis: { minInterval: 1, type: 'value' }, |
| | | }; |
| | | } |
| | | |
| | | /** æ¶è´¹è
æ«ç 访é®åå¸é¥¼å¾é
ç½® */ |
| | | export function getScanDistributionChartOptions( |
| | | data: Array<{ itemStyle: { color: string }; name: string; value: number }>, |
| | | ): EChartsOption { |
| | | return { |
| | | legend: { bottom: 0, type: 'scroll' }, |
| | | series: [ |
| | | { |
| | | avoidLabelOverlap: true, |
| | | data, |
| | | emphasis: { label: { fontSize: 14, fontWeight: 'bold', show: true } }, |
| | | itemStyle: { borderColor: '#fff', borderRadius: 6, borderWidth: 2 }, |
| | | label: { formatter: '{b}\n{c}', show: true }, |
| | | radius: ['40%', '70%'], |
| | | type: 'pie', |
| | | }, |
| | | ], |
| | | tooltip: { formatter: '{b}: {c} ({d}%)', trigger: 'item' }, |
| | | }; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import type { MesTraceConsumerScanApi } from '#/api/mes/trace-consumer-scan'; |
| | | |
| | | /** æ¶è´¹è
æ«ç è®¿é®æ±æ»é»è®¤å¼ */ |
| | | export const defaultSummary: MesTraceConsumerScanApi.Summary = { |
| | | total: 0, |
| | | success: 0, |
| | | failed: 0, |
| | | uniqueBatchCount: 0, |
| | | }; |
| | | |
| | | /** åå¸åç»ç»´åº¦é项 */ |
| | | export const GROUP_BY_OPTIONS: Array<{ label: string; value: string }> = [ |
| | | { label: 'æ«ç ç±»å', value: 'sourceType' }, |
| | | { label: 'æ¥è¯¢ç»æ', value: 'success' }, |
| | | { label: 'æ«ç æ¸ é', value: 'channel' }, |
| | | { label: 'ç份', value: 'province' }, |
| | | { label: 'åå¸', value: 'city' }, |
| | | { label: 'çäº§æ¹æ¬¡', value: 'batchId' }, |
| | | ]; |
| | | |
| | | /** æ«ç ç±»ååç§°æ å°ï¼å端åå¨åå§ç ï¼å±ç¤ºæ¶è½¬æ¢ï¼ */ |
| | | export const SOURCE_TYPE_LABEL_MAP: Record<string, string> = { |
| | | BAG: 'è¢ç ', |
| | | PALLET: 'æçç ', |
| | | BATCH: 'æ¹æ¬¡ç ', |
| | | }; |
| | | |
| | | /** åå¸å¾è¡¨é¢è²éå */ |
| | | export const DISTRIBUTION_COLORS = [ |
| | | '#409EFF', |
| | | '#67C23A', |
| | | '#E6A23C', |
| | | '#F56C6C', |
| | | '#909399', |
| | | '#7C3AED', |
| | | '#00BCD4', |
| | | '#FF9800', |
| | | '#4CAF50', |
| | | '#E91E63', |
| | | ]; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { Page } from '@vben/common-ui'; |
| | | |
| | | import { Card, Col, DatePicker, Row } from 'ant-design-vue'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | import { getRangePickerDefaultProps } from '#/utils'; |
| | | |
| | | import DistributionChart from './modules/distribution-chart.vue'; |
| | | import SummaryCards from './modules/summary-cards.vue'; |
| | | import TrendChart from './modules/trend-chart.vue'; |
| | | |
| | | defineOptions({ name: 'MesConsumerScanStatistics' }); |
| | | |
| | | /** ç»è®¡æ¶é´èå´ï¼é»è®¤è¿ 30 天ï¼valueFormat 已转为 yyyy-MM-dd HH:mm:ssï¼ */ |
| | | const dateRange = ref<[string, string] | undefined>([ |
| | | dayjs().subtract(30, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss'), |
| | | dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss'), |
| | | ]); |
| | | |
| | | const startTime = computed(() => dateRange.value?.[0]); |
| | | const endTime = computed(() => dateRange.value?.[1]); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page> |
| | | <Card title="æ¶è´¹è
æ«ç ç»è®¡" class="mb-4"> |
| | | <div class="flex flex-wrap items-center gap-2"> |
| | | <span class="text-muted-foreground text-sm">ç»è®¡æ¶é´èå´</span> |
| | | <DatePicker.RangePicker |
| | | v-model:value="dateRange" |
| | | v-bind="getRangePickerDefaultProps()" |
| | | /> |
| | | </div> |
| | | </Card> |
| | | |
| | | <SummaryCards :start-time="startTime" :end-time="endTime" /> |
| | | |
| | | <Row :gutter="16"> |
| | | <Col :lg="14" :md="24" :sm="24" :xl="14" :xs="24" class="mb-4"> |
| | | <TrendChart :start-time="startTime" :end-time="endTime" /> |
| | | </Col> |
| | | <Col :lg="10" :md="24" :sm="24" :xl="10" :xs="24" class="mb-4"> |
| | | <DistributionChart :start-time="startTime" :end-time="endTime" /> |
| | | </Col> |
| | | </Row> |
| | | </Page> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { EchartsUIType } from '@vben/plugins/echarts'; |
| | | |
| | | import { computed, ref, watch } from 'vue'; |
| | | |
| | | import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; |
| | | |
| | | import { Card, Empty, Select } from 'ant-design-vue'; |
| | | |
| | | import { getTraceConsumerScanDistribution } from '#/api/mes/trace-consumer-scan'; |
| | | |
| | | import { getScanDistributionChartOptions } from '../chart-options'; |
| | | import { DISTRIBUTION_COLORS, GROUP_BY_OPTIONS, SOURCE_TYPE_LABEL_MAP } from '../data'; |
| | | |
| | | defineOptions({ name: 'MesTraceConsumerScanDistributionChart' }); |
| | | |
| | | const props = defineProps<{ |
| | | startTime?: string; |
| | | endTime?: string; |
| | | }>(); |
| | | |
| | | const groupBy = ref('sourceType'); // å½ååç»ç»´åº¦ |
| | | const chartRef = ref<EchartsUIType>(); |
| | | const { renderEcharts } = useEcharts(chartRef); |
| | | |
| | | /** å叿°æ®æ¯å¦ä¸ºç©º */ |
| | | const hasData = ref(false); |
| | | |
| | | /** å°å端åå§åç»å称转为å¯è¯»åç§° */ |
| | | function displayName(name: string): string { |
| | | if (groupBy.value === 'sourceType') { |
| | | return SOURCE_TYPE_LABEL_MAP[name] || name; |
| | | } |
| | | return name; |
| | | } |
| | | |
| | | /** å è½½å叿°æ®å¹¶æ¸²æé¥¼å¾ */ |
| | | async function loadData() { |
| | | const data = await getTraceConsumerScanDistribution( |
| | | groupBy.value, |
| | | props.startTime, |
| | | props.endTime, |
| | | ); |
| | | hasData.value = data.length > 0; |
| | | const chartData = data.map((d, index) => ({ |
| | | itemStyle: { |
| | | color: DISTRIBUTION_COLORS[index % DISTRIBUTION_COLORS.length] ?? '#409EFF', |
| | | }, |
| | | name: displayName(d.name), |
| | | value: d.count, |
| | | })); |
| | | await renderEcharts(getScanDistributionChartOptions(chartData)); |
| | | } |
| | | |
| | | /** 忢åç»ç»´åº¦ */ |
| | | function handleGroupByChange() { |
| | | loadData(); |
| | | } |
| | | |
| | | watch( |
| | | () => [props.startTime, props.endTime], |
| | | () => { |
| | | loadData(); |
| | | }, |
| | | { immediate: true }, |
| | | ); |
| | | |
| | | /** å½ååç»ç»´åº¦çå±ç¤ºåç§° */ |
| | | const groupByLabel = computed( |
| | | () => |
| | | GROUP_BY_OPTIONS.find((opt) => opt.value === groupBy.value)?.label || |
| | | 'åå¸', |
| | | ); |
| | | </script> |
| | | |
| | | <template> |
| | | <Card :title="`${groupByLabel}åå¸`" class="h-full"> |
| | | <template #extra> |
| | | <Select |
| | | v-model:value="groupBy" |
| | | size="small" |
| | | style="width: 120px" |
| | | @change="handleGroupByChange" |
| | | > |
| | | <Select.Option |
| | | v-for="opt in GROUP_BY_OPTIONS" |
| | | :key="opt.value" |
| | | :value="opt.value" |
| | | > |
| | | {{ opt.label }} |
| | | </Select.Option> |
| | | </Select> |
| | | </template> |
| | | <div v-if="hasData" class="relative"> |
| | | <EchartsUI ref="chartRef" class="h-[320px] w-full" /> |
| | | </div> |
| | | <Empty v-else description="ææ æ«ç æ°æ®" class="h-[320px]" /> |
| | | </Card> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { MesTraceConsumerScanApi } from '#/api/mes/trace-consumer-scan'; |
| | | |
| | | import { ref, watch } from 'vue'; |
| | | |
| | | import { CountTo } from '@vben/common-ui'; |
| | | import { IconifyIcon } from '@vben/icons'; |
| | | |
| | | import { Card, Col, Row } from 'ant-design-vue'; |
| | | |
| | | import { getTraceConsumerScanSummary } from '#/api/mes/trace-consumer-scan'; |
| | | |
| | | import { defaultSummary } from '../data'; |
| | | |
| | | defineOptions({ name: 'MesTraceConsumerScanSummaryCards' }); |
| | | |
| | | const props = defineProps<{ |
| | | startTime?: string; |
| | | endTime?: string; |
| | | }>(); |
| | | |
| | | const summary = ref<MesTraceConsumerScanApi.Summary>(defaultSummary); |
| | | |
| | | /** å è½½æ±æ»æ°æ® */ |
| | | async function loadData() { |
| | | summary.value = await getTraceConsumerScanSummary( |
| | | props.startTime, |
| | | props.endTime, |
| | | ); |
| | | } |
| | | |
| | | watch( |
| | | () => [props.startTime, props.endTime], |
| | | () => { |
| | | loadData(); |
| | | }, |
| | | { immediate: true }, |
| | | ); |
| | | </script> |
| | | |
| | | <template> |
| | | <Row :gutter="16"> |
| | | <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4"> |
| | | <Card class="kpi-card"> |
| | | <div class="flex items-center gap-4"> |
| | | <div |
| | | class="flex size-14 flex-shrink-0 items-center justify-center rounded-xl text-white" |
| | | style="background: linear-gradient(135deg, #409eff, #66b1ff)" |
| | | > |
| | | <IconifyIcon class="size-7" icon="lucide:scan-line" /> |
| | | </div> |
| | | <div> |
| | | <div class="text-muted-foreground mb-1 text-sm">æ»è®¿é®æ¬¡æ°</div> |
| | | <CountTo |
| | | class="text-2xl font-bold leading-tight text-[#409eff]" |
| | | :end-val="summary.total" |
| | | :duration="1500" |
| | | /> |
| | | <div class="text-muted-foreground mt-1 text-xs">å
¨é¨æ«ç æ¥è¯¢</div> |
| | | </div> |
| | | </div> |
| | | </Card> |
| | | </Col> |
| | | <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4"> |
| | | <Card class="kpi-card"> |
| | | <div class="flex items-center gap-4"> |
| | | <div |
| | | class="flex size-14 flex-shrink-0 items-center justify-center rounded-xl text-white" |
| | | style="background: linear-gradient(135deg, #67c23a, #85ce61)" |
| | | > |
| | | <IconifyIcon class="size-7" icon="lucide:circle-check" /> |
| | | </div> |
| | | <div> |
| | | <div class="text-muted-foreground mb-1 text-sm">æåæ¥è¯¢</div> |
| | | <CountTo |
| | | class="text-2xl font-bold leading-tight text-[#67c23a]" |
| | | :end-val="summary.success" |
| | | :duration="1500" |
| | | /> |
| | | <div class="text-muted-foreground mt-1 text-xs"> |
| | | 溯æºä¿¡æ¯æåè¿å |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </Card> |
| | | </Col> |
| | | <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4"> |
| | | <Card class="kpi-card"> |
| | | <div class="flex items-center gap-4"> |
| | | <div |
| | | class="flex size-14 flex-shrink-0 items-center justify-center rounded-xl text-white" |
| | | style="background: linear-gradient(135deg, #f56c6c, #f78989)" |
| | | > |
| | | <IconifyIcon class="size-7" icon="lucide:circle-x" /> |
| | | </div> |
| | | <div> |
| | | <div class="text-muted-foreground mb-1 text-sm">失败æ¥è¯¢</div> |
| | | <CountTo |
| | | class="text-2xl font-bold leading-tight text-[#f56c6c]" |
| | | :end-val="summary.failed" |
| | | :duration="1500" |
| | | /> |
| | | <div class="text-muted-foreground mt-1 text-xs">ç ä¸åå¨ææ æ</div> |
| | | </div> |
| | | </div> |
| | | </Card> |
| | | </Col> |
| | | <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4"> |
| | | <Card class="kpi-card"> |
| | | <div class="flex items-center gap-4"> |
| | | <div |
| | | class="flex size-14 flex-shrink-0 items-center justify-center rounded-xl text-white" |
| | | style="background: linear-gradient(135deg, #7c3aed, #9461f5)" |
| | | > |
| | | <IconifyIcon class="size-7" icon="lucide:layers" /> |
| | | </div> |
| | | <div> |
| | | <div class="text-muted-foreground mb-1 text-sm">æ¶åæ¹æ¬¡</div> |
| | | <CountTo |
| | | class="text-2xl font-bold leading-tight text-[#7c3aed]" |
| | | :end-val="summary.uniqueBatchCount" |
| | | :duration="1500" |
| | | /> |
| | | <div class="text-muted-foreground mt-1 text-xs">å»éçäº§æ¹æ¬¡</div> |
| | | </div> |
| | | </div> |
| | | </Card> |
| | | </Col> |
| | | </Row> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { EchartsUIType } from '@vben/plugins/echarts'; |
| | | |
| | | import { ref, watch } from 'vue'; |
| | | |
| | | import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; |
| | | |
| | | import { Card } from 'ant-design-vue'; |
| | | |
| | | import { getTraceConsumerScanTrend } from '#/api/mes/trace-consumer-scan'; |
| | | |
| | | import { getScanTrendChartOptions } from '../chart-options'; |
| | | |
| | | defineOptions({ name: 'MesTraceConsumerScanTrendChart' }); |
| | | |
| | | const props = defineProps<{ |
| | | startTime?: string; |
| | | endTime?: string; |
| | | }>(); |
| | | |
| | | const chartRef = ref<EchartsUIType>(); |
| | | const { renderEcharts } = useEcharts(chartRef); |
| | | |
| | | /** å è½½è¶å¿æ°æ®å¹¶æ¸²ææçº¿å¾ */ |
| | | async function loadData() { |
| | | const data = await getTraceConsumerScanTrend(props.startTime, props.endTime); |
| | | const dates = data.map((d) => d.date.slice(5)); // yyyy-MM-dd -> MM-dd |
| | | const totals = data.map((d) => d.total); |
| | | const success = data.map((d) => d.success); |
| | | const failed = data.map((d) => d.failed); |
| | | await renderEcharts(getScanTrendChartOptions(dates, totals, success, failed)); |
| | | } |
| | | |
| | | watch( |
| | | () => [props.startTime, props.endTime], |
| | | () => { |
| | | loadData(); |
| | | }, |
| | | { immediate: true }, |
| | | ); |
| | | </script> |
| | | |
| | | <template> |
| | | <Card title="æ«ç 访é®è¶å¿" class="h-full"> |
| | | <EchartsUI ref="chartRef" class="h-[320px] w-full" /> |
| | | </Card> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesTraceCrossRegionApi } from '#/api/mes/trace/crossregion'; |
| | | |
| | | import { getRangePickerDefaultProps } from '#/utils'; |
| | | |
| | | /** é¢è¦ç±»åé项 */ |
| | | export const WARNING_TYPE_OPTIONS = [ |
| | | { label: 'è·¨ççªè´§', value: 'CROSS_PROVINCE' }, |
| | | { label: 'è·¨å¸çªè´§', value: 'CROSS_CITY' }, |
| | | ]; |
| | | |
| | | /** é¢è¦ç¶æé项 */ |
| | | export const WARNING_STATUS_OPTIONS = [ |
| | | { label: 'å¾
å¤ç', value: 10 }, |
| | | { label: 'å·²å¤ç', value: 20 }, |
| | | { label: '误æ¥', value: 30 }, |
| | | ]; |
| | | |
| | | /** å¤å®ç²åº¦é项 */ |
| | | export const WARNING_LEVEL_OPTIONS = [ |
| | | { label: 'è·¨çå¤å®', value: 'PROVINCE' }, |
| | | { label: 'è·¨å¸å¤å®', value: 'CITY' }, |
| | | ]; |
| | | |
| | | /** å表çæç´¢è¡¨å */ |
| | | export function useGridFormSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'status', |
| | | label: 'ç¶æ', |
| | | component: 'Select', |
| | | componentProps: { |
| | | allowClear: true, |
| | | options: WARNING_STATUS_OPTIONS, |
| | | placeholder: 'è¯·éæ©ç¶æ', |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'warningType', |
| | | label: 'é¢è¦ç±»å', |
| | | component: 'Select', |
| | | componentProps: { |
| | | allowClear: true, |
| | | options: WARNING_TYPE_OPTIONS, |
| | | placeholder: 'è¯·éæ©é¢è¦ç±»å', |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'batchCode', |
| | | label: 'æ¹æ¬¡å·', |
| | | component: 'Input', |
| | | componentProps: { |
| | | allowClear: true, |
| | | placeholder: '请è¾å
¥æ¹æ¬¡å·', |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'bagCode', |
| | | label: 'è¢ç ', |
| | | component: 'Input', |
| | | componentProps: { |
| | | allowClear: true, |
| | | placeholder: '请è¾å
¥è¢ç ', |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'clientName', |
| | | label: 'ç»éå', |
| | | component: 'Input', |
| | | componentProps: { |
| | | allowClear: true, |
| | | placeholder: '请è¾å
¥ç»éååç§°', |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'eventTime', |
| | | label: 'é¢è¦æ¶é´', |
| | | component: 'RangePicker', |
| | | componentProps: { |
| | | ...getRangePickerDefaultProps(), |
| | | allowClear: true, |
| | | }, |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | /** å表çåæ®µ */ |
| | | export function useGridColumns(): VxeTableGridOptions<MesTraceCrossRegionApi.Warning>['columns'] { |
| | | return [ |
| | | { |
| | | field: 'warningNo', |
| | | title: 'é¢è¦ç¼å·', |
| | | fixed: 'left', |
| | | minWidth: 190, |
| | | }, |
| | | { |
| | | field: 'bagCode', |
| | | title: 'è¢ç ', |
| | | minWidth: 150, |
| | | slots: { default: 'bagCode' }, |
| | | }, |
| | | { |
| | | field: 'batchCode', |
| | | title: 'æ¹æ¬¡å·', |
| | | minWidth: 190, |
| | | }, |
| | | { |
| | | field: 'itemName', |
| | | title: 'ç©æåç§°', |
| | | minWidth: 120, |
| | | }, |
| | | { |
| | | field: 'salesCode', |
| | | title: 'åºåºåå·', |
| | | minWidth: 150, |
| | | }, |
| | | { |
| | | field: 'clientName', |
| | | title: 'ç»éå', |
| | | minWidth: 120, |
| | | }, |
| | | { |
| | | field: 'dealerProvince', |
| | | title: 'ç»éåå°åº', |
| | | minWidth: 130, |
| | | slots: { default: 'dealerRegion' }, |
| | | }, |
| | | { |
| | | field: 'scanProvince', |
| | | title: 'æ«ç å°åº', |
| | | minWidth: 130, |
| | | slots: { default: 'scanRegion' }, |
| | | }, |
| | | { |
| | | field: 'warningTypeName', |
| | | title: 'é¢è¦ç±»å', |
| | | width: 110, |
| | | slots: { default: 'warningType' }, |
| | | }, |
| | | { |
| | | field: 'statusName', |
| | | title: 'ç¶æ', |
| | | width: 90, |
| | | slots: { default: 'status' }, |
| | | }, |
| | | { |
| | | field: 'eventTime', |
| | | title: 'é¢è¦æ¶é´', |
| | | width: 170, |
| | | formatter: 'formatDateTime', |
| | | }, |
| | | { |
| | | field: 'handleUserName', |
| | | title: 'å¤ç人', |
| | | width: 90, |
| | | }, |
| | | { |
| | | title: 'æä½', |
| | | width: 120, |
| | | fixed: 'right', |
| | | slots: { default: 'actions' }, |
| | | }, |
| | | ]; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesTraceCrossRegionApi } from '#/api/mes/trace/crossregion'; |
| | | |
| | | import { gsap } from 'gsap'; |
| | | |
| | | import { nextTick, onMounted, onUnmounted, ref } from 'vue'; |
| | | |
| | | import { useAccess } from '@vben/access'; |
| | | import { CountTo, Page } from '@vben/common-ui'; |
| | | import { IconifyIcon } from '@vben/icons'; |
| | | |
| | | import { |
| | | Card, |
| | | Col, |
| | | message, |
| | | Modal, |
| | | Row, |
| | | Segmented, |
| | | Skeleton, |
| | | Tag, |
| | | } from 'ant-design-vue'; |
| | | |
| | | import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; |
| | | import { |
| | | getTraceCrossRegionConfig, |
| | | getTraceCrossRegionPage, |
| | | getTraceCrossRegionSummary, |
| | | handleTraceCrossRegion, |
| | | updateTraceCrossRegionConfig, |
| | | } from '#/api/mes/trace/crossregion'; |
| | | |
| | | import { |
| | | WARNING_LEVEL_OPTIONS, |
| | | useGridColumns, |
| | | useGridFormSchema, |
| | | } from './data'; |
| | | |
| | | defineOptions({ name: 'MesTraceCrossRegion' }); |
| | | |
| | | const { hasAccessByCodes } = useAccess(); |
| | | const canHandle = hasAccessByCodes(['mes:trace-cross-region:handle']); |
| | | |
| | | /** æ±æ»æ°æ® */ |
| | | const summary = ref<MesTraceCrossRegionApi.Summary>({}); |
| | | const summaryLoading = ref(false); |
| | | |
| | | /** å¤å®ç²åº¦é
ç½® */ |
| | | const warningLevel = ref('PROVINCE'); |
| | | |
| | | /** å¤çå¼¹çªç¶æ */ |
| | | const handleVisible = ref(false); |
| | | const handleLoading = ref(false); |
| | | |
| | | /** GSAP å
¥åºå¨ç»ä¸ä¸æï¼å¸è½½æ¶èªå¨è¿åï¼ */ |
| | | let animationContext: gsap.Context | undefined; |
| | | const handleForm = ref<{ |
| | | id?: number; |
| | | status: number; |
| | | handleRemark?: string; |
| | | }>({ |
| | | id: undefined, |
| | | status: 20, |
| | | handleRemark: '', |
| | | }); |
| | | |
| | | /** æ±æ»å¡çé
ç½® */ |
| | | const summaryCards = [ |
| | | { |
| | | label: 'é¢è¦æ»æ°', |
| | | value: 'total', |
| | | icon: 'lucide:alert-triangle', |
| | | color: '#409eff', |
| | | bg: 'linear-gradient(135deg, #409eff, #66b1ff)', |
| | | }, |
| | | { |
| | | label: 'å¾
å¤ç', |
| | | value: 'pending', |
| | | icon: 'lucide:clock', |
| | | color: '#e6a23c', |
| | | bg: 'linear-gradient(135deg, #e6a23c, #ebb563)', |
| | | }, |
| | | { |
| | | label: 'å·²å¤ç', |
| | | value: 'handled', |
| | | icon: 'lucide:circle-check', |
| | | color: '#67c23a', |
| | | bg: 'linear-gradient(135deg, #67c23a, #85ce61)', |
| | | }, |
| | | { |
| | | label: '误æ¥', |
| | | value: 'falseAlarm', |
| | | icon: 'lucide:shield-x', |
| | | color: '#909399', |
| | | bg: 'linear-gradient(135deg, #909399, #b1b3b8)', |
| | | }, |
| | | { |
| | | label: 'è·¨ççªè´§', |
| | | value: 'crossProvince', |
| | | icon: 'lucide:map-pin-off', |
| | | color: '#f56c6c', |
| | | bg: 'linear-gradient(135deg, #f56c6c, #f78989)', |
| | | }, |
| | | { |
| | | label: 'è·¨å¸çªè´§', |
| | | value: 'crossCity', |
| | | icon: 'lucide:map-pin', |
| | | color: '#7c3aed', |
| | | bg: 'linear-gradient(135deg, #7c3aed, #9461f5)', |
| | | }, |
| | | ]; |
| | | |
| | | /** å è½½æ±æ» */ |
| | | async function loadSummary() { |
| | | summaryLoading.value = true; |
| | | try { |
| | | summary.value = await getTraceCrossRegionSummary(); |
| | | } finally { |
| | | summaryLoading.value = false; |
| | | } |
| | | } |
| | | |
| | | /** å è½½å¤å®ç²åº¦é
ç½® */ |
| | | async function loadConfig() { |
| | | const config = await getTraceCrossRegionConfig(); |
| | | warningLevel.value = config.warningLevel || 'PROVINCE'; |
| | | } |
| | | |
| | | /** 忢å¤å®ç²åº¦ */ |
| | | async function handleLevelChange(value: string | number) { |
| | | try { |
| | | const level = String(value); |
| | | await updateTraceCrossRegionConfig(level); |
| | | message.success( |
| | | `å¤å®ç²åº¦å·²åæ¢ä¸º${ |
| | | WARNING_LEVEL_OPTIONS.find((opt) => opt.value === level)?.label |
| | | }`, |
| | | ); |
| | | } catch { |
| | | loadConfig(); |
| | | } |
| | | } |
| | | |
| | | /** æå¼å¤çå¼¹çª */ |
| | | function openHandle(row: MesTraceCrossRegionApi.Warning) { |
| | | handleForm.value = { id: row.id, status: 20, handleRemark: '' }; |
| | | handleVisible.value = true; |
| | | } |
| | | |
| | | /** æäº¤å¤ç */ |
| | | async function submitHandle() { |
| | | if (!handleForm.value.id || handleLoading.value) return; |
| | | handleLoading.value = true; |
| | | try { |
| | | await handleTraceCrossRegion({ |
| | | id: handleForm.value.id, |
| | | status: handleForm.value.status, |
| | | handleRemark: handleForm.value.handleRemark, |
| | | }); |
| | | message.success('é¢è¦å·²å¤ç'); |
| | | handleVisible.value = false; |
| | | handleRefresh(); |
| | | } catch { |
| | | message.error('å¤ç失败ï¼è¯·éè¯'); |
| | | } finally { |
| | | handleLoading.value = false; |
| | | } |
| | | } |
| | | |
| | | /** å·æ°åè¡¨ä¸æ±æ» */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | loadSummary(); |
| | | } |
| | | |
| | | /** å±ç¤ºå°åºç»å */ |
| | | function regionText(province?: string, city?: string) { |
| | | return [province, city].filter(Boolean).join('·') || '-'; |
| | | } |
| | | |
| | | const [Grid, gridApi] = useVbenVxeGrid({ |
| | | formOptions: { |
| | | schema: useGridFormSchema(), |
| | | }, |
| | | gridOptions: { |
| | | columns: useGridColumns(), |
| | | height: 'auto', |
| | | keepSource: true, |
| | | proxyConfig: { |
| | | ajax: { |
| | | query: async ({ page }, formValues) => { |
| | | return await getTraceCrossRegionPage({ |
| | | pageNo: page.currentPage, |
| | | pageSize: page.pageSize, |
| | | ...formValues, |
| | | }); |
| | | }, |
| | | }, |
| | | }, |
| | | rowConfig: { |
| | | keyField: 'id', |
| | | isHover: true, |
| | | }, |
| | | toolbarConfig: { |
| | | refresh: true, |
| | | search: true, |
| | | }, |
| | | } as VxeTableGridOptions<MesTraceCrossRegionApi.Warning>, |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | loadSummary(); |
| | | loadConfig(); |
| | | initEntranceAnimation(); |
| | | }); |
| | | |
| | | /** å
¥åºå¨ç»ï¼å°é prefers-reduced-motion */ |
| | | async function initEntranceAnimation() { |
| | | await nextTick(); |
| | | animationContext = gsap.context(() => { |
| | | const reduceMotion = window.matchMedia( |
| | | '(prefers-reduced-motion: reduce)', |
| | | ).matches; |
| | | gsap.from('.mes-cr-summary, .mes-cr-grid', { |
| | | autoAlpha: reduceMotion ? 1 : 0, |
| | | y: reduceMotion ? 0 : 14, |
| | | duration: reduceMotion ? 0 : 0.45, |
| | | stagger: reduceMotion ? 0 : 0.08, |
| | | ease: 'power2.out', |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | onUnmounted(() => { |
| | | animationContext?.revert(); |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <Card class="mes-cr-summary mb-4"> |
| | | <template #title> |
| | | <div class="flex items-center justify-between"> |
| | | <span>çªè´§é¢è¦</span> |
| | | <span class="flex items-center gap-2 text-sm"> |
| | | <span class="text-muted-foreground">å¤å®ç²åº¦</span> |
| | | <Segmented |
| | | v-model:value="warningLevel" |
| | | :disabled="!canHandle" |
| | | :options="WARNING_LEVEL_OPTIONS" |
| | | @change="handleLevelChange" |
| | | /> |
| | | </span> |
| | | </div> |
| | | </template> |
| | | <Row :gutter="16"> |
| | | <Col |
| | | v-for="card in summaryCards" |
| | | :key="card.value" |
| | | :lg="4" |
| | | :md="8" |
| | | :sm="12" |
| | | :xs="24" |
| | | class="mb-4" |
| | | > |
| | | <Card class="kpi-card"> |
| | | <div class="flex items-center gap-4"> |
| | | <div |
| | | class="flex size-14 flex-shrink-0 items-center justify-center rounded-xl text-white" |
| | | :style="{ background: card.bg }" |
| | | > |
| | | <IconifyIcon class="size-7" :icon="card.icon" /> |
| | | </div> |
| | | <div> |
| | | <div class="text-muted-foreground mb-1 text-sm"> |
| | | {{ card.label }} |
| | | </div> |
| | | <Skeleton.Input |
| | | v-if="summaryLoading" |
| | | :size="'small'" |
| | | active |
| | | style="width: 4rem" |
| | | /> |
| | | <CountTo |
| | | v-else |
| | | class="text-2xl font-bold leading-tight" |
| | | :style="{ color: card.color }" |
| | | :end-val="summary[card.value] || 0" |
| | | :duration="1200" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </Card> |
| | | </Col> |
| | | </Row> |
| | | </Card> |
| | | |
| | | <Grid class="mes-cr-grid" table-title="çªè´§é¢è¦å表"> |
| | | <template #bagCode="{ row }"> |
| | | <Tag v-if="row.bagCode" color="blue">{{ row.bagCode }}</Tag> |
| | | <Tag v-else-if="row.palletCode" color="purple"> |
| | | {{ row.palletCode }} |
| | | </Tag> |
| | | <span v-else>-</span> |
| | | </template> |
| | | <template #dealerRegion="{ row }"> |
| | | {{ regionText(row.dealerProvince, row.dealerCity) }} |
| | | </template> |
| | | <template #scanRegion="{ row }"> |
| | | <span class="text-[#dc2626] font-medium"> |
| | | {{ regionText(row.scanProvince, row.scanCity) }} |
| | | </span> |
| | | </template> |
| | | <template #warningType="{ row }"> |
| | | <Tag |
| | | :color="row.warningType === 'CROSS_PROVINCE' ? 'red' : 'orange'" |
| | | > |
| | | {{ row.warningTypeName }} |
| | | </Tag> |
| | | </template> |
| | | <template #status="{ row }"> |
| | | <Tag |
| | | :color=" |
| | | row.status === 10 |
| | | ? 'orange' |
| | | : row.status === 20 |
| | | ? 'green' |
| | | : 'default' |
| | | " |
| | | > |
| | | {{ row.statusName }} |
| | | </Tag> |
| | | </template> |
| | | <template #actions="{ row }"> |
| | | <TableAction |
| | | :actions="[ |
| | | { |
| | | label: 'å¤ç', |
| | | type: 'link', |
| | | icon: ACTION_ICON.EDIT, |
| | | auth: ['mes:trace-cross-region:handle'], |
| | | ifShow: row.status === 10, |
| | | onClick: openHandle.bind(null, row), |
| | | }, |
| | | ]" |
| | | /> |
| | | </template> |
| | | </Grid> |
| | | |
| | | <Modal |
| | | v-model:open="handleVisible" |
| | | title="å¤ççªè´§é¢è¦" |
| | | :confirm-loading="handleLoading" |
| | | ok-text="确认å¤ç" |
| | | cancel-text="åæ¶" |
| | | @ok="submitHandle" |
| | | > |
| | | <a-form layout="vertical"> |
| | | <a-form-item label="å¤çç»æ"> |
| | | <a-radio-group v-model:value="handleForm.status"> |
| | | <a-radio :value="20">å·²å¤ç</a-radio> |
| | | <a-radio :value="30">误æ¥</a-radio> |
| | | </a-radio-group> |
| | | </a-form-item> |
| | | <a-form-item label="å¤ç夿³¨"> |
| | | <a-textarea |
| | | v-model:value="handleForm.handleRemark" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥å¤ç夿³¨ï¼å¦ï¼ç¡®è®¤ä¸ºç©æµä¸è½¬ï¼" |
| | | /> |
| | | </a-form-item> |
| | | </a-form> |
| | | </Modal> |
| | | </Page> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesTraceIntegrityApi } from '#/api/mes/trace/integrity'; |
| | | |
| | | /** ä¸å¡ç±»åé项 */ |
| | | export const BIZ_TYPE_OPTIONS = [ |
| | | { label: 'çäº§æ¹æ¬¡', value: 'BATCH' }, |
| | | { label: 'éå®åºåº', value: 'SALES' }, |
| | | { label: 'æ¶è´¹è
æ«ç ', value: 'SCAN' }, |
| | | ]; |
| | | |
| | | /** ä¸å¡ç±»å䏿å */ |
| | | export function getBizTypeLabel(bizType?: string): string { |
| | | return ( |
| | | BIZ_TYPE_OPTIONS.find((opt) => opt.value === bizType)?.label || bizType || '-' |
| | | ); |
| | | } |
| | | |
| | | /** å表çæç´¢è¡¨å */ |
| | | export function useGridFormSchema(): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | fieldName: 'bizType', |
| | | label: 'ä¸å¡ç±»å', |
| | | component: 'Select', |
| | | componentProps: { |
| | | allowClear: true, |
| | | options: BIZ_TYPE_OPTIONS, |
| | | placeholder: 'è¯·éæ©ä¸å¡ç±»å', |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'bizCode', |
| | | label: 'ä¸å¡ç¼ç ', |
| | | component: 'Input', |
| | | componentProps: { |
| | | allowClear: true, |
| | | placeholder: '请è¾å
¥æ¹æ¬¡å·/åºåºåå·/追溯ç ', |
| | | }, |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | | /** å表çåæ®µ */ |
| | | export function useGridColumns(): VxeTableGridOptions<MesTraceIntegrityApi.Record>['columns'] { |
| | | return [ |
| | | { |
| | | field: 'bizType', |
| | | title: 'ä¸å¡ç±»å', |
| | | width: 110, |
| | | slots: { default: 'bizType' }, |
| | | }, |
| | | { |
| | | field: 'bizId', |
| | | title: 'ä¸å¡ç¼å·', |
| | | width: 110, |
| | | }, |
| | | { |
| | | field: 'bizCode', |
| | | title: 'ä¸å¡ç¼ç ', |
| | | minWidth: 220, |
| | | }, |
| | | { |
| | | field: 'contentHash', |
| | | title: 'å
容æè¦', |
| | | minWidth: 300, |
| | | slots: { default: 'contentHash' }, |
| | | }, |
| | | { |
| | | field: 'eventTime', |
| | | title: 'æè¦çææ¶é´', |
| | | width: 170, |
| | | formatter: 'formatDateTime', |
| | | }, |
| | | ]; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { MesTraceIntegrityApi } from '#/api/mes/trace/integrity'; |
| | | |
| | | import { gsap } from 'gsap'; |
| | | |
| | | import { nextTick, onMounted, onUnmounted, ref, watch } from 'vue'; |
| | | |
| | | import { Page } from '@vben/common-ui'; |
| | | import { IconifyIcon } from '@vben/icons'; |
| | | |
| | | import { |
| | | Button, |
| | | Card, |
| | | InputNumber, |
| | | message, |
| | | Select, |
| | | Tag, |
| | | } from 'ant-design-vue'; |
| | | |
| | | import { useVbenVxeGrid } from '#/adapter/vxe-table'; |
| | | import { |
| | | getTraceIntegrityPage, |
| | | verifyTraceIntegrity, |
| | | } from '#/api/mes/trace/integrity'; |
| | | |
| | | import { BIZ_TYPE_OPTIONS, getBizTypeLabel, useGridColumns, useGridFormSchema } from './data'; |
| | | |
| | | defineOptions({ name: 'MesTraceIntegrity' }); |
| | | |
| | | /** æ ¡éªè¾å
¥ */ |
| | | const verifyBizType = ref('BATCH'); |
| | | const verifyBizId = ref<number>(); |
| | | const verifyLoading = ref(false); |
| | | |
| | | /** æ ¡éªç»æ */ |
| | | const verifyResult = ref<MesTraceIntegrityApi.VerifyResult>(); |
| | | |
| | | /** GSAP å
¥åºå¨ç»ä¸ä¸æï¼å¸è½½æ¶èªå¨è¿åï¼ */ |
| | | let animationContext: gsap.Context | undefined; |
| | | let resultTween: gsap.core.Tween | undefined; |
| | | |
| | | /** æ§è¡æ ¡éª */ |
| | | async function handleVerify() { |
| | | if (!verifyBizId.value) { |
| | | message.warning('请è¾å
¥ä¸å¡è®°å½ç¼å·'); |
| | | return; |
| | | } |
| | | if (verifyLoading.value) return; |
| | | verifyLoading.value = true; |
| | | try { |
| | | verifyResult.value = await verifyTraceIntegrity( |
| | | verifyBizType.value, |
| | | verifyBizId.value, |
| | | ); |
| | | } catch { |
| | | message.error('æ ¡éªå¤±è´¥ï¼è¯·ç¨åéè¯'); |
| | | } finally { |
| | | verifyLoading.value = false; |
| | | } |
| | | } |
| | | |
| | | onMounted(async () => { |
| | | await nextTick(); |
| | | animationContext = gsap.context(() => { |
| | | const reduceMotion = window.matchMedia( |
| | | '(prefers-reduced-motion: reduce)', |
| | | ).matches; |
| | | gsap.from('.mes-it-verify, .mes-it-grid', { |
| | | autoAlpha: reduceMotion ? 1 : 0, |
| | | y: reduceMotion ? 0 : 14, |
| | | duration: reduceMotion ? 0 : 0.45, |
| | | stagger: reduceMotion ? 0 : 0.08, |
| | | ease: 'power2.out', |
| | | }); |
| | | }); |
| | | }); |
| | | |
| | | onUnmounted(() => { |
| | | resultTween?.kill(); |
| | | animationContext?.revert(); |
| | | }); |
| | | |
| | | /** æ ¡éªç»æå¡çåºç°æ¶çè½»éå
¥åº */ |
| | | watch(verifyResult, async (result) => { |
| | | if (!result) return; |
| | | await nextTick(); |
| | | resultTween?.kill(); |
| | | resultTween = gsap.from('.mes-it-result', { |
| | | autoAlpha: 0, |
| | | y: 8, |
| | | duration: 0.35, |
| | | ease: 'power2.out', |
| | | }); |
| | | }); |
| | | |
| | | const [Grid, gridApi] = useVbenVxeGrid({ |
| | | formOptions: { |
| | | schema: useGridFormSchema(), |
| | | }, |
| | | gridOptions: { |
| | | columns: useGridColumns(), |
| | | height: 'auto', |
| | | keepSource: true, |
| | | proxyConfig: { |
| | | ajax: { |
| | | query: async ({ page }, formValues) => { |
| | | return await getTraceIntegrityPage({ |
| | | pageNo: page.currentPage, |
| | | pageSize: page.pageSize, |
| | | ...formValues, |
| | | }); |
| | | }, |
| | | }, |
| | | }, |
| | | rowConfig: { |
| | | keyField: 'id', |
| | | isHover: true, |
| | | }, |
| | | toolbarConfig: { |
| | | refresh: true, |
| | | search: true, |
| | | }, |
| | | } as VxeTableGridOptions<MesTraceIntegrityApi.Record>, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <Card title="æ°æ®å®æ´æ§æ ¡éª" class="mes-it-verify mb-4"> |
| | | <div class="flex flex-wrap items-center gap-3"> |
| | | <span class="text-muted-foreground text-sm">ä¸å¡ç±»å</span> |
| | | <Select |
| | | v-model:value="verifyBizType" |
| | | :options="BIZ_TYPE_OPTIONS" |
| | | class="w-40" |
| | | placeholder="è¯·éæ©ä¸å¡ç±»å" |
| | | /> |
| | | <span class="text-muted-foreground text-sm">ä¸å¡ç¼å·</span> |
| | | <InputNumber |
| | | v-model:value="verifyBizId" |
| | | class="w-48" |
| | | :min="1" |
| | | :precision="0" |
| | | placeholder="请è¾å
¥ä¸å¡è®°å½ç¼å·" |
| | | @press-enter="handleVerify" |
| | | /> |
| | | <Button |
| | | v-access:code="['mes:trace-integrity:verify']" |
| | | type="primary" |
| | | :loading="verifyLoading" |
| | | @click="handleVerify" |
| | | > |
| | | åèµ·æ ¡éª |
| | | </Button> |
| | | </div> |
| | | |
| | | <div |
| | | v-if="verifyResult" |
| | | class="mes-it-result mt-4 rounded-lg border border-dashed p-4" |
| | | :class=" |
| | | verifyResult.matched |
| | | ? 'border-[#67c23a] bg-[#67c23a]/5' |
| | | : 'border-[#f56c6c] bg-[#f56c6c]/5' |
| | | " |
| | | > |
| | | <div class="flex items-center gap-2"> |
| | | <IconifyIcon |
| | | class="size-6" |
| | | :class=" |
| | | verifyResult.matched ? 'text-[#67c23a]' : 'text-[#f56c6c]' |
| | | " |
| | | :icon=" |
| | | verifyResult.matched ? 'lucide:circle-check' : 'lucide:circle-x' |
| | | " |
| | | /> |
| | | <span class="text-base font-bold"> |
| | | {{ verifyResult.matched ? 'æ ¡éªéè¿' : 'æ ¡éªä¸éè¿' }} |
| | | </span> |
| | | <span class="text-muted-foreground ml-2 text-sm"> |
| | | {{ verifyResult.message }} |
| | | </span> |
| | | </div> |
| | | <div class="mt-3 grid gap-3 text-sm md:grid-cols-2"> |
| | | <div class="min-w-0"> |
| | | <div class="text-muted-foreground mb-1">ä¸å¡ä¿¡æ¯</div> |
| | | <div class="break-all"> |
| | | {{ getBizTypeLabel(verifyResult.bizType) }} |
| | | <span class="text-muted-foreground">#{{ verifyResult.bizId }}</span> |
| | | <Tag v-if="verifyResult.bizCode" class="ml-1"> |
| | | {{ verifyResult.bizCode }} |
| | | </Tag> |
| | | </div> |
| | | </div> |
| | | <div class="min-w-0"> |
| | | <div class="text-muted-foreground mb-1">å卿è¦ï¼SHA-256ï¼</div> |
| | | <div class="break-all font-mono text-xs"> |
| | | {{ verifyResult.storedHash }} |
| | | </div> |
| | | </div> |
| | | <div class="min-w-0"> |
| | | <div class="text-muted-foreground mb-1">å½åæè¦ï¼SHA-256ï¼</div> |
| | | <div |
| | | class="break-all font-mono text-xs" |
| | | :class="verifyResult.matched ? '' : 'text-[#f56c6c]'" |
| | | > |
| | | {{ verifyResult.currentHash }} |
| | | </div> |
| | | </div> |
| | | <div v-if="verifyResult.bagSetHash" class="min-w-0"> |
| | | <div class="text-muted-foreground mb-1">è¢ç éåæè¦</div> |
| | | <div class="break-all font-mono text-xs"> |
| | | {{ verifyResult.bagSetHash }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </Card> |
| | | |
| | | <Grid class="mes-it-grid" table-title="宿´æ§è®°å½å表"> |
| | | <template #bizType="{ row }"> |
| | | <Tag color="blue">{{ getBizTypeLabel(row.bizType) }}</Tag> |
| | | </template> |
| | | <template #contentHash="{ row }"> |
| | | <span class="font-mono text-xs">{{ row.contentHash }}</span> |
| | | </template> |
| | | </Grid> |
| | | </Page> |
| | | </template> |