() // 当前选中的物料对象
const resolving = ref(false) // 是否正在查询回显
+let resolveSeq = 0 // 请求序号,防止异步竞态导致回显串值
-/** 显示文本:物料名称 */
+/** 显示文本:[物料编码] 物料名称 */
const displayLabel = computed(() => {
- return selectedItem.value?.name ?? ''
+ if (selectedItem.value) {
+ return `[${selectedItem.value.code}] ${selectedItem.value.name}`
+ }
+ // 父组件传入了 itemName 但尚未加载到 selectedItem 时,直接显示
+ if (props.itemName && props.modelValue != null) {
+ return props.itemName
+ }
+ return ''
})
/** 是否显示清除图标 */
@@ -91,11 +104,24 @@ const resolveItemById = async (id: number | undefined) => {
if (selectedItem.value?.id === id) {
return
}
+ // 父组件已传入 itemName 时跳过请求,避免列表批量场景的 N+1 问题
+ if (props.itemName) {
+ return
+ }
+ const seq = ++resolveSeq
resolving.value = true
try {
- selectedItem.value = await MdItemApi.getItem(id)
+ const item = await MdItemApi.getItem(id)
+ // 校验序号:丢弃过期的响应,防止快速切换时回显串值
+ if (seq !== resolveSeq) return
+ selectedItem.value = item
+ } catch (e) {
+ if (seq !== resolveSeq) return
+ console.error('[MdItemSelectV2] resolveItemById failed:', e)
} finally {
- resolving.value = false
+ if (seq === resolveSeq) {
+ resolving.value = false
+ }
}
}
diff --git a/src/views/mes/md/item/type/components/MdItemTypeTree.vue b/src/views/mes/md/item/type/components/MdItemTypeTree.vue
index 0d21ea73f..a80ace012 100644
--- a/src/views/mes/md/item/type/components/MdItemTypeTree.vue
+++ b/src/views/mes/md/item/type/components/MdItemTypeTree.vue
@@ -11,6 +11,7 @@
Expose:
loadTree() — 手动刷新分类树
clearCurrent() — 清除当前选中节点高亮
+ reset() — 重置整个树状态(清高亮 + 清搜索词)
-->
{
currentNodeId = undefined
}
-defineExpose({ loadTree, clearCurrent })
+/** 重置整个树状态(清高亮 + 清搜索词) */
+const reset = () => {
+ clearCurrent()
+ filterText.value = ''
+}
+
+defineExpose({ loadTree, clearCurrent, reset })