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 513fc7d4..f77b1623 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 @@ -304,27 +304,46 @@ export class AuthorizationApplicationService { /** * 管理员授权正式市公司(市区域) - * 需要验证团队内唯一性:同一推荐链上不能有重复的相同城市授权 + * + * 业务规则: + * - 同一个用户不能同时拥有市区域和省区域两种身份 + * - 同一个城市只允许一个市区域角色被授权 */ async grantCityCompany(command: GrantCityCompanyCommand): Promise { const userId = UserId.create(command.userId, command.accountSequence) const adminId = AdminUserId.create(command.adminId, command.adminAccountSequence) - const regionCode = RegionCode.create(command.cityCode) - // 1. 验证团队内唯一性(同一推荐链上不能有重复的相同城市授权) - const validation = await this.validatorService.validateAuthorizationRequest( - userId, - RoleType.CITY_COMPANY, - regionCode, - this.referralRepository, - this.authorizationRepository, + // 1. 检查用户是否已有省区域授权(市区域和省区域互斥) + const existingProvinceCompany = await this.authorizationRepository.findByAccountSequenceAndRoleType( + command.accountSequence, + RoleType.PROVINCE_COMPANY, ) - - if (!validation.isValid) { - throw new ApplicationError(validation.errorMessage!) + if (existingProvinceCompany && existingProvinceCompany.status !== AuthorizationStatus.REVOKED) { + throw new ApplicationError( + `用户 ${command.accountSequence} 已拥有省区域角色「${existingProvinceCompany.regionName}」,不能同时拥有市区域角色`, + ) } - // 2. 创建授权 + // 2. 检查用户是否已有市区域授权(一个用户只能有一个市区域) + const existingCityCompany = await this.authorizationRepository.findByAccountSequenceAndRoleType( + command.accountSequence, + RoleType.CITY_COMPANY, + ) + if (existingCityCompany && existingCityCompany.status !== AuthorizationStatus.REVOKED) { + throw new ApplicationError( + `用户 ${command.accountSequence} 已拥有市区域角色「${existingCityCompany.regionName}」,不能重复授权`, + ) + } + + // 3. 检查该城市是否已有市区域授权(同一城市全局唯一) + const existingCityRegion = await this.authorizationRepository.findCityCompanyByRegion(command.cityCode) + if (existingCityRegion && existingCityRegion.status !== AuthorizationStatus.REVOKED) { + throw new ApplicationError( + `城市「${command.cityName}」已有市区域角色授权给用户 ${existingCityRegion.userId.accountSequence},不能重复授权`, + ) + } + + // 4. 创建授权 const authorization = AuthorizationRole.createCityCompany({ userId, cityCode: command.cityCode,