route.schema.ts 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { z } from 'zod';
  2. import { DisabledStatus } from '@/share/types';
  3. import { ActivityType } from '../activities/activity.entity';
  4. // 车型枚举
  5. export enum VehicleType {
  6. BUS = 'bus', // 大巴
  7. MINIBUS = 'minibus', // 中巴
  8. CAR = 'car' // 小车
  9. }
  10. // 路线创建Schema
  11. export const createRouteSchema = z.object({
  12. name: z.string().min(1, '路线名称不能为空').max(255, '路线名称不能超过255个字符'),
  13. description: z.string().max(1000, '路线描述不能超过1000个字符').optional().nullable(),
  14. startPoint: z.string().min(1, '出发地不能为空').max(255, '出发地不能超过255个字符'),
  15. endPoint: z.string().min(1, '目的地不能为空').max(255, '目的地不能超过255个字符'),
  16. pickupPoint: z.string().min(1, '上车点不能为空').max(255, '上车点不能超过255个字符'),
  17. dropoffPoint: z.string().min(1, '下车点不能为空').max(255, '下车点不能超过255个字符'),
  18. departureTime: z.string().datetime('出发时间格式不正确'),
  19. vehicleType: z.nativeEnum(VehicleType, {
  20. message: '车型必须是有效的类型(bus/minibus/car)'
  21. }),
  22. price: z.number().min(0, '价格不能为负数').max(99999999.99, '价格不能超过99999999.99'),
  23. seatCount: z.number().int().min(1, '座位数至少为1').max(1000, '座位数不能超过1000'),
  24. availableSeats: z.number().int().min(0, '可用座位数不能为负数').max(1000, '可用座位数不能超过1000'),
  25. activityId: z.number().int().positive('活动ID必须为正整数'),
  26. });
  27. // 路线更新Schema
  28. export const updateRouteSchema = z.object({
  29. name: z.string().min(1, '路线名称不能为空').max(255, '路线名称不能超过255个字符').optional(),
  30. description: z.string().max(1000, '路线描述不能超过1000个字符').optional().nullable(),
  31. startPoint: z.string().min(1, '出发地不能为空').max(255, '出发地不能超过255个字符').optional(),
  32. endPoint: z.string().min(1, '目的地不能为空').max(255, '目的地不能超过255个字符').optional(),
  33. pickupPoint: z.string().min(1, '上车点不能为空').max(255, '上车点不能超过255个字符').optional(),
  34. dropoffPoint: z.string().min(1, '下车点不能为空').max(255, '下车点不能超过255个字符').optional(),
  35. departureTime: z.string().datetime('出发时间格式不正确').optional(),
  36. vehicleType: z.nativeEnum(VehicleType, {
  37. message: '车型必须是有效的类型(bus/minibus/car)'
  38. }).optional(),
  39. price: z.number().min(0, '价格不能为负数').max(99999999.99, '价格不能超过99999999.99').optional(),
  40. seatCount: z.number().int().min(1, '座位数至少为1').max(1000, '座位数不能超过1000').optional(),
  41. availableSeats: z.number().int().min(0, '可用座位数不能为负数').max(1000, '可用座位数不能超过1000').optional(),
  42. activityId: z.number().int().positive('活动ID必须为正整数').optional(),
  43. isDisabled: z.nativeEnum(DisabledStatus).optional(),
  44. });
  45. // 路线获取Schema
  46. export const getRouteSchema = z.object({
  47. id: z.number().int().positive('ID必须为正整数'),
  48. name: z.string().min(1, '路线名称不能为空').max(255, '路线名称不能超过255个字符'),
  49. description: z.string().max(1000, '路线描述不能超过1000个字符').optional().nullable(),
  50. startPoint: z.string().min(1, '出发地不能为空').max(255, '出发地不能超过255个字符'),
  51. endPoint: z.string().min(1, '目的地不能为空').max(255, '目的地不能超过255个字符'),
  52. pickupPoint: z.string().min(1, '上车点不能为空').max(255, '上车点不能超过255个字符'),
  53. dropoffPoint: z.string().min(1, '下车点不能为空').max(255, '下车点不能超过255个字符'),
  54. departureTime: z.coerce.date(),
  55. vehicleType: z.nativeEnum(VehicleType, {
  56. message: '车型必须是有效的类型(bus/minibus/car)'
  57. }),
  58. price: z.coerce.number().min(0, '价格不能为负数').max(99999999.99, '价格不能超过99999999.99'),
  59. seatCount: z.number().int().min(1, '座位数至少为1').max(1000, '座位数不能超过1000'),
  60. availableSeats: z.number().int().min(0, '可用座位数不能为负数').max(1000, '可用座位数不能超过1000'),
  61. activityId: z.number().int().positive('活动ID必须为正整数'),
  62. isDisabled: z.nativeEnum(DisabledStatus),
  63. createdAt: z.coerce.date(),
  64. updatedAt: z.coerce.date(),
  65. createdBy: z.number().int().nullable(),
  66. updatedBy: z.number().int().nullable(),
  67. });
  68. // 路线列表查询Schema
  69. export const listRoutesSchema = z.object({
  70. keyword: z.string().optional(),
  71. vehicleType: z.string().optional(),
  72. minPrice: z.coerce.number().min(0).optional(),
  73. maxPrice: z.coerce.number().min(0).optional(),
  74. activityId: z.coerce.number().int().positive().optional(),
  75. isDisabled: z.coerce.number().int().optional(),
  76. page: z.coerce.number().int().min(1).default(1),
  77. pageSize: z.coerce.number().int().min(1).max(100).default(20),
  78. sortBy: z.enum(['name', 'price', 'departureTime', 'createdAt']).default('createdAt'),
  79. sortOrder: z.enum(['ASC', 'DESC']).default('DESC'),
  80. });
  81. // 路线列表返回Schema
  82. export const routeListResponseSchema = z.object({
  83. id: z.number().int().positive('ID必须为正整数'),
  84. name: z.string().min(1, '路线名称不能为空').max(255, '路线名称不能超过255个字符'),
  85. description: z.string().max(1000, '路线描述不能超过1000个字符').optional().nullable(),
  86. startPoint: z.string().min(1, '出发地不能为空').max(255, '出发地不能超过255个字符'),
  87. endPoint: z.string().min(1, '目的地不能为空').max(255, '目的地不能超过255个字符'),
  88. pickupPoint: z.string().min(1, '上车点不能为空').max(255, '上车点不能超过255个字符'),
  89. dropoffPoint: z.string().min(1, '下车点不能为空').max(255, '下车点不能超过255个字符'),
  90. departureTime: z.coerce.date(),
  91. vehicleType: z.nativeEnum(VehicleType, {
  92. message: '车型必须是有效的类型(bus/minibus/car)'
  93. }),
  94. price: z.coerce.number().min(0, '价格不能为负数').max(99999999.99, '价格不能超过99999999.99'),
  95. seatCount: z.number().int().min(1, '座位数至少为1').max(1000, '座位数不能超过1000'),
  96. availableSeats: z.number().int().min(0, '可用座位数不能为负数').max(1000, '可用座位数不能超过1000'),
  97. activityId: z.number().int().positive('活动ID必须为正整数'),
  98. isDisabled: z.nativeEnum(DisabledStatus),
  99. createdAt: z.coerce.date(),
  100. updatedAt: z.coerce.date(),
  101. createdBy: z.number().int().nullable(),
  102. updatedBy: z.number().int().nullable(),
  103. activity: z.object({
  104. id: z.number().int().positive('活动ID必须为正整数'),
  105. name: z.string().min(1, '活动名称不能为空').max(255, '活动名称不能超过255个字符'),
  106. type: z.nativeEnum(ActivityType, {
  107. message: '活动类型必须是departure(去程)或return(返程)'
  108. }),
  109. }).optional(),
  110. });
  111. // 路线删除Schema
  112. export const deleteRouteSchema = z.object({
  113. id: z.number().int().positive('ID必须为正整数'),
  114. });
  115. // 路线启用/禁用Schema
  116. export const toggleRouteStatusSchema = z.object({
  117. id: z.number().int().positive('ID必须为正整数'),
  118. isDisabled: z.nativeEnum(DisabledStatus),
  119. });
  120. // 导出类型
  121. export type CreateRouteInput = z.infer<typeof createRouteSchema>;
  122. export type UpdateRouteInput = z.infer<typeof updateRouteSchema>;
  123. export type GetRouteInput = z.infer<typeof getRouteSchema>;
  124. export type ListRoutesInput = z.infer<typeof listRoutesSchema>;
  125. export type DeleteRouteInput = z.infer<typeof deleteRouteSchema>;
  126. export type ToggleRouteStatusInput = z.infer<typeof toggleRouteStatusSchema>;