location.schema.ts 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import { z } from 'zod';
  2. import { DisabledStatus } from '@/share/types';
  3. // 地点信息Schema - 用于其他模块引用
  4. export const locationInfoSchema = z.object({
  5. id: z.number().int().positive('地点ID必须为正整数'),
  6. name: z.string().min(1, '地点名称不能为空'),
  7. address: z.string().optional().nullable(),
  8. province: z.object({
  9. id: z.number().int().positive('省份ID必须为正整数'),
  10. name: z.string().min(1, '省份名称不能为空'),
  11. level: z.number().int().min(1).max(3),
  12. code: z.string().optional().nullable(),
  13. }).optional().nullable(),
  14. city: z.object({
  15. id: z.number().int().positive('城市ID必须为正整数'),
  16. name: z.string().min(1, '城市名称不能为空'),
  17. level: z.number().int().min(1).max(3),
  18. code: z.string().optional().nullable(),
  19. }).optional().nullable(),
  20. district: z.object({
  21. id: z.number().int().positive('区县ID必须为正整数'),
  22. name: z.string().min(1, '区县名称不能为空'),
  23. level: z.number().int().min(1).max(3),
  24. code: z.string().optional().nullable(),
  25. }).optional().nullable(),
  26. });
  27. // 地点创建Schema
  28. export const createLocationSchema = z.object({
  29. name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符'),
  30. provinceId: z.number().int().positive('省份ID必须为正整数'),
  31. cityId: z.number().int().positive('城市ID必须为正整数'),
  32. districtId: z.number().int().positive('区县ID必须为正整数'),
  33. address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符'),
  34. latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable().optional(),
  35. longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable().optional(),
  36. isDisabled: z.nativeEnum(DisabledStatus).default(DisabledStatus.ENABLED),
  37. });
  38. // 地点更新Schema
  39. export const updateLocationSchema = z.object({
  40. name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符').optional(),
  41. provinceId: z.number().int().positive('省份ID必须为正整数').optional(),
  42. cityId: z.number().int().positive('城市ID必须为正整数').optional(),
  43. districtId: z.number().int().positive('区县ID必须为正整数').optional(),
  44. address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符').optional(),
  45. latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable().optional(),
  46. longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable().optional(),
  47. isDisabled: z.nativeEnum(DisabledStatus).optional(),
  48. });
  49. // 地点获取Schema
  50. export const getLocationSchema = z.object({
  51. id: z.number().int().positive('ID必须为正整数'),
  52. name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符'),
  53. provinceId: z.number().int().positive('省份ID必须为正整数'),
  54. cityId: z.number().int().positive('城市ID必须为正整数'),
  55. districtId: z.number().int().positive('区县ID必须为正整数'),
  56. address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符'),
  57. latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable(),
  58. longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable(),
  59. isDisabled: z.nativeEnum(DisabledStatus),
  60. isDeleted: z.number().int(),
  61. createdAt: z.coerce.date(),
  62. updatedAt: z.coerce.date(),
  63. createdBy: z.number().int().nullable(),
  64. updatedBy: z.number().int().nullable(),
  65. });
  66. // 地点列表查询Schema
  67. export const listLocationsSchema = z.object({
  68. keyword: z.string().optional(),
  69. provinceId: z.coerce.number().int().positive().optional(),
  70. cityId: z.coerce.number().int().positive().optional(),
  71. districtId: z.coerce.number().int().positive().optional(),
  72. isDisabled: z.coerce.number().int().optional(),
  73. page: z.coerce.number().int().min(1).default(1),
  74. pageSize: z.coerce.number().int().min(1).max(100).default(20),
  75. sortBy: z.enum(['name', 'provinceId', 'cityId', 'districtId', 'createdAt']).default('createdAt'),
  76. sortOrder: z.enum(['ASC', 'DESC']).default('DESC'),
  77. });
  78. // 地点列表返回Schema
  79. export const locationListResponseSchema = z.object({
  80. id: z.number().int().positive('ID必须为正整数'),
  81. name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符'),
  82. provinceId: z.number().int().positive('省份ID必须为正整数'),
  83. cityId: z.number().int().positive('城市ID必须为正整数'),
  84. districtId: z.number().int().positive('区县ID必须为正整数'),
  85. address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符'),
  86. latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable(),
  87. longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable(),
  88. isDisabled: z.nativeEnum(DisabledStatus),
  89. isDeleted: z.number().int(),
  90. createdAt: z.coerce.date(),
  91. updatedAt: z.coerce.date(),
  92. createdBy: z.number().int().nullable(),
  93. updatedBy: z.number().int().nullable(),
  94. // 关联的省市区信息
  95. province: z.object({
  96. id: z.number().int().positive('省份ID必须为正整数'),
  97. name: z.string().min(1, '省份名称不能为空').max(100, '省份名称不能超过100个字符'),
  98. level: z.coerce.number().int().min(1).max(1, '省份层级必须为1'),
  99. code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
  100. }).nullable(),
  101. city: z.object({
  102. id: z.number().int().positive('城市ID必须为正整数'),
  103. name: z.string().min(1, '城市名称不能为空').max(100, '城市名称不能超过100个字符'),
  104. level: z.coerce.number().int().min(2).max(2, '城市层级必须为2'),
  105. code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
  106. }).nullable(),
  107. district: z.object({
  108. id: z.number().int().positive('区县ID必须为正整数'),
  109. name: z.string().min(1, '区县名称不能为空').max(100, '区县名称不能超过100个字符'),
  110. level: z.coerce.number().int().min(2).max(3, '区县层级必须在2-3之间'),
  111. code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
  112. }).nullable(),
  113. });
  114. // 地点删除Schema
  115. export const deleteLocationSchema = z.object({
  116. id: z.number().int().positive('ID必须为正整数'),
  117. });
  118. // 地点启用/禁用Schema
  119. export const toggleLocationStatusSchema = z.object({
  120. id: z.number().int().positive('ID必须为正整数'),
  121. isDisabled: z.nativeEnum(DisabledStatus),
  122. });
  123. // 地点搜索Schema
  124. export const searchLocationsSchema = z.object({
  125. keyword: z.string().optional(),
  126. provinceId: z.coerce.number().int().positive().optional(),
  127. cityId: z.coerce.number().int().positive().optional(),
  128. districtId: z.coerce.number().int().positive().optional(),
  129. limit: z.coerce.number().int().min(1).max(50).default(20),
  130. });
  131. // 导出类型
  132. export type CreateLocationInput = z.infer<typeof createLocationSchema>;
  133. export type UpdateLocationInput = z.infer<typeof updateLocationSchema>;
  134. export type GetLocationInput = z.infer<typeof getLocationSchema>;
  135. export type ListLocationsInput = z.infer<typeof listLocationsSchema>;
  136. export type DeleteLocationInput = z.infer<typeof deleteLocationSchema>;
  137. export type ToggleLocationStatusInput = z.infer<typeof toggleLocationStatusSchema>;
  138. export type SearchLocationsInput = z.infer<typeof searchLocationsSchema>;