From b078245fbcc81c13c2842ad3f0f98318a0ae4943 Mon Sep 17 00:00:00 2001 From: zlwu Date: Sat, 5 Sep 2026 14:42:44 +0800 Subject: [PATCH] feat(web-admin): generate contract DOCX blob from prepared HTML Co-authored-by: Cursor --- .../src/utils/crm/contract-html-to-docx.ts | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/web-admin/src/utils/crm/contract-html-to-docx.ts b/web-admin/src/utils/crm/contract-html-to-docx.ts index 61337b082..35a73e7c1 100644 --- a/web-admin/src/utils/crm/contract-html-to-docx.ts +++ b/web-admin/src/utils/crm/contract-html-to-docx.ts @@ -1,5 +1,33 @@ /** 合同打印弹窗:HTML → DOCX 预处理与生成 */ +import HTMLtoDOCX from '@turbodocx/html-to-docx' + +const DOCX_MIME = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' + +/** + * 将已预处理的合同 HTML 转为 DOCX Blob(浏览器下载用)。 + * 调用方须先执行 prepareContractHtmlForDocx。 + */ +export async function generateContractDocxBlob( + preparedHtml: string, + title?: string +): Promise { + const fullHtml = `${preparedHtml}` + const result = await HTMLtoDOCX(fullHtml, null, { + orientation: 'portrait', + title: title || '合同', + margins: { + top: 720, + right: 720, + bottom: 720, + left: 720 + } + }) + + if (result instanceof Blob) return result + return new Blob([result as ArrayBuffer], { type: DOCX_MIME }) +} + export function parseContractSupplierCode(contractNo?: string | null): string { if (!contractNo) return 'SX' const match = String(contractNo).match(/^([A-Z]+)\/X-JT/)