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