From 6738e8f5a78431e41fed28e6b795e70c2396070a Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 03 九月 2026 17:27:23 +0800
Subject: [PATCH] refactor(mes): 优化工艺路线配置与工单表单功能

---
 src/views/mes/process-design/route/modules/product-form.vue |  107 ++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 77 insertions(+), 30 deletions(-)

diff --git a/src/views/mes/process-design/route/modules/product-form.vue b/src/views/mes/process-design/route/modules/product-form.vue
index a3b0e5d..e20baa6 100644
--- a/src/views/mes/process-design/route/modules/product-form.vue
+++ b/src/views/mes/process-design/route/modules/product-form.vue
@@ -5,7 +5,7 @@
 
 import { useVbenModal } from '@vben/common-ui';
 
-import { Divider, message } from 'ant-design-vue';
+import { message } from 'ant-design-vue';
 
 import { useVbenForm } from '#/adapter/form';
 import {
@@ -16,17 +16,17 @@
 import { $t } from '#/locales';
 
 import { useRouteProductFormSchema } from '../data';
-import ProductBomList from './product-bom-list.vue';
 
 const emit = defineEmits(['success']);
 const formData = ref<MesProRouteProductApi.RouteProduct>();
+const boundItemIds = ref<number[]>([]); // 宸茬粦瀹氭湰璺嚎鐨勪骇鍝佺墿鏂欑紪鍙凤紙鏂板澶氶�夋椂璺宠繃锛�
 const getTitle = computed(() =>
   formData.value?.id
     ? $t('ui.actionTitle.edit', ['宸ヨ壓璺嚎浜у搧'])
     : $t('ui.actionTitle.create', ['宸ヨ壓璺嚎浜у搧']),
 );
 
-/** MdItemSelect change 鍥炶皟锛氭妸鐗╂枡缂栫爜/鍚嶇О/瑙勬牸/鍗曚綅鍥炲~鍒� form */
+/** MdItemSelect 鍗曢�� change 鍥炶皟锛氭妸鐗╂枡缂栫爜/鍚嶇О/瑙勬牸/鍗曚綅鍥炲~鍒� form */
 async function handleItemChange(item?: any) {
   if (!item) {
     return;
@@ -58,22 +58,62 @@
       return;
     }
     modalApi.lock();
-    // 鎻愪氦琛ㄥ崟
-    const data =
-      (await formApi.getValues()) as MesProRouteProductApi.RouteProduct;
+    const data = (await formApi.getValues()) as MesProRouteProductApi.RouteProduct & {
+      itemIds?: number[];
+    };
     try {
+      // 缂栬緫妯″紡锛氭洿鏂板崟涓骇鍝�
       if (formData.value?.id) {
         await updateRouteProduct(data);
-        // 鐢ㄦ渶鏂拌〃鍗曞�煎悓姝� formData锛岀‘淇濅骇鍝� BOM 瀛愯〃缁戝畾鐨� itemId 涓庤〃鍗曚竴鑷�
-        formData.value = { ...formData.value, ...data };
-      } else {
-        // 鏂板鎴愬姛鍚庡垏鎹㈠埌缂栬緫妯″紡锛屾柟渚跨户缁淮鎶や骇鍝� BOM
-        const id = await createRouteProduct(data);
-        formData.value = { ...data, id };
-        await formApi.setFieldValue('id', id);
+        await modalApi.close();
+        emit('success');
+        message.success($t('ui.actionMessage.operationSuccess'));
+        return;
       }
-      emit('success');
-      message.success($t('ui.actionMessage.operationSuccess'));
+      // 鏂板妯″紡锛氬閫変骇鍝佷竴娆℃�х粦瀹氾紝璺宠繃宸插湪璺嚎涓殑浜у搧
+      const itemIds = Array.isArray(data.itemIds) ? data.itemIds : [];
+      if (itemIds.length === 0) {
+        message.warning('璇疯嚦灏戦�夋嫨涓�涓骇鍝�');
+        return;
+      }
+      let created = 0;
+      let skipped = 0;
+      const failedIds: number[] = [];
+      for (const itemId of itemIds) {
+        if (itemId == null) {
+          continue;
+        }
+        if (boundItemIds.value.includes(itemId)) {
+          skipped++;
+          continue;
+        }
+        try {
+          await createRouteProduct({
+            routeId: data.routeId,
+            itemId,
+            quantity: data.quantity,
+            productionTime: data.productionTime,
+            timeUnitType: data.timeUnitType,
+            remark: data.remark,
+          });
+          created++;
+        } catch {
+          failedIds.push(itemId);
+        }
+      }
+      if (skipped > 0) {
+        message.warning(`宸茶烦杩� ${skipped} 涓凡缁戝畾鐨勪骇鍝乣);
+      }
+      if (failedIds.length > 0) {
+        message.error(
+          `鏈� ${failedIds.length} 涓骇鍝佺粦瀹氬け璐ワ紙鍙兘宸茶鍏跺畠宸ヨ壓璺嚎鍗犵敤锛塦,
+        );
+      }
+      if (created > 0) {
+        message.success(`鎴愬姛缁戝畾 ${created} 涓骇鍝乣);
+        await modalApi.close();
+        emit('success');
+      }
     } finally {
       modalApi.unlock();
     }
@@ -81,24 +121,42 @@
   async onOpenChange(isOpen: boolean) {
     if (!isOpen) {
       formData.value = undefined;
+      boundItemIds.value = [];
       return;
     }
     // 鍔犺浇鏁版嵁
     const data = modalApi.getData<{
       id?: number;
       routeId: number;
+      boundItemIds?: number[];
     }>();
     if (!data) {
       return;
     }
+    boundItemIds.value = data.boundItemIds || [];
     if (!data.id) {
-      await formApi.setValues({ routeId: data.routeId });
+      // 鏂板妯″紡锛氬閫変骇鍝佺粦瀹�
+      formData.value = undefined;
+      await formApi.setState({
+        schema: useRouteProductFormSchema(handleItemChange, true),
+      });
+      await formApi.setValues({
+        routeId: data.routeId,
+        itemIds: [],
+        quantity: 1,
+        productionTime: 1,
+        timeUnitType: 'MINUTE',
+        remark: undefined,
+      });
       return;
     }
+    // 缂栬緫妯″紡锛氬姞杞藉崟涓骇鍝佸洖濉�
     modalApi.lock();
     try {
       formData.value = await getRouteProduct(data.id);
-      // 璁剧疆鍒� values
+      await formApi.setState({
+        schema: useRouteProductFormSchema(handleItemChange, false),
+      });
       await formApi.setValues(formData.value);
     } finally {
       modalApi.unlock();
@@ -108,18 +166,7 @@
 </script>
 
 <template>
-  <Modal :title="getTitle" class="w-3/5">
+  <Modal :title="getTitle" class="w-2/5">
     <Form class="mx-4" />
-    <!-- 缂栬緫妯″紡涓嬪睍绀轰骇鍝� BOM 瀛愯〃锛屾柊澧炴ā寮忎笅闅愯棌 -->
-    <template v-if="formData?.id && formData?.itemId">
-      <Divider class="!my-3" orientation="left">浜у搧 BOM 閰嶇疆</Divider>
-      <div class="mx-4">
-        <ProductBomList
-          :route-id="formData.routeId!"
-          :product-id="formData.itemId"
-          :product-name="formData.itemName"
-        />
-      </div>
-    </template>
   </Modal>
-</template>
+</template>
\ No newline at end of file

--
Gitblit v1.9.3