/* 独立报告视图:页面只负责渲染 JSON,不在 Python 中拼接 HTML。 */ const esc = v => String(v ?? '').replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); const arr = v => Array.isArray(v) ? v : []; const text = (v, keys=['value','label','headline','note','insight','action','name']) => { if (Array.isArray(v)) return v.map(x => text(x, keys)).filter(Boolean).join(' · '); if (typeof v === 'string' || typeof v === 'number') return String(v); if (v && typeof v === 'object') for (const k of keys) if (v[k] != null && v[k] !== '') return text(v[k], keys); return ''; }; function cards(items, fields=['headline','note']) { return arr(items).map(x => `

${esc(text(x,['label','name','type']))}

${fields.map(k=>text(x,[k])).filter(Boolean).map(v=>`

${esc(v)}

`).join('')}
`).join(''); } function images(data, group, limit=8) { const list = arr(data.evidenceLedger).filter(e => e?.type === 'image' && e?.meta?.group === group).slice(0,limit); return list.map(e => `
商品${esc(group)}
${esc(e.id)}
`).join('') || '

未采集

'; } function section(id, title, body) { return `

${esc(title)}

${body}
`; } async function main() { const q = new URLSearchParams(location.search); const source = window.REPORT_DATA || q.get('data'); if (!source) throw new Error('缺少 data 参数'); const data = await fetch(source).then(r => r.json()); const exp = data.experienceSolution || {}; const raw = data.facts || {}; const p = raw.product || {}; const s = raw.sales || {}; const summary = exp.reportSummary || {}; document.title = summary.title || p.title || '商品开品分析报告'; const owner = exp.ownerOverview?.cards || []; const plans = exp.newProductPlans?.plans || []; const title = exp.titleAnalysis || {}; const visual = exp.visualCommerce || {}; const detail = exp.detailCommerce || {}; document.getElementById('app').innerHTML = `
PRODUCT DECISION REPORT · JSON VIEW

${esc(summary.title || p.title || '商品分析报告')}

${esc(summary.verdict || '')}

价格 ${esc(s.currentPrice || '未采集')} · 评论 ${esc(data.baseline?.reviewCount || 0)}
${section('decision','老板速览',`
${cards(owner)}
`)}${section('plan','下一款方向',`
${cards(plans,['sourceType','whyThisPlan','productAction','pageAction'])}
`)}${section('title','标题表达',`

${esc(title.professionalOpinion || '')}

`)}${section('main','主图在卖什么',`
${cards(visual.items,['imageRole','visualSignals','nextAction'])}
`)}${section('detail','详情页证明什么',`
${cards(detail.contentGroups,['type','visualSignals','nextAction'])}
`)}${section('sku','SKU怎么选',`

${esc(exp.skuAnalysis?.professionalOpinion || '')}

${cards(exp.skuAnalysis?.selectionDimensions,['name','values','evidenceIds'])}`)}${section('review','消费者实际感受到什么',`${cards(exp.customerExperience?.consumerInsights?.experienceSignals,['type','insight'])}`)}`; } main().catch(e => { document.getElementById('app').innerHTML = `

报告加载失败:${esc(e.message)}

`; });