# 备货状态模式（2026-07-28）

## 问题

无物流单号的订单在订单管理 Tab 中状态为空白/unknown，无法区分"刚创建还未发货"和"超期未发货"。

## 方案

前端根据创建时间计算天数，分段标记：

| 距创建天数 | 标签 | 颜色 | CSS class |
|-----------|------|------|-----------|
| ≤3 | 🟢 备货中 | 绿 #0d904f | `prep` |
| 4~5 | 🟡 备货预警(N天) | 黄 var(--warn) | `prep-warn` |
| 6~7 | 🟠 备货超期(N天) | 橙 #e37400 | `prep-overdue` |
| >7 | 🔴 严重超期(N天) | 红 var(--bad) | `prep-critical` |

## 实现

### CSS
```css
.shipment-status-dot.prep { background: #0d904f; }
.shipment-status-dot.prep-warn { background: var(--warn); }
.shipment-status-dot.prep-overdue { background: #e37400; }
.shipment-status-dot.prep-critical { background: var(--bad); }
```

### daysSince helper
```javascript
function daysSince(d, today) {
  if (!d) return 999;
  var t = new Date(today);
  var od = new Date(d);
  return Math.floor((t - od) / (1000 * 60 * 60 * 24));
}
```

### 表格渲染
```javascript
var trackingNo = o.trackingNo || '';
if (!trackingNo) {
  var days = daysSince(o.createDate, todayStr);
  if (days <= 3) { stClass = 'prep'; statusLabel = '🟢 备货中'; }
  else if (days <= 5) { stClass = 'prep-warn'; statusLabel = '🟡 备货预警('+days+'天)'; }
  else if (days <= 7) { stClass = 'prep-overdue'; statusLabel = '🟠 备货超期('+days+'天)'; }
  else { stClass = 'prep-critical'; statusLabel = '🔴 严重超期('+days+'天)'; }
}
```

### 统计卡片
```javascript
var prepStats = { prep: 0, prepWarn: 0, prepOverdue: 0, prepCritical: 0 };
periodOrders.forEach(function(o) {
  if (!o.trackingNo) {
    var days = daysSince(o.createDate, todayStr);
    if (days <= 3) prepStats.prep++;
    else if (days <= 5) prepStats.prepWarn++;
    else if (days <= 7) prepStats.prepOverdue++;
    else prepStats.prepCritical++;
  }
});
```

## 关键限制

- MCP 销售订单**没有**「计划发货日期」字段（搜索过发货/计划/交付/货期/交期/预计，89个字段中均不存在）
- 因此用创建时间+固定天数作为近似
- 无物流单号的订单才显示备货状态，有物流的保持顺丰轨迹状态
