diff --git a/.env.dev b/.env.dev index 2008a002..0223c318 100644 --- a/.env.dev +++ b/.env.dev @@ -1,34 +1,22 @@ -# 开发环境:本地只启动前端项目,依赖开发环境(后端、APP) NODE_ENV=production VITE_DEV=true -# 请求路径 -VITE_BASE_URL='http://api-dashboard.yudao.iocoder.cn' +VITE_BASE_URL=' ' -# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 VITE_UPLOAD_TYPE=server +VITE_UPLOAD_URL='/admin-api/infra/file/upload' -# 接口地址 VITE_API_URL=/admin-api -# 是否删除debugger VITE_DROP_DEBUGGER=false - -# 是否删除console.log VITE_DROP_CONSOLE=false - -# 是否sourcemap VITE_SOURCEMAP=true -# 打包路径 VITE_BASE_PATH=/ -# 输出路径 VITE_OUT_DIR=dist -# 商城H5会员端域名 VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' -# 验证码的开关 -VITE_APP_CAPTCHA_ENABLE=true +VITE_APP_CAPTCHA_ENABLE=false \ No newline at end of file diff --git a/.env.local b/.env.local index 9bd18842..59edd6e3 100644 --- a/.env.local +++ b/.env.local @@ -8,8 +8,9 @@ VITE_DEV=true # 线上环境 # VITE_BASE_URL='https://besure.ngsk.tech:7001' # 本地联调 -# VITE_BASE_URL='http://192.168.5.107:48081' -VITE_BASE_URL='http://localhost:48081' +VITE_BASE_URL='http://192.168.5.106:48081' +# VITE_BASE_URL='http://192.168.5.164:48081' +# VITE_BASE_URL='http://192.168.5.5:48081' # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务 diff --git a/.gitignore b/.gitignore index 162d1dfa..8d47b60d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,7 @@ auto-*.d.ts .history pnpm-lock.yaml /.vscode +.env.cklocal +.vscode/* +.vscode/settings.json +launch.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index e4ec7cd1..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "typescript.tsdk": "node_modules/typescript/lib", - "npm.packageManager": "pnpm", - "editor.tabSize": 2, - "prettier.printWidth": 100, // 超过最大值换行 - "editor.defaultFormatter": "esbenp.prettier-vscode", - "files.eol": "\n", - "search.exclude": { - "**/node_modules": true, - "**/*.log": true, - "**/*.log*": true, - "**/bower_components": true, - "**/dist": true, - "**/elehukouben": true, - "**/.git": true, - "**/.gitignore": true, - "**/.svn": true, - "**/.DS_Store": true, - "**/.idea": true, - "**/.vscode": false, - "**/yarn.lock": true, - "**/tmp": true, - "out": true, - "dist": true, - "node_modules": true, - "CHANGELOG.md": true, - "examples": true, - "res": true, - "screenshots": true, - "yarn-error.log": true, - "**/.yarn": true - }, - "files.exclude": { - "**/.cache": true, - "**/.editorconfig": true, - "**/.eslintcache": true, - "**/bower_components": true, - "**/.idea": true, - "**/tmp": true, - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/CVS": true, - "**/.DS_Store": true - }, - "files.watcherExclude": { - "**/.git/objects/**": true, - "**/.git/subtree-cache/**": true, - "**/.vscode/**": true, - "**/node_modules/**": true, - "**/tmp/**": true, - "**/bower_components/**": true, - "**/dist/**": true, - "**/yarn.lock": true - }, - "stylelint.enable": true, - "stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"], - "path-intellisense.mappings": { - "@/": "${workspaceRoot}/src" - }, - "[javascriptreact]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[typescript]": { - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" - }, - "[typescriptreact]": { - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" - }, - "[html]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[css]": { - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" - }, - "[less]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[scss]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[markdown]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - }, - "[vue]": { - "editor.defaultFormatter": "Vue.volar" - }, - "i18n-ally.localesPaths": ["src/locales"], - "i18n-ally.keystyle": "nested", - "i18n-ally.sortKeys": true, - "i18n-ally.namespace": false, - "i18n-ally.enabledParsers": ["ts"], - "i18n-ally.sourceLanguage": "en", - "i18n-ally.displayLanguage": "zh-CN", - "i18n-ally.enabledFrameworks": ["vue", "react"], - "cSpell.words": [ - "brotli", - "browserslist", - "codemirror", - "commitlint", - "cropperjs", - "echart", - "echarts", - "esnext", - "esno", - "iconify", - "INTLIFY", - "lintstagedrc", - "logicflow", - "nprogress", - "pinia", - "pnpm", - "qrcode", - "sider", - "sortablejs", - "stylelint", - "svgs", - "unocss", - "unplugin", - "unref", - "videojs", - "VITE", - "vitejs", - "vueuse", - "wangeditor", - "xingyu", - "yudao", - "zxcvbn" - ], - // 控制相关文件嵌套展示 - "explorer.fileNesting.enabled": true, - "explorer.fileNesting.expand": false, - "explorer.fileNesting.patterns": { - "*.ts": "$(capture).test.ts, $(capture).test.tsx", - "*.tsx": "$(capture).test.ts, $(capture).test.tsx", - "*.env": "$(capture).env.*", - "package.json": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.eslintrc-auto-import.json,.gitignore,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore" - }, - "terminal.integrated.scrollback": 10000, - "nuxt.isNuxtApp": false -} diff --git a/Dockerfile b/Dockerfile index e00fe98d..2d223969 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,16 @@ # 使用轻量级的 Nginx 镜像 FROM nginx:alpine -# 复制自定义 Nginx 配置(如果有) +ARG NGINX_CONF=nginx.conf + RUN rm -f /etc/nginx/conf.d/default.conf -COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY ${NGINX_CONF} /etc/nginx/conf.d/default.conf -# 将本地 dist 目录复制到容器中 COPY dist /usr/share/nginx/html -# 暴露 8088 端口 EXPOSE 8088 + # 创建启动脚本 RUN echo -e '#!/bin/sh\n\ echo "Waiting for MySQL/Redis/MinIO to start..."\n\ diff --git a/nginx-dev.conf b/nginx-dev.conf new file mode 100644 index 00000000..b381c654 --- /dev/null +++ b/nginx-dev.conf @@ -0,0 +1,130 @@ +server { + listen 8088; + server_name localhost; + + # 允许上传最大100MB + client_max_body_size 100m; + + # ========================= + # 后端接口代理(DEV) + # ========================= + + location /admin-api/ { + proxy_pass http://besure_server_dev:48081; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + location /api/ { + proxy_pass http://besure_server_dev:48081; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + location /jmreport/ { + proxy_pass http://besure_server_dev:48081; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + location /v3/api-docs/ { + proxy_pass http://besure_server_dev:48081; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + location /doc.html { + proxy_pass http://besure_server_dev:48081; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + location /swagger-ui/ { + proxy_pass http://besure_server_dev:48081; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location /webjars/ { + proxy_pass http://besure_server_dev:48081; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location ~ /v3/api-docs/.*\.json$ { + proxy_pass http://besure_server_dev:48081; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + # ========================= + # 前端静态页面 + # ========================= + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + + try_files $uri $uri/ /index.html; + } + + # ========================= + # 错误页 + # ========================= + + error_page 500 502 503 504 /50x.html; + + location = /50x.html { + root /usr/share/nginx/html; + } +} + +# ========================= +# FRP / 转发代理 +# ========================= + +server { + listen 39002; + server_name localhost; + + location /besure/ { + proxy_pass http://ngsk.tech:39001/; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_http_version 1.1; + proxy_buffering off; + } +} \ No newline at end of file diff --git a/package.json b/package.json index e80173fc..0fc159af 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,11 @@ "pro": "vite --mode env.prod", "dev-server": "vite --mode dev", "ts:check": "vue-tsc --noEmit", - "build:local": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build", - "build:dev": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode dev", - "build:test": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode test", - "build:stage": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode stage", - "build:prod": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode prod", + "build:local": "node --max_old_space_size=6144 ./node_modules/vite/bin/vite.js build", + "build:dev": "node --max_old_space_size=6144 ./node_modules/vite/bin/vite.js build --mode dev", + "build:test": "node --max_old_space_size=6144 ./node_modules/vite/bin/vite.js build --mode test", + "build:stage": "node --max_old_space_size=6144 ./node_modules/vite/bin/vite.js build --mode stage", + "build:prod": "node --max_old_space_size=6144 ./node_modules/vite/bin/vite.js build --mode prod", "serve:dev": "vite preview --mode dev", "serve:prod": "vite preview --mode prod", "preview": "pnpm build:local && vite preview", @@ -44,6 +44,7 @@ "cropperjs": "^1.6.1", "crypto-js": "^4.2.0", "dayjs": "^1.11.10", + "dhtmlx-gantt": "^9.1.3", "diagram-js": "^12.8.0", "driver.js": "^1.3.1", "echarts": "^5.5.0", @@ -72,6 +73,7 @@ "vue": "3.5.12", "vue-dompurify-html": "^4.1.4", "vue-i18n": "9.10.2", + "vue-plugin-hiprint": "^0.0.60", "vue-router": "4.4.5", "vue-types": "^5.1.1", "vuedraggable": "^4.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 51c4cfbf..a7bb18e4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,6 +62,9 @@ importers: dayjs: specifier: ^1.11.10 version: 1.11.19 + dhtmlx-gantt: + specifier: ^9.1.3 + version: 9.1.3 diagram-js: specifier: ^12.8.0 version: 12.8.1 @@ -146,6 +149,9 @@ importers: vue-i18n: specifier: 9.10.2 version: 9.10.2(vue@3.5.12(typescript@5.3.3)) + vue-plugin-hiprint: + specifier: ^0.0.60 + version: 0.0.60 vue-router: specifier: 4.4.5 version: 4.4.5(vue@3.5.12(typescript@5.3.3)) @@ -911,6 +917,11 @@ packages: '@carbon/icons@11.71.0': resolution: {integrity: sha512-PwOJ7C2MNQbHvaOsPhiKHNikJ9flGtyVeGIsOHIkyNndcxAUOleppHcGofOo4NvCeIUZwnr+EN8fMaU+ZdsH9w==} + '@claviska/jquery-minicolors@2.3.6': + resolution: {integrity: sha512-8Ro6D4GCrmOl41+6w4NFhEOpx8vjxwVRI69bulXsFDt49uVRKhLU5TnzEV7AmOJrylkVq+ugnYNMiGHBieeKUQ==} + peerDependencies: + jquery: '>= 1.7.x' + '@codemirror/autocomplete@6.20.0': resolution: {integrity: sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==} @@ -1658,6 +1669,9 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@swc/core-darwin-arm64@1.15.7': resolution: {integrity: sha512-+hNVUfezUid7LeSHqnhoC6Gh3BROABxjlDNInuZ/fie1RUxaEX4qzDwdTgozJELgHhvYxyPIg1ro8ibnKtgO4g==} engines: {node: '>=10'} @@ -1882,6 +1896,9 @@ packages: '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + '@types/raf@3.4.3': + resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} + '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -2342,6 +2359,10 @@ packages: slate: ^0.72.0 snabbdom: ^3.1.0 + '@wtto00/html2canvas@1.4.3': + resolution: {integrity: sha512-jwsb+xL8N+gjrSNABSaFdxmWtE4c7RNFjP20lo1G7gs63Qqo1phhxVBTzxc/apDVh6LgXsU2l5bwKtXd9uz65w==} + engines: {node: '>=8.0.0'} + '@xmldom/xmldom@0.8.11': resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} @@ -2523,6 +2544,10 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} @@ -2593,9 +2618,18 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + btoa@1.2.1: + resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} + engines: {node: '>= 0.4.0'} + hasBin: true + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + bwip-js@4.8.0: + resolution: {integrity: sha512-gUDkDHSTv8/DJhomSIbO0fX/Dx0MO/sgllLxJyJfu4WixCQe9nfGJzmHm64ZCbxo+gUYQEsQcRmqcwcwPRwUkg==} + hasBin: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2640,6 +2674,10 @@ packages: caniuse-lite@1.0.30001761: resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + canvg@3.0.11: + resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==} + engines: {node: '>=10.0.0'} + chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} @@ -2867,6 +2905,9 @@ packages: resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} engines: {node: '>=12 || >=16'} + css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} @@ -3126,6 +3167,9 @@ packages: engines: {node: '>=0.10'} hasBin: true + dhtmlx-gantt@9.1.3: + resolution: {integrity: sha512-3FjvcsGVLFgpZgQKjzKnw1vZh2dIKwLt1Zm6G9Oo/bW2Ogm6/PeQ2cNHO033MWicuxJZn2mpLmg6yssUK3RAiQ==} + diagram-js-direct-editing@3.2.0: resolution: {integrity: sha512-+pyxeQGBSdLiZX0/tmmsm2qZSvm9YtVzod5W3RMHSTR7VrkUMD6E7EX/W9JQv3ebxO7oIdqFmytmNDDpSHnYEw==} peerDependencies: @@ -3197,6 +3241,9 @@ packages: resolution: {integrity: sha512-rmvrrmWQPD/X1A/nPBfIVg4r05792QdG9Z4Prk6oQG0F9zBMDkr0GKAdds1wjb2dq1rTz/ywc4ZxpZbgz0tttg==} engines: {node: '>=18'} + dompurify@2.5.9: + resolution: {integrity: sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==} + dompurify@3.3.1: resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} @@ -3270,6 +3317,13 @@ packages: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} + engine.io-client@6.6.4: + resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + entities@1.1.2: resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} @@ -3518,6 +3572,9 @@ packages: feelin@3.2.0: resolution: {integrity: sha512-GFDbHsTYk7YXO1tyw1dOjb7IODeAZvNIosdGZThUwPx5XcD/XhO0hnPZXsIbAzSsIdrgGlTEEdby9fZ2gixysA==} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + file-entry-cache@11.1.1: resolution: {integrity: sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==} @@ -3803,6 +3860,10 @@ packages: html-void-elements@2.0.1: resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + htmlparser2@3.10.1: resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} @@ -4109,6 +4170,9 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jquery@3.7.1: + resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} + js-base64@2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} @@ -4131,6 +4195,9 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsbarcode@3.12.3: + resolution: {integrity: sha512-CuHU9hC6dPsHF5oVFMo8NW76uQVjH4L22CsP4hW+dNnGywJHC/B0ThA1CTDVLnxKLrrpYdicBLnd2xsgTfRnvg==} + jsencrypt@3.5.4: resolution: {integrity: sha512-kNjfYEMNASxrDGsmcSQh/rUTmcoRfSUkxnAz+MMywM8jtGu+fFEZ3nJjHM58zscVnwR0fYmG9sGkTDjqUdpiwA==} @@ -4174,6 +4241,9 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + jspdf@2.5.2: + resolution: {integrity: sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==} + katex@0.16.27: resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==} hasBin: true @@ -4603,6 +4673,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nzh@1.0.14: + resolution: {integrity: sha512-wKgaqCSZdrySvB4RWop5g+v6IDv2IErsT6rjq06Bg0yiT9hiHYZO12GMGx/xweGVLcO2lDjX5RqWD0S/Jy9z5Q==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -4764,6 +4837,9 @@ packages: perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4971,6 +5047,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + rd@2.0.1: resolution: {integrity: sha512-/XdKU4UazUZTXFmI0dpABt8jSXPWcEyaGdk340KdHnsEOdkTctlX23aAK7ChQDn39YGNlAJr1M5uvaKt4QnpNw==} @@ -5000,6 +5079,9 @@ packages: 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==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -5084,6 +5166,10 @@ packages: 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@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -5263,6 +5349,14 @@ packages: resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.6: + resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==} + engines: {node: '>=10.0.0'} + sortablejs@1.14.0: resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==} @@ -5310,6 +5404,10 @@ packages: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + stackblur-canvas@2.7.0: + resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==} + engines: {node: '>=0.1.14'} + static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} @@ -5438,6 +5536,10 @@ packages: svg-baker@1.7.0: resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + 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==} @@ -5476,6 +5578,9 @@ packages: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} + text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -5690,6 +5795,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true @@ -5801,6 +5909,10 @@ packages: peerDependencies: vue: ^3.0.0 + vue-plugin-hiprint@0.0.60: + resolution: {integrity: sha512-a5uOMn6Nr4qlYYaVNbQKwRZJa8UcNMTflfi6J430/NDtySJB+5ArE8I8+NLjgVV56x3/qdUBs/GWuZCX5Umv1w==} + engines: {node: '>=16'} + vue-router@4.4.5: resolution: {integrity: sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==} peerDependencies: @@ -5913,6 +6025,18 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-js@1.6.11: resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} hasBin: true @@ -5921,6 +6045,10 @@ packages: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -6757,6 +6885,10 @@ snapshots: dependencies: '@ibm/telemetry-js': 1.10.2 + '@claviska/jquery-minicolors@2.3.6(jquery@3.7.1)': + dependencies: + jquery: 3.7.1 + '@codemirror/autocomplete@6.20.0': dependencies: '@codemirror/language': 6.12.1 @@ -7459,6 +7591,8 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@socket.io/component-emitter@3.1.2': {} + '@swc/core-darwin-arm64@1.15.7': optional: true @@ -7673,6 +7807,8 @@ snapshots: '@types/qs@6.14.0': {} + '@types/raf@3.4.3': {} + '@types/semver@7.7.1': {} '@types/svgo@2.6.4': @@ -8383,6 +8519,11 @@ snapshots: slate: 0.72.8 snabbdom: 3.6.3 + '@wtto00/html2canvas@1.4.3': + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + '@xmldom/xmldom@0.8.11': {} '@zxcvbn-ts/core@3.0.4': @@ -8558,6 +8699,8 @@ snapshots: balanced-match@2.0.0: {} + base64-arraybuffer@1.0.2: {} + base@0.11.2: dependencies: cache-base: 1.0.1 @@ -8660,8 +8803,12 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) + btoa@1.2.1: {} + buffer-from@1.1.2: {} + bwip-js@4.8.0: {} + cac@6.7.14: {} cache-base@1.0.1: @@ -8717,6 +8864,17 @@ snapshots: caniuse-lite@1.0.30001761: {} + canvg@3.0.11: + dependencies: + '@babel/runtime': 7.28.4 + '@types/raf': 3.4.3 + core-js: 3.47.0 + raf: 3.4.1 + regenerator-runtime: 0.13.11 + rgbcolor: 1.0.1 + stackblur-canvas: 2.7.0 + svg-pathdata: 6.0.3 + chalk@1.1.3: dependencies: ansi-styles: 2.2.1 @@ -8952,6 +9110,10 @@ snapshots: css-functions-list@3.2.3: {} + css-line-break@2.1.0: + dependencies: + utrie: 1.0.2 + css-select@4.3.0: dependencies: boolbase: 1.0.0 @@ -9232,6 +9394,8 @@ snapshots: detect-libc@1.0.3: optional: true + dhtmlx-gantt@9.1.3: {} + diagram-js-direct-editing@3.2.0(diagram-js@14.11.3): dependencies: diagram-js: 14.11.3 @@ -9322,6 +9486,9 @@ snapshots: domify@2.0.0: {} + dompurify@2.5.9: + optional: true + dompurify@3.3.1: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -9430,6 +9597,20 @@ snapshots: emojis-list@3.0.0: {} + engine.io-client@6.6.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-parser: 5.2.3 + ws: 8.18.3 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + entities@1.1.2: {} entities@2.2.0: {} @@ -9816,6 +9997,8 @@ snapshots: lezer-feel: 1.9.0 luxon: 3.7.2 + fflate@0.8.2: {} + file-entry-cache@11.1.1: dependencies: flat-cache: 6.1.19 @@ -10112,6 +10295,12 @@ snapshots: html-void-elements@2.0.1: {} + html2canvas@1.4.1: + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + optional: true + htmlparser2@3.10.1: dependencies: domelementtype: 1.3.1 @@ -10390,6 +10579,8 @@ snapshots: jiti@2.6.1: {} + jquery@3.7.1: {} + js-base64@2.6.4: {} js-beautify@1.15.4: @@ -10410,6 +10601,8 @@ snapshots: dependencies: argparse: 2.0.1 + jsbarcode@3.12.3: {} + jsencrypt@3.5.4: {} jsesc@3.1.0: {} @@ -10445,6 +10638,18 @@ snapshots: jsonparse@1.3.1: {} + jspdf@2.5.2: + dependencies: + '@babel/runtime': 7.28.4 + atob: 2.1.2 + btoa: 1.2.1 + fflate: 0.8.2 + optionalDependencies: + canvg: 3.0.11 + core-js: 3.47.0 + dompurify: 2.5.9 + html2canvas: 1.4.1 + katex@0.16.27: dependencies: commander: 8.3.0 @@ -10896,6 +11101,8 @@ snapshots: dependencies: boolbase: 1.0.0 + nzh@1.0.14: {} + object-assign@4.1.1: {} object-copy@0.1.0: @@ -11047,6 +11254,8 @@ snapshots: perfect-debounce@1.0.0: {} + performance-now@2.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -11241,6 +11450,10 @@ snapshots: queue-microtask@1.2.3: {} + raf@3.4.1: + dependencies: + performance-now: 2.1.0 + rd@2.0.1: dependencies: '@types/node': 10.17.60 @@ -11276,6 +11489,8 @@ snapshots: regenerate@1.4.2: {} + regenerator-runtime@0.13.11: {} + regenerator-runtime@0.14.1: {} regex-not@1.0.2: @@ -11349,6 +11564,8 @@ snapshots: rfdc@1.4.1: {} + rgbcolor@1.0.1: {} + rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -11591,6 +11808,24 @@ snapshots: transitivePeerDependencies: - supports-color + socket.io-client@4.8.3: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-client: 6.6.4 + socket.io-parser: 4.2.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.6: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + sortablejs@1.14.0: {} sortablejs@1.15.6: {} @@ -11628,6 +11863,8 @@ snapshots: stable@0.1.8: {} + stackblur-canvas@2.7.0: {} + static-extend@0.1.2: dependencies: define-property: 0.2.5 @@ -11813,6 +12050,8 @@ snapshots: transitivePeerDependencies: - supports-color + svg-pathdata@6.0.3: {} + svg-tags@1.0.0: {} svg.js@2.7.1: {} @@ -11857,6 +12096,10 @@ snapshots: text-extensions@2.4.0: {} + text-segmentation@1.0.3: + dependencies: + utrie: 1.0.2 + text-table@0.2.0: {} through@2.3.8: {} @@ -12124,6 +12367,10 @@ snapshots: util-deprecate@1.0.2: {} + utrie@1.0.2: + dependencies: + base64-arraybuffer: 1.0.2 + uuid@10.0.0: {} vary@1.1.2: {} @@ -12257,6 +12504,23 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.12(typescript@5.3.3) + vue-plugin-hiprint@0.0.60: + dependencies: + '@claviska/jquery-minicolors': 2.3.6(jquery@3.7.1) + '@wtto00/html2canvas': 1.4.3 + bwip-js: 4.8.0 + canvg: 3.0.11 + jquery: 3.7.1 + jsbarcode: 3.12.3 + jspdf: 2.5.2 + lodash: 4.17.21 + nzh: 1.0.14 + socket.io-client: 4.8.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + vue-router@4.4.5(vue@3.5.12(typescript@5.3.3)): dependencies: '@vue/devtools-api': 6.6.4 @@ -12400,12 +12664,16 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 + ws@8.18.3: {} + xml-js@1.6.11: dependencies: sax: 1.4.3 xml-name-validator@4.0.0: {} + xmlhttprequest-ssl@2.1.2: {} + y18n@4.0.3: {} y18n@5.0.8: {} diff --git a/src/api/erp/autocode/index.ts b/src/api/erp/autocode/index.ts index be66689f..60c12a7e 100644 --- a/src/api/erp/autocode/index.ts +++ b/src/api/erp/autocode/index.ts @@ -52,6 +52,8 @@ export interface AutocodeRuleVO { id: number // ID ruleCode: string // 规则编码 ruleName: string // 规则名称 + barcodeType?: number | string + barCodeType?: number | string ruleDesc: string // 描述 maxLength: number // 最大长度 isPadded: string // 是否补齐 @@ -102,4 +104,4 @@ getTestCode: async (ruleCode: string) => { getAutocodePartListByRuleId: async (ruleId) => { return await request.get({ url: `/erp/autocode-rule/autocode-part/list-by-rule-id?ruleId=` + ruleId }) } -} \ No newline at end of file +} diff --git a/src/api/erp/mold/index.ts b/src/api/erp/mold/index.ts index 5089ba0f..b712cb71 100644 --- a/src/api/erp/mold/index.ts +++ b/src/api/erp/mold/index.ts @@ -26,6 +26,7 @@ export interface MoldBrandTreeVO extends MoldBrandVO { export interface MoldVO { id: number // ID code: string // 模具编码 + isCode?: boolean name: string // 模具名称 unitId: number // 单位ID machineId: number // 机台ID @@ -33,6 +34,8 @@ export interface MoldVO { inTime: Date // 入库时间 status: number // 状态 images: string // 模具图片 + qrcodeUrl?: string + templateJson?: string | any fileUrl?: string remark: string // 备注 isEnable: boolean // 是否启用 @@ -124,6 +127,9 @@ export const MoldBrandApi = { // 获得模具 getMold: async (id: number) => { return await request.get({ url: `/erp/mold-brand/mold/get?id=` + id }) + }, + regenerateCode: async (id: number, code: string) => { + return await request.post({ url: `/erp/mold-brand/regenerate-code?id=${id}&code=${encodeURIComponent(code)}` }) }, // 根据状态获得模具 getMoldListByStatus: async (status: number) => { diff --git a/src/api/erp/product/product/index.ts b/src/api/erp/product/product/index.ts index c84f1831..3b8fbb3d 100644 --- a/src/api/erp/product/product/index.ts +++ b/src/api/erp/product/product/index.ts @@ -5,6 +5,9 @@ export interface ProductVO { id: number // 产品编号 name: string // 产品名称 barCode: string // 产品条码 + isCode?: boolean + qrcodeUrl?: string + templateJson?: string | any categoryId: number // 产品类型编号 subCategoryId: number // 产品类型子类编号 subCategoryName: string // 产品类型子类名称 @@ -18,6 +21,12 @@ export interface ProductVO { purchasePrice: number // 采购价格,单位:元 salePrice: number // 销售价格,单位:元 minPrice: number // 最低价格,单位:元 + deviceIds?: string // 关联设备ID列表 + moldIds?: string // 关联模具ID列表 + devices?: { id: number; name: string }[] // 关联设备列表 + molds?: { id: number; name: string }[] // 关联模具列表 + deviceList?: any[] + moldList?: any[] } // ERP 产品 API @@ -63,6 +72,13 @@ export const ProductApi = { return await request.put({ url: `/erp/product/update`, data }) }, + // 刷新产品二维码 + regenerateCode: async (id: number, code: string) => { + return await request.post({ + url: `/erp/product/regenerate-code?id=${id}&code=${encodeURIComponent(code)}` + }) + }, + // 删除产品 deleteProduct: async (id: number) => { return await request.delete({ url: `/erp/product/delete?id=` + id }) diff --git a/src/api/erp/product/unit/index.ts b/src/api/erp/product/unit/index.ts index 58cc54ec..5354dbd1 100644 --- a/src/api/erp/product/unit/index.ts +++ b/src/api/erp/product/unit/index.ts @@ -56,4 +56,9 @@ export const ProductUnitApi = { getProductUnitListByFlag: async () => { return await request.get({ url: `/erp/product-unit/flag-list`}) }, + + // 下载用户导入模板 + importUserTemplate: async () => { + return await request.download({ url: '/erp/product-unit/get-import-template' }) + } } diff --git a/src/api/erp/stock/warehouse/index.ts b/src/api/erp/stock/warehouse/index.ts index 598824bf..b953eeb2 100644 --- a/src/api/erp/stock/warehouse/index.ts +++ b/src/api/erp/stock/warehouse/index.ts @@ -12,6 +12,33 @@ export interface WarehouseVO { truckagePrice: number // 搬运费,单位:元 status: number // 开启状态 defaultStatus: boolean // 是否默认 + warehouseId:number + areaList?: Array<{ + id: number + warehouseId: number + areaCode: string + areaName: string + areaSize: number + description: string + status: number + createTime: number + }> + locationList?: Array<{ + id: number + warehouseId: number + areaId: number + code: string + name: string + areaSize: number + maxLoadWeight: number + positionX: number + positionY: number + positionZ: number + allowProductMix: boolean + allowBatchMix: boolean + status: number + createTime: number + }> } // ERP 仓库 API diff --git a/src/api/erp/stock/warehousearea/index.ts b/src/api/erp/stock/warehousearea/index.ts new file mode 100644 index 00000000..5d0b9296 --- /dev/null +++ b/src/api/erp/stock/warehousearea/index.ts @@ -0,0 +1,34 @@ +import request from '@/config/axios' + +export interface WarehouseAreaVO { + id: number + warehouseId: number + areaCode: string + areaName: string + areaSize: number + description: string + status: number + createTime: string +} + +export const WarehouseAreaApi = { + getWarehouseAreaPage: async (params: any) => { + return await request.get({ url: `/erp/warehouse-area/page`, params }) + }, + + getWarehouseArea: async (id: number) => { + return await request.get({ url: `/erp/warehouse-area/get?id=` + id }) + }, + + createWarehouseArea: async (data: WarehouseAreaVO) => { + return await request.post({ url: `/erp/warehouse-area/create`, data }) + }, + + updateWarehouseArea: async (data: WarehouseAreaVO) => { + return await request.put({ url: `/erp/warehouse-area/update`, data }) + }, + + deleteWarehouseArea: async (id: number) => { + return await request.delete({ url: `/erp/warehouse-area/delete?id=` + id }) + } +} diff --git a/src/api/erp/stock/warehouselocation/index.ts b/src/api/erp/stock/warehouselocation/index.ts new file mode 100644 index 00000000..5bb7a0a1 --- /dev/null +++ b/src/api/erp/stock/warehouselocation/index.ts @@ -0,0 +1,40 @@ +import request from '@/config/axios' + +export interface WarehouseLocationVO { + id: number + warehouseId: number + areaId: number + code: string + name: string + areaSize: number + maxLoadWeight: number + positionX: number + positionY: number + positionZ: number + allowProductMix: boolean + allowBatchMix: boolean + status: number + createTime: string +} + +export const WarehouseLocationApi = { + getWarehouseLocationPage: async (params: any) => { + return await request.get({ url: `/erp/warehouse-location/page`, params }) + }, + + getWarehouseLocation: async (id: number) => { + return await request.get({ url: `/erp/warehouse-location/get?id=` + id }) + }, + + createWarehouseLocation: async (data: WarehouseLocationVO) => { + return await request.post({ url: `/erp/warehouse-location/create`, data }) + }, + + updateWarehouseLocation: async (data: WarehouseLocationVO) => { + return await request.put({ url: `/erp/warehouse-location/update`, data }) + }, + + deleteWarehouseLocation: async (id: number) => { + return await request.delete({ url: `/erp/warehouse-location/delete?id=` + id }) + } +} diff --git a/src/api/iot/device/index.ts b/src/api/iot/device/index.ts index 5ba2ae53..806a7129 100644 --- a/src/api/iot/device/index.ts +++ b/src/api/iot/device/index.ts @@ -1,4 +1,5 @@ import request from '@/config/axios' +import qs from 'qs' // 物联设备 VO export interface DeviceVO { @@ -26,6 +27,7 @@ export interface DeviceVO { certificate?: string // 证书 secretKey?: string // 秘钥 collectionTime?: string | number + images: string,//图片 } export interface DeviceConnectParams { @@ -65,6 +67,7 @@ export interface HistoryRecordParams { deviceId: string | number collectionStartTime?: string collectionEndTime?: string + attributeCodes?: string[] } export interface DeviceContactModelVO { @@ -84,8 +87,8 @@ export const DeviceApi = { return await request.get({ url: `/iot/device/page`, params }) }, // 查询物联设备 - getDeviceList: async () => { - return await request.get({ url: `/iot/device/deviceList` }) + getDeviceList: async (params?: any) => { + return await request.get({ url: `/iot/device/deviceList`, params }) }, // 查询物联设备详情 getDevice: async (id: number) => { @@ -97,6 +100,12 @@ export const DeviceApi = { getDeviceList2ByNoUsed: async (id: number) => { return await request.get({ url: `/iot/device/noUsedlist2?id=` + id }) }, + getAvailableList: async () => { + return await request.get({ url: `/iot/device/available-list` }) + }, + getAvailableListPage: async (params: any) => { + return await request.get({ url: `/iot/device/available-page` , params}) + }, // 新增物联设备 createDevice: async (data: DeviceVO) => { return await request.post({ url: `/iot/device/create`, data }) @@ -142,8 +151,25 @@ export const DeviceApi = { return await request.get({ url: `/iot/device/singleDevice`, params }) }, + getSingleDeviceFrom: async (params: SingleDeviceParams) => { + return await request.get({ url: `/iot/device/singleDeviceFrom`, params }) + }, + getHistoryRecord: async (params: HistoryRecordParams) => { - return await request.get({ url: `/iot/device/historyRecord`, params }) + return await request.get({ + url: `/iot/device/historyRecord`, + params, + paramsSerializer: (p) => qs.stringify(p, { allowDots: true, arrayFormat: 'repeat' }) + }) + }, + + + getHistoryAnalyse: async (params: HistoryRecordParams) => { + return await request.get({ + url: `/iot/device/historyAnalyse`, + params, + paramsSerializer: (p) => qs.stringify(p, { allowDots: true, arrayFormat: 'repeat' }) + }) }, devicePointList: async () => { @@ -161,8 +187,12 @@ export const DeviceApi = { getDeviceAttributePage: async (params) => { return await request.get({ url: `/iot/device/device-attribute/page`, params }) }, + // 获得设备属性按类型分租 + getDeviceAttributeGroupList: async (params) => { + return await request.get({ url: `/iot/device/device-attribute/groupList`, params }) + }, // 获得设备属性列表 - getDeviceAttributeList: async (deviceId: number) => { + getDeviceAttributeList: async (deviceId: number | string) => { return await request.get({ url: `/iot/device/device-attribute/list?deviceId=` + deviceId }) }, diff --git a/src/api/iot/deviceOperationOverview/index.ts b/src/api/iot/deviceOperationOverview/index.ts new file mode 100644 index 00000000..8b3601c6 --- /dev/null +++ b/src/api/iot/deviceOperationOverview/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +export interface DeviceOperationOverviewParams { + ids?: string + startTime?: string + endTime?: string + timelinePageNo?: number + timelinePageSize?: number +} + +export interface DeviceOperationOverviewMetricVO { + key: string + icon: string + value: number + unit: string + change: number +} + +export interface DeviceOperationOverviewHourlyStatusVO { + hour: string + running: number + standby: number + fault: number + offline: number +} + +export interface DeviceOperationOverviewSummaryVO { + status: 'running' | 'standby' | 'fault' | 'offline' + percent: number + hours: number +} + +export interface DeviceOperationOverviewTimelineSegmentVO { + status: 'running' | 'standby' | 'fault' | 'offline' + startHour: number + endHour: number +} + +export interface DeviceOperationOverviewTimelineRowVO { + id: string + name: string + utilizationRate: number + segments: DeviceOperationOverviewTimelineSegmentVO[] +} + +export interface DeviceOperationOverviewRespVO { + metrics: DeviceOperationOverviewMetricVO[] + hourlyStatus: DeviceOperationOverviewHourlyStatusVO[] + summary: DeviceOperationOverviewSummaryVO[] + summaryTotalHours: number + timelineRows: DeviceOperationOverviewTimelineRowVO[] + totalDevices: number +} + +export const DeviceOperationOverviewApi = { + getRunOverview: async (params: DeviceOperationOverviewParams) => { + return await request.get({ + url: `/iot/device-operation-record/runOverview`, + params + }) + } +} diff --git a/src/api/iot/deviceOperationRecord/index.ts b/src/api/iot/deviceOperationRecord/index.ts index 7782118e..c9821005 100644 --- a/src/api/iot/deviceOperationRecord/index.ts +++ b/src/api/iot/deviceOperationRecord/index.ts @@ -8,8 +8,14 @@ export interface DeviceOperationRecordVO { totalStandbyTime: number totalFaultTime: number totalWarningTime: number + totalOfflineTime?: number utilizationRate: string powerOnRate?: string + startTime?: string + endTime?: string + lineCode?: string + lineName?: string + deviceId?: number } export interface DeviceOperationRecordPageParams { @@ -22,10 +28,23 @@ export interface DeviceOperationRecordPageParams { ids?: string } +export interface DeviceOperationListParams { + deviceCode?: string + deviceName?: string + startTime?: string + endTime?: string + lineCode?: string + lineName?: string + deviceId?: number | string +} + export const DeviceOperationRecordApi = { getDeviceOperationRecordPage: async (params: DeviceOperationRecordPageParams) => { return await request.get({ url: `/iot/device-operation-record/deviceOperationPage`, params }) }, + getDeviceOperationList: async (params?: DeviceOperationListParams) => { + return await request.get({ url: `/iot/device-operation-record/deviceOperationList`, params }) + }, exportDeviceOperationReport: async (params: DeviceOperationRecordPageParams) => { return await request.download({ url: `/iot/device-operation-record/export-device-operation-report`, params }) } diff --git a/src/api/iot/deviceattributetype/index.ts b/src/api/iot/deviceattributetype/index.ts index ec154893..901aafa1 100644 --- a/src/api/iot/deviceattributetype/index.ts +++ b/src/api/iot/deviceattributetype/index.ts @@ -42,6 +42,10 @@ export const DeviceAttributeTypeApi = { }, // 获得采集点分类列表 + importTemplate: async () => { + return await request.download({ url: `/iot/device-attribute-type/get-import-template` }) + }, + getDeviceAttributeTypeList: async () => { return await request.get({ url: `/iot/device-attribute-type/list` }) }, diff --git a/src/api/iot/recipePlanDetail/index.ts b/src/api/iot/recipePlanDetail/index.ts index 4445651e..0f4086f6 100644 --- a/src/api/iot/recipePlanDetail/index.ts +++ b/src/api/iot/recipePlanDetail/index.ts @@ -14,6 +14,11 @@ export interface RecipePlanDetailVO { isEnable?: string | number | boolean } +export interface CollectLatestTimeResult { + timeAbnormal?: boolean + latestTime?: string | number +} + export const RecipePlanDetailApi = { getRecipePlanDetailPage: async (params: any) => { return await request.get({ url: `/iot/recipe-plan-detail/page`, params }) @@ -39,5 +44,8 @@ export const RecipePlanDetailApi = { return await request.post({ url: `/iot/recipe-plan-detail/batch-create?id=` + id }) }, + getCollectLatestTime: async (params: { id?: number | string; recipeId?: number | string }) => { + return await request.get({ url: `/iot/recipe-plan-detail/getCollectLatestTime`, params }) + } } diff --git a/src/api/iot/recipepointrecord/index.ts b/src/api/iot/recipepointrecord/index.ts index 830967d3..423518f9 100644 --- a/src/api/iot/recipepointrecord/index.ts +++ b/src/api/iot/recipepointrecord/index.ts @@ -12,10 +12,27 @@ export interface RecipePointRecordVO { export const RecipePointRecordApi = { // 新增记录 + createRecipePointRecord: async (data: RecipePointRecordVO) => { + return await request.post({ url: `/iot/recipe-point-record/create`, data }) + }, + // 批量新增记录 createRecipePointRecordBatch: async (data: RecipePointRecordVO[]) => { return await request.post({ url: `/iot/recipe-point-record/batch-create`, data }) }, getRecipePointRecordPage: async (params: any) => { return await request.get({ url: `/iot/recipe-point-record/page`, params }) - } -} \ No newline at end of file + }, + updateRecipePointRecord: async (params: { + id: string | number + recipeId?: string | number + name?: string + max?: string | number + min?: string | number + dataType?: string | number + dataUnit?: string | number + remark?: string + refer?: string + }) => { + return await request.put({ url: `/iot/recipe-point-record/update`, data:params }) + } +} diff --git a/src/api/mes/baogongrecord/index.ts b/src/api/mes/baogongrecord/index.ts index 5581889a..6e7fb98d 100644 --- a/src/api/mes/baogongrecord/index.ts +++ b/src/api/mes/baogongrecord/index.ts @@ -3,11 +3,28 @@ import request from '@/config/axios' // 报工 VO export interface BaogongRecordVO { id: number // id - planId: number // 关联计划id + planId: number // 关联计划 id num: number // 派工数量 baogongTime: Date // 派工时间 } +// 报工统计 VO +export interface BaogongRecordStatVO { + id: number // ID + taskCode: string // 任务单编码 + planCode: string // 计划单编码 + employeeId: string // 员工 ID + employeeName: string // 员工姓名 + productName: string // 产品名称 + productCode: string // 产品编码 + baogongNum: number // 报工数量 + passNum: number // 合格数量 + noPassNum: number // 不合格数量 + passRate: number // 合格率 (%) + reason: string // 原因 + baogongTime: Date // 报工时间 +} + // 报工 API export const BaogongRecordApi = { // 查询报工分页 @@ -15,6 +32,11 @@ export const BaogongRecordApi = { return await request.get({ url: `/mes/baogong-record/page`, params }) }, + // 查询报工统计分页 + getBaogongRecordStatPage: async (params: any) => { + return await request.get({ url: `/mes/baogong-record/stat-page`, params }) + }, + // 查询报工详情 getBaogongRecord: async (id: number) => { return await request.get({ url: `/mes/baogong-record/get?id=` + id }) @@ -40,4 +62,13 @@ export const BaogongRecordApi = { return await request.download({ url: `/mes/baogong-record/export-excel`, params }) }, + // 导出报工统计 Excel + exportBaogongRecordStat: async (params) => { + return await request.download({ url: `/mes/baogong-record/export-stat-excel`, params }) + }, + + // 导出报工统计 Excel (新) + statExportExcel: async (params) => { + return await request.download({ url: `/mes/baogong-record/stat-export-excel`, params }) + }, } diff --git a/src/api/mes/bom/index.ts b/src/api/mes/bom/index.ts index 12687d0a..103baca1 100644 --- a/src/api/mes/bom/index.ts +++ b/src/api/mes/bom/index.ts @@ -49,5 +49,9 @@ export const BomApi = { // 获得产品BOM明细列表 getBomDetailListByBomId: async (bomId) => { return await request.get({ url: `/mes/bom/bom-detail/list-by-bom-id?bomId=` + bomId }) + }, + + getBomByProductId: async (productId: number) => { + return await request.get({ url: `/mes/bom/getByProductId`, params: { productId } }) } } \ No newline at end of file diff --git a/src/api/mes/calholiday/index.ts b/src/api/mes/calholiday/index.ts new file mode 100644 index 00000000..9b5a1514 --- /dev/null +++ b/src/api/mes/calholiday/index.ts @@ -0,0 +1,55 @@ +import request from '@/config/axios' + +// 节假日设置 VO +export interface CalHolidayVO { + holidayId: number // 流水号 + theDay: Date // 日期 + holidayType: string // 日期类型 + startTime: Date // 开始时间 + endTime: Date // 结束时间 + remark: string // 备注 + attr1: string // 预留字段1 + attr2: string // 预留字段2 + attr3: number // 预留字段3 + attr4: number // 预留字段4 + createBy: string // 创建者 + updateBy: string // 更新者 +} + +// 节假日设置 API +export const CalHolidayApi = { + // 查询节假日设置分页 + getCalHolidayPage: async (params: any) => { + return await request.get({ url: `/mes/cal-holiday/page`, params }) + }, + + // 查询节假日设置详情 + getCalHoliday: async (id: number) => { + return await request.get({ url: `/mes/cal-holiday/get?id=` + id }) + }, + + // 新增节假日设置 + createCalHoliday: async (data: CalHolidayVO) => { + return await request.post({ url: `/mes/cal-holiday/create`, data }) + }, + + // 修改节假日设置 + updateCalHoliday: async (data: CalHolidayVO) => { + return await request.put({ url: `/mes/cal-holiday/update`, data }) + }, + + // 删除节假日设置 + deleteCalHoliday: async (id: number) => { + return await request.delete({ url: `/mes/cal-holiday/delete?id=` + id }) + }, + + // 导出节假日设置 Excel + exportCalHoliday: async (params) => { + return await request.download({ url: `/mes/cal-holiday/export-excel`, params }) + }, + + // 删除节假日设置 + deleteCalHolidayByDay: async (theDay: String) => { + return await request.delete({ url: `/mes/cal-holiday/deleteByDay?theDay=` + theDay }) + }, +} diff --git a/src/api/mes/criticalComponent/index.ts b/src/api/mes/criticalComponent/index.ts index c702953c..38255d36 100644 --- a/src/api/mes/criticalComponent/index.ts +++ b/src/api/mes/criticalComponent/index.ts @@ -3,11 +3,15 @@ import request from '@/config/axios' export interface CriticalComponentVO { id: number code: string + isCode?: boolean name: string description?: string count?: number remark?: string + qrcodeUrl?: string + templateJson?: string | any createTime?: string + images?: string } export const CriticalComponentApi = { @@ -17,6 +21,9 @@ export const CriticalComponentApi = { getCriticalComponentList: async () => { return await request.get({ url: `/mes/critical-component/list`, }) }, + getCriticalComponent: async (id: number) => { + return await request.get({ url: `/mes/critical-component/get?id=` + id }) + }, createCriticalComponent: async (data: Partial) => { return await request.post({ url: `/mes/critical-component/create`, data }) }, @@ -25,6 +32,12 @@ export const CriticalComponentApi = { return await request.put({ url: `/mes/critical-component/update`, data }) }, + regenerateCode: async (id: number, code: string) => { + return await request.post({ + url: `/mes/critical-component/regenerate-code?id=${id}&code=${encodeURIComponent(code)}` + }) + }, + deleteCriticalComponent: async (ids: string) => { return await request.delete({ url: `/mes/critical-component/delete?ids=` + ids }) }, diff --git a/src/api/mes/device-ledger.ts b/src/api/mes/device-ledger.ts new file mode 100644 index 00000000..6c71f1e7 --- /dev/null +++ b/src/api/mes/device-ledger.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +export interface CapacityReportVO { + id: number + deviceCode: string + deviceName: string + typeName: string + deviceStatus: number + ratedCapacity: number + reportCapacity: number + actualCapacity: number + workshopName: string +} + +export interface CapacityReportQuery { + pageNo: number + pageSize: number + deviceCode?: string + deviceName?: string + deviceType?: string + deviceStatus?: string + workshop?: string + ids?: string +} + +export const DeviceLedgerApi = { + /** + * 产能报表分页查询 + */ + getCapacityReportPage: async (params: CapacityReportQuery) => { + return await request.get({ url: '/mes/device-ledger/capacity-report/page', params }) + }, + + /** + * 产能报表导出 + */ + exportCapacityReport: async (params: { ids?: string }) => { + return await request.download({ url: '/mes/device-ledger/capacity-report/export-excel', params }) + }, + + /** + * 更新设备状态 + */ + updateDeviceLedger: async (data: { id: number; deviceStatus: number }) => { + return await request.put({ url: '/mes/device-ledger/update', data }) + } +} diff --git a/src/api/mes/deviceledger/index.ts b/src/api/mes/deviceledger/index.ts index 12ecc1b0..a01141b3 100644 --- a/src/api/mes/deviceledger/index.ts +++ b/src/api/mes/deviceledger/index.ts @@ -6,12 +6,14 @@ import { MoldVO } from '@/api/erp/mold' export interface DeviceLedgerVO { id: number // id deviceCode: string // 设备编号 + isCode?: boolean deviceName: string // 设备名称 deviceStatus: number // 设备状态 (0-正常, 1-停用, 2-维修, 3-报废) deviceBrand: string // 设备品牌 deviceModel: string // 设备型号 deviceSpec: string // 设备规格 deviceType: string | number // 设备类型 + deviceLine?: string | number // 设备产线 deviceTypeName?: string // 设备类型名称 supplier: string // 供应商 workshop: string // 所属车间 @@ -24,6 +26,11 @@ export interface DeviceLedgerVO { deviceRemark: string // 设备备注 remark: string // 备注 fileUrl?: string // 附件下载 + qrcodeUrl?: string + templateJson?: string | any + isSchedueld?: number + isScheduled?: number + ratedCapacity?: number componentId?: string // 关键件,ids集合 componentList?: CriticalComponentVO[] beijianId?: string // 备件,ids集合 @@ -37,6 +44,7 @@ export interface DeviceLedgerVO { createTime?: string | number | Date updateTime?: string | number | Date sort: number // 排序 + images?: string // 图片 } // 设备类型 API @@ -73,6 +81,10 @@ export const DeviceLedgerApi = { return await request.put({ url: `/mes/device-ledger/update`, data }) }, + regenerateCode: async (id: number, code: string) => { + return await request.post({ url: `/mes/device-ledger/regenerate-code?id=${id}&code=${encodeURIComponent(code)}` }) + }, + // 删除设备类型 deleteDeviceLedger: async (ids: string) => { return await request.delete({ url: `/mes/device-ledger/delete?ids=` + ids }) diff --git a/src/api/mes/deviceline/index.ts b/src/api/mes/deviceline/index.ts new file mode 100644 index 00000000..dc3fcce9 --- /dev/null +++ b/src/api/mes/deviceline/index.ts @@ -0,0 +1,45 @@ +import request from '@/config/axios' + +export interface DeviceLineVO { + id: number + code: string + isCode?: boolean + qrcodeUrl?: string + name: string + remark: string + sort: number + parentId: number + parentChain: string + createTime?: string +} + +export interface DeviceLineTreeVO extends DeviceLineVO { + children?: DeviceLineTreeVO[] + leaf?: boolean +} + +export const DeviceLineApi = { + getDeviceLine: async (id: number) => { + return await request.get({ url: `/mes/device-line/get?id=` + id }) + }, + + getDeviceLineTree: async () => { + return await request.get({ url: `/mes/device-line/tree` }) + }, + + regenerateCode: async (id: number, code: string) => { + return await request.post({ url: `/mes/device-line/regenerate-code?id=${id}&code=${encodeURIComponent(code)}` }) + }, + + createDeviceLine: async (data: DeviceLineVO) => { + return await request.post({ url: `/mes/device-line/create`, data }) + }, + + updateDeviceLine: async (data: DeviceLineVO) => { + return await request.put({ url: `/mes/device-line/update`, data }) + }, + + deleteDeviceLine: async (id: number) => { + return await request.delete({ url: `/mes/device-line/delete?id=` + id }) + } +} \ No newline at end of file diff --git a/src/api/mes/dvsubject/index.ts b/src/api/mes/dvsubject/index.ts index dfbfe8f3..200eae35 100644 --- a/src/api/mes/dvsubject/index.ts +++ b/src/api/mes/dvsubject/index.ts @@ -11,6 +11,7 @@ export interface DvSubjectVO { isEnable: string // 是否启用 inspectionMethod: string // 检验方式 valueType: string // 值类型 + jobType:string // 作业类型 judgmentCriteria: string // 判定基准 creator?: string // 创建人 createTime?: string | number | Date // 创建时间 diff --git a/src/api/mes/energydevice/index.ts b/src/api/mes/energydevice/index.ts index 0ea5247f..feccb85a 100644 --- a/src/api/mes/energydevice/index.ts +++ b/src/api/mes/energydevice/index.ts @@ -42,6 +42,61 @@ export interface EnergyDeviceDataRecordVO { latestDataTime?: string } +export interface EnergyOverviewMetricVO { + key: string + label: string + value: string + unit?: string + subLabel?: string + subValue?: string + change?: string + down?: boolean +} + +export interface EnergyOverviewTrendVO { + unit?: string + xAxis: string[] + data: string[] +} + +export interface EnergyOverviewRegionItemVO { + name: string + value: string + percent: string +} + +export interface EnergyOverviewRegionVO { + unit?: string + totalValue: string + items: EnergyOverviewRegionItemVO[] +} + +export interface EnergyOverviewRankVO { + id: number + name: string + region: string + value: string +} + +export interface EnergyOverviewDetailVO { + id: number + name: string + energyType: string + region: string + value: string + startTime: string + endTime: string +} + +export interface EnergyOverviewRespVO { + metrics: EnergyOverviewMetricVO[] + trendChart: EnergyOverviewTrendVO + regionChart: EnergyOverviewRegionVO + rankList: EnergyOverviewRankVO[] + total: number + detailList: EnergyOverviewDetailVO[] +} + // 能源设备 API export const EnergyDeviceApi = { // 查询能源设备分页 @@ -66,6 +121,10 @@ export const EnergyDeviceApi = { return await request.get({ url: `/mes/energy-device/queryDataRecords`, params }) }, + queryOverviewData: async (params: any) => { + return await request.get({ url: `/mes/energy-device/queryOverviewData`, params }) + }, + exportQueryDataRecords: async (params: any) => { return await request.download({ url: `/mes/energy-device/record-export-excel`, params }) }, diff --git a/src/api/mes/esopFile/index.ts b/src/api/mes/esopFile/index.ts new file mode 100644 index 00000000..dc61322a --- /dev/null +++ b/src/api/mes/esopFile/index.ts @@ -0,0 +1,85 @@ +import request from '@/config/axios' + +// esop文件表库 VO +export interface FileVO { + id: number // id + configId: number // 配置编号 + code: string // 文件编码 + name: string // 文件名 + path: string // 文件路径 + url: string // 文件 URL + type: string // 文件类型 + class: string // 文件分类 + status: number // 文件状态 + size: number // 文件大小 +} +// 文件预签名地址 Response VO +export interface FilePresignedUrlRespVO { + // 文件配置编号 + configId: number + // 文件上传 URL + uploadUrl: string + // 文件 URL + url: string +} + +export enum ApiUrl{ + '/admin-api/mes/esop/file/create' +} + +// esop文件表库 API +export const FileApi = { + // 查询esop文件表库分页 + getFilePage: async (params: any) => { + return await request.get({ url: `/esop/file/page`, params }) + }, + + + // 查询esop文件表库详情 + getFile: async (id: number) => { + return await request.get({ url: `/esop/file/get?id=` + id }) + }, + + // 新增esop文件表库 + createFile: async (data: FileVO) => { + return await request.post({ url: `/esop/file/create`, data }) + }, + + // 修改esop文件表库 + updateFile: async (data: FileVO) => { + return await request.put({ url: `/esop/file/update`, data }) + }, + + // 删除esop文件表库 + deleteFile: async (id: number) => { + return await request.delete({ url: `/esop/file/delete?id=` + id }) + }, + + // 导出esop文件表库 Excel + exportFile: async (params) => { + return await request.download({ url: `/esop/file/export-excel`, params }) + }, + // 获取文件编码 + generateCode: async () => { + return await request.get({ url: `/esop/file/generate`}) + }, + +} + +// 获取文件预签名地址 +export const getFilePresignedUrl = (path: string) => { + return request.get({ + url: '/infra/file/presigned-url', + params: { path } + }) +} + +// 创建文件 +export const createFile = (data: any) => { + return request.post({ url: '/esop/file/create', data }) +} + +// 上传文件 +export const updateFile = (data: any) => { + return request.upload({ url: '/esop/file/create', data }) +} diff --git a/src/api/mes/plan/index.ts b/src/api/mes/plan/index.ts index e62872fc..aa005db7 100644 --- a/src/api/mes/plan/index.ts +++ b/src/api/mes/plan/index.ts @@ -1,6 +1,36 @@ import request from '@/config/axios' import {ItemRequisitionVO} from "@/api/mes/itemrequisition"; +// 计划记录状态枚举 +export enum OperateStatusEnum { + SCHEDULED = '1', // 已排产 + PAUSED = '3', // 暂停 + PENDING_WAREHOUSE = '4', // 待入库 + WAREHOUSED = '5', // 已入库 + STARTED = '8' // 已开工 +} + +// 计划记录状态映射 +export const OPERATE_STATUS_MAP: Record = { + '1': '已排产', + '3': '暂停', + '4': '待入库', + '5': '已入库', + '8': '已开工' +} + +// 计划记录 VO +export interface PlanRecordVO { + id: number // ID + taskId: number // 任务ID + planId: number // 计划ID + operateStatus: string // 操作状态 ('1' | '3' | '4' | '5' | '8') + operateTime: number // 操作时间戳(毫秒) + remark: string // 备注 + isEnable: boolean // 是否启用 + createTime: number // 创建时间戳 +} + // 生产计划 VO export interface PlanVO { id: number // ID @@ -26,6 +56,27 @@ export interface PlanVO { feedingPipelineName: string wangongNumber: number passRate: number + passNumber?: number // 合格数量 + noPassNumber?: number // 不合格数量 + deviceName?: string // 设备名称 + planRecordList?: PlanRecordVO[] // 计划记录列表 +} + +export interface DevicePlanGanttPlanVO { + planId: number + planStartTime: string + planEndTime: string + latestStartTime: string + planNumber: number + productName: string + deviceName: string +} + +export interface DevicePlanGanttRespVO { + deviceId: number + deviceName: string + deviceCode: string + plans: DevicePlanGanttPlanVO[] } // 生产计划 API @@ -63,6 +114,9 @@ export const PlanApi = { saveBatchPlan: async (data: any) => { return await request.post({ url: `/mes/plan/saveBatchPlan`, data }) }, + createBatch: async (data:any) => { + return await request.post({ url: `/mes/plan/create-batch`, data }) + }, // 派工生产计划 arrangePlan: async (data: ItemRequisitionVO) => { return await request.put({ url: `/mes/plan/paigong`, data }) @@ -116,5 +170,16 @@ export const PlanApi = { }, getLastSevenDaysCompletedCount: async (params?: any) => { return await request.get({ url: `/mes/plan/getLastSevenDaysCompletedCount`, params }) + }, + getGanttByDevice: async (params: { startTime: string; endTime: string }) => { + return await request.get({ url: `/mes/plan/gantt-by-device`, params }) + }, + + getPlanPageByTask: async (params: any) => { + return await request.get({ url: `/mes/plan/page-by-task`, params }) + }, + + getProductCapacityPage: async (params: any) => { + return await request.get({ url: `/mes/plan/product-capacity-page`, params }) } } diff --git a/src/api/mes/printtemplate/index.ts b/src/api/mes/printtemplate/index.ts new file mode 100644 index 00000000..a6093fb4 --- /dev/null +++ b/src/api/mes/printtemplate/index.ts @@ -0,0 +1,34 @@ +import request from '@/config/axios' + +export interface PrintTemplateVO { + id: number + templateCode: string + templateName: string + templateType: number + templateBizType: number + templateJson: string + remark: string + isEnable: boolean + createTime: string +} + +export const PrintTemplateApi = { + getPrintTemplatePage: async (params: any) => { + return await request.get({ url: `/mes/print-template/page`, params }) + }, + getPrintTemplate: async (id: number) => { + return await request.get({ url: `/mes/print-template/get?id=` + id }) + }, + createPrintTemplate: async (data: PrintTemplateVO) => { + return await request.post({ url: `/mes/print-template/create`, data }) + }, + updatePrintTemplate: async (data: PrintTemplateVO) => { + return await request.put({ url: `/mes/print-template/update`, data }) + }, + deletePrintTemplate: async (id: number) => { + return await request.delete({ url: `/mes/print-template/delete?id=` + id }) + }, + exportPrintTemplate: async (params) => { + return await request.download({ url: `/mes/print-template/export-excel`, params }) + }, +} diff --git a/src/api/mes/task/index.ts b/src/api/mes/task/index.ts index 42eef4f8..1fdc8407 100644 --- a/src/api/mes/task/index.ts +++ b/src/api/mes/task/index.ts @@ -6,6 +6,7 @@ export interface TaskVO { code: string // 编码 orderDate: Date // 下达日期 deliveryDate: Date // 交货日期 + isUrgent: string // 是否急单0-否 1-是 status: number // 状态 processInstanceId: string // 流程实例的编号 remark: string // 备注 @@ -155,4 +156,8 @@ export const TaskApi = { generatePlanByTaskDetail: async (params) => { return await request.get({ url: `/mes/task/generate-plan/byTaskDetail`, params }) }, + // 一键排产 + oneClickSchedule: async (data: any) => { + return await request.post({ url: `/mes/task/one-click-schedule`, data }) + }, } diff --git a/src/api/mes/workteam/index.ts b/src/api/mes/workteam/index.ts index dac313b6..ac6c2c1b 100644 --- a/src/api/mes/workteam/index.ts +++ b/src/api/mes/workteam/index.ts @@ -5,7 +5,7 @@ export interface WorkTeamVO { id: number // ID teamName: string // 班组名称 teamLeaderId: number // 组长ID - teamType: string // 工序类型 + teamType?: string // 工序类型 startTime: Date endTime: Date remark: string // 备注 diff --git a/src/api/mes/zjtask/index.ts b/src/api/mes/zjtask/index.ts index 1949b9c7..c91f1718 100644 --- a/src/api/mes/zjtask/index.ts +++ b/src/api/mes/zjtask/index.ts @@ -44,6 +44,10 @@ export const ZjTaskApi = { return await request.get({ url: `/mes/zj-task/list`, params }) }, + getZjTaskPageByTicket: async (params: any) => { + return await request.get({ url: `/mes/zj-task/page-by-ticket`, params }) + }, + createZjTask: async (data: ZjTaskVO) => { return await request.post({ url: `/mes/zj-task/create`, data }) }, diff --git a/src/api/system/dict/dict.data.ts b/src/api/system/dict/dict.data.ts index f4286481..f4356df9 100644 --- a/src/api/system/dict/dict.data.ts +++ b/src/api/system/dict/dict.data.ts @@ -4,6 +4,7 @@ export type DictDataVO = { id: number | undefined sort: number | undefined label: string + labelEn?: string value: string dictType: string status: number diff --git a/src/api/system/menu/index.ts b/src/api/system/menu/index.ts index b912b67a..804082d7 100644 --- a/src/api/system/menu/index.ts +++ b/src/api/system/menu/index.ts @@ -16,12 +16,14 @@ export interface MenuVO { visible: boolean keepAlive: boolean alwaysShow?: boolean + clientType?: number + terminalType?: number createTime: Date } // 查询菜单(精简)列表 -export const getSimpleMenusList = () => { - return request.get({ url: '/system/menu/simple-list' }) +export const getSimpleMenusList = (clientType?: number) => { + return request.get({ url: '/system/menu/simple-list', params: { clientType } }) } // 查询菜单列表 diff --git a/src/assets/fonts/uniicons.ttf b/src/assets/fonts/uniicons.ttf new file mode 100644 index 00000000..14696d03 Binary files /dev/null and b/src/assets/fonts/uniicons.ttf differ diff --git a/src/assets/fonts/uview-icons.ttf b/src/assets/fonts/uview-icons.ttf new file mode 100644 index 00000000..befa24aa Binary files /dev/null and b/src/assets/fonts/uview-icons.ttf differ diff --git a/src/assets/imgs/qrCode.png b/src/assets/imgs/qrCode.png new file mode 100644 index 00000000..0b688860 Binary files /dev/null and b/src/assets/imgs/qrCode.png differ diff --git a/src/assets/imgs/wutu.jpeg b/src/assets/imgs/wutu.jpeg new file mode 100644 index 00000000..6eecca32 Binary files /dev/null and b/src/assets/imgs/wutu.jpeg differ diff --git a/src/components/Dialog/src/Dialog.vue b/src/components/Dialog/src/Dialog.vue index a1eb550c..854ebfe3 100644 --- a/src/components/Dialog/src/Dialog.vue +++ b/src/components/Dialog/src/Dialog.vue @@ -9,13 +9,14 @@ const props = defineProps({ modelValue: propTypes.bool.def(false), title: propTypes.string.def('Dialog'), fullscreen: propTypes.bool.def(true), + initialFullscreen: propTypes.bool.def(false), width: propTypes.oneOfType([String, Number]).def('40%'), - scroll: propTypes.bool.def(false), // 是否开启滚动条。如果是的话,按照 maxHeight 设置最大高度 + scroll: propTypes.bool.def(false), maxHeight: propTypes.oneOfType([String, Number]).def('400px') }) const getBindValue = computed(() => { - const delArr: string[] = ['fullscreen', 'title', 'maxHeight', 'appendToBody'] + const delArr: string[] = ['fullscreen', 'initialFullscreen', 'title', 'maxHeight', 'appendToBody'] const attrs = useAttrs() const obj = { ...attrs, ...props } for (const key in obj) { @@ -26,7 +27,7 @@ const getBindValue = computed(() => { return obj }) -const isFullscreen = ref(false) +const isFullscreen = ref(props.initialFullscreen) const toggleFull = () => { isFullscreen.value = !unref(isFullscreen) diff --git a/src/components/DictTag/src/DictTag.vue b/src/components/DictTag/src/DictTag.vue index 6414eaab..7f3b0213 100644 --- a/src/components/DictTag/src/DictTag.vue +++ b/src/components/DictTag/src/DictTag.vue @@ -4,7 +4,8 @@ import { isHexColor } from '@/utils/color' import { ElTag } from 'element-plus' import { DictDataType, getDictOptions } from '@/utils/dict' import { isArray, isBoolean, isNumber, isString } from '@/utils/is' - +import {useLocaleStoreWithOut} from "@/store/modules/locale"; +const localeStore = useLocaleStoreWithOut() export default defineComponent({ name: 'DictTag', props: { @@ -68,6 +69,7 @@ export default defineComponent({ if (dict.colorType + '' === 'primary' || dict.colorType + '' === 'default') { dict.colorType = '' } + const label = localeStore.getCurrentLocale?.lang === 'en' ? (dict.labelEn || dict.label) : dict.label return ( // 添加标签的文字颜色为白色,解决自定义背景颜色时标签文字看不清的问题 - {dict?.label} + {label} ) } diff --git a/src/components/HiprintPreviewDialog/index.vue b/src/components/HiprintPreviewDialog/index.vue new file mode 100644 index 00000000..d590b3b2 --- /dev/null +++ b/src/components/HiprintPreviewDialog/index.vue @@ -0,0 +1,397 @@ + + + + + diff --git a/src/components/Icon/index.ts b/src/components/Icon/index.ts index 33d1de38..8611de6d 100644 --- a/src/components/Icon/index.ts +++ b/src/components/Icon/index.ts @@ -1,4 +1,5 @@ import Icon from './src/Icon.vue' import IconSelect from './src/IconSelect.vue' +import AppIconSelect from './src/AppIconSelect.vue' -export { Icon, IconSelect } +export { Icon, IconSelect, AppIconSelect } diff --git a/src/components/Icon/src/AppIconSelect.vue b/src/components/Icon/src/AppIconSelect.vue new file mode 100644 index 00000000..17467ca7 --- /dev/null +++ b/src/components/Icon/src/AppIconSelect.vue @@ -0,0 +1,280 @@ + + + + + + + \ No newline at end of file diff --git a/src/components/Icon/src/appIconData.ts b/src/components/Icon/src/appIconData.ts new file mode 100644 index 00000000..9117847c --- /dev/null +++ b/src/components/Icon/src/appIconData.ts @@ -0,0 +1,382 @@ +const uniIconsUnicodeMap: Record = { + 'arrow-down': '\ue6be', + 'arrow-left': '\ue6bc', + 'arrow-right': '\ue6bb', + 'arrow-up': '\ue6bd', + 'auth': '\ue6ab', + 'auth-filled': '\ue6cc', + 'back': '\ue6b9', + 'bars': '\ue627', + 'calendar': '\ue6a0', + 'calendar-filled': '\ue6c0', + 'camera': '\ue65a', + 'camera-filled': '\ue658', + 'cart': '\ue631', + 'cart-filled': '\ue6d0', + 'chat': '\ue65d', + 'chat-filled': '\ue659', + 'chatboxes': '\ue696', + 'chatboxes-filled': '\ue692', + 'chatbubble': '\ue697', + 'chatbubble-filled': '\ue694', + 'checkbox': '\ue62b', + 'checkbox-filled': '\ue62c', + 'checkmarkempty': '\ue65c', + 'circle': '\ue65b', + 'circle-filled': '\ue65e', + 'clear': '\ue66d', + 'close': '\ue673', + 'closeempty': '\ue66c', + 'cloud-download': '\ue647', + 'cloud-download-filled': '\ue646', + 'cloud-upload': '\ue645', + 'cloud-upload-filled': '\ue648', + 'color': '\ue6cf', + 'color-filled': '\ue6c9', + 'compose': '\ue67f', + 'contact': '\ue693', + 'contact-filled': '\ue695', + 'down': '\ue6b8', + 'bottom': '\ue6b8', + 'download': '\ue68d', + 'download-filled': '\ue681', + 'email': '\ue69e', + 'email-filled': '\ue69a', + 'eye': '\ue651', + 'eye-filled': '\ue66a', + 'eye-slash': '\ue6b3', + 'eye-slash-filled': '\ue6b4', + 'fire': '\ue6a1', + 'fire-filled': '\ue6c5', + 'flag': '\ue65f', + 'flag-filled': '\ue660', + 'folder-add': '\ue6a9', + 'folder-add-filled': '\ue6c8', + 'font': '\ue6a3', + 'forward': '\ue6ba', + 'gear': '\ue664', + 'gear-filled': '\ue661', + 'gift': '\ue6a4', + 'gift-filled': '\ue6c4', + 'hand-down': '\ue63d', + 'hand-down-filled': '\ue63c', + 'hand-up': '\ue63f', + 'hand-up-filled': '\ue63e', + 'headphones': '\ue630', + 'heart': '\ue639', + 'heart-filled': '\ue641', + 'help': '\ue679', + 'help-filled': '\ue674', + 'home': '\ue662', + 'home-filled': '\ue663', + 'image': '\ue670', + 'image-filled': '\ue678', + 'images': '\ue650', + 'images-filled': '\ue64b', + 'info': '\ue669', + 'info-filled': '\ue649', + 'left': '\ue6b7', + 'link': '\ue6a5', + 'list': '\ue644', + 'location': '\ue6ae', + 'location-filled': '\ue6af', + 'locked': '\ue66b', + 'locked-filled': '\ue668', + 'loop': '\ue633', + 'mail-open': '\ue643', + 'mail-open-filled': '\ue63a', + 'map': '\ue667', + 'map-filled': '\ue666', + 'map-pin': '\ue6ad', + 'map-pin-ellipse': '\ue6ac', + 'medal': '\ue6a2', + 'medal-filled': '\ue6c3', + 'mic': '\ue671', + 'mic-filled': '\ue677', + 'micoff': '\ue67e', + 'micoff-filled': '\ue6b0', + 'minus': '\ue66f', + 'minus-filled': '\ue67d', + 'more': '\ue64d', + 'more-filled': '\ue64e', + 'navigate': '\ue66e', + 'navigate-filled': '\ue67a', + 'notification': '\ue6a6', + 'notification-filled': '\ue6c1', + 'paperclip': '\ue652', + 'paperplane': '\ue672', + 'paperplane-filled': '\ue675', + 'person': '\ue699', + 'person-filled': '\ue69d', + 'personadd': '\ue69f', + 'personadd-filled': '\ue698', + 'phone': '\ue69c', + 'phone-filled': '\ue69b', + 'plus': '\ue676', + 'plus-filled': '\ue6c7', + 'plusempty': '\ue67b', + 'pulldown': '\ue632', + 'pyq': '\ue682', + 'qq': '\ue680', + 'redo': '\ue64a', + 'redo-filled': '\ue655', + 'refresh': '\ue657', + 'refresh-filled': '\ue656', + 'refreshempty': '\ue6bf', + 'reload': '\ue6b2', + 'right': '\ue6b5', + 'scan': '\ue62a', + 'search': '\ue654', + 'settings': '\ue653', + 'settings-filled': '\ue6ce', + 'shop': '\ue62f', + 'shop-filled': '\ue6cd', + 'smallcircle': '\ue67c', + 'smallcircle-filled': '\ue665', + 'sound': '\ue684', + 'sound-filled': '\ue686', + 'spinner-cycle': '\ue68a', + 'staff': '\ue6a7', + 'staff-filled': '\ue6cb', + 'star': '\ue688', + 'star-filled': '\ue68f', + 'starhalf': '\ue683', + 'trash': '\ue687', + 'trash-filled': '\ue685', + 'tune': '\ue6aa', + 'tune-filled': '\ue6ca', + 'undo': '\ue64f', + 'undo-filled': '\ue64c', + 'up': '\ue6b6', + 'top': '\ue6b6', + 'upload': '\ue690', + 'upload-filled': '\ue68e', + 'videocam': '\ue68c', + 'videocam-filled': '\ue689', + 'vip': '\ue6a8', + 'vip-filled': '\ue6c6', + 'wallet': '\ue6b1', + 'wallet-filled': '\ue6c2', + 'weibo': '\ue68b', + 'weixin': '\ue691' +} + +const uviewIconsUnicodeMap: Record = { + 'level': '\ue693', + 'column-line': '\ue68e', + 'checkbox-mark': '\ue807', + 'folder': '\ue7f5', + 'movie': '\ue7f6', + 'star-fill': '\ue669', + 'star': '\ue65f', + 'phone-fill': '\ue64f', + 'phone': '\ue622', + 'apple-fill': '\ue881', + 'chrome-circle-fill': '\ue885', + 'backspace': '\ue67b', + 'attach': '\ue632', + 'cut': '\ue948', + 'empty-car': '\ue602', + 'empty-coupon': '\ue682', + 'empty-address': '\ue646', + 'empty-favor': '\ue67c', + 'empty-permission': '\ue686', + 'empty-news': '\ue687', + 'empty-search': '\ue664', + 'github-circle-fill': '\ue887', + 'rmb': '\ue608', + 'person-delete-fill': '\ue66a', + 'reload': '\ue788', + 'order': '\ue68f', + 'server-man': '\ue6bc', + 'search': '\ue62a', + 'fingerprint': '\ue955', + 'more-dot-fill': '\ue630', + 'scan': '\ue662', + 'share-square': '\ue60b', + 'map': '\ue61d', + 'map-fill': '\ue64e', + 'tags': '\ue629', + 'tags-fill': '\ue651', + 'bookmark-fill': '\ue63b', + 'bookmark': '\ue60a', + 'eye': '\ue613', + 'eye-fill': '\ue641', + 'mic': '\ue64a', + 'mic-off': '\ue649', + 'calendar': '\ue66e', + 'calendar-fill': '\ue634', + 'trash': '\ue623', + 'trash-fill': '\ue658', + 'play-left': '\ue66d', + 'play-right': '\ue610', + 'minus': '\ue618', + 'plus': '\ue62d', + 'info': '\ue653', + 'info-circle': '\ue7d2', + 'info-circle-fill': '\ue64b', + 'question': '\ue715', + 'error': '\ue6d3', + 'close': '\ue685', + 'checkmark': '\ue6a8', + 'android-circle-fill': '\ue67e', + 'android-fill': '\ue67d', + 'ie': '\ue87b', + 'IE-circle-fill': '\ue889', + 'google': '\ue87a', + 'google-circle-fill': '\ue88a', + 'setting-fill': '\ue872', + 'setting': '\ue61f', + 'minus-square-fill': '\ue855', + 'plus-square-fill': '\ue856', + 'heart': '\ue7df', + 'heart-fill': '\ue851', + 'camera': '\ue7d7', + 'camera-fill': '\ue870', + 'more-circle': '\ue63e', + 'more-circle-fill': '\ue645', + 'chat': '\ue620', + 'chat-fill': '\ue61e', + 'bag-fill': '\ue617', + 'bag': '\ue619', + 'error-circle-fill': '\ue62c', + 'error-circle': '\ue624', + 'close-circle': '\ue63f', + 'close-circle-fill': '\ue637', + 'checkmark-circle': '\ue63d', + 'checkmark-circle-fill': '\ue635', + 'question-circle-fill': '\ue666', + 'question-circle': '\ue625', + 'share': '\ue631', + 'share-fill': '\ue65e', + 'shopping-cart': '\ue621', + 'shopping-cart-fill': '\ue65d', + 'bell': '\ue609', + 'bell-fill': '\ue640', + 'list': '\ue650', + 'list-dot': '\ue616', + 'zhihu': '\ue6ba', + 'zhihu-circle-fill': '\ue709', + 'zhifubao': '\ue6b9', + 'zhifubao-circle-fill': '\ue6b8', + 'weixin-circle-fill': '\ue6b1', + 'weixin-fill': '\ue6b2', + 'twitter-circle-fill': '\ue6ab', + 'twitter': '\ue6aa', + 'taobao-circle-fill': '\ue6a7', + 'taobao': '\ue6a6', + 'weibo-circle-fill': '\ue6a5', + 'weibo': '\ue6a4', + 'qq-fill': '\ue6a1', + 'qq-circle-fill': '\ue6a0', + 'moments-circel-fill': '\ue69a', + 'moments': '\ue69b', + 'qzone': '\ue695', + 'qzone-circle-fill': '\ue696', + 'baidu-circle-fill': '\ue680', + 'baidu': '\ue681', + 'facebook-circle-fill': '\ue68a', + 'facebook': '\ue689', + 'car': '\ue60c', + 'car-fill': '\ue636', + 'warning-fill': '\ue64d', + 'warning': '\ue694', + 'clock-fill': '\ue638', + 'clock': '\ue60f', + 'edit-pen': '\ue612', + 'edit-pen-fill': '\ue66b', + 'email': '\ue611', + 'email-fill': '\ue642', + 'minus-circle': '\ue61b', + 'minus-circle-fill': '\ue652', + 'plus-circle': '\ue62e', + 'plus-circle-fill': '\ue661', + 'file-text': '\ue663', + 'file-text-fill': '\ue665', + 'pushpin': '\ue7e3', + 'pushpin-fill': '\ue86e', + 'grid': '\ue673', + 'grid-fill': '\ue678', + 'play-circle': '\ue647', + 'play-circle-fill': '\ue655', + 'pause-circle-fill': '\ue654', + 'pause': '\ue8fa', + 'pause-circle': '\ue643', + 'eye-off': '\ue648', + 'eye-off-outline': '\ue62b', + 'gift-fill': '\ue65c', + 'gift': '\ue65b', + 'rmb-circle-fill': '\ue657', + 'rmb-circle': '\ue677', + 'kefu-ermai': '\ue656', + 'server-fill': '\ue751', + 'coupon-fill': '\ue8c4', + 'coupon': '\ue8ae', + 'integral': '\ue704', + 'integral-fill': '\ue703', + 'home-fill': '\ue964', + 'home': '\ue965', + 'hourglass-half-fill': '\ue966', + 'hourglass': '\ue967', + 'account': '\ue628', + 'plus-people-fill': '\ue626', + 'minus-people-fill': '\ue615', + 'account-fill': '\ue614', + 'thumb-down-fill': '\ue726', + 'thumb-down': '\ue727', + 'thumb-up': '\ue733', + 'thumb-up-fill': '\ue72f', + 'lock-fill': '\ue979', + 'lock-open': '\ue973', + 'lock-opened-fill': '\ue974', + 'lock': '\ue97a', + 'red-packet-fill': '\ue690', + 'photo-fill': '\ue98b', + 'photo': '\ue98d', + 'volume-off-fill': '\ue659', + 'volume-off': '\ue644', + 'volume-fill': '\ue670', + 'volume': '\ue633', + 'red-packet': '\ue691', + 'download': '\ue63c', + 'arrow-up-fill': '\ue6b0', + 'arrow-down-fill': '\ue600', + 'play-left-fill': '\ue675', + 'play-right-fill': '\ue676', + 'rewind-left-fill': '\ue679', + 'rewind-right-fill': '\ue67a', + 'arrow-downward': '\ue604', + 'arrow-leftward': '\ue601', + 'arrow-rightward': '\ue603', + 'arrow-upward': '\ue607', + 'arrow-down': '\ue60d', + 'arrow-right': '\ue605', + 'arrow-left': '\ue60e', + 'arrow-up': '\ue606', + 'skip-back-left': '\ue674', + 'skip-forward-right': '\ue672', + 'rewind-right': '\ue66f', + 'rewind-left': '\ue671', + 'arrow-right-double': '\ue68d', + 'arrow-left-double': '\ue68c', + 'wifi-off': '\ue668', + 'wifi': '\ue667', + 'empty-data': '\ue62f', + 'empty-history': '\ue684', + 'empty-list': '\ue68b', + 'empty-page': '\ue627', + 'empty-order': '\ue639', + 'man': '\ue697', + 'woman': '\ue69c', + 'man-add': '\ue61c', + 'man-add-fill': '\ue64c', + 'man-delete': '\ue61a', + 'man-delete-fill': '\ue66a', + 'zh': '\ue70a', + 'en': '\ue692' +} + +const uniIconsList = Object.keys(uniIconsUnicodeMap) +const uviewIconsList = Object.keys(uviewIconsUnicodeMap) + +export { uniIconsList, uviewIconsList, uniIconsUnicodeMap, uviewIconsUnicodeMap } diff --git a/src/components/QrcodeActionCard/index.vue b/src/components/QrcodeActionCard/index.vue new file mode 100644 index 00000000..7477e779 --- /dev/null +++ b/src/components/QrcodeActionCard/index.vue @@ -0,0 +1,371 @@ + + + + + diff --git a/src/components/RouterSearch/index.vue b/src/components/RouterSearch/index.vue index 3fa35f6e..592316fd 100644 --- a/src/components/RouterSearch/index.vue +++ b/src/components/RouterSearch/index.vue @@ -17,9 +17,10 @@ /> -
+
>() const routers = router.getRoutes() // 路由对象 const options = computed(() => { @@ -86,6 +88,15 @@ function hiddenTopSearch() { showTopSearch.value = false } +function toggleTopSearch() { + showTopSearch.value = !showTopSearch.value + if (showTopSearch.value) { + setTimeout(() => { + topSelectRef.value?.focus() + }, 600) + } +} + onMounted(() => { window.addEventListener('keydown', listenKey) window.addEventListener('click', hiddenTopSearch) diff --git a/src/components/TableSelectDialog/TableSelectDialog.vue b/src/components/TableSelectDialog/TableSelectDialog.vue new file mode 100644 index 00000000..edc0cfab --- /dev/null +++ b/src/components/TableSelectDialog/TableSelectDialog.vue @@ -0,0 +1,241 @@ + + + + diff --git a/src/layout/components/Menu/src/Menu.vue b/src/layout/components/Menu/src/Menu.vue index 94a1da4a..702c1c6f 100644 --- a/src/layout/components/Menu/src/Menu.vue +++ b/src/layout/components/Menu/src/Menu.vue @@ -202,6 +202,35 @@ $prefix-cls: #{$namespace}-menu; .#{$elNamespace}-menu-item { padding-right: 0; } + + &:not(.#{$elNamespace}-menu--collapse) { + .#{$elNamespace}-sub-menu__title, + .#{$elNamespace}-menu-item { + display: flex; + align-items: flex-start; + /* min-height: var(--el-menu-item-height);*/ + height: auto; + padding-top: 10px; + padding-bottom: 10px; + white-space: normal; + } + +/* .#{$elNamespace}-sub-menu__icon-arrow { + margin-top: 8px; + }*/ + + .#{$prefix-cls}__title { + display: block; + flex: 1; + min-width: 0; + overflow: visible; + text-overflow: initial; + white-space: normal; + overflow-wrap: anywhere; + word-break: break-word; + line-height: 1.4; + } + } } } @@ -228,6 +257,10 @@ $prefix-cls: #{$namespace}-menu; } .#{$prefix-cls}__title { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; /* stylelint-disable-next-line */ max-height: calc(var(--top-tool-height) - 2px) !important; /* stylelint-disable-next-line */ diff --git a/src/layout/components/Menu/src/components/useRenderMenuTitle.tsx b/src/layout/components/Menu/src/components/useRenderMenuTitle.tsx index 8941d9d7..6f7caff7 100644 --- a/src/layout/components/Menu/src/components/useRenderMenuTitle.tsx +++ b/src/layout/components/Menu/src/components/useRenderMenuTitle.tsx @@ -10,14 +10,10 @@ export const useRenderMenuTitle = () => { return icon ? ( <> - - {t(title as string)} - + {t(title as string)} ) : ( - - {t(title as string)} - + {t(title as string)} ) } diff --git a/src/locales/en.ts b/src/locales/en.ts index 89223c1e..7e2ddee2 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -1,5 +1,6 @@ export default { common: { + loading: 'Loading...', inputText: 'Please input', selectText: 'Please select', startTimeText: 'Start time', @@ -37,6 +38,7 @@ export default { toolDes: 'Used to set up custom systems', query: 'Query', reset: 'Reset', + noData: 'No data', shrink: 'Put away', expand: 'Expand', confirmTitle: 'System Hint', @@ -57,7 +59,209 @@ export default { copy: 'Copy', copySuccess: 'Copy Success', copyError: 'Copy Error', - code:'Auto-generate on Save' + yes: 'Yes', + no: 'No', + code: 'Auto-generate on Save' + }, + ReportDashboard: { + DashboardList: { + searchNameLabel: 'Name', + searchNamePlaceholder: 'Please enter name', + searchRemarkLabel: 'Remark', + searchRemarkPlaceholder: 'Please enter remark', + searchStateLabel: 'Status', + searchStatePlaceholder: 'Please select status', + + coverAlt: 'Cover image', + stateEnabled: 'Enabled', + stateDisabled: 'Disabled', + noRemark: 'No description', + + dialogCreateTitle: 'Create Dashboard', + dialogEditTitle: 'Edit Dashboard', + dialogNameLabel: 'Name', + dialogNamePlaceholder: 'Please enter name', + dialogTypeLabel: 'Type', + dialogTypePlaceholder: 'Please select type', + dialogOrgLabel: 'Line', + dialogOrgPlaceholder: 'Please select line', + dialogDeviceLabel: 'Device', + dialogDevicePlaceholder: 'Please select device', + dialogPointPlaceholder: 'Please select points', + dialogAddDeviceButton: 'Add device', + dialogContentLabel: 'Content', + dialogContentPlaceholder: 'Please enter content', + dialogRemarkLabel: 'Remark', + dialogRemarkPlaceholder: 'Please enter remark', + dialogStateLabel: 'Status', + + validatorNameRequired: 'Name is required', + validatorTypeRequired: 'Dashboard type is required', + validatorOrgRequired: 'Line is required', + + messageRouteMissing: 'Preview route is not configured', + messageDevicePointRequired: 'Please configure at least one device and point group', + messageMissingId: 'Missing record ID, unable to edit' + }, + Dashboard1: { + header: { + title: 'Production Line Dashboard', + weather: { + cloudyToClear: 'Cloudy to clear' + }, + weekDays: { + Sunday: 'Sunday', + Monday: 'Monday', + Tuesday: 'Tuesday', + Wednesday: 'Wednesday', + Thursday: 'Thursday', + Friday: 'Friday', + Saturday: 'Saturday' + } + }, + deviceIdPrefix: 'ID:', + defaultDeviceName: 'Default Device', + statusOffline: 'Offline', + statusRunning: 'Running', + statusStandby: 'Standby', + statusFault: 'Fault', + deviceOverview: { + title: 'Device Overview', + device: 'Devices', + running: 'Running', + idle: 'Standby', + alarm: 'Alarms', + utilization: 'Utilization', + faultRate: 'Fault Rate' + }, + alarms: { + title: 'Real-time Alarms', + tag: 'Scrolling', + levelSevere: 'Severe', + levelWarn: 'Warning', + levelInfo: 'Info' + }, + productionTrend: { + title: 'Output Trend', + tagToday: 'Today', + seriesOutput: 'Output' + }, + eventReminder: { + title: 'Event Reminder', + modeDevice: 'Device', + modeMold: 'Mold', + check: 'Inspection', + maintain: 'Maintenance', + repair: 'Repair' + }, + taskList: { + title: 'Task List', + columns: { + code: 'Code', + name: 'Name', + type: 'Type', + finishStatus: 'Completion', + result: 'Result' + }, + finishPending: 'Pending', + finishDone: 'Completed', + finishCanceled: 'Canceled', + resultPass: 'Pass', + resultFail: 'Fail' + }, + energyMonitor: { + title: 'Energy Monitor', + selectPlaceholder: 'Please select', + seriesEnergy: 'Energy' + } + } + }, + Dashboard8: { + Header: { + title: 'Smart Manufacturing Line Task Overview', + subTitle: 'INTELLIGENT MANUFACTURING REAL-TIME DASHBOARD' + }, + TaskBoard: { + title: 'Line Task Board', + tag: 'Auto refresh · Scrolling', + statusCompleted: 'Completed', + statusLowProgress: 'Behind', + columns: { + lineName: 'Line', + planNo: 'Plan No.', + productName: 'Product', + planQty: 'Planned', + doneQty: 'Completed', + passRate: 'Pass Rate' + } + }, + DayCapacity: { + title: 'Daily Capacity', + tag: 'Today', + metrics: { + orders: 'Orders', + scheduled: 'Scheduled', + produced: 'Produced', + rate: 'Quality Rate' + }, + chart: { + scheduled: 'Scheduled', + produced: 'Produced' + } + }, + MonthCapacity: { + title: 'Monthly Capacity', + tag: 'This month', + metrics: { + orders: 'Orders', + scheduled: 'Scheduled', + produced: 'Produced', + rate: 'Quality Rate' + }, + chart: { + scheduled: 'Scheduled', + produced: 'Produced' + } + }, + WeekTrend: { + title: 'Weekly Output Trend', + legendOutput: 'Output', + legendPlan: 'Plan', + seriesPlanOutput: 'Planned Output', + seriesActualOutput: 'Actual Output' + }, + OpsTrend: { + title: 'Completed Output', + defaultLine: 'All lines', + yAxisName: 'Completed Output', + seriesName: 'Completed Output', + summary: '{line} · Avg {value}' + }, + TodayOps: { + title: 'Today Power/Utilization', + empty: 'No data', + powerOnRate: 'Power-on Rate', + utilizationRate: 'Utilization' + }, + QualityTrend: { + title: 'Product Quality Trend', + tag: 'Daily (All lines)', + seriesName: 'Pass Rate', + markLineAverage: 'Avg {value}%', + markLineAverageName: 'Average' + }, + RealAlarm: { + title: 'Real-time Alarms', + tag: 'Scrolling', + levelSevere: 'Severe', + levelWarn: 'Warning', + levelInfo: 'Info' + }, + EnergyTrend: { + title: 'Weekly Energy Trend', + selectPlaceholder: 'Please select', + seriesActualEnergy: 'Actual Energy (kWh)' + } }, ErpStock: { Warehouse: { @@ -85,6 +289,58 @@ export default { cancel: 'cancel', exportName: 'Warehouse.xls' }, + WarehouseArea: { + warehouseId: 'Warehouse', + areaCode: 'Area Code', + areaName: 'Area Name', + areaSize: 'Area Size (㎡)', + description: 'Description', + status: 'Status', + createTime: 'Create Time', + placeholderWarehouseId: 'Please select warehouse', + placeholderAreaCode: 'Please enter area code', + placeholderAreaName: 'Please enter area name', + placeholderAreaSize: 'Please enter area size', + placeholderDescription: 'Please enter description', + placeholderStatus: 'Please select status', + validatorWarehouseIdRequired: 'Warehouse is required', + validatorAreaCodeRequired: 'Area code is required', + validatorAreaNameRequired: 'Area name is required', + validatorStatusRequired: 'Status is required' + }, + WarehouseLocation: { + warehouseId: 'Warehouse', + areaId: 'Area', + code: 'Location Code', + name: 'Location Name', + areaSize: 'Area Size (㎡)', + maxLoadWeight: 'Max Load Weight', + position: 'Position (X,Y,Z)', + positionX: 'Position X', + positionY: 'Position Y', + positionZ: 'Position Z', + allowProductMix: 'Allow Product Mix', + allowBatchMix: 'Allow Batch Mix', + status: 'Status', + createTime: 'Create Time', + placeholderWarehouseId: 'Please select warehouse', + placeholderAreaId: 'Please select area', + placeholderCode: 'Please enter location code', + placeholderName: 'Please enter location name', + placeholderAreaSize: 'Please enter area size', + placeholderMaxLoadWeight: 'Please enter max load weight', + placeholderPositionX: 'Please enter position X', + placeholderPositionY: 'Please enter position Y', + placeholderPositionZ: 'Please enter position Z', + placeholderStatus: 'Please select status', + validatorWarehouseIdRequired: 'Warehouse is required', + validatorAreaIdRequired: 'Area is required', + validatorCodeRequired: 'Location code is required', + validatorNameRequired: 'Location name is required', + validatorAllowProductMixRequired: 'Allow product mix is required', + validatorAllowBatchMixRequired: 'Allow batch mix is required', + validatorStatusRequired: 'Status is required' + }, Stock: { product: 'Product', warehouse: 'Warehouse', @@ -178,6 +434,7 @@ export default { action: 'Action', placeholderWarehouse: 'Please select warehouse', placeholderProduct: 'Please select product', + placeholderBarcode: 'Please select barcode', validatorWarehouseRequired: 'Warehouse is required', validatorProductRequired: 'Product is required', validatorCountRequired: 'Quantity is required' @@ -341,6 +598,45 @@ export default { large: 'Large', small: 'Small' }, + home: { + welcome: 'Welcome to use the Besure Digital Intelligent Central Control Platform', + message: + 'The Besure Digital Intelligent Central Control Platform takes production operation as the core, uniformly integrating key business modules such as production planning, data collection, warehousing, equipment, energy, molds, quality, formulas and report analysis, to achieve full-process digital management from planning to execution, from equipment to products, and from data to decision-making.', + productTitle: 'Overall production overview', + placeholderCreateTimeStart: 'Start Date', + placeholderCreateTimeEnd: 'End Date', + productionSchedule: 'Real-time production progress', + productionPlan: 'Production plan', + productionName: 'Production name', + planNumber: 'Plan quantity', + productionLine: 'Production line', + planStartTime: 'Plan start time', + planEndTime: 'Plan end time', + completedQuantity: 'Completed quantity', + qualifiedQuantity: 'Qualified quantity', + unqualifiedQuantity: 'Unqualified quantity', + yieldRate: 'YIELD', + actualEndTime: 'Actual end time', + gtasks: 'Gtask', + missionNumber: 'Mission number', + taskType: 'Task type', + target: 'Target', + creationTime: 'Creation time', + equipment: 'Equipment', + mould: 'Mould', + equipmentTile: 'Overall condition of the collection equipment', + equipmentCount: 'Total equipment count', + operation: 'Operation', + standbyMode: 'Standby mode', + malfunction: 'During the malfunction', + alerting: 'Alerting...', + useRatio: 'use ratio', + failureRate: 'failure rate', + equipmentTitle: 'Statistics of equipment maintenance quantities', + equipmentClass: 'Equipment classification statistics', + equipmentMessage: + 'Classify and count by mold type, and select the top 10 items with the largest number of molds.' + }, login: { welcome: 'Welcome to the system', message: 'Backstage management system', @@ -691,6 +987,7 @@ export default { SystemManagement: { Dept: { name: 'Department Name', + enName: 'Department Name (en)', statusLabel: 'Department Status', status: 'Status', leader: 'Leader', @@ -758,7 +1055,8 @@ export default { emailInvalid: 'Please input a valid email address', mobileInvalid: 'Please input a valid mobile number', importFileRequired: 'Please upload file', - importSuccessTip: 'Upload success: {createCount}; Update success: {updateCount}; Update failed: {failureCount};', + importSuccessTip: + 'Upload success: {createCount}; Update success: {updateCount}; Update failed: {failureCount};', importFailed: 'Upload failed, please upload again!', importFileLimit: 'Only one file can be uploaded!', resetPasswordTitle: 'Please input new password for "{username}"', @@ -846,6 +1144,11 @@ export default { refreshCache: 'Refresh Menu Cache', updateCacheConfirm: 'The cache will be updated and the browser will be refreshed!', updateCacheTitle: 'Refresh Menu Cache', + clientTypeWeb: 'Web Menu', + clientTypeApp: 'APP Menu', + terminalType: 'Terminal Type', + terminalTypeMobile: 'Phone', + terminalTypeScanner: 'Scanner', visibleShow: 'Show', visibleHide: 'Hide', always: 'Always', @@ -856,6 +1159,7 @@ export default { nameRequired: 'Menu name is required', sortRequired: 'Menu order is required', pathRequired: 'Route path is required', + terminalTypeRequired: 'Terminal type is required', statusRequired: 'Status is required', pathMustStartWithSlash: 'Path must start with /', pathMustNotStartWithSlash: 'Path must not start with /', @@ -878,8 +1182,10 @@ export default { Dict: { id: 'Dict ID', name: 'Dict Name', + enName: 'Dict Name (en)', type: 'Dict Type', label: 'Dict Label', + labelEn: 'Dict Label (EN)', value: 'Dict Value', sort: 'Dict Sort', status: 'Status', @@ -895,8 +1201,10 @@ export default { searchLabelPlaceholder: 'Please input dict label', searchDataStatusPlaceholder: 'Please select data status', namePlaceholder: 'Please input dict name', + enNamePlaceholder: 'Please input dict name (en)', typePlaceholder: 'Please input dict type', labelPlaceholder: 'Please input data label', + labelEnPlaceholder: 'Please input data label (EN)', valuePlaceholder: 'Please input data value', sortPlaceholder: 'Please input data order', remarkPlaceholder: 'Please input content', @@ -948,12 +1256,32 @@ export default { }, // Equipment Ledger EquipmentLedger: { + lineCategory: 'Production Line Category', + lineCategoryAll: 'All', + createLineCategory: 'Add Production Line Category', + updateLineCategory: 'Edit Production Line Category', + emptyDeviceData: 'No device data', + runningLabel: 'Running', + images: 'Images', deviceCode: 'Code', + qrcode: 'QR Code/Barcode', deviceName: 'Name', deviceStatus: 'Status', + statusEnabled: 'Enabled', + statusDisabled: 'Disabled', + statusRunning: 'Running', + statusStandby: 'Standby', + statusFault: 'Fault', + statusMaintenance: 'Under Maintenance', + statusStopped: 'Stopped', + statusUnknown: 'Unknown', deviceType: 'Type', deviceSpec: 'Spec', deviceModel: 'Model', + isSchedueld: 'Schedule', + ratedCapacity: 'Rated Capacity', + yes: 'Yes', + no: 'No', productionDate: 'Production Date', factoryEntryDate: 'Factory Entry Date', deviceLocation: 'Location', @@ -973,6 +1301,7 @@ export default { placeholderDeviceType: 'Please select type', placeholderDeviceModel: 'Please input model', placeholderDeviceSpec: 'Please input spec', + placeholderRatedCapacity: 'Please input rated capacity', placeholderProductionDate: 'Please select production date', placeholderFactoryEntryDate: 'Please select factory entry date', placeholderDeviceLocation: 'Please input location', @@ -1018,11 +1347,68 @@ export default { fileUrl: 'File', serialNumber: 'No.', dvName: 'Device Name', - dvId: 'Please select device' + dvId: 'Please select device', + qrcodeLoadError: 'Failed to load QR code', + qrcodeEmpty: 'No QR code', + exportFileName: 'Device Ledger', + validatorDeviceCodeRequired: 'Code can not be empty', + gjTitle: 'Select key components', + bjTitle: 'Select spare parts', + normal: 'Normal', + stop: 'Stopped', + maintenance: 'Maintenance', + scrap: 'Scrap', + placeholderWorkshop: 'Please input workshop', + reportCapacity: 'Report Capacity', + actualCapacity: 'Actual Capacity', + Detail: { + invalidId: 'Invalid device ID' + } + }, + // Capacity Report + CapacityReport: { + deviceCode: 'Device Code', + deviceName: 'Device Name', + deviceType: 'Device Type', + deviceStatus: 'Device Status', + workshop: 'Workshop', + ratedCapacity: 'Rated Capacity (Planned Capacity)', + reportCapacity: 'Report Capacity', + reportCapacityTooltip: 'Default query for average of data from the last half year (excluding today)', + reportCapacityViewDetail: 'View Detail', + actualCapacity: 'Actual Capacity', + actualCapacityTooltip: 'Default query for average of data from the last half year (excluding today)', + placeholderDeviceCode: 'Please input device code', + placeholderDeviceName: 'Please input device name', + placeholderDeviceType: 'Please input device type', + placeholderDeviceStatus: 'Please select device status', + placeholderWorkshop: 'Please input workshop', + baogongTime: 'Capacity Statistics Time', + placeholderBaogongTimeStart: 'Start Time', + placeholderBaogongTimeEnd: 'End Time', + shortcutLastWeek: 'Last Week', + shortcutLastHalfYear: 'Last Half Year', + shortcutLastYear: 'Last Year', + dialogTitlePrefix: 'Report Capacity Detail - ', + dialogProductCode: 'Product Code', + dialogProductCodePlaceholder: 'Please input product code', + dialogProductName: 'Product Name', + dialogProductNamePlaceholder: 'Please input product name', + dialogBaogongTime: 'Report Time', + dialogBaogongTimeStart: 'Report Start Time', + dialogBaogongTimeEnd: 'Report End Time', + dialogTaskCode: 'Task Code', + dialogTaskCodePlaceholder: 'Please input task code', + dialogBaogongTotal: 'Report Total', + dialogAvgCapacity: 'Avg Report Capacity', + dialogSearchButtonText: 'Search', + dialogResetButtonText: 'Reset', + exportFilename: 'Capacity Report.xls' }, // Critical Component EquipmentKeyItems: { code: 'Code', + qrcode: 'QR Code/Barcode', name: 'Name', batchDelete: 'Batch Delete', description: 'Description', @@ -1034,7 +1420,12 @@ export default { placeholderCode: 'Please input code', placeholderName: 'Please input name', placeholderDescription: 'Please input description', - placeholderRemark: 'Please input remark' + placeholderRemark: 'Please input remark', + qrcodeLoadError: 'Failed to load QR code', + qrcodeEmpty: 'No QR code', + validatorCodeRequired: 'Code can not be empty', + validatorNameRequired: 'Name can not be empty', + images: 'images' }, // Maintenance Project (Project Maintenance) DvSubject: { @@ -1042,7 +1433,7 @@ export default { name: 'Name', inspectionMethod: 'Inspection Method', valueType: 'Value Type', - judgmentCriteria: 'Judgment Criteria', + judgmentCriteria: 'Job Content', upperVal: 'Upper Value', lowerVal: 'Lower Value', creatorName: 'Creator', @@ -1062,7 +1453,7 @@ export default { placeholderInspectionMethod: 'Please select inspection method', placeholderValueType: 'Please select value type', placeholderUpperVal: 'Please input upper value', - placeholderLowerVal: 'Please input lower value', + placeholderLowerVal: 'Please input lower value' }, // Plan Maintenance PlanMaintenance: { @@ -1293,6 +1684,7 @@ export default { SpareInfo: { name: 'Spare Part Name', code: 'Spare Part Code', + qrcode: 'QR Code/Barcode', standard: 'Specification', expiryDay: 'Shelf Life (days)', category: 'Category', @@ -1310,6 +1702,8 @@ export default { placeholderRemark: 'Please input remark', placeholderStandard: 'Please input specification', placeholderExpiryDay: 'Please input shelf life (days)', + qrcodeLoadError: 'Failed to load QR code', + qrcodeEmpty: 'No QR code', validatorNameRequired: 'Spare part name can not be empty', validatorCodeRequired: 'Spare part code can not be empty', validatorCategoryRequired: 'Category can not be empty', @@ -1475,6 +1869,8 @@ export default { addButtonText: 'Add', exportButtonText: 'Export', expandButtonText: 'Expand/Collapse', + collapseText: 'Collapse', + expandText: 'Expand', tableCodeColumn: 'Organization Code', tableNameColumn: 'Organization Name', tableSortColumn: 'Display Order', @@ -1550,8 +1946,8 @@ export default { addButtonText: 'Add', exportButtonText: 'Export', expandButtonText: 'Expand/Collapse', - tableCodeColumn: 'Category Code', - tableNameColumn: 'Category Name', + tableCodeColumn: 'Code', + tableNameColumn: 'Name', tableSortColumn: 'Sort', tableStatusColumn: 'Status', tableCreateTimeColumn: 'Create Time', @@ -1580,6 +1976,8 @@ export default { moduleName: 'Product Material Information', searchNameLabel: 'Name', searchNamePlaceholder: 'Please enter name', + searchCodeLabel: 'Code', + searchCodePlaceholder: 'Please enter code', searchButtonText: 'Search', resetButtonText: 'Reset', addButtonText: 'Add', @@ -1594,6 +1992,7 @@ export default { tableOperateColumn: 'Operation', tableEditAction: 'Edit', tableDeleteAction: 'Delete', + qrcode: 'QR Code/Barcode', dialogBarCodeLabel: 'Code', dialogBarCodePlaceholder: 'Please enter code', dialogNameLabel: 'Name', @@ -1619,6 +2018,8 @@ export default { dialogRemarkPlaceholder: 'Please enter remark', dialogCancelButton: 'Cancel', dialogSubmitButton: 'Confirm', + qrcodeLoadError: 'Failed to load QR code', + qrcodeEmpty: 'No QR code', validatorNameRequired: 'Product name can not be empty', validatorBarCodeRequired: 'Product barcode can not be empty', validatorCategoryRequired: 'Product category id can not be empty', @@ -1643,6 +2044,7 @@ export default { exportButtonText: 'Export', tableRuleCodeColumn: 'Rule Code', tableRuleNameColumn: 'Rule Name', + tableBarcodeTypeColumn: 'Code Type', tableRuleDescColumn: 'Description', tableMaxLengthColumn: 'Max Length', tableIsPaddedColumn: 'Pad', @@ -1660,6 +2062,9 @@ export default { dialogRuleCodePlaceholder: 'Please enter rule code', dialogRuleNameLabel: 'Rule Name', dialogRuleNamePlaceholder: 'Please enter rule name', + dialogBarcodeTypeLabel: 'Code Type', + barcodeTypeBarcodeLabel: 'Barcode', + barcodeTypeQrcodeLabel: 'QR Code', dialogRuleDescLabel: 'Description', dialogRuleDescPlaceholder: 'Please enter description', dialogMaxLengthLabel: 'Max Length', @@ -1845,6 +2250,7 @@ export default { resetButtonText: 'Reset', addButtonText: 'Add', exportButtonText: 'Export', + importButtonText: 'Import', tableNameColumn: 'Unit Name', tablePrimaryFlagColumn: 'Is Primary Unit', tableChangeRateColumn: 'Conversion Rate to Primary Unit', @@ -1865,7 +2271,80 @@ export default { dialogSubmitButton: 'Confirm', validatorNameRequired: 'Unit name can not be empty', validatorStatusRequired: 'Unit status can not be empty', - validatorPrimaryFlagRequired: 'Primary unit flag can not be empty' + validatorPrimaryFlagRequired: 'Primary unit flag can not be empty', + import: 'Import unit', + importDragText: 'Drag file here, or', + importClickText: 'click to upload', + importUpdateSupport: 'Update existing user data if present', + importFormatLimit: 'Only xls, xlsx format files are allowed.', + importDownloadTemplate: 'Download template', + importFileRequired: 'Please upload file', + importSuccessTip: + 'Upload success: {createCount}; Update success: {updateCount}; Update failed: {failureCount};', + importFailed: 'Upload failed, please upload again!', + importFileLimit: 'Only one file can be uploaded!' + }, + CalHoliday: { + setWorkingDays: 'set working days', + setHoliday: 'set holiday', + lastMonth: 'last month', + today: 'today', + nextMonth: 'next month', + work: 'work', + rest: 'rest', + searchDateStartPlaceholder: '开始日期', + searchDateEndPlaceholder: '结束日期', + searchTypeLabel: '类型', + searchTypePlaceholder: '请选择类型', + searchRemarkLabel: '备注', + searchRemarkPlaceholder: '请输入备注', + searchButtonText: '搜索', + resetButtonText: '重置', + addButtonText: '新增', + exportButtonText: '导出' + }, + + EsopFile: { + moduleName: 'File Management', + searchCodeLabel: 'File Code', + searchCodePlaceholder: 'Please enter file code', + searchFileNameLabel: 'File_Name', + searchFileNamePlaceholder: 'Please enter file name', + searchClassificationLabel: 'File Classification', + searchClassificationPlaceholder: 'Please select file Classification', + searchStatusLabel: 'File Status', + searchStatusPlaceholder: 'Please select file status', + searchButtonText: 'Search', + resetButtonText: 'Reset', + uploadButtonText: 'Upload', + exportButtonText: 'Export', + tableCodeColumn: 'File Code', + tableNameColumn: 'File Name', + tableClassificationColumn: 'File Classification', + tableTypeColumn: 'File Type', + tableStatusColumn: 'File Status', + tableCreatorNameColumn: 'Uploader', + tableCreateTimeColumn: 'Upload Time', + tableOperateColumn: 'Operation', + tableEditAction: 'Edit', + tableDownloadAction: 'Download', + tableDeleteAction: 'Delete', + dialogFileNameLabel: 'File Name', + dialogFileNamePlaceholder: 'Please enter file name', + dialogClassificationLabel: 'File Classification', + dialogClassificationPlaceholder: 'Please select file classification', + dialogStatusLabel: 'File Status', + dialogCancelButton: 'Cancel', + dialogSubmitButton: 'Confirm', + messageOne: 'Tip: Only ', + messageTwo: ' format files are allowed to be imported!', + messageThree: ' Drag the file to this area, or ', + messageFour: ' click to upload', + validatorCodeRequired: 'File code can not be empty', + validatorNameRequired: 'File name can not be empty', + validatorClassificationRequired: 'File classification can not be empty', + validatorTypeRequired: 'File type can not be empty', + validatorStatusRequired: 'File status can not be empty' } }, @@ -1904,6 +2383,7 @@ export default { unit: 'Unit', inTime: 'Stock In Time', status: 'Status', + qrcode: 'QR / Barcode', images: 'Mold Images', remark: 'Remark', isEnable: 'Is Enable', @@ -1930,7 +2410,9 @@ export default { validatorIsEnableRequired: 'Is enable can not be empty', validatorBrandRequired: 'Model can not be empty', selectBrandTip: 'Please select a mold model', - statusTooltip: 'Source: Data dictionary - Mold status' + statusTooltip: 'Source: Data dictionary - Mold status', + qrcodeLoadError: 'QR code load failed', + qrcodeEmpty: 'No QR code' }, MoldReturn: { @@ -2335,6 +2817,42 @@ export default { updateFail: 'Update failed' } }, + TemplateManagement: { + PrintTemplate: { + moduleName: 'Print Template', + templateCode: 'Template Code', + templateName: 'Template Name', + templateType: 'Template Type', + templateBizType: 'Template Category', + bizTypePrint: 'Print', + bizTypeReport: 'Report', + templateJson: 'Template JSON', + isConfigured: 'Configured', + configured: 'Configured', + notConfigured: 'Not Configured', + remark: 'Remark', + isEnable: 'Enabled', + enabled: 'Enabled', + disabled: 'Disabled', + createTime: 'Create Time', + operate: 'Operate', + exportFilename: 'PrintTemplate.xls', + typeLabel: 'Label', + typeBarcode: 'Barcode', + typeReport: 'Report', + placeholderTemplateCode: 'Please input template code', + templateCodeTooltip: 'Turn on the switch to auto-generate code, no manual input required', + placeholderTemplateName: 'Please input template name', + placeholderTemplateType: 'Please select template type', + placeholderTemplateJson: 'Please input template JSON content', + placeholderRemark: 'Please input remark', + validatorCodeRequired: 'Template code can not be empty', + validatorNameRequired: 'Template name can not be empty', + validatorTypeRequired: 'Template type can not be empty', + design: 'Design', + designTitle: 'Template Design' + } + }, QualityManagement: { ZjType: { moduleName: 'Inspection Type', @@ -2385,6 +2903,7 @@ export default { sampleMethod: 'Sampling Method', val: 'Value', item: 'Related Items', + product: 'Related Products', remark: 'Remark', createTime: 'Create Time', operate: 'Operate', @@ -2398,13 +2917,17 @@ export default { placeholderSampleMethod: 'Please select sampling method', placeholderVal: 'Please input value', placeholderItem: 'Please select inspection items', + placeholderProduct: 'Please select related products', + selectProductDialogTitle: 'Select Related Products', placeholderRemark: 'Please input remark', placeholderCreateTimeStart: 'Start Date', placeholderCreateTimeEnd: 'End Date', validatorNameRequired: 'Name can not be empty', validatorTypeRequired: 'Type can not be empty', validatorSampleMethodRequired: 'Sampling method can not be empty', - validatorValRequired: 'Value can not be empty' + validatorValRequired: 'Value can not be empty', + atIntervals: 'at intervals', + extraction: 'extraction' }, ZjTask: { moduleName: 'Inspection Task', @@ -2666,7 +3189,8 @@ export default { readDialogSubmitButtonText: 'Read', readDialogCancelButton: 'Cancel', readDeviceConfirmMessage: 'Do you want to read device data?', - readDialogOverwriteTip: 'Reading again will overwrite existing device data and manual parameters', + readDialogOverwriteTip: + 'Reading again will overwrite existing device data and manual parameters', detailTabDeviceDataLabel: 'Device Data', detailTabManualLabel: 'Manual Parameters', detailDevicePointNameColumn: 'Point Name', @@ -2677,7 +3201,22 @@ export default { manualTableDataTypeColumn: 'Data Type', manualTableDataUnitColumn: 'Unit', manualTableReferColumn: 'Reference Value', - manualTableRemarkColumn: 'Remark' + manualTableRemarkColumn: 'Remark', + manualTableInputTimeColumn: 'Input Time', + manualTableEnteringAction: 'Re-enroll', + manualFormTitleLabel: 'Re-recorded collected values', + nanualFormNameLabel: 'Name', + nanualFormNamePlaceholder: 'Please enter name', + nanualFormDataTypeLabel: 'Data Type', + nanualFormDataTypePlaceholder: 'Please select data type', + nanualFormDataUnitLabel: 'Unit', + nanualFormDataUnitPlaceholder: 'Please select unit', + nanualFormReferLabel: 'Reference Value', + nanualFormReferPlaceholder: 'Please enter reference value', + nanualFormRemarkLabel: 'Remark', + nanualFormRemarkPlaceholder: 'Please enter remark', + nanualFormInputTimeLabel: 'Input Time', + nanualFormInputTimePlaceholder: 'Please select input time' } }, EnergyManagement: { @@ -2724,7 +3263,7 @@ export default { validatorUnitRequired: 'Unit can not be empty', validatorIsEnableRequired: 'Enabled can not be empty', - exportFilename: 'EnergyType.xls', + exportFilename: 'EnergyType.xls' }, EnergyDeviceCheck: { moduleName: 'Energy Report', @@ -2864,6 +3403,7 @@ export default { tableOrderDateColumn: 'Order Date', tableDeliveryDateColumn: 'Delivery Date', tableTaskTypeColumn: 'Type', + tableIsUrgentColumn: 'Urgent', tableStatusColumn: 'Status', tableRemarkColumn: 'Remark', tableOperateColumn: 'Operate', @@ -2883,6 +3423,9 @@ export default { dialogDeliveryDatePlaceholder: 'Select delivery date', dialogTaskTypeLabel: 'Task Type', dialogTaskTypeTooltip: 'Source: Data Dictionary - Task Type', + dialogIsUrgentLabel: 'Urgent', + urgentNoLabel: 'No', + urgentYesLabel: 'Yes', dialogRemarkLabel: 'Remark', dialogRemarkPlaceholder: 'Please enter remark', dialogSubmitButtonText: 'Confirm', @@ -2890,6 +3433,7 @@ export default { validatorDeliveryDateRequired: 'Delivery date cannot be empty', validatorTaskTypeRequired: 'Task type cannot be empty', + validatorIsUrgentRequired: 'Urgent flag cannot be empty', saleDialogCodeLabel: 'Code', saleDialogCodePlaceholder: 'Please enter task code', @@ -2939,7 +3483,8 @@ export default { detailDialogBoxingDatePlaceholder: 'Select boxing date', detailDialogArriveDateLabel: 'Arrival Date', detailDialogArriveDatePlaceholder: 'Select arrival date', - detailDialogRemarkLabel: 'Remark:', + detailDialogRemarkLabel: 'Remark', + detailDialogRemarkPlaceholder: 'Please enter remark', detailDialogSubmitButtonText: 'Confirm', detailDialogCancelButtonText: 'Cancel', @@ -3025,6 +3570,10 @@ export default { tabAllLabel: 'All', tabIssuedLabel: 'Issued', + tabPartialSchedulingLabel: 'Partial Scheduling', + tabPendingProductionLabel: 'Pending Production', + tabInProductionLabel: 'In Production', + tabCompletedLabel: 'Completed', tabPlanLabel: 'Planned', tabStartLabel: 'Started', tabFinishedLabel: 'Finished', @@ -3034,6 +3583,8 @@ export default { tableOrderDateColumn: 'Order Date', tableDeliveryDateColumn: 'Delivery Date', tableStatusColumn: 'Status', + tableScheduleCompletedColumn: 'Schedule Completed', + tableProductionProgressColumn: 'Production Progress', tableRemarkColumn: 'Remark', tableOperateColumn: 'Operate', @@ -3044,6 +3595,7 @@ export default { detailTableTaskCodeColumn: 'Task Order', detailTableProductCodeColumn: 'Product Code', detailTableProductNameColumn: 'Product Name', + detailTableDeviceNameColumn: 'Device Name', detailTableTotalNumberColumn: 'Total Quantity', detailTablePlanNumberColumn: 'Planned', detailTableUnplanNumberColumn: 'Unplanned', @@ -3089,7 +3641,56 @@ export default { validatorPlanFormTaskIdRequired: 'Task order can not be empty', validatorPlanFormPlanNumberRequired: 'Quantity can not be empty', validatorPlanFormPlanStartTimeRequired: 'Plan start time can not be empty', - validatorPlanFormPlanEndTimeRequired: 'Plan end time can not be empty' + validatorPlanFormPlanEndTimeRequired: 'Plan end time can not be empty', + + scheduleDialogTitle: 'Schedule', + scheduleRuleLabel: 'Schedule Rule', + capacitySourceLabel: 'Capacity Source', + workTimeLabel: 'Work Time', + skipHolidayLabel: 'Skip Holidays', + confirmScheduleButton: 'Confirm Schedule', + scheduleFormCodeLabel: 'Task Order Code', + scheduleFormCodePlaceholder: 'Please input', + scheduleFormOrderDateLabel: 'Order Date', + scheduleFormDeliveryDateLabel: 'Delivery Date', + scheduleFormRemarkLabel: 'Remark', + scheduleFormRemarkPlaceholder: 'Please input', + scheduleFormInventoryTaskLabel: 'Inventory Task', + scheduleFormSearchButton: 'Search', + scheduleFormResetButton: 'Reset', + scheduleYesLabel: 'Yes', + scheduleNoLabel: 'No', + relateDeviceButton: 'Relate Device', + deviceRelationDialogTitle: 'Relate Device', + deviceRelationLabel: 'Related Device', + deviceRelationPlaceholder: 'Click to select device', + deviceRelationSaveButton: 'Save', + deviceRelationCancelButton: 'Cancel', + selectDeviceDialogTitle: 'Select Device', + deviceColumnCode: 'Device Code', + deviceColumnName: 'Device Name', + deviceColumnModel: 'Device Model', + deviceColumnWorkshop: 'Workshop', + scheduleRulePriority: 'Order Priority', + scheduleRuleCategory: 'Product Category Order', + scheduleRuleDelivery: 'Delivery Date Priority', + capacityTypeRated: 'Rated Capacity', + capacityTypeDailyAvg: 'Daily Report Average', + capacityTypeDataCollection: 'Data Collection Capacity', + inventoryTaskType: 'Inventory Task', + taskNoDetailWarning: 'Task order {code} has no detail data, cannot be selected', + partialTaskNoDetailWarning: + 'Some task orders have no detail data, selection has been automatically cancelled', + taskItemNeedPrefix: 'Task Order-', + detailNoProductWarning: 'Current detail has no related product, cannot set device', + deviceRelationSaved: 'Device relation saved', + selectScheduleRuleWarning: 'Please select a schedule rule', + selectCapacitySourceWarning: 'Please select a capacity source', + selectWorkTimeWarning: 'Please select work time', + selectDetailWarning: 'Please select at least one task summary detail', + scheduleSubmitted: 'Schedule submitted', + startDatePlaceholder: 'Start Date', + endDatePlaceholder: 'End Date' }, Plan: { @@ -3115,6 +3716,7 @@ export default { buttonExportText: 'Export', tabPlannedLabel: 'Scheduled', + tabStartLabel: 'Started', tabTrialLabel: 'Trial', tabMassLabel: 'Mass Production', tabPausedLabel: 'Paused', @@ -3126,7 +3728,9 @@ export default { detailBaogongRecordTabLabel: 'Report Records', tableCodeColumn: 'Plan Code', + tableTaskCodeColumn: 'Task Code', tableProductColumn: 'Product', + tableDeviceNameColumn: 'Device Name', tableFeedingPipelineColumn: 'Production Line', tablePlanNumberColumn: 'Planned Qty', tableFinishNumberColumn: 'Finished Qty', @@ -3145,6 +3749,7 @@ export default { actionTrialLabel: 'Trial', actionInspectLabel: 'Inspect', actionMassLabel: 'Mass Production', + actionStartLabel: 'Start', actionBaogongLabel: 'Report', actionPauseLabel: 'Pause', actionFinishLabel: 'Finish', @@ -3262,7 +3867,7 @@ export default { FeedingRecord: { moduleName: 'Production Feeding', - planCode:'production plan', + planCode: 'production plan', searchCodeLabel: 'Record No.', searchCodePlaceholder: 'Please enter record No.', searchPipelineLabel: 'Pulp Line', @@ -3370,7 +3975,7 @@ export default { tableNameColumn: 'Name', tableOrganizationColumn: 'Station', - tableMachineColumn: 'Machine', + tableMachineColumn: 'Related Collection Device', tableTeamColumn: 'Team', tableStartTimeColumn: 'Start Time', tableEndTimeColumn: 'End Time', @@ -3452,6 +4057,33 @@ export default { actionDeleteLabel: 'Delete', exportFilename: 'FormingRecord.xls' + }, + + WorkReportRecord: { + moduleName: 'Work Report Record', + + searchBaogongTimeLabel: 'Report Date', + searchBaogongTimeStartPlaceholder: 'Start Date', + searchBaogongTimeEndPlaceholder: 'End Date', + + buttonSearchText: 'Search', + buttonResetText: 'Reset', + buttonExportText: 'Export', + + tableTaskCodeColumn: 'Task Code', + tablePlanCodeColumn: 'Plan Code', + tableEmployeeIdColumn: 'Employee ID', + tableEmployeeNameColumn: 'Employee Name', + tableProductNameColumn: 'Product Name', + tableProductCodeColumn: 'Product Code', + tableBaogongNumColumn: 'Report Quantity', + tablePassNumColumn: 'Pass Quantity', + tableNoPassNumColumn: 'No-Pass Quantity', + tablePassRateColumn: 'Pass Rate(%)', + tableReasonColumn: 'Reason', + tableBaogongTimeColumn: 'Report Time', + + exportFilename: 'Employee Work Report Statistics.xls' } }, DataCollection: { @@ -3668,7 +4300,10 @@ export default { attributeValidatorRemarkTooLong: 'Remark can not exceed 100 characters', messageSelectDeviceRequired: 'Please select a device', - messageDeviceInfoMissingForRules: 'Device information is missing, unable to load point rules' + messageDeviceInfoMissingForRules: 'Device information is missing, unable to load point rules', + + gridView: 'gridView', + sudoku: 'sudoku' }, RunReport: { moduleName: 'Device Operation Report', @@ -3692,12 +4327,69 @@ export default { tableFaultTimeColumn: 'Fault Time (Hours)', tableWarningTimeColumn: 'Warning Time (Hours)', tableUtilizationRateColumn: 'Utilization Rate', + tableUtilizationRateTooltip: + 'Power-on Rate = Online Time / Total Time\nOnline Time = Running Time + Standby Time + Fault Time\nUtilization Rate = Running Time / Online Time\nPower-on Rate = (Running Time + Standby Time + Fault Time) / Total Time', tablePowerOnRateColumn: 'Power-on Rate', tableStartTimeColumn: 'Device Run Start Time', tableEndTimeColumn: 'Device Run End Time', exportFilename: 'DeviceOperationReport.xls' }, + RunOverview: { + moduleName: 'Device Operation Overview', + pageIntro: + 'View device status distribution, KPI summary, and operation timelines in the menu page, with fullscreen support.', + + groupLabel: 'Device Group', + groupPlaceholder: 'Please select a group', + deviceLabel: 'Device Name', + devicePlaceholder: 'Please select a device', + timeRangeLabel: 'Time Range', + timeRangeStartPlaceholder: 'Start Time', + timeRangeEndPlaceholder: 'End Time', + + searchButtonText: 'Search', + resetButtonText: 'Reset', + exportButtonText: 'Export', + exportPlaceholderMessage: 'This is a static overview page for now. Export is reserved.', + + statusDistributionTitle: 'Time Distribution (Status Ratio)', + summaryTitle: 'Status Ratio (Summary)', + timelineTitle: 'Device Operation Timeline (Gantt)', + granularityHour: 'By Hour', + totalTimeLabel: 'Total Time', + compareLabel: 'vs Yesterday', + deviceFilterAll: 'All Devices', + expandAllText: 'Expand All', + enterFullscreen: 'Enter Fullscreen', + exitFullscreen: 'Exit Fullscreen', + statisticsTimeText: 'Statistics: {start} ~ {end}', + totalDevicesText: '{total} devices total', + pageUnit: '/page', + + tableDeviceNameColumn: 'Device Name', + tableUtilizationRateColumn: 'Utilization Rate', + + quickRange: { + today: 'Today', + yesterday: 'Yesterday', + last7Days: 'Last 7 Days', + last30Days: 'Last 30 Days', + custom: 'Custom' + }, + metrics: { + utilizationRate: 'Average Utilization', + powerOnRate: 'Average Power-on Rate', + faultRate: 'Average Fault Rate', + standbyRate: 'Average Standby Rate' + }, + legend: { + running: 'Running', + standby: 'Standby', + fault: 'Fault', + offline: 'Offline' + } + }, RealTimeMonitoring: { moduleName: 'Real-time Data Monitoring', @@ -3713,6 +4405,8 @@ export default { searchButtonText: 'Search', resetButtonText: 'Reset', exportButtonText: 'Export', + collapseText: 'Collapse', + expandText: 'Expand', tableLineCodeColumn: 'Line Code', tableLineNameColumn: 'Line Name', @@ -3750,6 +4444,8 @@ export default { searchButtonText: 'Search', resetButtonText: 'Reset', exportButtonText: 'Export', + collapseText: 'Collapse', + expandText: 'Expand', tableLineCodeColumn: 'Line Code', tableLineNameColumn: 'Line Name', @@ -3758,9 +4454,11 @@ export default { tableCollectionTimeColumn: 'Collection Time', tableOperateColumn: 'Operation', tableActionHistoryLabel: 'History', - + tableActionHistoryAnalyseLabel: 'History Data Analysis', dialogTitlePrefix: 'History: ', dialogCollectionTimeLabel: 'Collection Time', + dialogPointFilterLabel: 'Point Filter', + dialogPointFilterPlaceholder: 'Please enter point name', dialogCollectionTimeStartPlaceholder: 'Start Time', dialogCollectionTimeEndPlaceholder: 'End Time', dialogSearchButtonText: 'Search', @@ -3800,5 +4498,291 @@ export default { messageDeviceNoParams: 'No parameters under this device', messageFetchChartFailed: 'Failed to load chart data' } + }, + ProductionReport: { + Index: { + searchCodeLabel: 'Task Code', + searchCodePlaceholder: 'Please enter task code', + searchOrderDateLabel: 'Order Date', + searchDeliveryDateLabel: 'Delivery Date', + searchRemarkLabel: 'Remark', + searchRemarkPlaceholder: 'Please enter remark', + searchCreateTimeLabel: 'Create Time', + startDatePlaceholder: 'Start Date', + endDatePlaceholder: 'End Date', + buttonSearch: 'Search', + buttonReset: 'Reset', + buttonExport: 'Export', + tabAll: 'All', + tabIssued: 'Issued', + tabPartialScheduled: 'Partial Scheduled', + tabPendingProduction: 'Pending', + tabInProduction: 'In Production', + tabCompleted: 'Completed', + tableCode: 'Task Code', + tableOrderDate: 'Order Date', + tableDeliveryDate: 'Delivery Date', + tableStatus: 'Status', + tableIsScheduled: 'Scheduled', + tableProductionProgress: 'Progress', + tableRemark: 'Remark', + yes: 'Yes', + no: 'No', + detailTabBasicInfo: 'Basic Info', + detailTabRelatedPlan: 'Related Plans', + detailTabQualityInfo: 'Quality Info', + detailTabBaogongInfo: 'Work Report', + exportFilename: 'ProductionReport', + tableOperate: 'Operate', + detail: 'Detail' + }, + Detail: { + invalidId: 'Invalid parameter, task ID cannot be empty' + }, + BasicInfo: { + buttonRefresh: 'Refresh', + tableTaskCode: 'Task Code', + tableProductCode: 'Product Code', + tableProductName: 'Product Name', + tableTotalNumber: 'Total Qty', + tablePlanNumber: 'Planned Qty', + tableUnplannedNumber: 'Unplanned Qty', + tableOperate: 'Operate', + buttonViewProductInfo: 'View Product' + }, + ProductInfo: { + dialogTitle: 'Product Info', + labelProductCode: 'Product Code', + labelProductName: 'Product Name', + labelNumber: 'Quantity', + labelUnit: 'Unit', + labelSpecification: 'Specification', + tableMaterialCode: 'Material Code', + tableMaterialName: 'Material Name', + tableRequiredQuantity: 'Required Qty', + tableUnit: 'Unit' + }, + BaogongInfo: { + dateRangeSeparator: 'To', + startDatePlaceholder: 'Start Date', + endDatePlaceholder: 'End Date', + buttonToday: 'Today', + buttonLast7Days: 'Last 7 Days', + buttonLast30Days: 'Last 30 Days', + buttonReset: 'Reset', + buttonRefresh: 'Refresh', + tableTaskCode: 'Task Code', + tablePlanCode: 'Plan Code', + tableEmployeeId: 'Employee ID', + tableEmployeeName: 'Employee Name', + tableProductName: 'Product Name', + tableProductCode: 'Product Code', + tableBaogongNumber: 'Report Qty', + tablePassNumber: 'Pass Qty', + tableNoPassNumber: 'Fail Qty', + tablePassRate: 'Pass Rate%', + tableNoPassReason: 'Fail Reason', + tableBaogongTime: 'Report Time' + }, + QualityInfo: { + buttonRefresh: 'Refresh', + expandTableName: 'Inspection Item', + expandTableMethod: 'Method', + expandTableStandard: 'Standard', + expandTableUnit: 'Unit', + expandTableUpperLimit: 'Upper Limit', + expandTableLowerLimit: 'Lower Limit', + expandTableInputValue: 'Input Value', + expandTableImage: 'Image', + expandTablePreview: 'Preview', + expandTableResult: 'Result', + expandTableRemark: 'Remark', + tableCode: 'Inspection Code', + tableCategory: 'Category', + tableStatus: 'Status', + tableTicketCode: 'Ticket Code', + tableProcess: 'Process', + tableSchema: 'Inspection Schema', + tableManager: 'Manager', + tableExecutor: 'Executor', + tableExecuteTime: 'Execute Time', + tableRemark: 'Remark', + tableResult: 'Result', + resultPass: 'Pass', + resultFail: 'Fail', + inspectionPending: 'Pending', + inspectionPass: 'Passed', + inspectionFail: 'Failed', + unknown: 'Unknown' + }, + RelatedPlan: { + buttonRefresh: 'Refresh', + emptyDescription: 'No related plans' + }, + PlanCard: { + labelProductName: 'Product Name', + labelDeviceName: 'Device Name', + labelPlanStartTime: 'Plan Start Time', + labelPlanEndTime: 'Plan End Time', + labelLatestStartTime: 'Latest Start Time', + statPlanNumber: 'Planned Qty', + statWangongNumber: 'Completed Qty', + statPassNumber: 'Pass Qty', + statNoPassNumber: 'Fail Qty', + statPassRate: 'Pass Rate', + emptyDescription: 'No data' + }, + Timeline: { + unknown: 'Unknown', + statusScheduled: 'Scheduled', + statusPaused: 'Paused', + statusPendingStorage: 'Pending Storage', + statusStored: 'Stored', + statusStarted: 'Started' + } + }, + GanttChart: { + Index: { + searchTimeLabel: 'Query Time', + startPlaceholder: 'Start Time', + endPlaceholder: 'End Time', + deviceLabel: 'Device', + devicePlaceholder: 'Please select device', + buttonSearch: 'Search', + buttonReset: 'Reset' + }, + CardView: { + legendScheduled: 'Scheduled', + legendMerged: 'Merged', + legendPaused: 'Paused', + legendPendingStorage: 'Pending Storage', + legendStored: 'Stored', + statPlanCount: 'Plans', + statCapacity: 'Capacity', + planCodeLabel: 'Plan Code:', + productLabel: 'Product:', + planNumberLabel: 'Plan Qty:', + deliveryDateLabel: 'Delivery Date:', + startLabel: 'Start:', + endLabel: 'End:', + emptyDescription: 'No Plans', + statusScheduled: 'Scheduled', + statusMerged: 'Merged', + statusPaused: 'Paused', + statusPendingStorage: 'Pending Storage', + statusStored: 'Stored', + statusUnknown: 'Unknown' + }, + GanttPanel: { + detailTitle: 'Schedule Info', + deviceNameLabel: 'Device Name', + deviceIdLabel: 'Device ID', + capacityLabel: 'Capacity', + dailyAvgLabel: 'Daily Avg Report', + dataCollectionCapacityLabel: 'DC Capacity', + planCountLabel: 'Plan Count', + planDetailTitle: 'Plan Details', + planCodeColon: 'Plan Code: ', + taskCodeColon: 'Task Code: ', + planNumberColon: 'Plan Qty: ', + deliveryDateColon: 'Delivery Date: ', + startColon: 'Start: ', + endColon: 'End: ', + latestStartColon: 'Latest Start: ', + emptyDescription: 'No Schedule Info', + adjustTaskTitle: 'Adjust Task', + taskLabel: 'Task', + taskPlaceholder: 'Please select task', + deviceLabel: 'Device', + devicePlaceholder: 'Please select device', + startDateLabel: 'Start Date', + startDatePlaceholder: 'Please select plan start date', + endDateLabel: 'End Date', + endDatePlaceholder: 'Please select plan end date', + durationLabel: 'Days', + buttonCancel: 'Cancel', + buttonConfirm: 'Confirm', + editStartDateTitle: 'Edit Start Time', + startTimeLabel: 'Start Time', + startTimePlaceholder: 'Please select start time', + capacityTypeLabel: 'Capacity Source', + warningCompleteDeviceDate: 'Please complete device, start date and end date', + warningValidTime: 'Please select a valid time', + warningEndBeforeStart: 'End time cannot be earlier than start time', + warningDragOutOfRange: 'Drag out of date range, reverted to original position', + columnTaskName: 'Task Name', + columnDeviceName: 'Device Name', + columnPlanInfo: 'Plan Info', + columnStartTime: 'Start Time', + columnDays: 'Days', + scaleMonthFormat: 'MMM YYYY', + tooltipTaskDetail: 'Task Detail', + tooltipTaskCode: 'Task Code: ', + tooltipProduct: 'Product: ', + tooltipDetailId: 'Detail ID: ', + tooltipPlanNumber: 'Plan Qty: ', + tooltipStart: 'Start: ', + tooltipEnd: 'End: ', + tooltipLatestStart: 'Latest Start: ', + tooltipSummary: 'Summary', + tooltipDevice: 'Device: ', + tooltipDetailCount: 'Detail Count: ', + tooltipTotalPlanNumber: 'Total Plan Qty: ', + tooltipEarliestStart: 'Earliest Start: ', + tooltipLatestEnd: 'Latest End: ', + statusScheduled: 'Scheduled', + statusStarted: 'Started', + statusPaused: 'Paused', + statusPendingStorage: 'Pending Storage', + statusStored: 'Stored', + dialogTitle: 'Schedule Gantt Preview', + workerLabel: 'Worker', + workerPlaceholder: 'Please select worker', + calcLossLabel: 'Calculate Loss', + lockBtn: 'Lock', + unlockBtn: 'Unlock', + undoBtn: 'Undo', + buttonSave: 'Save', + buttonClose: 'Close', + warningNoPlanData: 'No plan data to save', + saveSuccess: 'Schedule saved successfully' + } + }, + EnergyOverview: { + messages: { + singleDayOnly: 'The time range can only query data within a single day' + }, + filters: { + org: 'Region', + orgPlaceholder: 'Please select region', + energyType: 'Energy Type', + energyTypePlaceholder: 'Please select energy type', + timeRange: 'Time Range' + }, + panels: { + trend: 'Energy Usage Trend', + region: 'Regional Energy Share', + top5: 'Top 5 Energy Consumers', + detail: 'Energy Details' + }, + table: { + rank: 'Rank', + name: 'Name', + region: 'Region', + usage: 'Usage', + meterName: 'Meter Name', + energyType: 'Energy Type', + energyUsage: 'Energy Usage', + startTime: 'Start Time', + endTime: 'End Time' + }, + chart: { + usage: 'Usage', + time: 'Time', + regionEnergy: 'Regional Energy', + totalUsage: 'Total Usage' + }, + empty: 'Please configure energy types first', + exportSuccess: 'Export started' } } diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 7a4b2f9d..627218dc 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -1,5 +1,6 @@ export default { common: { + loading: '加载中...', inputText: '请输入', selectText: '请选择', startTimeText: '开始时间', @@ -37,6 +38,7 @@ export default { toolDes: '用于设置定制系统', query: '查询', reset: '重置', + noData: '暂无数据', shrink: '收起', expand: '展开', confirmTitle: '系统提示', @@ -57,8 +59,210 @@ export default { copy: '复制', copySuccess: '复制成功', copyError: '复制失败', + yes: '是', + no: '否', code: '编码保存后自动生成' }, + ReportDashboard: { + DashboardList: { + searchNameLabel: '名称', + searchNamePlaceholder: '请输入名称', + searchRemarkLabel: '备注', + searchRemarkPlaceholder: '请输入备注', + searchStateLabel: '启用状态', + searchStatePlaceholder: '请选择启用状态', + + coverAlt: '封面图', + stateEnabled: '启用', + stateDisabled: '禁用', + noRemark: '暂无描述', + + dialogCreateTitle: '新增数据大屏', + dialogEditTitle: '编辑数据大屏', + dialogNameLabel: '名称', + dialogNamePlaceholder: '请输入名称', + dialogTypeLabel: '大屏类型', + dialogTypePlaceholder: '请选择大屏类型', + dialogOrgLabel: '产线', + dialogOrgPlaceholder: '请选择产线', + dialogDeviceLabel: '设备', + dialogDevicePlaceholder: '请选择设备', + dialogPointPlaceholder: '请选择点位', + dialogAddDeviceButton: '添加设备', + dialogContentLabel: '内容', + dialogContentPlaceholder: '请输入内容', + dialogRemarkLabel: '备注', + dialogRemarkPlaceholder: '请输入备注', + dialogStateLabel: '启用状态', + + validatorNameRequired: '名称不能为空', + validatorTypeRequired: '大屏类型不能为空', + validatorOrgRequired: '产线不能为空', + + messageRouteMissing: '未配置预览路由', + messageDevicePointRequired: '请至少配置一组设备和点位', + messageMissingId: '缺少数据编号,无法编辑' + }, + Dashboard1: { + header: { + title: '产线运行看板', + weather: { + cloudyToClear: '多云转晴' + }, + weekDays: { + Sunday: '星期日', + Monday: '星期一', + Tuesday: '星期二', + Wednesday: '星期三', + Thursday: '星期四', + Friday: '星期五', + Saturday: '星期六' + } + }, + deviceIdPrefix: 'ID:', + defaultDeviceName: '默认设备', + statusOffline: '离线', + statusRunning: '运行', + statusStandby: '待机', + statusFault: '故障', + deviceOverview: { + title: '设备概况', + device: '设备数量', + running: '运行数量', + idle: '待机数量', + alarm: '报警数量', + utilization: '稼动率', + faultRate: '故障率' + }, + alarms: { + title: '实时报警信息', + tag: '滚动展示', + levelSevere: '严重', + levelWarn: '警告', + levelInfo: '提示' + }, + productionTrend: { + title: '产量趋势', + tagToday: '今日', + seriesOutput: '产量' + }, + eventReminder: { + title: '事件提醒', + modeDevice: '设备', + modeMold: '模具', + check: '点检', + maintain: '保养', + repair: '维修' + }, + taskList: { + title: '任务列表', + columns: { + code: '编号', + name: '名称', + type: '类型', + finishStatus: '完成状态', + result: '结果' + }, + finishPending: '待完成', + finishDone: '已完成', + finishCanceled: '已取消', + resultPass: '通过', + resultFail: '不通过' + }, + energyMonitor: { + title: '能耗监测', + selectPlaceholder: '请选择', + seriesEnergy: '能耗' + } + } + }, + Dashboard8: { + Header: { + title: '智能制造产线任务总览', + subTitle: '智能制造实时看板' + }, + TaskBoard: { + title: '产线任务看板', + tag: '实时刷新 · 滚动展示', + statusCompleted: '已完成', + statusLowProgress: '进度偏低', + columns: { + lineName: '产线名称', + planNo: '计划单', + productName: '产品名称', + planQty: '计划数量', + doneQty: '完工数量', + passRate: '合格率' + } + }, + DayCapacity: { + title: '日产能达成情况', + tag: '当日维度', + metrics: { + orders: '排产单数量', + scheduled: '已排产数量', + produced: '已生产数量', + rate: '产能合格率' + }, + chart: { + scheduled: '已排产', + produced: '已生产' + } + }, + MonthCapacity: { + title: '月产能达成情况', + tag: '当月累计', + metrics: { + orders: '排产单数量', + scheduled: '已排产数量', + produced: '已生产数量', + rate: '产能合格率' + }, + chart: { + scheduled: '已排产', + produced: '已生产' + } + }, + WeekTrend: { + title: '周生产趋势', + legendOutput: '产量', + legendPlan: '计划', + seriesPlanOutput: '计划产量', + seriesActualOutput: '实际产量' + }, + OpsTrend: { + title: '产能完成数', + defaultLine: '全部产线', + yAxisName: '产能完成数', + seriesName: '产能完成数', + summary: '{line} · 日均完成 {value}' + }, + TodayOps: { + title: '今日开机率/稼动率', + empty: '暂无数据', + powerOnRate: '开机率', + utilizationRate: '稼动率' + }, + QualityTrend: { + title: '成品检合格率趋势图', + tag: '按天统计(全产线)', + seriesName: '合格率', + markLineAverage: '平均 {value}%', + markLineAverageName: '平均值' + }, + RealAlarm: { + title: '实时报警信息', + tag: '滚动展示', + levelSevere: '严重', + levelWarn: '警告', + levelInfo: '提示' + }, + EnergyTrend: { + title: '能耗周趋势', + selectPlaceholder: '请选择', + seriesActualEnergy: '实际能耗(kWh)' + } + }, ErpStock: { Warehouse: { name: '仓库名称', @@ -85,6 +289,58 @@ export default { cancel: '取消', exportName: '仓库.xls' }, + WarehouseArea: { + warehouseId: '所属仓库', + areaCode: '库区编码', + areaName: '库区名称', + areaSize: '面积(㎡)', + description: '库区描述', + status: '开启状态', + createTime: '创建时间', + placeholderWarehouseId: '请选择所属仓库', + placeholderAreaCode: '请输入库区编码', + placeholderAreaName: '请输入库区名称', + placeholderAreaSize: '请输入面积', + placeholderDescription: '请输入库区描述', + placeholderStatus: '请选择开启状态', + validatorWarehouseIdRequired: '所属仓库不能为空', + validatorAreaCodeRequired: '库区编码不能为空', + validatorAreaNameRequired: '库区名称不能为空', + validatorStatusRequired: '开启状态不能为空' + }, + WarehouseLocation: { + warehouseId: '所属仓库', + areaId: '所属库区', + code: '库位编码', + name: '库位名称', + areaSize: '面积(㎡)', + maxLoadWeight: '最大载重量', + position: '库位位置(X,Y,Z)', + positionX: '位置X', + positionY: '位置Y', + positionZ: '位置Z', + allowProductMix: '允许产品混放', + allowBatchMix: '允许批次混放', + status: '开启状态', + createTime: '创建时间', + placeholderWarehouseId: '请选择所属仓库', + placeholderAreaId: '请选择所属库区', + placeholderCode: '请输入库位编码', + placeholderName: '请输入库位名称', + placeholderAreaSize: '请输入面积', + placeholderMaxLoadWeight: '请输入最大载重量', + placeholderPositionX: '请输入位置X', + placeholderPositionY: '请输入位置Y', + placeholderPositionZ: '请输入位置Z', + placeholderStatus: '请选择开启状态', + validatorWarehouseIdRequired: '所属仓库不能为空', + validatorAreaIdRequired: '所属库区不能为空', + validatorCodeRequired: '库位编码不能为空', + validatorNameRequired: '库位名称不能为空', + validatorAllowProductMixRequired: '是否允许产品混放不能为空', + validatorAllowBatchMixRequired: '是否允许批次混放不能为空', + validatorStatusRequired: '开启状态不能为空' + }, Stock: { product: '产品', warehouse: '仓库', @@ -167,9 +423,9 @@ export default { Item: { index: '序号', warehouse: '仓库名称', - product: '产品名称', + product: '名称', stock: '库存', - barcode: '条码', + barcode: '编码', unit: '单位', count: '数量', price: '产品单价', @@ -178,6 +434,7 @@ export default { action: '操作', placeholderWarehouse: '请选择仓库', placeholderProduct: '请选择产品', + placeholderBarcode: '请选择编码', validatorWarehouseRequired: '仓库不能为空', validatorProductRequired: '产品不能为空', validatorCountRequired: '产品数量不能为空' @@ -342,6 +599,44 @@ export default { large: '大', small: '小' }, + home: { + welcome: '欢迎您使用必硕数字化智能中控平台', + message: + '必硕数字化智能中控平台以生产运营为核心,统一整合生产计划、数据采集、仓储、设备、能源、模具、质量、配方及报表分析等关键业务模块,实现从计划到执行、从设备到制品、从数据到决策的全流程数字化管理。', + productTitle: '整体生产概况', + placeholderCreateTimeStart: '开始日期', + placeholderCreateTimeEnd: '结束日期', + productionSchedule: '实时生产进度', + productionPlan: '生产计划', + productionName: '生产名称', + planNumber: '计划数量', + productionLine: '生产线', + planStartTime: '计划开始时间', + planEndTime: '计划结束时间', + completedQuantity: '完工数量', + qualifiedQuantity: '合格数量', + unqualifiedQuantity: '不合格数量', + yieldRate: '合格率', + actualEndTime: '实际结束时间', + gtasks: '待办任务', + missionNumber: '任务编号', + taskType: '任务类型', + target: '任务目标', + creationTime: '创建时间', + equipment: '设备', + mould: '模具', + equipmentTile: '采集设备整体情况', + equipmentCount: '设备总数', + operation: '运行', + standbyMode: '待机', + malfunction: '故障中', + alerting: '报警中', + useRatio: '利用率', + failureRate: '故障率', + equipmentTitle: '设备维修数量统计', + equipmentClass: '设备分类统计', + equipmentMessage: '按模具分类统计,取模具数量最多的前10项' + }, login: { welcome: '欢迎使用必硕数字化智能中控平台', message: '必硕智能“纸”为绿色生活', @@ -733,7 +1028,7 @@ export default { actions: '操作', password: '用户密码', role: '角色', - import: '用户导入', + import: '用户', importDragText: '将文件拖到此处,或', importClickText: '点击上传', importUpdateSupport: '是否更新已经存在的用户数据', @@ -850,6 +1145,11 @@ export default { refreshCache: '刷新菜单缓存', updateCacheConfirm: '即将更新缓存刷新浏览器!', updateCacheTitle: '刷新菜单缓存', + clientTypeWeb: 'Web端菜单', + clientTypeApp: 'APP端菜单', + terminalType: '终端类型', + terminalTypeMobile: '手机', + terminalTypeScanner: '扫码器', visibleShow: '显示', visibleHide: '隐藏', always: '总是', @@ -860,6 +1160,7 @@ export default { nameRequired: '菜单名称不能为空', sortRequired: '菜单顺序不能为空', pathRequired: '路由地址不能为空', + terminalTypeRequired: '终端类型不能为空', statusRequired: '状态不能为空', pathMustStartWithSlash: '路径必须以 / 开头', pathMustNotStartWithSlash: '路径不能以 / 开头', @@ -878,8 +1179,10 @@ export default { Dict: { id: '字典编号', name: '字典名称', + enName: '字典英文名称', type: '字典类型', label: '字典标签', + labelEn: '字典标签(英文)', value: '字典键值', sort: '字典排序', status: '状态', @@ -895,8 +1198,10 @@ export default { searchLabelPlaceholder: '请输入字典标签', searchDataStatusPlaceholder: '请选择数据状态', namePlaceholder: '请输入字典名称', + enNamePlaceholder: '请输入字典英文名称', typePlaceholder: '请输入字典类型', labelPlaceholder: '请输入数据标签', + labelEnPlaceholder: '请输入数据标签(英文)', valuePlaceholder: '请输入数据键值', sortPlaceholder: '请输入数据顺序', remarkPlaceholder: '请输入内容', @@ -941,12 +1246,32 @@ export default { }, // 设备台账 EquipmentLedger: { + lineCategory: '产线分类', + lineCategoryAll: '全部', + createLineCategory: '新增产线分类', + updateLineCategory: '修改产线分类', + emptyDeviceData: '暂无设备数据', + runningLabel: '运行', + images: '图片', deviceCode: '编码', + qrcode: '二维码/条形码', deviceName: '名称', deviceStatus: '状态', + statusEnabled: '启用', + statusDisabled: '不启用', + statusRunning: '运行中', + statusStandby: '待机', + statusFault: '故障', + statusMaintenance: '维修中', + statusStopped: '已停用', + statusUnknown: '未知', deviceType: '类型', - deviceSpec: '规格', + deviceSpec: '规格型号', deviceModel: '型号', + isSchedueld: '是否排产', + ratedCapacity: '额定产能', + yes: '是', + no: '否', productionDate: '生产日期', factoryEntryDate: '入厂日期', deviceLocation: '位置', @@ -965,7 +1290,8 @@ export default { placeholderDeviceStatus: '请选择状态', placeholderDeviceType: '请选择类型', placeholderDeviceModel: '请输入型号', - placeholderDeviceSpec: '请输入规格', + placeholderDeviceSpec: '请输入规格型号', + placeholderRatedCapacity: '请输入额定产能', placeholderProductionDate: '请选择生产日期', placeholderFactoryEntryDate: '请选择入厂日期', placeholderDeviceLocation: '请输入位置', @@ -1011,13 +1337,71 @@ export default { fileUrl: '资料', serialNumber: '序号', dvName: '关联采集设备', - dvId: '请选择设备' + dvId: '请选择设备', + qrcodeLoadError: '二维码加载失败', + qrcodeEmpty: '暂无二维码', + exportFileName: '设备台账', + validatorDeviceCodeRequired: '编码不能为空', + gjTitle: '选择关键件', + bjTitle: '选择备件', + normal: '正常', + stop: '停用', + maintenance: '维修', + scrap: '报废', + placeholderWorkshop: '请输入所属车间', + reportCapacity: '报工产能', + actualCapacity: '实际产能', + Detail: { + invalidId: '无效的设备ID' + } + }, + // 产能报表 + CapacityReport: { + deviceCode: '设备编码', + deviceName: '设备名称', + deviceType: '设备类型', + deviceStatus: '设备状态', + workshop: '所属车间', + ratedCapacity: '额定产能(计划产能)', + reportCapacity: '报工产能', + reportCapacityTooltip: '默认查询近半年的数据均值(不包含今日)', + reportCapacityViewDetail: '查看明细', + actualCapacity: '实际产能', + actualCapacityTooltip: '默认查询近半年的数据均值(不包含今日)', + placeholderDeviceCode: '请输入设备编码', + placeholderDeviceName: '请输入设备名称', + placeholderDeviceType: '请输入设备类型', + placeholderDeviceStatus: '请选择设备状态', + placeholderWorkshop: '请输入所属车间', + baogongTime: '产能统计时间', + placeholderBaogongTimeStart: '开始时间', + placeholderBaogongTimeEnd: '结束时间', + shortcutLastWeek: '近一周', + shortcutLastHalfYear: '近半年', + shortcutLastYear: '近一年', + dialogTitlePrefix: '报工产能明细 - ', + dialogProductCode: '产品编码', + dialogProductCodePlaceholder: '请输入产品编码', + dialogProductName: '产品名称', + dialogProductNamePlaceholder: '请输入产品名称', + dialogBaogongTime: '报工时间', + dialogBaogongTimeStart: '报工开始时间', + dialogBaogongTimeEnd: '报工结束时间', + dialogTaskCode: '任务编码', + dialogTaskCodePlaceholder: '请输入任务编码', + dialogBaogongTotal: '报工总数', + dialogAvgCapacity: '报工均值产能', + dialogSearchButtonText: '搜索', + dialogResetButtonText: '重置', + exportFilename: '产能报表.xls' }, // 设备关键件 EquipmentKeyItems: { count: '数量', code: '编码', + qrcode: '二维码/条形码', name: '名称', + deviceSpec: '规格型号', batchDelete: '批量删除', description: '描述', remark: '备注', @@ -1027,17 +1411,24 @@ export default { delete: '删除', placeholderCode: '请输入编码', placeholderName: '请输入名称', + placeholderDeviceSpec: '请输入规格型号', placeholderDescription: '请输入描述', placeholderRemark: '请输入备注', - placeholderCount: '请输入数量' + placeholderCount: '请输入数量', + qrcodeLoadError: '二维码加载失败', + qrcodeEmpty: '暂无二维码', + validatorCodeRequired: '编码不能为空', + validatorNameRequired: '名称不能为空', + images: '图片' }, // 项目维护 DvSubject: { code: '编码', name: '名称', - inspectionMethod: '检验方式', - valueType: '值类型', - judgmentCriteria: '判定基准', + inspectionMethod: '作业方式', + valueType: '结果类型', + JobType: '作业类型', + judgmentCriteria: '作业内容', upperVal: '上限值', lowerVal: '下限值', creatorName: '创建人', @@ -1056,14 +1447,15 @@ export default { placeholderProjectName: '请输入项目名称', placeholderInspectionMethod: '请选择检验方式', placeholderValueType: '请选择值类型', + placeholderJobType: '请选择作业类型', placeholderUpperVal: '请输入上限值', placeholderLowerVal: '请输入下限值' }, // 方案维护 PlanMaintenance: { - planName: '方案名称', - planType: '方案类型', + planName: '模板名称', + planType: '模板类型', planTypeMaintain: '保养', planTypeInspect: '点检', description: '描述', @@ -1077,14 +1469,14 @@ export default { inspectionMethod: '检验方式', judgmentCriteria: '判定基准', batchDelete: '批量删除', - placeholderPlanName: '请输入方案名称', + placeholderPlanName: '请输入模板名称', placeholderDescription: '请输入描述', - placeholderPlanType: '请选择方案类型', + placeholderPlanType: '请选择模板类型', placeholderSubjectName: '请输入名称', placeholderSubjectDescription: '请输入描述', placeholderSubjectSelect: '请选择关联项目', selectDeleteTip: '请选择需要删除的数据', - exportFilename: '方案维护.xls' + exportFilename: '模板维护.xls' }, // 任务管理 @@ -1196,7 +1588,7 @@ export default { repairLineTitle: '设备维修项目行', lineSubjectCode: '维修编码', lineSubjectName: '维修名称', - lineSubjectContent: '维修内容', + lineSubjectContent: '维修方法', lineRemark: '备注', lineResult: '结果', lineResultOk: '通过', @@ -1257,7 +1649,7 @@ export default { deviceType: '设备类型', device: '设备', component: '关键件', - projectContent: '维修内容', + projectContent: '维修方法', createTime: '创建时间', deviceName: '设备名称', componentName: '关键件名称', @@ -1271,7 +1663,7 @@ export default { placeholderSubjectCode: '请输入维修编码', placeholderSubjectName: '请输入维修名称', placeholderDeviceType: '请选择设备类型', - placeholderProjectContent: '请输入维修内容', + placeholderProjectContent: '请输入维修方法', placeholderCreateTimeStart: '开始日期', placeholderCreateTimeEnd: '结束日期', placeholderDevice: '请选择设备', @@ -1287,9 +1679,10 @@ export default { // 备件管理 SparePartsManagement: { SpareInfo: { - name: '备件名称', - code: '备件编码', - standard: '规格', + name: '名称', + code: '编码', + qrcode: '二维码/条形码', + standard: '规格型号', expiryDay: '保质期天数', category: '分类', unit: '单位', @@ -1304,8 +1697,10 @@ export default { placeholderUnit: '请选择单位', placeholderSafetyNumber: '请输入预警库存数量', placeholderRemark: '请输入备注', - placeholderStandard: '请输入规格', + placeholderStandard: '请输入规格型号', placeholderExpiryDay: '请输入保质期天数', + qrcodeLoadError: '二维码加载失败', + qrcodeEmpty: '暂无二维码', validatorNameRequired: '备件名称不能为空', validatorCodeRequired: '备件编码不能为空', validatorCategoryRequired: '分类不能为空', @@ -1393,6 +1788,7 @@ export default { validatorItemInIdRequired: '入库编号不能为空', validatorItemWarehouseRequired: '仓库不能为空', validatorItemProductRequired: '备件不能为空', + validatorItemCodeRequired: '备件不能为空', validatorItemCountRequired: '备件数量不能为空', confirmApprove: '确定审批该入库单吗?', confirmUnapprove: '确定反审批该入库单吗?', @@ -1456,9 +1852,9 @@ export default { }, MoldManagement: { MoldBrand: { - code: '型号编码', - name: '型号名称', - moldType: '规格', + code: '编码', + name: '名称', + moldType: '规格型号', orgType: '工序', moldSize: '模穴数', useTime: '预期寿命/次', @@ -1468,15 +1864,15 @@ export default { tabMold: '模具', emptyTip: '请先点击上方列表选择一个模具型号', exportFilename: '模具型号.xls', - placeholderCode: '请输入型号编码', - placeholderName: '请输入型号名称', + placeholderCode: '请输入编码', + placeholderName: '请输入名称', placeholderOrgType: '请选择工序', - placeholderMoldType: '请输入规格', + placeholderMoldType: '请输入规格型号', placeholderMoldSize: '请输入模穴数', placeholderUseTime: '输入预期寿命(次)', placeholderRemark: '请输入备注', - validatorCodeRequired: '型号编码不能为空', - validatorNameRequired: '型号名称不能为空', + validatorCodeRequired: '编码不能为空', + validatorNameRequired: '名称不能为空', validatorMoldTypeRequired: '规格不能为空', validatorProductRequired: '产品ID不能为空', validatorMoldSizeRequired: '出模数不能为空', @@ -1484,12 +1880,13 @@ export default { }, Mold: { - code: '模具编码', - name: '模具名称', + code: '编码', + name: '名称', unit: '单位', inTime: '入库时间', status: '状态', - images: '模具图片', + qrcode: '二维码/条形码', + images: '图片', remark: '备注', isEnable: '是否启用', fileUrl: '资料', @@ -1502,20 +1899,22 @@ export default { add: '新增', edit: '编辑', delete: '删除', - placeholderCode: '请输入模具编码', - placeholderName: '请输入模具名称', + placeholderCode: '请输入编码', + placeholderName: '请输入名称', placeholderUnit: '请选择单位', placeholderInTime: '选择入库时间', placeholderRemark: '请输入备注', placeholderStatus: '请选择状态', - validatorCodeRequired: '模具编码不能为空', - validatorNameRequired: '模具名称不能为空', + validatorCodeRequired: '编码不能为空', + validatorNameRequired: '名称不能为空', validatorUnitRequired: '单位不能为空', validatorInTimeRequired: '入库时间不能为空', validatorIsEnableRequired: '是否启用不能为空', validatorBrandRequired: '型号不能为空', - selectBrandTip: '请选择一个模具型号', - statusTooltip: '来源:数据字典-模具状态' + selectBrandTip: '请选择一个型号', + statusTooltip: '来源:数据字典-模具状态', + qrcodeLoadError: '二维码加载失败', + qrcodeEmpty: '暂无二维码' }, MoldReturn: { @@ -1637,9 +2036,9 @@ export default { moduleName: '检验项目', code: '编码', name: '名称', - inspectionMethod: '检验方式', - valueType: '值类型', - judgmentCriteria: '判定基准', + inspectionMethod: '作业方式', + valueType: '结果类型', + judgmentCriteria: '作业内容', isEnable: '是否启用', creatorName: '创建人', createTime: '创建时间', @@ -1653,18 +2052,18 @@ export default { exportFilename: '检验项目.xls', placeholderCode: '请输入编码', placeholderName: '请输入名称', - placeholderJudgmentCriteria: '请输入判定基准', + placeholderJudgmentCriteria: '请输入作业内容', placeholderSubjectCode: '请输入项目编码', placeholderSubjectName: '请输入项目名称', - placeholderInspectionMethod: '请选择检验方式', - placeholderValueType: '请选择值类型', + placeholderInspectionMethod: '请选择作业方式', + placeholderValueType: '请选择结果类型', placeholderIsEnable: '请选择是否启用', - placeholderJudgmentCriteriaForm: '请输入判定基准', + placeholderJudgmentCriteriaForm: '请输入作业内容', validatorSubjectCodeRequired: '项目编码不能为空', validatorSubjectNameRequired: '项目名称不能为空', - validatorInspectionMethodRequired: '检验方式不能为空', - validatorValueTypeRequired: '值类型不能为空', - validatorJudgmentCriteriaRequired: '判定基准不能为空', + validatorInspectionMethodRequired: '作业方式不能为空', + validatorValueTypeRequired: '结果类型不能为空', + validatorJudgmentCriteriaRequired: '作业内容不能为空', validatorIsEnableRequired: '是否启用不能为空', selectDeleteTip: '请选择需要删除的数据' }, @@ -1920,6 +2319,42 @@ export default { updateFail: '更新失败' } }, + TemplateManagement: { + PrintTemplate: { + moduleName: '打印模板', + templateCode: '模板编码', + templateName: '模板名称', + templateType: '模板类型', + templateBizType: '模板分类', + bizTypePrint: '打印', + bizTypeReport: '报表', + templateJson: '模板JSON', + isConfigured: '是否已配置', + configured: '已配置', + notConfigured: '未配置', + remark: '备注', + isEnable: '是否启用', + enabled: '启用', + disabled: '禁用', + createTime: '创建时间', + operate: '操作', + exportFilename: '打印模板.xls', + typeLabel: '标签', + typeBarcode: '条码', + typeReport: '报表', + placeholderTemplateCode: '请输入模板编码', + templateCodeTooltip: '开启开关则自动生成编码,无需手动输入', + placeholderTemplateName: '请输入模板名称', + placeholderTemplateType: '请选择模板类型', + placeholderTemplateJson: '请输入模板JSON内容', + placeholderRemark: '请输入备注', + validatorCodeRequired: '模板编码不能为空', + validatorNameRequired: '模板名称不能为空', + validatorTypeRequired: '模板类型不能为空', + design: '配置', + designTitle: '模板配置' + } + }, QualityManagement: { ZjType: { moduleName: '检验类型', @@ -1970,6 +2405,7 @@ export default { sampleMethod: '抽检方式', val: '值', item: '关联项目', + product: '关联产品', remark: '备注', createTime: '创建时间', operate: '操作', @@ -1983,13 +2419,17 @@ export default { placeholderSampleMethod: '请选择抽检方式', placeholderVal: '请输入值', placeholderItem: '请选择检验项目', + placeholderProduct: '请选择关联产品', + selectProductDialogTitle: '选择关联产品', placeholderRemark: '请输入备注', placeholderCreateTimeStart: '开始日期', placeholderCreateTimeEnd: '结束日期', validatorNameRequired: '名称不能为空', validatorTypeRequired: '类型不能为空', validatorSampleMethodRequired: '抽检方式不能为空', - validatorValRequired: '值不能为空' + validatorValRequired: '值不能为空', + atIntervals: '每间隔', + extraction: '抽取' }, ZjTask: { moduleName: '检验任务', @@ -2262,7 +2702,20 @@ export default { manualTableDataTypeColumn: '数据类型', manualTableDataUnitColumn: '单位', manualTableReferColumn: '参考值', - manualTableRemarkColumn: '备注' + manualTableRemarkColumn: '备注', + manualTableInputTimeColumn: '录入时间', + manualTableEnteringAction: '补录', + manualFormTitleLabel: '补录采集值', + nanualFormNameLabel: '名称', + nanualFormNamePlaceholder: '请输入名称', + nanualFormDataTypeLabel: '数据类型', + nanualFormDataTypePlaceholder: '请输入数据类型', + nanualFormDataUnitLabel: '单位', + nanualFormDataUnitPlaceholder: '请选择单位', + nanualFormReferLabel: '参考值', + nanualFormReferPlaceholder: '请输入参考值', + nanualFormRemarkLabel: '备注', + nanualFormRemarkPlaceholder: '请输入备注' } }, FactoryModeling: { @@ -2281,6 +2734,8 @@ export default { addButtonText: '新增', exportButtonText: '导出', expandButtonText: '展开/折叠', + collapseText: '收起', + expandText: '展开', tableCodeColumn: '组织编码', tableNameColumn: '组织名称', tableSortColumn: '显示顺序', @@ -2356,8 +2811,8 @@ export default { addButtonText: '新增', exportButtonText: '导出', expandButtonText: '展开/折叠', - tableCodeColumn: '分类编码', - tableNameColumn: '分类名称', + tableCodeColumn: '编码', + tableNameColumn: '名称', tableSortColumn: '排序', tableStatusColumn: '状态', tableCreateTimeColumn: '创建时间', @@ -2386,6 +2841,8 @@ export default { moduleName: '产品物料信息', searchNameLabel: '名称', searchNamePlaceholder: '请输入名称', + searchCodeLabel: '编码', + searchCodePlaceholder: '请输入编码', searchButtonText: '搜索', resetButtonText: '重置', addButtonText: '新增', @@ -2400,6 +2857,7 @@ export default { tableOperateColumn: '操作', tableEditAction: '编辑', tableDeleteAction: '删除', + qrcode: '二维码/条形码', dialogBarCodeLabel: '编码', dialogBarCodePlaceholder: '请输入编码', dialogNameLabel: '名称', @@ -2425,6 +2883,8 @@ export default { dialogRemarkPlaceholder: '请输入备注', dialogCancelButton: '取 消', dialogSubmitButton: '确 定', + qrcodeLoadError: '二维码加载失败', + qrcodeEmpty: '暂无二维码', validatorNameRequired: '产品名称不能为空', validatorBarCodeRequired: '产品条码不能为空', validatorCategoryRequired: '产品分类编号不能为空', @@ -2449,6 +2909,7 @@ export default { exportButtonText: '导出', tableRuleCodeColumn: '规则编码', tableRuleNameColumn: '规则名称', + tableBarcodeTypeColumn: '码类型', tableRuleDescColumn: '描述', tableMaxLengthColumn: '最大长度', tableIsPaddedColumn: '是否补齐', @@ -2466,6 +2927,9 @@ export default { dialogRuleCodePlaceholder: '请输入规则编码', dialogRuleNameLabel: '规则名称', dialogRuleNamePlaceholder: '请输入规则名称', + dialogBarcodeTypeLabel: '码类型', + barcodeTypeBarcodeLabel: '条形码', + barcodeTypeQrcodeLabel: '二维码', dialogRuleDescLabel: '描述', dialogRuleDescPlaceholder: '请输入描述', dialogMaxLengthLabel: '最大长度', @@ -2671,7 +3135,77 @@ export default { dialogSubmitButton: '确 定', validatorNameRequired: '单位名称不能为空', validatorStatusRequired: '单位状态不能为空', - validatorPrimaryFlagRequired: '是否主单位不能为空' + validatorPrimaryFlagRequired: '是否主单位不能为空', + importButtonText: '导入', + import: '导入单位', + importDragText: '将文件拖到此处,或', + importClickText: '点击上传', + importUpdateSupport: '是否更新已经存在的用户数据', + importFormatLimit: '仅允许导入 xls、xlsx 格式文件。', + importDownloadTemplate: '下载模板', + importFileRequired: '请上传文件', + importSuccessTip: + '上传成功数量:{createCount};更新成功数量:{updateCount};更新失败数量:{failureCount};', + importFailed: '上传失败,请您重新上传!', + importFileLimit: '最多只能上传一个文件!' + }, + //假日管理 + CalHoliday: { + setWorkingDays: '设置工作日', + setHoliday: '设置休息日', + lastMonth: '上个月', + today: '今天', + nextMonth: '下个月', + work: '班', + rest: '休', + searchDateStartPlaceholder: '开始日期', + searchDateEndPlaceholder: '结束日期', + searchTypeLabel: '类型', + searchTypePlaceholder: '请选择类型', + searchRemarkLabel: '备注', + searchRemarkPlaceholder: '请输入备注', + searchButtonText: '搜索', + resetButtonText: '重置', + addButtonText: '新增', + exportButtonText: '导出' + }, + //esop文件管理 + EsopFile: { + searchFileNameLabel: '文件名称', + searchFileNamePlaceholder: '请输入文件名', + searchClassificationLabel: '文件分类', + searchClassificationPlaceholder: '请选择文件分类', + searchStatusLabel: '文件状态', + searchStatusPlaceholder: '请选择文件状态', + searchButtonText: '搜索', + resetButtonText: '重置', + uploadButtonText: '文件上传', + addButtonText: '新增', + exportButtonText: '导出', + tableCodeColumn: '文件编码', + tableNameColumn: '文件名称', + tableClassificationColumn: '文件分类', + tableTypeColumn: '文件类型', + tableStatusColumn: '文件状态', + tableCreatorNameColumn: '上传人', + tableCreateTimeColumn: '上传时间', + tableOperateColumn: '操作', + tableEditAction: '编辑', + tableDownloadAction: '下载', + tableDeleteAction: '删除', + dialogFileNameLabel: '文件名', + dialogFileNamePlaceholder: '请输入文件名', + dialogClassificationLabel: '文件分类', + dialogClassificationPlaceholder: '请选择文件分类', + dialogStatusLabel: '文件状态', + dialogCancelButton: '取 消', + dialogSubmitButton: '确 定', + messageOne: '提示:仅允许导入 ', + messageTwo: ' 格式文件!', + messageThree: ' 将文件拖到此处,或', + messageFour: '点击上传', + validatorNameRequired: '文件名不能为空', + validatorStatusRequired: '文件状态不能为空' } }, ProductionPlan: { @@ -2710,6 +3244,7 @@ export default { tableOrderDateColumn: '下达日期', tableDeliveryDateColumn: '交货日期', tableTaskTypeColumn: '类型', + tableIsUrgentColumn: '是否急单', tableStatusColumn: '状态', tableRemarkColumn: '备注', tableOperateColumn: '操作', @@ -2729,6 +3264,9 @@ export default { dialogDeliveryDatePlaceholder: '选择交货日期', dialogTaskTypeLabel: '任务类型', dialogTaskTypeTooltip: '来源:数据字典-任务单类型', + dialogIsUrgentLabel: '是否急单', + urgentNoLabel: '否', + urgentYesLabel: '是', dialogRemarkLabel: '备注', dialogRemarkPlaceholder: '请输入备注', dialogSubmitButtonText: '确 定', @@ -2736,6 +3274,7 @@ export default { validatorDeliveryDateRequired: '交货日期不能为空', validatorTaskTypeRequired: '任务类型不能为空', + validatorIsUrgentRequired: '是否急单不能为空', saleDialogCodeLabel: '编码', saleDialogCodePlaceholder: '请输入任务单编码', @@ -2785,7 +3324,8 @@ export default { detailDialogBoxingDatePlaceholder: '选择装柜日期', detailDialogArriveDateLabel: '到达日期', detailDialogArriveDatePlaceholder: '选择到达日期', - detailDialogRemarkLabel: '备注:', + detailDialogRemarkLabel: '备注', + detailDialogRemarkPlaceholder: '请输入备注', detailDialogSubmitButtonText: '确 定', detailDialogCancelButtonText: '取 消', @@ -2869,6 +3409,10 @@ export default { tabAllLabel: '所有', tabIssuedLabel: '下达', + tabPartialSchedulingLabel: '部分排产', + tabPendingProductionLabel: '待生产', + tabInProductionLabel: '生产中', + tabCompletedLabel: '已完成', tabPlanLabel: '计划', tabStartLabel: '开工', tabFinishedLabel: '完工', @@ -2878,6 +3422,8 @@ export default { tableOrderDateColumn: '下达日期', tableDeliveryDateColumn: '交货日期', tableStatusColumn: '状态', + tableScheduleCompletedColumn: '是否完成排产', + tableProductionProgressColumn: '生产进度', tableRemarkColumn: '备注', tableOperateColumn: '操作', @@ -2888,6 +3434,7 @@ export default { detailTableTaskCodeColumn: '任务单', detailTableProductCodeColumn: '产品编码', detailTableProductNameColumn: '产品名称', + detailTableDeviceNameColumn: '设备名称', detailTableTotalNumberColumn: '任务总数', detailTablePlanNumberColumn: '已计划', detailTableUnplanNumberColumn: '未计划', @@ -2933,7 +3480,55 @@ export default { validatorPlanFormTaskIdRequired: '任务单不能为空', validatorPlanFormPlanNumberRequired: '数量不能为空', validatorPlanFormPlanStartTimeRequired: '计划开始时间不能为空', - validatorPlanFormPlanEndTimeRequired: '计划结束时间不能为空' + validatorPlanFormPlanEndTimeRequired: '计划结束时间不能为空', + + scheduleDialogTitle: '排产', + scheduleRuleLabel: '排产规则', + capacitySourceLabel: '产能来源', + workTimeLabel: '生产时间安排', + skipHolidayLabel: '是否跳过节假日', + confirmScheduleButton: '确认排产', + scheduleFormCodeLabel: '任务单编码', + scheduleFormCodePlaceholder: '请输入', + scheduleFormOrderDateLabel: '下达日期', + scheduleFormDeliveryDateLabel: '交货日期', + scheduleFormRemarkLabel: '备注', + scheduleFormRemarkPlaceholder: '请输入', + scheduleFormInventoryTaskLabel: '库存任务', + scheduleFormSearchButton: '查询', + scheduleFormResetButton: '重置', + scheduleYesLabel: '是', + scheduleNoLabel: '否', + relateDeviceButton: '关联设备', + deviceRelationDialogTitle: '关联设备', + deviceRelationLabel: '关联设备', + deviceRelationPlaceholder: '点击选择设备', + deviceRelationSaveButton: '保存', + deviceRelationCancelButton: '取消', + selectDeviceDialogTitle: '选择设备', + deviceColumnCode: '设备编号', + deviceColumnName: '设备名称', + deviceColumnModel: '设备型号', + deviceColumnWorkshop: '所属车间', + scheduleRulePriority: '订单优先级', + scheduleRuleCategory: '产品类别顺序', + scheduleRuleDelivery: '订单交期优先', + capacityTypeRated: '额定产能', + capacityTypeDailyAvg: '每日报工平均值', + capacityTypeDataCollection: '数据采集产能', + inventoryTaskType: '库存任务', + taskNoDetailWarning: '任务单 {code} 无任务明细数据,无法勾选', + partialTaskNoDetailWarning: '部分任务单无明细数据,已自动取消勾选', + taskItemNeedPrefix: '任务单-', + detailNoProductWarning: '当前明细没有关联产品,无法设置设备', + deviceRelationSaved: '关联设备已保存', + selectScheduleRuleWarning: '请选择排产规则', + selectCapacitySourceWarning: '请选择产能来源', + selectWorkTimeWarning: '请选择生产时间安排', + selectDetailWarning: '至少选一个任务单汇总明细的数据', + scheduleSubmitted: '排产已提交', + startDatePlaceholder: '开始日期', + endDatePlaceholder: '结束日期' }, Plan: { moduleName: '生产计划', @@ -2958,6 +3553,7 @@ export default { buttonExportText: '导出', tabPlannedLabel: '已排产', + tabStartLabel: '已开工', tabTrialLabel: '试产', tabMassLabel: '量产', tabPausedLabel: '暂停', @@ -2969,7 +3565,9 @@ export default { detailBaogongRecordTabLabel: '报工记录', tableCodeColumn: '计划编码', + tableTaskCodeColumn: '任务编码', tableProductColumn: '产品', + tableDeviceNameColumn: '设备名称', tableFeedingPipelineColumn: '生产线', tablePlanNumberColumn: '计划数量', tableFinishNumberColumn: '完工数量', @@ -2988,6 +3586,7 @@ export default { actionTrialLabel: '试产', actionInspectLabel: '检验', actionMassLabel: '量产', + actionStartLabel: '开工', actionBaogongLabel: '报工', actionPauseLabel: '暂停', actionFinishLabel: '完工', @@ -3214,7 +3813,7 @@ export default { tableNameColumn: '名称', tableOrganizationColumn: '工位', - tableMachineColumn: '机台', + tableMachineColumn: '关联采集设备', tableTeamColumn: '班组', tableStartTimeColumn: '开始时间', tableEndTimeColumn: '结束时间', @@ -3296,14 +3895,40 @@ export default { actionDeleteLabel: '删除', exportFilename: '成型记录.xls' + }, + WorkReportRecord: { + moduleName: '报工记录', + + searchBaogongTimeLabel: '报工日期', + searchBaogongTimeStartPlaceholder: '开始日期', + searchBaogongTimeEndPlaceholder: '结束日期', + + buttonSearchText: '搜索', + buttonResetText: '重置', + buttonExportText: '导出', + + tableTaskCodeColumn: '任务单编码', + tablePlanCodeColumn: '计划单编码', + tableEmployeeIdColumn: '员工 ID', + tableEmployeeNameColumn: '员工姓名', + tableProductNameColumn: '产品名称', + tableProductCodeColumn: '产品编码', + tableBaogongNumColumn: '报工数量', + tablePassNumColumn: '合格数量', + tableNoPassNumColumn: '不合格数量', + tablePassRateColumn: '合格率 (%)', + tableReasonColumn: '原因', + tableBaogongTimeColumn: '报工时间', + + exportFilename: '员工报工统计.xls' } }, DataCollection: { DeviceAttributeType: { moduleName: '采集点类型', index: '序号', - code: '类型编码', - name: '类型名称', + code: '编码', + name: '名称', sort: '显示顺序', remark: '备注', createTime: '创建时间', @@ -3315,8 +3940,8 @@ export default { batchDelete: '批量删除', export: '导出', - placeholderCode: '请输入类型编码', - placeholderName: '请输入类型名称', + placeholderCode: '请输入编码', + placeholderName: '请输入名称', placeholderSort: '请输入显示顺序', placeholderRemark: '请输入备注', @@ -3454,7 +4079,7 @@ export default { password: '密码', topic: '订阅主题', - settingDialogTitle: '设备设置', + settingDialogTitle: '设置', connect: '连接', disconnect: '断开连接', @@ -3512,7 +4137,10 @@ export default { attributeValidatorRemarkTooLong: '备注不能超过100字', messageSelectDeviceRequired: '请选择一个物联设备', - messageDeviceInfoMissingForRules: '设备信息缺失,无法加载点位规则' + messageDeviceInfoMissingForRules: '设备信息缺失,无法加载点位规则', + + gridView: '表格视图', + sudoku: '九宫格' }, RunReport: { moduleName: '设备运行报表', @@ -3536,12 +4164,68 @@ export default { tableFaultTimeColumn: '故障时间(小时)', tableWarningTimeColumn: '警告时间(小时)', tableUtilizationRateColumn: '稼动率', + tableUtilizationRateTooltip: + '开机率 = 在线时间 / 总的时间\n在线时间 = 运行时间 + 空闲时间 + 故障时间\n稼动率 = 运行时间 / 在线时间\n开机率 =(运行时间 + 空闲时间 + 故障时间)/ 总的时间', tablePowerOnRateColumn: '开机率', tableStartTimeColumn: '设备运行开始时间', tableEndTimeColumn: '设备运行结束时间', exportFilename: '设备运行报表.xls' }, + RunOverview: { + moduleName: '设备运行总览', + pageIntro: '在菜单页中查看设备状态分布、指标概况与设备运行轨迹,并支持全屏查看。', + + groupLabel: '设备分组', + groupPlaceholder: '请选择分组', + deviceLabel: '设备名称', + devicePlaceholder: '请选择设备', + timeRangeLabel: '时间范围', + timeRangeStartPlaceholder: '开始时间', + timeRangeEndPlaceholder: '结束时间', + + searchButtonText: '查询', + resetButtonText: '重置', + exportButtonText: '导出', + exportPlaceholderMessage: '当前为静态总览页面,导出功能预留中', + + statusDistributionTitle: '时间分布图(状态占比)', + summaryTitle: '状态占比(汇总)', + timelineTitle: '设备运行轨迹(甘特图)', + granularityHour: '按小时', + totalTimeLabel: '总时间', + compareLabel: '较昨日', + deviceFilterAll: '全部设备', + expandAllText: '展开全部', + enterFullscreen: '全屏查看', + exitFullscreen: '退出全屏', + statisticsTimeText: '统计时间:{start} ~ {end}', + totalDevicesText: '共 {total} 台设备', + pageUnit: '条/页', + + tableDeviceNameColumn: '设备名称', + tableUtilizationRateColumn: '稼动率', + + quickRange: { + today: '今天', + yesterday: '昨天', + last7Days: '近7天', + last30Days: '近30天', + custom: '自定义' + }, + metrics: { + utilizationRate: '平均稼动率', + powerOnRate: '平均开机率', + faultRate: '平均故障率', + standbyRate: '平均待机率' + }, + legend: { + running: '运行', + standby: '待机', + fault: '故障', + offline: '离线' + } + }, RealTimeMonitoring: { moduleName: '数据实时监控', @@ -3557,6 +4241,8 @@ export default { searchButtonText: '搜索', resetButtonText: '重置', exportButtonText: '导出', + collapseText: '收起', + expandText: '展开', tableLineCodeColumn: '产线编码', tableLineNameColumn: '产线名称', @@ -3594,6 +4280,8 @@ export default { searchButtonText: '搜索', resetButtonText: '重置', exportButtonText: '导出', + collapseText: '收起', + expandText: '展开', tableLineCodeColumn: '产线编码', tableLineNameColumn: '产线名称', @@ -3602,9 +4290,11 @@ export default { tableCollectionTimeColumn: '采集时间', tableOperateColumn: '操作', tableActionHistoryLabel: '历史记录', - + tableActionHistoryAnalyseLabel: '数据分析', dialogTitlePrefix: '历史记录:', dialogCollectionTimeLabel: '采集时间', + dialogPointFilterLabel: '点位筛选', + dialogPointFilterPlaceholder: '请输入点位名称', dialogCollectionTimeStartPlaceholder: '开始时间', dialogCollectionTimeEndPlaceholder: '结束时间', dialogSearchButtonText: '查询', @@ -3826,7 +4516,7 @@ export default { username: '用户名', password: '密码', - settingDialogTitle: '设备设置', + settingDialogTitle: '设置', connect: '连接', disconnect: '断开连接', @@ -3974,9 +4664,11 @@ export default { tableCollectionTimeColumn: '采集时间', tableOperateColumn: '操作', tableActionHistoryLabel: '历史记录', - + tableActionHistoryAnalyseLabel: '数据分析', dialogTitlePrefix: '历史记录:', dialogCollectionTimeLabel: '采集时间', + dialogPointFilterLabel: '点位筛选', + dialogPointFilterPlaceholder: '请输入点位名称', dialogCollectionTimeStartPlaceholder: '开始时间', dialogCollectionTimeEndPlaceholder: '结束时间', dialogSearchButtonText: '查询', @@ -4017,5 +4709,291 @@ export default { messageFetchChartFailed: '获取图表数据失败' } } + }, + ProductionReport: { + Index: { + searchCodeLabel: '任务单编码', + searchCodePlaceholder: '请输入任务单编码', + searchOrderDateLabel: '下达日期', + searchDeliveryDateLabel: '交货日期', + searchRemarkLabel: '备注', + searchRemarkPlaceholder: '请输入备注', + searchCreateTimeLabel: '创建时间', + startDatePlaceholder: '开始日期', + endDatePlaceholder: '结束日期', + buttonSearch: '搜索', + buttonReset: '重置', + buttonExport: '导出', + tabAll: '全部', + tabIssued: '已下达', + tabPartialScheduled: '部分排产', + tabPendingProduction: '待生产', + tabInProduction: '生产中', + tabCompleted: '已完成', + tableCode: '任务单编码', + tableOrderDate: '下达日期', + tableDeliveryDate: '交货日期', + tableStatus: '状态', + tableIsScheduled: '是否排产', + tableProductionProgress: '生产进度', + tableRemark: '备注', + yes: '是', + no: '否', + detailTabBasicInfo: '基础信息', + detailTabRelatedPlan: '关联计划', + detailTabQualityInfo: '质检信息', + detailTabBaogongInfo: '报工信息', + exportFilename: '生产报表', + tableOperate: '操作', + detail: '详情' + }, + Detail: { + invalidId: '参数错误,任务单ID不能为空' + }, + BasicInfo: { + buttonRefresh: '刷新', + tableTaskCode: '任务单编码', + tableProductCode: '产品编码', + tableProductName: '产品名称', + tableTotalNumber: '总数量', + tablePlanNumber: '已计划数量', + tableUnplannedNumber: '未计划数量', + tableOperate: '操作', + buttonViewProductInfo: '查看产品信息' + }, + ProductInfo: { + dialogTitle: '产品信息', + labelProductCode: '产品编码', + labelProductName: '产品名称', + labelNumber: '数量', + labelUnit: '单位', + labelSpecification: '规格', + tableMaterialCode: '原料编码', + tableMaterialName: '原料名称', + tableRequiredQuantity: '需求量', + tableUnit: '单位' + }, + BaogongInfo: { + dateRangeSeparator: '至', + startDatePlaceholder: '开始日期', + endDatePlaceholder: '结束日期', + buttonToday: '今日', + buttonLast7Days: '近七天', + buttonLast30Days: '近30日', + buttonReset: '重置', + buttonRefresh: '刷新', + tableTaskCode: '任务单编码', + tablePlanCode: '计划编码', + tableEmployeeId: '员工ID', + tableEmployeeName: '员工名称', + tableProductName: '产品名称', + tableProductCode: '产品编码', + tableBaogongNumber: '报工数量', + tablePassNumber: '合格数量', + tableNoPassNumber: '不合格数量', + tablePassRate: '合格率%', + tableNoPassReason: '不合格原因', + tableBaogongTime: '报工时间' + }, + QualityInfo: { + buttonRefresh: '刷新', + expandTableName: '检验项名称', + expandTableMethod: '检验方式', + expandTableStandard: '判定基准', + expandTableUnit: '单位', + expandTableUpperLimit: '上限值', + expandTableLowerLimit: '下限值', + expandTableInputValue: '输入值', + expandTableImage: '图片', + expandTablePreview: '预览', + expandTableResult: '检验结果', + expandTableRemark: '备注', + tableCode: '质检编码', + tableCategory: '质检分类', + tableStatus: '状态', + tableTicketCode: '工单编码', + tableProcess: '工序', + tableSchema: '检验方案', + tableManager: '负责人', + tableExecutor: '执行人', + tableExecuteTime: '执行时间', + tableRemark: '备注', + tableResult: '结果', + resultPass: '通过', + resultFail: '不通过', + inspectionPending: '待检测', + inspectionPass: '检测通过', + inspectionFail: '检测不通过', + unknown: '未知' + }, + RelatedPlan: { + buttonRefresh: '刷新', + emptyDescription: '暂无关联计划' + }, + PlanCard: { + labelProductName: '产品名称', + labelDeviceName: '设备名称', + labelPlanStartTime: '计划开始时间', + labelPlanEndTime: '计划结束时间', + labelLatestStartTime: '最晚开始时间', + statPlanNumber: '计划数量', + statWangongNumber: '完工数量', + statPassNumber: '合格数量', + statNoPassNumber: '不合格数量', + statPassRate: '合格率', + emptyDescription: '暂无数据' + }, + Timeline: { + unknown: '未知', + statusScheduled: '已排产', + statusPaused: '暂停', + statusPendingStorage: '待入库', + statusStored: '已入库', + statusStarted: '已开工' + } + }, + GanttChart: { + Index: { + searchTimeLabel: '查询时间', + startPlaceholder: '开始时间', + endPlaceholder: '结束时间', + deviceLabel: '设备', + devicePlaceholder: '请选择设备', + buttonSearch: '查询', + buttonReset: '重置' + }, + CardView: { + legendScheduled: '已排产', + legendMerged: '已并工', + legendPaused: '暂停', + legendPendingStorage: '待入库', + legendStored: '已入库', + statPlanCount: '计划数', + statCapacity: '产能', + planCodeLabel: '计划编号:', + productLabel: '产品:', + planNumberLabel: '计划数量:', + deliveryDateLabel: '交货日期:', + startLabel: '开始:', + endLabel: '结束:', + emptyDescription: '暂无计划', + statusScheduled: '已排产', + statusMerged: '已并工', + statusPaused: '暂停', + statusPendingStorage: '待入库', + statusStored: '已入库', + statusUnknown: '未知' + }, + GanttPanel: { + detailTitle: '计划信息', + deviceNameLabel: '设备名称', + deviceIdLabel: '设备ID', + capacityLabel: '产能', + dailyAvgLabel: '每日报工平均值', + dataCollectionCapacityLabel: '数据采集产能', + planCountLabel: '计划条数', + planDetailTitle: '计划明细', + planCodeColon: '计划编码:', + taskCodeColon: '任务编码:', + planNumberColon: '计划数量:', + deliveryDateColon: '交货日期:', + startColon: '开始:', + endColon: '结束:', + latestStartColon: '最晚开工:', + emptyDescription: '暂无计划信息', + adjustTaskTitle: '调整任务', + taskLabel: '任务', + taskPlaceholder: '请选择任务', + deviceLabel: '设备', + devicePlaceholder: '请选择设备', + startDateLabel: '开始日期', + startDatePlaceholder: '请选择计划开始日期', + endDateLabel: '结束日期', + endDatePlaceholder: '请选择计划结束日期', + durationLabel: '天数', + buttonCancel: '取消', + buttonConfirm: '确定', + editStartDateTitle: '修改开始时间', + startTimeLabel: '开始时间', + startTimePlaceholder: '请选择开始时间', + capacityTypeLabel: '产能来源', + warningCompleteDeviceDate: '请完善设备、计划开始日期和计划结束日期', + warningValidTime: '请选择有效的时间', + warningEndBeforeStart: '结束时间不能早于开始时间', + warningDragOutOfRange: '拖拽超出日期范围,已恢复原位', + columnTaskName: '任务名称', + columnDeviceName: '设备名称', + columnPlanInfo: '计划信息', + columnStartTime: '开始时间', + columnDays: '天数', + scaleMonthFormat: 'YYYY年M月', + tooltipTaskDetail: '任务明细', + tooltipTaskCode: '任务单:', + tooltipProduct: '产品:', + tooltipDetailId: '明细ID:', + tooltipPlanNumber: '计划数量:', + tooltipStart: '开始:', + tooltipEnd: '结束:', + tooltipLatestStart: '最晚开工:', + tooltipSummary: '汇总', + tooltipDevice: '设备:', + tooltipDetailCount: '任务明细条数:', + tooltipTotalPlanNumber: '计划总数:', + tooltipEarliestStart: '最早计划开始:', + tooltipLatestEnd: '最晚计划结束:', + statusScheduled: '已排产', + statusStarted: '已开工', + statusPaused: '暂停', + statusPendingStorage: '待入库', + statusStored: '已入库', + dialogTitle: '排产甘特图预览', + workerLabel: '领料人', + workerPlaceholder: '请选择领料人', + calcLossLabel: '是否计算损耗', + lockBtn: '锁定', + unlockBtn: '解锁', + undoBtn: '撤回', + buttonSave: '保存', + buttonClose: '关闭', + warningNoPlanData: '暂无可保存的计划数据', + saveSuccess: '排产计划保存成功' + } + }, + EnergyOverview: { + messages: { + singleDayOnly: '时间范围只能查询同一天的数据' + }, + filters: { + org: '所属区域', + orgPlaceholder: '请选择所属区域', + energyType: '能源类型', + energyTypePlaceholder: '请选择能源类型', + timeRange: '时间范围' + }, + panels: { + trend: '能源用量趋势', + region: '区域能耗占比', + top5: '能耗排行 TOP5', + detail: '能源明细表' + }, + table: { + rank: '排名', + name: '名称', + region: '所属区域', + usage: '用量', + meterName: '表名称', + energyType: '能源类型', + energyUsage: '能源用量', + startTime: '开始时间', + endTime: '结束时间' + }, + chart: { + usage: '用量', + time: '时间', + regionEnergy: '区域能耗', + totalUsage: '总用量' + }, + empty: '请先配置能源类型', + exportSuccess: '导出已发起' } } diff --git a/src/main.ts b/src/main.ts index 874f7668..5d8107d0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -41,6 +41,8 @@ import '@/plugins/tongji' // 百度统计 import Logger from '@/utils/Logger' import VueDOMPurifyHTML from 'vue-dompurify-html' // 解决v-html 的安全隐患 +import { hiPrintPlugin } from 'vue-plugin-hiprint' +import 'vue-plugin-hiprint/dist/print-lock.css' // 创建实例 const setupAll = async () => { @@ -56,6 +58,9 @@ const setupAll = async () => { setupFormCreate(app) + app.use(hiPrintPlugin, '$hiprint', false) + hiPrintPlugin.disAutoConnect() + setupRouter(app) // directives 指令 diff --git a/src/permission.ts b/src/permission.ts index 8201e1d6..427ae0a1 100644 --- a/src/permission.ts +++ b/src/permission.ts @@ -79,7 +79,9 @@ const whiteList = [ '/auth-redirect', '/bind', '/register', - '/oauthLogin/gitee' + '/oauthLogin/gitee', + '/iot/report/dashboardPage/Dashboard8', + '/iot/report/dashboardPage/Dashboard1' ] // 路由加载前 diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts index 659eafb2..d1e56667 100644 --- a/src/router/modules/remaining.ts +++ b/src/router/modules/remaining.ts @@ -642,6 +642,28 @@ const remainingRouter: AppRouteRecordRaw[] = [ canTo: true } }, + { + path: '/iot', + component: Layout, + name: 'IotHiddenPages', + meta: { + hidden: true + }, + children: [ + { + path: 'runoverview', + component: () => import('@/views/iot/runoverview/index.vue'), + name: 'IotRunOverview', + meta: { + title: t('DataCollection.RunOverview.moduleName'), + hidden: true, + noTagsView: false, + canTo: true, + activeMenu: '/iot/runoverview' + } + } + ] + }, { path: '/:pathMatch(.*)*', @@ -672,6 +694,28 @@ const remainingRouter: AppRouteRecordRaw[] = [ activeMenu: '/mes/plan' }, component: () => import('@/views/mes/plan/index.vue') + }, + { + path: 'production-report/detail/:id', + name: 'MesProductionReportDetail', + meta: { + title: '生产报工详情', + noCache: true, + hidden: true, + activeMenu: '/mes/productionReport' + }, + component: () => import('@/views/mes/productionReport/detail/index.vue') + }, + { + path: 'device-ledger/detail/:id', + name: 'MesDeviceLedgerDetail', + meta: { + title: '设备台账详情', + noCache: true, + hidden: true, + activeMenu: '/mes/deviceledger' + }, + component: () => import('@/views/mes/deviceledger/detail/index.vue') } ] } diff --git a/src/store/modules/dict.ts b/src/store/modules/dict.ts index e94f14f4..e3fda4da 100644 --- a/src/store/modules/dict.ts +++ b/src/store/modules/dict.ts @@ -9,6 +9,7 @@ import { getSimpleDictDataList } from '@/api/system/dict/dict.data' export interface DictValueType { value: any label: string + labelEn?: string clorType?: string cssClass?: string } @@ -42,33 +43,41 @@ export const useDictStore = defineStore('dict', { async setDictMap() { const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE) if (dictMap) { - this.dictMap = dictMap - this.isSetDict = true - } else { - try { - const res = await getSimpleDictDataList() - const dictDataMap = new Map() - res.forEach((dictData: DictDataVO) => { - const enumValueObj = dictDataMap[dictData.dictType] - if (!enumValueObj) { - dictDataMap[dictData.dictType] = [] - } - dictDataMap[dictData.dictType].push({ - value: dictData.value, - label: dictData.label, - colorType: dictData.colorType, - cssClass: dictData.cssClass - }) - }) - this.dictMap = dictDataMap - wsCache.set(CACHE_KEY.DICT_CACHE, dictDataMap, { exp: 60 }) - } catch (error) { - console.error('加载数据字典失败', error) - this.dictMap = new Map() - } finally { + const dictTypes = Object.keys(dictMap || {}) + const firstDictType = dictTypes[0] + const firstList = firstDictType ? dictMap[firstDictType] : undefined + const needsUpgrade = + Array.isArray(firstList) && firstList.length > 0 && !('labelEn' in (firstList[0] || {})) + if (!needsUpgrade) { + this.dictMap = dictMap this.isSetDict = true + return } } + try { + const res = await getSimpleDictDataList() + const dictDataMap = new Map() + res.forEach((dictData: DictDataVO) => { + const enumValueObj = dictDataMap[dictData.dictType] + if (!enumValueObj) { + dictDataMap[dictData.dictType] = [] + } + dictDataMap[dictData.dictType].push({ + value: dictData.value, + label: dictData.label, + labelEn: (dictData as any).labelEn, + colorType: dictData.colorType, + cssClass: dictData.cssClass + }) + }) + this.dictMap = dictDataMap + wsCache.set(CACHE_KEY.DICT_CACHE, dictDataMap, { exp: 60 }) + } catch (error) { + console.error('加载数据字典失败', error) + this.dictMap = new Map() + } finally { + this.isSetDict = true + } }, getDictByType(type: string) { if (!this.isSetDict) { @@ -89,6 +98,7 @@ export const useDictStore = defineStore('dict', { dictDataMap[dictData.dictType].push({ value: dictData.value, label: dictData.label, + labelEn: (dictData as any).labelEn, colorType: dictData.colorType, cssClass: dictData.cssClass }) diff --git a/src/styles/FormCreate/index.scss b/src/styles/FormCreate/index.scss index bb620005..d01125f8 100644 --- a/src/styles/FormCreate/index.scss +++ b/src/styles/FormCreate/index.scss @@ -20,3 +20,7 @@ .icon-user-o:before { content: '\f2c0'; } + +.el-table--small .cell { + padding: 0 2px; +} \ No newline at end of file diff --git a/src/styles/index.scss b/src/styles/index.scss index 7607941c..2db5e6fe 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -35,3 +35,19 @@ border-left-color: var(--el-color-primary); } } + +/* 全局生效,所有表格的悬停色都会改变 */ +.el-table--enable-row-hover .el-table__body tr:hover > td { + background-color: #f0f9eb !important; +} + +/* 2. 关键补全:针对展开行内的 hover 状态 */ +/* 展开行(tr.expanded)内部的 td 需要单独设置 */ +.el-table__body .el-table__expanded-cell:hover > td { + background-color: #f0f9eb !important; +} + +/* 3. 针对展开后触发的 hover-row 类(某些版本生效) */ +.el-table__body tr.hover-row > td { + background-color: #f0f9eb !important; +} \ No newline at end of file diff --git a/src/styles/var.css b/src/styles/var.css index 44f9405c..4762da36 100644 --- a/src/styles/var.css +++ b/src/styles/var.css @@ -1,7 +1,7 @@ :root { --login-bg-color: #293146; - --left-menu-max-width: 200px; + --left-menu-max-width: 220px; --left-menu-min-width: 64px; diff --git a/src/utils/calendar.js b/src/utils/calendar.js new file mode 100644 index 00000000..00af4487 --- /dev/null +++ b/src/utils/calendar.js @@ -0,0 +1,668 @@ +/** + * @1900-2100区间内的公历、农历互转 + * @charset UTF-8 + * @Author Jea杨(JJonline@JJonline.Cn) + * @Time 2014-7-21 + * @Time 2016-8-13 Fixed 2033hex、Attribution Annals + * @Time 2016-9-25 Fixed lunar LeapMonth Param Bug + * @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year + * @Version 1.0.3 + * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] + * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] + */ +const calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,//1900-1909 + 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,//1910-1919 + 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,//1920-1929 + 0x06566, 0x0d4a0, 0x0ea50, 0x16a95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,//1930-1939 + 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,//1940-1949 + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,//1950-1959 + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,//1960-1969 + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6,//1970-1979 + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,//1980-1989 + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0,//1990-1999 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,//2000-2009 + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,//2010-2019 + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,//2020-2029 + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,//2030-2039 + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0,//2040-2049 + /**Add By JJonline@JJonline.Cn**/ + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0,//2050-2059 + 0x092e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4,//2060-2069 + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0,//2070-2079 + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160,//2080-2089 + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252,//2090-2099 + 0x0d520],//2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: ["\u7532", "\u4e59", "\u4e19", "\u4e01", "\u620a", "\u5df1", "\u5e9a", "\u8f9b", "\u58ec", "\u7678"], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: ["\u5b50", "\u4e11", "\u5bc5", "\u536f", "\u8fb0", "\u5df3", "\u5348", "\u672a", "\u7533", "\u9149", "\u620c", "\u4ea5"], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ["\u9f20", "\u725b", "\u864e", "\u5154", "\u9f99", "\u86c7", "\u9a6c", "\u7f8a", "\u7334", "\u9e21", "\u72d7", "\u732a"], + + /** + * 阳历节日 + */ + festival: { + '1-1': {title: '元旦节'}, + '2-14': {title: '情人节'}, + '5-1': {title: '劳动节'}, + '5-4': {title: '青年节'}, + '6-1': {title: '儿童节'}, + '9-10': {title: '教师节'}, + '10-1': {title: '国庆节'}, + '12-25': {title: '圣诞节'}, + + '3-8': {title: '妇女节'}, + '3-12': {title: '植树节'}, + '4-1': {title: '愚人节'}, + '5-12': {title: '护士节'}, + '7-1': {title: '建党节'}, + '8-1': {title: '建军节'}, + '12-24': {title: '平安夜'}, + }, + + /** + * 农历节日 + */ + lFestival: { + '12-30': {title: '除夕'}, + '1-1': {title: '春节'}, + '1-15': {title: '元宵节'}, + '2-2': {title: '龙抬头'}, + '5-5': {title: '端午节'}, + '7-7': {title: '七夕节'}, + '7-15': {title: '中元节'}, + '8-15': {title: '中秋节'}, + '9-9': {title: '重阳节'}, + '10-1': {title: '寒衣节'}, + '10-15': {title: '下元节'}, + '12-8': {title: '腊八节'}, + '12-23': {title: '北方小年'}, + '12-24': {title: '南方小年'}, + }, + + /** + * 返回默认定义的阳历节日 + */ + getFestival() { + return this.festival + }, + + /** + * 返回默认定义的内容里节日 + */ + getLunarFestival() { + return this.lFestival + }, + + /** + * + * @param param {Object} 按照festival的格式输入数据,设置阳历节日 + */ + setFestival(param = {}) { + this.festival = param + }, + + /** + * + * @param param {Object} 按照lFestival的格式输入数据,设置农历节日 + */ + setLunarFestival(param = {}) { + this.lFestival = param + }, + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: ["\u5c0f\u5bd2", "\u5927\u5bd2", "\u7acb\u6625", "\u96e8\u6c34", "\u60ca\u86f0", "\u6625\u5206", "\u6e05\u660e", "\u8c37\u96e8", "\u7acb\u590f", "\u5c0f\u6ee1", "\u8292\u79cd", "\u590f\u81f3", "\u5c0f\u6691", "\u5927\u6691", "\u7acb\u79cb", "\u5904\u6691", "\u767d\u9732", "\u79cb\u5206", "\u5bd2\u9732", "\u971c\u964d", "\u7acb\u51ac", "\u5c0f\u96ea", "\u5927\u96ea", "\u51ac\u81f3"], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341"], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ["\u521d", "\u5341", "\u5eff", "\u5345"], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ["\u6b63", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341", "\u51ac", "\u814a"], + + /** + * 返回农历y年一整年的总天数 + * @param y lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function (y) { + let i, sum = 348; + for (i = 0x8000; i > 0x8; i >>= 1) { + sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0; + } + return (sum + this.leapDays(y)); + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param y lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function (y) { //闰字编码 \u95f0 + return (this.lunarInfo[y - 1900] & 0xf); + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param y lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function (y) { + if (this.leapMonth(y)) { + return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29); + } + return (0); + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param y lunar Year + * @param m lunar Month + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function (y, m) { + if (m > 12 || m < 1) { + return -1 + }//月份参数从1至12,参数错误返回-1 + return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29); + }, + + /** + * 返回公历(!)y年m月的天数 + * @param y solar Year + * @param m solar Month + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function (y, m) { + if (m > 12 || m < 1) { + return -1 + } //若参数错误 返回-1 + const ms = m - 1; + if (ms === 1) { //2月份的闰平规律测算后确认返回28或29 + return (((y % 4 === 0) && (y % 100 !== 0) || (y % 400 === 0)) ? 29 : 28); + } else { + return (this.solarMonth[ms]); + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function (lYear) { + var ganKey = (lYear - 3) % 10; + var zhiKey = (lYear - 3) % 12; + if (ganKey === 0) ganKey = 10;//如果余数为0则为最后一个天干 + if (zhiKey === 0) zhiKey = 12;//如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]; + + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function (cMonth, cDay) { + const s = "\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf"; + const arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]; + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + "\u5ea7";//座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function (offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12]; + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y y公历年(1900-2100) + * @param n n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function (y, n) { + if( y < 1900 || y > 2100 || n < 1 || n > 24) { + return -1; + } + const _table = this.sTermInfo[y - 1900]; + const _calcDay = [] + for (let index = 0; index < _table.length; index += 5) { + const chunk = parseInt('0x' + _table.substr(index, 5)).toString() + _calcDay.push( + chunk[0], + chunk.substr(1, 2), + chunk[3], + chunk.substr(4, 2) + ) + } + return parseInt(_calcDay[n - 1]); + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param m lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function (m) { // 月 => \u6708 + if (m > 12 || m < 1) { + return -1 + } //若参数错误 返回-1 + let s = this.nStr3[m - 1]; + s += "\u6708";//加上月字 + return s; + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param d lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function (d) { //日 => \u65e5 + let s; + switch (d) { + case 10: + s = '\u521d\u5341'; + break; + case 20: + s = '\u4e8c\u5341'; + break; + case 30: + s = '\u4e09\u5341'; + break; + default : + s = this.nStr2[Math.floor(d / 10)]; + s += this.nStr1[d % 10]; + } + return (s); + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function (y) { + return this.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * !important! 公历参数区间1900.1.31~2100.12.31 + * @param yPara solar year + * @param mPara solar month + * @param dPara solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function (yPara, mPara, dPara) { + let y = parseInt(yPara); + let m = parseInt(mPara); + let d = parseInt(dPara); + //年份限定、上限 + if (y < 1900 || y > 2100) { + return -1;// undefined转换为数字变为NaN + } + //公历传参最下限 + if (y === 1900 && m === 1 && d < 31) { + return -1; + } + + //未传参 获得当天 + let objDate; + if (!y) { + objDate = new Date(); + } else { + objDate = new Date(y, parseInt(m) - 1, d); + } + let i, leap = 0, temp = 0; + //修正ymd参数 + y = objDate.getFullYear(); + m = objDate.getMonth() + 1; + d = objDate.getDate(); + let offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000; + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i); + offset -= temp; + } + if (offset < 0) { + offset += temp; + i--; + } + + //是否今天 + let isTodayObj = new Date(), + isToday = false; + if (isTodayObj.getFullYear() === y && isTodayObj.getMonth() + 1 === m && isTodayObj.getDate() === d) { + isToday = true; + } + //星期几 + let nWeek = objDate.getDay(), + cWeek = this.nStr1[nWeek]; + //数字表示周几顺应天朝周一开始的惯例 + if (nWeek === 0) { + nWeek = 7; + } + //农历年 + const year = i; + leap = this.leapMonth(i); //闰哪个月 + let isLeap = false; + + //效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + //闰月 + if (leap > 0 && i === (leap + 1) && isLeap === false) { + --i; + isLeap = true; + temp = this.leapDays(year); //计算农历闰月天数 + } else { + temp = this.monthDays(year, i);//计算农历普通月天数 + } + //解除闰月 + if (isLeap === true && i === (leap + 1)) { + isLeap = false; + } + offset -= temp; + } + // 闰月导致数组下标重叠取反 + if (offset === 0 && leap > 0 && i === leap + 1) { + if (isLeap) { + isLeap = false; + } else { + isLeap = true; + --i; + } + } + if (offset < 0) { + offset += temp; + --i; + } + //农历月 + const month = i; + //农历日 + const day = offset + 1; + //天干地支处理 + const sm = m - 1; + const gzY = this.toGanZhiYear(year); + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + const firstNode = this.getTerm(y, (m * 2 - 1));//返回当月「节」为几日开始 + const secondNode = this.getTerm(y, (m * 2));//返回当月「节」为几日开始 + + // 依据12节气修正干支月 + let gzM = this.toGanZhi((y - 1900) * 12 + m + 11); + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12); + } + + //传入的日期的节气与否 + let isTerm = false; + let Term = null; + if (firstNode === d) { + isTerm = true; + Term = this.solarTerm[m * 2 - 2]; + } + if (secondNode === d) { + isTerm = true; + Term = this.solarTerm[m * 2 - 1]; + } + //日柱 当月一日与 1900/1/1 相差天数 + const dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10; + const gzD = this.toGanZhi(dayCyclical + d - 1); + //该日期所属的星座 + const astro = this.toAstro(m, d); + + const solarDate = y + '-' + m + '-' + d; + const lunarDate = year + '-' + month + '-' + day; + + const festival = this.festival; + const lFestival = this.lFestival; + + const festivalDate = m + '-' + d; + let lunarFestivalDate = month + '-' + day; + + // bugfix https://github.com/jjonline/calendar.js/issues/29 + // 农历节日修正:农历12月小月则29号除夕,大月则30号除夕 + // 此处取巧修正:当前为农历12月29号时增加一次判断并且把lunarFestivalDate设置为12-30以正确取得除夕 + // 天朝农历节日遇闰月过前不过后的原则,此处取农历12月天数不考虑闰月 + // 农历润12月在本工具支持的200年区间内仅1574年出现 + if (month === 12 && day === 29 && this.monthDays(year, month) === 29) { + lunarFestivalDate = '12-30'; + } + return { + date: solarDate, + lunarDate: lunarDate, + festival: festival[festivalDate] ? festival[festivalDate].title : null, + lunarFestival: lFestival[lunarFestivalDate] ? lFestival[lunarFestivalDate].title : null, + 'lYear': year, + 'lMonth': month, + 'lDay': day, + 'Animal': this.getAnimal(year), + 'IMonthCn': (isLeap ? "\u95f0" : '') + this.toChinaMonth(month), + 'IDayCn': this.toChinaDay(day), + 'cYear': y, + 'cMonth': m, + 'cDay': d, + 'gzYear': gzY, + 'gzMonth': gzM, + 'gzDay': gzD, + 'isToday': isToday, + 'isLeap': isLeap, + 'nWeek': nWeek, + 'ncWeek': "\u661f\u671f" + cWeek, + 'isTerm': isTerm, + 'Term': Term, + 'astro': astro + }; + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * !important! 参数区间1900.1.31~2100.12.1 + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function (y, m, d, isLeapMonth) { + y = parseInt(y) + m = parseInt(m) + d = parseInt(d) + isLeapMonth = !!isLeapMonth; + const leapOffset = 0; + const leapMonth = this.leapMonth(y); + const leapDay = this.leapDays(y); + if (isLeapMonth && (leapMonth !== m)) { + return -1; + }//传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if (y === 2100 && m === 12 && d > 1 || y === 1900 && m === 1 && d < 31) { + return -1; + }//超出了最大极限值 + const day = this.monthDays(y, m); + let _day = day; + //bugFix 2016-9-25 + //if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m); + } + if (y < 1900 || y > 2100 || d > _day) { + return -1; + }//参数合法性效验 + + //计算农历的时间差 + let offset = 0; + let i; + for (i = 1900; i < y; i++) { + offset += this.lYearDays(i); + } + let leap = 0, isAdd = false; + for (i = 1; i < m; i++) { + leap = this.leapMonth(y); + if (!isAdd) {//处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); + isAdd = true; + } + } + offset += this.monthDays(y, i); + } + //转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { + offset += day; + } + //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + const strap = Date.UTC(1900, 1, 30, 0, 0, 0); + const calObj = new Date((offset + d - 31) * 86400000 + strap); + const cY = calObj.getUTCFullYear(); + const cM = calObj.getUTCMonth() + 1; + const cD = calObj.getUTCDate(); + + return this.solar2lunar(cY, cM, cD); + } +}; + +export default calendar; \ No newline at end of file diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 4c1c8ddf..0fd92e59 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -2,9 +2,11 @@ * 数据字典工具类 */ import { useDictStoreWithOut } from '@/store/modules/dict' +import { useLocaleStoreWithOut } from '@/store/modules/locale' import { ElementPlusInfoType } from '@/types/elementPlus' const dictStore = useDictStoreWithOut() +const localeStore = useLocaleStoreWithOut() /** * 获取 dictType 对应的数据字典数组 @@ -15,6 +17,7 @@ const dictStore = useDictStoreWithOut() export interface DictDataType { dictType: string label: string + labelEn?: string value: string | number colorType: ElementPlusInfoType | '' cssClass: string @@ -39,8 +42,10 @@ export const getIntDictOptions = (dictType: string): NumberDictDataType[] => { // why 需要特殊转换:避免 IDEA 在 v-for="dict in getIntDictOptions(...)" 时,el-option 的 key 会告警 const dictOption: NumberDictDataType[] = [] dictOptions.forEach((dict: DictDataType) => { + const label = localeStore.getCurrentLocale?.lang === 'en' ? (dict.labelEn || dict.label) : dict.label dictOption.push({ ...dict, + label, value: parseInt(dict.value + '') }) }) @@ -54,8 +59,10 @@ export const getStrDictOptions = (dictType: string) => { // why 需要特殊转换:避免 IDEA 在 v-for="dict in getStrDictOptions(...)" 时,el-option 的 key 会告警 const dictOption: StringDictDataType[] = [] dictOptions.forEach((dict: DictDataType) => { + const label = localeStore.getCurrentLocale?.lang === 'en' ? (dict.labelEn || dict.label) : dict.label dictOption.push({ ...dict, + label, value: dict.value + '' }) }) @@ -66,8 +73,10 @@ export const getBoolDictOptions = (dictType: string) => { const dictOption: DictDataType[] = [] const dictOptions: DictDataType[] = getDictOptions(dictType) dictOptions.forEach((dict: DictDataType) => { + const label = localeStore.getCurrentLocale?.lang === 'en' ? (dict.labelEn || dict.label) : dict.label dictOption.push({ ...dict, + label, value: dict.value + '' === 'true' }) }) @@ -101,7 +110,8 @@ export const getDictLabel = (dictType: string, value: any): string => { const dictLabel = ref('') dictOptions.forEach((dict: DictDataType) => { if (dict.value === value + '') { - dictLabel.value = dict.label + dictLabel.value = + localeStore.getCurrentLocale?.lang === 'en' ? (dict.labelEn || dict.label) : dict.label } }) return dictLabel.value @@ -256,6 +266,9 @@ export enum DICT_TYPE { MOLD_GET_STATUS = "mold_get_status", MES_PRE_PRODUCTION = "mes_pre_production", MES_ZJ_PRODUCT = "mes_zj_product", + FILE_STATUS = "file_status", + Classification = "classification", + MES_JOB_TYPE = "mes_job_type", //====iot IOT_SIEMENS_TYPE = "iot_siemens_type", IOT_MODBUS_TYPE = "iot_modbus_type", @@ -278,7 +291,7 @@ export enum DICT_TYPE { IOT_ALERT_LEVEL = "iot_alert_level", IOT_PROTOCOL = "iot_protocol", IOT_DEVICE_ATTRIBUTE_UNIT = "iot_device_attribute_unit", - IOT_ALARM_REGISTRATION = " alarm_registration", + IOT_ALARM_REGISTRATION = "alarm_registration", PRIMARY_FLAG = "primary_flag" } diff --git a/src/views/Home/Index.vue b/src/views/Home/Index.vue index e2a9be1c..0e0be202 100644 --- a/src/views/Home/Index.vue +++ b/src/views/Home/Index.vue @@ -2,9 +2,9 @@
-
欢迎您使用必硕数字化智能中控平台
+
{{t("home.welcome")}}
- 必硕数字化智能中控平台以生产运营为核心,统一整合生产计划、数据采集、仓储、设备、能源、模具、质量、配方及报表分析等关键业务模块,实现从计划到执行、从设备到制品、从数据到决策的全流程数字化管理。 + {{t("home.message")}}
@@ -15,11 +15,11 @@ alt="banner" :src="bannerImg" fit="contain" class="home-welcome-image"
-
整体生产概况
+
{{t("home.productTitle")}}
+ :start-placeholder="t('home.placeholderCreateTimeStart')" :end-placeholder="t('home.placeholderCreateTimeEnd')" size="small" @change="handleProductionOverviewRangeChange" />
@@ -45,14 +45,14 @@ v-model="productionOverviewRange" type="daterange" unlink-panels value-format="Y
-
实时生产进度
+
{{t("home.productionSchedule")}}
-
生产计划 {{ item.code }} +
{{t("home.productionPlan")}} {{ item.code }} {{ getPlanStatusLabel(item.status) }} @@ -60,45 +60,45 @@ v-model="productionOverviewRange" type="daterange" unlink-panels value-format="Y
- 产品名称 + {{t("home.productionName")}} {{ item.productName }}
- 计划数量 + {{t("home.planNumber")}} {{ item.planNumber }}
- 生产线 + {{t("home.productionLine")}} {{ item.feedingPipelineName }}
- 计划开始时间 + {{t("home.planStartTime")}} {{ formatDate(item.planStartTime) }}
- 计划结束时间 + {{t("home.planEndTime")}} {{ formatDate(item.planEndTime) }}
- 完工数量 + {{t("home.completedQuantity")}} {{ item.wangongNumber }}
- 合格数量 + {{t("home.qualifiedQuantity")}} {{ item.passNumber }}
- 不合格数量 + {{t("home.unqualifiedQuantity")}} {{ item.noPassNumber }}%
- 合格率 + {{t("home.yieldRate")}} {{ item.passRate }}
- 实际结束时间 + {{t("home.actualEndTime")}} {{ formatDate(item.endTime) }}
@@ -111,7 +111,7 @@ v-model="productionOverviewRange" type="daterange" unlink-panels value-format="Y
-
待办任务
+
{{t("home.gtasks")}}
@@ -119,10 +119,10 @@ v-model="productionOverviewRange" type="daterange" unlink-panels value-format="Y
{{ item.name }}
-
任务编号:{{ item.code }}
-
任务类型:{{ item.type }}
-
目标:{{ item.deviceName }}
-
创建时间:{{ formatDate(item.createTime) }}
+
{{t("home.missionNumber")}}:{{ item.code }}
+
{{t("home.taskType")}}:{{ item.type }}
+
{{t("home.target")}}:{{ item.deviceName }}
+
{{t("home.creationTime")}}:{{ formatDate(item.createTime) }}
@@ -133,7 +133,7 @@ v-model="productionOverviewRange" type="daterange" unlink-panels value-format="Y
-
设备
+
{{t("home.equipment")}}
- + - - + + - +