From dcde4b33fa739b09486c39faade9ed19b29a6d7a Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 03 八月 2026 14:58:35 +0800
Subject: [PATCH] feat(srm): 优化供应商选择组件功能

---
 src/views/erp/sale/return/modules/form.vue |  131 +++++++++++++++++++++++++++++++++++--------
 1 files changed, 106 insertions(+), 25 deletions(-)

diff --git a/src/views/erp/sale/return/modules/form.vue b/src/views/erp/sale/return/modules/form.vue
index 76ce63a..64d7dd5 100644
--- a/src/views/erp/sale/return/modules/form.vue
+++ b/src/views/erp/sale/return/modules/form.vue
@@ -13,6 +13,7 @@
 
 import { useVbenForm } from '#/adapter/form';
 import { getAccountSimpleList } from '#/api/erp/finance/account';
+import { getSaleOrderItemListByOrderId, getSaleOrderPage } from '#/api/erp/sale/order';
 import {
   createSaleReturn,
   getSaleReturn,
@@ -29,7 +30,6 @@
     accountId?: number;
     customerId?: number;
     discountPercent?: number;
-    fileUrl?: string;
     order?: ErpSaleOrderApi.SaleOrder;
     orderId?: number;
     orderNo?: string;
@@ -40,7 +40,6 @@
   accountId: undefined,
   returnTime: undefined,
   remark: undefined,
-  fileUrl: undefined,
   discountPercent: 0,
   customerId: undefined,
   discountPrice: 0,
@@ -50,6 +49,7 @@
 });
 const formType = ref<FormType>('create'); // 琛ㄥ崟绫诲瀷锛�'create' | 'edit' | 'detail'
 const itemFormRef = ref<InstanceType<typeof ItemForm>>();
+const orderItems = ref<ErpSaleOrderApi.SaleOrderItem[]>([]);
 
 const getTitle = computed(() => {
   if (formType.value === 'create') {
@@ -115,7 +115,7 @@
 }
 
 /** 閫夋嫨閿�鍞鍗� */
-function handleUpdateOrder(order: ErpSaleOrderApi.SaleOrder) {
+async function handleUpdateOrder(order: ErpSaleOrderApi.SaleOrder) {
   formData.value = {
     ...formData.value,
     orderId: order.id,
@@ -124,18 +124,35 @@
     accountId: order.accountId!,
     remark: order.remark!,
     discountPercent: order.discountPercent!,
-    fileUrl: order.fileUrl!,
   };
-  // 灏嗚鍗曢」璁剧疆鍒伴��璐у崟椤�
-  order.items!.forEach((item: any) => {
-    item.totalCount = item.count;
-    item.count = item.totalCount - item.returnCount;
-    item.orderItemId = item.id;
-    item.id = undefined;
-  });
-  formData.value.items = order.items!.filter(
-    (item) => item.count && item.count > 0,
-  ) as ErpSaleReturnApi.SaleReturnItem[];
+  // 鍔犺浇鍏宠仈閿�鍞鍗曠殑鐗╂枡鍒楄〃
+  const items = await getSaleOrderItemListByOrderId(order.id!);
+  orderItems.value = items;
+  // 灏嗚鍗曢」杞崲涓洪��璐у崟椤癸紙浠呬繚鐣欏彲閫�璐ф暟閲� > 0 鐨勯」锛�
+  const returnItems: ErpSaleReturnApi.SaleReturnItem[] = [];
+  for (const item of items) {
+    const returnCount = (item as { returnCount?: number }).returnCount ?? 0;
+    const remainingCount = (item.count ?? 0) - returnCount;
+    if (remainingCount <= 0) continue;
+
+    returnItems.push({
+      orderItemId: item.id,
+      productId: item.productId,
+      productName: item.productName || '',
+      productPrice: item.productPrice || 0,
+      productUnitId: item.productUnitId,
+      productUnitName: item.productUnitName,
+      productBarCode: item.productBarCode,
+      totalCount: item.count,
+      count: remainingCount,
+      taxPercent: item.taxPercent || 0,
+      remark: item.remark || '',
+      totalProductPrice: 0,
+      taxPrice: 0,
+      totalPrice: 0,
+    });
+  }
+  formData.value.items = returnItems;
   formApi.setValues(formData.value, false);
 }
 
@@ -174,14 +191,72 @@
   async onOpenChange(isOpen: boolean) {
     if (!isOpen) {
       formData.value = {} as ErpSaleReturnApi.SaleReturn;
+      orderItems.value = [];
       return;
     }
-    // 鍔犺浇鏁版嵁
-    const data = modalApi.getData<{ formType: FormType; id?: number }>();
-    formType.value = data.formType;
+    const modalData = modalApi.getData<{ formType: FormType; id?: number }>();
+    formType.value = modalData.formType;
+
+    // 缂栬緫/璇︽儏妯″紡锛氬厛鍔犺浇鏁版嵁锛屽啀鏇存柊 schema锛岀‘淇濇覆鏌撴椂 orderNo 宸插氨缁�
+    if (modalData?.id) {
+      modalApi.lock();
+      try {
+        const apiData = await getSaleReturn(modalData.id);
+        const raw = apiData as Record<string, unknown>;
+
+        // 鎻愬彇璁㈠崟鍙凤紙灏濊瘯澶氱鍙兘鐨勫瓧娈靛悕 / 宓屽缁撴瀯锛�
+        const getOrderNo = (): string => {
+          if (raw.orderNo) return raw.orderNo as string;
+          if (raw.salesOrderCode) return raw.salesOrderCode as string;
+          if (raw.salesOrderNo) return raw.salesOrderNo as string;
+          const so = raw.salesOrder as Record<string, unknown> | undefined;
+          if (so?.no) return so.no as string;
+          const o = raw.order as Record<string, unknown> | undefined;
+          if (o?.no) return o.no as string;
+          return '';
+        };
+
+        // 鎻愬彇璁㈠崟ID锛堝皾璇曞绉嶅彲鑳界殑瀛楁鍚� / 宓屽缁撴瀯锛�
+        const getOrderId = (): number | undefined => {
+          if (raw.orderId) return raw.orderId as number;
+          if (raw.salesOrderId) return raw.salesOrderId as number;
+          const so = raw.salesOrder as Record<string, unknown> | undefined;
+          if (so?.id) return so.id as number;
+          const o = raw.order as Record<string, unknown> | undefined;
+          if (o?.id) return o.id as number;
+          return undefined;
+        };
+
+        let orderNo = getOrderNo();
+        let orderId = getOrderId();
+
+        // 濡傛灉鏈夎鍗曞彿浣嗘病鏈夎鍗旾D锛岄�氳繃璁㈠崟鍙峰弽鏌ヨ鍗旾D
+        if (orderNo && !orderId) {
+          const orderPage = await getSaleOrderPage({
+            pageNo: 1,
+            pageSize: 1,
+            no: orderNo,
+          } as Record<string, unknown> as never);
+          const list = (orderPage as Record<string, unknown>)?.list as Array<Record<string, unknown>> | undefined;
+          if (list?.length) {
+            orderId = list[0].id as number;
+          }
+        }
+
+        formData.value = { ...apiData, orderNo, orderId };
+        if (orderId) {
+          orderItems.value = await getSaleOrderItemListByOrderId(orderId);
+        }
+      } finally {
+        modalApi.unlock();
+      }
+    }
+
+    // 鏁版嵁灏辩华鍚庡啀鏇存柊 schema 鍜岃缃〃鍗曞��
     formApi.setDisabled(formType.value === 'detail');
     formApi.updateSchema(useFormSchema(formType.value));
-    if (!data || !data.id) {
+
+    if (!modalData?.id) {
       // 鏂板鏃讹紝榛樿閫変腑璐︽埛
       const accountList = await getAccountSimpleList();
       const defaultAccount = accountList.find((item) => item.defaultStatus);
@@ -190,13 +265,17 @@
       }
       return;
     }
-    modalApi.lock();
-    try {
-      formData.value = await getSaleReturn(data.id);
-      // 璁剧疆鍒� values
-      await formApi.setValues(formData.value, false);
-    } finally {
-      modalApi.unlock();
+
+    await formApi.setValues(formData.value, false);
+    if (formData.value?.attachmentList?.length) {
+      const blobIds = formData.value.attachmentList.map((item) => ({
+        uid: String(item.id),
+        name: item.name || '',
+        url: item.url || '',
+        status: 'done',
+        id: item.id,
+      }));
+      await formApi.setFieldValue('blobIds', blobIds);
     }
   },
 });
@@ -217,6 +296,7 @@
           :disabled="formType === 'detail'"
           :discount-percent="formData?.discountPercent ?? 0"
           :other-price="formData?.otherPrice ?? 0"
+          :order-items="orderItems"
           @update:items="handleUpdateItems"
           @update:discount-price="handleUpdateDiscountPrice"
           @update:other-price="handleUpdateOtherPrice"
@@ -225,6 +305,7 @@
       </template>
       <template #orderNo>
         <SaleOrderSelect
+          :key="formData?.orderNo ?? 'empty'"
           :order-no="formData?.orderNo"
           @update:order="handleUpdateOrder"
         />

--
Gitblit v1.9.3