From fa42bcb7396e06e335bbbff67f5898b98f8d9aa0 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 24 七月 2026 17:09:28 +0800
Subject: [PATCH] refactor(mes): 移除工单模块中的BOM相关功能

---
 /dev/null                                    |  188 --------------------------
 src/views/mes/pro/workorder/modules/form.vue |   52 -------
 src/views/mes/pro/workorder/data.ts          |  133 -------------------
 3 files changed, 3 insertions(+), 370 deletions(-)

diff --git a/src/views/mes/pro/workorder/data.ts b/src/views/mes/pro/workorder/data.ts
index f277918..add9af7 100644
--- a/src/views/mes/pro/workorder/data.ts
+++ b/src/views/mes/pro/workorder/data.ts
@@ -1,6 +1,5 @@
 锘縤mport 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,
-      },
     },
   ];
 }
diff --git a/src/views/mes/pro/workorder/modules/bom-form.vue b/src/views/mes/pro/workorder/modules/bom-form.vue
deleted file mode 100644
index 77b1e0c..0000000
--- a/src/views/mes/pro/workorder/modules/bom-form.vue
+++ /dev/null
@@ -1,101 +0,0 @@
-锘�<script lang="ts" setup>
-import type { MesProWorkOrderBomApi } from '#/api/mes/pro/workorder/bom';
-
-import { computed, ref } from 'vue';
-
-import { useVbenModal } from '@vben/common-ui';
-
-import { message } from 'ant-design-vue';
-
-import { useVbenForm } from '#/adapter/form';
-import {
-  createWorkOrderBom,
-  getWorkOrderBom,
-  updateWorkOrderBom,
-} from '#/api/mes/pro/workorder/bom';
-import { $t } from '#/locales';
-
-import { useBomFormSchema } from '../data';
-
-const emit = defineEmits(['success']);
-const formData = ref<MesProWorkOrderBomApi.WorkOrderBom>();
-const workOrderId = ref<number>(); // 鎵�灞炶鍗曠紪鍙�
-
-const getTitle = computed(() => {
-  return formData.value?.id
-    ? $t('ui.actionTitle.edit', ['BOM 鐗╂枡'])
-    : $t('ui.actionTitle.create', ['BOM 鐗╂枡']);
-});
-
-const [Form, formApi] = useVbenForm({
-  commonConfig: {
-    componentProps: {
-      class: 'w-full',
-    },
-    formItemClass: 'col-span-2',
-    labelWidth: 100,
-  },
-  layout: 'horizontal',
-  schema: [],
-  showDefaultActions: false,
-  wrapperClass: 'grid-cols-2',
-});
-
-const [Modal, modalApi] = useVbenModal({
-  async onConfirm() {
-    const { valid } = await formApi.validate();
-    if (!valid) {
-      return;
-    }
-    modalApi.lock();
-    // 鎻愪氦琛ㄥ崟
-    const data =
-      (await formApi.getValues()) as MesProWorkOrderBomApi.WorkOrderBom;
-    data.workOrderId = workOrderId.value;
-    try {
-      await (formData.value?.id
-        ? updateWorkOrderBom({ ...data, id: formData.value.id })
-        : createWorkOrderBom(data));
-      // 鍏抽棴骞舵彁绀�
-      await modalApi.close();
-      emit('success');
-      message.success($t('ui.actionMessage.operationSuccess'));
-    } finally {
-      modalApi.unlock();
-    }
-  },
-  async onOpenChange(isOpen: boolean) {
-    if (!isOpen) {
-      formData.value = undefined;
-      return;
-    }
-    // 鍔犺浇鏁版嵁
-    const data = modalApi.getData<{
-      id?: number;
-      productId?: number;
-      workOrderId: number;
-    }>();
-    workOrderId.value = data.workOrderId;
-    formApi.setState({
-      schema: useBomFormSchema(!data.id, data.productId, formApi),
-    });
-    if (!data.id) {
-      return;
-    }
-    modalApi.lock();
-    try {
-      formData.value = await getWorkOrderBom(data.id);
-      // 璁剧疆鍒� values
-      await formApi.setValues(formData.value);
-    } finally {
-      modalApi.unlock();
-    }
-  },
-});
-</script>
-
-<template>
-  <Modal :title="getTitle" class="w-2/5">
-    <Form class="mx-4" />
-  </Modal>
-</template>
diff --git a/src/views/mes/pro/workorder/modules/bom-list.vue b/src/views/mes/pro/workorder/modules/bom-list.vue
deleted file mode 100644
index a955312..0000000
--- a/src/views/mes/pro/workorder/modules/bom-list.vue
+++ /dev/null
@@ -1,188 +0,0 @@
-锘�<script lang="ts" setup>
-import type { FormType } from '../data';
-
-import type { VxeTableGridOptions } from '#/adapter/vxe-table';
-import type { MesProWorkOrderApi } from '#/api/mes/pro/workorder';
-import type { MesProWorkOrderBomApi } from '#/api/mes/pro/workorder/bom';
-
-import { computed } from 'vue';
-
-import { useVbenModal } from '@vben/common-ui';
-import {
-  MesProWorkOrderStatusEnum,
-  MesProWorkOrderTypeEnum,
-} from '@vben/constants';
-
-import { message } from 'ant-design-vue';
-
-import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
-import {
-  deleteWorkOrderBom,
-  getWorkOrderBomPage,
-} from '#/api/mes/pro/workorder/bom';
-import { $t } from '#/locales';
-
-import { useBomGridColumns } from '../data';
-import BomForm from './bom-form.vue';
-
-const props = defineProps<{
-  formType: FormType;
-  workOrder: MesProWorkOrderApi.WorkOrder;
-  workOrderId: number;
-}>();
-
-const emit = defineEmits<{
-  generateWorkOrder: [row: MesProWorkOrderBomApi.WorkOrderBom];
-}>();
-
-const isEditable = computed(
-  () =>
-    // 缂栬緫鎬佽崏绋垮彲澧炲垹鏀� BOM
-    ['create', 'update'].includes(props.formType) &&
-    props.workOrder.status === MesProWorkOrderStatusEnum.PREPARE,
-);
-const isConfirmed = computed(
-  () =>
-    // 宸茬‘璁ゆ�佸彲鐢熸垚瀛愯鍗�
-    props.workOrder.status === MesProWorkOrderStatusEnum.CONFIRMED,
-);
-
-const [BomFormModal, bomFormModalApi] = useVbenModal({
-  connectedComponent: BomForm,
-  destroyOnClose: true,
-});
-
-/** 鍒锋柊琛ㄦ牸 */
-function handleRefresh() {
-  gridApi.query();
-}
-
-/** 娣诲姞 BOM 鐗╂枡 */
-function handleCreate() {
-  bomFormModalApi
-    .setData({
-      productId: props.workOrder.productId,
-      workOrderId: props.workOrderId,
-    })
-    .open();
-}
-
-/** 缂栬緫 BOM 鐗╂枡 */
-function handleEdit(row: MesProWorkOrderBomApi.WorkOrderBom) {
-  bomFormModalApi
-    .setData({
-      id: row.id,
-      productId: props.workOrder.productId,
-      workOrderId: props.workOrderId,
-    })
-    .open();
-}
-
-/** 鍒犻櫎 BOM 鐗╂枡 */
-async function handleDelete(row: MesProWorkOrderBomApi.WorkOrderBom) {
-  const hideLoading = message.loading({
-    content: $t('ui.actionMessage.deleting', [row.itemName]),
-    duration: 0,
-  });
-  try {
-    await deleteWorkOrderBom(row.id!);
-    message.success($t('ui.actionMessage.deleteSuccess', [row.itemName]));
-    handleRefresh();
-  } finally {
-    hideLoading();
-  }
-}
-
-/** 浠� BOM 琛岀敓鎴愬瓙璁㈠崟锛堥�氱煡鐖剁粍浠讹級 */
-function handleGenerateWorkOrder(row: MesProWorkOrderBomApi.WorkOrderBom) {
-  emit('generateWorkOrder', row);
-}
-
-/** 鏄惁灞曠ず鐢熸垚瀛愯鍗曟寜閽細宸茬‘璁� + 鑷埗 + 浜у搧绫诲瀷 BOM 琛� */
-function showGenerate(row: MesProWorkOrderBomApi.WorkOrderBom) {
-  return (
-    isConfirmed.value &&
-    props.workOrder.type === MesProWorkOrderTypeEnum.SELF &&
-    row.itemOrProduct === 'PRODUCT'
-  );
-}
-
-const [Grid, gridApi] = useVbenVxeGrid({
-  gridOptions: {
-    columns: useBomGridColumns(isEditable.value, isConfirmed.value),
-    height: 400,
-    keepSource: true,
-    proxyConfig: {
-      ajax: {
-        query: async ({ page }) => {
-          if (!props.workOrderId) {
-            return { list: [], total: 0 };
-          }
-          return await getWorkOrderBomPage({
-            pageNo: page.currentPage,
-            pageSize: page.pageSize,
-            workOrderId: props.workOrderId,
-          });
-        },
-      },
-    },
-    rowConfig: {
-      keyField: 'id',
-      isHover: true,
-    },
-    toolbarConfig: {
-      refresh: true,
-    },
-  } as VxeTableGridOptions<MesProWorkOrderBomApi.WorkOrderBom>,
-});
-</script>
-
-<template>
-  <div>
-    <BomFormModal @success="handleRefresh" />
-    <Grid table-title="璁㈠崟 BOM">
-      <template v-if="isEditable" #toolbar-tools>
-        <TableAction
-          :actions="[
-            {
-              label: '娣诲姞鐗╂枡',
-              type: 'primary',
-              icon: ACTION_ICON.ADD,
-              onClick: handleCreate,
-            },
-          ]"
-        />
-      </template>
-      <template #actions="{ row }">
-        <TableAction
-          :actions="[
-            {
-              label: $t('common.edit'),
-              type: 'link',
-              icon: ACTION_ICON.EDIT,
-              ifShow: isEditable,
-              onClick: handleEdit.bind(null, row),
-            },
-            {
-              label: $t('common.delete'),
-              type: 'link',
-              danger: true,
-              icon: ACTION_ICON.DELETE,
-              ifShow: isEditable,
-              popConfirm: {
-                title: $t('ui.actionMessage.deleteConfirm', [row.itemName]),
-                confirm: handleDelete.bind(null, row),
-              },
-            },
-            {
-              label: '鐢熸垚璁㈠崟',
-              type: 'link',
-              ifShow: showGenerate(row),
-              onClick: handleGenerateWorkOrder.bind(null, row),
-            },
-          ]"
-        />
-      </template>
-    </Grid>
-  </div>
-</template>
diff --git a/src/views/mes/pro/workorder/modules/form.vue b/src/views/mes/pro/workorder/modules/form.vue
index 891a31e..72d0374 100644
--- a/src/views/mes/pro/workorder/modules/form.vue
+++ b/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>

--
Gitblit v1.9.3