import { ApiProperty } from '@midwayjs/swagger'; import { Rule, RuleType } from '@midwayjs/validate'; /** * 批量操作错误项 */ 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 interface SyncOperationResult extends BatchOperationResult { // 同步成功数量 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 BatchCreateDTO { @ApiProperty({ description: '要创建的数据列表', type: Array }) @Rule(RuleType.array().required()) items: T[]; } /** * 批量更新DTO */ export class BatchUpdateDTO { @ApiProperty({ description: '要更新的数据列表', type: Array }) @Rule(RuleType.array().required()) items: T[]; } /** * 批量删除DTO */ export class BatchDeleteDTO { @ApiProperty({ description: '要删除的ID列表', type: [String, Number] }) @Rule(RuleType.array().items(RuleType.alternatives().try(RuleType.string(), RuleType.number())).required()) ids: Array; } /** * 批量操作请求DTO(包含增删改) */ export class BatchOperationDTO { @ApiProperty({ description: '要创建的数据列表', type: Array, required: false }) @Rule(RuleType.array().optional()) create?: T[]; @ApiProperty({ description: '要更新的数据列表', type: Array, required: false }) @Rule(RuleType.array().optional()) update?: T[]; @ApiProperty({ description: '要删除的ID列表', type: [String, Number], required: false }) @Rule(RuleType.array().items(RuleType.alternatives().try(RuleType.string(), RuleType.number())).optional()) delete?: Array; } /** * 分页批量操作DTO */ export class PaginatedBatchOperationDTO { @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: Array, required: false }) @Rule(RuleType.array().optional()) create?: T[]; @ApiProperty({ description: '要更新的数据列表', type: Array, required: false }) @Rule(RuleType.array().optional()) update?: T[]; @ApiProperty({ description: '要删除的ID列表', type: [String, Number], required: false }) @Rule(RuleType.array().items(RuleType.alternatives().try(RuleType.string(), RuleType.number())).optional()) delete?: Array; } /** * 同步参数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; @ApiProperty({ description: '包含关联数据', type: Boolean, required: false, default: false }) @Rule(RuleType.boolean().optional()) includeRelations?: boolean = false; } /** * 批量操作结果类(泛型支持) */ export class BatchOperationResultDTOGeneric extends BatchOperationResultDTO { @ApiProperty({ description: '操作成功的数据列表', type: Array }) data?: T[]; } /** * 同步操作结果类(泛型支持) */ export class SyncOperationResultDTOGeneric extends SyncOperationResultDTO { @ApiProperty({ description: '同步成功的数据列表', type: Array }) data?: T[]; }