云
2026-10-27 7457271638984423ac3b6c2fd136f8c0fe970d40
feat(mes):盘号字段支持 添加和报工时间功能

- 在多个数据表单中添加 reelNo 盘号字段显示和编辑功能
- 为批量报工和快速报工功能添加报工时间选择器
- 更新 API 接口定义以支持 reelNo 和 feedbackTime 字段
- 修改 MPS 批量下发逻辑为逐条下发并显示结果反馈
- 移除不再使用的 checkFlag 相关逻辑和依赖
- 在销售订单明细中添加盘号输入和打印显示功能
- 更新生产反馈表单的质检流程逻辑
已修改27个文件
201 ■■■■■ 文件已修改
src/api/erp/sale/order/index.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/pro/feedback/index.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/pro/mps/index.ts 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/pro/workorder/index.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/qc/ipqc/index.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/qc/oqc/index.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/qc/pendinginspect/index.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/wm/materialstock/index.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/wm/productproduce/line/index.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/wls/materialstock/index.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/erp/sale/order/data.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/erp/sale/order/modules/item-form.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/erp/sale/order/modules/print.vue 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/feedback/data.ts 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/feedback/modules/batch-feedback.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/feedback/modules/form.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/feedback/modules/product-produce-list.vue 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/mps/data.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/mps/index.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/mps/modules/form.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/workorder-center/modules/quick-feedback.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/workorder/data.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/ipqc/data.ts 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/oqc/data.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/qc/pendinginspect/data.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/materialstock/components/select.vue 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/materialstock/data.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/erp/sale/order/index.ts
@@ -45,6 +45,7 @@
    seq?: number; // 前端行号
    orderId?: number; // 采购订单编号
    productId?: number; // 产品编号
    reelNo?: string; // 手工录入的盘号
    productName?: string; // 产品名称
    productBarCode?: string; // 产品条码
    productUnitId?: number; // 产品单位编号
src/api/mes/pro/feedback/index.ts
@@ -36,6 +36,7 @@
    checkFlag?: boolean; // 是否需要检验
    workOrderId?: number; // 生产订单编号
    workOrderCode?: string; // 订单编码
    reelNo?: string; // 销售明细盘号
    workOrderName?: string; // 订单名称
    taskId?: number; // 生产任务编号
    taskCode?: string; // 任务编码
@@ -178,6 +179,7 @@
  taskId: number;
  paramValues?: MesProFeedbackApi.ParamValue[];
  feedbackQuantity: number;
  feedbackTime?: string;
  remark?: string;
}
@@ -194,6 +196,7 @@
export interface BatchCreateReq {
  taskIds: number[];
  feedbackQuantity: number;
  feedbackTime?: string;
  remark?: string;
}
src/api/mes/pro/mps/index.ts
@@ -12,6 +12,7 @@
    saleOrderNo?: string; // 销售订单号
    saleOrderItemId?: number; // 销售订单明细ID
    productId?: number; // 产品ID
    reelNo?: string; // 销售明细盘号
    productCode?: string; // 产品编码
    productName?: string; // 产品名称
    productSpecification?: string; // 规格型号
@@ -29,6 +30,12 @@
    mergeBatchNo?: string; // 合并批次号
    remark?: string; // 备注
    createTime?: number; // 创建时间
  }
  export interface BatchIssueResult {
    mpsId: number;
    workOrderId?: number;
    error?: string;
  }
  /** MPS 分页查询参数 */
@@ -95,9 +102,9 @@
  return requestClient.post(`/mes/pro-mps/issue?id=${id}`);
}
/** 合并下发 MPS */
export function mergeIssueMps(ids: number[]) {
  return requestClient.post('/mes/pro-mps/merge-issue', ids);
/** 批量逐条下发,每个计划分别返回结果。 */
export function batchIssueMps(ids: number[]) {
  return requestClient.post<MesProMpsApi.BatchIssueResult[]>('/mes/pro-mps/batch-issue', ids);
}
/** 取消 MPS */
src/api/mes/pro/workorder/index.ts
@@ -12,6 +12,7 @@
    orderSourceType?: number; // 来源类型
    orderSourceCode?: string; // 来源单据编号
    productId?: number; // 产品编号
    reelNo?: string; // 销售明细盘号
    productName?: string; // 产品名称
    productCode?: string; // 产品编码
    itemCode?: string; // 产品编码(物料编码)
src/api/mes/qc/ipqc/index.ts
@@ -17,6 +17,7 @@
    sourceLineId?: number; // 来源单据行 ID
    sourceDocCode?: string; // 来源单据编号(关联查询)
    workOrderId?: number; // 生产订单 ID
    reelNo?: string; // 销售明细盘号
    workOrderCode?: string; // 订单编号(关联查询)
    workOrderName?: string; // 订单名称(关联查询)
    taskId?: number; // 生产任务 ID
src/api/mes/qc/oqc/index.ts
@@ -15,6 +15,7 @@
    sourceDocId?: number; // 来源单据 ID
    sourceLineId?: number; // 来源单据行 ID
    sourceDocCode?: string; // 来源单据编号(关联查询)
    reelNo?: string; // 销售明细盘号
    clientId?: number; // 客户 ID
    clientNickname?: string; // 客户简称(关联查询)
    batchCode?: string; // 批次号
src/api/mes/qc/pendinginspect/index.ts
@@ -21,6 +21,7 @@
    vendorName?: string; // 供应商名称
    // 订单/工作站/任务(IPQC/RQC 场景)
    workOrderId?: number; // 生产订单 ID
    reelNo?: string; // 销售明细盘号
    workstationId?: number; // 工作站 ID
    workstationName?: string; // 工作站名称
    taskId?: number; // 生产任务 ID
src/api/mes/wm/materialstock/index.ts
@@ -14,6 +14,7 @@
    unitMeasureName?: string; // 计量单位名称
    batchId?: number; // 批次编号
    batchCode?: string; // 批次号
    reelNo?: string; // 生产追溯盘号
    warehouseId?: number; // 仓库编号
    warehouseCode?: string; // 仓库编码
    warehouseName?: string; // 仓库名称
src/api/mes/wm/productproduce/line/index.ts
@@ -15,6 +15,7 @@
    unitMeasureName?: string; // 单位
    quantity?: number; // 产出数量
    batchCode?: string; // 批次号
    reelNo?: string; // 销售明细盘号
    qualityStatus?: number; // 质量状态
    locationId?: number; // 库位编号
    locationName?: string; // 库位名称
src/api/wls/materialstock/index.ts
@@ -14,6 +14,7 @@
    unitMeasureName?: string; // 计量单位名称
    batchId?: number; // 批次编号
    batchCode?: string; // 批次号
    reelNo?: string; // 生产追溯盘号
    warehouseId?: number; // 仓库编号
    warehouseCode?: string; // 仓库编码
    warehouseName?: string; // 仓库名称
src/views/erp/sale/order/data.ts
@@ -220,6 +220,12 @@
      slots: { default: 'productId' },
    },
    {
      field: 'reelNo',
      title: '盘号',
      minWidth: 150,
      slots: { default: 'reelNo' },
    },
    {
      field: 'productSpecification',
      title: '规格型号',
      minWidth: 120,
src/views/erp/sale/order/modules/item-form.vue
@@ -125,6 +125,7 @@
  const newRow = {
    id: undefined,
    productId: undefined,
    reelNo: undefined,
    productUnitName: undefined,
    productPrice: undefined,
    stockCount: undefined,
@@ -238,6 +239,16 @@
      />
      <span v-else>{{ row.productName || '-' }}</span>
    </template>
    <template #reelNo="{ row }">
      <Input
        v-if="!disabled"
        v-model:value="row.reelNo"
        :maxlength="128"
        placeholder="手工填写盘号"
        @change="handleRowChange(row)"
      />
      <span v-else>{{ row.reelNo || '-' }}</span>
    </template>
    <template #needProduction="{ row }">
      <Select
        v-if="!disabled"
src/views/erp/sale/order/modules/print.vue
@@ -301,6 +301,7 @@
              <div v-if="item.productSpecification" class="text-xs">
                {{ item.productSpecification }}
              </div>
              <div v-if="item.reelNo" class="text-xs">盘号:{{ item.reelNo }}</div>
            </td>
            <td class="border border-solid border-[#dcdfe6] p-2 text-center">
              {{ item.productUnitName || '-' }}
src/views/mes/pro/feedback/data.ts
@@ -17,7 +17,6 @@
import { Button } from 'ant-design-vue';
import { generateAutoCode } from '#/api/mes/md/autocode/record';
import { getRouteProcessByRouteAndProcess } from '#/api/mes/pro/route/process';
import { getSimpleUserList } from '#/api/system/user';
import { loadParamDetails } from './param-state';
@@ -138,11 +137,14 @@
    { field: 'workstationName', title: '工作站', width: 120 },
    { field: 'processName', title: '工序', width: 100 },
    { field: 'workOrderCode', title: '生产订单编码', width: 160 },
    { field: 'reelNo', title: '盘号', minWidth: 120 },
    { field: 'itemCode', title: '产品物料编码', width: 120 },
    { field: 'itemName', title: '产品物料名称', minWidth: 140 },
    { field: 'itemSpecification', title: '规格型号', width: 120 },
    { field: 'unitMeasureName', title: '单位', width: 80 },
    { field: 'feedbackQuantity', title: '报工数量', width: 100 },
    { field: 'qualifiedQuantity', title: '质检合格数量', width: 120 },
    { field: 'unqualifiedQuantity', title: '质检不合格数量', width: 130 },
    { field: 'feedbackUserNickname', title: '报工人', width: 100 },
    {
      field: 'feedbackTime',
@@ -176,7 +178,7 @@
 * - submit / approve / detail:主体字段只读
 *
 * 报工只填写"报工数量";合格品/不良品数量由质检确定,报工环节不采集。
 * 质检工序报工后进入待检验(uncheckQuantity = 报工数量),非质检工序直接完结。
 * 报工审批后产出均待检验,合格品经检验后入库。
 */
export function useFormSchema(
  formType: FormType,
@@ -188,12 +190,6 @@
      fieldName: 'id',
      component: 'Input',
      dependencies: { triggerFields: [''], show: () => false },
    },
    {
      fieldName: 'checkFlag',
      component: 'Input',
      dependencies: { triggerFields: [''], show: () => false },
      defaultValue: true,
    },
    {
      fieldName: 'routeId',
@@ -256,7 +252,6 @@
        // 订单变更:清空任务及任务带出的产品信息、数量区域控制位
        onChange: async () => {
          await formApi?.setValues({
            checkFlag: true,
            itemCode: undefined,
            itemId: undefined,
            itemName: undefined,
@@ -286,7 +281,7 @@
          workstationId: values.workstationId,
        }),
      },
      // 任务变更:自动填充关联字段、产品信息、checkFlag,并加载任务绑定的工艺参数
      // 任务变更:自动填充关联字段、产品信息,并加载任务绑定的工艺参数
      componentProps: {
        onChange: async (task?: MesProTaskApi.Task) => {
          await loadParamDetails(task?.id);
@@ -304,21 +299,6 @@
            workstationId: task.workstationId,
            reportableQuantity: task.reportableQuantity,
          });
          // 工艺路线工序的 checkFlag 决定数量区域展示
          if (task.routeId && task.processId) {
            try {
              const routeProcess = await getRouteProcessByRouteAndProcess(
                task.routeId,
                task.processId,
              );
              await formApi?.setFieldValue(
                'checkFlag',
                routeProcess?.checkFlag ?? false,
              );
            } catch {
              await formApi?.setFieldValue('checkFlag', true);
            }
          }
        },
      },
      rules: 'selectRequired',
src/views/mes/pro/feedback/modules/batch-feedback.vue
@@ -6,6 +6,7 @@
import { useVbenModal } from '@vben/common-ui';
import { Button, message, Tag } from 'ant-design-vue';
import dayjs from 'dayjs';
import { batchCreateFeedback } from '#/api/mes/pro/feedback';
import ProTaskSelectDialog from '#/views/mes/pro/task/components/select-dialog.vue';
@@ -24,6 +25,7 @@
      selectedTasks.value = [];
      formData.value = {
        feedbackQuantity: undefined,
        feedbackTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
        remark: '',
      };
    }
@@ -34,6 +36,7 @@
const selectedTasks = ref<MesProTaskApi.Task[]>([]);
const formData = ref({
  feedbackQuantity: undefined as number | undefined,
  feedbackTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  remark: '',
});
const submitting = ref(false);
@@ -64,6 +67,7 @@
    const result = await batchCreateFeedback({
      taskIds: selectedTasks.value.map((t) => t.id!),
      feedbackQuantity: formData.value.feedbackQuantity,
      feedbackTime: formData.value.feedbackTime || undefined,
      remark: formData.value.remark || undefined,
    });
    if (result.failCount) {
@@ -110,6 +114,14 @@
          class="!w-full"
        />
      </a-form-item>
      <a-form-item label="报工时间">
        <a-date-picker
          v-model:value="formData.feedbackTime"
          show-time
          value-format="YYYY-MM-DD HH:mm:ss"
          class="!w-full"
        />
      </a-form-item>
      <a-form-item label="备注">
        <a-textarea
          v-model:value="formData.remark"
src/views/mes/pro/feedback/modules/form.vue
@@ -24,7 +24,6 @@
  submitFeedback,
  updateFeedback,
} from '#/api/mes/pro/feedback';
import { getRouteProcessByRouteAndProcess } from '#/api/mes/pro/route/process';
import { getWorkOrder } from '#/api/mes/pro/workorder';
import { $t } from '#/locales';
@@ -89,7 +88,7 @@
/** 提交前对齐数量:报工只填写报工数量,合格/不良/废品数量由质检确定,报工环节不采集 */
function alignQuantity(data: MesProFeedbackApi.Feedback) {
  data.uncheckQuantity = data.checkFlag ? data.feedbackQuantity : 0;
  data.uncheckQuantity = data.feedbackQuantity;
  delete data.qualifiedQuantity;
  delete data.unqualifiedQuantity;
  delete data.laborScrapQuantity;
@@ -292,22 +291,6 @@
  }
}
/** 加载工序的 checkFlag 用于回显数量区域 */
async function resolveCheckFlag(routeId?: number, processId?: number) {
  if (!routeId || !processId) {
    return true;
  }
  try {
    const routeProcess = await getRouteProcessByRouteAndProcess(
      routeId,
      processId,
    );
    return routeProcess?.checkFlag ?? false;
  } catch {
    return true;
  }
}
const [Modal, modalApi] = useVbenModal({
  async onConfirm() {
    if (formType.value === 'detail' || formType.value === 'approve') {
@@ -357,12 +340,8 @@
    try {
      formData.value = await getFeedback(data.id);
      await loadParamDetails(formData.value.taskId);
      const checkFlag = await resolveCheckFlag(
        formData.value.routeId,
        formData.value.processId,
      );
      // 设置到 values
      await formApi.setValues({ ...formData.value, checkFlag });
      await formApi.setValues({ ...formData.value });
      // 记录初始快照(含数量对齐结果),submit 时用于跳过无变更的保存请求
      originalSnapshot.value = JSON.stringify(await getAlignedData());
    } finally {
src/views/mes/pro/feedback/modules/product-produce-list.vue
@@ -22,6 +22,7 @@
      { field: 'quantity', title: '产出数量', minWidth: 100 },
      { field: 'unitMeasureName', title: '单位', minWidth: 80 },
      { field: 'batchCode', title: '批次号', minWidth: 120 },
      { field: 'reelNo', title: '盘号', minWidth: 120 },
      {
        field: 'qualityStatus',
        title: '质量状态',
src/views/mes/pro/mps/data.ts
@@ -219,6 +219,7 @@
      title: '销售订单号',
      width: 180,
    },
    { field: 'reelNo', title: '盘号', minWidth: 120 },
    {
      field: 'productCode',
      title: '产品编码',
src/views/mes/pro/mps/index.vue
@@ -8,7 +8,7 @@
import { Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
import { Button, message, Tag } from 'ant-design-vue';
import { Button, message, Modal, Tag } from 'ant-design-vue';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {
@@ -17,7 +17,7 @@
  exportMps,
  getMpsPage,
  issueMps,
  mergeIssueMps,
  batchIssueMps,
} from '#/api/mes/pro/mps';
import { $t } from '#/locales';
@@ -95,35 +95,35 @@
  }
}
/** 合并下发 */
async function handleMergeIssue() {
  if (checkedIds.value.length < 2) {
    message.warning('请至少选择2条记录');
    return;
  }
  // 校验:相同产品、草稿状态
  const firstRow = checkedRows.value[0];
  const isSameProduct = checkedRows.value.every(
    (row) => row.productId === firstRow.productId,
  );
  if (!isSameProduct) {
    message.error('只能选择相同产品的MPS进行合并下发');
/** 批量逐条下发,每条计划生成独立工单。 */
async function handleBatchIssue() {
  if (checkedIds.value.length === 0) {
    message.warning('请至少选择一条记录');
    return;
  }
  const isAllDraft = checkedRows.value.every(
    (row) => row.status === MpsStatusEnum.DRAFT,
  );
  if (!isAllDraft) {
    message.error('只能选择草稿状态的MPS进行合并下发');
    message.error('请选择草稿状态的生产计划');
    return;
  }
  const hideLoading = message.loading({
    content: '合并下发中...',
    content: '批量下发中...',
    duration: 0,
  });
  try {
    await mergeIssueMps(checkedIds.value);
    message.success('合并下发成功');
    const results = await batchIssueMps(checkedIds.value);
    const failures = results.filter((item) => item.error);
    if (failures.length) {
      const names = new Map(checkedRows.value.map((row) => [row.id, row.code]));
      Modal.warning({
        title: `成功 ${results.length - failures.length} 条,失败 ${failures.length} 条`,
        content: failures.map((item) => `${names.get(item.mpsId) || item.mpsId}:${item.error}`).join(';'),
      });
    } else {
      message.success(`已下发 ${results.length} 条生产计划`);
    }
    handleRefresh();
  } finally {
    hideLoading();
@@ -222,14 +222,14 @@
              onClick: handleExport,
            },
            {
              label: '合并下发',
              label: '批量下发',
              type: 'primary',
              disabled: isEmpty(checkedIds) || checkedIds.length < 2,
              disabled: isEmpty(checkedIds),
              icon: ACTION_ICON.AUDIT,
              auth: ['mes:pro-mps:merge-issue'],
              auth: ['mes:pro-mps:issue'],
              popConfirm: {
                title: '确认合并下发选中的MPS吗?',
                confirm: handleMergeIssue,
                title: '确认逐条下发选中的生产计划吗?每条计划将生成独立工单。',
                confirm: handleBatchIssue,
              },
            },
          ]"
@@ -267,7 +267,6 @@
              label: $t('common.detail'),
              type: 'link',
              icon: ACTION_ICON.VIEW,
              auth: ['mes:pro-mps:query'],
              onClick: handleDetail.bind(null, row),
            },
            {
src/views/mes/pro/mps/modules/form.vue
@@ -126,6 +126,9 @@
        <Descriptions.Item label="销售订单明细ID">
          {{ formData.saleOrderItemId }}
        </Descriptions.Item>
        <Descriptions.Item label="盘号">
          {{ formData.reelNo || '-' }}
        </Descriptions.Item>
        <Descriptions.Item label="产品编码">
          {{ formData.productCode }}
        </Descriptions.Item>
src/views/mes/pro/workorder-center/modules/quick-feedback.vue
@@ -7,6 +7,7 @@
import { useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import dayjs from 'dayjs';
import { quickCreateFeedback } from '#/api/mes/pro/feedback';
import {
@@ -39,6 +40,7 @@
      selectedTask.value = undefined;
      formData.value = {
        feedbackQuantity: undefined,
        feedbackTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
        remark: '',
      };
      // 预设任务时加载其工艺参数;否则等待选择任务后再加载
@@ -56,6 +58,7 @@
const selectedTask = ref<MesProTaskApi.Task>();
const formData = ref({
  feedbackQuantity: undefined as number | undefined,
  feedbackTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  remark: '',
});
const submitting = ref(false);
@@ -94,6 +97,7 @@
    await quickCreateFeedback({
      taskId,
      feedbackQuantity: formData.value.feedbackQuantity,
      feedbackTime: formData.value.feedbackTime || undefined,
      paramValues: paramDetails.value.map((detail) => ({
        detailId: detail.id,
        value: detail.paramValue,
@@ -131,12 +135,19 @@
        <a-input-number
          v-model:value="formData.feedbackQuantity"
          :min="0.01"
          :max="pendingQuantity || undefined"
          :precision="2"
          placeholder="请输入报工数量"
          class="!w-full"
        />
      </a-form-item>
      <a-form-item label="报工时间">
        <a-date-picker
          v-model:value="formData.feedbackTime"
          show-time
          value-format="YYYY-MM-DD HH:mm:ss"
          class="!w-full"
        />
      </a-form-item>
      <div v-if="paramDetails.length" class="mb-4">
        <div class="mb-1 font-medium">工艺参数</div>
        <div
src/views/mes/pro/workorder/data.ts
@@ -424,6 +424,7 @@
      title: '来源单据编号',
      width: 140,
    },
    { field: 'reelNo', title: '盘号', minWidth: 120 },
    {
      field: 'productCode',
      title: '产品编码',
@@ -584,6 +585,7 @@
      title: '订单编号',
      width: 140,
    },
    { field: 'reelNo', title: '盘号', minWidth: 120 },
    {
      field: 'productCode',
      title: '产品编号',
src/views/mes/qc/ipqc/data.ts
@@ -8,7 +8,6 @@
import {
  DICT_TYPE,
  MesAutoCodeRuleCode,
  MesProTaskStatusEnum,
} from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
@@ -191,14 +190,12 @@
      component: markRaw(ProTaskSelect),
      componentProps: {
        placeholder: '请选择生产任务',
        statuses: [MesProTaskStatusEnum.PREPARE],
      },
      dependencies: {
        triggerFields: ['sourceDocId', 'workOrderId', 'workstationId'],
        componentProps: (values) => ({
          disabled: !!values.sourceDocId || !values.workOrderId,
          placeholder: '请选择生产任务',
          statuses: [MesProTaskStatusEnum.PREPARE],
          workOrderId: values.workOrderId,
          workstationId: values.workstationId,
        }),
@@ -489,6 +486,7 @@
      title: '生产订单编号',
      width: 140,
    },
    { field: 'reelNo', title: '盘号', minWidth: 120 },
    {
      field: 'itemCode',
      title: '产品物料编码',
src/views/mes/qc/oqc/data.ts
@@ -189,6 +189,20 @@
      },
    },
    {
      fieldName: 'reelNo',
      label: '盘号',
      component: 'Input',
      componentProps: { maxlength: 128, placeholder: '请输入盘号' },
      dependencies: {
        triggerFields: ['sourceDocId'],
        componentProps: (values) => ({
          disabled: !!values.sourceDocId,
          maxlength: 128,
          placeholder: values.sourceDocId ? '保存后从销售明细带入' : '请输入盘号',
        }),
      },
    },
    {
      fieldName: 'outQuantity',
      label: '发货数量',
      component: 'InputNumber',
@@ -422,6 +436,7 @@
      title: '批次号',
      width: 130,
    },
    { field: 'reelNo', title: '盘号', minWidth: 120 },
    {
      field: 'itemCode',
      title: '产品物料编码',
src/views/mes/qc/pendinginspect/data.ts
@@ -59,6 +59,7 @@
      title: '来源单据编号',
      width: 160,
    },
    { field: 'reelNo', title: '盘号', minWidth: 120 },
    {
      field: 'qcType',
      title: '检验类型',
src/views/wls/materialstock/components/select.vue
@@ -128,6 +128,7 @@
        <div v-if="selectedItem" class="leading-6">
          <div>物料:{{ selectedItem.itemName || '-' }}</div>
          <div>批次:{{ selectedItem.batchCode || '-' }}</div>
          <div>盘号:{{ selectedItem.reelNo || '-' }}</div>
          <div>数量:{{ selectedItem.quantity ?? '-' }}</div>
          <div>仓库:{{ selectedItem.warehouseName || '-' }}</div>
          <div>库区:{{ selectedItem.locationName || '-' }}</div>
src/views/wls/materialstock/data.ts
@@ -97,6 +97,7 @@
      title: '产品物料名称',
      minWidth: 140,
    },
    { field: 'reelNo', title: '盘号', minWidth: 120 },
    {
      field: 'specification',
      title: '规格型号',
@@ -314,6 +315,7 @@
      title: '入库批次号',
      minWidth: 120,
    },
    { field: 'reelNo', title: '盘号', minWidth: 120 },
    {
      field: 'warehouseName',
      title: '仓库',