From fdd158306bf6dc3584f5110a385323f4a8dfb463 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 02 九月 2026 14:25:10 +0800
Subject: [PATCH] feat(wms): 重构仓库管理系统并优化图表显示

---
 src/views/wls/salesnotice/modules/line-form.vue |   92 ++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 84 insertions(+), 8 deletions(-)

diff --git a/src/views/wls/salesnotice/modules/line-form.vue b/src/views/wls/salesnotice/modules/line-form.vue
index f33e49a..ddc7c5e 100644
--- a/src/views/wls/salesnotice/modules/line-form.vue
+++ b/src/views/wls/salesnotice/modules/line-form.vue
@@ -15,7 +15,12 @@
 } from '#/api/mes/wm/salesnotice/line';
 import { $t } from '#/locales';
 
-import { useLineFormSchema } from '../data';
+import {
+  loadAvailableQuantity,
+  loadQualifiedStockBatchOptions,
+  loadQualifiedStockItemOptions,
+  useLineFormSchema,
+} from '../data';
 
 const emit = defineEmits(['success']);
 const formData = ref<MesWmSalesNoticeLineApi.SalesNoticeLine>();
@@ -26,6 +31,26 @@
     ? $t('ui.actionTitle.edit', ['鍙戣揣閫氱煡鍗曡'])
     : $t('ui.actionTitle.create', ['鍙戣揣閫氱煡鍗曡']);
 });
+
+async function updateBatchOptions(itemId?: number) {
+  const batchOptions = itemId
+    ? await loadQualifiedStockBatchOptions(itemId)
+    : [];
+  formApi.updateSchema([
+    {
+      fieldName: 'batchId',
+      componentProps: { options: batchOptions },
+    },
+  ]);
+}
+
+async function refreshAvailableQuantity(itemId?: number, batchId?: number) {
+  const quantity = await loadAvailableQuantity(itemId, batchId);
+  await formApi.setFieldValue(
+    'availableQuantity',
+    quantity > 0 ? `${quantity}` : undefined,
+  );
+}
 
 const [Form, formApi] = useVbenForm({
   commonConfig: {
@@ -38,6 +63,32 @@
   layout: 'horizontal',
   schema: useLineFormSchema(),
   showDefaultActions: false,
+  handleValuesChange: async (values, fieldsChanged) => {
+    // setValues 缂栬緫鍥炲~鏃� itemId/batchId 鍚屾椂鍙樺寲锛屼笉娓呮壒娆′粎鍒锋柊閫夐」
+    const itemChanged = fieldsChanged.includes('itemId');
+    const batchChanged = fieldsChanged.includes('batchId');
+    if (itemChanged && batchChanged) {
+      await updateBatchOptions(values.itemId as number | undefined);
+      await refreshAvailableQuantity(
+        values.itemId as number | undefined,
+        values.batchId as number | undefined,
+      );
+      return;
+    }
+    if (itemChanged) {
+      await formApi.setFieldValue('batchId', undefined);
+      await updateBatchOptions(values.itemId as number | undefined);
+      await refreshAvailableQuantity(values.itemId as number | undefined);
+      return;
+    }
+    if (batchChanged) {
+      await updateBatchOptions(values.itemId as number | undefined);
+      await refreshAvailableQuantity(
+        values.itemId as number | undefined,
+        values.batchId as number | undefined,
+      );
+    }
+  },
   wrapperClass: 'grid-cols-3',
 });
 
@@ -48,9 +99,12 @@
       return;
     }
     modalApi.lock();
-    // 鎻愪氦琛ㄥ崟
-    const data =
-      (await formApi.getValues()) as MesWmSalesNoticeLineApi.SalesNoticeLine;
+    // 鎻愪氦琛ㄥ崟锛堝彲鍙戣揣鏁伴噺浠呬綔鎻愮ず锛屼笉鎻愪氦鍒板悗绔級
+    const values = (await formApi.getValues()) as MesWmSalesNoticeLineApi.SalesNoticeLine & {
+      availableQuantity?: unknown;
+    };
+    delete values.availableQuantity;
+    const data = values;
     data.noticeId = noticeId.value;
     try {
       await (formData.value?.id
@@ -60,6 +114,15 @@
       await modalApi.close();
       emit('success');
       message.success($t('ui.actionMessage.operationSuccess'));
+    } catch (error) {
+      const response = error as {
+        response?: { data?: { message?: string; msg?: string } };
+      };
+      message.error(
+        response.response?.data?.message ??
+          response.response?.data?.msg ??
+          '淇濆瓨澶辫触锛岃妫�鏌ユ寮忓簱搴撳瓨鏄惁鍏呰冻',
+      );
     } finally {
       modalApi.unlock();
     }
@@ -72,14 +135,27 @@
     // 鍔犺浇鏁版嵁
     const data = modalApi.getData<{ id?: number; noticeId: number }>();
     noticeId.value = data.noticeId;
-    if (!data.id) {
-      return;
-    }
     modalApi.lock();
     try {
+      // 鐗╂枡閫夐」锛氫粎灞曠ず姝e紡搴撴湁搴撳瓨鐨勭墿鏂�
+      const itemOptions = await loadQualifiedStockItemOptions();
+      formApi.updateSchema([
+        {
+          fieldName: 'itemId',
+          componentProps: { options: itemOptions },
+        },
+      ]);
+      if (!data.id) {
+        return;
+      }
       formData.value = await getSalesNoticeLine(data.id);
-      // 璁剧疆鍒� values
+      // 璁剧疆鍒� values锛岃仈鍔ㄥ姞杞芥壒娆¢�夐」
       await formApi.setValues(formData.value);
+      await updateBatchOptions(formData.value?.itemId);
+      await refreshAvailableQuantity(
+        formData.value?.itemId,
+        formData.value?.batchId,
+      );
     } finally {
       modalApi.unlock();
     }

--
Gitblit v1.9.3