Sfoglia il codice sorgente

♻️ refactor(classroom): move ClassroomStatus enum to entity file

- move ClassroomStatus enum and name map from types_stock.ts to classroom-data.entity.ts
- update status column type from varchar to enum in ClassroomData entity
- adjust status schema in ClassroomDataSchema, CreateClassroomDataDto and UpdateClassroomDataDto to use native enum

✨ feat(client): update classroom query parameters

- modify classroom query format from { classroom_no } to { filters: JSON.stringify({ classroomNo }) }
- update ClassroomStatus import path in ExamIndex component
yourname 5 mesi fa
parent
commit
03d7642604

+ 3 - 2
src/client/mobile/components/Exam/ExamIndex.tsx

@@ -3,7 +3,8 @@ import { useNavigate } from "react-router";
 import dayjs from 'dayjs';
 import { message } from 'antd';
 import { classroomDataClient } from '@/client/api';
-import { ClassroomStatus, type ClassroomData } from '@/share/types_stock';
+import { type ClassroomData } from '@/share/types_stock';
+import { ClassroomStatus } from '@/server/modules/classroom/classroom-data.entity';
 
 // 教室号输入页面
 function ExamIndex() {
@@ -22,7 +23,7 @@ function ExamIndex() {
     try {
       setIsLoading(true);
       const response = await classroomDataClient.$get({
-        query: { classroom_no: classroom }
+        query: { filters: JSON.stringify({ classroomNo: classroom }) }
       });
       
       if (response.status !== 200) {

+ 17 - 5
src/server/modules/classroom/classroom-data.entity.ts

@@ -1,6 +1,18 @@
 import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
 import { z } from '@hono/zod-openapi';
 
+// 教室状态枚举
+export enum ClassroomStatus {
+  CLOSED = 0,  // 关闭
+  OPEN = 1     // 开放
+}
+
+// 教室状态中文映射
+export const ClassroomStatusNameMap: Record<ClassroomStatus, string> = {
+  [ClassroomStatus.CLOSED]: '关闭',
+  [ClassroomStatus.OPEN]: '开放'
+};
+
 @Entity('classroom_data')
 export class ClassroomData {
   @PrimaryGeneratedColumn({ unsigned: true })
@@ -24,8 +36,8 @@ export class ClassroomData {
   @Column({ name: 'code', type: 'varchar', length: 255, nullable: true, comment: '代码' })
   code!: string | null;
 
-  @Column({ name: 'status', type: 'varchar', length: 255, nullable: true, comment: '状态' })
-  status!: string | null;
+  @Column({ name: 'status', type: 'enum', enum:ClassroomStatus, length: 255, nullable: true, comment: '状态' })
+  status!: ClassroomStatus | null;
 
   @Column({ name: 'spare', type: 'varchar', length: 255, nullable: true, comment: '备用' })
   spare!: string | null;
@@ -48,7 +60,7 @@ export const ClassroomDataSchema = z.object({
   holdingCash: z.string().max(255).nullable().openapi({ description: '持币', example: '10000元' }),
   price: z.string().max(255).nullable().openapi({ description: '价格', example: '15.68' }),
   code: z.string().max(255).nullable().openapi({ description: '代码', example: '001339' }),
-  status: z.string().max(255).nullable().openapi({ description: '状态', example: '1' }),
+  status: z.nativeEnum(ClassroomStatus).nullable().openapi({ description: '状态', example: ClassroomStatus.OPEN }),
   spare: z.string().max(255).nullable().openapi({ description: '备用', example: '' }),
   submitUser: z.string().max(255).nullable().openapi({ description: '提交用户', example: '' }),
   createdAt: z.date().openapi({ description: '创建时间', example: '2025-05-21T16:44:36Z' }),
@@ -62,7 +74,7 @@ export const CreateClassroomDataDto = z.object({
   holdingCash: z.string().max(255).optional().nullable().openapi({ description: '持币', example: '10000元' }),
   price: z.string().max(255).optional().nullable().openapi({ description: '价格', example: '15.68' }),
   code: z.string().max(255).optional().nullable().openapi({ description: '代码', example: '001339' }),
-  status: z.string().max(255).optional().nullable().openapi({ description: '状态', example: '1' }),
+  status: z.nativeEnum(ClassroomStatus).optional().nullable().openapi({ description: '状态', example: ClassroomStatus.OPEN }),
   spare: z.string().max(255).optional().nullable().openapi({ description: '备用', example: '' }),
   submitUser: z.string().max(255).optional().nullable().openapi({ description: '提交用户', example: '' })
 });
@@ -74,7 +86,7 @@ export const UpdateClassroomDataDto = z.object({
   holdingCash: z.string().max(255).optional().nullable().openapi({ description: '持币', example: '10000元' }),
   price: z.string().max(255).optional().nullable().openapi({ description: '价格', example: '15.68' }),
   code: z.string().max(255).optional().nullable().openapi({ description: '代码', example: '001339' }),
-  status: z.string().max(255).optional().nullable().openapi({ description: '状态', example: '1' }),
+  status: z.nativeEnum(ClassroomStatus).optional().nullable().openapi({ description: '状态', example: ClassroomStatus.OPEN }),
   spare: z.string().max(255).optional().nullable().openapi({ description: '备用', example: '' }),
   submitUser: z.string().max(255).optional().nullable().openapi({ description: '提交用户', example: '' })
 });

+ 1 - 11
src/share/types_stock.ts

@@ -1,14 +1,4 @@
-// 教室状态枚举
-export enum ClassroomStatus {
-    CLOSED = 0,  // 关闭
-    OPEN = 1     // 开放
-  }
-  
-  // 教室状态中文映射
-  export const ClassroomStatusNameMap: Record<ClassroomStatus, string> = {
-    [ClassroomStatus.CLOSED]: '关闭',
-    [ClassroomStatus.OPEN]: '开放'
-  };
+
   
   // 教室数据接口
   export interface ClassroomData {