Browse Source

✨ feat(order-goods): 添加商品图片文件关联功能

- 在OrderGoods实体中新增imageFileId字段和imageFile关联关系
- 更新OrderGoodsSchema,添加imageFileId和imageFile相关字段定义
- 在CreateOrderGoodsDto和UpdateOrderGoodsDto中添加imageFileId字段
- 扩展订单商品CRUD路由的relations配置,包含imageFile关联
yourname 4 months ago
parent
commit
61b4e0a6eb

+ 1 - 1
src/server/api/orders-goods/index.ts

@@ -10,7 +10,7 @@ const orderGoodsRoutes = createCrudRoutes({
   getSchema: OrderGoodsSchema,
   listSchema: OrderGoodsSchema,
   searchFields: ['goodsName', 'orderNo'],
-  relations: ['order', 'goods', 'supplier'],
+  relations: ['order', 'goods', 'supplier', 'imageFile'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 8 - 0
src/server/modules/orders/order-goods.entity.ts

@@ -2,6 +2,7 @@ import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateCol
 import { Order } from './order.entity';
 import { Goods } from '@/server/modules/goods/goods.entity';
 import { Supplier } from '@/server/modules/supplier/supplier.entity';
+import { File } from '@/server/modules/files/file.entity';
 
 @Entity('orders_goods')
 export class OrderGoods {
@@ -62,6 +63,9 @@ export class OrderGoods {
   @Column({ name: 'updated_by', type: 'int', unsigned: true, nullable: true, comment: '更新人ID' })
   updatedBy!: number | null;
 
+  @Column({ name: 'image_file_id', type: 'int', unsigned: true, nullable: true, comment: '商品图片文件ID' })
+  imageFileId!: number | null;
+
   // 关联关系
   @ManyToOne(() => Order)
   @JoinColumn({ name: 'order_id', referencedColumnName: 'id' })
@@ -74,4 +78,8 @@ export class OrderGoods {
   @ManyToOne(() => Supplier)
   @JoinColumn({ name: 'supplier_id', referencedColumnName: 'id' })
   supplier!: Supplier;
+
+  @ManyToOne(() => File, { nullable: true })
+  @JoinColumn({ name: 'image_file_id', referencedColumnName: 'id' })
+  imageFile!: File | null;
 }

+ 21 - 0
src/server/modules/orders/order-goods.schema.ts

@@ -90,6 +90,19 @@ export const OrderGoodsSchema = z.object({
     description: '更新时间',
     example: '2024-01-01T12:00:00Z'
   }),
+  imageFileId: z.number().int().positive().nullable().openapi({
+    example: 1,
+    description: '商品图片文件ID'
+  }),
+  imageFile: z.object({
+    id: z.number().int().positive().openapi({ description: '文件ID' }),
+    name: z.string().max(255).openapi({ description: '文件名', example: 'goods.jpg' }),
+    fullUrl: z.string().openapi({ description: '文件完整URL', example: 'https://example.com/goods.jpg' }),
+    type: z.string().nullable().openapi({ description: '文件类型', example: 'image/jpeg' }),
+    size: z.number().nullable().openapi({ description: '文件大小(字节)', example: 102400 })
+  }).nullable().optional().openapi({
+    description: '商品图片文件信息'
+  }),
   // 关联实体
   order: z.object({
     id: z.number().int().positive().openapi({ description: '订单ID' }),
@@ -169,6 +182,10 @@ export const CreateOrderGoodsDto = z.object({
   expressNo: z.coerce.number().int().positive().nullable().optional().openapi({
     description: '快递单号',
     example: 1234567890
+  }),
+  imageFileId: z.number().int().positive().nullable().optional().openapi({
+    description: '商品图片文件ID',
+    example: 1
   })
 });
 
@@ -229,6 +246,10 @@ export const UpdateOrderGoodsDto = z.object({
   expressNo: z.coerce.number().int().positive().nullable().optional().openapi({
     description: '快递单号',
     example: 1234567890
+  }),
+  imageFileId: z.number().int().positive().nullable().optional().openapi({
+    description: '商品图片文件ID',
+    example: 1
   })
 });