From 83fa6bec7463c9f79b66b0d6b8d19f0a1bd415e8 Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 29 Jan 2026 11:39:00 -0800 Subject: [PATCH] =?UTF-8?q?feat(c2c):=20=E6=94=AF=E6=8C=81=E7=BB=BF?= =?UTF-8?q?=E7=A7=AF=E5=88=86(GREEN=5FPOINTS)=E4=BD=9C=E4=B8=BA=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=94=AF=E4=BB=98=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端 paymentMethod 字段从 PostgreSQL 枚举改为 String,支持逗号分隔多种支付方式 - 添加数据库迁移将 C2cPaymentMethod 枚举列转为 TEXT 类型 - DTO 验证改为 @IsString() 接受 GREEN_POINTS 及其组合 - 前端保持发送完整的支付方式列表(含 GREEN_POINTS) Co-Authored-By: Claude Opus 4.5 --- .../migration.sql | 5 +++++ .../trading-service/prisma/schema.prisma | 9 +-------- .../src/api/controllers/c2c.controller.ts | 4 ++-- .../trading-service/src/api/dto/c2c.dto.ts | 15 ++++++++------- .../src/application/services/c2c.service.ts | 7 +++---- .../repositories/c2c-order.repository.ts | 19 +++++-------------- 6 files changed, 24 insertions(+), 35 deletions(-) create mode 100644 backend/services/trading-service/prisma/migrations/0004_c2c_payment_method_to_string/migration.sql diff --git a/backend/services/trading-service/prisma/migrations/0004_c2c_payment_method_to_string/migration.sql b/backend/services/trading-service/prisma/migrations/0004_c2c_payment_method_to_string/migration.sql new file mode 100644 index 00000000..ce553e10 --- /dev/null +++ b/backend/services/trading-service/prisma/migrations/0004_c2c_payment_method_to_string/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable: Change payment_method from enum to text to support comma-separated values and GREEN_POINTS +ALTER TABLE "c2c_orders" ALTER COLUMN "payment_method" TYPE TEXT USING "payment_method"::TEXT; + +-- DropEnum (only if not used elsewhere) +DROP TYPE IF EXISTS "C2cPaymentMethod"; diff --git a/backend/services/trading-service/prisma/schema.prisma b/backend/services/trading-service/prisma/schema.prisma index 90b00db8..a6a7a135 100644 --- a/backend/services/trading-service/prisma/schema.prisma +++ b/backend/services/trading-service/prisma/schema.prisma @@ -637,13 +637,6 @@ enum C2cOrderStatus { EXPIRED // 已过期 } -// C2C收款方式 -enum C2cPaymentMethod { - ALIPAY // 支付宝 - WECHAT // 微信 - BANK // 银行卡 -} - // C2C订单 model C2cOrder { id String @id @default(uuid()) @@ -671,7 +664,7 @@ model C2cOrder { maxAmount Decimal @default(0) @map("max_amount") @db.Decimal(30, 8) // 最大交易量 // 卖方收款信息(卖单必填,买单买家需提供) - paymentMethod C2cPaymentMethod? @map("payment_method") // 收款方式 + paymentMethod String? @map("payment_method") // 收款方式(GREEN_POINTS/ALIPAY/WECHAT/BANK,可逗号分隔) paymentAccount String? @map("payment_account") // 收款账号 paymentQrCode String? @map("payment_qr_code") // 收款二维码URL paymentRealName String? @map("payment_real_name") // 收款人实名 diff --git a/backend/services/trading-service/src/api/controllers/c2c.controller.ts b/backend/services/trading-service/src/api/controllers/c2c.controller.ts index 295b60f2..819bcc52 100644 --- a/backend/services/trading-service/src/api/controllers/c2c.controller.ts +++ b/backend/services/trading-service/src/api/controllers/c2c.controller.ts @@ -144,7 +144,7 @@ export class C2cController { minAmount: dto.minAmount, maxAmount: dto.maxAmount, // 收款信息 - paymentMethod: dto.paymentMethod as any, + paymentMethod: dto.paymentMethod, paymentAccount: dto.paymentAccount, paymentQrCode: dto.paymentQrCode, paymentRealName: dto.paymentRealName, @@ -185,7 +185,7 @@ export class C2cController { const order = await this.c2cService.takeOrder(orderNo, accountSequence, { quantity: dto.quantity, // 收款信息(接买单时由taker提供) - paymentMethod: dto.paymentMethod as any, + paymentMethod: dto.paymentMethod, paymentAccount: dto.paymentAccount, paymentQrCode: dto.paymentQrCode, paymentRealName: dto.paymentRealName, diff --git a/backend/services/trading-service/src/api/dto/c2c.dto.ts b/backend/services/trading-service/src/api/dto/c2c.dto.ts index 19f95a99..ae4cb546 100644 --- a/backend/services/trading-service/src/api/dto/c2c.dto.ts +++ b/backend/services/trading-service/src/api/dto/c2c.dto.ts @@ -20,6 +20,7 @@ export enum C2cOrderStatus { // 收款方式 export enum C2cPaymentMethod { + GREEN_POINTS = 'GREEN_POINTS', // 绿积分(默认) ALIPAY = 'ALIPAY', // 支付宝 WECHAT = 'WECHAT', // 微信 BANK = 'BANK', // 银行卡 @@ -50,11 +51,11 @@ export class CreateC2cOrderDto { @IsNumberString() maxAmount?: string; - // 收款信息(卖单必填) - @ApiPropertyOptional({ enum: ['ALIPAY', 'WECHAT', 'BANK'], description: '收款方式' }) + // 收款信息(卖单可选,支持逗号分隔多种方式如 'ALIPAY,WECHAT') + @ApiPropertyOptional({ description: '收款方式(ALIPAY/WECHAT/BANK,可逗号分隔)' }) @IsOptional() - @IsIn(['ALIPAY', 'WECHAT', 'BANK']) - paymentMethod?: 'ALIPAY' | 'WECHAT' | 'BANK'; + @IsString() + paymentMethod?: string; @ApiPropertyOptional({ description: '收款账号' }) @IsOptional() @@ -84,10 +85,10 @@ export class TakeC2cOrderDto { quantity?: string; // 买单被接单时,买家需要提供收款信息 - @ApiPropertyOptional({ enum: ['ALIPAY', 'WECHAT', 'BANK'], description: '收款方式(接买单时需提供)' }) + @ApiPropertyOptional({ description: '收款方式(GREEN_POINTS/ALIPAY/WECHAT/BANK,可逗号分隔)' }) @IsOptional() - @IsIn(['ALIPAY', 'WECHAT', 'BANK']) - paymentMethod?: 'ALIPAY' | 'WECHAT' | 'BANK'; + @IsString() + paymentMethod?: string; @ApiPropertyOptional({ description: '收款账号(接买单时需提供)' }) @IsOptional() diff --git a/backend/services/trading-service/src/application/services/c2c.service.ts b/backend/services/trading-service/src/application/services/c2c.service.ts index 0eaf0e9c..7418541e 100644 --- a/backend/services/trading-service/src/application/services/c2c.service.ts +++ b/backend/services/trading-service/src/application/services/c2c.service.ts @@ -25,13 +25,12 @@ const C2C_ORDER_STATUS = { // C2C 收款方式常量 const C2C_PAYMENT_METHOD = { + GREEN_POINTS: 'GREEN_POINTS', ALIPAY: 'ALIPAY', WECHAT: 'WECHAT', BANK: 'BANK', } as const; -type C2cPaymentMethod = typeof C2C_PAYMENT_METHOD[keyof typeof C2C_PAYMENT_METHOD]; - // 默认超时时间配置(分钟) const DEFAULT_PAYMENT_TIMEOUT_MINUTES = 15; const DEFAULT_CONFIRM_TIMEOUT_MINUTES = 60; @@ -84,7 +83,7 @@ export class C2cService { minAmount?: string; maxAmount?: string; // 收款信息(卖单必填) - paymentMethod?: C2cPaymentMethod; + paymentMethod?: string; paymentAccount?: string; paymentQrCode?: string; paymentRealName?: string; @@ -188,7 +187,7 @@ export class C2cService { options?: { quantity?: string; // 收款信息(接买单时由taker提供,因为taker是卖方) - paymentMethod?: C2cPaymentMethod; + paymentMethod?: string; paymentAccount?: string; paymentQrCode?: string; paymentRealName?: string; diff --git a/backend/services/trading-service/src/infrastructure/persistence/repositories/c2c-order.repository.ts b/backend/services/trading-service/src/infrastructure/persistence/repositories/c2c-order.repository.ts index 00fd43b6..04ba0f8f 100644 --- a/backend/services/trading-service/src/infrastructure/persistence/repositories/c2c-order.repository.ts +++ b/backend/services/trading-service/src/infrastructure/persistence/repositories/c2c-order.repository.ts @@ -17,16 +17,8 @@ const C2C_ORDER_STATUS = { EXPIRED: 'EXPIRED', } as const; -// C2C 收款方式常量 -const C2C_PAYMENT_METHOD = { - ALIPAY: 'ALIPAY', - WECHAT: 'WECHAT', - BANK: 'BANK', -} as const; - type C2cOrderType = typeof C2C_ORDER_TYPE[keyof typeof C2C_ORDER_TYPE]; type C2cOrderStatus = typeof C2C_ORDER_STATUS[keyof typeof C2C_ORDER_STATUS]; -type C2cPaymentMethod = typeof C2C_PAYMENT_METHOD[keyof typeof C2C_PAYMENT_METHOD]; export interface C2cOrderEntity { id: string; @@ -47,7 +39,7 @@ export interface C2cOrderEntity { minAmount: string; maxAmount: string; // 收款信息 - paymentMethod?: C2cPaymentMethod | null; + paymentMethod?: string | null; paymentAccount?: string | null; paymentQrCode?: string | null; paymentRealName?: string | null; @@ -107,7 +99,7 @@ export class C2cOrderRepository { minAmount?: string; maxAmount?: string; // 收款信息 - paymentMethod?: C2cPaymentMethod; + paymentMethod?: string; paymentAccount?: string; paymentQrCode?: string; paymentRealName?: string; @@ -130,7 +122,7 @@ export class C2cOrderRepository { minAmount: data.minAmount || '0', maxAmount: data.maxAmount || '0', // 收款信息 - paymentMethod: data.paymentMethod as any, + paymentMethod: data.paymentMethod, paymentAccount: data.paymentAccount, paymentQrCode: data.paymentQrCode, paymentRealName: data.paymentRealName, @@ -154,7 +146,7 @@ export class C2cOrderRepository { takerPhone: string; takerNickname: string; // 收款信息(接买单时由taker提供) - paymentMethod: C2cPaymentMethod; + paymentMethod: string; paymentAccount: string; paymentQrCode: string; paymentRealName: string; @@ -174,7 +166,6 @@ export class C2cOrderRepository { data: { status: status as any, ...additionalData, - paymentMethod: additionalData?.paymentMethod as any, }, }); return this.toEntity(record); @@ -352,7 +343,7 @@ export class C2cOrderRepository { minAmount: record.minAmount.toString(), maxAmount: record.maxAmount.toString(), // 收款信息 - paymentMethod: record.paymentMethod as C2cPaymentMethod | null, + paymentMethod: record.paymentMethod, paymentAccount: record.paymentAccount, paymentQrCode: record.paymentQrCode, paymentRealName: record.paymentRealName,