报障现象: owner端工单管理查不到任何工单, 但有个工单待办; 待办弹窗无处理按钮致待办数不变。 根因链(全部有DB/代码证据): 1. 弹窗缺客户动作按钮: 双身份用户(admin既是TK0004客户又是staff), staff视角在 staff_replied态一个按钮都没有, 而此刻待办要求的动作是客户确认——待办永远清不掉。 修: staff视角下当前用户=工单客户且状态在已回复态时追加客户动作按钮。 2. 管理页默认队列=待认领, 当时无待认领单+前端首次查询点击渲染时序中间态→看似查不到。 修: 默认队列改全部工单。 3. T12转派校验不全: 只查目标用户属于0机构不查owner角色, 测试时把TK0003转给无角色的hyz1 产生孤儿工单(角色池无人可认领+hyz1打开管理页被权限分支挡)。 修: 目标用户必须持owner角色否则TK_E004拒绝; 候选端点只列持owner角色的用户; 孤儿工单TK0003数据修复退回角色池。 4. staff_tickets的all分支权限过窄: 无owner角色的账号直接返回空, 受理人看不到自己手上的工单。 修: 无owner角色账号至少能看到受理人是自己的工单。
ticket — 平台工单管理模块
客户提出问题 → 登记工单 → agent 先处理(检索'0'机构知识库+历史工单,能答直接回复客户) → 答不了转人工运维(owner.maintainer,params 可配)→ 人工回复客户 → 关闭; 人工处理不了可转派 owner 组织类型下任意角色或具体用户。
关键设计(详见 pipeline-app/docs 或设计文档 ticket-module-design.md)
- 状态机:8 态 13 迁移,全部乐观锁(UPDATE...WHERE status=前置态 + SELECT 验证, 照 pipeline_service agent_loop 的 claim 范式),并发冲突返回明确错误码。
- 平台待办集成(用户定夺 2026-09-10):工单不建独立通知表,通过
register_todo_provider钩子接入平台待办通道(pipeline-service 聚合, todo_badge 角标 + my_todos 弹窗异步通知到人)。待办由工单状态派生: 客户回复待确认 / 运维角色池待认领 / 受理人待处理——状态流转待办自动消失, 天然满足「同一事项只发一次」。 - 角色不硬编码:默认受理角色存 params(ticket_default_role,兜底 owner.maintainer); 转派候选实时查 role 表 owner 组织类型全部角色 + '0' 机构用户(role/orgtypes 运行时可动态增删)。
- agent:异步 poller(照 bid_flow 范式,PIPELINE_MODE=web 不启动), RAG 检索走 rag HTTP API(dapi Bearer key,平台账号='0'机构 → 只见 org_id='0' 的 KB), LLM 走 pipeline_service.llm_bridge.llm_call(内部 token+门禁链+记账,org_id='0')。 「能否回答」由 LLM 裁决(语义判断铁律,禁关键词匹配),严格 JSON 输出; 硬门禁:reply 空/短于20字符一律转人工。基础设施故障(LLM/RAG异常)≠答不了: fail_rounds+1 回退重试,≥3 轮转人工(reason=agent服务不可用)。
数据表(3张,tk_ 前缀)
| 表 | 说明 |
|---|---|
| tk_tickets | 工单主表(状态机+当前受理角色/人+agent处理锁) |
| tk_messages | 往来消息(visibility: customer客户可见/internal内部备注) |
| tk_transfers | 转派流水(append-only,每次受理方变更必留痕) |
参数(params 表,运行时可改)
| 参数 | 默认 | 说明 |
|---|---|---|
| ticket_default_role | owner.maintainer | agent 转人工的默认受理角色 |
| ticket_followup_max | 2 | agent 回复后客户追问上限,超限自动转人工 |
| ticket_agent_fail_max | 3 | agent 基础设施连续失败轮数上限,超限转人工 |
| ticket_agent_username | admin | agent 检索知识库用的平台账号('0'机构) |
安装
宿主 build.sh 四处清单 + load_ticket()(见宿主集成)。模块注册:
- env.create_ticket / ticket_detail / ticket_followup / ... (dspy 消费)
- register_todo_provider(list_ticket_todos)(平台待办聚合)
- start_poller()(agent 后台处理)
Description