// 最终修复测试 console.log('=== 最终修复测试 ===\n'); // 模拟修复后的替换逻辑 function finalRobustReplace(template, variables, tenantId = 1) { let content = template; console.log(`[租户${tenantId}] 模板变量替换前:`, { templateContainsRemark: template.includes('{remark}'), templatePreview: template.substring(0, 100) + (template.length > 100 ? '...' : '') }); // 使用更健壮的替换方法,处理各种格式的占位符 for (const [key, value] of Object.entries(variables)) { // 处理多种格式的占位符:{key}、{ key }、{{key}}等 const patterns = [ `{${key}}`, // 标准格式 `{ ${key} }`, // 有空格 `{{${key}}}`, // 双大括号 `{{ ${key} }}`, // 双大括号有空格 `{${key} }`, // 右空格 `{ ${key}}`, // 左空格 ]; // 确保替换值不是null或undefined const safeValue = value != null ? String(value) : '无备注'; for (const pattern of patterns) { if (content.includes(pattern)) { content = content.split(pattern).join(safeValue); console.log(`[租户${tenantId}] 替换变量 ${key} (模式: ${pattern}): ${safeValue}`); } } } // 清理未替换的变量(特别是remark) // 使用正则表达式匹配各种格式的{remark} const remarkPatterns = [ /\{remark\}/g, /\{\s*remark\s*\}/g, /\{\{remark\}\}/g, /\{\{\s*remark\s*\}\}/g, ]; let hasUnreplacedRemark = false; for (const pattern of remarkPatterns) { if (pattern.test(content)) { hasUnreplacedRemark = true; const safeRemark = variables.remark != null ? String(variables.remark) : '无备注'; console.log(`[租户${tenantId}] 模板中仍有未替换的remark占位符(模式: ${pattern.source}),使用默认值替换`); content = content.replace(pattern, safeRemark); } } // 记录是否有未替换的remark if (hasUnreplacedRemark) { console.log(`[租户${tenantId}] 清理了未替换的remark占位符`); } console.log(`[租户${tenantId}] 模板变量替换后,是否还有{remark}:`, content.includes('{remark}') || content.includes('{ remark }')); return content; } // 测试实际场景 console.log('\n=== 实际场景测试 ==='); // 场景1: 数据库模板(备注1: {remark}) const dbTemplate = `订单号: {orderNo} 时间: {orderTime} 商品: {goodsList} 合计: {totalAmount} 备注1: {remark} 收货人姓名: {receiverName} 地址: {address} 联系电话: {phone}`; // 场景2: 实际打印模板(备注: {remark}) const printTemplate = `订单号: {orderNo} 时间: {orderTime} 商品: {goodsList} 合计: {payAmount} 备注: {remark} 收货人姓名: {receiverName} 地址: {address} 联系电话: {receiverPhone}`; const testVariables = { orderNo: 'ORD20251210112844577127', orderTime: '2025-12-10 19:28:44', goodsList: '洗护产品6 × 1 = ¥0.01', totalAmount: '¥0.01', payAmount: '¥0.01', remark: '测试备注', receiverName: '1', address: '1', phone: '13100000000', receiverPhone: '13100000000' }; console.log('\n1. 数据库模板测试:'); const result1 = finalRobustReplace(dbTemplate, testVariables); console.log('\n结果:'); console.log(result1); console.log('\n2. 打印模板测试:'); const result2 = finalRobustReplace(printTemplate, testVariables); console.log('\n结果:'); console.log(result2); console.log('\n3. 空备注测试:'); const emptyVars = { ...testVariables, remark: null }; const result3 = finalRobustReplace(printTemplate, emptyVars); console.log('\n结果:'); console.log(result3); console.log('\n4. 空字符串备注测试:'); const emptyStrVars = { ...testVariables, remark: '' }; const result4 = finalRobustReplace(printTemplate, emptyStrVars); console.log('\n结果:'); console.log(result4); console.log('\n5. 字符串"null"备注测试:'); const nullStrVars = { ...testVariables, remark: 'null' }; const result5 = finalRobustReplace(printTemplate, nullStrVars); console.log('\n结果:'); console.log(result5); // 检查实际数据库中的模板 console.log('\n\n=== 数据库模板分析 ==='); console.log('数据库模板:', dbTemplate); console.log('实际打印模板:', printTemplate); console.log('\n差异分析:'); console.log('1. 数据库: 备注1: {remark}'); console.log('2. 打印: 备注: {remark}'); console.log('\n可能的原因:'); console.log('1. 模板被代码修改了'); console.log('2. 有缓存机制'); console.log('3. 模板配置被更新了但代码用了旧版本');