Procházet zdrojové kódy

✨ feat(activities): add createdBy and updatedBy fields to activity entity
- add created_by column to store creator ID
- add updated_by column to store updater ID

✨ feat(routes): add createdBy and updatedBy fields to route entity
- add created_by column to store creator ID
- add updated_by column to store updater ID

♻️ refactor(schema): update createdBy and updatedBy schema definitions
- change createdBy from optional to nullable in activity schema
- change updatedBy from optional to nullable in activity schema
- change createdBy from optional to nullable in route schema
- change updatedBy from optional to nullable in route schema

✅ test(routes): enhance route test data factory
- add pickupPoint and dropoffPoint fields to test route data
- add availableSeats field to test route data
- automatically create test activity if activityId not provided

🔧 chore(test): improve error debugging for activity list tests
- add error logging when fetching activity list fails

yourname před 4 měsíci
rodič
revize
64d9c1257c

+ 6 - 0
src/server/modules/activities/activity.entity.ts

@@ -41,6 +41,12 @@ export class ActivityEntity {
   @Column({ name: 'is_deleted', type: 'int', default: DeleteStatus.NOT_DELETED, comment: '是否删除(0:未删除,1:已删除)' })
   isDeleted!: DeleteStatus;
 
+  @Column({ name: 'created_by', type: 'int', nullable: true, comment: '创建人ID' })
+  createdBy!: number | null;
+
+  @Column({ name: 'updated_by', type: 'int', nullable: true, comment: '更新人ID' })
+  updatedBy!: number | null;
+
   @CreateDateColumn({ name: 'created_at', type: 'timestamp' })
   createdAt!: Date;
 

+ 4 - 4
src/server/modules/activities/activity.schema.ts

@@ -49,8 +49,8 @@ export const getActivitySchema = z.object({
   isDisabled: z.nativeEnum(DisabledStatus),
   createdAt: z.coerce.date(),
   updatedAt: z.coerce.date(),
-  createdBy: z.number().int().optional(),
-  updatedBy: z.number().int().optional(),
+  createdBy: z.number().int().nullable(),
+  updatedBy: z.number().int().nullable(),
 });
 
 // 活动列表查询Schema
@@ -77,8 +77,8 @@ export const activityListResponseSchema = z.object({
   isDisabled: z.nativeEnum(DisabledStatus),
   createdAt: z.coerce.date(),
   updatedAt: z.coerce.date(),
-  createdBy: z.number().int().optional(),
-  updatedBy: z.number().int().optional(),
+  createdBy: z.number().int().nullable(),
+  updatedBy: z.number().int().nullable(),
 });
 
 // 活动删除Schema

+ 6 - 0
src/server/modules/routes/route.entity.ts

@@ -53,6 +53,12 @@ export class RouteEntity {
   @Column({ name: 'is_deleted', type: 'int', default: DeleteStatus.NOT_DELETED, comment: '是否删除(0:未删除,1:已删除)' })
   isDeleted!: DeleteStatus;
 
+  @Column({ name: 'created_by', type: 'int', nullable: true, comment: '创建人ID' })
+  createdBy!: number | null;
+
+  @Column({ name: 'updated_by', type: 'int', nullable: true, comment: '更新人ID' })
+  updatedBy!: number | null;
+
   @CreateDateColumn({ name: 'created_at', type: 'timestamp' })
   createdAt!: Date;
 

+ 4 - 4
src/server/modules/routes/route.schema.ts

@@ -53,8 +53,8 @@ export const getRouteSchema = z.object({
   isDisabled: z.nativeEnum(DisabledStatus),
   createdAt: z.coerce.date(),
   updatedAt: z.coerce.date(),
-  createdBy: z.number().int().optional(),
-  updatedBy: z.number().int().optional(),
+  createdBy: z.number().int().nullable(),
+  updatedBy: z.number().int().nullable(),
 });
 
 // 路线列表查询Schema
@@ -89,8 +89,8 @@ export const routeListResponseSchema = z.object({
   isDisabled: z.nativeEnum(DisabledStatus),
   createdAt: z.coerce.date(),
   updatedAt: z.coerce.date(),
-  createdBy: z.number().int().optional(),
-  updatedBy: z.number().int().optional(),
+  createdBy: z.number().int().nullable(),
+  updatedBy: z.number().int().nullable(),
   activity: z.object({
     id: z.number().int().positive('活动ID必须为正整数'),
     name: z.string().min(1, '活动名称不能为空').max(255, '活动名称不能超过255个字符'),

+ 4 - 0
tests/integration/server/admin/activities.integration.test.ts

@@ -134,6 +134,10 @@ describe('活动管理API集成测试', () => {
         }
       });
 
+      if (response.status !== 200) {
+        const errorData = await response.json();
+        console.debug('获取活动列表失败:', errorData);
+      }
       expect(response.status).toBe(200);
       if (response.status === 200) {
         const responseData = await response.json();

+ 9 - 0
tests/utils/server/integration-test-db.ts

@@ -118,10 +118,13 @@ export class TestDataFactory {
       name: `测试路线_${timestamp}`,
       startPoint: `出发地_${timestamp}`,
       endPoint: `目的地_${timestamp}`,
+      pickupPoint: `上车点_${timestamp}`,
+      dropoffPoint: `下车点_${timestamp}`,
       departureTime: departureTime,
       vehicleType: 'bus',
       price: 100,
       seatCount: 40,
+      availableSeats: 40,
       isDisabled: 0,
       isDeleted: 0,
       ...overrides
@@ -146,6 +149,12 @@ export class TestDataFactory {
     const routeData = this.createRouteData(overrides);
     const routeRepository = dataSource.getRepository(RouteEntity);
 
+    // 如果没有提供activityId,自动创建一个测试活动
+    if (!routeData.activityId) {
+      const testActivity = await this.createTestActivity(dataSource);
+      routeData.activityId = testActivity.id;
+    }
+
     const route = routeRepository.create(routeData);
     return await routeRepository.save(route);
   }