From 53e0b9466d3fdd3e5caf7c42e476fffdb468bc2a Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期五, 27 三月 2026 17:17:22 +0800
Subject: [PATCH] 1

---
 src/views/salesManagement/salesLedger/components/salesLabelPrint.js |  148 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 148 insertions(+), 0 deletions(-)

diff --git a/src/views/salesManagement/salesLedger/components/salesLabelPrint.js b/src/views/salesManagement/salesLedger/components/salesLabelPrint.js
new file mode 100644
index 0000000..333c298
--- /dev/null
+++ b/src/views/salesManagement/salesLedger/components/salesLabelPrint.js
@@ -0,0 +1,148 @@
+const PRINT_TITLE = "閿�鍞爣绛�";
+
+const escapeHtml = (value) =>
+  String(value ?? "")
+    .replaceAll("&", "&amp;")
+    .replaceAll("<", "&lt;")
+    .replaceAll(">", "&gt;")
+    .replaceAll('"', "&quot;")
+    .replaceAll("'", "&#39;");
+
+const splitByPage = (items, pageSize) => {
+  const list = Array.isArray(items) ? items : [];
+  if (list.length === 0) return [[]];
+  const pages = [];
+  for (let i = 0; i < list.length; i += pageSize) {
+    pages.push(list.slice(i, i + pageSize));
+  }
+  return pages;
+};
+
+const renderLabelCard = (item) => `
+  <div class="label-card">
+    <div class="line customer">${escapeHtml(item?.customerName)}</div>
+    <div class="line order">${escapeHtml(item?.salesContractNo)}</div>
+    <div class="line product">${escapeHtml(item?.productName)}</div>
+    <div class="line spec">${escapeHtml(item?.specification)}</div>
+    <div class="line address">${escapeHtml(item?.floorCode)}</div>
+  </div>
+`;
+
+export const printSalesLabel = (rawList = []) => {
+  const list = Array.isArray(rawList) ? rawList : [];
+  if (!list.length) {
+    throw new Error("鏍囩鏁版嵁涓虹┖锛屾棤娉曟墦鍗�");
+  }
+
+  const pageSize = 18; // 3 鍒� * 6 琛岋紙50x40mm锛�
+  const pages = splitByPage(list, pageSize);
+
+  const printWindow = window.open("", "_blank", "width=1200,height=900");
+  if (!printWindow) {
+    throw new Error("娴忚鍣ㄦ嫤鎴簡寮圭獥锛岃鍏佽寮圭獥鍚庨噸璇�");
+  }
+
+  const html = `
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>${PRINT_TITLE}</title>
+    <style>
+      body {
+        margin: 0;
+        padding: 0;
+        font-family: "SimSun", serif;
+        color: #222;
+      }
+      .page {
+        width: 210mm;
+        min-height: 297mm;
+        margin: 0 auto;
+        padding: 8mm 7mm;
+        box-sizing: border-box;
+        page-break-after: always;
+      }
+      .page:last-child {
+        page-break-after: auto;
+      }
+      .grid {
+        display: grid;
+        grid-template-columns: repeat(3, 50mm);
+        grid-auto-rows: 40mm;
+        gap: 2mm;
+        justify-content: start;
+      }
+      .label-card {
+        border: 1px solid #ddd;
+        border-radius: 3mm;
+        padding: 1.8mm 2.2mm;
+        width: 50mm;
+        height: 40mm;
+        box-sizing: border-box;
+        display: grid;
+        grid-template-rows: auto auto auto auto 1fr;
+        row-gap: 0.9mm;
+      }
+      .line {
+        font-weight: 700;
+        line-height: 1.15;
+        word-break: break-all;
+        margin: 0;
+      }
+      .customer {
+        font-size: 4.0mm;
+      }
+      .order {
+        font-size: 5.0mm;
+        letter-spacing: 0;
+      }
+      .product {
+        font-size: 4.5mm;
+      }
+      .spec {
+        font-size: 5.0mm;
+        letter-spacing: 0;
+      }
+      .address {
+        font-size: 3.8mm;
+      }
+      @media print {
+        @page {
+          size: A4 portrait;
+          margin: 0;
+        }
+        .page {
+          width: 100%;
+          min-height: 0;
+          margin: 0;
+          padding: 8mm 7mm;
+        }
+      }
+    </style>
+  </head>
+  <body>
+    ${pages
+      .map(
+        (pageList) => `
+      <div class="page">
+        <div class="grid">
+          ${pageList.map((item) => renderLabelCard(item)).join("")}
+        </div>
+      </div>
+    `
+      )
+      .join("")}
+  </body>
+</html>`;
+
+  printWindow.document.write(html);
+  printWindow.document.close();
+  printWindow.onload = () => {
+    setTimeout(() => {
+      printWindow.focus();
+      printWindow.print();
+      printWindow.close();
+    }, 300);
+  };
+};

--
Gitblit v1.9.3