292 lines
8.2 KiB
TypeScript
292 lines
8.2 KiB
TypeScript
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[];
|
|
}
|