import { Type, Transform } from 'class-transformer'; import { IsBoolean, IsIn, IsInt, IsOptional, IsString, Max, Min } from 'class-validator'; function toOptionalBoolean(value: unknown): boolean | undefined { if (value === undefined || value === null || value === '') return undefined; if (value === true || value === 'true' || value === '1' || value === 1) return true; if (value === false || value === 'false' || value === '0' || value === 0) return false; return undefined; } export class PaginationQueryDto { @IsOptional() @Type(() => Number) @IsInt() @Min(1) page?: number = 1; @IsOptional() @Type(() => Number) @IsInt() @Min(1) @Max(100) pageSize?: number = 20; } export class AdminUsersQueryDto extends PaginationQueryDto { @IsOptional() @IsString() phone?: string; @IsOptional() @IsString() userNo?: string; @IsOptional() @IsString() deviceKey?: string; @IsOptional() @IsIn(['0', '1']) phoneVerified?: string; @IsOptional() @Type(() => Number) @IsIn([0, 1]) status?: number; /** 勾选「过滤测试账号」时传 true */ @IsOptional() @Transform(({ value }) => toOptionalBoolean(value)) @IsBoolean() excludeTest?: boolean; } export class AdminOrdersQueryDto extends PaginationQueryDto { @IsOptional() @IsString() orderNo?: string; @IsOptional() @IsString() status?: string; @IsOptional() @IsIn(['NORMAL', 'PROXY']) orderType?: string; @IsOptional() @IsString() userId?: string; @IsOptional() @IsString() cityId?: string; @IsOptional() @IsString() receiverPhone?: string; /** 仅看大单拦截待总部确认:true / 1 */ @IsOptional() fulfillmentHold?: string | boolean; @IsOptional() @IsString() createdFrom?: string; @IsOptional() @IsString() createdTo?: string; @IsOptional() @Transform(({ value }) => toOptionalBoolean(value)) @IsBoolean() excludeTest?: boolean; } /** 概览页用户/订单 ECharts 聚合筛选 */ export class AdminDashboardAnalyticsQueryDto { /** YYYY-MM-DD,默认近 30 天 */ @IsOptional() @IsString() dateFrom?: string; @IsOptional() @IsString() dateTo?: string; /** 开城城市 id;`none` = 用户未选城 */ @IsOptional() @IsString() cityId?: string; /** 推广码 id;`none` = 无归因 / 订单无推广码 */ @IsOptional() @IsString() promoCodeId?: string; /** 城市合伙人(主账号)id */ @IsOptional() @IsString() partnerAccountId?: string; } export class AdminStoresQueryDto extends PaginationQueryDto { @IsOptional() @IsString() name?: string; @IsOptional() @IsString() status?: string; @IsOptional() @IsString() cityId?: string; @IsOptional() @IsString() partnerId?: string; @IsOptional() @IsString() phone?: string; @IsOptional() @IsString() auditStatus?: string; @IsOptional() @Transform(({ value }) => toOptionalBoolean(value)) @IsBoolean() excludeTest?: boolean; } export class AdminStoreAccountsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() phone?: string; @IsOptional() @IsString() storeId?: string; @IsOptional() @IsString() status?: string; @IsOptional() @Transform(({ value }) => toOptionalBoolean(value)) @IsBoolean() excludeTest?: boolean; } export class AdminPartnersQueryDto extends PaginationQueryDto { @IsOptional() @IsString() companyName?: string; @IsOptional() @IsString() contactPhone?: string; @IsOptional() @IsString() phone?: string; @IsOptional() @IsString() cityId?: string; @IsOptional() @IsString() partnerId?: string; @IsOptional() @Transform(({ value }) => toOptionalBoolean(value)) @IsBoolean() excludeTest?: boolean; } export class AdminCityWarehousesQueryDto extends PaginationQueryDto { @IsOptional() @IsString() cityId?: string; @IsOptional() @IsString() name?: string; @IsOptional() @IsString() managerType?: string; @IsOptional() @IsString() status?: string; } export class AdminPartnerAccountsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() phone?: string; @IsOptional() @IsString() partnerId?: string; @IsOptional() @IsString() status?: string; @IsOptional() @IsString() isPrimary?: string; } export class AdminBenefitCouponsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() couponNo?: string; @IsOptional() @IsString() userId?: string; @IsOptional() @IsString() status?: string; } export class AdminBenefitLedgersQueryDto extends PaginationQueryDto { @IsOptional() @IsString() userId?: string; @IsOptional() @IsString() couponId?: string; @IsOptional() @IsString() type?: string; } export class AdminRedeemRecordsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() redeemNo?: string; @IsOptional() @IsString() storeId?: string; @IsOptional() @IsString() userId?: string; /** SCAN | PHONE */ @IsOptional() @IsString() channel?: string; @IsOptional() @Transform(({ value }) => toOptionalBoolean(value)) @IsBoolean() excludeTest?: boolean; } export class AdminStoreRatingsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() storeId?: string; @IsOptional() @IsString() redeemNo?: string; } export class AdminDeliveriesQueryDto extends PaginationQueryDto { @IsOptional() @IsString() provider?: string; @IsOptional() @IsString() trackingNo?: string; @IsOptional() @IsString() orderNo?: string; } export class AdminHqAccountsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() phone?: string; @IsOptional() @IsString() adminRole?: string; @IsOptional() @IsString() status?: string; } export class AdminCitiesQueryDto extends PaginationQueryDto { @IsOptional() @IsString() name?: string; @IsOptional() @IsString() code?: string; @IsOptional() @IsString() status?: string; @IsOptional() @IsString() partnerId?: string; } export class AdminProductsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() name?: string; @IsOptional() @IsString() status?: string; @IsOptional() @IsString() aromaType?: string; } export class AdminProductDetailTemplatesQueryDto extends PaginationQueryDto { @IsOptional() @IsString() name?: string; @IsOptional() @IsString() code?: string; @IsOptional() @IsString() status?: string; @IsOptional() @IsString() aromaType?: string; } export class AdminUserLogsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() userId?: string; @IsOptional() @IsString() phone?: string; @IsOptional() @IsString() userNo?: string; @IsOptional() @IsString() category?: string; @IsOptional() @IsString() eventName?: string; @IsOptional() @IsString() from?: string; @IsOptional() @IsString() to?: string; } export class AdminStoreLogsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() storeId?: string; @IsOptional() @IsString() storeAccountId?: string; @IsOptional() @IsString() phone?: string; @IsOptional() @IsString() storeName?: string; @IsOptional() @IsString() category?: string; @IsOptional() @IsString() eventName?: string; @IsOptional() @IsString() from?: string; @IsOptional() @IsString() to?: string; } export class AdminPartnerLogsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() partnerId?: string; @IsOptional() @IsString() partnerAccountId?: string; @IsOptional() @IsString() phone?: string; @IsOptional() @IsString() companyName?: string; @IsOptional() @IsString() category?: string; @IsOptional() @IsString() eventName?: string; @IsOptional() @IsString() from?: string; @IsOptional() @IsString() to?: string; } export class AdminHqLogsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() hqAccountId?: string; @IsOptional() @IsString() action?: string; @IsOptional() @IsString() refType?: string; @IsOptional() @IsString() from?: string; @IsOptional() @IsString() to?: string; } export class AdminOssLogsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() scene?: string; @IsOptional() @IsIn(['SUCCESS', 'FAILED', 'PENDING']) status?: string; @IsOptional() @IsString() bizType?: string; @IsOptional() @IsString() clientApp?: string; @IsOptional() @IsString() refType?: string; @IsOptional() @IsString() refId?: string; } export class AdminStoreMediaQueryDto extends PaginationQueryDto { @IsOptional() @IsString() storeId?: string; @IsOptional() @IsString() mediaType?: string; } export class AdminPromoCodesQueryDto extends PaginationQueryDto { @IsOptional() @IsString() name?: string; @IsOptional() @IsString() code?: string; @IsOptional() @IsIn(['ACTIVE', 'DISABLED']) status?: string; } export class AdminWechatBindingsQueryDto extends PaginationQueryDto { @IsOptional() @IsIn(['USER', 'STORE', 'PARTNER', 'HQ']) actorType?: string; @IsOptional() @IsString() phone?: string; @IsOptional() @IsString() unionId?: string; @IsOptional() @IsString() openId?: string; } export class AdminWecomBotLogsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() botId?: string; @IsOptional() @IsString() wecomUserId?: string; @IsOptional() @IsString() action?: string; @IsOptional() @IsString() success?: string; @IsOptional() @IsString() from?: string; @IsOptional() @IsString() to?: string; }