import { ApiProperty } from '@midwayjs/swagger'; import { Rule, RuleType } from '@midwayjs/validate'; /** * DTO 用于创建产品 */ export class CreateProductDTO { @ApiProperty({ example: 'ZYN 6MG WINTERGREEN', description: '产品名称', required: true, }) @Rule(RuleType.string().required().empty({ message: '产品名称不能为空' })) name: string; @ApiProperty({ example: '产品描述', description: '产品描述' }) @Rule(RuleType.string()) description: string; @ApiProperty({ description: '产品 SKU', required: false }) @Rule(RuleType.string()) sku?: string; // 通用属性输入(中文注释:通过 attributes 统一提交品牌/口味/强度/尺寸/干湿等) @ApiProperty({ description: '属性列表', type: 'array' }) @Rule(RuleType.array().required()) attributes: AttributeInputDTO[]; // 商品价格 @ApiProperty({ description: '价格', example: 99.99, required: false }) @Rule(RuleType.number()) price?: number; // 促销价格 @ApiProperty({ description: '促销价格', example: 99.99, required: false }) @Rule(RuleType.number()) promotionPrice?: number; } /** * DTO 用于更新产品 */ export class UpdateProductDTO { @ApiProperty({ example: 'ZYN 6MG WINTERGREEN', description: '产品名称' }) @Rule(RuleType.string()) name?: string; @ApiProperty({ example: '产品描述', description: '产品描述' }) @Rule(RuleType.string()) description?: string; @ApiProperty({ description: '产品 SKU', required: false }) @Rule(RuleType.string()) sku?: string; // 商品价格 @ApiProperty({ description: '价格', example: 99.99, required: false }) @Rule(RuleType.number()) price?: number; // 促销价格 @ApiProperty({ description: '促销价格', example: 99.99, required: false }) @Rule(RuleType.number()) promotionPrice?: number; // 属性更新(中文注释:可选,支持增量替换指定字典的属性项) @ApiProperty({ description: '属性列表', type: 'array', required: false }) @Rule(RuleType.array()) attributes?: AttributeInputDTO[]; } /** * DTO 用于分页查询产品 */ export class QueryProductDTO { @ApiProperty({ example: '1', description: '页码' }) @Rule(RuleType.number()) current: number; @ApiProperty({ example: '10', description: '每页大小' }) @Rule(RuleType.number()) pageSize: number; @ApiProperty({ example: 'ZYN', description: '关键字' }) @Rule(RuleType.string()) name: string; @ApiProperty({ example: '1', description: '品牌 ID' }) @Rule(RuleType.string()) brandId: number; } // 属性输入项(中文注释:用于在创建/更新产品时传递字典项信息) export class AttributeInputDTO { @ApiProperty({ description: '字典名称', example: 'brand', required: false}) @Rule(RuleType.string()) dictName?: string; @ApiProperty({ description: '字典项 ID', required: false }) @Rule(RuleType.number()) id?: number; @ApiProperty({ description: '字典项显示名称', required: false }) @Rule(RuleType.string()) title?: string; @ApiProperty({ description: '字典项唯一标识', required: false }) @Rule(RuleType.string()) name?: string; } /** * DTO 用于创建品牌 */ export class CreateBrandDTO { @ApiProperty({ example: 'ZYN', description: '品牌名称', required: true }) @Rule(RuleType.string().required().empty({ message: '品牌名称不能为空' })) title: string; @ApiProperty({ example: 'ZYN', description: '品牌唯一标识', required: true }) @Rule(RuleType.string().required().empty({ message: 'key不能为空' })) name: string; } /** * DTO 用于更新品牌 */ export class UpdateBrandDTO { @ApiProperty({ example: 'ZYN', description: '品牌名称' }) @Rule(RuleType.string()) title: string; @ApiProperty({ example: 'ZYN', description: '品牌唯一标识' }) @Rule(RuleType.string()) name: string; } /** * DTO 用于查询品牌(支持分页) */ export class QueryBrandDTO { @ApiProperty({ example: '1', description: '页码' }) @Rule(RuleType.number()) current: number; // 页码 @ApiProperty({ example: '10', description: '每页大小' }) @Rule(RuleType.number()) pageSize: number; // 每页大小 @ApiProperty({ example: 'ZYN', description: '关键字' }) @Rule(RuleType.string()) name: string; // 搜索关键字(支持模糊查询) } export class CreateFlavorsDTO { @ApiProperty({ example: 'WINTERGREEN', description: '口味名称', required: true }) @Rule(RuleType.string().required().empty({ message: '口味名称不能为空' })) title: string; @ApiProperty({ example: 'WINTERGREEN', description: '口味唯一标识', required: true, }) @Rule(RuleType.string().required().empty({ message: 'key不能为空' })) name: string; } export class UpdateFlavorsDTO { @ApiProperty({ example: 'WINTERGREEN', description: '口味名称' }) @Rule(RuleType.string()) title: string; @ApiProperty({ example: 'WINTERGREEN', description: '口味唯一标识' }) @Rule(RuleType.string()) name: string; } export class QueryFlavorsDTO { @ApiProperty({ example: '1', description: '页码' }) @Rule(RuleType.number()) current: number; // 页码 @ApiProperty({ example: '10', description: '每页大小' }) @Rule(RuleType.number()) pageSize: number; // 每页大小 @ApiProperty({ example: 'ZYN', description: '关键字' }) @Rule(RuleType.string()) name: string; // 搜索关键字(支持模糊查询) } export class CreateStrengthDTO { @ApiProperty({ example: '6MG', description: '规格名称', required: false }) @Rule(RuleType.string()) title?: string; @ApiProperty({ example: '6MG', description: '规格唯一标识', required: true }) @Rule(RuleType.string().required().empty({ message: 'key不能为空' })) name: string; } export class UpdateStrengthDTO { @ApiProperty({ example: '6MG', description: '规格名称' }) @Rule(RuleType.string()) title: string; @ApiProperty({ example: '6MG', description: '规格唯一标识' }) @Rule(RuleType.string()) name: string; } export class QueryStrengthDTO { @ApiProperty({ example: '1', description: '页码' }) @Rule(RuleType.number()) current: number; // 页码 @ApiProperty({ example: '10', description: '每页大小' }) @Rule(RuleType.number()) pageSize: number; // 每页大小 @ApiProperty({ example: 'YOONE', description: '关键字' }) @Rule(RuleType.string()) name: string; // 搜索关键字(支持模糊查询) } // size 新增 DTO export class CreateSizeDTO { @ApiProperty({ example: '6', description: '尺寸名称', required: false }) @Rule(RuleType.string()) title?: string; @ApiProperty({ example: '6', description: '尺寸唯一标识', required: true }) @Rule(RuleType.string().required().empty({ message: 'key不能为空' })) name: string; } export class UpdateSizeDTO { @ApiProperty({ example: '6', description: '尺寸名称' }) @Rule(RuleType.string()) title: string; @ApiProperty({ example: '6', description: '尺寸唯一标识' }) @Rule(RuleType.string()) name: string; } export class QuerySizeDTO { @ApiProperty({ example: '1', description: '页码' }) @Rule(RuleType.number()) current: number; // 页码 @ApiProperty({ example: '10', description: '每页大小' }) @Rule(RuleType.number()) pageSize: number; // 每页大小 @ApiProperty({ example: '6', description: '关键字' }) @Rule(RuleType.string()) name: string; // 搜索关键字(支持模糊查询) } export class SkuItemDTO { @ApiProperty({ description: '产品 ID' }) productId: number; @ApiProperty({ description: 'sku 编码' }) sku: string; } export class BatchSetSkuDTO { @ApiProperty({ description: 'sku 数据列表', type: [SkuItemDTO] }) skus: SkuItemDTO[]; } // 中文注释:产品库存组成项输入 export class ProductComponentItemDTO { @ApiProperty({ description: '库存记录ID' }) @Rule(RuleType.number().required()) stockId: number; @ApiProperty({ description: '组成数量', example: 1 }) @Rule(RuleType.number().min(1).default(1)) quantity: number; } // 中文注释:设置产品库存组成输入 export class SetProductComponentsDTO { @ApiProperty({ description: '组成项列表', type: [ProductComponentItemDTO] }) @Rule(RuleType.array().items(RuleType.object())) items: ProductComponentItemDTO[]; }