b626db5d84
Unify product/store visibility on HQ whitelist, mark isTest snapshots, and fix SUPER_ADMIN access for the new module.
591 lines
9.5 KiB
TypeScript
591 lines
9.5 KiB
TypeScript
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;
|
||
}
|