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 ++++++++++++++++++++++++----------------------
src/api/salesManagement/salesLedger.js | 8 ++
src/views/salesManagement/salesLedger/index.vue | 7 +-
3 files changed, 85 insertions(+), 70 deletions(-)
diff --git a/src/api/salesManagement/salesLedger.js b/src/api/salesManagement/salesLedger.js
index 0f176c8..b421177 100644
--- a/src/api/salesManagement/salesLedger.js
+++ b/src/api/salesManagement/salesLedger.js
@@ -178,6 +178,14 @@
});
}
+// 鎵撳嵃閿�鍞鍗�
+export function getSalesOrder(salesLedgerId) {
+ return request({
+ url: `/sales/ledger/salesOrders/${salesLedgerId}`,
+ method: "get",
+ });
+}
+
// 鎵撳嵃閿�鍞彂璐у崟
export function getSalesInvoices(query) {
const data =
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>
`
: ""
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 08b9b34..badc47c 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -892,6 +892,7 @@
saleProcessBind,
getSaleProcessBindInfo,
getProcessCard,
+ getSalesOrder,
getSalesInvoices,
} from "@/api/salesManagement/salesLedger.js";
import { modelList, productTreeList } from "@/api/basicData/product.js";
@@ -2089,9 +2090,9 @@
proxy.$modal.loading(loadingText);
try {
if (command === "salesOrder") {
- const res = await getProcessCard(selectedId);
- const processCardData = res?.data ?? {};
- printSalesOrder(processCardData);
+ const res = await getSalesOrder(selectedId);
+ const salesOrderData = res?.data ?? {};
+ printSalesOrder(salesOrderData);
} else {
const res = await getProcessCard(selectedId);
const processCardData = res?.data ?? {};
--
Gitblit v1.9.3