Commit 7cfeb862 by luoqi

feat(web): 确认单重做 —— 逐条时效/删除/拖拽改派/移除客服,全部走 shadcn

产品走查:时效应该落到每一条召回计划;条目要能删、能拖给别的客服;客服要能移除;
整体用 shadcn 组件承载。

· 布局全部换成 shadcn:Card / Badge / Button / Select / AlertDialog。
· **时效逐条**:每条召回计划一个 1-7 天下拉,批次级那个只是"没单独设过的默认"。
  落库时只在与批次不同时带 expiresInDays(一样也带 = 把批次时效冻进每条,
  将来批次层面改时效就改不动这些单子了)。
· **单条删除** + **移除客服**(AlertDialog 二次确认,明说"他名下的条目一并移出本批")。
· **拖拽改派**:原生 HTML5 DnD( 不引 DnD 库),整个客服块都是投放区 ——
  展开后列表很长,只认标题行会让人反复试。拖过的落库时 assignStrategy 改成 **manual**,
  不改的话事后分析会把它算成算法的选择,而 T20 要反推的正是"算法选得准不准"。
· 所有展示改从**生效条目**派生(sheet.items − 删掉的 + 改派 + 逐条时效),
   不再直接用 sheet.byAgent —— 那是提案时的分组,拖过一条就对不上了。

🔴 修一个"改了不报错、但功能等于没有"的坑:助手窗 fixed z-[60],而 shadcn SelectContent
自带 z-50,Radix 会把 content 的 z 复制到 body 上那层 popper wrapper → 下拉渲染在助手窗
**底下**:listbox 确实打开了(DOM 里查得到)、但一个选项都看不见。实测才发现,已抬到 z-[70]
并写进教条(凡在助手窗里用 Radix 浮层都要抬 z)。

本地实测:删一条 → 薛玫 20→19 且在手 0→19;改一条时效 3→5 天只影响那一条;
下拉 1-7 天全部可见可选。989 tests green。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
parent 14ec24ec
...@@ -132,6 +132,32 @@ v1 **轻量**:不核销、不接宿主福利数据,福利就是**话术勾 ...@@ -132,6 +132,32 @@ v1 **轻量**:不核销、不接宿主福利数据,福利就是**话术勾
**确认单的患者明细必须给姓名 + 病历号,⛔ 不许只给 id 前缀。** **确认单的患者明细必须给姓名 + 病历号,⛔ 不许只给 id 前缀。**
主管展开客服看的就是"这 20 个人是谁",给一串 `#912e5dae` 等于让他对着十六进制猜(T14)。 主管展开客服看的就是"这 20 个人是谁",给一串 `#912e5dae` 等于让他对着十六进制猜(T14)。
### 确认单上能做什么(2026-08-03 定)
四件**局部**操作,判据是**要不要重跑服务端算法**:不要,才放到卡片上。
| 卡片上做 | 回对话做 |
|---|---|
| 逐条改时效(1-7 天) | 换人群(换治疗项 / 温度 / 画像条件) |
| 删掉某一条 | 改批次人数 N |
| 把某一条**拖**给别的客服 | 按客服设本批名额 `maxThisBatch` |
| 移除某个客服(连同他名下条目) | |
⚠️ 这不违 T13「微调只有两项」—— 那条防的是"卡片变成第二个筛选器"。
上面四件都是对**已经算好的结果**做局部修正,不产生新的人群、不重跑落人算法。
⚠️ 拖过的条目落库时 `assignStrategy` 改成 **`manual`**(主管指定)——
不改的话事后分析会把它算成算法的选择,而 T20 要反推的正是"算法选得准不准"。
⚠️ 移除客服 = **他名下的条目一并移出本批**(患者留在池子里,下批再说),
必须有二次确认并把这句话写在弹窗里 —— 否则主管以为只是把人从名单上划掉,
回头发现少了 20 个患者。要把这些人交给别人:先拖走,或回对话让助手重出一版。
> 🔴 **踩过的坑**:助手窗是 `fixed z-[60]`,而 shadcn 的 `SelectContent` 自带 `z-50`,
> Radix 会把 content 的 z-index **复制到 body 上那层 popper wrapper** ——
> 下拉以 z-50 渲染在助手窗**底下**:点了有反应(listbox 确实打开了)、但一个选项都看不见,
> **不报任何错**。凡是在助手窗里用 Radix 浮层,z 都要抬到 60 以上。
> **弯路一**:曾把「客服不能接别人的专属患者」做成**硬约束**(给不下就 unplaced)。 > **弯路一**:曾把「客服不能接别人的专属患者」做成**硬约束**(给不下就 unplaced)。
> 结果在上面那份数据下,「满」和「平」不可能同时成立 —— > 结果在上面那份数据下,「满」和「平」不可能同时成立 ——
> 严格齐平的上限是每人 9 条、一批只有 153 人,而那 755 个患者要几十批才轮得完。 > 严格齐平的上限是每人 9 条、一批只有 153 人,而那 755 个患者要几十批才轮得完。
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment