From 79f9124c9a574cb6266cc8bcb8a5f80aba990735 Mon Sep 17 00:00:00 2001 From: zc Date: Mon, 27 Apr 2026 16:14:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B4=E7=AE=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/fullWorkOrder/fullWorkOrder.ts | 8 +- src/apis/weightManage/ys.ts | 6 +- src/views/barcodePrint/index.vue | 6 +- src/views/fullClaim/FullWorkOrderAddModal.vue | 269 ++++++++++++++---- src/views/fullClaim/index.vue | 178 +++++++++++- src/views/weightManage/LabelPrint.vue | 4 +- src/views/weightManage/index.vue | 3 +- 7 files changed, 407 insertions(+), 67 deletions(-) diff --git a/src/apis/fullWorkOrder/fullWorkOrder.ts b/src/apis/fullWorkOrder/fullWorkOrder.ts index bd54644..fef90ec 100644 --- a/src/apis/fullWorkOrder/fullWorkOrder.ts +++ b/src/apis/fullWorkOrder/fullWorkOrder.ts @@ -7,6 +7,10 @@ export interface FullWorkOrderResp { title: string orderNo: string materialCode: string + materialName: string + batch: string + mark: string + count: number imgUrl: string createUser: string createTime: string @@ -19,8 +23,8 @@ export interface FullWorkOrderResp { export interface FullWorkOrderQuery { orderNo: string | undefined materialCode: string | undefined - imgUrl: string | undefined - createUser: string | undefined + materialName: string | undefined + batch: string | undefined createTime: Array | undefined sort: Array } diff --git a/src/apis/weightManage/ys.ts b/src/apis/weightManage/ys.ts index a2d7198..8390be9 100644 --- a/src/apis/weightManage/ys.ts +++ b/src/apis/weightManage/ys.ts @@ -2,12 +2,12 @@ import http from '@/utils/http' const BASE_URL = '/api/ys' -/** @desc 进入称重页面 */ +/** @desc 启动宇视SDK */ export function getEnterWeighPage() { return http.get(`${BASE_URL}/enter-weigh-page`) } -/** @desc 退出称重页面 */ +/** @desc 退出宇视SDK */ export function getLeaveWeighPage() { return http.get(`${BASE_URL}/leave-weigh-page`) } @@ -17,7 +17,7 @@ export function getCaptureImage(data: any) { return http.get(`${BASE_URL}/capture-image`, data) } -/** @desc 检查称重状态 */ +/** @desc 检查宇视SDK状态 */ export function getCheckStatus() { return http.get(`${BASE_URL}/status`) } diff --git a/src/views/barcodePrint/index.vue b/src/views/barcodePrint/index.vue index 8dfb25b..9d6132b 100644 --- a/src/views/barcodePrint/index.vue +++ b/src/views/barcodePrint/index.vue @@ -297,7 +297,7 @@ const generateDetailLabel = async () => { for (const workOrderInfo of formData.workOrderInfos) { // 计算二维码数据 const orderNo = formData.orderNo + workOrderInfo.id; - const qrCodeData = `10#${formData.materialName}$11#9DP$12#${formData.batch}$17#${workOrderInfo.quantity}$20#${formattedDate2}$31#${orderNo}$DY` + const qrCodeData = `10#${formData.encoding}$11#9DP$12#${formData.batch}$17#${workOrderInfo.quantity}$20#${formattedDate2}$31#${orderNo}$DY` // 生成二维码图片 const qrCodeImage = await generateQRCode(qrCodeData) @@ -353,7 +353,7 @@ const generateOverallLabel = async () => { String(now.getDate()).padStart(2, '0') // 计算二维码数据 - const qrCodeData = `10#${formData.materialName}$11#9DP$12#${formData.batch}$17#${formData.totalCount}$20#${formattedDate2}$31#${formData.orderNo}$DY` + const qrCodeData = `10#${formData.encoding}$11#9DP$12#${formData.batch}$17#${formData.totalCount}$20#${formattedDate2}$31#${formData.orderNo}$DY` // 生成二维码图片 const qrCodeImage = await generateQRCode(qrCodeData) @@ -471,7 +471,7 @@ const printLabel = async () => {
-
实重(g) 54
+
实重(g)
${item.totalWeight || ''}
diff --git a/src/views/fullClaim/FullWorkOrderAddModal.vue b/src/views/fullClaim/FullWorkOrderAddModal.vue index 63327fa..1ac3d79 100644 --- a/src/views/fullClaim/FullWorkOrderAddModal.vue +++ b/src/views/fullClaim/FullWorkOrderAddModal.vue @@ -10,35 +10,99 @@ @before-ok="save" @close="reset" > - - - - - -
- 图片 - -
- - 连接异常 - -
- -
- - 加载中... -
-
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 图片 + +
+ + 连接异常 + +
+ +
+ + 加载中... +
+
+
+
+
@@ -50,7 +114,8 @@ import { useWindowSize } from '@vueuse/core' import { addFullWorkOrder } from '@/apis/fullWorkOrder/fullWorkOrder' import {getCaptureImage, getEnterWeighPage, getLeaveWeighPage} from '@/apis/weightManage/ys' import { useResetReactive } from '@/hooks' - +import {getMaterialDetail} from "@/apis/weightManage/weightManage"; +import {number} from "echarts"; const emit = defineEmits<{ (e: 'save-success'): void }>() @@ -59,6 +124,7 @@ const { width, height } = useWindowSize() const dataId = ref('') const visible = ref(false) +const disableCount = ref(false) const materialCodeInput = ref(null) // 称重页面状态 @@ -66,16 +132,15 @@ const weighingPageStatus = ref<'idle' | 'entering' | 'entered' | 'error'>('idle' const [form, resetForm] = useResetReactive({ materialCode: '', - imgUrl: '' + imgUrl: '', + materialName: '', + batch: '', + count: undefined, + inputMaterialCode: '', + inputMaterialCode2: '', + mark: undefined, }) -const formRef = ref() -const rules: FormInstance['rules'] = { - materialCode: [ - { required: true, message: '物料编码为空' }, - ], -} - const imgData = reactive({ imgUrl: 'http://localhost:6609/file/ys/carousel.jpg', // 称重页面图片URL @@ -90,16 +155,111 @@ const reset = () => { resetForm() } +// 防抖函数 +const debounce = any>(func: T, delay: number): ((...args: Parameters) => void) => { + let timer: ReturnType | null = null + return function (...args: Parameters) { + if (timer) clearTimeout(timer) + timer = setTimeout(() => { + func(...args) + }, delay) + } +} + +// 原始的物料编码变化处理函数 +const originalHandleMaterialCodeChange = async () => { + // 确保输入框内容是完整的物料编码 + // todo + const materialCode = form.inputMaterialCode?.trim() + // const materialCode = "831002839562,1,0.12,KP,0A2005,0A200520260325"; + + // 无论是否有输入,先重置所有物料相关字段,确保新数据能完全覆盖旧数据 + form.materialCode = '' + form.materialName = '' + form.inputMaterialCode2 = '' + form.batch = '' + form.count = undefined + form.mark = undefined + + // 如果有物料编码输入,获取物料数据 + if (materialCode) { + try { + disableCount.value = true + const parts = materialCode.split(','); + form.count = parseFloat(parts[2]) * 1000; + console.log("form.count", form.count); + await fetchMaterialData(materialCode) + } catch (error) { + console.error('获取物料数据失败:', error) + // 即使获取失败,也保持字段为空,避免显示旧数据 + } + } +} + +// 带防抖的物料编码变化处理函数 +const handleMaterialCodeChange = debounce(originalHandleMaterialCodeChange, 500) // 500ms防抖延迟 + +// 扫码核验获取物料信息 +const fetchMaterialData = async (code: string) => { + const res = await getMaterialDetail(code); + if (res.code === '0') { + // 更新表单数据 + form.materialCode = res.data?.encoding || '' + form.materialName = res.data?.materialName || '' + form.batch = res.data?.batch || '' + } +} + +const handleMaterialCodeChange2 = async (code: string) => { + if (!code || code?.trim()=== '') { + form.materialCode = '' + form.materialName = '' + form.batch = '' + form.mark = undefined + form.count = undefined + return + } + disableCount.value = false + form.inputMaterialCode = '' + form.mark = undefined + form.count = undefined + const res = await getMaterialDetail(code); + if (res.code === '0') { + // 更新表单数据 + form.materialCode = res.data?.encoding || '' + form.materialName = res.data?.materialName || '' + form.batch = res.data?.batch || '' + } +}; + + + // 保存 const save = async () => { - const isInvalid = await formRef.value?.validate() - if (isInvalid) return + if (!form.materialCode) { + Message.error('未找到物料信息'); + return false + } + if (!form.count) { + Message.error('数量不能为空'); + return false + } + if (!form.batch) { + Message.error('未找到批次'); + return false + } + if (!form.mark) { + Message.error('请输入序号'); + return false + } try { //手动抓图 const data = { type: 2, } + // todo const response = await getCaptureImage(data); + // const response = {'data': 'http://localhost:6609/file/ys/carousel.jpg'}; if (response) { form.imgUrl = response.data; } else { @@ -115,24 +275,24 @@ const save = async () => { } } -// 进入称重页面 +// 启动宇视SDK const enterWeighPage = async () => { weighingPageStatus.value = 'entering' try { await getEnterWeighPage() weighingPageStatus.value = 'entered' } catch (error) { - console.error('进入称重页面失败:', error) + console.error('启动宇视SDK失败:', error) weighingPageStatus.value = 'error' } } -// 离开称重页面 +// 退出宇视SDK const leaveWeighPage = async () => { try { await getLeaveWeighPage() } catch (error) { - console.error('离开称重页面失败:', error) + console.error('退出宇视SDK失败:', error) } } @@ -141,7 +301,7 @@ const onAdd = async () => { reset() dataId.value = '' visible.value = true - // 进入称重页面 + // 启动宇视SDK await enterWeighPage() // 聚焦到物料编码输入框 nextTick(() => { @@ -172,7 +332,7 @@ const handleKeyDown = (event: KeyboardEvent) => { // 检查是否是新的扫码开始 // 当时间间隔大于300ms,且不是修饰键,且不是功能键时,认为是新的扫码开始 else if (timeDiff > 300 && !event.ctrlKey && !event.altKey && !event.metaKey) { - form.materialCode = '' + form.inputMaterialCode = '' // 标记为开始扫描 isScanning = true } @@ -193,7 +353,7 @@ onBeforeUnmount(() => { clearInterval(imageRefreshTimer) imageRefreshTimer = null } - // 离开称重页面 + // 退出宇视SDK leaveWeighPage() }) @@ -206,7 +366,7 @@ watch(visible, async (newVal) => { imgData.imgUrl = `${imgData.baseUrl}?t=${Date.now()}` }, 1500) } else { - // 当弹窗关闭时,退出称重页面并停止图片刷新 + // 当弹窗关闭时,退出宇视SDK并停止图片刷新 await leaveWeighPage() if (imageRefreshTimer) { clearInterval(imageRefreshTimer) @@ -250,4 +410,17 @@ defineExpose({ onAdd }) .video-overlay.error { background: rgba(255, 77, 79, 0.2); } + +/* 禁用输入框样式 - 黑色加粗字体 */ +:deep(.arco-input-wrapper.arco-input-disabled) { + background-color: #ffffff !important; + border-color: #d9d9d9 !important; +} + +:deep(.arco-input-wrapper.arco-input-disabled .arco-input) { + color: #000000 !important; + background-color: transparent !important; + opacity: 1 !important; + -webkit-text-fill-color: #000000 !important; +} \ No newline at end of file diff --git a/src/views/fullClaim/index.vue b/src/views/fullClaim/index.vue index a1ac35f..6cc247f 100644 --- a/src/views/fullClaim/index.vue +++ b/src/views/fullClaim/index.vue @@ -15,8 +15,8 @@