Procházet zdrojové kódy

♻️ refactor(activity): 移除活动类型(ActivityType)相关功能

- 从ActivityEntity中移除type字段及相关导入
- 删除活动创建和更新请求中的type参数
- 移除活动响应数据中的type字段
- 更新活动选择组件,删除类型标签显示
- 调整种子数据,移除所有活动的type属性
- 修改集成测试,删除与活动类型相关的测试用例和数据
yourname před 3 měsíci
rodič
revize
511baa8297

+ 1 - 7
web/scripts/seed.ts

@@ -1,5 +1,5 @@
 import { AppDataSource } from '@d8d/server/data-source';
-import { ActivityEntity, ActivityType } from '@d8d/server/modules/activities/activity.entity.js';
+import { ActivityEntity } from '@d8d/server/modules/activities/activity.entity.js';
 import { RouteEntity } from '@d8d/server/modules/routes/route.entity.js';
 import { VehicleType, TravelMode } from '@d8d/server/modules/routes/route.schema.js';
 import { LocationEntity } from '@d8d/server/modules/locations/location.entity.js';
@@ -137,7 +137,6 @@ async function seed() {
       {
         name: '中超联赛北京国安主场赛事',
         description: '北京国安主场对阵上海申花的中超联赛',
-        type: ActivityType.DEPARTURE,
         startDate: new Date('2025-10-15T00:00:00Z'),
         endDate: new Date('2025-10-15T23:59:59Z'),
         venueLocationId: savedLocations[0].id, // 工人体育场
@@ -145,7 +144,6 @@ async function seed() {
       {
         name: '中超联赛北京国安主场赛事',
         description: '北京国安主场赛事',
-        type: ActivityType.RETURN,
         startDate: new Date('2025-10-15T21:00:00Z'),
         endDate: new Date('2025-10-16T02:00:00Z'),
         venueLocationId: savedLocations[0].id, // 工人体育场
@@ -153,7 +151,6 @@ async function seed() {
       {
         name: '周杰伦北京演唱会',
         description: '周杰伦北京演唱会专场',
-        type: ActivityType.DEPARTURE,
         startDate: new Date('2025-11-01T00:00:00Z'),
         endDate: new Date('2025-11-01T23:59:59Z'),
         venueLocationId: savedLocations[1].id, // 鸟巢
@@ -161,7 +158,6 @@ async function seed() {
       {
         name: '周杰伦北京演唱会',
         description: '周杰伦演唱会',
-        type: ActivityType.RETURN,
         startDate: new Date('2025-11-01T22:30:00Z'),
         endDate: new Date('2025-11-02T01:00:00Z'),
         venueLocationId: savedLocations[1].id, // 鸟巢
@@ -169,7 +165,6 @@ async function seed() {
       {
         name: 'CBA北京首钢主场赛事',
         description: '北京首钢主场对阵广东宏远的CBA联赛',
-        type: ActivityType.DEPARTURE,
         startDate: new Date('2025-10-20T00:00:00Z'),
         endDate: new Date('2025-10-20T23:59:59Z'),
         venueLocationId: savedLocations[2].id, // 五棵松体育馆
@@ -177,7 +172,6 @@ async function seed() {
       {
         name: 'CBA北京首钢主场赛事',
         description: '北京首钢主场赛事',
-        type: ActivityType.RETURN,
         startDate: new Date('2025-10-20T21:30:00Z'),
         endDate: new Date('2025-10-21T00:30:00Z'),
         venueLocationId: savedLocations[2].id, // 五棵松体育馆

+ 1 - 14
web/src/client/admin/components/ActivitySelect.tsx

@@ -2,25 +2,12 @@
 
 import * as React from "react"
 import { useQuery } from "@tanstack/react-query"
-import { ActivityType } from "@d8d/server/modules/activities/activity.entity"
 import { Combobox } from "@/client/components/ui/combobox"
 import { activityClient } from "@/client/api"
 import type { InferResponseType } from "hono/client"
 
 type ActivityResponse = InferResponseType<typeof activityClient.$get, 200>['data'][0]
 
-// 获取活动类型显示标签
-const getActivityTypeLabel = (type: ActivityType) => {
-  switch (type) {
-    case ActivityType.DEPARTURE:
-      return "去程"
-    case ActivityType.RETURN:
-      return "返程"
-    default:
-      return "未知"
-  }
-}
-
 interface ActivitySelectProps {
   value?: number
   onValueChange?: (value: number) => void
@@ -65,7 +52,7 @@ export function ActivitySelect({
 
     return activitiesData.data.map((activity: ActivityResponse) => ({
       value: activity.id.toString(),
-      label: `${activity.name} (${getActivityTypeLabel(activity.type)})`,
+      label: activity.name,
     }))
   }, [activitiesData, searchKeyword])
 

+ 1 - 5
web/src/share/activity.types.ts

@@ -1,4 +1,4 @@
-import { ActivityEntity, ActivityType } from '@d8d/server/modules/activities/activity.entity';
+import { ActivityEntity } from '@d8d/server/modules/activities/activity.entity';
 import { RouteEntity } from '@d8d/server/modules/routes/route.entity';
 import { LocationResponse } from './location.types';
 
@@ -9,7 +9,6 @@ export type Activity = ActivityEntity;
 export interface CreateActivityRequest {
   name: string;
   description?: string | null;
-  type: ActivityType;
   startDate: Date;
   endDate: Date;
   venueLocationId: number;
@@ -19,7 +18,6 @@ export interface CreateActivityRequest {
 export interface UpdateActivityRequest {
   name?: string;
   description?: string | null;
-  type?: ActivityType;
   startDate?: Date;
   endDate?: Date;
   venueLocationId?: number;
@@ -31,7 +29,6 @@ export interface ActivityResponse {
   id: number;
   name: string;
   description: string | null;
-  type: ActivityType;
   startDate: Date;
   endDate: Date;
   venueLocationId: number;
@@ -54,7 +51,6 @@ export interface ActivityListResponse {
 // 活动搜索参数
 export interface ActivitySearchParams {
   keyword?: string;
-  type?: ActivityType;
   isDisabled?: number;
   page?: number;
   pageSize?: number;

+ 1 - 3
web/tests/integration/client/admin/ActivityForm.test.tsx

@@ -4,7 +4,6 @@ import userEvent from '@testing-library/user-event';
 import '@testing-library/jest-dom';
 import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
 import { ActivityForm } from '@/client/admin/components/ActivityForm';
-import { ActivityType } from '@d8d/server/modules/activities/activity.entity';
 
 // Mock API 客户端
 
@@ -20,6 +19,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => {
 
   return (
     <QueryClientProvider client={queryClient}>
+      {/* @ts-ignore */}
       {children}
     </QueryClientProvider>
   );
@@ -126,7 +126,6 @@ describe('ActivityForm', () => {
       id: 1,
       name: '测试活动',
       description: '测试活动描述',
-      type: ActivityType.DEPARTURE,
       startDate: new Date('2025-10-17T08:00:00.000Z'),
       endDate: new Date('2025-10-17T18:00:00.000Z'),
       venueLocationId: 1,
@@ -257,7 +256,6 @@ describe('ActivityForm', () => {
       id: 1,
       name: '测试活动',
       description: '测试活动描述',
-      type: ActivityType.DEPARTURE,
       startDate: new Date('2025-10-17T08:00:00.000Z'),
       endDate: new Date('2025-10-17T18:00:00.000Z'),
       venueLocationId: 1,

+ 8 - 10
web/tests/integration/server/admin/activities.integration.test.ts

@@ -41,9 +41,8 @@ describe('活动管理API集成测试', () => {
       const testLocation = await TestDataFactory.createTestLocation(dataSource);
 
       const activityData = {
-        name: '测试去程活动',
-        description: '这是一个测试去程活动',
-        type: ActivityType.DEPARTURE,
+        name: '测试活动',
+        description: '这是一个测试活动',
         startDate: '2025-10-17T08:00:00.000Z',
         endDate: '2025-10-17T18:00:00.000Z',
         venueLocationId: testLocation.id
@@ -79,7 +78,6 @@ describe('活动管理API集成测试', () => {
       const activityData = {
         name: '测试返程活动',
         description: '这是一个测试返程活动',
-        type: ActivityType.RETURN,
         startDate: '2025-10-17T16:00:00.000Z',
         endDate: '2025-10-17T20:00:00.000Z',
         venueLocationId: testLocation.id
@@ -134,8 +132,8 @@ describe('活动管理API集成测试', () => {
       if (!dataSource) throw new Error('Database not initialized');
 
       // 创建几个测试活动
-      await TestDataFactory.createTestActivity(dataSource, { name: '活动1', type: ActivityType.DEPARTURE });
-      await TestDataFactory.createTestActivity(dataSource, { name: '活动2', type: ActivityType.RETURN });
+      await TestDataFactory.createTestActivity(dataSource, { name: '活动1' });
+      await TestDataFactory.createTestActivity(dataSource, { name: '活动2' });
 
       const response = await client.activities.$get({
         query: {}
@@ -432,12 +430,12 @@ describe('活动管理API集成测试', () => {
       const dataSource = await IntegrationTestDatabase.getDataSource();
       if (!dataSource) throw new Error('Database not initialized');
 
-      await TestDataFactory.createTestActivity(dataSource, { name: '去程活动1', type: ActivityType.DEPARTURE });
-      await TestDataFactory.createTestActivity(dataSource, { name: '去程活动2', type: ActivityType.DEPARTURE });
-      await TestDataFactory.createTestActivity(dataSource, { name: '返程活动1', type: ActivityType.RETURN });
+      await TestDataFactory.createTestActivity(dataSource, { name: '活动1' });
+      await TestDataFactory.createTestActivity(dataSource, { name: '活动2' });
+      await TestDataFactory.createTestActivity(dataSource, { name: '活动3' });
 
       const response = await client.activities.$get({
-        query: { filters: JSON.stringify({ type: ActivityType.DEPARTURE }) }
+        query: { filters: JSON.stringify({ isDisabled: 0 }) }
       },
       {
         headers: {

+ 1 - 2
web/tests/utils/server/integration-test-db.ts

@@ -2,7 +2,7 @@ import { DataSource } from 'typeorm';
 import { beforeEach, afterEach } from 'vitest';
 import { UserEntity } from '@d8d/server/modules/users/user.entity';
 import { Role } from '@d8d/server/modules/users/role.entity';
-import { ActivityEntity, ActivityType } from '@d8d/server/modules/activities/activity.entity';
+import { ActivityEntity } from '@d8d/server/modules/activities/activity.entity';
 import { RouteEntity } from '@d8d/server/modules/routes/route.entity';
 import { LocationEntity } from '@d8d/server/modules/locations/location.entity';
 import { AreaEntity } from '@d8d/server/modules/areas/area.entity';
@@ -190,7 +190,6 @@ export class TestDataFactory {
     return {
       name: `测试活动_${timestamp}`,
       description: `测试活动描述_${timestamp}`,
-      type: ActivityType.DEPARTURE,
       startDate: now,
       endDate: tomorrow,
       venueLocationId: 0, // 将在创建时自动设置