From 5be0bef08baf9c3ddb55ae04ff606ae29276d627 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期五, 27 三月 2026 16:45:32 +0800
Subject: [PATCH] 销售订单对接接口

---
 src/views/salesManagement/salesLedger/components/salesOrderPrint.js |  140 ++++++++++++++++++++++++----------------------
 1 files changed, 73 insertions(+), 67 deletions(-)

diff --git a/src/views/salesManagement/salesLedger/components/salesOrderPrint.js b/src/views/salesManagement/salesLedger/components/salesOrderPrint.js
index 9e60eab..8e82a98 100644
--- a/src/views/salesManagement/salesLedger/components/salesOrderPrint.js
+++ b/src/views/salesManagement/salesLedger/components/salesOrderPrint.js
@@ -56,7 +56,7 @@
   toNumber(item?.area || item?.settleTotalArea || item?.actualTotalArea);
 
 const getDeliveryAddress = (data) =>
-  data?.deliveryAddress || data?.shippingAddress || data?.address || data?.shipAddress || "";
+  data?.companyAddress || data?.deliveryAddress || data?.shippingAddress || data?.address || data?.shipAddress || "";
 
 const normalizeRequirementText = (value) => {
   const text = String(value ?? "").trim();
@@ -69,6 +69,7 @@
 
 const extractOtherFees = (data, items) => {
   const source = [];
+  if (Array.isArray(data?.otherFees)) source.push(...data.otherFees);
   if (Array.isArray(data?.otherAmounts)) source.push(...data.otherAmounts);
   if (Array.isArray(data?.otherAmountList)) source.push(...data.otherAmountList);
   if (Array.isArray(data?.otherAmountProjects)) source.push(...data.otherAmountProjects);
@@ -80,7 +81,7 @@
 
   const map = new Map();
   source.forEach((fee) => {
-    const name = String(fee?.processName || fee?.name || fee?.itemName || "").trim();
+    const name = String(fee?.feeName || fee?.processName || fee?.name || fee?.itemName || "").trim();
     if (!name) return;
     const quantity = toNumber(fee?.quantity || fee?.num);
     const unitPrice = toNumber(fee?.unitPrice || fee?.price);
@@ -98,29 +99,21 @@
   return Array.from(map.values());
 };
 
-const renderOtherFeeNames = (rows) =>
-  (Array.isArray(rows) ? rows : [])
-    .map((row) => escapeHtml(row.name))
-    .filter(Boolean)
-    .join("<br/>");
-
-const renderOtherFeeUnitPrices = (rows) =>
-  (Array.isArray(rows) ? rows : [])
-    .map((row) => (row.unitPrice ? formatMoney(row.unitPrice) : ""))
-    .filter(Boolean)
-    .join("<br/>");
-
-const renderOtherFeeQuantities = (rows) =>
-  (Array.isArray(rows) ? rows : [])
-    .map((row) => (row.quantity ? String(row.quantity) : ""))
-    .filter(Boolean)
-    .join("<br/>");
-
-const renderOtherFeeAmounts = (rows) =>
-  (Array.isArray(rows) ? rows : [])
-    .map((row) => (row.amount ? formatMoney(row.amount) : ""))
-    .filter(Boolean)
-    .join("<br/>");
+const renderOtherFeeRows = (rows) => {
+  const list = Array.isArray(rows) ? rows : [];
+  if (list.length === 0) {
+    return `<tr><td></td><td></td><td></td><td></td></tr>`;
+  }
+  return list
+    .map((row) => {
+      const name = escapeHtml(row.name);
+      const unitPrice = row.unitPrice ? formatMoney(row.unitPrice) : "";
+      const quantity = row.quantity ? String(row.quantity) : "";
+      const amount = row.amount ? formatMoney(row.amount) : "";
+      return `<tr><td class="other-fee-shift-left">${name}</td><td class="other-fee-shift-left">${unitPrice}</td><td class="other-fee-shift-left">${quantity}</td><td>${amount}</td></tr>`;
+    })
+    .join("");
+};
 
 const splitItemsByPage = (items, pageSize) => {
   const list = Array.isArray(items) ? items : [];
@@ -171,9 +164,12 @@
   const pages = splitItemsByPage(items, pageSize);
   const totalPages = pages.length;
 
+  const subtotalQuantity = toNumber(data.subtotalQuantity);
+  const subtotalArea = toNumber(data.subtotalArea);
+  const subtotalAmount = toNumber(data.subtotalAmount);
   const totalQuantity = toNumber(data.totalQuantity) || items.reduce((sum, item) => sum + toNumber(item?.quantity), 0);
   const totalArea = toNumber(data.totalArea) || items.reduce((sum, item) => sum + getItemArea(item), 0);
-  const totalAmount = items.reduce((sum, item) => sum + getItemAmount(item), 0);
+  const totalAmount = toNumber(data.totalAmount) || items.reduce((sum, item) => sum + getItemAmount(item), 0);
   const otherFees = extractOtherFees(data, items);
 
   const printWindow = window.open("", "_blank", "width=1200,height=900");
@@ -204,36 +200,20 @@
       table { width: 100%; border-collapse: collapse; table-layout: fixed; border: 1px solid #222; }
       .detail-table {
         border-right: 1px solid #222 !important;
-        box-shadow: inset -1px 0 0 #222;
       }
       .detail-table-wrap {
         position: relative;
         margin-top: -1px;
       }
       .detail-table-wrap::after {
-        content: "";
-        position: absolute;
-        top: 0;
-        right: 0;
-        width: 1px;
-        height: 100%;
-        background: #222;
-        pointer-events: none;
+        content: none;
       }
       .sheet-wrap {
         position: relative;
         overflow: visible;
       }
       .sheet-wrap::after {
-        content: "";
-        position: absolute;
-        top: 0;
-        right: -0.4px;
-        width: 1.2px;
-        height: 100%;
-        background: #222;
-        pointer-events: none;
-        z-index: 20;
+        content: none;
       }
       td, th { border: 1px solid #222; padding: 2px 4px; font-size: 13px; text-align: center; vertical-align: middle; }
       tr > td:first-child, tr > th:first-child { border-left: 1px solid #222 !important; }
@@ -244,6 +224,7 @@
       .product-row td { font-size: 13px; font-weight: 700; }
       .empty { height: 140px; color: #777; }
       .large-row td { height: 46px; vertical-align: top; }
+      .other-fee-content-row td { height: auto !important; }
       .total-row td { font-weight: 700; font-size: 13px; line-height: 1.2; }
       .footer { margin-top: 5px; display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 6px; font-size: 13px; line-height: 1.7; }
       .footer b { display: inline-block; min-width: 74px; }
@@ -262,7 +243,7 @@
         justify-content: space-between;
         gap: 8px;
       }
-      .other-fee-cell { white-space: normal; word-break: break-all; line-height: 1.5; vertical-align: top; }
+      .other-fee-cell { white-space: normal; word-break: break-all; line-height: 1.35; vertical-align: top; }
       .other-fee-header { font-weight: 700; }
       .other-fee-header-grid {
         display: grid;
@@ -272,6 +253,30 @@
       }
       .other-fee-header-row td { border-bottom: none !important; }
       .other-fee-content-row td { border-top: none !important; }
+      .other-fee-inner {
+        width: 100%;
+        border-collapse: collapse;
+        table-layout: fixed;
+        border: none !important;
+      }
+      .other-fee-inner td {
+        border: none !important;
+        padding: 0 1px;
+        text-align: center;
+        vertical-align: middle;
+        white-space: normal;
+        word-break: break-all;
+        line-height: 1.1;
+      }
+      .other-fee-inner tr > td:first-child,
+      .other-fee-inner tr > td:last-child {
+        border-left: none !important;
+        border-right: none !important;
+      }
+      .other-fee-shift-left {
+        position: relative;
+        left: -30px;
+      }
       @media print {
         @page { size: A4 landscape; margin: 6mm; }
         .page { width: 100%; margin: 0; padding: 0 0 14mm; min-height: 0; }
@@ -285,7 +290,7 @@
         const startIndex = pageIndex * pageSize;
         return `
     <div class="page">
-      <div class="title-main">楣ゅ澶╂矏閽㈠寲鐜荤拑鍘�</div>
+      <div class="title-main">${escapeHtml(data.companyName || "楣ゅ澶╂矏閽㈠寲鐜荤拑鍘�")}</div>
       <div class="title-sub">閿�鍞鍗�</div>
 
       <div class="sheet-wrap">
@@ -306,7 +311,7 @@
         </tr>
         <tr>
           <td class="cell-title">鍒跺崟鏃ユ湡:</td>
-          <td class="left">${escapeHtml(formatDisplayDate(data.registerDate || data.entryDate))}</td>
+          <td class="left">${escapeHtml(formatDisplayDate(data.executionDate || data.orderMakerDate || data.registerDate || data.entryDate))}</td>
           <td class="cell-title">浜よ揣鏃ユ湡:</td>
           <td class="left">${escapeHtml(formatDisplayDate(data.deliveryDate))}</td>
           <td class="left"></td>
@@ -340,7 +345,7 @@
           <th>鍔犲伐瑕佹眰</th>
         </tr>
         <tr class="product-row">
-          <td colspan="6" class="left">浜у搧鍚嶇О: ${escapeHtml(items[0]?.productDescription)}</td>
+          <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)}
@@ -349,10 +354,10 @@
             ? `
         <tr class="total-row">
           <td colspan="3" class="left">灏忚:</td>
-          <td>${totalQuantity || ""}</td>
-          <td>${totalArea ? totalArea.toFixed(2) : ""}</td>
+          <td>${subtotalQuantity || totalQuantity || ""}</td>
+          <td>${subtotalArea ? subtotalArea.toFixed(2) : totalArea ? totalArea.toFixed(2) : ""}</td>
           <td></td>
-          <td>${formatMoney(totalAmount)}</td>
+          <td>${formatMoney(subtotalAmount || totalAmount)}</td>
           <td></td>
         </tr>
         <tr class="total-row">
@@ -376,19 +381,20 @@
         </tr>
         <tr class="large-row other-fee-content-row">
           <td colspan="5" class="left other-fee-cell">
-            ${
-              renderOtherFeeNames(otherFees) ||
-              renderOtherFeeUnitPrices(otherFees) ||
-              renderOtherFeeQuantities(otherFees) ||
-              renderOtherFeeAmounts(otherFees)
-                ? `${renderOtherFeeNames(otherFees)}`
-                : ""
-            }
+            <table class="other-fee-inner">
+              <colgroup>
+                <col style="width: 34%;" />
+                <col style="width: 22%;" />
+                <col style="width: 20%;" />
+                <col style="width: 24%;" />
+              </colgroup>
+              ${renderOtherFeeRows(otherFees)}
+            </table>
           </td>
-          <td colspan="3" class="left other-fee-cell">${escapeHtml(normalizeRequirementText(data.orderProcessRequirement))}</td>
+          <td colspan="3" class="left other-fee-cell">${escapeHtml(normalizeRequirementText(data.remakes || data.remarks || data.orderProcessRequirement))}</td>
         </tr>
         <tr class="total-row">
-          <td colspan="8" class="left">鎬婚噾棰�: ${formatMoney(totalAmount)}鍏�</td>
+          <td colspan="8" class="left">鎬婚噾棰�: ${escapeHtml(data.totalAmountDisplay || `${formatMoney(totalAmount)}鍏僠)}</td>
         </tr>
             `
             : `
@@ -408,12 +414,12 @@
         <span class="customer-sign customer-sign-cell">瀹㈡埛绛惧悕:</span>
       </div>
       <div class="footer">
-        <div><b>鍒跺崟鍛�:</b>${escapeHtml(data.register)}</div>
-        <div><b>瀹℃牳鍛�:</b>${escapeHtml(data.register)}</div>
-        <div><b>鎵撳嵃浜�:</b>${escapeHtml(data.register)}</div>
-        <div><b>鍒跺崟鏃ユ湡:</b>${escapeHtml(formatDisplayDate(data.registerDate || data.entryDate))}</div>
-        <div><b>瀹℃牳鏃ユ湡:</b>${escapeHtml(formatDisplayDate(data.registerDate || data.entryDate))}</div>
-        <div class="footer-pair"><span><b>鎵撳嵃鏃堕棿:</b>${getCurrentDateTime()}</span><span class="footer-page-right">绗�${pageIndex + 1}椤�,鍏�${totalPages}椤�</span></div>
+        <div><b>鍒跺崟鍛�:</b>${escapeHtml(data.orderMaker || data.register)}</div>
+        <div><b>瀹℃牳鍛�:</b>${escapeHtml(data.auditor)}</div>
+        <div><b>鎵撳嵃浜�:</b>${escapeHtml(data.printPeople || data.register)}</div>
+        <div><b>鍒跺崟鏃ユ湡:</b>${escapeHtml(formatDisplayDate(data.orderMakerDate || data.executionDate || data.registerDate || data.entryDate))}</div>
+        <div><b>瀹℃牳鏃ユ湡:</b>${escapeHtml(formatDisplayDate(data.auditDate))}</div>
+        <div class="footer-pair"><span><b>鎵撳嵃鏃堕棿:</b>${escapeHtml(data.printTime || getCurrentDateTime())}</span><span class="footer-page-right">绗�${pageIndex + 1}椤�,鍏�${totalPages}椤�</span></div>
       </div>
           `
           : ""

--
Gitblit v1.9.3