Commit cc6f038d by wuqian

Merge branch 'dev' of 47.122.114.111:qinjianhui/factory_front into new-pod-cn

parents 852ad049 f08a0ccd
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"luxon": "^3.7.1", "luxon": "^3.7.1",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"qrcode": "^1.5.4",
"splitpanes": "^3.1.5", "splitpanes": "^3.1.5",
"vue": "^3.4.19", "vue": "^3.4.19",
"vue-dompurify-html": "^5.1.0", "vue-dompurify-html": "^5.1.0",
...@@ -28,6 +29,7 @@ ...@@ -28,6 +29,7 @@
}, },
"devDependencies": { "devDependencies": {
"@types/luxon": "^3.7.1", "@types/luxon": "^3.7.1",
"@types/qrcode": "^1.5.5",
"@types/splitpanes": "^2.2.6", "@types/splitpanes": "^2.2.6",
"@typescript-eslint/eslint-plugin": "^7.1.1", "@typescript-eslint/eslint-plugin": "^7.1.1",
"@typescript-eslint/parser": "^7.1.1", "@typescript-eslint/parser": "^7.1.1",
...@@ -1998,6 +2000,26 @@ ...@@ -1998,6 +2000,26 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": {
"version": "24.2.0",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-24.2.0.tgz",
"integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~7.10.0"
}
},
"node_modules/@types/qrcode": {
"version": "1.5.5",
"resolved": "https://registry.npmmirror.com/@types/qrcode/-/qrcode-1.5.5.tgz",
"integrity": "sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/semver": { "node_modules/@types/semver": {
"version": "7.7.0", "version": "7.7.0",
"resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.7.0.tgz", "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.7.0.tgz",
...@@ -3068,7 +3090,6 @@ ...@@ -3068,7 +3090,6 @@
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
...@@ -3078,7 +3099,6 @@ ...@@ -3078,7 +3099,6 @@
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"color-convert": "^2.0.1" "color-convert": "^2.0.1"
...@@ -3264,6 +3284,15 @@ ...@@ -3264,6 +3284,15 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001718", "version": "1.0.30001718",
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz",
...@@ -3331,6 +3360,17 @@ ...@@ -3331,6 +3360,17 @@
"url": "https://paulmillr.com/funding/" "url": "https://paulmillr.com/funding/"
} }
}, },
"node_modules/cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^6.2.0"
}
},
"node_modules/codepage": { "node_modules/codepage": {
"version": "1.15.0", "version": "1.15.0",
"resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz", "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
...@@ -3344,7 +3384,6 @@ ...@@ -3344,7 +3384,6 @@
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"color-name": "~1.1.4" "color-name": "~1.1.4"
...@@ -3357,7 +3396,6 @@ ...@@ -3357,7 +3396,6 @@
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/combined-stream": { "node_modules/combined-stream": {
...@@ -3488,6 +3526,15 @@ ...@@ -3488,6 +3526,15 @@
} }
} }
}, },
"node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/deep-is": { "node_modules/deep-is": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
...@@ -3518,6 +3565,12 @@ ...@@ -3518,6 +3565,12 @@
"node": ">=0.10" "node": ">=0.10"
} }
}, },
"node_modules/dijkstrajs": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
"integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==",
"license": "MIT"
},
"node_modules/dir-glob": { "node_modules/dir-glob": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
...@@ -3615,6 +3668,12 @@ ...@@ -3615,6 +3668,12 @@
"vue": "^3.2.0" "vue": "^3.2.0"
} }
}, },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/entities": { "node_modules/entities": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
...@@ -4281,6 +4340,15 @@ ...@@ -4281,6 +4340,15 @@
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-intrinsic": { "node_modules/get-intrinsic": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
...@@ -4616,6 +4684,15 @@ ...@@ -4616,6 +4684,15 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/is-glob": { "node_modules/is-glob": {
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
...@@ -5160,6 +5237,15 @@ ...@@ -5160,6 +5237,15 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/package-manager-detector": { "node_modules/package-manager-detector": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-1.3.0.tgz", "resolved": "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-1.3.0.tgz",
...@@ -5190,7 +5276,6 @@ ...@@ -5190,7 +5276,6 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
...@@ -5293,6 +5378,15 @@ ...@@ -5293,6 +5378,15 @@
"pathe": "^2.0.1" "pathe": "^2.0.1"
} }
}, },
"node_modules/pngjs": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz",
"integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
"license": "MIT",
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.5.3", "version": "8.5.3",
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz", "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz",
...@@ -5397,6 +5491,23 @@ ...@@ -5397,6 +5491,23 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/qrcode": {
"version": "1.5.4",
"resolved": "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.4.tgz",
"integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
"license": "MIT",
"dependencies": {
"dijkstrajs": "^1.0.1",
"pngjs": "^5.0.0",
"yargs": "^15.3.1"
},
"bin": {
"qrcode": "bin/qrcode"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/quansync": { "node_modules/quansync": {
"version": "0.2.10", "version": "0.2.10",
"resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz", "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz",
...@@ -5449,6 +5560,21 @@ ...@@ -5449,6 +5560,21 @@
"url": "https://paulmillr.com/funding/" "url": "https://paulmillr.com/funding/"
} }
}, },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"license": "ISC"
},
"node_modules/resolve": { "node_modules/resolve": {
"version": "1.22.10", "version": "1.22.10",
"resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz",
...@@ -5622,6 +5748,12 @@ ...@@ -5622,6 +5748,12 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
"license": "ISC"
},
"node_modules/shebang-command": { "node_modules/shebang-command": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
...@@ -5746,11 +5878,24 @@ ...@@ -5746,11 +5878,24 @@
"node": ">=0.6.19" "node": ">=0.6.19"
} }
}, },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": { "node_modules/strip-ansi": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ansi-regex": "^5.0.1" "ansi-regex": "^5.0.1"
...@@ -5926,6 +6071,13 @@ ...@@ -5926,6 +6071,13 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/undici-types": {
"version": "7.10.0",
"resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.10.0.tgz",
"integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
"dev": true,
"license": "MIT"
},
"node_modules/unimport": { "node_modules/unimport": {
"version": "3.14.6", "version": "3.14.6",
"resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.14.6.tgz", "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.14.6.tgz",
...@@ -6486,6 +6638,12 @@ ...@@ -6486,6 +6638,12 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/which-module": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz",
"integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
"license": "ISC"
},
"node_modules/wildcard": { "node_modules/wildcard": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz", "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
...@@ -6520,6 +6678,20 @@ ...@@ -6520,6 +6678,20 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/wrappy": { "node_modules/wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
...@@ -6564,6 +6736,12 @@ ...@@ -6564,6 +6736,12 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/y18n": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"license": "ISC"
},
"node_modules/yallist": { "node_modules/yallist": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
...@@ -6571,6 +6749,93 @@ ...@@ -6571,6 +6749,93 @@
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/yargs": {
"version": "15.4.1",
"resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz",
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"license": "MIT",
"dependencies": {
"cliui": "^6.0.0",
"decamelize": "^1.2.0",
"find-up": "^4.1.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^4.2.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^18.1.2"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs-parser": {
"version": "18.1.3",
"resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"license": "ISC",
"dependencies": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/yargs/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"license": "MIT",
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/yargs/node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"license": "MIT",
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yocto-queue": { "node_modules/yocto-queue": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"luxon": "^3.7.1", "luxon": "^3.7.1",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"qrcode": "^1.5.4",
"splitpanes": "^3.1.5", "splitpanes": "^3.1.5",
"vue": "^3.4.19", "vue": "^3.4.19",
"vue-dompurify-html": "^5.1.0", "vue-dompurify-html": "^5.1.0",
...@@ -30,6 +31,7 @@ ...@@ -30,6 +31,7 @@
}, },
"devDependencies": { "devDependencies": {
"@types/luxon": "^3.7.1", "@types/luxon": "^3.7.1",
"@types/qrcode": "^1.5.5",
"@types/splitpanes": "^2.2.6", "@types/splitpanes": "^2.2.6",
"@typescript-eslint/eslint-plugin": "^7.1.1", "@typescript-eslint/eslint-plugin": "^7.1.1",
"@typescript-eslint/parser": "^7.1.1", "@typescript-eslint/parser": "^7.1.1",
......
...@@ -60,6 +60,12 @@ export function getFilePath() { ...@@ -60,6 +60,12 @@ export function getFilePath() {
import.meta.env.VITE_API_BASE_URL + import.meta.env.VITE_API_BASE_UPLOAD_URL import.meta.env.VITE_API_BASE_URL + import.meta.env.VITE_API_BASE_UPLOAD_URL
) )
} }
export function getFileCnPath() {
if (!/(http|https):\/\/([^/]+)/i.test(import.meta.env.BASE_URL)) {
return location.origin
}
return import.meta.env.VITE_API_BASE_URL
}
export function getWsUrl() { export function getWsUrl() {
if (location.protocol === 'https:') { if (location.protocol === 'https:') {
return 'wss://' + location.host return 'wss://' + location.host
...@@ -68,5 +74,6 @@ export function getWsUrl() { ...@@ -68,5 +74,6 @@ export function getWsUrl() {
} }
} }
export const filePath = getFilePath() export const filePath = getFilePath()
export const FileCnPath = getFileCnPath()
export default axios export default axios
...@@ -34,14 +34,14 @@ export function uploadFileApi(data: FormData) { ...@@ -34,14 +34,14 @@ export function uploadFileApi(data: FormData) {
) )
} }
// 获取物流面单 US // 打印物流面单 US
export function getLogisticUSApi(content: string) { export function getLogisticUSApi(content: string) {
return axios.get<never, BaseRespData<{ documentUrl: string }>>( return axios.get<never, BaseRespData<{ documentUrl: string }>>(
`factory/podJomallOrderUs/getDocument?content=${content}`, `factory/podJomallOrderUs/getDocument?content=${content}`,
) )
} }
// 获取物流面单 CN // 打印物流面单 CN
export function getLogisticCNApi(content: string) { export function getLogisticCNApi(content: string) {
return axios.get<never, BaseRespData<{ documentUrl: string }>>( return axios.get<never, BaseRespData<{ documentUrl: string }>>(
`factory/podJomallOrder/getDocument?content=${content}`, `factory/podJomallOrder/getDocument?content=${content}`,
......
...@@ -117,11 +117,11 @@ ...@@ -117,11 +117,11 @@
<img src="../assets/images/brush-no.png" width="24" height="24" /> <img src="../assets/images/brush-no.png" width="24" height="24" />
</div> </div>
<div <div
title="获取物流面单" title="打印物流面单"
class="tool-item" class="tool-item"
@click="getLogisticDrawer = true" @click="getLogisticDrawer = true"
> >
<img src="../assets/images/package.png" width="24" height="24" /> <img src="../assets/images/printer.png" width="24" height="24" />
</div> </div>
</div> </div>
</div> </div>
...@@ -206,17 +206,31 @@ ...@@ -206,17 +206,31 @@
</el-drawer> </el-drawer>
<el-drawer <el-drawer
v-model="getLogisticDrawer" v-model="getLogisticDrawer"
direction="btt"
class="get-logistic-drawer" class="get-logistic-drawer"
title="获取物流面单" title="打印物流面单"
@close="content = ''" @close="content = ''"
> >
<el-input v-model="content" placeholder="请输入单号" clearable /> <ElSelect
<template #footer> v-model="sheetPrinter"
<span style="display: flex; justify-content: center"> placeholder="请选择打印机"
<el-button @click="getLogisticDrawer = false"> 取 消 </el-button> @change="handlePrinterChange"
<el-button type="primary" @click="getLogistic">查 询</el-button> style="width: 200px; margin-right: 10px"
</span> >
</template> <ElOption
v-for="item in printDeviceList"
:key="item"
:label="item"
:value="item"
/>
</ElSelect>
<el-input
v-model="content"
placeholder="请输入单号"
style="width: 300px; margin-right: 10px"
clearable
/>
<el-button type="primary" @click="getLogistic">查 询</el-button>
</el-drawer> </el-drawer>
</span> </span>
</template> </template>
...@@ -240,11 +254,14 @@ import { ...@@ -240,11 +254,14 @@ import {
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import Menu from '@/router/menu' import Menu from '@/router/menu'
import userUserStore from '@/store/user' import userUserStore from '@/store/user'
import type { FormRules } from 'element-plus' import type { FormRules } from 'element-plus'
import { useValue } from '@/utils/hooks/useValue' import { useValue } from '@/utils/hooks/useValue'
import useLodop from '@/utils/hooks/useLodop'
import { changePasswordApi } from '@/api/auth' import { changePasswordApi } from '@/api/auth'
import { getLogisticUSApi, getLogisticCNApi } from '@/api/common' import { getLogisticUSApi, getLogisticCNApi } from '@/api/common'
import { filePath } from '@/api/axios' import { filePath, FileCnPath } from '@/api/axios'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
interface MenuItem { interface MenuItem {
index: string index: string
...@@ -272,6 +289,9 @@ const userInfo = userStore.user ...@@ -272,6 +289,9 @@ const userInfo = userStore.user
const dialogVisible = ref(false) const dialogVisible = ref(false)
const formatDrawer = ref(false) const formatDrawer = ref(false)
const getLogisticDrawer = ref(false) const getLogisticDrawer = ref(false)
const printDeviceList = ref<string[]>([])
const sheetPrinter = ref('')
const textareaT = ref('') const textareaT = ref('')
const newTextareaT = ref('') const newTextareaT = ref('')
const content = ref('') const content = ref('')
...@@ -504,7 +524,31 @@ const copy = () => { ...@@ -504,7 +524,31 @@ const copy = () => {
}) })
} }
// 获取物流面单 const { getCLodop } = useLodop()
const initPrintDevice = () => {
const lodop = getCLodop(null, null)
if (!lodop) return
const arr = []
// 获取打印机数量
const length = lodop.GET_PRINTER_COUNT()
for (let i = 0; i < length; i++) {
// 根据设备序号获取设备名
const name = lodop.GET_PRINTER_NAME(i)
arr.push(name)
}
// 获取默认打印机
sheetPrinter.value = lodop.GET_PRINTER_NAME(0)
printDeviceList.value = arr
}
// 处理打印机选择变化,保存到 localStorage
const handlePrinterChange = (value: string) => {
sheetPrinter.value = value
localStorage.setItem('sheetPrinter', JSON.stringify(value))
}
// 打印物流面单
const getLogistic = () => { const getLogistic = () => {
if (!content.value) { if (!content.value) {
ElMessage.warning('请输入单号') ElMessage.warning('请输入单号')
...@@ -530,7 +574,7 @@ const getLogistic = () => { ...@@ -530,7 +574,7 @@ const getLogistic = () => {
// 中国物流 // 中国物流
getLogisticCNApi(content.value).then((res) => { getLogisticCNApi(content.value).then((res) => {
if (res.code === 200) { if (res.code === 200) {
window.open(filePath + res.data.documentUrl, '_blank') window.open(FileCnPath + res.data.documentUrl, '_blank')
} }
}) })
} else { } else {
...@@ -547,6 +591,24 @@ watch( ...@@ -547,6 +591,24 @@ watch(
{ immediate: true }, { immediate: true },
) )
watch(getLogisticDrawer, async (value: boolean) => {
if (value) {
initPrintDevice()
const locaclPrinter = localStorage.getItem('sheetPrinter')
if (locaclPrinter) {
const savedPrinter = JSON.parse(locaclPrinter)
// 检查保存的打印机是否在当前打印机列表中
if (printDeviceList.value.includes(savedPrinter)) {
sheetPrinter.value = savedPrinter
} else {
// 如果保存的打印机不在当前列表中,清空 localStorage 并设置为空
localStorage.removeItem('sheetPrinter')
sheetPrinter.value = ''
}
}
}
})
// 点击标签时切换路由 // 点击标签时切换路由
watch(activeTab, (newTab) => { watch(activeTab, (newTab) => {
if (newTab) { if (newTab) {
...@@ -700,9 +762,11 @@ onUnmounted(() => { ...@@ -700,9 +762,11 @@ onUnmounted(() => {
top: calc(50% - 325px) !important; top: calc(50% - 325px) !important;
} }
::v-deep(.get-logistic-drawer.el-drawer.rtl) { ::v-deep(.get-logistic-drawer.el-drawer.btt) {
height: 200px !important; height: 120px !important;
top: calc(50% - 100px) !important; width: 700px !important;
top: calc(50% - 60px) !important;
left: calc(50% - 350px) !important;
} }
.tool-item { .tool-item {
......
...@@ -27,7 +27,7 @@ export interface OrderData { ...@@ -27,7 +27,7 @@ export interface OrderData {
printResult?: string printResult?: string
remark?: string remark?: string
version?: number version?: number
factoryOrderNumber?: number factoryOrderNumber?: number | string
} }
export interface ProductList { export interface ProductList {
......
...@@ -90,12 +90,26 @@ ...@@ -90,12 +90,26 @@
<p> <p>
{{ detail?.factorySubOrderNumber }} {{ detail?.factorySubOrderNumber }}
</p> </p>
<el-icon
v-if="detail?.factorySubOrderNumber"
class="icon"
@click="copy(detail?.factorySubOrderNumber || '')"
>
<DocumentCopy />
</el-icon>
</div> </div>
<div :title="detail?.thirdSubOrderNumber || ''" class="div-item"> <div :title="detail?.thirdSubOrderNumber || ''" class="div-item">
<span>第三方生产单号</span> <span>第三方生产单号</span>
<p> <p>
{{ detail?.thirdSubOrderNumber }} {{ detail?.thirdSubOrderNumber }}
</p> </p>
<el-icon
v-if="detail?.thirdSubOrderNumber"
class="icon"
@click="copy(detail?.thirdSubOrderNumber || '')"
>
<DocumentCopy />
</el-icon>
</div> </div>
<div :title="String(detail?.craftName)" class="div-item"> <div :title="String(detail?.craftName)" class="div-item">
<span>生产工艺</span> <span>生产工艺</span>
...@@ -125,6 +139,13 @@ ...@@ -125,6 +139,13 @@
<div :title="detail?.shopNumber ?? ''" class="div-item"> <div :title="detail?.shopNumber ?? ''" class="div-item">
<span>店铺单号</span> <span>店铺单号</span>
<p>{{ detail?.shopNumber ?? '' }}</p> <p>{{ detail?.shopNumber ?? '' }}</p>
<el-icon
v-if="detail?.shopNumber"
class="icon"
@click="copy(detail?.shopNumber || '')"
>
<DocumentCopy />
</el-icon>
</div> </div>
<div :title="detail?.createTime" class="div-item"> <div :title="detail?.createTime" class="div-item">
...@@ -203,6 +224,8 @@ import { ...@@ -203,6 +224,8 @@ import {
getSubOrderBySubOrderNumber, getSubOrderBySubOrderNumber,
downloadMaterialApi, downloadMaterialApi,
} from '@/api/podUsOrder' } from '@/api/podUsOrder'
import { DocumentCopy } from '@element-plus/icons-vue'
import { cardImages, PodOrderRes } from '@/types/api/podUsOrder' import { cardImages, PodOrderRes } from '@/types/api/podUsOrder'
import { showConfirm } from '@/utils/ui' import { showConfirm } from '@/utils/ui'
import { filePath } from '@/api/axios' import { filePath } from '@/api/axios'
...@@ -529,6 +552,28 @@ const trackCodeInput = async () => { ...@@ -529,6 +552,28 @@ const trackCodeInput = async () => {
removeFromHistory() removeFromHistory()
return ElMessage.error('生产单不存在') return ElMessage.error('生产单不存在')
} }
if (res.data.interceptStatus == 0 || res.data.interceptStatus == 2) {
try {
await ElMessageBox.confirm(
'该生产单已提交至拦截申请,请确认是否继续生产',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
},
)
} catch (error) {
TrackingNumber.value = ''
detail.value = {
id: -1,
podJomallOrderUsId: -1,
imgList: [],
}
trackingNumberRef.value && trackingNumberRef.value.focus()
return
}
}
const d = JSON.parse(JSON.stringify(res.data)) const d = JSON.parse(JSON.stringify(res.data))
if (d.note) { if (d.note) {
...@@ -559,6 +604,15 @@ const trackCodeInput = async () => { ...@@ -559,6 +604,15 @@ const trackCodeInput = async () => {
const onOpened = () => { const onOpened = () => {
trackingNumberRef.value && trackingNumberRef.value.focus() trackingNumberRef.value && trackingNumberRef.value.focus()
} }
const copy = (text: string) => {
try {
navigator.clipboard.writeText(text)
ElMessage.success('复制成功')
} catch (err) {
console.error('复制失败:', err)
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.sure-btn { .sure-btn {
......
<template>
<div>
<ElDialog
v-model="visible"
title="质检包装"
fullscreen
:close-on-click-modal="false"
:close-on-press-escape="false"
style="top: 60px"
center
modal-class="pod-make-order-dialog"
>
<div class="detail-div">
<div class="left">
<div class="left-images">
<div
class="imagBox"
v-for="(item, index) in detail?.imgList"
:key="index"
>
<div
v-show="item?.title && item?.url"
style="font-size: 30px; font-weight: 700; text-align: center"
>
{{ item?.title }}
</div>
<img :src="item.url" alt="" />
</div>
</div>
<div class="tips">
<div>第一次扫码:就绪</div>
<div>第二次扫码:完成</div>
<div>
单子为就绪状态,如果下一个单子状态为完成,则从就绪变为错误
</div>
</div>
</div>
<div class="right">
<div class="input">
<el-input
ref="trackingNumberRef"
v-model="TrackingNumber"
:placeholder="placeholderText"
style="margin-right: 10px"
clearable
@keydown.enter="trackCodeInput()"
></el-input>
<el-button type="primary" @click="trackCodeInput()">
查询
</el-button>
</div>
<div class="printerContent">
<div class="qr">
二维码:<span style="color: #ff0000">{{ 111 }}</span>
</div>
<el-form style="display: flex; gap: 10px">
<el-form-item label="打印机:" style="flex: 1">
<ElSelect
v-model="sheetPrinter"
placeholder="请选择打印机"
@change="handlePrinterChange"
>
<ElOption
v-for="item in printDeviceList"
:key="item"
:label="item"
:value="item"
/>
</ElSelect>
</el-form-item>
<el-form-item label="标签尺寸:" style="flex: 1">
<ElSelect
v-model="sheetPrinter"
placeholder="请选择标签尺寸"
@change="handlePrinterChange"
>
<ElOption
v-for="item in printDeviceList"
:key="item"
:label="item"
:value="item"
/>
</ElSelect>
</el-form-item>
</el-form>
<div class="canvas-container">
<canvas id="canvas" ref="canvas"></canvas>
</div>
</div>
<div class="printQueue">
<div style="font-size: 18px; font-weight: 700; margin-bottom: 10px">
打印队列
</div>
<ul>
<li
v-for="value in 10"
:key="value"
:style="{
color:
value == 1 ? `#006000` : value == 2 ? `#ff0000` : '#000',
}"
>
value
</li>
</ul>
</div>
</div>
</div></ElDialog
>
</div>
</template>
<script setup lang="ts">
import QRCode from 'qrcode'
const visible = ref(false)
const TrackingNumber = ref('')
const placeholderText = ref('扫描枪输入生产单号')
const sheetPrinter = ref('')
const printDeviceList = ref([])
const trackingNumberRef = ref()
const detail = ref({
imgList: [
{
title: 'A',
id: '',
url: 'https://pic3.zhimg.com/v2-e52354ffdbd94a8e0a7649eacd34a788_r.jpg?source=1940ef5c',
},
{
title: 'b',
id: '',
url: 'https://bpic.588ku.com/element_origin_min_pic/23/07/11/d32dabe266d10da8b21bd640a2e9b611.jpg!r650',
},
],
})
function trackCodeInput() {
QRCode.toCanvas(document.getElementById('canvas'), '11', function (error) {
if (error) console.error(error)
console.log('QR code generated!')
})
}
function handlePrinterChange() {}
function open() {
visible.value = true
}
defineExpose({ open })
</script>
<style scoped lang="scss">
.detail-div {
display: flex;
height: 100%;
gap: 20px;
justify-content: space-between;
.left {
flex: 5;
display: flex;
flex-direction: column;
align-items: center;
.left-images {
flex: 1;
display: flex;
height: 100%;
gap: 10px;
.imagBox {
width: 50%;
}
}
.tips {
font-size: 25px;
color: #afafaf;
}
}
.right {
flex: 3;
gap: 20px;
flex-direction: column;
display: flex;
.input {
display: flex;
}
.printerContent {
flex: 6;
border: 1px solid #dcdfe6;
padding: 10px;
padding-bottom: 0;
.qr {
margin-bottom: 10px;
}
}
.printQueue {
flex: 5;
border: 1px solid #dcdfe6;
padding: 10px;
}
}
}
:deep() {
.el-dialog {
.el-dialog__header {
.el-dialog__title {
font-size: 30px !important;
font-weight: 700 !important;
}
}
}
}
.el-form-item {
margin-bottom: 0;
}
.canvas-container {
position: relative;
width: 100%;
height: calc(100% - 61px); /* 1:1 宽高比 */
}
#canvas {
position: absolute;
top: 0;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: auto !important;
height: 100% !important;
}
</style>
...@@ -72,10 +72,24 @@ ...@@ -72,10 +72,24 @@
<div class="basic-info-item"> <div class="basic-info-item">
<span>物流跟踪号:</span> <span>物流跟踪号:</span>
<span>{{ podOrderDetailsData?.trackingNumber }}</span> <span>{{ podOrderDetailsData?.trackingNumber }}</span>
<el-icon
v-if="podOrderDetailsData?.trackingNumber"
class="icon"
@click="copy(podOrderDetailsData?.trackingNumber || '')"
>
<DocumentCopy />
</el-icon>
</div> </div>
<div class="basic-info-item"> <div class="basic-info-item">
<span>店铺单号:</span> <span>店铺单号:</span>
<span>{{ podOrderDetailsData?.shopNumber }}</span> <span>{{ podOrderDetailsData?.shopNumber }}</span>
<el-icon
v-if="podOrderDetailsData?.shopNumber"
class="icon"
@click="copy(podOrderDetailsData?.shopNumber || '')"
>
<DocumentCopy />
</el-icon>
</div> </div>
<div class="basic-info-item"> <div class="basic-info-item">
<span>商品总数量:</span> <span>商品总数量:</span>
...@@ -100,6 +114,15 @@ ...@@ -100,6 +114,15 @@
<div class="basic-info-item"> <div class="basic-info-item">
<span>订单号:</span> <span>订单号:</span>
<span>{{ podOrderDetailsData?.factoryOrderNumber }}</span> <span>{{ podOrderDetailsData?.factoryOrderNumber }}</span>
<el-icon
v-if="podOrderDetailsData?.factoryOrderNumber"
class="icon"
@click="
copy((podOrderDetailsData.factoryOrderNumber as string) || '')
"
>
<DocumentCopy />
</el-icon>
</div> </div>
</div> </div>
...@@ -219,6 +242,8 @@ ...@@ -219,6 +242,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, nextTick, ref, watch } from 'vue' import { computed, nextTick, ref, watch } from 'vue'
import { DocumentCopy } from '@element-plus/icons-vue'
import useLodop from '@/utils/hooks/useLodop' import useLodop from '@/utils/hooks/useLodop'
import TableView from '@/components/TableView.vue' import TableView from '@/components/TableView.vue'
import type { WebSocketMessage } from '@/utils/websocket' import type { WebSocketMessage } from '@/utils/websocket'
...@@ -945,6 +970,15 @@ const handleWarehouseChange = (value: string | number) => { ...@@ -945,6 +970,15 @@ const handleWarehouseChange = (value: string | number) => {
_warehouseId.value = value _warehouseId.value = value
initOrderDetailBox() initOrderDetailBox()
} }
const copy = (text: string) => {
try {
navigator.clipboard.writeText(text)
ElMessage.success('复制成功')
} catch (err) {
console.error('复制失败:', err)
}
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
......
...@@ -2,106 +2,106 @@ ...@@ -2,106 +2,106 @@
<div class="card flex-column h-100 overflow-hidden"> <div class="card flex-column h-100 overflow-hidden">
<div class="header-filter-form"> <div class="header-filter-form">
<ElForm :model="searchForm" size="default" inline> <ElForm :model="searchForm" size="default" inline>
<div> <!-- <div> -->
<ElFormItem label="仓库"> <ElFormItem label="仓库">
<ElSelect <ElSelect
v-model="searchForm.warehouseId" v-model="searchForm.warehouseId"
clearable clearable
filterable filterable
placeholder="请输入" placeholder="请输入"
style="width: 150px" style="width: 150px"
> >
<el-option <el-option
v-for="item in warehouseList" v-for="item in warehouseList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
></el-option> ></el-option>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="平台"> <ElFormItem label="平台">
<ElSelect <ElSelect
v-model="searchForm.platform" v-model="searchForm.platform"
value-key="" value-key=""
placeholder="请选择" placeholder="请选择"
clearable clearable
filterable filterable
popper-class="customize-select-style" popper-class="customize-select-style"
style="width: 150px" style="width: 150px"
> >
<ElOption <ElOption
v-for="(item, index) in platformJson" v-for="(item, index) in platformJson"
:key="index" :key="index"
:label="item.type" :label="item.type"
:value="item.type" :value="item.type"
style="width: 160px" style="width: 160px"
>
<img
:src="`/images/icon/${item.icon.split('/').pop()}`"
style="height: 20px; margin: 5px 10px 0 0"
/>
<span :title="item.type">{{ item.type }}</span>
</ElOption>
</ElSelect>
</ElFormItem>
<ElFormItem label="工艺">
<ElSelect
v-model="searchForm.craftCode"
clearable
filterable
placeholder="请输入工艺"
style="width: 150px"
> >
<el-option <img
v-for="item in craftList" :src="`/images/icon/${item.icon.split('/').pop()}`"
:key="item.craftCode" style="height: 20px; margin: 5px 10px 0 0"
:label="item.craftName" />
:value="item.craftCode" <span :title="item.type">{{ item.type }}</span>
></el-option> </ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="库存SKU">
<ElInput <ElFormItem label="工艺">
v-model.trim="searchForm.thirdSkuCode" <ElSelect
placeholder="库存SKU" v-model="searchForm.craftCode"
clearable clearable
style="width: 150px" filterable
></ElInput> placeholder="请输入工艺"
</ElFormItem> style="width: 150px"
<ElFormItem label="款号"> >
<ElInput <el-option
v-model="searchForm.supplierProductNo" v-for="item in craftList"
placeholder="款号" :key="item.craftCode"
clearable :label="item.craftName"
style="width: 150px" :value="item.craftCode"
/> ></el-option>
</ElFormItem> </ElSelect>
<ElFormItem label="批次号"> </ElFormItem>
<ElInput <ElFormItem label="库存SKU">
v-model="searchForm.batchArrangeNumber" <ElInput
placeholder="批次号" v-model.trim="searchForm.thirdSkuCode"
clearable placeholder="库存SKU"
style="width: 150px" clearable
/> style="width: 150px"
</ElFormItem> ></ElInput>
<ElFormItem label="生产单号"> </ElFormItem>
<ElInput <ElFormItem label="款号">
v-model="searchForm.factorySubOrderNumber" <ElInput
placeholder="生产单号" v-model="searchForm.supplierProductNo"
clearable placeholder="款号"
style="width: 150px" clearable
/> style="width: 150px"
</ElFormItem> />
<ElFormItem label="店铺单号"> </ElFormItem>
<ElInput <ElFormItem label="批次号">
v-model="searchForm.shopNumber" <ElInput
placeholder="店铺单号" v-model="searchForm.batchArrangeNumber"
clearable placeholder="批次号"
style="width: 150px" clearable
/> style="width: 150px"
</ElFormItem> />
</div> </ElFormItem>
<ElFormItem label="生产单号">
<ElInput
v-model="searchForm.factorySubOrderNumber"
placeholder="生产单号"
clearable
style="width: 150px"
/>
</ElFormItem>
<ElFormItem label="店铺单号">
<ElInput
v-model="searchForm.shopNumber"
placeholder="店铺单号"
clearable
style="width: 150px"
/>
</ElFormItem>
<!-- </div> -->
<ElFormItem label="类型"> <ElFormItem label="类型">
<el-radio-group v-model="searchForm.customizedQuantity"> <el-radio-group v-model="searchForm.customizedQuantity">
<el-radio-button label="single">单面</el-radio-button> <el-radio-button label="single">单面</el-radio-button>
...@@ -263,15 +263,14 @@ ...@@ -263,15 +263,14 @@
</span> </span>
</ElFormItem> </ElFormItem>
<ElFormItem> <ElFormItem
<span v-if="
v-if=" status === 'PICKING' ||
status === 'PICKING' || status === 'TO_BE_REPLENISHMENT' ||
status === 'TO_BE_REPLENISHMENT' || status === 'IN_PRODUCTION'
status === 'IN_PRODUCTION' "
" >
class="item" <span class="item">
>
<ElButton <ElButton
:loading="tifDownloadLoading" :loading="tifDownloadLoading"
type="warning" type="warning"
...@@ -280,14 +279,15 @@ ...@@ -280,14 +279,15 @@
TIF排版 TIF排版
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if=" <ElFormItem
status === 'PICKING' || v-if="
status === 'TO_BE_REPLENISHMENT' || status === 'PICKING' ||
status === 'IN_PRODUCTION' status === 'TO_BE_REPLENISHMENT' ||
" status === 'IN_PRODUCTION'
class="item" "
> >
<span class="item">
<ElButton <ElButton
:loading="pngDownloadLoading" :loading="pngDownloadLoading"
type="warning" type="warning"
...@@ -296,30 +296,44 @@ ...@@ -296,30 +296,44 @@
PNG排版 PNG排版
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'TO_BE_CONFIRMED'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'TO_BE_CONFIRMED'">
<span class="item">
<ElButton type="success" @click="confirmProduct"> <ElButton type="success" @click="confirmProduct">
确认生产 确认生产
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'EXCEPTION_ORDER'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'EXCEPTION_ORDER'">
<span class="item">
<ElButton type="success" @click="updateOrder"> <ElButton type="success" @click="updateOrder">
转至待确认 转至待确认
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 3" <ElFormItem
class="item" v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 3"
> >
<span class="item">
<ElButton type="warning" @click="asyncOrderAddress"> <ElButton type="warning" @click="asyncOrderAddress">
同步收货地址 同步收货地址
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 1" <ElFormItem
class="item" v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 1"
> >
<span class="item">
<ElButton type="warning" @click="assignOrder"> 分派 </ElButton> <ElButton type="warning" @click="assignOrder"> 分派 </ElButton>
</span> </span>
</ElFormItem>
<ElFormItem
v-if="
status === 'PICKING' ||
status === 'TO_BE_REPLENISHMENT' ||
status === 'IN_PRODUCTION'
"
>
<!-- <span <!-- <span
v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 2" v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 2"
class="item" class="item"
...@@ -328,91 +342,115 @@ ...@@ -328,91 +342,115 @@
处理异常 处理异常
</ElButton> </ElButton>
</span> --> </span> -->
<span <span class="item">
v-if="
status === 'PICKING' ||
status === 'TO_BE_REPLENISHMENT' ||
status === 'IN_PRODUCTION'
"
class="item"
>
<ElButton type="primary" @click="printProductionOrder"> <ElButton type="primary" @click="printProductionOrder">
打印生产单 打印生产单
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'TO_BE_REPLENISHMENT'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'TO_BE_REPLENISHMENT'">
<span class="item">
<ElButton type="success" @click="replenishmentSuccess"> <ElButton type="success" @click="replenishmentSuccess">
补胚完成 补胚完成
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'PICKING'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'PICKING'">
<span class="item">
<ElButton type="success" @click="printPickingOrder"> <ElButton type="success" @click="printPickingOrder">
打印拣货单 打印拣货单
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'PICKING'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'PICKING'">
<span class="item">
<ElButton type="warning" @click="pickingComplete"> <ElButton type="warning" @click="pickingComplete">
拣胚完成 拣胚完成
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'PICKING'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'PICKING'">
<span class="item">
<ElButton type="success" @click="toOutOfStock"> 转至缺货 </ElButton> <ElButton type="success" @click="toOutOfStock"> 转至缺货 </ElButton>
</span> </span>
<span v-if="status === 'TO_BE_CONFIRMED'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'TO_BE_CONFIRMED'">
<span class="item">
<ElButton type="warning" @click="changeExceptionOrder"> <ElButton type="warning" @click="changeExceptionOrder">
转为异常单 转为异常单
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'TO_BE_CONFIRMED'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'TO_BE_CONFIRMED'">
<span class="item">
<ElButton type="success" @click="confirmProductToRiin"> <ElButton type="success" @click="confirmProductToRiin">
转至锐印生产 转至锐印生产
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if="status === 'TO_BE_CONFIRMED' || status === 'EXCEPTION_ORDER'" <ElFormItem
class="item" v-if="status === 'TO_BE_CONFIRMED' || status === 'EXCEPTION_ORDER'"
> >
<span class="item">
<ElButton type="danger" @click="cancelOrder">取消</ElButton> <ElButton type="danger" @click="cancelOrder">取消</ElButton>
</span> </span>
</ElFormItem>
<ElFormItem v-if="status === 'IN_PRODUCTION'">
<!-- <span v-if="status !== 'IN_PRODUCTION'" class="item"> <!-- <span v-if="status !== 'IN_PRODUCTION'" class="item">
<ElButton type="success" @click="handleUpdateRemark"> <ElButton type="success" @click="handleUpdateRemark">
添加内部标签 添加内部标签
</ElButton> </ElButton>
</span> --> </span> -->
<span v-if="status === 'IN_PRODUCTION'" class="item"> <span class="item">
<ElButton type="warning" @click="onFastProduction"> <ElButton type="warning" @click="onFastProduction">
快捷生产 快捷生产
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'IN_PRODUCTION'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'IN_PRODUCTION'">
<span class="item">
<ElButton type="success" @click="applyForReplenishment(undefined)"> <ElButton type="success" @click="applyForReplenishment(undefined)">
申请补胚 申请补胚
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'IN_PRODUCTION'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'IN_PRODUCTION'">
<span class="item">
<ElButton type="success" @click="productioncompleted"> <ElButton type="success" @click="productioncompleted">
生产完成 生产完成
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'WAIT_SHIPMENT'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'WAIT_SHIPMENT'">
<span class="item">
<ElButton type="warning" @click="printPodOrder"> <ElButton type="warning" @click="printPodOrder">
播种墙配货 播种墙配货
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'CREATE_LOGISTICS'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'CREATE_LOGISTICS'">
<!-- <span v-if="status === 'WAIT_SHIPMENT'" class="item">
<ElButton type="warning" @click="inspPackagOrder">
质检包装
</ElButton>
</span> -->
<span class="item">
<ElButton type="warning" @click="logisticsToPicking"> <ElButton type="warning" @click="logisticsToPicking">
转至待排单 转至待排单
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'WAIT_SHIPMENT'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'WAIT_SHIPMENT'">
<span class="item">
<ElButton type="primary" @click="completeDelivery()" <ElButton type="primary" @click="completeDelivery()"
>完成发货</ElButton >完成发货</ElButton
> >
</span> </span>
<span </ElFormItem>
v-if="status === 'WAIT_SHIPMENT' || status === 'CREATE_LOGISTICS'" <ElFormItem
class="item" v-if="status === 'WAIT_SHIPMENT' || status === 'CREATE_LOGISTICS'"
> >
<span class="item">
<ElDropdown> <ElDropdown>
<el-button type="success"> <el-button type="success">
物流接口<el-icon class="el-icon--right"><ArrowDown /></el-icon> 物流接口<el-icon class="el-icon--right"><ArrowDown /></el-icon>
...@@ -463,74 +501,89 @@ ...@@ -463,74 +501,89 @@
</template> </template>
</ElDropdown> </ElDropdown>
</span> </span>
<span v-if="status === 'STOCK_OUT'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'STOCK_OUT'">
<span class="item">
<ElButton type="warning" @click="stockOutCheck"> <ElButton type="warning" @click="stockOutCheck">
补货校验 补货校验
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'STOCK_OUT'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'STOCK_OUT'">
<span class="item">
<ElButton type="success" @click="toBePicking"> 转至生产 </ElButton> <ElButton type="success" @click="toBePicking"> 转至生产 </ElButton>
</span> </span>
<span v-if="status === 'TO_BE_ARRANGE'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'TO_BE_ARRANGE'">
<span class="item">
<ElButton type="warning" @click="arrangeFinish">排单完成</ElButton> <ElButton type="warning" @click="arrangeFinish">排单完成</ElButton>
</span> </span>
<span </ElFormItem>
v-if="status !== 'BATCH_DOWNLOAD' && status !== 'WAIT_SHIPMENT'" <ElFormItem
class="item" v-if="status !== 'BATCH_DOWNLOAD' && status !== 'WAIT_SHIPMENT'"
> >
<span class="item">
<ElButton type="primary" @click="downloadMaterial" <ElButton type="primary" @click="downloadMaterial"
>下载素材</ElButton >下载素材</ElButton
> >
</span> </span>
<span </ElFormItem>
v-if=" <ElFormItem
status === 'INTERCEPTED' && v-if="
(interceptCurrent === 1 || interceptCurrent === 4) status === 'INTERCEPTED' &&
" (interceptCurrent === 1 || interceptCurrent === 4)
class="item" "
> >
<span class="item">
<ElButton type="success" @click="interceptChange(true)"> <ElButton type="success" @click="interceptChange(true)">
拦截成功 拦截成功
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if=" <ElFormItem
status === 'INTERCEPTED' && v-if="
(interceptCurrent === 1 || interceptCurrent === 4) status === 'INTERCEPTED' &&
" (interceptCurrent === 1 || interceptCurrent === 4)
class="item" "
> >
<span class="item">
<ElButton type="danger" @click="interceptChange(false)"> <ElButton type="danger" @click="interceptChange(false)">
拦截失败 拦截失败
</ElButton> </ElButton>
</span> </span>
</ElFormItem>
<span <ElFormItem
v-if=" v-if="
status === 'TO_BE_CONFIRMED' || [
status === 'PICKING' || 'TO_BE_CONFIRMED',
status === 'STOCK_OUT' || 'PICKING',
status === 'EXCEPTION_ORDER' || 'STOCK_OUT',
status === 'TO_BE_REPLENISHMENT' || 'EXCEPTION_ORDER',
status === 'IN_PRODUCTION' || 'TO_BE_REPLENISHMENT',
status === 'TO_BE_ARRANGE' 'IN_PRODUCTION',
" 'TO_BE_ARRANGE',
class="item" 'WAIT_SHIPMENT',
> ].includes(status)
"
>
<span class="item">
<ElButton type="success" @click="refreshMaterial"> <ElButton type="success" @click="refreshMaterial">
刷新商品信息 刷新商品信息
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if=" <ElFormItem
status === 'STOCK_OUT' || v-if="
status === 'CREATE_LOGISTICS' || [
status === 'TO_BE_ARRANGE' || 'STOCK_OUT',
status === 'PICKING' || 'CREATE_LOGISTICS',
status === 'IN_PRODUCTION' 'TO_BE_ARRANGE',
" 'PICKING',
class="item" 'IN_PRODUCTION',
> ].includes(status)
"
>
<span class="item">
<ElDropdown> <ElDropdown>
<el-button type="warning"> <el-button type="warning">
驳回至<el-icon class="el-icon--right"><ArrowDown /></el-icon> 驳回至<el-icon class="el-icon--right"><ArrowDown /></el-icon>
...@@ -576,13 +629,19 @@ ...@@ -576,13 +629,19 @@
</template> </template>
</ElDropdown> </ElDropdown>
</span> </span>
<span v-if="status === 'COMPLETE'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'COMPLETE'">
<span class="item">
<ElButton type="warning" @click="statusPush">状态推送</ElButton> <ElButton type="warning" @click="statusPush">状态推送</ElButton>
</span> </span>
<span v-if="status === 'COMPLETE'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'COMPLETE'">
<span class="item">
<ElButton type="success" @click="exportData">导出</ElButton> <ElButton type="success" @click="exportData">导出</ElButton>
</span> </span>
<span v-if="status === 'BATCH_DOWNLOAD'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'BATCH_DOWNLOAD'">
<span class="item">
<ElButton type="danger" @click="handleBatchDelete('batch')" <ElButton type="danger" @click="handleBatchDelete('batch')"
>批量删除</ElButton >批量删除</ElButton
> >
...@@ -1959,6 +2018,10 @@ ...@@ -1959,6 +2018,10 @@
@set-warehouseId="handleWarehouseIdChange" @set-warehouseId="handleWarehouseIdChange"
@refresh="onFastRefresh" @refresh="onFastRefresh"
/> />
<InspPackagOrder
ref="InspPackagOrderRef"
@refresh="onFastRefresh"
></InspPackagOrder>
<ElDialog <ElDialog
v-model="productionClientVisible" v-model="productionClientVisible"
title="生产端" title="生产端"
...@@ -2316,6 +2379,7 @@ import { computed, onMounted, ref, nextTick, reactive } from 'vue' ...@@ -2316,6 +2379,7 @@ import { computed, onMounted, ref, nextTick, reactive } from 'vue'
import FastProduction from './FastProduction.vue' import FastProduction from './FastProduction.vue'
import { filePath } from '@/api/axios' import { filePath } from '@/api/axios'
import PodMakeOrder from './PodMakeOrder.vue' import PodMakeOrder from './PodMakeOrder.vue'
import InspPackagOrder from './InspPackagOrder.vue'
import { OrderData } from '@/types/api/podMakeOrder' import { OrderData } from '@/types/api/podMakeOrder'
import useLodop, { LODOPObject } from '@/utils/hooks/useLodop' import useLodop, { LODOPObject } from '@/utils/hooks/useLodop'
import dayjs from 'dayjs' import dayjs from 'dayjs'
...@@ -3827,6 +3891,16 @@ const printPodOrder = async () => { ...@@ -3827,6 +3891,16 @@ const printPodOrder = async () => {
podOrderVisible.value = true podOrderVisible.value = true
} }
const InspPackagOrderRef = ref()
// const inspPackagOrder = async () => {
// const lodop = getCLodop(null, null)
// if (!lodop) return
// sheetPrinter.value = lodop.GET_PRINTER_NAME(0)
// InspPackagOrderRef?.value.open()
// }
/** /**
* @description: 创建物流、获取跟踪号、获取打印面单、更改物流、取消物流订单 * @description: 创建物流、获取跟踪号、获取打印面单、更改物流、取消物流订单
*/ */
...@@ -4910,9 +4984,9 @@ useRouter().beforeEach((to, from, next) => { ...@@ -4910,9 +4984,9 @@ useRouter().beforeEach((to, from, next) => {
} }
} }
.item { // .item {
margin-right: 15px; // margin-right: 15px;
} // }
.tabs { .tabs {
display: flex; display: flex;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment