소스 검색

style: 移除驾驶舱的零单药丸条,零单归类并入 AI 经营解读

- 驾驶舱不再展示 158 个零单店次的长条,避免刷屏
- AI 提示词要求:零单存在时必须按原因归类汇总(未开业/闭店/无曝光/无进店/无转化各多少店次),并点明哪一类需要运营介入
- 诊断数据仍保留在 /api/ops/dashboard 与经营报告中(告警/行动计划使用)
liangzhao 2 주 전
부모
커밋
ee12aac56f
3개의 변경된 파일과 1개의 추가작업 그리고 32개의 파일을 삭제
  1. 0 22
      public/cockpit.js
  2. 0 9
      public/style.css
  3. 1 1
      server/routes/ops.js

+ 0 - 22
public/cockpit.js

@@ -99,7 +99,6 @@
         <div class="ckpt-ai-body" id="ckptAiBody">点击「生成解读」,模型会根据当前筛选范围的数据给出结论与建议。</div>
       </section>
       <div class="ckpt-kpis" id="ckptKpis"></div>
-      <div class="ckpt-zero" id="ckptZero" hidden></div>
       <div class="ckpt-grid">
         <section class="ckpt-card"><div class="ckpt-card-head"><h3>营业额 / 订单趋势</h3><span id="ckptTrendNote"></span></div><div class="ckpt-chart" id="ckptTrend"></div></section>
         <section class="ckpt-card"><div class="ckpt-card-head"><h3>门店营业额 Top 10</h3><span></span></div><div class="ckpt-chart" id="ckptRank"></div></section>
@@ -181,26 +180,6 @@
     }).join('');
   }
 
-  function renderZeroOrder(data) {
-    const box = $('ckptZero');
-    if (!box) return;
-    const items = data.zeroOrder || [];
-    if (!items.length) {
-      box.hidden = true;
-      box.innerHTML = '';
-      return;
-    }
-    const chips = items.map((item) => {
-      const tone = item.reason === 'no-conversion' ? 'warn'
-        : item.reason === 'no-visit' || item.reason === 'no-traffic' ? 'info' : 'muted';
-      return `<span class="ckpt-zero-chip ${tone}" title="${esc(item.reasonText)}">
-        <b>${shortDate(item.date)} ${esc(item.shopName)}</b>${esc(item.reasonText)}
-      </span>`;
-    }).join('');
-    box.hidden = false;
-    box.innerHTML = `<span class="ckpt-zero-label">零单诊断 ${items.length} 店次</span>${chips}`;
-  }
-
   function renderTrend(data) {
     const chart = state.charts.trend;
     const dates = data.trend.map((t) => shortDate(t.date));
@@ -378,7 +357,6 @@
         $('ckptFrom').value = ymdToInput(state.from);
         $('ckptTo').value = ymdToInput(state.to);
         renderKpis(body.kpis);
-        renderZeroOrder(body);
         renderTrend(body);
         renderRanking(body);
         renderFunnel(body);

+ 0 - 9
public/style.css

@@ -1381,15 +1381,6 @@ main.content { padding: var(--page-padding-y) var(--page-padding-x) var(--page-p
 .ckpt-ai-loading { color: var(--text-3); }
 .ckpt-ai-error { color: #c0392b; }
 
-/* 驾驶舱 · 零单诊断 */
-.ckpt-zero { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: -2px 0 14px; }
-.ckpt-zero-label { font-size: 11.5px; color: var(--text-3); }
-.ckpt-zero-chip { display: inline-flex; align-items: baseline; gap: 6px; padding: 4px 9px; font-size: 11.5px; color: var(--text-2); background: var(--bg); border: 1px solid var(--border); border-radius: 999px; }
-.ckpt-zero-chip b { font-weight: 600; color: var(--text); }
-.ckpt-zero-chip.warn { border-color: rgba(255, 107, 53, 0.35); background: #fff5ef; }
-.ckpt-zero-chip.info { border-color: #cfe0ef; background: #f3f8fc; }
-.ckpt-zero-chip.muted { color: var(--text-3); }
-
 /* ── 经营报告 ─────────────────────────────────────────── */
 .rp-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
 .rp-tabs { display: inline-flex; padding: 3px; background: var(--bg); border: 1px solid var(--border); border-radius: 10px; }

+ 1 - 1
server/routes/ops.js

@@ -475,7 +475,7 @@ const INSIGHT_SYSTEM_PROMPT = [
   '2. 必须引用 JSON 里的具体数字(金额保留两位小数、人数/单量用整数、比率用百分比);',
   '3. 指出风险(下滑、零单门店、成本占比高、漏斗转化偏低等),并给一句可执行建议;',
   '4. 数据不足(如 prev 为 null、只有 1 天)就直接说明,不要编造;',
-  '5. 说到零单门店时,必须引用 zeroOrder[].reasonText 的具体原因(未开业/闭店/无曝光/无进店/无转化),不要笼统说「零单门店」;',
+  '5. 若 zeroOrder 非空,必须用一条要点按原因归类汇总(未开业/闭店/无曝光/无进店/无转化各多少店次),并点明哪一类需要运营介入;不要笼统说「零单门店」;',
   '6. 每条不超过 60 字,不要输出 JSON、标题或前后缀。',
 ].join('\n');