const PRINT_TITLE = "销售发货单"; const escapeHtml = (value) => String(value ?? "") .replaceAll("&", "&") .replaceAll("<", "<") .replaceAll(">", ">") .replaceAll('"', """) .replaceAll("'", "'"); const toNumber = (value) => { const num = Number(value); return Number.isFinite(num) ? num : 0; }; const formatDisplayDate = (value) => { if (!value) return ""; const date = new Date(value); if (Number.isNaN(date.getTime())) return String(value); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); const day = String(date.getDate()).padStart(2, "0"); return `${year}/${month}/${day}`; }; const getItemArea = (item) => toNumber(item?.area || item?.settleTotalArea || item?.actualTotalArea); const getOrderNo = (data, row, item) => item?.salesContractNo || item?.orderNo || data?.salesContractNo || row?.salesContractNo || ""; const splitItemsByPage = (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 normalizeInvoiceData = (raw, selectedRow) => { const data = raw ?? {}; const groups = Array.isArray(data.groups) ? data.groups : []; if (!groups.length) return data; const items = groups.flatMap((group) => (Array.isArray(group?.items) ? group.items : []).map((item) => ({ ...item, productDescription: group?.productName || item?.productDescription || "", salesContractNo: group?.salesContractNo || item?.salesContractNo || "", widthHeight: item?.widthHeight || "", })) ); return { ...data, items, customerName: data.customerName || selectedRow?.customerName || "", contactPerson: data.contactPerson || selectedRow?.contactPerson || "", contactPhone: data.contactPhone || selectedRow?.contactPhone || "", deliveryAddress: data.companyAddress || data.deliveryAddress || data.shippingAddress || selectedRow?.deliveryAddress || "", shipmentNo: data.externalOrderNo || data.shipmentNo || "", register: data.orderMaker || data.register || selectedRow?.entryPersonName || "", registerDate: data.executionDate || data.registerDate || data.entryDate || selectedRow?.entryDate || "", }; }; const groupByProduct = (items, data, row) => { const list = Array.isArray(items) ? items : []; const map = new Map(); list.forEach((item) => { const key = `${item?.productDescription || ""}__${getOrderNo(data, row, item)}`; if (!map.has(key)) { map.set(key, { productName: item?.productDescription || "", orderNo: getOrderNo(data, row, item), items: [], }); } map.get(key).items.push(item); }); return Array.from(map.values()); }; const renderItemRows = (items, startIndex) => items .map((item, idx) => { const sizeText = item?.widthHeight ? escapeHtml(item.widthHeight) : item?.width || item?.height ? `${escapeHtml(item?.width)} * ${escapeHtml(item?.height)}` : ""; return `
| 客户名称: ${escapeHtml(data.customerName || selectedRow.customerName || "")} | 联系人: ${escapeHtml(data.contactPerson || selectedRow.contactPerson || "")} | |||||
| 发货地址: ${escapeHtml(data.deliveryAddress || data.shippingAddress || selectedRow.deliveryAddress || "")} | 联系电话: ${escapeHtml(data.contactPhone || selectedRow.contactPhone || "")} | |||||
| 序号 | 楼层编号 | 宽(弧长)*高 | 数量 | 面积 | 备注 | 加工要求 |
|---|---|---|---|---|---|---|
| 产品名称: ${escapeHtml(group.productName)} | 订单编号: ${escapeHtml(group.orderNo)} | |||||
| 小计: | ${subQty || ""} | ${subArea ? subArea.toFixed(2) : ""} | ||||
| 暂无明细 | ||||||
| 合计: | ${totalQty || ""} | ${totalArea ? totalArea.toFixed(2) : ""} | ||||