跳转至

ISSUE-0083:HTTP 列对已采行显示 "-" 让用户误以为未采

现象

用户截图(v0.10.119)官网列表:

状态 HTTP 网址
已完成 - https://www.webbwellnesscenter.com/
已完成 - https://www.genevawoodsbirthcenter.com/
已完成 ✓已采 http://www.alaskaspca.org/

用户问:"有邮箱也有手机,HTTP 下边什么都没?HTTP 这一列啥意思呢?"

根因 — page-log 5000 条环形淘汰

data-view.tsx HTTP 列:

renderCell: ({ row }) => {
  const log = websiteLogMap.get(row.website.toLowerCase());
  if (log?.error) return <Chip mstage 标签 />;
  if (log?.status != null) return <Chip HTTP 状态码 />;
  return <span>-</span>;   // ← log 缺失 = "-"
}

page-log5000 条环形 buffer(page-log.ts:5000)。超过后老记录被淘汰。

但 row.scrape_status=2 仍然表示真采过(持久在 MapTaskData 表里)。 - 老采的行:page-log 被淘汰 → HTTP 列空 → 显示 "-" - 新采的行:page-log 在 → HTTP chip 显示 mstage:success 等

用户看到「状态=已完成 + HTTP=-」误以为没采,本质是 UI 列维度一致性 同款问题: - 状态列看 row 字段(持久) - HTTP 列看 page-log(环形淘汰)

修复(v0.10.120)

if (log?.error) return <chip mstage />;
if (log?.status != null) return <chip status />;
// v0.10.120:log 缺失但 row.scrape_status=2 → 灰 ✓ + tooltip
if (row.scrape_status === 2) {
  return (
    <Tooltip title="已采过此网站;详细日志已被环形 buffer 淘汰(保留最近 5000 条)">
      <Chip label="✓" sx={{ color: 'text.secondary', bgcolor: 'action.hover' }} />
    </Tooltip>
  );
}
return (
  <Tooltip title="此网站还未被采集(待采集状态)">
    <span style={{ color: '#aaa' }}>-</span>
  </Tooltip>
);

3 级降级: 1. 有 log → 显示 mstage chip / HTTP status chip 2. 无 log + row.scrape_status=2 → 灰 ✓(已采但日志过期) 3. 无 log + 其他 status → "-"(未采)

每种情况都有 tooltip 说明,不再让用户疑惑。

教训

  • UI 列必须兜底处理"信号缺失" — 不能只显示空让用户猜
  • environment 数据(page-log 环形)+ 持久数据(row 字段)混搭ISSUE-0075/0076 信号维度 同款家族
  • 降级链要完整:A → fallback B → fallback C → 终态,每级都有 tooltip 说明
  • 把这条加进 ui-column-dimension-consistency.md:跨维度兜底兜底再兜底