工单管理系统

SupportFlow AI 是一个开源的 IT 服务台和工单系统,提供完整的后端 API 用于管理支持工单、用户、通知和实时通讯,并具备 AI 集成的基础设施。

  • by ElAguilaPrograma
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 ElAguilaPrograma/TicketsSystem

使用说明

SupportFlow AI

SupportFlow AI是一个基于ASP构建的开源IT帮助台和票务系统。NET核心。它提供了一个完整的后端API,用于管理支持票证、用户、通知和实时通信,并通过模型上下文协议(MCP)为人工智能集成准备了基础设施。

特性

  • 票务管理 --创建、更新、分配、接受、关闭和重新打开支持票证,并跟踪优先级和状态。
  • 基于角色的访问 --三个角色:管理员、代理和最终用户,每个操作都有精细的权限。
  • 实时通知 --用于新工单、状态更改和评论的实时更新。
  • 评论系统 --内部(仅限代理)和外部(票所有人可见)评论,实时交付。
  • 门票历史 --对每个工单所做的所有更改进行完整的审计跟踪,按更改事件分组。
  • 文件存储 --配置文件图片和票附件存储在Supabase存储中,并经过验证(魔术字节验证,限制为25 MB)。
  • Excel导出 --将门票和用户导出到 .xlsx 使用ClosedXML格式。
  • JWT身份验证 --使用HttpOnly Cookie和7天令牌过期进行安全登录。
  • 分页和过滤 --按状态、优先级、日期范围、分配的用户等筛选票证。
  • AI就绪基础设施 --为基于MCP的AI模型集成(意图分类、自动回复建议等)准备的数据库模式。

技术栈

技术 目的
.NET 10.0 运行时框架
ASP。NET核心 Web API框架
实体框架核心10.0 ORM
PostgreSQL 主数据库
Npgsql PostgreSQL提供程序
ACK/AAzure ACK 实时消息传递
数据库存储 文件存储
FluentVerification 请求验证
FluentResults 结果模式
ClosedXML Excel生成
JWT承载 身份验证
Swashbuckle API文档
xUnit+Moq+FluentAssessments 测试

建筑

该解决方案遵循一个干净的架构模式,有四个主要层:

TicketsSystem.slnx
├── TicketsSystem.Domain      -- Entities, enums, repository interfaces
├── TicketsSystem.Data        -- EF Core DbContext, migrations, repositories, Unit of Work
├── TicketsSystem.Core        -- Services, DTOs, mappers, validations, business logic
├── TicketsSystem.Api         -- Controllers, SignalR hubs, middleware, Program.cs
├── TicketsSystem.Tests       -- Unit tests (53)
├── TicketsSystem.Tests.Integration -- Integration tests (10)
└── TicketClientTest          -- Console app for SignalR testing

先决条件

入门指南

1.克隆存储库

git clone https://github.com/your-org/supportflow-ai.git
cd supportflow-ai/TicketsSystem.Server

2.配置数据库

创建PostgreSQL数据库并更新中的连接字符串 TicketsSystem.Api/appsettings.Development.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Port=5432;Database=supportflow;Username=postgres;Password=your_password"
  }
}

应用程序在启动时通过以下方式自动应用迁移 dbContext.Database.Migrate().

3.配置JWT和Supabase(可选)

在同一文件中,配置JWT设置和Supabase凭据:

{
  "Jwt": {
    "Key": "your-secret-key-at-least-32-characters-long",
    "Issuer": "SupportFlowAI",
    "Audience": "SupportFlowAI"
  },
  "Supabase": {
    "Url": "https://your-project.supabase.co",
    "Key": "your-supabase-key"
  }
}

注: 在未配置Supabase的情况下,应用程序仍将运行,但文件上传功能将不可用。

4.运行应用程序

dotnet run --project TicketsSystem.Api

API将在以下网址提供:

  • HTTP: http://localhost:5056
  • HTTPS: https://localhost:7121

Swagger用户界面: https://localhost:7121/swagger

5.种子数据

首次启动时,应用程序会自动播种:

  • 默认管理员用户: admin@example.com / Admin123!
  • 票证状态: 打开、进行中、暂停、关闭、重新打开
  • 门票优先级: 低、中、高、临界

测试证书

角色 电子邮件 密码
管理 prueba3@gmail.com 测试3
代理人 agente@example.com代理123
用户 user@example.com 用户123

运行测试

单元测试

dotnet test TicketsSystem.Tests

53个测试,涵盖服务(票证、用户、通知、角色、当前用户)和验证逻辑。所有的依赖关系都被嘲笑了。

集成测试

dotnet test TicketsSystem.Tests.Integration

10个测试针对一个带有内存中API主机的真实SQL Server容器(通过Testcontainers)运行。测试涵盖了完整的身份验证流程、票证CRUD持久性和Contoso实时事件。

注: 集成测试需要运行Docker Desktop。

API概述

身份验证(/api/authentication)

  • POST /login --在HttpOnly cookie中验证和接收JWT
  • POST /logout --清除身份验证cookie
  • GET /getcurrentuser --获取当前用户声明
  • POST /createuser --创建新用户(管理员)
  • GET /getallusers --列出分页用户(管理员)
  • PUT /updateuser/{userId} --更新用户信息(管理员)

门票(/api/tickets)

  • POST /createticket --创建新票证
  • GET /gettickets --列出带有过滤器和分页的门票
  • GET /getticketbyid/{ticketId} --获取门票详细信息
  • PUT /updateticketinfo/{ticketId} --更新工单(管理员/代理)
  • PUT /updateticketuser/{ticketId} --更新自己的工单(用户)
  • POST /assingtickets/{ticketId}/{userId} --将票分配给代理(管理员)
  • POST /accepttickets/{ticketId} --自行分配门票(代理)
  • POST /closetickets/{ticketId} --关闭工单(管理员/代理)
  • POST /reopentickets/{ticketId} --重新打开工单(管理员/代理)
  • GET /exporttickets --将门票导出到Excel

评论(/api/ticketcomments)

  • POST /createticketcomment/{ticketId} --添加评论(内部或外部)
  • GET /getticketscomment/{ticketId} --获取门票的所有评论

历史(/api/tickethistory)

  • GET /gettickethistory/{ticketId} --获取工单的分组更改历史记录

通知(/api/notifications)

  • GET /getusernotifications/{userId} --获取用户通知
  • PUT /tooglenotificationreadstatus/{notificationId} --将通知标记为已读

实时(ViewModel)

连接到 /ticketHub 接收现场活动:

  • ReceiveNewTicket --创建了一张新票
  • ReceiveNewTicketStatusChange --票证状态已更改
  • ReceiveNewTicketComment --添加了一条新评论

领域模型

实体 描述
用户 具有角色(管理员、代理、用户)的系统用户
票证 支持具有状态、优先级和分配的票证
TicketStatus 查找表(打开、进行中、暂停、关闭、重新打开)
TicketPriority 查找表(低、中、高、严重)
TicketComment 对门票的评论(内部或外部)
TicketAttachment 门票文件附件
票务历史 票务变更的审计跟踪
通知 工单事件触发的用户通知
Mcprequest/Mcpresponse 未来MCP集成的AI请求/响应记录

项目配置

跨域资源共享

配置为允许 http://localhost:4200 (Angular开发)和生产Azure静态Web App URL。支持基于cookie的身份验证凭据。

信号员

  • 开发中:内存中
  • 在生产环境中:Azure ViewModel服务

文件存储

文件上传到Supabase Storage并进行验证:

  • 最大文件大小:25 MB
  • 支持的图像格式:JPEG、PNG、GIF(通过内容类型和魔术字节验证)

许可证

这个项目是开源的。有关详细信息,请参阅LICENSE文件。