Răsfoiți Sursa

🔧 refactor(server): 完成多租户包替换和实体导入修复

- 更新server包package.json中的依赖包名
- 修复server/index.ts中的实体导入和路由导入
- 修复auth-module-mt包中的UserSchemaMt和UpdateUserDtoMt导入
- 修复mini-auth.service.mt.ts中的UserEntityMt和FileServiceMt导入
- 修复server测试文件中的实体和服务导入
- 补充orders-module-mt包中缺失的schema文件

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 1 lună în urmă
părinte
comite
ea3e82367b

+ 11 - 0
docs/stories/008.001.server-multi-tenant-package-replacement.md

@@ -21,12 +21,23 @@ Draft
   - [ ] 将`@d8d/user-module`改为`@d8d/user-module-mt`
   - [ ] 将`@d8d/auth-module`改为`@d8d/auth-module-mt`
   - [ ] 将`@d8d/file-module`改为`@d8d/file-module-mt`
+  - [ ] 将`@d8d/geo-areas`改为`@d8d/geo-areas-mt`
+  - [ ] 将`@d8d/mini-payment`改为`@d8d/mini-payment-mt`
+  - [ ] 将`@d8d/advertisements-module`改为`@d8d/advertisements-module-mt`
+  - [ ] 将`@d8d/delivery-address-module`改为`@d8d/delivery-address-module-mt`
+  - [ ] 将`@d8d/goods-module`改为`@d8d/goods-module-mt`
+  - [ ] 将`@d8d/merchant-module`改为`@d8d/merchant-module-mt`
+  - [ ] 将`@d8d/orders-module`改为`@d8d/orders-module-mt`
+  - [ ] 将`@d8d/supplier-module`改为`@d8d/supplier-module-mt`
 - [ ] 更新实体导入和初始化
   - [ ] 修改UserEntity、Role、File等实体的导入路径
   - [ ] 更新initializeDataSource中的实体列表
 - [ ] 更新路由注册
   - [ ] 修改userRoutes、authRoutes、fileApiRoutes、roleRoutes的导入路径
   - [ ] 确保路由路径保持不变(/api/v1/...)
+- [ ] 更新server包的package.json依赖
+  - [ ] 将所有单租户包依赖更新为多租户包依赖
+  - [ ] 确保依赖包名与代码导入一致
 - [ ] 验证多租户认证中间件集成
   - [ ] 确认多租户认证模块包中已包含租户上下文管理
   - [ ] 验证认证中间件设置租户上下文:`c.set('tenantId', user.tenantId)`

+ 2 - 2
packages/auth-module-mt/src/routes/update-me.route.mt.ts

@@ -2,7 +2,7 @@ import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { ErrorSchema } from '@d8d/shared-utils';
 import { authMiddleware } from '../middleware/index.mt';
 import { AuthContext } from '@d8d/shared-types';
-import { UserSchema, UpdateUserDto } from '@d8d/user-module';
+import { UserSchemaMt, UpdateUserDtoMt } from '@d8d/user-module-mt';
 import { UserServiceMt } from '@d8d/user-module-mt';
 import { AppDataSource } from '@d8d/shared-utils';
 import { parseWithAwait } from '@d8d/shared-utils';
@@ -16,7 +16,7 @@ const routeDef = createRoute({
     body: {
       content: {
         'application/json': {
-          schema: UpdateUserDto
+          schema: UpdateUserDtoMt
         }
       }
     }

+ 10 - 10
packages/auth-module-mt/src/services/mini-auth.service.mt.ts

@@ -1,20 +1,20 @@
 import { DataSource, Repository } from 'typeorm';
-import { UserEntity } from '@d8d/user-module';
-import { FileService } from '@d8d/file-module';
+import { UserEntityMt } from '@d8d/user-module-mt';
+import { FileServiceMt } from '@d8d/file-module-mt';
 import { JWTUtil, redisUtil } from '@d8d/shared-utils';
 import axios from 'axios';
 import process from 'node:process'
 
 export class MiniAuthService {
-  private userRepository: Repository<UserEntity>;
-  private fileService: FileService;
+  private userRepository: Repository<UserEntityMt>;
+  private fileService: FileServiceMt;
 
   constructor(dataSource: DataSource) {
-    this.userRepository = dataSource.getRepository(UserEntity);
-    this.fileService = new FileService(dataSource);
+    this.userRepository = dataSource.getRepository(UserEntityMt);
+    this.fileService = new FileServiceMt(dataSource);
   }
 
-  async miniLogin(code: string): Promise<{ token: string; user: UserEntity; isNewUser: boolean }> {
+  async miniLogin(code: string): Promise<{ token: string; user: UserEntityMt; isNewUser: boolean }> {
     // 1. 通过code获取openid和session_key
     const openidInfo = await this.getOpenIdByCode(code);
 
@@ -40,7 +40,7 @@ export class MiniAuthService {
     return { token, user, isNewUser };
   }
 
-  async updateUserProfile(userId: number, profile: { nickname?: string; avatarUrl?: string }): Promise<UserEntity> {
+  async updateUserProfile(userId: number, profile: { nickname?: string; avatarUrl?: string }): Promise<UserEntityMt> {
     const user = await this.userRepository.findOne({
       where: { id: userId },
       relations: ['avatarFile']
@@ -96,7 +96,7 @@ export class MiniAuthService {
     }
   }
 
-  private async createMiniUser(openidInfo: { openid: string; unionid?: string }): Promise<UserEntity> {
+  private async createMiniUser(openidInfo: { openid: string; unionid?: string }): Promise<UserEntityMt> {
     const user = this.userRepository.create({
       username: `wx_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`,
       password: '', // 小程序用户不需要密码
@@ -130,7 +130,7 @@ export class MiniAuthService {
     }
   }
 
-  private generateToken(user: UserEntity): string {
+  private generateToken(user: UserEntityMt): string {
     return JWTUtil.generateToken({
       id: user.id,
       username: user.username,

+ 2 - 2
packages/delivery-address-module-mt/src/schemas/admin-delivery-address.mt.schema.ts

@@ -1,6 +1,6 @@
 import { z } from '@hono/zod-openapi';
-import { UserSchema } from '@d8d/user-module/schemas';
-import { getAreaSchema } from '@d8d/geo-areas/schemas';
+import { UserSchemaMt as UserSchema } from '@d8d/user-module-mt/schemas';
+import { getAreaSchemaMt as getAreaSchema } from '@d8d/geo-areas-mt/schemas';
 
 // 状态枚举
 export const DeliveryAddressStatusEnum = {

+ 66 - 0
packages/orders-module-mt/src/schemas/create-order.schema.ts

@@ -0,0 +1,66 @@
+import { z } from '@hono/zod-openapi';
+
+// 订单商品项DTO
+export const OrderItemDto = z.object({
+  id: z.number().int().positive('商品ID必须是正整数').openapi({
+    description: '商品ID',
+    example: 1
+  }),
+  num: z.number().int().min(1, '购买数量必须大于0').openapi({
+    description: '购买数量',
+    example: 2
+  })
+});
+
+// 创建订单请求DTO
+export const CreateOrderRequestDto = z.object({
+  addressId: z.number().int().positive('收货地址ID必须是正整数').optional().openapi({
+    description: '收货地址ID',
+    example: 1
+  }),
+  productOwn: z.string().min(1, '商品所属方不能为空').max(50, '商品所属方最多50个字符').openapi({
+    description: '商品所属方(如:自营、第三方等)',
+    example: '自营'
+  }),
+  consumeFrom: z.string().min(1, '消费来源不能为空').max(50, '消费来源最多50个字符').openapi({
+    description: '消费来源(如:积分兑换、礼券兑换等)',
+    example: '积分兑换'
+  }),
+  products: z.array(OrderItemDto).min(1, '商品列表不能为空').openapi({
+    description: '商品列表',
+    example: [{ id: 1, num: 2 }, { id: 3, num: 1 }]
+  })
+});
+
+// 创建订单响应DTO
+export const CreateOrderResponseDto = z.object({
+  success: z.boolean().openapi({
+    description: '是否成功',
+    example: true
+  }),
+  orderId: z.number().int().positive().openapi({
+    description: '订单ID',
+    example: 1001
+  }),
+  orderNo: z.string().openapi({
+    description: '订单号',
+    example: 'ORD20240101123456'
+  }),
+  amount: z.coerce.number().openapi({
+    description: '订单总金额',
+    example: 199.98
+  }),
+  payAmount: z.coerce.number().openapi({
+    description: '实际支付金额',
+    example: 199.98
+  }),
+  message: z.string().openapi({
+    description: '提示信息',
+    example: '订单创建成功'
+  })
+});
+
+// 导出类型
+export type CreateOrderRequest = z.infer<typeof CreateOrderRequestDto>;
+export type CreateOrderResponse = z.infer<typeof CreateOrderResponseDto>;
+export type OrderItem = z.infer<typeof OrderItemDto>;

+ 4 - 1
packages/orders-module-mt/src/schemas/index.ts

@@ -1,2 +1,5 @@
 export * from './order.mt.schema';
-export * from './user-order.mt.schema';
+export * from './user-order.mt.schema';
+export * from './order-goods.schema';
+export * from './order-refund.schema';
+export * from './create-order.schema';

+ 267 - 0
packages/orders-module-mt/src/schemas/order-goods.schema.ts

@@ -0,0 +1,267 @@
+import { z } from '@hono/zod-openapi';
+
+// 订单商品状态枚举
+export const OrderGoodsStatus = {
+  UN_SHIPPED: 0, // 未发货
+  SHIPPED: 1, // 已发货
+} as const;
+
+// 商品类型枚举
+export const GoodsType = {
+  PHYSICAL: 1, // 实物产品
+  VIRTUAL: 2, // 虚拟订单
+} as const;
+
+// 订单商品基础Schema
+export const OrderGoodsSchema = z.object({
+  id: z.number().int().positive().openapi({
+    description: '订单商品ID',
+    example: 1
+  }),
+  tenantId: z.number().int().positive().openapi({
+    description: '租户ID',
+    example: 1
+  }),
+  orderId: z.number().int().positive().openapi({
+    description: '订单ID',
+    example: 1
+  }),
+  orderNo: z.string().max(50, '订单号最多50个字符').nullable().optional().openapi({
+    description: '订单号',
+    example: 'ORD20240101123456'
+  }),
+  goodsId: z.number().int().positive().openapi({
+    description: '商品ID',
+    example: 1
+  }),
+  goodsName: z.string().max(255, '商品名称最多255个字符').nullable().optional().openapi({
+    description: '商品名称',
+    example: '苹果手机'
+  }),
+  goodsType: z.coerce.number().int().min(1, '商品类型最小为1').max(2, '商品类型最大为2').default(1).openapi({
+    description: '1实物产品2虚拟订单',
+    example: 1
+  }),
+  supplierId: z.coerce.number().int().positive().nullable().openapi({
+    description: '供货商ID',
+    example: 1
+  }),
+  costPrice: z.coerce.number().min(0, '成本价不能小于0').max(999999.99, '成本价不能超过999999.99').default(0).openapi({
+    description: '成本价',
+    example: 50.00
+  }),
+  price: z.coerce.number().min(0, '售价不能小于0').max(999999.99, '售价不能超过999999.99').default(0).openapi({
+    description: '售价',
+    example: 99.99
+  }),
+  num: z.coerce.number().int().min(0, '数量不能小于0').max(99999, '数量不能超过99999').default(0).openapi({
+    description: '数量',
+    example: 2
+  }),
+  freightAmount: z.coerce.number().min(0, '运费不能小于0').max(999999.99, '运费不能超过999999.99').default(0).optional().openapi({
+    description: '运费',
+    example: 10.00
+  }),
+  state: z.coerce.number().int().min(0, '状态最小为0').max(1, '状态最大为1').default(0).openapi({
+    description: '状态(0未发货、1已发货)',
+    example: 0
+  }),
+  expressName: z.string().max(255, '快递名称最多255个字符').nullable().optional().openapi({
+    description: '快递名称',
+    example: '顺丰快递'
+  }),
+  expressNo: z.coerce.number().int().positive().nullable().optional().openapi({
+    description: '快递单号',
+    example: 1234567890
+  }),
+  createdBy: z.number().int().positive().nullable().optional().openapi({
+    description: '创建人ID',
+    example: 1
+  }),
+  updatedBy: z.number().int().positive().nullable().optional().openapi({
+    description: '更新人ID',
+    example: 1
+  }),
+  createdAt: z.coerce.date().openapi({
+    description: '创建时间',
+    example: '2024-01-01T12:00:00Z'
+  }),
+  updatedAt: z.coerce.date().openapi({
+    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' }),
+    orderNo: z.string().openapi({ description: '订单号', example: 'ORD20240101123456' }),
+    userId: z.number().int().positive().openapi({ description: '用户ID' })
+  }).nullable().optional().openapi({
+    description: '订单信息'
+  }),
+  goods: z.object({
+    id: z.number().int().positive().openapi({ description: '商品ID' }),
+    name: z.string().openapi({ description: '商品名称', example: '苹果手机' }),
+    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: '商品图片文件信息'
+    })
+  }).nullable().optional().openapi({
+    description: '商品信息'
+  }),
+  supplier: z.object({
+    id: z.number().int().positive().openapi({ description: '供货商ID' }),
+    name: z.string().openapi({ description: '供货商名称', example: '供货商A' })
+  }).nullable().optional().openapi({
+    description: '供货商信息'
+  })
+});
+
+// 创建订单商品DTO
+export const CreateOrderGoodsDto = z.object({
+  tenantId: z.number().int().positive('租户ID必须是正整数').openapi({
+    description: '租户ID',
+    example: 1
+  }),
+  orderId: z.number().int().positive('订单ID必须是正整数').openapi({
+    description: '订单ID',
+    example: 1
+  }),
+  orderNo: z.string().max(50, '订单号最多50个字符').nullable().optional().openapi({
+    description: '订单号',
+    example: 'ORD20240101123456'
+  }),
+  goodsId: z.number().int().positive('商品ID必须是正整数').openapi({
+    description: '商品ID',
+    example: 1
+  }),
+  goodsName: z.string().max(255, '商品名称最多255个字符').nullable().optional().openapi({
+    description: '商品名称',
+    example: '苹果手机'
+  }),
+  goodsType: z.coerce.number().int().min(1, '商品类型最小为1').max(2, '商品类型最大为2').default(1).optional().openapi({
+    description: '1实物产品2虚拟订单',
+    example: 1
+  }),
+  supplierId: z.coerce.number().int().positive().nullable().optional().openapi({
+    description: '供货商ID',
+    example: 1
+  }),
+  costPrice: z.coerce.number().min(0, '成本价不能小于0').max(999999.99, '成本价不能超过999999.99').default(0).optional().openapi({
+    description: '成本价',
+    example: 50.00
+  }),
+  price: z.coerce.number().min(0, '售价不能小于0').max(999999.99, '售价不能超过999999.99').default(0).optional().openapi({
+    description: '售价',
+    example: 99.99
+  }),
+  num: z.coerce.number().int().min(0, '数量不能小于0').max(99999, '数量不能超过99999').default(0).optional().openapi({
+    description: '数量',
+    example: 2
+  }),
+  freightAmount: z.coerce.number().min(0, '运费不能小于0').max(999999.99, '运费不能超过999999.99').default(0).optional().openapi({
+    description: '运费',
+    example: 10.00
+  }),
+  state: z.coerce.number().int().min(0, '状态最小为0').max(1, '状态最大为1').default(0).optional().openapi({
+    description: '状态(0未发货、1已发货)',
+    example: 0
+  }),
+  expressName: z.string().max(255, '快递名称最多255个字符').nullable().optional().openapi({
+    description: '快递名称',
+    example: '顺丰快递'
+  }),
+  expressNo: z.coerce.number().int().positive().nullable().optional().openapi({
+    description: '快递单号',
+    example: 1234567890
+  }),
+  imageFileId: z.number().int().positive().nullable().optional().openapi({
+    description: '商品图片文件ID',
+    example: 1
+  })
+});
+
+// 更新订单商品DTO
+export const UpdateOrderGoodsDto = z.object({
+  tenantId: z.number().int().positive('租户ID必须是正整数').optional().openapi({
+    description: '租户ID',
+    example: 1
+  }),
+  orderId: z.number().int().positive('订单ID必须是正整数').optional().openapi({
+    description: '订单ID',
+    example: 1
+  }),
+  orderNo: z.string().max(50, '订单号最多50个字符').nullable().optional().openapi({
+    description: '订单号',
+    example: 'ORD20240101123456'
+  }),
+  goodsId: z.number().int().positive('商品ID必须是正整数').optional().openapi({
+    description: '商品ID',
+    example: 1
+  }),
+  goodsName: z.string().max(255, '商品名称最多255个字符').nullable().optional().openapi({
+    description: '商品名称',
+    example: '苹果手机'
+  }),
+  goodsType: z.coerce.number().int().min(1, '商品类型最小为1').max(2, '商品类型最大为2').optional().openapi({
+    description: '1实物产品2虚拟订单',
+    example: 1
+  }),
+  supplierId: z.coerce.number().int().positive().nullable().optional().openapi({
+    description: '供货商ID',
+    example: 1
+  }),
+  costPrice: z.coerce.number().min(0, '成本价不能小于0').max(999999.99, '成本价不能超过999999.99').optional().openapi({
+    description: '成本价',
+    example: 50.00
+  }),
+  price: z.coerce.number().min(0, '售价不能小于0').max(999999.99, '售价不能超过999999.99').optional().openapi({
+    description: '售价',
+    example: 99.99
+  }),
+  num: z.coerce.number().int().min(0, '数量不能小于0').max(99999, '数量不能超过99999').optional().openapi({
+    description: '数量',
+    example: 2
+  }),
+  freightAmount: z.coerce.number().min(0, '运费不能小于0').max(999999.99, '运费不能超过999999.99').optional().openapi({
+    description: '运费',
+    example: 10.00
+  }),
+  state: z.coerce.number().int().min(0, '状态最小为0').max(1, '状态最大为1').optional().openapi({
+    description: '状态(0未发货、1已发货)',
+    example: 0
+  }),
+  expressName: z.string().max(255, '快递名称最多255个字符').nullable().optional().openapi({
+    description: '快递名称',
+    example: '顺丰快递'
+  }),
+  expressNo: z.coerce.number().int().positive().nullable().optional().openapi({
+    description: '快递单号',
+    example: 1234567890
+  }),
+  imageFileId: z.number().int().positive().nullable().optional().openapi({
+    description: '商品图片文件ID',
+    example: 1
+  })
+});
+
+// 订单商品状态类型
+export type OrderGoodsStatusType = typeof OrderGoodsStatus[keyof typeof OrderGoodsStatus];
+export type GoodsTypeType = typeof GoodsType[keyof typeof GoodsType];

+ 141 - 0
packages/orders-module-mt/src/schemas/order-refund.schema.ts

@@ -0,0 +1,141 @@
+import { z } from '@hono/zod-openapi';
+
+// 退款状态枚举
+export const RefundStatus = {
+  PENDING: 0, // 未退款
+  PROCESSING: 1, // 退款中
+  SUCCESS: 2, // 退款成功
+  FAILED: 3, // 退款失败
+} as const;
+
+// 订单退款基础Schema
+export const OrderRefundSchema = z.object({
+  id: z.number().int().positive().openapi({
+    description: '退款记录ID',
+    example: 1
+  }),
+  tenantId: z.number().int().positive().openapi({
+    description: '租户ID',
+    example: 1
+  }),
+  orderNo: z.string().max(32, '订单号最多32个字符').nullable().optional().openapi({
+    description: '订单号',
+    example: 'ORD20240101123456'
+  }),
+  refundOrderNo: z.string().max(32, '退款订单号最多32个字符').nullable().optional().openapi({
+    description: '退款订单号',
+    example: 'REF20240101123456'
+  }),
+  refundAmount: z.coerce.number().min(0, '退款金额不能小于0').max(999999.99, '退款金额不能超过999999.99').nullable().optional().openapi({
+    description: '退款金额',
+    example: 99.99
+  }),
+  state: z.coerce.number().int().min(0, '状态最小为0').max(3, '状态最大为3').default(0).openapi({
+    description: '0未退款1退款中2退款成功3退款失败',
+    example: 0
+  }),
+  remark: z.string().max(255, '备注最多255个字符').nullable().optional().openapi({
+    description: '备注',
+    example: '用户申请退款'
+  }),
+  createdBy: z.number().int().positive().nullable().optional().openapi({
+    description: '创建人ID',
+    example: 1
+  }),
+  updatedBy: z.number().int().positive().nullable().optional().openapi({
+    description: '更新人ID',
+    example: 1
+  }),
+  createdAt: z.coerce.date().openapi({
+    description: '创建时间',
+    example: '2024-01-01T12:00:00Z'
+  }),
+  updatedAt: z.coerce.date().openapi({
+    description: '更新时间',
+    example: '2024-01-01T12:00:00Z'
+  }),
+  // 关联实体
+  order: z.object({
+    id: z.number().int().positive().openapi({ description: '订单ID' }),
+    orderNo: z.string().openapi({ description: '订单号', example: 'ORD20240101123456' }),
+    userId: z.number().int().positive().openapi({ description: '用户ID', example: 1 }),
+    amount: z.coerce.number().openapi({ description: '订单金额', example: 99.99 })
+  }).nullable().optional().openapi({
+    description: '订单信息'
+  })
+});
+
+// 创建订单退款DTO
+export const CreateOrderRefundDto = z.object({
+  tenantId: z.number().int().positive('租户ID必须是正整数').openapi({
+    description: '租户ID',
+    example: 1
+  }),
+  orderNo: z.string().max(32, '订单号最多32个字符').nullable().optional().openapi({
+    description: '订单号',
+    example: 'ORD20240101123456'
+  }),
+  refundOrderNo: z.string().max(32, '退款订单号最多32个字符').nullable().optional().openapi({
+    description: '退款订单号',
+    example: 'REF20240101123456'
+  }),
+  refundAmount: z.coerce.number().min(0, '退款金额不能小于0').max(999999.99, '退款金额不能超过999999.99').nullable().optional().openapi({
+    description: '退款金额',
+    example: 99.99
+  }),
+  state: z.coerce.number().int().min(0, '状态最小为0').max(3, '状态最大为3').default(0).optional().openapi({
+    description: '0未退款1退款中2退款成功3退款失败',
+    example: 0
+  }),
+  remark: z.string().max(255, '备注最多255个字符').nullable().optional().openapi({
+    description: '备注',
+    example: '用户申请退款'
+  })
+});
+
+// 更新订单退款DTO
+export const UpdateOrderRefundDto = z.object({
+  tenantId: z.number().int().positive('租户ID必须是正整数').optional().openapi({
+    description: '租户ID',
+    example: 1
+  }),
+  orderNo: z.string().max(32, '订单号最多32个字符').nullable().optional().openapi({
+    description: '订单号',
+    example: 'ORD20240101123456'
+  }),
+  refundOrderNo: z.string().max(32, '退款订单号最多32个字符').nullable().optional().openapi({
+    description: '退款订单号',
+    example: 'REF20240101123456'
+  }),
+  refundAmount: z.coerce.number().min(0, '退款金额不能小于0').max(999999.99, '退款金额不能超过999999.99').nullable().optional().openapi({
+    description: '退款金额',
+    example: 99.99
+  }),
+  state: z.coerce.number().int().min(0, '状态最小为0').max(3, '状态最大为3').optional().openapi({
+    description: '0未退款1退款中2退款成功3退款失败',
+    example: 2
+  }),
+  remark: z.string().max(255, '备注最多255个字符').nullable().optional().openapi({
+    description: '备注',
+    example: '退款已完成'
+  })
+});
+
+// 订单退款列表响应
+export const OrderRefundListResponse = z.object({
+  data: z.array(OrderRefundSchema),
+  pagination: z.object({
+    total: z.number().openapi({
+      example: 100,
+      description: '总记录数'
+    }),
+    current: z.number().openapi({
+      example: 1,
+      description: '当前页码'
+    }),
+    pageSize: z.number().openapi({
+      example: 10,
+      description: '每页数量'
+    })
+  })
+});

+ 11 - 11
packages/server/package.json

@@ -34,17 +34,17 @@
     "@d8d/shared-types": "workspace:*",
     "@d8d/shared-utils": "workspace:*",
     "@d8d/shared-crud": "workspace:*",
-    "@d8d/user-module": "workspace:*",
-    "@d8d/auth-module": "workspace:*",
-    "@d8d/file-module": "workspace:*",
-    "@d8d/geo-areas": "workspace:*",
-    "@d8d/mini-payment": "workspace:*",
-    "@d8d/advertisements-module": "workspace:*",
-    "@d8d/delivery-address-module": "workspace:*",
-    "@d8d/goods-module": "workspace:*",
-    "@d8d/merchant-module": "workspace:*",
-    "@d8d/orders-module": "workspace:*",
-    "@d8d/supplier-module": "workspace:*",
+    "@d8d/user-module-mt": "workspace:*",
+    "@d8d/auth-module-mt": "workspace:*",
+    "@d8d/file-module-mt": "workspace:*",
+    "@d8d/geo-areas-mt": "workspace:*",
+    "@d8d/mini-payment-mt": "workspace:*",
+    "@d8d/advertisements-module-mt": "workspace:*",
+    "@d8d/delivery-address-module-mt": "workspace:*",
+    "@d8d/goods-module-mt": "workspace:*",
+    "@d8d/merchant-module-mt": "workspace:*",
+    "@d8d/orders-module-mt": "workspace:*",
+    "@d8d/supplier-module-mt": "workspace:*",
     "axios": "^1.12.2",
     "bcrypt": "^6.0.0",
     "debug": "^4.4.3",

+ 22 - 22
packages/server/src/index.ts

@@ -1,29 +1,29 @@
 import { OpenAPIHono } from '@hono/zod-openapi'
 import { swaggerUI } from '@hono/swagger-ui'
 import { errorHandler, initializeDataSource } from '@d8d/shared-utils'
-import { userRoutes as userModuleRoutes, roleRoutes as roleModuleRoutes } from '@d8d/user-module'
-import { authRoutes as authModuleRoutes } from '@d8d/auth-module'
-import { fileRoutes as fileModuleRoutes } from '@d8d/file-module'
+import { userRoutesMt as userModuleRoutes, roleRoutesMt as roleModuleRoutes } from '@d8d/user-module-mt'
+import { authRoutes as authModuleRoutes } from '@d8d/auth-module-mt'
+import { fileRoutes as fileModuleRoutes } from '@d8d/file-module-mt'
 import { AuthContext } from '@d8d/shared-types'
 import { AppDataSource } from '@d8d/shared-utils'
 import { Hono } from 'hono'
-import { UserEntity, Role } from '@d8d/user-module'
-import { File } from '@d8d/file-module'
+import { UserEntityMt, RoleMt } from '@d8d/user-module-mt'
+import { FileMt } from '@d8d/file-module-mt'
 
 // 导入已实现的包实体
-import { AreaEntity } from '@d8d/geo-areas'
-import { PaymentEntity } from '@d8d/mini-payment'
-import { Advertisement, AdvertisementType } from '@d8d/advertisements-module'
-import { DeliveryAddress } from '@d8d/delivery-address-module'
-import { Goods, GoodsCategory } from '@d8d/goods-module'
-import { Merchant } from '@d8d/merchant-module'
-import { Order, OrderGoods, OrderRefund } from '@d8d/orders-module'
-import { Supplier } from '@d8d/supplier-module'
+import { AreaEntity } from '@d8d/geo-areas-mt'
+import { PaymentEntity } from '@d8d/mini-payment-mt'
+import { Advertisement, AdvertisementType } from '@d8d/advertisements-module-mt'
+import { DeliveryAddress } from '@d8d/delivery-address-module-mt'
+import { Goods, GoodsCategory } from '@d8d/goods-module-mt'
+import { Merchant } from '@d8d/merchant-module-mt'
+import { Order, OrderGoods, OrderRefund } from '@d8d/orders-module-mt'
+import { Supplier } from '@d8d/supplier-module-mt'
 
 if(!AppDataSource || !AppDataSource.isInitialized) {
   initializeDataSource([
     // 已实现的包实体
-    UserEntity, Role, File,
+    UserEntityMt, RoleMt, FileMt,
     AreaEntity, PaymentEntity,
     Advertisement, AdvertisementType,
     DeliveryAddress,
@@ -128,14 +128,14 @@ export const fileApiRoutes = api.route('/api/v1/files', fileModuleRoutes)
 export const roleRoutes = api.route('/api/v1/roles', roleModuleRoutes)
 
 // 导入已实现的包路由
-import { areasRoutes, adminAreasRoutes } from '@d8d/geo-areas'
-import { PaymentRoutes } from '@d8d/mini-payment'
-import { advertisementRoutes, advertisementTypeRoutes } from '@d8d/advertisements-module'
-import { userDeliveryAddressRoutes } from '@d8d/delivery-address-module'
-import { adminGoodsCategoriesRoutes, adminGoodsRoutes } from '@d8d/goods-module'
-import { merchantRoutes } from '@d8d/merchant-module'
-import { userOrderRoutes, userOrderItemsRoutes, userRefundsRoutes } from '@d8d/orders-module'
-import { userSupplierRoutes } from '@d8d/supplier-module'
+import { areasRoutes, adminAreasRoutes } from '@d8d/geo-areas-mt'
+import { PaymentRoutes } from '@d8d/mini-payment-mt'
+import { advertisementRoutes, advertisementTypeRoutes } from '@d8d/advertisements-module-mt'
+import { userDeliveryAddressRoutes } from '@d8d/delivery-address-module-mt'
+import { adminGoodsCategoriesRoutes, adminGoodsRoutes } from '@d8d/goods-module-mt'
+import { merchantRoutes } from '@d8d/merchant-module-mt'
+import { userOrderRoutes, userOrderItemsRoutes, userRefundsRoutes } from '@d8d/orders-module-mt'
+import { userSupplierRoutes } from '@d8d/supplier-module-mt'
 
 
 // 注册已实现的包路由

+ 2 - 2
packages/server/tests/integration/auth.integration.test.ts

@@ -5,9 +5,9 @@ import {
   setupIntegrationDatabaseHooks,
   TestDataFactory
 } from '../utils/integration-test-db';
-import { UserEntity, UserService } from '@d8d/user-module';
+import { UserEntity, UserService } from '@d8d/user-module-mt';
 import { authRoutes } from '../../src/api';
-import { AuthService } from '@d8d/auth-module';
+import { AuthService } from '@d8d/auth-module-mt';
 import { DisabledStatus } from '@d8d/shared-types';
 
 // 设置集成测试钩子

+ 4 - 4
packages/server/tests/integration/files.integration.test.ts

@@ -6,12 +6,12 @@ import {
   TestDataFactory
 } from '../utils/integration-test-db';
 import { fileApiRoutes } from '../../src/api';
-import { AuthService } from '@d8d/auth-module';
-import { UserService } from '@d8d/user-module';
-import { MinioService } from '@d8d/file-module';
+import { AuthService } from '@d8d/auth-module-mt';
+import { UserService } from '@d8d/user-module-mt';
+import { MinioService } from '@d8d/file-module-mt';
 
 // Mock MinIO service to avoid real connections in tests
-vi.mock('@d8d/file-module', async (importOriginal) => {
+vi.mock('@d8d/file-module-mt', async (importOriginal) => {
   const actual = await importOriginal();
   return {
     ...actual,

+ 1 - 1
packages/server/tests/integration/minio.integration.test.ts

@@ -1,5 +1,5 @@
 import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
-import { MinioService } from '@d8d/file-module';
+import { MinioService } from '@d8d/file-module-mt';
 import { Client } from 'minio';
 import { logger } from '@d8d/shared-utils';
 

+ 2 - 2
packages/server/tests/integration/users.integration.test.ts

@@ -7,8 +7,8 @@ import {
 } from '../utils/integration-test-db';
 import { IntegrationTestAssertions } from '../utils/integration-test-utils';
 import { userRoutes } from '../../src/api';
-import { AuthService } from '@d8d/auth-module';
-import { UserService } from '@d8d/user-module';
+import { AuthService } from '@d8d/auth-module-mt';
+import { UserServiceMt } from '@d8d/user-module-mt';
 
 
 // 设置集成测试钩子

+ 11 - 11
packages/server/tests/utils/integration-test-db.ts

@@ -1,7 +1,7 @@
 import { DataSource } from 'typeorm';
 import { beforeEach, afterEach } from 'vitest';
-import { UserEntity, Role } from '@d8d/user-module';
-import { File } from '@d8d/file-module';
+import { UserEntityMt, RoleMt } from '@d8d/user-module-mt';
+import { FileMt } from '@d8d/file-module-mt';
 import { AppDataSource } from '@d8d/shared-utils';
 
 /**
@@ -35,7 +35,7 @@ export class TestDataFactory {
   /**
    * 创建测试用户数据
    */
-  static createUserData(overrides: Partial<UserEntity> = {}): Partial<UserEntity> {
+  static createUserData(overrides: Partial<UserEntityMt> = {}): Partial<UserEntityMt> {
     const timestamp = Date.now();
     return {
       username: `testuser_${timestamp}`,
@@ -53,7 +53,7 @@ export class TestDataFactory {
   /**
    * 创建测试角色数据
    */
-  static createRoleData(overrides: Partial<Role> = {}): Partial<Role> {
+  static createRoleData(overrides: Partial<RoleMt> = {}): Partial<RoleMt> {
     const timestamp = Date.now();
     return {
       name: `test_role_${timestamp}`,
@@ -65,9 +65,9 @@ export class TestDataFactory {
   /**
    * 在数据库中创建测试用户
    */
-  static async createTestUser(dataSource: DataSource, overrides: Partial<UserEntity> = {}): Promise<UserEntity> {
+  static async createTestUser(dataSource: DataSource, overrides: Partial<UserEntityMt> = {}): Promise<UserEntityMt> {
     const userData = this.createUserData(overrides);
-    const userRepository = dataSource.getRepository(UserEntity);
+    const userRepository = dataSource.getRepository(UserEntityMt);
 
     const user = userRepository.create(userData);
     return await userRepository.save(user);
@@ -76,9 +76,9 @@ export class TestDataFactory {
   /**
    * 在数据库中创建测试角色
    */
-  static async createTestRole(dataSource: DataSource, overrides: Partial<Role> = {}): Promise<Role> {
+  static async createTestRole(dataSource: DataSource, overrides: Partial<RoleMt> = {}): Promise<RoleMt> {
     const roleData = this.createRoleData(overrides);
-    const roleRepository = dataSource.getRepository(Role);
+    const roleRepository = dataSource.getRepository(RoleMt);
 
     const role = roleRepository.create(roleData);
     return await roleRepository.save(role);
@@ -87,7 +87,7 @@ export class TestDataFactory {
   /**
    * 创建测试文件数据
    */
-  static createFileData(overrides: Partial<File> = {}): Partial<File> {
+  static createFileData(overrides: Partial<FileMt> = {}): Partial<FileMt> {
     const timestamp = Date.now();
     return {
       name: `testfile_${timestamp}.txt`,
@@ -104,9 +104,9 @@ export class TestDataFactory {
   /**
    * 在数据库中创建测试文件
    */
-  static async createTestFile(dataSource: DataSource, overrides: Partial<File> = {}): Promise<File> {
+  static async createTestFile(dataSource: DataSource, overrides: Partial<FileMt> = {}): Promise<FileMt> {
     const fileData = this.createFileData(overrides);
-    const fileRepository = dataSource.getRepository(File);
+    const fileRepository = dataSource.getRepository(FileMt);
 
     const file = fileRepository.create(fileData);
     return await fileRepository.save(file);

+ 3 - 3
packages/server/tests/utils/integration-test-utils.ts

@@ -1,5 +1,5 @@
 import { IntegrationTestDatabase } from './integration-test-db';
-import { UserEntity } from '@d8d/user-module';
+import { UserEntityMt } from '@d8d/user-module-mt';
 
 /**
  * 集成测试断言工具
@@ -45,7 +45,7 @@ export class IntegrationTestAssertions {
       throw new Error('Database not initialized');
     }
 
-    const userRepository = dataSource.getRepository(UserEntity);
+    const userRepository = dataSource.getRepository(UserEntityMt);
     const user = await userRepository.findOne({ where: { username } });
 
     if (!user) {
@@ -62,7 +62,7 @@ export class IntegrationTestAssertions {
       throw new Error('Database not initialized');
     }
 
-    const userRepository = dataSource.getRepository(UserEntity);
+    const userRepository = dataSource.getRepository(UserEntityMt);
     const user = await userRepository.findOne({ where: { username } });
 
     if (user) {

+ 22 - 22
pnpm-lock.yaml

@@ -3212,33 +3212,33 @@ importers:
       '@asteasolutions/zod-to-openapi':
         specifier: ^8.1.0
         version: 8.1.0(zod@4.1.12)
-      '@d8d/advertisements-module':
+      '@d8d/advertisements-module-mt':
         specifier: workspace:*
-        version: link:../advertisements-module
-      '@d8d/auth-module':
+        version: link:../advertisements-module-mt
+      '@d8d/auth-module-mt':
         specifier: workspace:*
-        version: link:../auth-module
-      '@d8d/delivery-address-module':
+        version: link:../auth-module-mt
+      '@d8d/delivery-address-module-mt':
         specifier: workspace:*
-        version: link:../delivery-address-module
-      '@d8d/file-module':
+        version: link:../delivery-address-module-mt
+      '@d8d/file-module-mt':
         specifier: workspace:*
-        version: link:../file-module
-      '@d8d/geo-areas':
+        version: link:../file-module-mt
+      '@d8d/geo-areas-mt':
         specifier: workspace:*
-        version: link:../geo-areas
-      '@d8d/goods-module':
+        version: link:../geo-areas-mt
+      '@d8d/goods-module-mt':
         specifier: workspace:*
-        version: link:../goods-module
-      '@d8d/merchant-module':
+        version: link:../goods-module-mt
+      '@d8d/merchant-module-mt':
         specifier: workspace:*
-        version: link:../merchant-module
-      '@d8d/mini-payment':
+        version: link:../merchant-module-mt
+      '@d8d/mini-payment-mt':
         specifier: workspace:*
-        version: link:../mini-payment
-      '@d8d/orders-module':
+        version: link:../mini-payment-mt
+      '@d8d/orders-module-mt':
         specifier: workspace:*
-        version: link:../orders-module
+        version: link:../orders-module-mt
       '@d8d/shared-crud':
         specifier: workspace:*
         version: link:../shared-crud
@@ -3248,12 +3248,12 @@ importers:
       '@d8d/shared-utils':
         specifier: workspace:*
         version: link:../shared-utils
-      '@d8d/supplier-module':
+      '@d8d/supplier-module-mt':
         specifier: workspace:*
-        version: link:../supplier-module
-      '@d8d/user-module':
+        version: link:../supplier-module-mt
+      '@d8d/user-module-mt':
         specifier: workspace:*
-        version: link:../user-module
+        version: link:../user-module-mt
       '@hono/swagger-ui':
         specifier: ^0.5.0
         version: 0.5.2(hono@4.8.5)