liu
2026-09-02 2117eaf4a19d602b6d5a0fb5bbefa52ef8f5ff76
src/views/mes/workbench/components/tabs/ProductIssueLineFormModal.vue
@@ -11,6 +11,7 @@
import { useVbenForm } from '#/adapter/form';
import {
  createProductIssueLine,
  getBomItemList,
  getProductIssueLine,
  updateProductIssueLine,
} from '#/api/mes/wm/productissue/line';
@@ -19,6 +20,37 @@
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 ? '编辑物料' : '添加物料';
@@ -87,17 +119,31 @@
  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();