工单预回复设置与自动回复
背景
用户新建工单后,系统需要以管理员预先配置的「工单预回复管理员账号」名义自动回复配置内容(如「请耐心等待管理员回复」),让用户立即获得已受理的反馈。管理端侧边栏「工单处理」下需要对应新增「预回复设置」入口。
范围与验收
- [ ] 用户新建工单成功时,若预回复已启用,以配置管理员名义自动插入一条员工回复,工单状态变为「员工回复」。
- [ ] 命中工单传递规则、会推送到上游的工单使用单独配置的上游预回复内容;未单独配置时回退普通内容。
- [ ] 预回复不推送上游、不触发邮件/站内信通知,仅作为工单会话内可见的自动应答。
- [ ] 管理端「工单处理 → 预回复设置」页面可配置启用开关、管理员账号与回复内容。
- [ ] 新权限点
ticket.pre_reply_manage独立授权(不随ticket.manage隐含),存量含ticket.manage角色由迁移补勾选。 - [ ] 配置残缺(未启用、无管理员、内容为空、管理员停用)时预回复静默跳过,不产生无主回复。
- [ ] 后端定向回归测试、管理端构建通过。
实施步骤
- 新增
config/ticket_pre_reply.php默认配置与SettingsSeeder幂等种入ticket_pre_reply组默认值。 - 新增
ticket.pre_reply_manage权限点并接入权限目录(工单支持组、中文名)。 - 新增回填迁移
2026_08_23_130000给存量含ticket.manage的自定义角色补勾新权限。 - 新增
TicketPreReplyService,在TicketService::create()建单事务内创建预回复并更新工单状态。 - 新增管理端设置接口(GET/POST
/api/v2/admin/ticket-pre-reply-settings)、请求校验与操作审计。 - 前端新增路由、侧边栏菜单项与设置页面。
风险与回滚
- 配置存
settings表ticket_pre_reply组,追加式写入,不改历史数据。 - 预回复与建单同事务提交:建单失败则预回复不落库,不存在「有回复无工单」。
- 预回复逻辑全部在条件满足时才写入,默认停用,不影响既有建单流程与上游投递。
- 回填迁移幂等且不回滚(与既有 delivery 权限回填一致),权限归属以显式授权为准。
进度
- [x] 后端配置、权限点、目录、Seeder、回填迁移、预回复服务与建单接线。
- [x] 管理端设置接口、校验与审计。
- [x] 前端路由、侧边栏菜单与设置页面。
- [x] 后端测试(自动回复、设置 CRUD、权限隔离、回填迁移)。
- [ ] 子代理 code review 与修复。
- [ ] 定向验证(后端测试、前端构建、docs:check)。
决策日志
| 日期 | 决策 | 原因 |
|---|---|---|
| 2026-08-23 | 预回复只入库、不推送上游 | 预回复是自动化应答,推送给上游供应商会造成「管理员已真实回复」的误导;用户端进入工单会话即可见,最小改动不扩展现有投递链路。 |
| 2026-08-23 | 预回复不触发邮件/站内信通知 | 用户刚提交即收到「有新回复」通知体验重复;回复列表可见即满足「立即反馈」目标,通知策略后续可按需补充。 |
| 2026-08-23 | 预回复后工单状态置「员工回复」 | 与管理员手动回复语义一致;queueTicket 不读取工单状态字段,状态变更不影响上游工单创建。 |
| 2026-08-23 | 独立权限点 + 存量角色回填 | 与 ticket.delivery_manage 权限隔离方案一致:去隐含、显式授权,回填迁移避免升级后「工单管理」角色功能丢失。 |
| 2026-08-23 | 配置残缺时静默跳过 | 预回复是自动化兜底,管理员停用/删除时不应以不存在的人发回复;跳过比报错更符合自动应答语义,管理端保存时已有前置校验保证配置完整。 |
| 2026-08-23 | 管理员候选人复用工单指派名单 | 复用 TicketService::adminAssignableUsers()(启用 + 持 ticket.reply),与「员工回复」口径一致,避免预回复由不能回复工单的账号代发。 |
| 2026-08-23 | 上游工单单独配置预回复内容 | 命中上游传递规则的工单优先使用 upstream_content(如「已提交给上游服务商处理」),未配置时回退普通内容;判定复用 TicketDeliveryService::matchesDeliveryRule()(与 queueTicket 同一决策),避免复制规则匹配逻辑。 |
