优化
This commit is contained in:
@@ -48,7 +48,7 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<a-form-item label="重量">
|
<a-form-item label="重量(g)">
|
||||||
<a-input v-model="formData.unitWeight" placeholder="Kg" disabled />
|
<a-input v-model="formData.unitWeight" placeholder="Kg" disabled />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</div>
|
</div>
|
||||||
@@ -58,8 +58,9 @@
|
|||||||
<a-form-item label="物料编码">
|
<a-form-item label="物料编码">
|
||||||
<a-input
|
<a-input
|
||||||
v-model="formData.inputMaterialCode"
|
v-model="formData.inputMaterialCode"
|
||||||
placeholder="请使用扫码枪扫描物料编码"
|
placeholder="请点击此处确保光标闪烁,并使用扫码枪扫描物料编码"
|
||||||
@change="handleMaterialCodeChange"
|
@keydown="handleKeyDown"
|
||||||
|
@input="handleMaterialCodeChange"
|
||||||
/>
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</div>
|
</div>
|
||||||
@@ -128,13 +129,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<label>计算重量:</label>
|
<label>计算重量(g):</label>
|
||||||
<a-input v-model="calculatedWeight" placeholder="-" disabled />
|
<a-input v-model="calculatedWeight" placeholder="-" disabled />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<label>对应重量:</label>
|
<label>对应重量(g):</label>
|
||||||
<a-input v-model="ahDeviceWeight" placeholder="-" disabled/>
|
<a-input v-model="ahDeviceWeight" placeholder="-" disabled/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -172,8 +173,8 @@
|
|||||||
<div class="completion-icon">
|
<div class="completion-icon">
|
||||||
<a-icon type="check-circle" :size="64" style="color: #52c41a;" />
|
<a-icon type="check-circle" :size="64" style="color: #52c41a;" />
|
||||||
</div>
|
</div>
|
||||||
<h2>{{ workOrderResp.matchResult === '1' ? '创建成功' : '创建失败' }}</h2>
|
<h2>{{ workOrderResp.matchResult === 'success' ? '创建成功' : '创建失败' }}</h2>
|
||||||
<p>{{ workOrderResp.matchResult === '1' ? '任务已成功创建' : '任务创建失败' }},以下是任务详情:</p>
|
<p>{{ workOrderResp.matchResult === 'success' ? '任务创建成功' : '任务创建失败' }},以下是任务详情:</p>
|
||||||
<div class="completion-info">
|
<div class="completion-info">
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="label">任务工单号:</span>
|
<span class="label">任务工单号:</span>
|
||||||
@@ -181,19 +182,23 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="label">物料名称:</span>
|
<span class="label">物料名称:</span>
|
||||||
<span class="value">{{ workOrderResp.materialName }}</span>
|
<span class="value">{{ formData.materialName }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="label">物料编码:</span>
|
<span class="label">物料编码:</span>
|
||||||
<span class="value">{{ workOrderResp.encoding }}</span>
|
<span class="value">{{ formData.encoding }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="label">物料规格:</span>
|
<span class="label">物料规格:</span>
|
||||||
<span class="value">{{ workOrderResp.materialSpec }}</span>
|
<span class="value">{{ formData.materialSpec }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="label">重量:</span>
|
<span class="label">物料总个数:</span>
|
||||||
<span class="value">{{ workOrderResp.unitWeight }}</span>
|
<span class="value">{{ workOrderResp.totalCount }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-item">
|
||||||
|
<span class="label">物料总重量(g):</span>
|
||||||
|
<span class="value">{{ workOrderResp.totalWeight }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="completion-actions">
|
<div class="completion-actions">
|
||||||
@@ -260,7 +265,7 @@ const workOrderResp = ref<WorkOrderResp>({
|
|||||||
totalCount: '',
|
totalCount: '',
|
||||||
createUserString: '',
|
createUserString: '',
|
||||||
updateUserString: '',
|
updateUserString: '',
|
||||||
matchResult: ''
|
matchResult: 'failed'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@@ -293,13 +298,13 @@ const columns = [
|
|||||||
className: 'green-bg'
|
className: 'green-bg'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '重量',
|
title: '重量(g)',
|
||||||
dataIndex: 'weight',
|
dataIndex: 'weight',
|
||||||
key: 'weight',
|
key: 'weight',
|
||||||
className: 'green-bg'
|
className: 'green-bg'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '计算重量',
|
title: '计算重量(g)',
|
||||||
dataIndex: 'calculatedWeight',
|
dataIndex: 'calculatedWeight',
|
||||||
key: 'calculatedWeight',
|
key: 'calculatedWeight',
|
||||||
className: 'green-bg'
|
className: 'green-bg'
|
||||||
@@ -320,24 +325,67 @@ const columns = [
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 处理物料编码变化
|
// 防抖函数
|
||||||
const handleMaterialCodeChange = async () => {
|
const debounce = <T extends (...args: any[]) => any>(func: T, delay: number): ((...args: Parameters<T>) => void) => {
|
||||||
if (formData.inputMaterialCode) {
|
let timer: ReturnType<typeof setTimeout> | null = null;
|
||||||
|
return function(...args: Parameters<T>) {
|
||||||
|
if (timer) clearTimeout(timer);
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
func(...args);
|
||||||
|
}, delay);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// 原始的物料编码变化处理函数
|
||||||
|
const originalHandleMaterialCodeChange = async () => {
|
||||||
|
// 确保输入框内容是完整的物料编码
|
||||||
|
const materialCode = formData.inputMaterialCode?.trim();
|
||||||
|
|
||||||
|
// 无论是否有输入,先重置所有物料相关字段,确保新数据能完全覆盖旧数据
|
||||||
|
formData.encoding = "";
|
||||||
|
formData.materialName = "";
|
||||||
|
formData.materialSpec = "";
|
||||||
|
formData.unitWeight = 0;
|
||||||
|
formData.photoUrl = "";
|
||||||
|
formData.matchResult = "";
|
||||||
|
|
||||||
|
// 如果有物料编码输入,获取物料数据
|
||||||
|
if (materialCode) {
|
||||||
try {
|
try {
|
||||||
await fetchMaterialData(formData.inputMaterialCode)
|
await fetchMaterialData(materialCode)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取物料数据失败:', error)
|
console.error('获取物料数据失败:', error)
|
||||||
|
// 即使获取失败,也保持字段为空,避免显示旧数据
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
formData.encoding = "";
|
|
||||||
formData.materialName = "";
|
|
||||||
formData.materialSpec = "";
|
|
||||||
formData.unitWeight = 0;
|
|
||||||
formData.photoUrl = "";
|
|
||||||
formData.matchResult = "";
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 记录上次输入时间,用于判断是否是扫码枪输入
|
||||||
|
let lastInputTime = 0;
|
||||||
|
// 记录输入内容,用于判断是否是新的扫码
|
||||||
|
let previousInput = '';
|
||||||
|
|
||||||
|
// 处理键盘按下事件
|
||||||
|
const handleKeyDown = (event: KeyboardEvent) => {
|
||||||
|
// 获取当前时间
|
||||||
|
const currentTime = Date.now();
|
||||||
|
|
||||||
|
// 如果输入速度非常快(小于100ms),认为是扫码枪输入
|
||||||
|
if (currentTime - lastInputTime < 100 && formData.inputMaterialCode) {
|
||||||
|
// 扫码枪通常会以回车键结束,这里不做处理
|
||||||
|
} else if (event.key.length === 1 && !event.ctrlKey && !event.altKey) {
|
||||||
|
// 如果是新的输入(不是快速连续输入),清空输入框
|
||||||
|
// 这样可以确保每次扫码都从空输入框开始
|
||||||
|
formData.inputMaterialCode = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新上次输入时间
|
||||||
|
lastInputTime = currentTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 带防抖的物料编码变化处理函数
|
||||||
|
const handleMaterialCodeChange = debounce(originalHandleMaterialCodeChange, 500); // 500ms防抖延迟
|
||||||
|
|
||||||
// 扫码核验获取物料信息
|
// 扫码核验获取物料信息
|
||||||
const fetchMaterialData = async (code: string) => {
|
const fetchMaterialData = async (code: string) => {
|
||||||
getMaterialDetail(code).then(res => {
|
getMaterialDetail(code).then(res => {
|
||||||
@@ -351,7 +399,7 @@ const fetchMaterialData = async (code: string) => {
|
|||||||
formData.photoUrl = res.data?.photoUrl || "";
|
formData.photoUrl = res.data?.photoUrl || "";
|
||||||
// 假设后端返回比对结果
|
// 假设后端返回比对结果
|
||||||
// formData.matchResult = res.data.matchResult || 'failed' // 这里根据实际接口返回调整
|
// formData.matchResult = res.data.matchResult || 'failed' // 这里根据实际接口返回调整
|
||||||
formData.matchResult = res.data.matchResult || 'success' // 这里根据实际接口返回调整
|
formData.matchResult = res.data?.matchResult || 'success' // 这里根据实际接口返回调整
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -373,26 +421,26 @@ const handleNext = async () => {
|
|||||||
materialName: formData.materialName,
|
materialName: formData.materialName,
|
||||||
workOrderInfos: weighingList.value
|
workOrderInfos: weighingList.value
|
||||||
}
|
}
|
||||||
|
|
||||||
// 调用后端接口
|
// 调用后端接口
|
||||||
addWorkOrder(workOrderData).then(res => {
|
addWorkOrder(workOrderData).then(res => {
|
||||||
if (res.code == '0') {
|
if (res.code == '0') {
|
||||||
Notification.success({
|
Notification.success({
|
||||||
title: '操作成功',
|
title: '操作成功',
|
||||||
content: `操作成功!`
|
content: `工单创建成功!`
|
||||||
})
|
})
|
||||||
workOrderResp.value = res.data || {}
|
workOrderResp.value.matchResult = 'success';
|
||||||
|
workOrderResp.value.title = res.data?.title || "";
|
||||||
|
workOrderResp.value.orderNo = res.data?.orderNo || "";
|
||||||
|
workOrderResp.value.totalWeight = res.data?.totalWeight || "";
|
||||||
|
workOrderResp.value.totalCount = res.data?.totalCount || "";
|
||||||
|
|
||||||
|
// 关闭WebSocket连接
|
||||||
|
closeWebSocket()
|
||||||
|
// 跳转到完成页面
|
||||||
|
activeStep.value++
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 关闭WebSocket连接
|
|
||||||
closeWebSocket()
|
|
||||||
|
|
||||||
// 跳转到完成页面
|
|
||||||
activeStep.value++
|
|
||||||
|
|
||||||
Message.success('工作订单创建成功')
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('创建工作订单失败:', error)
|
console.error('创建工作订单失败:', error)
|
||||||
Message.error('创建工作订单失败')
|
Message.error('创建工作订单失败')
|
||||||
@@ -444,6 +492,12 @@ const calculateWeight = () => {
|
|||||||
|
|
||||||
// 处理确定
|
// 处理确定
|
||||||
const handleConfirm = () => {
|
const handleConfirm = () => {
|
||||||
|
// 校验输入数量是否为空
|
||||||
|
if (!inputQuantity.value || inputQuantity.value.trim() === '') {
|
||||||
|
Message.error('请输入数量')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// 生成新的列表数据
|
// 生成新的列表数据
|
||||||
const newItem = {
|
const newItem = {
|
||||||
key: (weighingList.value.length + 1).toString(),
|
key: (weighingList.value.length + 1).toString(),
|
||||||
@@ -505,7 +559,6 @@ const establishWebSocket = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ws.value.onclose = () => {
|
ws.value.onclose = () => {
|
||||||
Message.success('已和电子秤断开连接')
|
|
||||||
wsConnected.value = false
|
wsConnected.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -526,7 +579,6 @@ const closeWebSocket = () => {
|
|||||||
ws.value.close()
|
ws.value.close()
|
||||||
ws.value = null
|
ws.value = null
|
||||||
wsConnected.value = false
|
wsConnected.value = false
|
||||||
console.log('WebSocket连接已关闭')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user