import { ApiProperty } from '@midwayjs/swagger'; import { UnifiedSearchParamsDTO } from './api.dto'; import { Customer } from '../entity/customer.entity'; // 客户基本信息DTO(用于响应) export class CustomerDTO extends Customer{ @ApiProperty({ description: '客户ID' }) id: number; @ApiProperty({ description: '站点ID', required: false }) site_id: number; @ApiProperty({ description: '原始ID', required: false }) origin_id: string; @ApiProperty({ description: '站点创建时间', required: false }) site_created_at: Date; @ApiProperty({ description: '站点更新时间', required: false }) site_updated_at: Date; @ApiProperty({ description: '邮箱' }) email: string; @ApiProperty({ description: '名字', required: false }) first_name: string; @ApiProperty({ description: '姓氏', required: false }) last_name: string; @ApiProperty({ description: '全名', required: false }) fullname: string; @ApiProperty({ description: '用户名', required: false }) username: string; @ApiProperty({ description: '电话', required: false }) phone: string; @ApiProperty({ description: '头像URL', required: false }) avatar: string; @ApiProperty({ description: '账单信息', type: 'object', required: false }) billing: any; @ApiProperty({ description: '配送信息', type: 'object', required: false }) shipping: any; @ApiProperty({ description: '原始数据', type: 'object', required: false }) raw: any; @ApiProperty({ description: '创建时间' }) created_at: Date; @ApiProperty({ description: '更新时间' }) updated_at: Date; @ApiProperty({ description: '评分' }) rate: number; @ApiProperty({ description: '标签列表', type: [String], required: false }) tags: string[]; } // ====================== 单条操作 ====================== // 创建客户请求DTO export class CreateCustomerDTO { @ApiProperty({ description: '站点ID' }) site_id: number; @ApiProperty({ description: '原始ID', required: false }) origin_id?: string; @ApiProperty({ description: '邮箱' }) email: string; @ApiProperty({ description: '名字', required: false }) first_name?: string; @ApiProperty({ description: '姓氏', required: false }) last_name?: string; @ApiProperty({ description: '全名', required: false }) fullname?: string; @ApiProperty({ description: '用户名', required: false }) username?: string; @ApiProperty({ description: '电话', required: false }) phone?: string; @ApiProperty({ description: '头像URL', required: false }) avatar?: string; @ApiProperty({ description: '账单信息', type: 'object', required: false }) billing?: any; @ApiProperty({ description: '配送信息', type: 'object', required: false }) shipping?: any; @ApiProperty({ description: '原始数据', type: 'object', required: false }) raw?: any; @ApiProperty({ description: '评分', required: false }) rate?: number; @ApiProperty({ description: '标签列表', type: [String], required: false }) tags?: string[]; @ApiProperty({ description: '站点创建时间', required: false }) site_created_at?: Date; @ApiProperty({ description: '站点更新时间', required: false }) site_updated_at?: Date; } // 更新客户请求DTO export class UpdateCustomerDTO { @ApiProperty({ description: '站点ID', required: false }) site_id?: number; @ApiProperty({ description: '原始ID', required: false }) origin_id?: string; @ApiProperty({ description: '邮箱', required: false }) email?: string; @ApiProperty({ description: '名字', required: false }) first_name?: string; @ApiProperty({ description: '姓氏', required: false }) last_name?: string; @ApiProperty({ description: '全名', required: false }) fullname?: string; @ApiProperty({ description: '用户名', required: false }) username?: string; @ApiProperty({ description: '电话', required: false }) phone?: string; @ApiProperty({ description: '头像URL', required: false }) avatar?: string; @ApiProperty({ description: '账单信息', type: 'object', required: false }) billing?: any; @ApiProperty({ description: '配送信息', type: 'object', required: false }) shipping?: any; @ApiProperty({ description: '原始数据', type: 'object', required: false }) raw?: any; @ApiProperty({ description: '评分', required: false }) rate?: number; @ApiProperty({ description: '标签列表', type: [String], required: false }) tags?: string[]; } // 查询单个客户响应DTO(继承基本信息) export class GetCustomerDTO extends CustomerDTO { // 可以添加额外的详细信息字段 } // 客户统计信息DTO(包含订单统计) export class CustomerStatisticDTO extends CustomerDTO { @ApiProperty({ description: '创建日期' }) date_created: Date; @ApiProperty({ description: '首次购买日期' }) first_purchase_date: Date; @ApiProperty({ description: '最后购买日期' }) last_purchase_date: Date; @ApiProperty({ description: '订单数量' }) orders: number; @ApiProperty({ description: '总消费金额' }) total: number; @ApiProperty({ description: 'Yoone订单数量', required: false }) yoone_orders?: number; @ApiProperty({ description: 'Yoone总金额', required: false }) yoone_total?: number; } // 客户统计查询条件DTO export class CustomerStatisticWhereDTO { @ApiProperty({ description: '邮箱筛选', required: false }) email?: string; @ApiProperty({ description: '标签筛选', required: false }) tags?: string; @ApiProperty({ description: '首次购买日期筛选', required: false }) first_purchase_date?: string; @ApiProperty({ description: '评分筛选', required: false }) rate?: number; @ApiProperty({ description: '客户ID筛选', required: false }) customerId?: number; } // 客户统计查询参数DTO(继承通用查询参数) export type CustomerStatisticQueryParamsDTO = UnifiedSearchParamsDTO; // 客户统计列表响应DTO export class CustomerStatisticListResponseDTO { @ApiProperty({ description: '客户统计列表', type: [CustomerStatisticDTO] }) items: CustomerStatisticDTO[]; @ApiProperty({ description: '总数', example: 100 }) total: number; @ApiProperty({ description: '当前页', example: 1 }) current: number; @ApiProperty({ description: '每页数量', example: 20 }) pageSize: number; } // ====================== 批量操作 ====================== // 批量创建客户请求DTO export class BatchCreateCustomerDTO { @ApiProperty({ description: '客户列表', type: [CreateCustomerDTO] }) customers: CreateCustomerDTO[]; } // 单个客户更新项DTO export class UpdateCustomerItemDTO { @ApiProperty({ description: '客户ID' }) id: number; @ApiProperty({ description: '更新字段', type: UpdateCustomerDTO }) update_data: Partial; } // 批量更新客户请求DTO - 每个对象包含id和要更新的字段 export class BatchUpdateCustomerDTO { @ApiProperty({ description: '客户更新列表', type: [UpdateCustomerItemDTO] }) customers: UpdateCustomerItemDTO[]; } // 批量删除客户请求DTO export class BatchDeleteCustomerDTO { @ApiProperty({ description: '客户ID列表', type: [Number] }) ids: number[]; } // ====================== 查询操作 ====================== // 客户查询条件DTO(用于UnifiedSearchParamsDTO的where参数) export class CustomerWhereDTO { @ApiProperty({ description: '邮箱筛选', required: false }) email?: string; @ApiProperty({ description: '标签筛选', required: false }) tags?: string; @ApiProperty({ description: '评分筛选', required: false }) rate?: number; @ApiProperty({ description: '站点ID筛选', required: false }) site_id?: number; @ApiProperty({ description: '客户ID筛选', required: false }) customerId?: number; @ApiProperty({ description: '首次购买日期筛选', required: false }) first_purchase_date?: string; @ApiProperty({ description: '角色筛选', required: false }) role?: string; } // 客户查询参数DTO(继承通用查询参数) export type CustomerQueryParamsDTO = UnifiedSearchParamsDTO; // 客户列表响应DTO(参考site-api.dto.ts中的分页格式) export class CustomerListResponseDTO { @ApiProperty({ description: '客户列表', type: [CustomerDTO] }) items: CustomerDTO[]; @ApiProperty({ description: '总数', example: 100 }) total: number; @ApiProperty({ description: '页码', example: 1 }) page: number; @ApiProperty({ description: '每页数量', example: 20 }) per_page: number; @ApiProperty({ description: '总页数', example: 5 }) total_pages: number; } // ====================== 客户标签相关 ====================== // 客户标签基本信息DTO export class CustomerTagBasicDTO { @ApiProperty({ description: '标签ID' }) id: number; @ApiProperty({ description: '客户ID' }) customer_id: number; @ApiProperty({ description: '标签名称' }) tag: string; @ApiProperty({ description: '创建时间', required: false }) created_at?: string; } // 添加客户标签请求DTO export class AddCustomerTagDTO { @ApiProperty({ description: '客户ID' }) customer_id: number; @ApiProperty({ description: '标签名称' }) tag: string; } // 批量添加客户标签请求DTO export class BatchAddCustomerTagDTO { @ApiProperty({ description: '客户ID' }) customer_id: number; @ApiProperty({ description: '标签列表', type: [String] }) tags: string[]; } // 删除客户标签请求DTO export class DeleteCustomerTagDTO { @ApiProperty({ description: '标签ID' }) tag_id: number; } // 批量删除客户标签请求DTO export class BatchDeleteCustomerTagDTO { @ApiProperty({ description: '标签ID列表', type: [Number] }) tag_ids: number[]; } // ====================== 同步操作 ====================== // 同步客户数据请求DTO export class SyncCustomersDTO { @ApiProperty({ description: '站点ID' }) siteId: number; @ApiProperty({ description: '查询参数(支持where和orderBy)', type: UnifiedSearchParamsDTO, required: false }) params?: UnifiedSearchParamsDTO; }