Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

TicketService

工单管理服务,负责客户支持工单的全生命周期管理。支持创建工单、状态流转、处理人分配和回复(含内部备注)。Admin 用户可管理所有工单,Customer 用户只能查看和操作自己的工单。

RPC 列表

RPC描述权限
CreateTicket创建工单已认证
ListTickets工单列表(分页+筛选)admin 全量 / customer 自身
GetTicket获取工单详情(含回复列表)admin 全量 / customer 自身
UpdateTicket更新工单状态/优先级/处理人/描述admin
CreateReply添加工单回复已认证
DeleteTicket删除工单admin

CreateTicket

描述

创建新工单。Admin 创建时可指定 customer_id 为特定客户创建;Customer 用户创建时自动绑定自身客户。

Request — CreateTicketRequest

字段类型编号必填描述
customer_idstring1客户 ID(admin 指定,customer 自动设置)
titlestring2工单标题
descriptionstring3问题描述
prioritystring4优先级:"low" / "medium" / "high" / "urgent"(默认 "medium"

Response — CreateTicketResponse

字段类型编号描述
ticketTicketInfo1创建的工单信息

错误码

错误说明
InvalidArgument标题为空或优先级无效
NotFound指定客户不存在
Unauthenticated未登录

示例

grpcurl -plaintext -H "authorization: Bearer <token>" \
  -d '{"customer_id":"0192a123-...","title":"服务器无法连接","description":"VPS 无法通过 SSH 连接,已尝试重启无效","priority":"high"}' \
  localhost:50051 rustbill.ticket.TicketService/CreateTicket
const resp = await api.createTicket({
  customer_id: "0192a123-...",
  title: "服务器无法连接",
  description: "VPS 无法通过 SSH 连接,已尝试重启无效",
  priority: "high"
});

ListTickets

描述

分页查询工单列表。Admin 可查看所有工单,Customer 自动限定为自身工单。

Request — ListTicketsRequest

字段类型编号必填描述
paginationPageRequest1分页参数
customer_idstring?2按客户过滤(admin 可用)
statusstring?3按状态过滤:"pending" / "processing" / "resolved" / "closed"
prioritystring?4按优先级过滤:"low" / "medium" / "high" / "urgent"
assignee_user_idstring?5按处理人过滤

Response — ListTicketsResponse

字段类型编号描述
ticketsrepeated TicketInfo1工单列表
metaPageMeta2分页元数据

示例

grpcurl -plaintext -H "authorization: Bearer <token>" \
  -d '{"pagination":{"page":1,"page_size":20},"status":"pending","priority":"high"}' \
  localhost:50051 rustbill.ticket.TicketService/ListTickets

GetTicket

描述

获取单个工单详情,包含完整回复列表。is_internal=true 的回复仅对 admin 可见,customer 请求中自动过滤。

Request — GetTicketRequest

字段类型编号必填描述
idstring1工单 ID(UUID)

Response — GetTicketResponse

字段类型编号描述
ticketTicketInfo1工单信息(含回复列表)

错误码

错误说明
NotFound工单不存在
PermissionDeniedcustomer 用户无权查看他人工单

示例

grpcurl -plaintext -H "authorization: Bearer <token>" \
  -d '{"id":"0192a123-4567-7890-abcd-ef0123456789"}' \
  localhost:50051 rustbill.ticket.TicketService/GetTicket

UpdateTicket

描述

更新工单状态、优先级、处理人或描述。更改处理人时会触发通知系统向新旧处理人发送工单分配通知。

Request — UpdateTicketRequest

字段类型编号必填描述
idstring1工单 ID
statusstring?2新状态:"pending" / "processing" / "resolved" / "closed"
prioritystring?3新优先级
assignee_user_idstring?4新处理人用户 ID(变更时触发通知)
descriptionstring?5更新的问题描述

Response — UpdateTicketResponse

字段类型编号描述
ticketTicketInfo1更新后的工单信息

错误码

错误说明
NotFound工单不存在
InvalidArgument状态流转不合法
PermissionDenied非 admin 用户

示例

grpcurl -plaintext -H "authorization: Bearer <token>" \
  -d '{"id":"0192a123-...","status":"processing","assignee_user_id":"0192b456-..."}' \
  localhost:50051 rustbill.ticket.TicketService/UpdateTicket

CreateReply

描述

添加工单回复。is_internal=true 的回复为内部备注,仅 admin 可见。

Request — CreateReplyRequest

字段类型编号必填描述
ticket_idstring1工单 ID(UUID)
contentstring2回复内容
is_internalbool3是否为内部备注

Response — CreateReplyResponse

字段类型编号描述
replyTicketReplyInfo1创建的回复信息

错误码

错误说明
NotFound工单不存在
InvalidArgument回复内容为空
Unauthenticated未登录

示例

grpcurl -plaintext -H "authorization: Bearer <token>" \
  -d '{"ticket_id":"0192a123-...","content":"已定位问题,正在修复","is_internal":false}' \
  localhost:50051 rustbill.ticket.TicketService/CreateReply
const resp = await api.createReply({
  ticket_id: "0192a123-...",
  content: "请提供更多信息",
  is_internal: false
});

DeleteTicket

描述

删除指定工单及其所有回复。

Request — DeleteTicketRequest

字段类型编号必填描述
idstring1工单 ID(UUID)

Response — DeleteTicketResponse

无字段。

错误码

错误说明
NotFound工单不存在
PermissionDenied非 admin 用户

示例

grpcurl -plaintext -H "authorization: Bearer <token>" \
  -d '{"id":"0192a123-4567-7890-abcd-ef0123456789"}' \
  localhost:50051 rustbill.ticket.TicketService/DeleteTicket

公共类型

TicketInfo

字段类型编号描述
idstring1工单 UUID
customer_idstring2关联客户 ID
titlestring3工单标题
descriptionstring4问题描述
statusstring5状态:"pending" / "processing" / "resolved" / "closed"
prioritystring6优先级:"low" / "medium" / "high" / "urgent"
assignee_user_idstring7处理人用户 ID
creator_user_idstring8创建人用户 ID(admin 创建时设置)
created_atstring9创建时间(RFC3339)
updated_atstring10更新时间(RFC3339)
repliesrepeated TicketReplyInfo11回复列表

TicketReplyInfo

字段类型编号描述
idstring1回复 UUID
ticket_idstring2关联工单 ID
user_idstring3回复人 admin 用户 ID(customer 回复时为空)
customer_idstring4回复人客户 ID(admin 回复时为空)
contentstring5回复内容
is_internalbool6是否为内部备注(customer 不可见)
created_atstring7创建时间(RFC3339)

工单状态流转

pending → processing → resolved → closed
状态说明
pending待处理
processing处理中
resolved已解决
closed已关闭

工单优先级

优先级说明
low非紧急问题
medium一般问题(默认)
high影响业务但可等待
urgent紧急业务完全中断