fix(authorization): 自助申请授权状态设为AUTHORIZED而非PENDING

问题:自助申请的社区/市团队/省团队授权创建时状态为PENDING,
导致在推荐关系查询中无法找到这些授权(查询只匹配AUTHORIZED状态)

解决方案:
- 新增 createSelfAppliedCommunity 工厂方法,状态直接设为 AUTHORIZED
- 新增 createSelfAppliedAuthCityCompany 工厂方法
- 新增 createSelfAppliedAuthProvinceCompany 工厂方法
- 更新事件类型允许 authorizedBy 为 null(表示自助申请)
- 自助申请处理方法改用新的工厂方法

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2025-12-22 16:59:20 -08:00
parent 857beeb196
commit 0506a3547c
3 changed files with 155 additions and 13 deletions

View File

@ -2865,9 +2865,9 @@ export class AuthorizationApplicationService {
throw new ApplicationError('您已拥有社区授权')
}
// 直接创建授权(自助申请的社区授权直接生效
// 直接创建授权(自助申请的社区授权直接生效,状态为 AUTHORIZED
const userId = UserId.create(command.userId, command.accountSequence)
const authorization = AuthorizationRole.createCommunityAuth({
const authorization = AuthorizationRole.createSelfAppliedCommunity({
userId,
communityName: command.communityName!,
})
@ -2906,9 +2906,9 @@ export class AuthorizationApplicationService {
throw new ApplicationError('该市已有授权市公司')
}
// 创建授权市公司授权
// 创建授权市公司授权(自助申请直接生效,状态为 AUTHORIZED
const userId = UserId.create(command.userId, command.accountSequence)
const authorization = AuthorizationRole.createAuthCityCompany({
const authorization = AuthorizationRole.createSelfAppliedAuthCityCompany({
userId,
cityCode: command.cityCode!,
cityName: command.cityName!,
@ -2948,9 +2948,9 @@ export class AuthorizationApplicationService {
throw new ApplicationError('该省已有授权省公司')
}
// 创建授权省公司授权
// 创建授权省公司授权(自助申请直接生效,状态为 AUTHORIZED
const userId = UserId.create(command.userId, command.accountSequence)
const authorization = AuthorizationRole.createAuthProvinceCompany({
const authorization = AuthorizationRole.createSelfAppliedAuthProvinceCompany({
userId,
provinceCode: command.provinceCode!,
provinceName: command.provinceName!,

View File

@ -283,6 +283,50 @@ export class AuthorizationRole extends AggregateRoot {
return auth
}
// 工厂方法 - 自助申请社区授权(直接生效,无需审核)
static createSelfAppliedCommunity(params: { userId: UserId; communityName: string }): AuthorizationRole {
const now = new Date()
const auth = new AuthorizationRole({
authorizationId: AuthorizationId.generate(),
userId: params.userId,
roleType: RoleType.COMMUNITY,
regionCode: RegionCode.create(params.communityName),
regionName: params.communityName,
status: AuthorizationStatus.AUTHORIZED, // 自助申请直接生效
displayTitle: params.communityName,
authorizedAt: now,
authorizedBy: null, // 自助申请无管理员
revokedAt: null,
revokedBy: null,
revokeReason: null,
assessmentConfig: AssessmentConfig.forCommunity(),
requireLocalPercentage: 0,
exemptFromPercentageCheck: true,
benefitActive: false, // 权益需要达到考核目标后激活
benefitActivatedAt: null,
benefitDeactivatedAt: null,
benefitValidUntil: null,
lastAssessmentMonth: null,
monthlyTreesAdded: 0,
lastMonthTreesAdded: 0,
currentMonthIndex: 0,
deletedAt: null,
createdAt: now,
updatedAt: now,
})
auth.addDomainEvent(
new CommunityAuthorizedEvent({
authorizationId: auth.authorizationId.value,
userId: params.userId.value,
communityName: params.communityName,
authorizedBy: null, // 自助申请
}),
)
return auth
}
// 工厂方法 - 管理员直接授权社区
static createCommunity(params: {
userId: UserId
@ -381,6 +425,55 @@ export class AuthorizationRole extends AggregateRoot {
return auth
}
// 工厂方法 - 自助申请授权省公司(直接生效,无需审核)
static createSelfAppliedAuthProvinceCompany(params: {
userId: UserId
provinceCode: string
provinceName: string
}): AuthorizationRole {
const now = new Date()
const auth = new AuthorizationRole({
authorizationId: AuthorizationId.generate(),
userId: params.userId,
roleType: RoleType.AUTH_PROVINCE_COMPANY,
regionCode: RegionCode.create(params.provinceCode),
regionName: params.provinceName,
status: AuthorizationStatus.AUTHORIZED, // 自助申请直接生效
displayTitle: `授权${params.provinceName}`,
authorizedAt: now,
authorizedBy: null, // 自助申请无管理员
revokedAt: null,
revokedBy: null,
revokeReason: null,
assessmentConfig: AssessmentConfig.forAuthProvince(),
requireLocalPercentage: 5.0,
exemptFromPercentageCheck: false,
benefitActive: false, // 权益需要达到考核目标后激活
benefitActivatedAt: null,
benefitDeactivatedAt: null,
benefitValidUntil: null,
lastAssessmentMonth: null,
monthlyTreesAdded: 0,
lastMonthTreesAdded: 0,
currentMonthIndex: 0,
deletedAt: null,
createdAt: now,
updatedAt: now,
})
auth.addDomainEvent(
new AuthProvinceCompanyGrantedEvent({
authorizationId: auth.authorizationId.value,
userId: params.userId.value,
provinceCode: params.provinceCode,
provinceName: params.provinceName,
authorizedBy: null, // 自助申请
}),
)
return auth
}
// 工厂方法 - 创建正式省公司
// 授权即激活开始按月考核150, 300, 600, 1200, 2400, 4800, 9600, 19200, 11750
static createProvinceCompany(params: {
@ -481,6 +574,55 @@ export class AuthorizationRole extends AggregateRoot {
return auth
}
// 工厂方法 - 自助申请授权市公司(直接生效,无需审核)
static createSelfAppliedAuthCityCompany(params: {
userId: UserId
cityCode: string
cityName: string
}): AuthorizationRole {
const now = new Date()
const auth = new AuthorizationRole({
authorizationId: AuthorizationId.generate(),
userId: params.userId,
roleType: RoleType.AUTH_CITY_COMPANY,
regionCode: RegionCode.create(params.cityCode),
regionName: params.cityName,
status: AuthorizationStatus.AUTHORIZED, // 自助申请直接生效
displayTitle: `授权${params.cityName}`,
authorizedAt: now,
authorizedBy: null, // 自助申请无管理员
revokedAt: null,
revokedBy: null,
revokeReason: null,
assessmentConfig: AssessmentConfig.forAuthCity(),
requireLocalPercentage: 5.0,
exemptFromPercentageCheck: false,
benefitActive: false, // 权益需要达到考核目标后激活
benefitActivatedAt: null,
benefitDeactivatedAt: null,
benefitValidUntil: null,
lastAssessmentMonth: null,
monthlyTreesAdded: 0,
lastMonthTreesAdded: 0,
currentMonthIndex: 0,
deletedAt: null,
createdAt: now,
updatedAt: now,
})
auth.addDomainEvent(
new AuthCityCompanyGrantedEvent({
authorizationId: auth.authorizationId.value,
userId: params.userId.value,
cityCode: params.cityCode,
cityName: params.cityName,
authorizedBy: null, // 自助申请
}),
)
return auth
}
// 工厂方法 - 创建正式市公司
// 授权即激活开始按月考核30, 60, 120, 240, 480, 960, 1920, 3840, 2350
static createCityCompany(params: {

View File

@ -1,7 +1,7 @@
import { DomainEvent } from './domain-event.base'
import { RoleType } from '@/domain/enums'
// 社区授权事件(管理员直接授权
// 社区授权事件(管理员直接授权或自助申请
export class CommunityAuthorizedEvent extends DomainEvent {
readonly eventType = 'authorization.community.authorized'
readonly aggregateId: string
@ -9,14 +9,14 @@ export class CommunityAuthorizedEvent extends DomainEvent {
authorizationId: string
userId: string
communityName: string
authorizedBy: string
authorizedBy: string | null // null 表示自助申请
}
constructor(data: {
authorizationId: string
userId: string
communityName: string
authorizedBy: string
authorizedBy: string | null
}) {
super()
this.aggregateId = data.authorizationId
@ -146,7 +146,7 @@ export class AuthProvinceCompanyGrantedEvent extends DomainEvent {
userId: string
provinceCode: string
provinceName: string
authorizedBy: string
authorizedBy: string | null // null 表示自助申请
}
constructor(data: {
@ -154,7 +154,7 @@ export class AuthProvinceCompanyGrantedEvent extends DomainEvent {
userId: string
provinceCode: string
provinceName: string
authorizedBy: string
authorizedBy: string | null
}) {
super()
this.aggregateId = data.authorizationId
@ -171,7 +171,7 @@ export class AuthCityCompanyGrantedEvent extends DomainEvent {
userId: string
cityCode: string
cityName: string
authorizedBy: string
authorizedBy: string | null // null 表示自助申请
}
constructor(data: {
@ -179,7 +179,7 @@ export class AuthCityCompanyGrantedEvent extends DomainEvent {
userId: string
cityCode: string
cityName: string
authorizedBy: string
authorizedBy: string | null
}) {
super()
this.aggregateId = data.authorizationId