Skip to content

工单预回复设置与自动回复

背景

用户新建工单后,系统需要以管理员预先配置的「工单预回复管理员账号」名义自动回复配置内容(如「请耐心等待管理员回复」),让用户立即获得已受理的反馈。管理端侧边栏「工单处理」下需要对应新增「预回复设置」入口。

范围与验收

  • [ ] 用户新建工单成功时,若预回复已启用,以配置管理员名义自动插入一条员工回复,工单状态变为「员工回复」。
  • [ ] 命中工单传递规则、会推送到上游的工单使用单独配置的上游预回复内容;未单独配置时回退普通内容。
  • [ ] 预回复不推送上游、不触发邮件/站内信通知,仅作为工单会话内可见的自动应答。
  • [ ] 管理端「工单处理 → 预回复设置」页面可配置启用开关、管理员账号与回复内容。
  • [ ] 新权限点 ticket.pre_reply_manage 独立授权(不随 ticket.manage 隐含),存量含 ticket.manage 角色由迁移补勾选。
  • [ ] 配置残缺(未启用、无管理员、内容为空、管理员停用)时预回复静默跳过,不产生无主回复。
  • [ ] 后端定向回归测试、管理端构建通过。

实施步骤

  1. 新增 config/ticket_pre_reply.php 默认配置与 SettingsSeeder 幂等种入 ticket_pre_reply 组默认值。
  2. 新增 ticket.pre_reply_manage 权限点并接入权限目录(工单支持组、中文名)。
  3. 新增回填迁移 2026_08_23_130000 给存量含 ticket.manage 的自定义角色补勾新权限。
  4. 新增 TicketPreReplyService,在 TicketService::create() 建单事务内创建预回复并更新工单状态。
  5. 新增管理端设置接口(GET/POST /api/v2/admin/ticket-pre-reply-settings)、请求校验与操作审计。
  6. 前端新增路由、侧边栏菜单项与设置页面。

风险与回滚

  • 配置存 settingsticket_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 同一决策),避免复制规则匹配逻辑。

基于 AGPL-3.0-or-later 发布