From 57bcf0bc0dad6758df94717963187d6b6122afaa Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期三, 22 四月 2026 17:23:08 +0800
Subject: [PATCH] 1

---
 src/views/salesManagement/salesLedger/components/salesOrderPrint.js |   32 ++++++++++++++++++++++++++------
 1 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/src/views/salesManagement/salesLedger/components/salesOrderPrint.js b/src/views/salesManagement/salesLedger/components/salesOrderPrint.js
index 8e82a98..a5e02ed 100644
--- a/src/views/salesManagement/salesLedger/components/salesOrderPrint.js
+++ b/src/views/salesManagement/salesLedger/components/salesOrderPrint.js
@@ -58,6 +58,18 @@
 const getDeliveryAddress = (data) =>
   data?.companyAddress || data?.deliveryAddress || data?.shippingAddress || data?.address || data?.shipAddress || "";
 
+const getItemProductName = (item, fallback = "") => {
+  const name =
+    item?.productDescription ||
+    item?.productName ||
+    item?.name ||
+    item?.title ||
+    item?.goodsName ||
+    item?.materialName ||
+    item?.glassName;
+  return String(name ?? "").trim() || String(fallback ?? "").trim();
+};
+
 const normalizeRequirementText = (value) => {
   const text = String(value ?? "").trim();
   if (!text) return "";
@@ -125,7 +137,7 @@
   return pages;
 };
 
-const renderRows = (items, startIndex) => {
+const renderRows = (items, startIndex, previousProductName, fallbackProductName) => {
   const list = Array.isArray(items) ? items : [];
   if (list.length === 0) {
     return `
@@ -134,14 +146,23 @@
       </tr>
     `;
   }
+  let lastProductName = String(previousProductName ?? "").trim();
   return list
     .map((item, idx) => {
+      const currentProductName = getItemProductName(item, fallbackProductName);
+      const shouldRenderProductRow = currentProductName !== lastProductName;
+      lastProductName = currentProductName;
       const width = escapeHtml(item?.width);
       const height = escapeHtml(item?.height);
       const sizeText = width || height ? `${width}*${height}` : "";
       const unitPrice = formatMoney(item?.taxInclusiveUnitPrice || item?.unitPrice);
       const amount = formatMoney(getItemAmount(item));
       return `
+      ${
+        shouldRenderProductRow
+          ? `<tr class="product-row"><td colspan="6" class="left">浜у搧鍚嶇О: ${escapeHtml(currentProductName)}</td><td colspan="2" class="left">璁㈠崟缂栧彿: ${escapeHtml(item?.salesContractNo || "")}</td></tr>`
+          : ""
+      }
       <tr>
         <td>${startIndex + idx + 1}</td>
         <td>${escapeHtml(item?.floorCode)}</td>
@@ -160,6 +181,7 @@
 export const printSalesOrder = (orderData) => {
   const data = orderData ?? {};
   const items = Array.isArray(data.items) ? data.items : [];
+  const fallbackProductName = String(data?.productName ?? "").trim();
   const pageSize = 15;
   const pages = splitItemsByPage(items, pageSize);
   const totalPages = pages.length;
@@ -288,6 +310,8 @@
       .map((pageItems, pageIndex) => {
         const isLastPage = pageIndex === totalPages - 1;
         const startIndex = pageIndex * pageSize;
+        const previousProductName =
+          startIndex > 0 ? getItemProductName(items[startIndex - 1], fallbackProductName) : "";
         return `
     <div class="page">
       <div class="title-main">${escapeHtml(data.companyName || "楣ゅ澶╂矏閽㈠寲鐜荤拑鍘�")}</div>
@@ -344,11 +368,7 @@
           <th>閲戦</th>
           <th>鍔犲伐瑕佹眰</th>
         </tr>
-        <tr class="product-row">
-          <td colspan="6" class="left">浜у搧鍚嶇О: ${escapeHtml(data.productName || items[0]?.productDescription)}</td>
-          <td colspan="2" class="left">璁㈠崟缂栧彿: ${escapeHtml(data.salesContractNo)}</td>
-        </tr>
-        ${renderRows(pageItems, startIndex)}
+        ${renderRows(pageItems, startIndex, previousProductName, fallbackProductName)}
         ${
           isLastPage
             ? `

--
Gitblit v1.9.3