Browse Source

♻️ refactor(locations): extract location schema for shared use
- 从activities模块中提取locationInfoSchema到locations模块
- 在activities和routes模块中引用共享的locationInfoSchema

✨ feat(routes): add location relations to route schema
- 在路线Schema中添加startLocation和endLocation字段
- 在admin路由配置中添加startLocation和endLocation关联查询

yourname 4 tháng trước cách đây
mục cha
commit
85e989f67a

+ 1 - 1
src/server/api/admin/routes/index.ts

@@ -11,7 +11,7 @@ export const routesRoutes = createCrudRoutes({
   getSchema: getRouteSchema,
   listSchema: routeListResponseSchema,
   searchFields: ['name', 'startPoint', 'endPoint', 'vehicleType'],
-  relations: ['activity'],
+  relations: ['activity', 'startLocation', 'endLocation'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 1 - 25
src/server/modules/activities/activity.schema.ts

@@ -1,31 +1,7 @@
 import { z } from 'zod';
 import { DisabledStatus } from '@/share/types';
 import { ActivityType } from './activity.entity';
-
-// 地点信息Schema
-const locationInfoSchema = z.object({
-  id: z.number().int().positive('地点ID必须为正整数'),
-  name: z.string().min(1, '地点名称不能为空'),
-  address: z.string().optional().nullable(),
-  province: z.object({
-    id: z.number().int().positive('省份ID必须为正整数'),
-    name: z.string().min(1, '省份名称不能为空'),
-    level: z.number().int().min(1).max(3),
-    code: z.string().optional().nullable(),
-  }).optional().nullable(),
-  city: z.object({
-    id: z.number().int().positive('城市ID必须为正整数'),
-    name: z.string().min(1, '城市名称不能为空'),
-    level: z.number().int().min(1).max(3),
-    code: z.string().optional().nullable(),
-  }).optional().nullable(),
-  district: z.object({
-    id: z.number().int().positive('区县ID必须为正整数'),
-    name: z.string().min(1, '区县名称不能为空'),
-    level: z.number().int().min(1).max(3),
-    code: z.string().optional().nullable(),
-  }).optional().nullable(),
-});
+import { locationInfoSchema } from '@/server/modules/locations/location.schema';
 
 // 活动创建Schema
 export const createActivitySchema = z.object({

+ 25 - 0
src/server/modules/locations/location.schema.ts

@@ -1,6 +1,31 @@
 import { z } from 'zod';
 import { DisabledStatus } from '@/share/types';
 
+// 地点信息Schema - 用于其他模块引用
+export const locationInfoSchema = z.object({
+  id: z.number().int().positive('地点ID必须为正整数'),
+  name: z.string().min(1, '地点名称不能为空'),
+  address: z.string().optional().nullable(),
+  province: z.object({
+    id: z.number().int().positive('省份ID必须为正整数'),
+    name: z.string().min(1, '省份名称不能为空'),
+    level: z.number().int().min(1).max(3),
+    code: z.string().optional().nullable(),
+  }).optional().nullable(),
+  city: z.object({
+    id: z.number().int().positive('城市ID必须为正整数'),
+    name: z.string().min(1, '城市名称不能为空'),
+    level: z.number().int().min(1).max(3),
+    code: z.string().optional().nullable(),
+  }).optional().nullable(),
+  district: z.object({
+    id: z.number().int().positive('区县ID必须为正整数'),
+    name: z.string().min(1, '区县名称不能为空'),
+    level: z.number().int().min(1).max(3),
+    code: z.string().optional().nullable(),
+  }).optional().nullable(),
+});
+
 // 地点创建Schema
 export const createLocationSchema = z.object({
   name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符'),

+ 5 - 0
src/server/modules/routes/route.schema.ts

@@ -1,5 +1,6 @@
 import { z } from 'zod';
 import { DisabledStatus } from '@/share/types';
+import { locationInfoSchema } from '@/server/modules/locations/location.schema';
 
 // 车型枚举
 export enum VehicleType {
@@ -58,6 +59,8 @@ export const getRouteSchema = z.object({
   description: z.string().max(1000, '路线描述不能超过1000个字符').optional().nullable(),
   startLocationId: z.number().int().positive('出发地点ID必须为正整数'),
   endLocationId: z.number().int().positive('目的地点ID必须为正整数'),
+  startLocation: locationInfoSchema.optional().nullable(),
+  endLocation: locationInfoSchema.optional().nullable(),
   pickupPoint: z.string().min(1, '上车点不能为空').max(255, '上车点不能超过255个字符'),
   dropoffPoint: z.string().min(1, '下车点不能为空').max(255, '下车点不能超过255个字符'),
   departureTime: z.coerce.date(),
@@ -97,6 +100,8 @@ export const routeListResponseSchema = z.object({
   description: z.string().max(1000, '路线描述不能超过1000个字符').optional().nullable(),
   startLocationId: z.number().int().positive('出发地点ID必须为正整数'),
   endLocationId: z.number().int().positive('目的地点ID必须为正整数'),
+  startLocation: locationInfoSchema.optional().nullable(),
+  endLocation: locationInfoSchema.optional().nullable(),
   pickupPoint: z.string().min(1, '上车点不能为空').max(255, '上车点不能超过255个字符'),
   dropoffPoint: z.string().min(1, '下车点不能为空').max(255, '下车点不能超过255个字符'),
   departureTime: z.coerce.date(),