217 lines
6.2 KiB
TypeScript
217 lines
6.2 KiB
TypeScript
import { ApiProperty } from '@midwayjs/swagger';
|
||
import { Rule, RuleType } from '@midwayjs/validate';
|
||
|
||
export class UnifiedPaginationDTO<T> {
|
||
// 分页DTO用于承载统一分页信息与列表数据
|
||
@ApiProperty({ description: '列表数据' })
|
||
items: T[];
|
||
|
||
@ApiProperty({ description: '总数', example: 100 })
|
||
total: number;
|
||
|
||
@ApiProperty({ description: '当前页', example: 1 })
|
||
page: number;
|
||
|
||
@ApiProperty({ description: '每页数量', example: 20 })
|
||
per_page: number;
|
||
|
||
@ApiProperty({ description: '总页数', example: 5 })
|
||
totalPages: number;
|
||
}
|
||
|
||
|
||
export class UnifiedSearchParamsDTO<Where=Record<string, any>> {
|
||
// 统一查询参数DTO用于承载分页与筛选与排序参数
|
||
@ApiProperty({ description: '页码', example: 1, required: false })
|
||
page?: number;
|
||
|
||
@ApiProperty({ description: '每页数量', example: 20, required: false })
|
||
per_page?: number;
|
||
|
||
@ApiProperty({ description: '查询时间范围开始', example: '2023-01-01T00:00:00Z', required: false })
|
||
after?: string;
|
||
|
||
@ApiProperty({ description: '查询时间范围结束', example: '2023-01-01T23:59:59Z', required: false })
|
||
before?: string;
|
||
|
||
@ApiProperty({ description: '搜索关键词', required: false })
|
||
search?: string;
|
||
|
||
@ApiProperty({
|
||
description: '过滤条件对象',
|
||
type: 'any', // FIXME 这里是因为 openapit2ts 会将 where 变成 undefined 所以有嵌套对象时先不指定类型
|
||
required: false,
|
||
})
|
||
where?: Where;
|
||
|
||
@ApiProperty({
|
||
description: '排序对象,例如 { "sku": "desc" }',
|
||
type: 'any', // FIXME 这里是因为 openapit2ts 会将 where 变成 undefined 所以有嵌套对象时先不指定类型
|
||
required: false,
|
||
})
|
||
orderBy?: Record<string, 'asc' | 'desc'> | string;
|
||
}
|
||
|
||
/**
|
||
* Shopyy获取所有订单参数DTO
|
||
*/
|
||
export class ShopyyGetAllOrdersParams {
|
||
@ApiProperty({ description: '每页数量', example: 100, required: false })
|
||
per_page?: number;
|
||
|
||
@ApiProperty({ description: '支付时间范围开始', example: '2023-01-01T00:00:00Z', required: false })
|
||
pay_at_min?: string;
|
||
|
||
@ApiProperty({ description: '支付时间范围结束', example: '2023-01-01T23:59:59Z', required: false })
|
||
pay_at_max?: string;
|
||
|
||
@ApiProperty({ description: '排序字段', example: 'id', required: false })
|
||
order_field?: string;//排序字段(默认id) id=订单ID updated_at=最后更新时间 pay_at=支付时间
|
||
}
|
||
|
||
/**
|
||
* 批量操作错误项
|
||
*/
|
||
export interface BatchErrorItem {
|
||
// 错误项标识(可以是ID、邮箱等)
|
||
identifier: string;
|
||
// 错误信息
|
||
error: string;
|
||
}
|
||
|
||
/**
|
||
* 批量操作结果基础接口
|
||
*/
|
||
export interface BatchOperationResult {
|
||
// 总处理数量
|
||
total: number;
|
||
// 成功处理数量
|
||
processed: number;
|
||
// 创建数量
|
||
created?: number;
|
||
// 更新数量
|
||
updated?: number;
|
||
// 删除数量
|
||
deleted?: number;
|
||
// 跳过的数量(如数据已存在或无需处理)
|
||
skipped?: number;
|
||
// 错误列表
|
||
errors: BatchErrorItem[];
|
||
}
|
||
|
||
/**
|
||
* 同步操作结果接口
|
||
*/
|
||
export class SyncOperationResult implements BatchOperationResult {
|
||
total: number;
|
||
processed: number;
|
||
created?: number;
|
||
updated?: number;
|
||
deleted?: number;
|
||
skipped?: number;
|
||
errors: BatchErrorItem[];
|
||
// 同步成功数量
|
||
synced: number;
|
||
}
|
||
|
||
/**
|
||
* 批量操作错误项DTO
|
||
*/
|
||
export class BatchErrorItemDTO {
|
||
@ApiProperty({ description: '错误项标识(如ID、邮箱等)', type: String })
|
||
@Rule(RuleType.string().required())
|
||
identifier: string;
|
||
|
||
@ApiProperty({ description: '错误信息', type: String })
|
||
@Rule(RuleType.string().required())
|
||
error: string;
|
||
}
|
||
|
||
/**
|
||
* 批量操作结果基础DTO
|
||
*/
|
||
export class BatchOperationResultDTO {
|
||
@ApiProperty({ description: '总处理数量', type: Number })
|
||
total: number;
|
||
|
||
@ApiProperty({ description: '成功处理数量', type: Number })
|
||
processed: number;
|
||
|
||
@ApiProperty({ description: '创建数量', type: Number, required: false })
|
||
created?: number;
|
||
|
||
@ApiProperty({ description: '更新数量', type: Number, required: false })
|
||
updated?: number;
|
||
|
||
@ApiProperty({ description: '删除数量', type: Number, required: false })
|
||
deleted?: number;
|
||
|
||
@ApiProperty({ description: '跳过的数量', type: Number, required: false })
|
||
skipped?: number;
|
||
|
||
@ApiProperty({ description: '错误列表', type: [BatchErrorItemDTO] })
|
||
errors: BatchErrorItemDTO[];
|
||
}
|
||
|
||
/**
|
||
* 同步操作结果DTO
|
||
*/
|
||
export class SyncOperationResultDTO extends BatchOperationResultDTO {
|
||
@ApiProperty({ description: '同步成功数量', type: Number })
|
||
synced: number;
|
||
}
|
||
|
||
/**
|
||
* 同步参数DTO
|
||
*/
|
||
export class SyncParamsDTO {
|
||
@ApiProperty({ description: '页码', type: Number, required: false, default: 1 })
|
||
@Rule(RuleType.number().integer().min(1).optional())
|
||
page?: number = 1;
|
||
|
||
@ApiProperty({ description: '每页数量', type: Number, required: false, default: 100 })
|
||
@Rule(RuleType.number().integer().min(1).max(1000).optional())
|
||
pageSize?: number = 100;
|
||
|
||
@ApiProperty({ description: '开始时间', type: String, required: false })
|
||
@Rule(RuleType.string().optional())
|
||
startDate?: string;
|
||
|
||
@ApiProperty({ description: '结束时间', type: String, required: false })
|
||
@Rule(RuleType.string().optional())
|
||
endDate?: string;
|
||
|
||
@ApiProperty({ description: '强制同步(忽略缓存)', type: Boolean, required: false, default: false })
|
||
@Rule(RuleType.boolean().optional())
|
||
force?: boolean = false;
|
||
}
|
||
|
||
/**
|
||
* 批量查询DTO
|
||
*/
|
||
export class BatchQueryDTO {
|
||
@ApiProperty({ description: 'ID列表', type: [String, Number] })
|
||
@Rule(RuleType.array().items(RuleType.alternatives().try(RuleType.string(), RuleType.number())).required())
|
||
ids: Array<string | number>;
|
||
|
||
@ApiProperty({ description: '包含关联数据', type: Boolean, required: false, default: false })
|
||
@Rule(RuleType.boolean().optional())
|
||
includeRelations?: boolean = false;
|
||
}
|
||
|
||
/**
|
||
* 批量操作结果类(泛型支持)
|
||
*/
|
||
export class BatchOperationResultDTOGeneric<T> extends BatchOperationResultDTO {
|
||
@ApiProperty({ description: '操作成功的数据列表', type: Array })
|
||
data?: T[];
|
||
}
|
||
|
||
/**
|
||
* 同步操作结果类(泛型支持)
|
||
*/
|
||
export class SyncOperationResultDTOGeneric<T> extends SyncOperationResultDTO {
|
||
@ApiProperty({ description: '同步成功的数据列表', type: Array })
|
||
data?: T[];
|
||
}
|