post.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
  2. import { z } from 'zod';
  3. import { AppDataSource } from '@/server/data-source';
  4. import { TicketService } from '@/server/modules/tickets/ticket.service';
  5. import { TicketSchema } from '@/server/modules/tickets/ticket.entity';
  6. import { ErrorSchema } from '@/server/utils/errorHandler';
  7. import { authMiddleware } from '@/server/middleware/auth';
  8. import { AuthContext } from '@/server/types/context';
  9. import { logger } from '@/server/utils/logger';
  10. // 初始化服务
  11. const ticketService = new TicketService(AppDataSource);
  12. // 创建工单请求Schema
  13. const CreateTicketSchema = z.object({
  14. title: z.string().min(3).max(255).openapi({
  15. example: '系统登录异常',
  16. description: '工单标题'
  17. }),
  18. description: z.string().min(10).openapi({
  19. example: '用户报告无法登录系统,提示密码错误,但确认密码正确',
  20. description: '工单描述'
  21. }),
  22. customerId: z.number().int().positive().openapi({
  23. example: 1,
  24. description: '客户ID'
  25. }),
  26. priority: z.enum(['0', '1', '2', '3']).default('1').openapi({
  27. example: '2',
  28. description: '工单优先级(0:低, 1:中, 2:高, 3:紧急)'
  29. }),
  30. type: z.string().optional().openapi({
  31. example: 'login',
  32. description: '工单类型'
  33. }),
  34. relatedAsset: z.string().optional().openapi({
  35. example: 'server-01',
  36. description: '相关资产'
  37. })
  38. });
  39. // 响应Schema
  40. const ResponseSchema = z.object({
  41. code: z.number().openapi({ example: 200, description: '状态码' }),
  42. message: z.string().openapi({ example: '工单创建成功', description: '消息' }),
  43. data: TicketSchema
  44. });
  45. // 路由定义
  46. const routeDef = createRoute({
  47. method: 'post',
  48. path: '/',
  49. middleware: [authMiddleware],
  50. request: {
  51. body: {
  52. content: {
  53. 'application/json': { schema: CreateTicketSchema }
  54. }
  55. }
  56. },
  57. responses: {
  58. 200: {
  59. description: '成功创建工单',
  60. content: {
  61. 'application/json': { schema: ResponseSchema }
  62. }
  63. },
  64. 400: {
  65. description: '请求参数错误',
  66. content: {
  67. 'application/json': { schema: ErrorSchema }
  68. }
  69. },
  70. 500: {
  71. description: '服务器错误',
  72. content: {
  73. 'application/json': { schema: ErrorSchema }
  74. }
  75. }
  76. }
  77. });
  78. // 创建路由实例
  79. const app = new OpenAPIHono<AuthContext>().openapi(routeDef, async (c) => {
  80. try {
  81. const body = c.req.valid('json');
  82. const user = c.get('user');
  83. // 创建工单
  84. const ticket = await ticketService.create({
  85. title: body.title,
  86. description: body.description,
  87. customerId: body.customerId,
  88. priority: parseInt(body.priority, 10),
  89. type: body.type,
  90. createdBy: user.id,
  91. status: 0 // 0表示新建状态
  92. });
  93. return c.json({
  94. code: 200,
  95. message: '工单创建成功',
  96. data: ticket
  97. }, 200);
  98. } catch (error) {
  99. logger.error('Error creating ticket:', error);
  100. return c.json({
  101. code: 500,
  102. message: error instanceof Error ? error.message : '创建工单失败'
  103. }, 500);
  104. }
  105. });
  106. export default app;