liu
2026-09-02 2117eaf4a19d602b6d5a0fb5bbefa52ef8f5ff76
feat(mes): 工作台领料新增物料仅展示当前工单 BOM 物料

- line API 新增 getBomItemList(issueId) 获取当前工单 BOM 物料
- 添加/编辑物料弹窗限定物料选择范围为当前工单 BOM 物料
- 物料选择弹窗白名单场景每页条数修正为后端上限 200

Co-Authored-By: Claude <noreply@anthropic.com>
已修改3个文件
67 ■■■■■ 文件已修改
src/api/mes/wm/productissue/line/index.ts 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/md/item/components/select-dialog.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/workbench/components/tabs/ProductIssueLineFormModal.vue 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/wm/productissue/line/index.ts
@@ -17,6 +17,16 @@
    batchId?: number; // 批次编号
    remark?: string; // 备注
  }
  /** 领料出库单可领物料(当前工单 BOM 物料) */
  export interface BomItem {
    itemId?: number; // 物料编号
    itemCode?: string; // 物料编码
    itemName?: string; // 物料名称
    itemSpecification?: string; // 规格型号
    unitMeasureName?: string; // 单位名称
    requiredQuantity?: number; // 工单 BOM 需求量
  }
}
/** 查询领料出库单行分页 */
@@ -51,3 +61,11 @@
export function deleteProductIssueLine(id: number) {
  return requestClient.delete(`/mes/wm/product-issue-line/delete?id=${id}`);
}
/** 查询领料出库单可领物料列表(当前工单 BOM 物料) */
export function getBomItemList(issueId: number) {
  return requestClient.get<MesWmProductIssueLineApi.BomItem[]>(
    '/mes/wm/product-issue-line/bom-item-list',
    { params: { issueId } },
  );
}
src/views/mes/md/item/components/select-dialog.vue
@@ -140,7 +140,8 @@
            };
            // 限定可选物料范围
            if (productIds.value.length > 0) {
              params.pageSize = 1000;
              // 后端分页每页条数上限为 200,白名单场景一次拉取尽量多的可选物料
              params.pageSize = 200;
              params.ids = productIds.value.join(',');
            }
            const result = await getItemPage(params as never);
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();