From 4e920b761cb2b21eca614ed4c437e30f92655ebd Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期二, 21 四月 2026 15:19:34 +0800
Subject: [PATCH] Merge branch 'dev_河南_鹤壁天沐玻璃厂' of http://114.132.189.42:9002/r/product-inventory-management into dev_河南_鹤壁天沐玻璃厂

---
 src/views/salesManagement/salesLedger/components/salesDeliveryPrint.js |  130 ++++++++++++++++++++++++++++++++++++++----
 1 files changed, 116 insertions(+), 14 deletions(-)

diff --git a/src/views/salesManagement/salesLedger/components/salesDeliveryPrint.js b/src/views/salesManagement/salesLedger/components/salesDeliveryPrint.js
index d0f6868..f50a2b6 100644
--- a/src/views/salesManagement/salesLedger/components/salesDeliveryPrint.js
+++ b/src/views/salesManagement/salesLedger/components/salesDeliveryPrint.js
@@ -30,6 +30,84 @@
 const getOrderNo = (data, row, item) =>
   item?.salesContractNo || item?.orderNo || data?.salesContractNo || row?.salesContractNo || "";
 
+const PRODUCT_NAME_FIELD_KEYS = [
+  "productDescription",
+  "productName",
+  "name",
+  "title",
+  "goodsName",
+  "materialName",
+  "glassName",
+];
+
+const PRODUCT_NAME_LIST_FIELD_KEYS = [
+  "productDescriptionList",
+  "productNameList",
+  "productDescriptions",
+  "productNames",
+  "nameList",
+  "goodsNameList",
+  "detailProductNames",
+  "productInfoList",
+];
+
+const SPECIFICATION_FIELD_KEYS = ["specificationModel", "specification", "model", "spec"];
+
+const normalizeNameList = (value) => {
+  if (Array.isArray(value)) {
+    return value
+      .flatMap((item) => normalizeNameList(item))
+      .map((item) => String(item).trim())
+      .filter(Boolean);
+  }
+  if (value && typeof value === "object") {
+    const objectListNames = PRODUCT_NAME_LIST_FIELD_KEYS.flatMap((key) => normalizeNameList(value?.[key]));
+    if (objectListNames.length) return objectListNames;
+    return PRODUCT_NAME_FIELD_KEYS.flatMap((key) => normalizeNameList(value?.[key]));
+  }
+  if (typeof value === "string") {
+    const text = value.trim();
+    if (!text) return [];
+    const parts = text
+      .split(/[,\n锛屻�侊紱;]/)
+      .map((item) => item.trim())
+      .filter(Boolean);
+    return parts.length > 1 ? parts : [text];
+  }
+  if (value === null || value === undefined) return [];
+  const text = String(value).trim();
+  return text ? [text] : [];
+};
+
+const extractNameListByKeys = (source, keys) => {
+  if (!source || typeof source !== "object") return [];
+  return keys.flatMap((key) => normalizeNameList(source?.[key]));
+};
+
+const resolveProductName = (item, fallbackNames, index) => {
+  const itemNames = [
+    ...extractNameListByKeys(item, PRODUCT_NAME_LIST_FIELD_KEYS),
+    ...extractNameListByKeys(item, PRODUCT_NAME_FIELD_KEYS),
+  ];
+  if (itemNames.length > 1) {
+    return itemNames[index] || itemNames[0] || "";
+  }
+  return itemNames[0] || fallbackNames[index] || fallbackNames[0] || "";
+};
+
+const resolveSpecificationModel = (...sources) => {
+  for (const source of sources) {
+    if (!source || typeof source !== "object") continue;
+    for (const key of SPECIFICATION_FIELD_KEYS) {
+      const value = source?.[key];
+      if (value !== undefined && value !== null && String(value).trim()) {
+        return String(value).trim();
+      }
+    }
+  }
+  return "";
+};
+
 const splitItemsByPage = (items, pageSize) => {
   const list = Array.isArray(items) ? items : [];
   if (list.length === 0) return [[]];
@@ -42,19 +120,38 @@
 
 const normalizeInvoiceData = (raw, selectedRow) => {
   const data = raw ?? {};
-  const groups = Array.isArray(data.groups) ? data.groups : [];
-  if (!groups.length) return data;
+  const groups = Array.isArray(data.groups)
+    ? data.groups
+    : Array.isArray(data.groupList)
+      ? data.groupList
+      : [];
+  const dataLevelNames = [
+    ...extractNameListByKeys(data, PRODUCT_NAME_LIST_FIELD_KEYS),
+    ...extractNameListByKeys(data, PRODUCT_NAME_FIELD_KEYS),
+  ];
 
-  const items = groups.flatMap((group) =>
-    (Array.isArray(group?.items) ? group.items : []).map((item) => ({
-      ...item,
-      // 浼樺厛浣跨敤鏄庣粏鑷韩浜у搧鍚嶏紝閬垮厤鍒嗙粍鍚嶇О瑕嗙洊瀵艰嚧鈥滀竴涓骇鍝佸悕鎸傚绉嶆槑缁嗏��
-      productDescription:
-        item?.productDescription || item?.productName || group?.productName || "",
-      salesContractNo: group?.salesContractNo || item?.salesContractNo || "",
-      widthHeight: item?.widthHeight || "",
-    }))
-  );
+  const items = groups.length
+    ? groups.flatMap((group) => {
+        const groupItems = Array.isArray(group?.items) ? group.items : [];
+        const groupNames = [
+          ...extractNameListByKeys(group, PRODUCT_NAME_LIST_FIELD_KEYS),
+          ...extractNameListByKeys(group, PRODUCT_NAME_FIELD_KEYS),
+        ];
+        return groupItems.map((item, index) => ({
+          ...item,
+          // 浼樺厛浣跨敤鏄庣粏鑷韩浜у搧鍚嶏紝鍏煎鈥滃悕绉版暟缁�/鍒嗛殧瀛楃涓测�濈殑鎺ュ彛鏍煎紡
+          productDescription: resolveProductName(item, groupNames, index),
+          specificationModel: resolveSpecificationModel(item, group, data),
+          salesContractNo: group?.salesContractNo || item?.salesContractNo || "",
+          widthHeight: item?.widthHeight || "",
+        }));
+      })
+    : (Array.isArray(data.items) ? data.items : []).map((item, index) => ({
+        ...item,
+        productDescription: resolveProductName(item, dataLevelNames, index),
+        specificationModel: resolveSpecificationModel(item, data, selectedRow),
+        widthHeight: item?.widthHeight || "",
+      }));
 
   return {
     ...data,
@@ -74,10 +171,15 @@
   const list = Array.isArray(items) ? items : [];
   const map = new Map();
   list.forEach((item) => {
-    const key = `${item?.productDescription || ""}__${getOrderNo(data, row, item)}`;
+    const key = `${item?.productDescription || ""}__${item?.specificationModel || ""}__${getOrderNo(
+      data,
+      row,
+      item
+    )}`;
     if (!map.has(key)) {
       map.set(key, {
         productName: item?.productDescription || "",
+        specificationModel: item?.specificationModel || "",
         orderNo: getOrderNo(data, row, item),
         items: [],
       });
@@ -259,7 +361,7 @@
                   serial += group.items.length;
                   return `
           <tr class="group-title">
-            <td colspan="5" class="left">浜у搧鍚嶇О: ${escapeHtml(group.productName)}</td>
+            <td colspan="5" class="left">浜у搧鍚嶇О: ${escapeHtml(group.productName)}${group.specificationModel ? `銆�瑙勬牸鍨嬪彿: ${escapeHtml(group.specificationModel)}` : ""}</td>
             <td colspan="2" class="left">璁㈠崟缂栧彿: ${escapeHtml(group.orderNo)}</td>
           </tr>
           ${rows}

--
Gitblit v1.9.3