From 64a8cd04229f7b903913fc3dc7ef4aef267ac3bc Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 26 十月 2026 17:36:14 +0800
Subject: [PATCH] Merge branch 'dev_pro2.0' into dev_南通_苏珩

---
 src/views/mes/pro/workorder/modules/process-form.vue |  177 +++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 149 insertions(+), 28 deletions(-)

diff --git a/src/views/mes/pro/workorder/modules/process-form.vue b/src/views/mes/pro/workorder/modules/process-form.vue
index bbe10c0..2de3f58 100644
--- a/src/views/mes/pro/workorder/modules/process-form.vue
+++ b/src/views/mes/pro/workorder/modules/process-form.vue
@@ -10,11 +10,15 @@
 
 import { useVbenForm } from '#/adapter/form';
 import { getProcessSimpleList } from '#/api/mes/pro/process';
+import { getRouteProcessListByProduct } from '#/api/mes/pro/route/process';
 import {
   createWorkOrderProcess,
   getWorkOrderProcess,
   updateWorkOrderProcess,
 } from '#/api/mes/pro/workorder/process';
+import { getWarehouseSimpleList } from '#/api/mes/wm/warehouse';
+import { getWarehouseAreaSimpleList } from '#/api/mes/wm/warehouse/area';
+import { getWarehouseLocationSimpleList } from '#/api/mes/wm/warehouse/location';
 import { $t } from '#/locales';
 import { MdItemSelect } from '#/views/mes/md/item/components';
 
@@ -23,6 +27,7 @@
 const workOrderId = ref<number>();
 const processList = ref<MesProWorkOrderProcessApi.WorkOrderProcess[]>([]);
 const isCreateMode = ref(false);
+const allowedOutputItemIds = ref<number[]>([]);
 
 const getTitle = computed(() => {
   return formData.value?.id
@@ -39,9 +44,37 @@
   }));
 }
 
+/**
+ * 杞藉叆鏈伐鍗曚骇鍝佸彲閫夌殑浜у嚭鐗╂枡鑼冨洿
+ *
+ * 鍙栧伐鑹鸿矾绾挎寜浜у嚭褰掑睘杩囨护鍚庣殑浜у嚭锛堥�氱敤鍗婃垚鍝� + 鏈骇鍝佷笓灞炴垚鍝侊級锛�
+ * 骞跺苟鍏ヨ宸ュ簭宸查厤缃殑浜у嚭锛岄伩鍏嶅巻鍙叉暟鎹湪閲嶆柊閫夋嫨鏃惰璇竻绌恒��
+ */
+async function loadAllowedOutputItemIds(
+  productId?: number,
+  currentOutputItemIds: number[] = [],
+): Promise<number[]> {
+  if (!productId) {
+    return [];
+  }
+  const ids = new Set<number>([productId, ...currentOutputItemIds]);
+  const routeProcessList = await getRouteProcessListByProduct(productId);
+  (routeProcessList || []).forEach((process) => {
+    (process.outputItemIds || []).forEach((id) => {
+      if (id) {
+        ids.add(id);
+      }
+    });
+  });
+  return [...ids];
+}
+
 /** 琛ㄥ崟 schema */
 async function loadSchema(): Promise<VbenFormSchema[]> {
-  const processOptions = await loadProcessOptions();
+  const [processOptions, warehouseList] = await Promise.all([
+    loadProcessOptions(),
+    getWarehouseSimpleList(),
+  ]);
   return [
     {
       fieldName: 'id',
@@ -50,6 +83,21 @@
     },
     {
       fieldName: 'workOrderId',
+      component: 'Input',
+      dependencies: { triggerFields: [''], show: () => false },
+    },
+    {
+      fieldName: 'warehouseName',
+      component: 'Input',
+      dependencies: { triggerFields: [''], show: () => false },
+    },
+    {
+      fieldName: 'locationName',
+      component: 'Input',
+      dependencies: { triggerFields: [''], show: () => false },
+    },
+    {
+      fieldName: 'areaName',
       component: 'Input',
       dependencies: { triggerFields: [''], show: () => false },
     },
@@ -185,6 +233,80 @@
       componentProps: {
         multiple: true,
         placeholder: '璇烽�夋嫨浜у嚭鐗╂枡',
+        productIds: allowedOutputItemIds.value,
+      },
+    },
+    {
+      fieldName: 'warehouseId',
+      label: '鎶ュ伐浠撳簱',
+      component: 'Select',
+      componentProps: {
+        allowClear: true,
+        options: (warehouseList || []).map((item) => ({
+          label: item.name ?? '',
+          value: item.id!,
+        })),
+        placeholder: '榛樿鍙栧伐鑹鸿矾绾块厤缃紝鍙慨鏀�',
+        onChange: async (value: number) => {
+          const warehouse = (warehouseList || []).find(
+            (item) => item.id === value,
+          );
+          await formApi.setFieldValue('warehouseName', warehouse?.name);
+          await formApi.setFieldValue('locationId', undefined);
+          await formApi.setFieldValue('locationName', undefined);
+          await formApi.setFieldValue('areaId', undefined);
+          await formApi.setFieldValue('areaName', undefined);
+        },
+      },
+    },
+    {
+      fieldName: 'locationId',
+      label: '鎶ュ伐搴撳尯',
+      component: 'Select',
+      dependencies: {
+        triggerFields: ['warehouseId'],
+        disabled: (values) => !values.warehouseId,
+        async componentProps(values) {
+          const options = values.warehouseId
+            ? await getWarehouseLocationSimpleList(values.warehouseId)
+            : [];
+          return {
+            allowClear: true,
+            fieldNames: { label: 'name', value: 'id' },
+            options,
+            placeholder: '璇烽�夋嫨鎶ュ伐搴撳尯',
+            onChange: async (value: number) => {
+              const location = options.find((item) => item.id === value);
+              await formApi.setFieldValue('locationName', location?.name);
+              await formApi.setFieldValue('areaId', undefined);
+              await formApi.setFieldValue('areaName', undefined);
+            },
+          };
+        },
+      },
+    },
+    {
+      fieldName: 'areaId',
+      label: '鎶ュ伐搴撲綅',
+      component: 'Select',
+      dependencies: {
+        triggerFields: ['locationId'],
+        disabled: (values) => !values.locationId,
+        async componentProps(values) {
+          const options = values.locationId
+            ? await getWarehouseAreaSimpleList(values.locationId)
+            : [];
+          return {
+            allowClear: true,
+            fieldNames: { label: 'name', value: 'id' },
+            options,
+            placeholder: '璇烽�夋嫨鎶ュ伐搴撲綅',
+            onChange: async (value: number) => {
+              const area = options.find((item) => item.id === value);
+              await formApi.setFieldValue('areaName', area?.name);
+            },
+          };
+        },
       },
     },
     {
@@ -271,16 +393,9 @@
       formData.value = undefined;
       processList.value = [];
       isCreateMode.value = false;
+      allowedOutputItemIds.value = [];
       return;
     }
-    modalApi.lock();
-    try {
-      const schema = await loadSchema();
-      formApi.setState({ schema });
-    } finally {
-      modalApi.unlock();
-    }
-
     const data = modalApi.getData<{
       id?: number;
       productId?: number;
@@ -296,27 +411,33 @@
     processList.value = data.processList || [];
     isCreateMode.value = !data.workOrderId;
 
-    if (data.row) {
-      // 缂栬緫涓存椂鍒楄〃涓殑宸ュ簭
-      formData.value = data.row;
-      await formApi.setValues(data.row);
-    } else if (data.id) {
-      // 缂栬緫宸蹭繚瀛樼殑宸ュ簭
-      modalApi.lock();
-      try {
-        formData.value = await getWorkOrderProcess(data.id);
+    modalApi.lock();
+    try {
+      // 鍏堝彇宸ュ簭鏁版嵁锛氱紪杈戝凡淇濆瓨宸ュ簭鏃剁敤浜庡洖鏄撅紝涔熺敤浜庝繚鐣欏叾宸叉湁浜у嚭
+      const savedProcess = !data.row && data.id
+        ? await getWorkOrderProcess(data.id)
+        : undefined;
+      formData.value = data.row ?? savedProcess;
+
+      allowedOutputItemIds.value = await loadAllowedOutputItemIds(
+        data.productId,
+        formData.value?.outputItemIds || [],
+      );
+      formApi.setState({ schema: await loadSchema() });
+
+      if (formData.value) {
+        // 缂栬緫涓存椂鍒楄〃涓殑宸ュ簭 / 缂栬緫宸蹭繚瀛樼殑宸ュ簭
         await formApi.setValues(formData.value);
-      } finally {
-        modalApi.unlock();
+      } else {
+        // 鏂板
+        const maxSort = Math.max(0, ...processList.value.map((item) => item.sort || 0));
+        await formApi.setValues({
+          colorCode: '#00AEF3',
+          sort: maxSort + 1,
+        });
       }
-    } else {
-      // 鏂板
-      formData.value = undefined;
-      const maxSort = Math.max(0, ...processList.value.map((item) => item.sort || 0));
-      await formApi.setValues({
-        colorCode: '#00AEF3',
-        sort: maxSort + 1,
-      });
+    } finally {
+      modalApi.unlock();
     }
   },
 });

--
Gitblit v1.9.3