浏览代码

✨ feat(order): 为多个路由添加数据验证和模式重构

- 在订单自定义路由的四个端点中添加 `parseWithAwait` 进行响应数据验证和转换【feat】
- 重构服务层和测试文件,将 `AssetType` 和 `AssetFileType` 枚举从实体移动到模式文件【refactor】
- 在 `findAll` 服务方法中,将返回对象的 `orderId` 字段重命名为 `id` 以保持一致性【refactor】
yourname 14 小时之前
父节点
当前提交
65b1bf6a41

+ 63 - 5
allin-packages/order-module/src/routes/order-custom.routes.ts

@@ -602,7 +602,15 @@ const app = new OpenAPIHono<AuthContext>()
 
       const result = await orderService.findAll(query);
 
-      return c.json(result, 200);
+      // 使用 parseWithAwait 验证和转换数据
+      const validatedData = await parseWithAwait(
+        z.object({
+          data: z.array(EmploymentOrderSchema),
+          total: z.number().int()
+        }),
+        result
+      );
+      return c.json(validatedData, 200);
     } catch (error) {
       return c.json({
         code: 500,
@@ -700,7 +708,16 @@ const app = new OpenAPIHono<AuthContext>()
 
       const result = await orderService.batchAddPersons(orderId, persons);
 
-      return c.json(result, 200);
+      // 使用 parseWithAwait 验证和转换数据
+      const validatedResult = await parseWithAwait(
+        z.object({
+          success: z.boolean(),
+          message: z.string(),
+          addedCount: z.number().int()
+        }),
+        result
+      );
+      return c.json(validatedResult, 200);
     } catch (error) {
       if (error instanceof Error && error.message.includes('已结束或已取消')) {
         return c.json({
@@ -730,7 +747,22 @@ const app = new OpenAPIHono<AuthContext>()
 
       const result = await orderService.createOrderPersonAsset(data);
 
-      return c.json(result, 200);
+      // 使用 parseWithAwait 验证和转换数据
+      const validatedResult = await parseWithAwait(
+        z.object({
+          id: z.number().int(),
+          orderId: z.number().int(),
+          personId: z.number().int(),
+          assetType: z.string(),
+          assetFileType: z.string(),
+          fileId: z.number().int(),
+          relatedTime: z.string().datetime(),
+          createTime: z.string().datetime(),
+          updateTime: z.string().datetime()
+        }),
+        result
+      );
+      return c.json(validatedResult, 200);
     } catch (error) {
       if (error instanceof Error && error.message.includes('文件不存在')) {
         return c.json({
@@ -760,7 +792,25 @@ const app = new OpenAPIHono<AuthContext>()
 
       const result = await orderService.queryOrderPersonAsset(query);
 
-      return c.json(result, 200);
+      // 使用 parseWithAwait 验证和转换数据
+      const validatedResult = await parseWithAwait(
+        z.object({
+          data: z.array(z.object({
+            id: z.number().int(),
+            orderId: z.number().int(),
+            personId: z.number().int(),
+            assetType: z.string(),
+            assetFileType: z.string(),
+            fileId: z.number().int(),
+            relatedTime: z.string().datetime(),
+            createTime: z.string().datetime(),
+            updateTime: z.string().datetime()
+          })),
+          total: z.number().int()
+        }),
+        result
+      );
+      return c.json(validatedResult, 200);
     } catch (error) {
       return c.json({
         code: 500,
@@ -776,7 +826,15 @@ const app = new OpenAPIHono<AuthContext>()
 
       const result = await orderService.deleteOrderPersonAsset(id);
 
-      return c.json(result, 200);
+      // 使用 parseWithAwait 验证和转换数据
+      const validatedResult = await parseWithAwait(
+        z.object({
+          success: z.boolean(),
+          message: z.string()
+        }),
+        result
+      );
+      return c.json(validatedResult, 200);
     } catch (error) {
       if (error instanceof Error && error.message.includes('资产ID')) {
         return c.json({

+ 3 - 2
allin-packages/order-module/src/services/order.service.ts

@@ -2,7 +2,8 @@ import { GenericCrudService } from '@d8d/shared-crud';
 import { DataSource, Repository, DataSourceOptions, In, Not } from 'typeorm';
 import { EmploymentOrder } from '../entities/employment-order.entity';
 import { OrderPerson } from '../entities/order-person.entity';
-import { OrderPersonAsset, AssetType, AssetFileType } from '../entities/order-person-asset.entity';
+import { OrderPersonAsset } from '../entities/order-person-asset.entity';
+import { AssetType, AssetFileType } from '../schemas/order.schema';
 import { FileService, File } from '@d8d/file-module';
 import { OrderStatus, WorkStatus } from '@d8d/allin-enums';
 
@@ -131,7 +132,7 @@ export class OrderService extends GenericCrudService<EmploymentOrder> {
     const formattedData = data.map(order => {
       const personCount = personCounts.find(pc => pc.orderId === order.id)?.count || 0;
       return {
-        orderId: order.id,
+        id: order.id,
         orderName: order.orderName,
         platformId: order.platformId,
         companyId: order.companyId,

+ 2 - 1
allin-packages/order-module/tests/integration/order.integration.test.ts

@@ -7,7 +7,8 @@ import { File } from '@d8d/file-module';
 import orderRoutes from '../../src/routes/order.routes';
 import { EmploymentOrder } from '../../src/entities/employment-order.entity';
 import { OrderPerson } from '../../src/entities/order-person.entity';
-import { OrderPersonAsset, AssetType, AssetFileType } from '../../src/entities/order-person-asset.entity';
+import { OrderPersonAsset } from '../../src/entities/order-person-asset.entity';
+import { AssetType, AssetFileType } from '../../src/schemas/order.schema';
 import { OrderStatus, WorkStatus } from '@d8d/allin-enums';
 import { OrderTestDataFactory } from '../utils/test-data-factory';