Files
mp-pilates/packages/server/src/shop/dto/shop.dto.ts
richarjiang 21e3ece21c feat: 去掉商品取货码,管理员可直接发货完成
已付款订单不再生成或核验取货码,管理员确认后即可完成订单。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-25 11:22:15 +08:00

65 lines
1.8 KiB
TypeScript

import { Type, Transform } from 'class-transformer'
import {
IsBoolean,
IsIn,
IsInt,
IsNotEmpty,
IsOptional,
IsString,
IsUrl,
Matches,
Max,
MaxLength,
Min,
} from 'class-validator'
export class ProductDto {
@IsString()
@Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
@IsNotEmpty()
@MaxLength(80)
title!: string
@IsString() @MaxLength(5000) description!: string
@IsUrl({ protocols: ['https'], require_protocol: true }) @MaxLength(1000) coverUrl!: string
@IsInt() @Min(1) @Max(10000000) price!: number
@IsBoolean() isActive!: boolean
@IsInt() @Min(0) @Max(99999) sortOrder!: number
@IsOptional() @IsInt() @Min(0) version?: number
}
export class StockDto {
@IsInt() @Min(-1000000) @Max(1000000) delta!: number
@IsInt() @Min(0) version!: number
@IsString()
@Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
@IsNotEmpty()
@MaxLength(200)
reason!: string
}
export class BuyProductDto {
@IsInt()
@Min(1)
@Max(10000000)
expectedPrice!: number
@IsString() @IsNotEmpty() @MaxLength(50) productId!: string
@IsString() @Matches(/^[a-zA-Z0-9_-]{8,80}$/) requestId!: string
@IsInt() @Min(1) @Max(99) quantity!: number
@IsString()
@Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
@IsNotEmpty()
@MaxLength(40)
contactName!: string
@IsString() @Matches(/^1[3-9]\d{9}$/) contactPhone!: string
}
export class ShopQueryDto {
@IsOptional() @Type(() => Number) @IsInt() @Min(1) @Max(100000) page = 1
@IsOptional() @Type(() => Number) @IsInt() @Min(1) @Max(50) limit = 20
@IsOptional() @IsIn(['PENDING', 'PAID', 'COMPLETED', 'CANCELLED']) status?:
| 'PENDING'
| 'PAID'
| 'COMPLETED'
| 'CANCELLED'
@IsOptional() @IsString() @MaxLength(80) search?: string
@IsOptional() @IsString() @MaxLength(50) productId?: string
}