From 9378bf757090cfd701a852241dca87886c34a7a8 Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 11 Dec 2025 17:48:49 -0800 Subject: [PATCH] feat(authorization): add skipAssessment option to admin grant APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Admin grant APIs now default to requiring assessment (benefitActive=false). Added optional skipAssessment parameter to bypass assessment when needed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../admin-authorization.controller.ts | 3 +++ .../api/dto/request/grant-city-company.dto.ts | 9 +++++-- .../api/dto/request/grant-community.dto.ts | 9 +++++-- .../dto/request/grant-province-company.dto.ts | 9 +++++-- .../commands/grant-city-company.command.ts | 1 + .../commands/grant-community.command.ts | 1 + .../grant-province-company.command.ts | 1 + .../authorization-application.service.ts | 3 +++ .../authorization-role.aggregate.ts | 24 ++++++++++++------- 9 files changed, 45 insertions(+), 15 deletions(-) diff --git a/backend/services/authorization-service/src/api/controllers/admin-authorization.controller.ts b/backend/services/authorization-service/src/api/controllers/admin-authorization.controller.ts index bb57cdb0..67a592f1 100644 --- a/backend/services/authorization-service/src/api/controllers/admin-authorization.controller.ts +++ b/backend/services/authorization-service/src/api/controllers/admin-authorization.controller.ts @@ -27,6 +27,7 @@ export class AdminAuthorizationController { dto.communityName, user.userId, user.accountSequence, + dto.skipAssessment ?? false, ) await this.applicationService.grantCommunity(command) return { message: '社区授权成功' } @@ -47,6 +48,7 @@ export class AdminAuthorizationController { dto.provinceName, user.userId, user.accountSequence, + dto.skipAssessment ?? false, ) await this.applicationService.grantProvinceCompany(command) return { message: '正式省公司授权成功' } @@ -67,6 +69,7 @@ export class AdminAuthorizationController { dto.cityName, user.userId, user.accountSequence, + dto.skipAssessment ?? false, ) await this.applicationService.grantCityCompany(command) return { message: '正式市公司授权成功' } diff --git a/backend/services/authorization-service/src/api/dto/request/grant-city-company.dto.ts b/backend/services/authorization-service/src/api/dto/request/grant-city-company.dto.ts index b886471b..d774b175 100644 --- a/backend/services/authorization-service/src/api/dto/request/grant-city-company.dto.ts +++ b/backend/services/authorization-service/src/api/dto/request/grant-city-company.dto.ts @@ -1,5 +1,5 @@ -import { IsString, IsNotEmpty, MaxLength, IsNumber } from 'class-validator' -import { ApiProperty } from '@nestjs/swagger' +import { IsString, IsNotEmpty, MaxLength, IsNumber, IsBoolean, IsOptional } from 'class-validator' +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger' export class GrantCityCompanyDto { @ApiProperty({ description: '用户ID' }) @@ -23,4 +23,9 @@ export class GrantCityCompanyDto { @IsNotEmpty({ message: '城市名称不能为空' }) @MaxLength(50, { message: '城市名称最大50字符' }) cityName: string + + @ApiPropertyOptional({ description: '是否跳过考核直接激活权益', default: false }) + @IsBoolean() + @IsOptional() + skipAssessment?: boolean } diff --git a/backend/services/authorization-service/src/api/dto/request/grant-community.dto.ts b/backend/services/authorization-service/src/api/dto/request/grant-community.dto.ts index 8259d038..f5d82bdc 100644 --- a/backend/services/authorization-service/src/api/dto/request/grant-community.dto.ts +++ b/backend/services/authorization-service/src/api/dto/request/grant-community.dto.ts @@ -1,5 +1,5 @@ -import { IsString, IsNotEmpty, MaxLength, IsNumber } from 'class-validator' -import { ApiProperty } from '@nestjs/swagger' +import { IsString, IsNotEmpty, MaxLength, IsNumber, IsBoolean, IsOptional } from 'class-validator' +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger' export class GrantCommunityDto { @ApiProperty({ description: '用户ID' }) @@ -17,4 +17,9 @@ export class GrantCommunityDto { @IsNotEmpty({ message: '社区名称不能为空' }) @MaxLength(100, { message: '社区名称最大100字符' }) communityName: string + + @ApiPropertyOptional({ description: '是否跳过考核直接激活权益', default: false }) + @IsBoolean() + @IsOptional() + skipAssessment?: boolean } diff --git a/backend/services/authorization-service/src/api/dto/request/grant-province-company.dto.ts b/backend/services/authorization-service/src/api/dto/request/grant-province-company.dto.ts index d6a33b03..3b5cec09 100644 --- a/backend/services/authorization-service/src/api/dto/request/grant-province-company.dto.ts +++ b/backend/services/authorization-service/src/api/dto/request/grant-province-company.dto.ts @@ -1,5 +1,5 @@ -import { IsString, IsNotEmpty, MaxLength, IsNumber } from 'class-validator' -import { ApiProperty } from '@nestjs/swagger' +import { IsString, IsNotEmpty, MaxLength, IsNumber, IsBoolean, IsOptional } from 'class-validator' +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger' export class GrantProvinceCompanyDto { @ApiProperty({ description: '用户ID' }) @@ -23,4 +23,9 @@ export class GrantProvinceCompanyDto { @IsNotEmpty({ message: '省份名称不能为空' }) @MaxLength(50, { message: '省份名称最大50字符' }) provinceName: string + + @ApiPropertyOptional({ description: '是否跳过考核直接激活权益', default: false }) + @IsBoolean() + @IsOptional() + skipAssessment?: boolean } diff --git a/backend/services/authorization-service/src/application/commands/grant-city-company.command.ts b/backend/services/authorization-service/src/application/commands/grant-city-company.command.ts index 10a44a86..19a9e780 100644 --- a/backend/services/authorization-service/src/application/commands/grant-city-company.command.ts +++ b/backend/services/authorization-service/src/application/commands/grant-city-company.command.ts @@ -6,5 +6,6 @@ export class GrantCityCompanyCommand { public readonly cityName: string, public readonly adminId: string, public readonly adminAccountSequence: number, + public readonly skipAssessment: boolean = false, ) {} } diff --git a/backend/services/authorization-service/src/application/commands/grant-community.command.ts b/backend/services/authorization-service/src/application/commands/grant-community.command.ts index 97e2645f..306018b7 100644 --- a/backend/services/authorization-service/src/application/commands/grant-community.command.ts +++ b/backend/services/authorization-service/src/application/commands/grant-community.command.ts @@ -5,5 +5,6 @@ export class GrantCommunityCommand { public readonly communityName: string, public readonly adminId: string, public readonly adminAccountSequence: number, + public readonly skipAssessment: boolean = false, ) {} } diff --git a/backend/services/authorization-service/src/application/commands/grant-province-company.command.ts b/backend/services/authorization-service/src/application/commands/grant-province-company.command.ts index c4853177..7aa16d72 100644 --- a/backend/services/authorization-service/src/application/commands/grant-province-company.command.ts +++ b/backend/services/authorization-service/src/application/commands/grant-province-company.command.ts @@ -6,5 +6,6 @@ export class GrantProvinceCompanyCommand { public readonly provinceName: string, public readonly adminId: string, public readonly adminAccountSequence: number, + public readonly skipAssessment: boolean = false, ) {} } diff --git a/backend/services/authorization-service/src/application/services/authorization-application.service.ts b/backend/services/authorization-service/src/application/services/authorization-application.service.ts index 8cb857fe..fda98987 100644 --- a/backend/services/authorization-service/src/application/services/authorization-application.service.ts +++ b/backend/services/authorization-service/src/application/services/authorization-application.service.ts @@ -232,6 +232,7 @@ export class AuthorizationApplicationService { userId, communityName: command.communityName, adminId, + skipAssessment: command.skipAssessment, }) await this.authorizationRepository.save(authorization) @@ -251,6 +252,7 @@ export class AuthorizationApplicationService { provinceCode: command.provinceCode, provinceName: command.provinceName, adminId, + skipAssessment: command.skipAssessment, }) await this.authorizationRepository.save(authorization) @@ -270,6 +272,7 @@ export class AuthorizationApplicationService { cityCode: command.cityCode, cityName: command.cityName, adminId, + skipAssessment: command.skipAssessment, }) await this.authorizationRepository.save(authorization) diff --git a/backend/services/authorization-service/src/domain/aggregates/authorization-role.aggregate.ts b/backend/services/authorization-service/src/domain/aggregates/authorization-role.aggregate.ts index 06ff6e1f..1c24a513 100644 --- a/backend/services/authorization-service/src/domain/aggregates/authorization-role.aggregate.ts +++ b/backend/services/authorization-service/src/domain/aggregates/authorization-role.aggregate.ts @@ -221,7 +221,9 @@ export class AuthorizationRole extends AggregateRoot { userId: UserId communityName: string adminId: AdminUserId + skipAssessment?: boolean }): AuthorizationRole { + const skipAssessment = params.skipAssessment ?? false const auth = new AuthorizationRole({ authorizationId: AuthorizationId.generate(), userId: params.userId, @@ -238,10 +240,10 @@ export class AuthorizationRole extends AggregateRoot { assessmentConfig: AssessmentConfig.forCommunity(), requireLocalPercentage: 0, exemptFromPercentageCheck: true, - benefitActive: true, - benefitActivatedAt: new Date(), + benefitActive: skipAssessment, + benefitActivatedAt: skipAssessment ? new Date() : null, benefitDeactivatedAt: null, - currentMonthIndex: 1, + currentMonthIndex: skipAssessment ? 1 : 0, createdAt: new Date(), updatedAt: new Date(), }) @@ -306,7 +308,9 @@ export class AuthorizationRole extends AggregateRoot { provinceCode: string provinceName: string adminId: AdminUserId + skipAssessment?: boolean }): AuthorizationRole { + const skipAssessment = params.skipAssessment ?? false const auth = new AuthorizationRole({ authorizationId: AuthorizationId.generate(), userId: params.userId, @@ -323,10 +327,10 @@ export class AuthorizationRole extends AggregateRoot { assessmentConfig: AssessmentConfig.forProvince(), requireLocalPercentage: 0, exemptFromPercentageCheck: true, - benefitActive: true, - benefitActivatedAt: new Date(), + benefitActive: skipAssessment, + benefitActivatedAt: skipAssessment ? new Date() : null, benefitDeactivatedAt: null, - currentMonthIndex: 0, + currentMonthIndex: skipAssessment ? 1 : 0, createdAt: new Date(), updatedAt: new Date(), }) @@ -392,7 +396,9 @@ export class AuthorizationRole extends AggregateRoot { cityCode: string cityName: string adminId: AdminUserId + skipAssessment?: boolean }): AuthorizationRole { + const skipAssessment = params.skipAssessment ?? false const auth = new AuthorizationRole({ authorizationId: AuthorizationId.generate(), userId: params.userId, @@ -409,10 +415,10 @@ export class AuthorizationRole extends AggregateRoot { assessmentConfig: AssessmentConfig.forCity(), requireLocalPercentage: 0, exemptFromPercentageCheck: true, - benefitActive: true, - benefitActivatedAt: new Date(), + benefitActive: skipAssessment, + benefitActivatedAt: skipAssessment ? new Date() : null, benefitDeactivatedAt: null, - currentMonthIndex: 0, + currentMonthIndex: skipAssessment ? 1 : 0, createdAt: new Date(), updatedAt: new Date(), })