fix: 售后回流口径统一 — 状态双字段同步、工序名归一、标签配色

产品存在 overall_status 与 status 两个状态字段,此前各写入点各写一份映射、
甚至只改 overall_status 不改 status,导致回流设备(product.status 停留在
OUTBOUND)污染看板统计口径。

- lifecycle.py: 把映射表收敛为单一来源 overall_to_product_status /
  sync_product_status;新增 normalize_after_sales_step,将售后设备沿用生产
  阶段写法的历史工序名(测试/维修)折算到售后区独立工序名
- product_service.py: 删除本地 _OVERALL_TO_STATUS 副本,改用共享函数
- dashboard_service.py: WIP 矩阵补出 lifecycle_phase 列,活跃任务判定
  (is_active) 提前到所有终结态判定之前,避免残留 OUTBOUND 被误判为完结
- scripts/fix_product_status.py: 历史数据修复脚本(一次性)
- constants/task.ts: 售后工序标签由红色改紫色 —— 红色在本系统是「驳回/危险」
  语义色,售后只是另一条流转支线,用红色会让操作员误以为设备报错
This commit is contained in:
2026-09-15 10:57:29 +08:00
parent 31d085881b
commit f22eae315f
6 changed files with 216 additions and 28 deletions

View File

@ -112,17 +112,20 @@ export const STATUS_CONFIG: Record<string, StatusStyle> = {
ring: "ring-blue-400",
label: "维修",
},
// ---- 售后回流阶段专属工序(红系,与生产阶段一眼区分----
// ---- 售后回流阶段专属工序(紫系----
// 选紫色而非红色:红色在本系统里是「驳回 / 危险」的语义色,售后只是另一条
// 流转支线而非异常,用红色会让操作员误以为设备报错。也不选靛蓝——那已被
// 「已出库 OUTBOUND」占用两者相邻显示会混淆。
: {
bg: "bg-red-50",
text: "text-red-700",
ring: "ring-red-400",
bg: "bg-purple-50",
text: "text-purple-700",
ring: "ring-purple-300",
label: "发货测试",
},
: {
bg: "bg-red-50",
text: "text-red-700",
ring: "ring-red-400",
bg: "bg-purple-50",
text: "text-purple-700",
ring: "ring-purple-300",
label: "售后维修",
},
};
@ -230,9 +233,11 @@ export interface LifecycleBadge {
/**
* 生命周期标签 — 只在设备确实处于**售后回流环节**时返回:
* 生命周期为 AFTER_SALES 且当前工序是「发货测试」或「售后维修」
* → 底白字,文案即工序名。
* → 底白字,文案即工序名。
*
* 生产制造阶段一律返回 null不打标避免和售后设备混淆。
* 配色用紫色:红色在本系统是「驳回 / 危险」语义,售后只是另一条流转支线,
* 用红色会让操作员误以为设备报错。
*/
export function lifecycleBadge(
overallStatus: string | null | undefined,
@ -243,7 +248,7 @@ export function lifecycleBadge(
if (!AFTER_SALES_TAG_STEPS.has(step)) return null;
return {
label: step,
className: "bg-red-600 text-white ring-1 ring-red-600",
className: "bg-purple-600 text-white ring-1 ring-purple-600",
phase: LIFECYCLE_PHASE.AFTER_SALES,
};
}