fix(admin): 显式单号检索下,其它筛选不得把正在看的工单从实时补丁里删掉
## 修的是什么
实时补丁的判定链里,「状态 / 接单人员 / 日期范围」这些可证伪条件排在关键词护栏之前,
任一不成立就先返回 mismatch(允许删行),于是第 156 行那条「有关键词就不删行」的护栏
在带筛选时根本执行不到。
d6523635 只在 UI 侧补了一半:搜显式单号时清空 状态/赠送阶段/验收模式,
但**没清接单人员、分类、日期范围**,而 workerId 与 createdRange 同样会先返回 mismatch。
所以「单号 + 接单人员」或「单号 + 日期范围」仍会把行删掉。
实测(真实函数):
单号 + 状态筛选 -> mismatch(删行)
单号 + 接单人员筛选 -> mismatch(删行)
单号 + 日期范围 -> mismatch(删行)
## 修法
只对「显式单号检索」提前短路为 unknown(只原地更新,不插不移):
if (isExplicitOrderNoSearch(filters.keyword)) return 'unknown'
刻意**不**推翻既有设计:模糊关键词(产品名/昵称等)仍保留「状态可证伪即移除」的语义,
因此原来锁定该语义的用例继续通过。
顺带把 isExplicitOrderNoSearch 合并到 utils:此前面板与 AdminLayout 各有一份规则,
重复两份正是上次 tab 名单漏改那类问题的温床。
## 边界(重要)
**本次修复不覆盖「无任何其它筛选、只按单号搜索」的场景。**
实测该场景下判定本就是 unknown、行不会被删(状态原地更新、分页与统计一致),
因此线上反馈的「状态变化后搜不到、必须整页刷新」若发生在无筛选条件下,另有他因,尚未定位。
This commit is contained in:
@@ -99,12 +99,34 @@ function matchesCreatedRange(
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否为「显式单号检索」——工单号 / 平台单号 / 纯数字单号。
|
||||
*
|
||||
* 两处依赖它,必须保持一致,所以放在这里而不是面板内部:
|
||||
* 1. 面板搜索时据此清空排他的状态/阶段筛选(避免流转后单子脱靶);
|
||||
* 2. 实时补丁判定据此短路为「只原地更新」,绝不把正在看的单删掉。
|
||||
*/
|
||||
export function isExplicitOrderNoSearch(text: unknown): boolean {
|
||||
const trimmed = String(text || '').trim()
|
||||
if (!trimmed) return false
|
||||
return (
|
||||
/^WO[0-9a-zA-Z]{4,}$/i.test(trimmed) ||
|
||||
/^\d{6,}(-\d{6,})?$/.test(trimmed) ||
|
||||
/^OD[0-9a-zA-Z]{4,}$/i.test(trimmed)
|
||||
)
|
||||
}
|
||||
|
||||
export function evaluateAdminWorkOrderRealtimeMatch(
|
||||
snapshot: unknown,
|
||||
filters: AdminWorkOrderListFilters,
|
||||
): AdminWorkOrderRealtimeVerdict {
|
||||
if (!isRecord(snapshot)) return 'unknown'
|
||||
|
||||
// 显式单号检索要排在最前面:用户就是在找这一单,无论它流转到什么状态都必须留在视野里。
|
||||
// 只做原地更新,不插入也不移除 —— 否则状态流转(或前端对状态/接单人员/日期口径的复刻偏差)
|
||||
// 会把正在看的单从结果里删掉,表现为「状态一变就搜不到,必须整页刷新」(生产已复现)。
|
||||
if (isExplicitOrderNoSearch(filters.keyword)) return 'unknown'
|
||||
|
||||
// 先跑所有「可以证伪」的条件:任何一条不满足就是明确的 mismatch(允许从列表移除)
|
||||
//
|
||||
// 状态必须用 rawStatus 比:快照的 `status` 是运营态(拼单母单 open 有份额时会被显示成
|
||||
@@ -151,6 +173,7 @@ export function evaluateAdminWorkOrderRealtimeMatch(
|
||||
// - 赠送阶段:gift_ready 是"冷却到点"的实时阶段,含 NOW() 判定;
|
||||
// - 打手等级:只在服务端按接单人与拼单参与者计算;
|
||||
// - VIP 待补图:混在状态列表里的虚拟值,判定依赖 acceptance_json 多个字段与 NOW()。
|
||||
// 注:显式单号检索已在函数开头短路,走不到这里。
|
||||
if (filters.acceptanceMode) return 'unknown'
|
||||
if (vipEvidencePendingActive) return 'unknown'
|
||||
if (filters.keyword) return 'unknown'
|
||||
|
||||
Reference in New Issue
Block a user