From 347e5ce3deeef1d0a919193af7117a982af47362 Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 8 Jan 2026 09:51:11 -0800 Subject: [PATCH] =?UTF-8?q?fix(reporting-service):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E4=BA=8B=E4=BB=B6=E5=8C=BA=E5=9F=9F=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E6=98=BE=E7=A4=BA=20undefined?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不同授权事件使用不同的字段名: - province 事件:provinceCode/provinceName - city 事件:cityCode/cityName - community 事件:communityName - 通用:regionCode/regionName 现在正确处理所有变体,避免显示 "undefined undefined 完成授权" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../activity-event-consumer.controller.ts | 59 +++++++++++++++---- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/backend/services/reporting-service/src/infrastructure/kafka/activity-event-consumer.controller.ts b/backend/services/reporting-service/src/infrastructure/kafka/activity-event-consumer.controller.ts index efde5806..5e74a0ad 100644 --- a/backend/services/reporting-service/src/infrastructure/kafka/activity-event-consumer.controller.ts +++ b/backend/services/reporting-service/src/infrastructure/kafka/activity-event-consumer.controller.ts @@ -54,12 +54,19 @@ interface AuthorizationRoleEvent { payload: { authorizationId?: string; userId: string; - accountSequence: string; - roleType: string; - regionCode: string; - regionName: string; + accountSequence?: string; + roleType?: string; + // 不同事件类型使用不同的字段名 + regionCode?: string; + regionName?: string; + provinceCode?: string; + provinceName?: string; + cityCode?: string; + cityName?: string; + communityName?: string; status?: string; authorizedAt?: string; + authorizedBy?: string | null; }; _outbox?: OutboxMeta; } @@ -223,23 +230,38 @@ export class ActivityEventConsumerController { } // 根据事件类型决定是否记录活动 - if (eventType.includes('authorized') || eventType.includes('Authorized')) { + if (eventType.includes('authorized') || eventType.includes('Authorized') || eventType.includes('granted')) { const roleTypeLabel = this.getRoleTypeLabel(payload.roleType); const entityId = payload.authorizationId || message.aggregateId; + // 从不同事件类型中提取区域信息 + // - province 事件使用 provinceCode/provinceName + // - city 事件使用 cityCode/cityName + // - community 事件使用 communityName + // - 其他使用 regionCode/regionName + const regionCode = + payload.regionCode || payload.provinceCode || payload.cityCode || ''; + const regionName = + payload.regionName || + payload.provinceName || + payload.cityName || + payload.communityName || + regionCode || + '未知区域'; + // 幂等创建活动日志(如果已存在则跳过) const created = await this.activityRepo.createIfNotExists({ activityType: 'company_authorization' as ActivityType, title: '授权成功', - description: `${payload.regionName} ${roleTypeLabel} 完成授权`, + description: `${regionName} ${roleTypeLabel} 完成授权`, icon: '🏢', relatedUserId: BigInt(payload.userId), relatedEntityType: 'authorization', relatedEntityId: entityId, metadata: { roleType: payload.roleType, - regionCode: payload.regionCode, - regionName: payload.regionName, + regionCode: regionCode, + regionName: regionName, accountSequence: payload.accountSequence, authorizedAt: payload.authorizedAt || message.occurredAt, }, @@ -260,13 +282,13 @@ export class ActivityEventConsumerController { this.realtimeStatsRepo.incrementProvinceAuth(today), this.globalStatsRepo.incrementProvinceCompany(), ]); - this.logger.log(`Province company stats incremented: ${payload.regionCode}`); + this.logger.log(`Province company stats incremented: ${regionCode}`); } else if (isCityCompany) { await Promise.all([ this.realtimeStatsRepo.incrementCityAuth(today), this.globalStatsRepo.incrementCityCompany(), ]); - this.logger.log(`City company stats incremented: ${payload.regionCode}`); + this.logger.log(`City company stats incremented: ${regionCode}`); } this.logger.log(`Activity and stats recorded for authorization: ${payload.accountSequence}`); @@ -287,10 +309,21 @@ export class ActivityEventConsumerController { const { payload, aggregateId } = message; const roleTypeLabel = this.getRoleTypeLabel(payload.roleType); + // 从不同事件类型中提取区域信息 + const regionCode = + payload.regionCode || payload.provinceCode || payload.cityCode || ''; + const regionName = + payload.regionName || + payload.provinceName || + payload.cityName || + payload.communityName || + regionCode || + '未知区域'; + const created = await this.activityRepo.createIfNotExists({ activityType: 'benefit_applied' as ActivityType, title: '权益激活', - description: `${payload.regionName} ${roleTypeLabel} 激活权益`, + description: `${regionName} ${roleTypeLabel} 激活权益`, icon: '🎁', relatedUserId: BigInt(payload.userId), relatedEntityType: 'benefit', @@ -299,8 +332,8 @@ export class ActivityEventConsumerController { authorizationId: payload.authorizationId, accountSequence: payload.accountSequence, roleType: payload.roleType, - regionCode: payload.regionCode, - regionName: payload.regionName, + regionCode: regionCode, + regionName: regionName, activatedAt: message.occurredAt, }, });