Skip to content
bitzorcas
EN

Reference

工单模块

支持工单系统 — 带状态转换的生命周期管理、代理分配、带文件附件的评论、基于角色的授权和审计跟踪。

Last updated

Tickets 模块提供完整的支持工单系统,包含生命周期管理、代理分配、线程评论、文件附件和基于角色的访问控制。

端点

端点方法描述
/api/ticketsPOST开新工单
/api/ticketsGET列出工单(分页、可筛选)
/api/tickets/{id}GET获取工单详情
/api/tickets/{id}/assignPOST分配给代理
/api/tickets/{id}/commentsPOST添加评论
/api/tickets/{id}/filesPOST附加文件
/api/tickets/{id}/statusPATCH变更状态

架构

TicketEndpoints (Minimal API)
TicketService
├── ITicketRepository → SqlSugarTicketRepository
├── TicketAuthorizationService (角色 + 数据范围检查)
├── ITicketAttachmentAccessService → FileAssetTicketAttachmentAccessService
├── ITicketEventPublisher → NullTicketEventPublisher
└── ITicketAuditSink → NullTicketAuditSink

Ticket 实体

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; }
}

另见