Tickets 模块提供完整的支持工单系统,包含生命周期管理、代理分配、线程评论、文件附件和基于角色的访问控制。
端点
| 端点 | 方法 | 描述 |
|---|---|---|
/api/tickets | POST | 开新工单 |
/api/tickets | GET | 列出工单(分页、可筛选) |
/api/tickets/{id} | GET | 获取工单详情 |
/api/tickets/{id}/assign | POST | 分配给代理 |
/api/tickets/{id}/comments | POST | 添加评论 |
/api/tickets/{id}/files | POST | 附加文件 |
/api/tickets/{id}/status | PATCH | 变更状态 |
架构
TicketEndpoints (Minimal API) │ ▼TicketService │ ├── ITicketRepository → SqlSugarTicketRepository ├── TicketAuthorizationService (角色 + 数据范围检查) ├── ITicketAttachmentAccessService → FileAssetTicketAttachmentAccessService ├── ITicketEventPublisher → NullTicketEventPublisher └── ITicketAuditSink → NullTicketAuditSinkTicket 实体
public class TicketEntity : TenantSoftDeleteEntityBase{ public string Title { get; set; } public string Description { get; set; } public string Status { get; set; } // Open, InProgress, Resolved, Closed public string Priority { get; set; } // Low, Normal, High, Critical public string? AssignedToId { get; set; } public string CreatedById { get; set; }}生命周期状态
Open → InProgress → Resolved → Closed ↑ │ │ └───────┘ │ (重新打开) │ ▼ Closed (终态)授权模型
TicketAuthorizationService 执行基于角色的访问:
| 角色 | 权限 |
|---|---|
| Creator | 查看自己的、添加评论、重新打开 |
| Agent | 查看已分配的、变更状态、分配 |
| Admin | 租户内完全访问 |
| System | 跨租户只读(审计) |
public static class TicketPermissions{ public const string TicketCreate = "ticket.create"; public const string TicketView = "ticket.view"; public const string TicketAssign = "ticket.assign"; public const string TicketStatusChange = "ticket.status.change"; public const string TicketComment = "ticket.comment"; public const string TicketManage = "ticket.manage";}工单角色
public static class TicketRoleNames{ public const string Creator = "ticket.creator"; public const string Agent = "ticket.agent"; public const string Admin = "ticket.admin";}分页和筛选
public class TicketPage{ public IReadOnlyList<Ticket> Items { get; } public int TotalCount { get; } public bool HasMore { get; }}
public class TicketQuery{ public string? Status { get; set; } public string? Priority { get; set; } public string? AssignedToId { get; set; } public string? Search { get; set; } public int Page { get; set; } public int PageSize { get; set; }}另见
- 文件模块 — 工单附件支持
- 通知模块 — 工单状态通知
- Webhooks 模块 — 工单事件投递