domestic-product-development.component.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <section class="framework-page">
  2. @if (loading) {
  3. <div class="framework-state"><app-loading-spinner size="lg" text="正在加载新品开发框架..."></app-loading-spinner></div>
  4. } @else if (error) {
  5. <div class="framework-state"><app-error-state [description]="error"></app-error-state></div>
  6. } @else if (dataset && summary) {
  7. <app-page-header
  8. [title]="title"
  9. eyebrow="Product Development"
  10. [description]="description"
  11. icon="△"
  12. [badges]="[{ label: '国内通用框架', tone: 'blue' }, { label: dataset.summary.reviewCount ? 'VOC 已接入' : 'VOC 待接入', tone: dataset.summary.reviewCount ? 'green' : 'amber' }]"
  13. [meta]="[{ label: '案例', value: dataset.caseName }, { label: '商品', value: dataset.summary.metricProducts }, { label: '竞品关系', value: dataset.summary.relations }]">
  14. </app-page-header>
  15. <app-board-tabs class="framework-tabs" [tabs]="tabs" [activeKey]="section" density="compact"></app-board-tabs>
  16. @if (section === 'definition' || section === 'lifecycle') {
  17. <div class="context-strip"><app-voc-product-picker></app-voc-product-picker></div>
  18. }
  19. @if (section === 'trend') {
  20. <div class="metric-grid">
  21. <app-summary-metric-card label="成交金额" [value]="currency(summary.gmv)" icon="¥" tone="blue" [description]="dataset.dailyTotals.length + ' 天经营周期'"></app-summary-metric-card>
  22. <app-summary-metric-card label="经营商品" [value]="number(dataset.summary.metricProducts)" icon="□" tone="green" [description]="dataset.summary.category2Count + ' 个二级类目'"></app-summary-metric-card>
  23. <app-summary-metric-card label="成交件数" [value]="number(summary.soldUnits)" icon="▣" tone="purple" [description]="number(summary.transactionOrders) + ' 笔订单'"></app-summary-metric-card>
  24. <app-summary-metric-card label="竞品关系" [value]="number(dataset.summary.relations)" icon="↔" tone="amber" [description]="dataset.summary.uniqueCompetitorProducts + ' 个唯一竞品'"></app-summary-metric-card>
  25. </div>
  26. <div class="two-column">
  27. <app-content-card title="类目经营信号" subtitle="成交金额与退款金额,仅代表当前数据周期" tone="blue">
  28. <div echarts class="chart" [options]="categoryOptions"></div>
  29. </app-content-card>
  30. <app-content-card title="类目机会观察" subtitle="按当前成交金额排序" tone="green">
  31. <div class="rank-list">
  32. @for (item of categories.slice(0, 6); track item.category) {
  33. <div class="rank-row"><div class="rank-copy"><strong>{{ item.category }}</strong><span>{{ item.productCount }} 个商品 · 转化 {{ percent(item.conversionRate) }}</span></div><span class="rank-value">{{ currency(item.gmv) }}</span></div>
  34. }
  35. </div>
  36. </app-content-card>
  37. </div>
  38. <app-data-table-shell title="成交商品表现" subtitle="用于识别当前周期的重点商品,不代表新品生命周期" [count]="topProducts.length">
  39. <table class="data-table"><thead><tr><th class="product-cell">商品</th><th>类目</th><th>成交金额</th><th>成交件数</th><th>转化率</th></tr></thead><tbody>
  40. @for (product of topProducts; track product.productId) {
  41. <tr><td class="product-cell"><app-product-identity [title]="product.title" [asin]="product.productId" [productSku]="product.model" [showImage]="false" size="xs" [detailRoute]="['/voc-insight/detail']" [detailQueryParams]="{ productId: product.productId }"></app-product-identity></td><td>{{ product.category2 || product.category1 }}</td><td>{{ currency(product.summary.gmv) }}</td><td>{{ number(product.summary.soldUnits) }}</td><td>{{ percent(product.summary.conversionRate) }}</td></tr>
  42. }
  43. </tbody></table>
  44. </app-data-table-shell>
  45. }
  46. @if (section === 'requirement') {
  47. <div class="metric-grid">
  48. <app-summary-metric-card label="评论样本" [value]="dataset.summary.reviewCount" icon="▤" tone="default" description="需求原声来源"></app-summary-metric-card>
  49. <app-summary-metric-card label="需求主题" value="-" icon="◉" tone="purple" description="等待评论主题"></app-summary-metric-card>
  50. <app-summary-metric-card label="未满足需求" value="-" icon="!" tone="amber" description="等待痛点证据"></app-summary-metric-card>
  51. <app-summary-metric-card label="使用场景" value="-" icon="⌖" tone="blue" description="等待场景原声"></app-summary-metric-card>
  52. </div>
  53. <app-alert-card title="需求挖掘框架已迁入,当前没有用户原声" description="经营指标可以反映销售和转化,但不能替代用户需求、场景或痛点证据。" primaryMetric="0 条评论" icon="!" tone="amber"></app-alert-card>
  54. <div class="two-column equal-column">
  55. <app-content-card title="显性需求" subtitle="用户明确提出的功能、规格和体验要求" variant="dashed" tone="blue"><app-empty-state variant="low-sample" title="暂无显性需求样本" description="接入评论正文后展示需求主题、频次和代表性原声。"></app-empty-state></app-content-card>
  56. <app-content-card title="隐性需求与机会" subtitle="从痛点、场景和期望差中提炼" variant="dashed" tone="purple"><app-empty-state title="暂无隐性需求证据" description="当前不根据经营数据猜测用户需求。"></app-empty-state></app-content-card>
  57. </div>
  58. }
  59. @if (section === 'benchmark') {
  60. <div class="metric-grid">
  61. <app-summary-metric-card label="已映射本品" [value]="number(dataset.mappingGroups.length)" icon="□" tone="blue" description="存在竞品配置的自营商品"></app-summary-metric-card>
  62. <app-summary-metric-card label="竞品关系" [value]="number(dataset.summary.relations)" icon="↔" tone="green" description="有效商品关系"></app-summary-metric-card>
  63. <app-summary-metric-card label="唯一竞品" [value]="number(dataset.summary.uniqueCompetitorProducts)" icon="◇" tone="purple" description="去重竞品商品"></app-summary-metric-card>
  64. <app-summary-metric-card label="缺失竞品" [value]="number(dataset.quality.mappingsWithoutCompetitor.length)" icon="!" [tone]="dataset.quality.mappingsWithoutCompetitor.length ? 'amber' : 'green'" description="映射质量检查"></app-summary-metric-card>
  65. </div>
  66. <app-data-table-shell title="竞品对标清单" subtitle="保留原竞品对标框架,当前展示已核验的商品关系" [count]="benchmarkGroups.length">
  67. <table class="data-table"><thead><tr><th>本品型号</th><th>本品商品ID</th><th>对标类目</th><th>竞品品牌</th><th>竞品数</th></tr></thead><tbody>
  68. @for (group of benchmarkGroups; track group.ownProductId) {
  69. <tr><td><strong>{{ group.model || '-' }}</strong></td><td>{{ group.ownProductId }}</td><td>{{ group.category }}</td><td>{{ relationBrands(group) }}</td><td>{{ group.competitors.length }}</td></tr>
  70. }
  71. </tbody></table>
  72. </app-data-table-shell>
  73. }
  74. @if (section === 'definition' && selectedProduct) {
  75. <div class="metric-grid">
  76. <app-summary-metric-card label="平均成交单价" [value]="currency(selectedProduct.summary.averageUnitPrice)" icon="¥" tone="blue" description="当前周期"></app-summary-metric-card>
  77. <app-summary-metric-card label="成交件数" [value]="number(selectedProduct.summary.soldUnits)" icon="▣" tone="green" description="真实经营数据"></app-summary-metric-card>
  78. <app-summary-metric-card label="访客转化率" [value]="percent(selectedProduct.summary.conversionRate)" icon="◎" tone="purple" description="成交客户 / 访客"></app-summary-metric-card>
  79. <app-summary-metric-card label="退款金额占比" [value]="percent(selectedProduct.summary.refundToGmvRate)" icon="↩" [tone]="selectedProduct.summary.refundToGmvRate >= 0.12 ? 'red' : 'amber'" description="退款金额 / 成交金额"></app-summary-metric-card>
  80. </div>
  81. <div class="two-column equal-column">
  82. <app-content-card title="产品定义底稿" subtitle="来自标准商品身份与类目数据" tone="blue">
  83. <app-product-identity [title]="selectedProduct.title" [asin]="selectedProduct.productId" [productSku]="selectedProduct.model" [subtitle]="selectedProduct.category3 || selectedProduct.category2" [showImage]="false" size="md"></app-product-identity>
  84. <div class="info-list">
  85. <div class="info-row"><div class="info-copy"><strong>品牌</strong><span>产品归属</span></div><span class="info-value">{{ selectedProduct.brand }}</span></div>
  86. <div class="info-row"><div class="info-copy"><strong>二级类目</strong><span>产品线</span></div><span class="info-value">{{ selectedProduct.category2 || '-' }}</span></div>
  87. <div class="info-row"><div class="info-copy"><strong>三级类目</strong><span>细分类目</span></div><span class="info-value">{{ selectedProduct.category3 || '-' }}</span></div>
  88. <div class="info-row"><div class="info-copy"><strong>竞品关系</strong><span>当前对标覆盖</span></div><span class="info-value">{{ selectedProduct.relationCount }} 条</span></div>
  89. </div>
  90. </app-content-card>
  91. <app-content-card title="VOC 定义输入" subtitle="需要评论证据才能补充的定义字段" variant="dashed" tone="amber">
  92. <app-empty-state variant="low-sample" title="暂无用户需求输入" description="卖点优先级、功能满意度、场景和痛点需在评论接入后补齐。"></app-empty-state>
  93. </app-content-card>
  94. </div>
  95. }
  96. @if (section === 'lifecycle' && selectedProduct) {
  97. <div class="metric-grid">
  98. <app-summary-metric-card label="周期成交金额" [value]="currency(selectedProduct.summary.gmv)" icon="¥" tone="blue" [description]="selectedProduct.trend.length + ' 个日度点'"></app-summary-metric-card>
  99. <app-summary-metric-card label="周期成交件数" [value]="number(selectedProduct.summary.soldUnits)" icon="▣" tone="green" description="当前数据周期"></app-summary-metric-card>
  100. <app-summary-metric-card label="退款金额" [value]="currency(selectedProduct.summary.refundAmount)" icon="↩" tone="amber" [description]="percent(selectedProduct.summary.refundToGmvRate) + ' 成交金额占比'"></app-summary-metric-card>
  101. <app-summary-metric-card label="评论样本" [value]="dataset.summary.reviewCount" icon="▤" tone="default" description="生命周期 VOC 证据"></app-summary-metric-card>
  102. </div>
  103. <app-alert-card title="当前仅支持短周期经营复盘" description="数据覆盖 2026-07-14 至 2026-07-20,不能据此判断完整上市、增长、成熟或衰退阶段。" [primaryMetric]="selectedProduct.model || selectedProduct.productId" icon="i" tone="blue"></app-alert-card>
  104. <app-content-card title="单商品周期趋势" subtitle="成交金额与成交件数" tone="blue"><div echarts class="chart" [options]="lifecycleOptions"></div></app-content-card>
  105. }
  106. }
  107. </section>