| | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { |
| | | createProductIssueLine, |
| | | getBomItemList, |
| | | getProductIssueLine, |
| | | updateProductIssueLine, |
| | | } from '#/api/mes/wm/productissue/line'; |
| | |
| | | const emit = defineEmits(['success']); |
| | | const formData = ref<MesWmProductIssueLineApi.ProductIssueLine>(); |
| | | const issueId = ref<number>(); |
| | | /** 当前工单 BOM 可领物料 ID 白名单(为空时选择器展示全量物料) */ |
| | | const bomItemIds = ref<number[]>([]); |
| | | |
| | | /** |
| | | * 获取当前领料单对应工单 BOM 的可领物料 ID 列表 |
| | | * 仅新增/编辑物料时查询当前订单所需物料,其他物料不展示 |
| | | */ |
| | | async function loadBomItemIds() { |
| | | if (!issueId.value) { |
| | | bomItemIds.value = []; |
| | | return; |
| | | } |
| | | try { |
| | | const bomItems = await getBomItemList(issueId.value); |
| | | bomItemIds.value = (bomItems ?? []) |
| | | .map((item) => item.itemId) |
| | | .filter((id): id is number => id != null); |
| | | } catch { |
| | | bomItemIds.value = []; |
| | | } |
| | | } |
| | | |
| | | /** 更新物料选择器的可选范围,仅展示当前工单 BOM 物料 */ |
| | | async function applyBomItemScope() { |
| | | await formApi.updateSchema([ |
| | | { |
| | | fieldName: 'itemId', |
| | | componentProps: { productIds: bomItemIds.value }, |
| | | }, |
| | | ]); |
| | | } |
| | | |
| | | const getTitle = computed(() => { |
| | | return formData.value?.id ? '编辑物料' : '添加物料'; |
| | |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | formData.value = undefined; |
| | | bomItemIds.value = []; |
| | | // 关闭时恢复选择器为不限定范围 |
| | | await applyBomItemScope(); |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ id?: number; issueId: number }>(); |
| | | issueId.value = data.issueId; |
| | | // 加载当前工单 BOM 可领物料范围 |
| | | await loadBomItemIds(); |
| | | if (!data.id) { |
| | | await formApi.resetForm(); |
| | | await applyBomItemScope(); |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | try { |
| | | formData.value = await getProductIssueLine(data.id); |
| | | // 编辑场景:若当前物料不在 BOM 范围内(历史数据),并入白名单保证可回显可选 |
| | | if ( |
| | | formData.value?.itemId != null && |
| | | !bomItemIds.value.includes(formData.value.itemId) |
| | | ) { |
| | | bomItemIds.value = [...bomItemIds.value, formData.value.itemId]; |
| | | } |
| | | await applyBomItemScope(); |
| | | await formApi.setValues(formData.value); |
| | | } finally { |
| | | modalApi.unlock(); |