Commit da078f8c by luoqi

docs(站点)+fix(措辞): 选人/分人画成两个各自闭合的环;「无主」统一改成「无专属」

**① 决策树的缺陷(产品指出)**:原图把两个阶段的调整并成了**一个环** ——
「选人 → 分人 → 统一问一次要不要改」。这抹掉了两件事:
  · 「选人定下来」这个关口不见了 —— 图上看不出"人先定,才轮到怎么分";
  · **两种调整的代价被画成一样的** —— 实际上改选人是**整版重出、连已经排好的
    分法一并作废**,改分人只在这一版上动、人不变。
⇒ 改成两个各自闭合的环,中间用粗箭头标出「人定了 —— 这一关过了才谈怎么分」,
  并配一张表把代价差写死。顺序不能颠倒:先排分法再让他改人群,那趟排班就白做了。

**② 用词统一(产品指出)**:「无主」→「无专属」。
️ 界面上的按钮文案**本来就是**「换无专属客服的患者补上」,而这三处模型会照着念给
  主管听的文本还写着「无主」—— 两处不一致,他会以为是两拨人:
    · assignment-facts 的「落人规则」(modelFacts,模型常原样引用)
    · assistant-prompts / lab.controller 的落人规则那一句
    · assignment.controller 里「换无主患者补上」的工具描述
   纯措辞替换,不动语义。代码注释里的「无主」没动(内部行话,不进主管视野)。

1296 个测试全绿;mermaid 节点引用与 style 目标均无悬空。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
parent 0b0acba4
......@@ -22,39 +22,44 @@ flowchart TD
A1["① 选人 · 主管初选<br/>1 做哪一类还没启动的治疗<br/>2 找多久没来的人<br/>—— 凭运营经验,他张口就来"] --> A2
A2["① 选人 · 助手精选<br/>3 要不要只挑高价值的 —— 先摆这批人的全景<br/>4 团队还吃得下多少 —— 先摆在岗人手与在手量<br/>—— 数据摆出来,顺手给出一版方案"]
A2["① 选人 · 助手精选<br/>3 要不要只挑高价值的 —— 先摆这批人的全景<br/>4 团队还吃得下多少 —— 先摆在岗人手与在手量<br/>出一版:这批是谁、多大"]
A2 --> B["② 分人 —— 谁去打<br/>有专属的回自己人手上<br/>无主的给当前手上最少的<br/>专属这轮排满的单列成一组"]
B --> C{"这一版还有<br/>要他定的吗?"}
A2 --> D1{"这批人对吗?<br/>待定的都摆成了按钮"}
D1 -->|"换条件 · 改人数 · 换时间档"| R1["整版重出<br/>⚠️ 已经排好的分法一并作废"]
R1 --> A2
C -->|"没有"| K
C -->|"有"| G["摆成按钮<br/>专属排满了 · 还能再收窄 · 这批多大 · 最忙的那位"]
D1 ==>|"人定了 —— 这一关过了才谈怎么分"| B
G --> Q{"主管做什么?"}
Q -->|"一条不点<br/>默认永远安全"| K
Q -->|"点按钮 / 开口说别的"| M
B["② 分人 —— 谁去打<br/>有专属的回自己人手上<br/>无专属的给当前手上最少的<br/>专属这轮排满的单列成一组"]
M{"他动的是哪一层?"}
M -->|"动②分人<br/>移出谁 · 改派 · 改时效 · 带福利"| J["就在这一版上改<br/>不重跑"]
M -->|"动①选人<br/>换条件 · 改人数 · 换时间档"| N["重跑,出新版<br/>旧版当场作废"]
B --> D2{"这么分行吗?<br/>待定的都摆成了按钮"}
D2 -->|"移出谁 · 改派 · 改时效 · 带福利"| R2["就在这一版上改<br/>人不变,不重出"]
R2 --> D2
J --> C
N --> A1
K["③ 确认<br/>点下去,这一刻才真的分下去"] --> L["④ 确认之后<br/>限时撤销 · 补挂福利 · 跟踪进度"]
D2 ==>|"行"| K["③ 确认<br/>点下去,这一刻才真的分下去"]
K --> L["④ 确认之后<br/>限时撤销 · 补挂福利 · 跟踪进度"]
style S fill:#fef3c7,stroke:#f59e0b
style A1 fill:#fef3c7,stroke:#f59e0b
style A2 fill:#e0e7ff,stroke:#6366f1
style D1 fill:#fee2e2,stroke:#ef4444,stroke-width:2px
style R1 fill:#fee2e2,stroke:#ef4444
style B fill:#e0e7ff,stroke:#6366f1
style G fill:#fce7f3,stroke:#ec4899
style M fill:#fee2e2,stroke:#ef4444,stroke-width:2px
style J fill:#ede9fe,stroke:#8b5cf6
style N fill:#ede9fe,stroke:#8b5cf6
style D2 fill:#fff,stroke:#94a3b8
style R2 fill:#ede9fe,stroke:#8b5cf6
style K fill:#fef3c7,stroke:#f59e0b
style L fill:#d1fae5,stroke:#10b981
```
**两个环的代价不一样,这是全图最要紧的一点:**
| | 主管改什么 | 代价 |
|---|---|---|
| **选人环**(红) | 换条件、改人数、换时间档 | **整版重出** —— 人变了,已经排好的分法一并作废,从头再排 |
| **分人环**(紫) | 移出谁、改派、改时效、带福利 | **就地改** —— 人不变,只动这一版的分法 |
所以顺序不能颠倒:**人先定下来,才谈怎么分**。先排分法再让他改人群,前面那趟排班就白做了。
### 召回策略:一批召回要回答的四个问题
**这一环在「选人」之前** —— 先把问题摆清楚,再看谁答得了。
......@@ -97,7 +102,7 @@ flowchart TD
| 步 | 主管在决定什么 | 谁来做 |
|---|---|---|
| **② 分人** | **谁去打这些电话**:默认有专属客服的回自己人手上、无的给当前手上最少的;他可以移出某几个人、改派给谁、单独给某位少分点 | 程序按规则落,主管微调 |
| **② 分人** | **谁去打这些电话**:默认有专属客服的回自己人手上、无专属的给当前手上最少的;他可以移出某几个人、改派给谁、单独给某位少分点 | 程序按规则落,主管微调 |
| **③ 确认** | **要不要就这么发下去** —— 他点下去这一刻才真的分下去 | 只有主管 |
| **④ 确认之后** | **发出去之后怎么管**:发错了限时撤回、临时加个福利、跟踪这批打得怎么样 | 主管发起,程序执行 |
......
......@@ -280,7 +280,7 @@ const ASSIGNMENT_SCENE = `## 他现在做的这件事:把一批人分给客服
### 分人
两趟 + 一组:有专属且在岗的回自己人手上(最多到他这轮该拿的那份);无或专属已离岗的给当前手上最少的那个;专属客服这轮已排满的不动,单列成一组交他定。
两趟 + 一组:有专属且在岗的回自己人手上(最多到他这轮该拿的那份);无专属或专属已离岗的给当前手上最少的那个;专属客服这轮已排满的不动,单列成一组交他定。
不是每人加一样多,是每条都给当前手上最少的那个。没有「容量上限」这回事,负载就是在手量本身。
......
......@@ -150,7 +150,7 @@ const SYSTEM = `你是 PAC(疗效保障 / 患者分析中心)工作台里的
### 拟分怎么落人
两趟 + 一组:有专属且在岗的回自己人手上(最多到他这轮该拿的那份);无或专属已离岗的给当前手上最少的那个;专属客服这轮已排满的不动,单列成一组交他定。
两趟 + 一组:有专属且在岗的回自己人手上(最多到他这轮该拿的那份);无专属或专属已离岗的给当前手上最少的那个;专属客服这轮已排满的不动,单列成一组交他定。
因此这批可能不满、团队也不齐平 —— 那是刻意的:宁可少分几个,也不动别人的客户。他问「怎么没分够」就说有几个人卡在待分配等他定,不是系统故障。
......
......@@ -184,7 +184,9 @@ export function modelFacts(p: AssignmentProposal): Record<string, unknown> {
'分完之后每人手上': range(loads),
// ⚠️ 读**这一版真用的**那个数,⛔ 不引常量:主管说过「按 20 通算」就该是 20
'按每天几通算': p.dailyCalls,
'落人规则': '有专属的先回自己人手上;无主的给当前手上最少的那个',
// ⚠️ 措辞用「无专属」,⛔ 别写「无主」—— 界面上的按钮文案就是「无专属客服的患者」,
// 模型会照着这句念给主管听,两处不一致他会以为是两拨人。
'落人规则': '有专属的先回自己人手上;无专属的给当前手上最少的那个',
// ⚠️ 他自己设过的那几位要点名 —— 「为什么某某只有 5 条」的答案只在这里
...(tuned.length > 0 ? { '他单独设过的': tuned } : {}),
...(p.pending.length > 0 ? { '专属客服排满、这批没发的': p.pending.length } : {}),
......
......@@ -218,7 +218,7 @@ export class AssignmentController {
@ApiOperation({
summary: '重新排一版:遇到专属排满的就跳过,从池子里往后取,尽量凑满 N',
description:
'⚠️ **不改变"不动别人客户"这条底线** —— 只是换一批**专属没排满 / 无**的人来凑,' +
'⚠️ **不改变"不动别人客户"这条底线** —— 只是换一批**专属没排满 / 无专属**的人来凑,' +
'一条专属关系都不动。代价是这批人整体排名往后走(产品判定:批内名次对主管没有意义,' +
'这批人本来就共享同一组特征)。',
})
......
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