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("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll('"', """)
+ .replaceAll("'", "'");
+
+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