129 lines
3.6 KiB
TypeScript
129 lines
3.6 KiB
TypeScript
import { IsString, IsOptional, Length, Matches, IsInt, Min, Max } from 'class-validator';
|
|
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
|
|
|
export class ValidateReferralCodeDto {
|
|
@ApiProperty({ description: '推荐码', example: 'RWA123ABC' })
|
|
@IsString()
|
|
@Length(6, 20)
|
|
@Matches(/^[A-Z0-9]+$/, { message: '推荐码只能包含大写字母和数字' })
|
|
code: string;
|
|
}
|
|
|
|
export class CreateReferralDto {
|
|
@ApiProperty({ description: '用户ID', example: '123456789' })
|
|
@IsString()
|
|
userId: string;
|
|
|
|
@ApiProperty({ description: '账户序列号 (新格式: D + YYMMDD + 5位序号)', example: 'D2512110008' })
|
|
@IsString()
|
|
accountSequence: string; // 格式: D + YYMMDD + 5位序号
|
|
|
|
@ApiProperty({ description: '用户的推荐码(由 identity-service 生成)', example: 'ABC123' })
|
|
@IsString()
|
|
@Length(6, 20)
|
|
referralCode: string;
|
|
|
|
@ApiPropertyOptional({ description: '推荐人的推荐码', example: 'RWA123ABC' })
|
|
@IsOptional()
|
|
@IsString()
|
|
@Length(6, 20)
|
|
referrerCode?: string;
|
|
|
|
@ApiPropertyOptional({ description: '邀请人账户序列号 (新格式: D + YYMMDD + 5位序号)', example: 'D2512110007' })
|
|
@IsOptional()
|
|
@IsString()
|
|
inviterAccountSequence?: string;
|
|
}
|
|
|
|
export class GetDirectReferralsDto {
|
|
@ApiPropertyOptional({ description: '每页数量', default: 50 })
|
|
@IsOptional()
|
|
@IsInt()
|
|
@Min(1)
|
|
@Max(100)
|
|
limit?: number = 50;
|
|
|
|
@ApiPropertyOptional({ description: '偏移量', default: 0 })
|
|
@IsOptional()
|
|
@IsInt()
|
|
@Min(0)
|
|
offset?: number = 0;
|
|
}
|
|
|
|
export class ReferralInfoResponseDto {
|
|
@ApiProperty({ description: '用户ID' })
|
|
userId: string;
|
|
|
|
@ApiProperty({ description: '推荐码' })
|
|
referralCode: string;
|
|
|
|
@ApiProperty({ description: '推荐人ID', nullable: true })
|
|
referrerId: string | null;
|
|
|
|
@ApiProperty({ description: '推荐链深度' })
|
|
referralChainDepth: number;
|
|
|
|
@ApiProperty({ description: '直推人数' })
|
|
directReferralCount: number;
|
|
|
|
@ApiProperty({ description: '团队总认种量' })
|
|
totalTeamCount: number;
|
|
|
|
@ApiProperty({ description: '个人认种量' })
|
|
personalPlantingCount: number;
|
|
|
|
@ApiProperty({ description: '团队认种量' })
|
|
teamPlantingCount: number;
|
|
|
|
@ApiProperty({ description: '龙虎榜分值' })
|
|
leaderboardScore: number;
|
|
|
|
@ApiProperty({ description: '龙虎榜排名', nullable: true })
|
|
leaderboardRank: number | null;
|
|
|
|
@ApiProperty({ description: '创建时间' })
|
|
createdAt: Date;
|
|
}
|
|
|
|
export class DirectReferralResponseDto {
|
|
@ApiProperty({ description: '用户ID' })
|
|
userId: string;
|
|
|
|
@ApiProperty({ description: '账户序列号 (新格式: D + YYMMDD + 5位序号)' })
|
|
accountSequence: string; // 格式: D + YYMMDD + 5位序号
|
|
|
|
@ApiProperty({ description: '推荐码' })
|
|
referralCode: string;
|
|
|
|
@ApiProperty({ description: '个人认种量' })
|
|
personalPlantingCount: number;
|
|
|
|
@ApiProperty({ description: '团队认种量' })
|
|
teamPlantingCount: number;
|
|
|
|
@ApiProperty({ description: '直推人数(用于判断是否有下级)' })
|
|
directReferralCount: number;
|
|
|
|
@ApiProperty({ description: '加入时间' })
|
|
joinedAt: Date;
|
|
}
|
|
|
|
export class DirectReferralsResponseDto {
|
|
@ApiProperty({ type: [DirectReferralResponseDto] })
|
|
referrals: DirectReferralResponseDto[];
|
|
|
|
@ApiProperty({ description: '总数' })
|
|
total: number;
|
|
|
|
@ApiProperty({ description: '是否有更多' })
|
|
hasMore: boolean;
|
|
}
|
|
|
|
export class ValidateCodeResponseDto {
|
|
@ApiProperty({ description: '是否有效' })
|
|
valid: boolean;
|
|
|
|
@ApiPropertyOptional({ description: '推荐人ID' })
|
|
referrerId?: string;
|
|
}
|