13 小时以前 fa42bcb7396e06e335bbbff67f5898b98f8d9aa0
refactor(mes): 移除工单模块中的BOM相关功能

- 删除bom-form.vue组件文件
- 删除bom-list.vue组件文件
- 从data.ts中移除BOM相关的表格列定义和表单schema函数
- 从form.vue中移除BOM相关导入和组件引用
- 将默认子标签页从bom切换为process
- 移除BOM物料生成子订单的功能逻辑
- 更新工单表单的数据结构定义
已修改2个文件
已删除2个文件
474 ■■■■■ 文件已修改
src/views/mes/pro/workorder/data.ts 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/workorder/modules/bom-form.vue 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/workorder/modules/bom-list.vue 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/workorder/modules/form.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/workorder/data.ts
@@ -1,6 +1,5 @@
import type { VbenFormApi, VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MesMdProductBomApi } from '#/api/mes/md/item/productBom';
import type { MesProWorkOrderApi } from '#/api/mes/pro/workorder';
import type { MesProWorkOrderBomApi } from '#/api/mes/pro/workorder/bom';
import type { MesProWorkOrderProcessApi } from '#/api/mes/pro/workorder/process';
@@ -22,7 +21,6 @@
import { getRangePickerDefaultProps } from '#/utils';
import {
  MdItemSelect,
  MdProductBomSelect,
} from '#/views/mes/md/item/components';
import { MdVendorSelect } from '#/views/mes/md/vendor/components';
@@ -425,137 +423,6 @@
      width: 240,
      fixed: 'right',
      slots: { default: 'actions' },
    },
  ];
}
/** è®¢å• BOM å­è¡¨çš„字段 */
export function useBomGridColumns(
  editable: boolean,
  generatable: boolean,
): VxeTableGridOptions<MesProWorkOrderBomApi.WorkOrderBom>['columns'] {
  return [
    {
      field: 'itemCode',
      title: 'BOM ç‰©æ–™ç¼–码',
      width: 120,
    },
    {
      field: 'itemName',
      title: 'BOM ç‰©æ–™åç§°',
      minWidth: 150,
    },
    {
      field: 'itemSpecification',
      title: '规格型号',
      width: 120,
    },
    {
      field: 'unitMeasureName',
      title: '单位',
      width: 80,
    },
    {
      field: 'itemOrProduct',
      title: '物料/产品',
      width: 100,
      cellRender: {
        name: 'CellDict',
        props: { type: DICT_TYPE.MES_MD_ITEM_OR_PRODUCT },
      },
    },
    {
      field: 'quantity',
      title: '预计使用量',
      width: 120,
    },
    {
      field: 'remark',
      title: '备注',
      minWidth: 120,
    },
    ...(editable || generatable
      ? [
          {
            title: '操作',
            width: 160,
            fixed: 'right',
            slots: { default: 'actions' },
          } as const,
        ]
      : []),
  ];
}
/** è®¢å• BOM æ–°å¢ž/修改的表单 */
export function useBomFormSchema(
  isCreate: boolean,
  productId?: number,
  formApi?: VbenFormApi,
): VbenFormSchema[] {
  return [
    {
      fieldName: 'itemId',
      label: '物料',
      component: markRaw(MdProductBomSelect),
      componentProps: {
        itemId: productId,
        placeholder: '请选择物料',
        // BOM ç‰©æ–™é€‰ä¸­åŽè‡ªåŠ¨å›žå¡«é¢„è®¡ä½¿ç”¨é‡
        onChange: async (bom?: MesMdProductBomApi.ProductBom) => {
          await formApi?.setFieldValue('quantity', bom?.quantity ?? undefined);
        },
      },
      rules: 'selectRequired',
      dependencies: {
        triggerFields: [''],
        show: () => isCreate,
      },
    },
    {
      fieldName: 'itemName',
      label: '物料',
      component: 'Input',
      componentProps: {
        disabled: true,
      },
      dependencies: {
        triggerFields: [''],
        show: () => !isCreate,
      },
    },
    {
      fieldName: 'unitMeasureName',
      label: '单位',
      component: 'Input',
      componentProps: {
        disabled: true,
      },
      dependencies: {
        triggerFields: [''],
        show: () => !isCreate,
      },
    },
    {
      fieldName: 'quantity',
      label: '预计使用量',
      component: 'InputNumber',
      componentProps: {
        class: '!w-full',
        min: 0,
        placeholder: '请输入预计使用量',
        precision: 2,
      },
      rules: 'required',
    },
    {
      fieldName: 'remark',
      label: '备注',
      component: 'Textarea',
      componentProps: {
        placeholder: '请输入备注',
        rows: 3,
      },
    },
  ];
}
src/views/mes/pro/workorder/modules/bom-form.vue
ÎļþÒÑɾ³ý
src/views/mes/pro/workorder/modules/bom-list.vue
ÎļþÒÑɾ³ý
src/views/mes/pro/workorder/modules/form.vue
@@ -2,7 +2,6 @@
  import type { FormType } from "../data";
  import type { MesProWorkOrderApi } from "#/api/mes/pro/workorder";
  import type { MesProWorkOrderBomApi } from "#/api/mes/pro/workorder/bom";
  import type { MesProWorkOrderProcessApi } from "#/api/mes/pro/workorder/process";
  import { computed, ref } from "vue";
@@ -28,7 +27,6 @@
  import { BarcodeDetail } from "#/views/wls/barcode/components";
  import { useFormSchema } from "../data";
  import BomList from "./bom-list.vue";
  import ItemList from "./item-list.vue";
  import ProcessList from "./process-list.vue";
@@ -36,7 +34,7 @@
  const formType = ref<FormType>("create");
  const formData = ref<MesProWorkOrderApi.WorkOrder>();
  const originalSnapshot = ref("");
  const subTabsName = ref("bom");
  const subTabsName = ref("process");
  const barcodeDetailRef = ref<InstanceType<typeof BarcodeDetail>>();
  const processListRef = ref<InstanceType<typeof ProcessList>>();
  const currentProductId = ref<number>(); // å½“前选中的产品 ID(用于工序加载)
@@ -125,39 +123,6 @@
      formData.value.code,
      formData.value.name
    );
  }
  /** ä»Ž BOM ç‰©æ–™è¡Œé¢„填子订单 */
  async function handleGenerateWorkOrder(
    bomRow: MesProWorkOrderBomApi.WorkOrderBom
  ) {
    const current = formData.value;
    if (!current) {
      return;
    }
    formData.value = undefined;
    formType.value = "create";
    subTabsName.value = "bom";
    applySchema();
    await formApi.resetForm();
    await formApi.setValues({
      clientId: current.clientId,
      name: `${bomRow.itemName}【${bomRow.quantity}】${
        bomRow.unitMeasureName || ""
      }`,
      orderSourceCode: current.orderSourceCode,
      orderSourceType: current.orderSourceType,
      parentId: current.id,
      productId: bomRow.itemId,
      quantity: bomRow.quantity,
      requestDate: current.requestDate,
      type: current.type,
      vendorId: current.vendorId,
    });
    // è®¾ç½®å½“前产品 ID,触发工序加载
    currentProductId.value = bomRow.itemId;
    originalSnapshot.value = JSON.stringify(await formApi.getValues());
    message.info("已从 BOM ç‰©æ–™é¢„填子订单,请补充订单编码等信息后保存");
  }
  /** å·¥åºåˆ—表变化回调 */
@@ -301,7 +266,7 @@
        parentRow?: MesProWorkOrderApi.WorkOrder;
      }>();
      formType.value = data.formType;
      subTabsName.value = "bom";
      subTabsName.value = "process";
      tempProcessList.value = [];
      applySchema();
      if (data?.id) {
@@ -335,21 +300,10 @@
         class="w-3/5"
         content-class="!max-h-[80vh] overflow-y-auto">
    <Form class="mx-4" />
    <!-- BOM / å·¥åº / ç‰©æ–™éœ€æ±‚ Tab -->
    <!-- å·¥åº / ç‰©æ–™éœ€æ±‚ Tab -->
    <template v-if="showTabs">
      <Tabs v-model:active-key="subTabsName"
            class="mx-4">
        <Tabs.TabPane key="bom"
                      tab="订单 BOM">
          <BomList v-if="formData?.id"
                   :form-type="formType"
                   :work-order="formData"
                   :work-order-id="formData.id"
                   @generate-work-order="handleGenerateWorkOrder" />
          <div v-else class="text-gray-400 text-center py-8">
            è¯·å…ˆä¿å­˜å·¥å•后再配置 BOM
          </div>
        </Tabs.TabPane>
        <Tabs.TabPane key="process"
                      tab="工序"
                      forceRender>