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 36c80dfd..62c89d8a 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 @@ -1203,6 +1203,10 @@ export class AuthorizationApplicationService { // 4. 检查最近社区的权益状态 if (nearestCommunity.benefitActive) { // 权益已激活,全部给该社区 + // 累加月度新增树数(用于月度考核) + nearestCommunity.addMonthlyTrees(treeCount) + await this.authorizationRepository.save(nearestCommunity) + return { distributions: [ { @@ -1270,42 +1274,58 @@ export class AuthorizationApplicationService { // 自动激活权益 await this.tryActivateBenefit(nearestCommunity) + + // 累加月度新增树数(用于月度考核) + nearestCommunity.addMonthlyTrees(treeCount) + await this.authorizationRepository.save(nearestCommunity) } else { // 未达标,需要拆分 - // remaining: 还差多少棵达标(不包括达标那一棵本身) - // 例如:目标10棵,当前0棵 -> remaining = 9(前9棵给上级,第10棵给自己) - const remaining = Math.max(0, initialTarget - currentTeamCount - 1) + // toReachTarget: 还差多少棵达到考核目标(包括达标那一棵) + // 业务规则:第1-10棵全部给上级的上级/总部,第11棵开始才给该社区 + // 例如:目标10棵,当前2棵 -> toReachTarget = 8(第3-10棵给上级,第11棵开始给自己) + const toReachTarget = Math.max(0, initialTarget - currentTeamCount) const afterPlantingCount = currentTeamCount + treeCount // 本次认种后的总数 - if (afterPlantingCount < initialTarget) { - // 本次认种后仍未达标,全部给上级/总部 + if (afterPlantingCount <= initialTarget) { + // 本次认种后仍未超过目标(包括刚好达标),全部给上级/总部 distributions.push({ accountSequence: parentCommunityAccountSequence, treeCount, reason: `初始考核中(${currentTeamCount}+${treeCount}=${afterPlantingCount}/${initialTarget}),${parentCommunityReason}`, }) + + // 如果刚好达标,激活权益(但本批次树全部给上级) + if (afterPlantingCount === initialTarget) { + await this.tryActivateBenefit(nearestCommunity) + } } else { - // 本次认种达到或跨越考核达标点 (afterPlantingCount >= initialTarget) - // 考核前的部分给上级/总部(remaining 可能为0,此时不添加分配记录) - if (remaining > 0) { + // 本次认种跨越考核达标点 (afterPlantingCount > initialTarget) + // 达标前的部分(包括第10棵)给上级/总部 + if (toReachTarget > 0) { distributions.push({ accountSequence: parentCommunityAccountSequence, - treeCount: remaining, - reason: `初始考核(${currentTeamCount}+${remaining}=${currentTeamCount + remaining}/${initialTarget}),${parentCommunityReason}`, + treeCount: toReachTarget, + reason: `初始考核(${currentTeamCount}+${toReachTarget}=${initialTarget}/${initialTarget}),${parentCommunityReason}`, }) } - // 达标的那一棵 + 之后多出来的,全部给该社区 - const afterTargetCount = treeCount - remaining + // 超过达标点的部分(第11棵开始),给该社区 + const afterTargetCount = treeCount - toReachTarget if (afterTargetCount > 0) { distributions.push({ accountSequence: nearestCommunity.userId.accountSequence, treeCount: afterTargetCount, - reason: `考核达标后权益生效`, + reason: `考核达标后权益生效(第${initialTarget + 1}棵起)`, }) } // 自动激活权益(本次认种使其达标) await this.tryActivateBenefit(nearestCommunity) + + // 激活后累加月度新增树数(只计算归自己的那部分) + if (afterTargetCount > 0) { + nearestCommunity.addMonthlyTrees(afterTargetCount) + await this.authorizationRepository.save(nearestCommunity) + } } } @@ -1443,34 +1463,40 @@ export class AuthorizationApplicationService { // 自动激活权益 await this.tryActivateBenefit(nearestAuthProvince) } else { - // remaining: 还差多少棵达标(不包括达标那一棵本身) - const remaining = Math.max(0, initialTarget - currentTeamCount - 1) + // toReachTarget: 还差多少棵达到考核目标(包括达标那一棵) + // 业务规则:达标前的全部给上级/总部,超过达标点后才给该省团队 + const toReachTarget = Math.max(0, initialTarget - currentTeamCount) const afterPlantingCount = currentTeamCount + treeCount - if (afterPlantingCount < initialTarget) { - // 本次认种后仍未达标 + if (afterPlantingCount <= initialTarget) { + // 本次认种后仍未超过目标(包括刚好达标),全部给上级/总部 distributions.push({ accountSequence: parentAccountSequence, treeCount, reason: `初始考核中(${currentTeamCount}+${treeCount}=${afterPlantingCount}/${initialTarget}),${parentReason}`, }) + + // 如果刚好达标,激活权益(但本批次树全部给上级) + if (afterPlantingCount === initialTarget) { + await this.tryActivateBenefit(nearestAuthProvince) + } } else { - // 本次认种达到或跨越达标点 (afterPlantingCount >= initialTarget) - // 考核前的部分给上级/总部(remaining 可能为0,此时不添加分配记录) - if (remaining > 0) { + // 本次认种跨越考核达标点 (afterPlantingCount > initialTarget) + // 达标前的部分(包括第500棵)给上级/总部 + if (toReachTarget > 0) { distributions.push({ accountSequence: parentAccountSequence, - treeCount: remaining, - reason: `初始考核(${currentTeamCount}+${remaining}=${currentTeamCount + remaining}/${initialTarget}),${parentReason}`, + treeCount: toReachTarget, + reason: `初始考核(${currentTeamCount}+${toReachTarget}=${initialTarget}/${initialTarget}),${parentReason}`, }) } - // 达标的那一棵 + 之后多出来的,全部给该省团队 - const afterTargetCount = treeCount - remaining + // 超过达标点的部分,给该省团队 + const afterTargetCount = treeCount - toReachTarget if (afterTargetCount > 0) { distributions.push({ accountSequence: nearestAuthProvince.userId.accountSequence, treeCount: afterTargetCount, - reason: '考核达标后权益生效', + reason: `考核达标后权益生效(第${initialTarget + 1}棵起)`, }) } // 自动激活权益(本次认种使其达标) @@ -1572,40 +1598,46 @@ export class AuthorizationApplicationService { // 自动激活权益 await this.tryActivateBenefit(provinceCompany) } else { - // remaining: 还差多少棵达标(不包括达标那一棵本身) - const remaining = Math.max(0, initialTarget - currentTeamCount - 1) + // toReachTarget: 还差多少棵达到考核目标(包括达标那一棵) + // 业务规则:达标前的全部进系统省账户,超过达标点后才给该省公司 + const toReachTarget = Math.max(0, initialTarget - currentTeamCount) const afterPlantingCount = currentTeamCount + treeCount - if (afterPlantingCount < initialTarget) { - // 本次认种后仍未达标,全部进系统省账户 + if (afterPlantingCount <= initialTarget) { + // 本次认种后仍未超过目标(包括刚好达标),全部进系统省账户 distributions.push({ accountSequence: systemProvinceAccountId, treeCount, reason: `初始考核中(${currentTeamCount}+${treeCount}=${afterPlantingCount}/${initialTarget}),进系统省账户`, isSystemAccount: true, }) + + // 如果刚好达标,激活权益(但本批次树全部进系统省账户) + if (afterPlantingCount === initialTarget) { + await this.tryActivateBenefit(provinceCompany) + } } else { - // 本次认种达到或跨越考核达标点 (afterPlantingCount >= initialTarget) - // 考核前的部分进系统省账户(remaining 可能为0,此时不添加分配记录) - if (remaining > 0) { + // 本次认种跨越考核达标点 (afterPlantingCount > initialTarget) + // 达标前的部分进系统省账户 + if (toReachTarget > 0) { distributions.push({ accountSequence: systemProvinceAccountId, - treeCount: remaining, - reason: `初始考核(${currentTeamCount}+${remaining}=${currentTeamCount + remaining}/${initialTarget}),进系统省账户`, + treeCount: toReachTarget, + reason: `初始考核(${currentTeamCount}+${toReachTarget}=${initialTarget}/${initialTarget}),进系统省账户`, isSystemAccount: true, }) } - // 达标的那一棵 + 之后多出来的,全部给该省公司 - const afterTargetCount = treeCount - remaining + // 超过达标点的部分,给该省公司 + const afterTargetCount = treeCount - toReachTarget if (afterTargetCount > 0) { distributions.push({ accountSequence: provinceCompany.userId.accountSequence, treeCount: afterTargetCount, - reason: '考核达标后权益生效', + reason: `考核达标后权益生效(第${initialTarget + 1}棵起)`, isSystemAccount: false, }) } - // 自动激活权益 + // 自动激活权益(本次认种使其达标) await this.tryActivateBenefit(provinceCompany) } } @@ -1741,34 +1773,40 @@ export class AuthorizationApplicationService { // 自动激活权益 await this.tryActivateBenefit(nearestAuthCity) } else { - // remaining: 还差多少棵达标(不包括达标那一棵本身) - const remaining = Math.max(0, initialTarget - currentTeamCount - 1) + // toReachTarget: 还差多少棵达到考核目标(包括达标那一棵) + // 业务规则:达标前的全部给上级/总部,超过达标点后才给该市团队 + const toReachTarget = Math.max(0, initialTarget - currentTeamCount) const afterPlantingCount = currentTeamCount + treeCount - if (afterPlantingCount < initialTarget) { - // 本次认种后仍未达标 + if (afterPlantingCount <= initialTarget) { + // 本次认种后仍未超过目标(包括刚好达标),全部给上级/总部 distributions.push({ accountSequence: parentAccountSequence, treeCount, reason: `初始考核中(${currentTeamCount}+${treeCount}=${afterPlantingCount}/${initialTarget}),${parentReason}`, }) + + // 如果刚好达标,激活权益(但本批次树全部给上级) + if (afterPlantingCount === initialTarget) { + await this.tryActivateBenefit(nearestAuthCity) + } } else { - // 本次认种达到或跨越达标点 (afterPlantingCount >= initialTarget) - // 考核前的部分给上级/总部(remaining 可能为0,此时不添加分配记录) - if (remaining > 0) { + // 本次认种跨越考核达标点 (afterPlantingCount > initialTarget) + // 达标前的部分(包括第100棵)给上级/总部 + if (toReachTarget > 0) { distributions.push({ accountSequence: parentAccountSequence, - treeCount: remaining, - reason: `初始考核(${currentTeamCount}+${remaining}=${currentTeamCount + remaining}/${initialTarget}),${parentReason}`, + treeCount: toReachTarget, + reason: `初始考核(${currentTeamCount}+${toReachTarget}=${initialTarget}/${initialTarget}),${parentReason}`, }) } - // 达标的那一棵 + 之后多出来的,全部给该市团队 - const afterTargetCount = treeCount - remaining + // 超过达标点的部分,给该市团队 + const afterTargetCount = treeCount - toReachTarget if (afterTargetCount > 0) { distributions.push({ accountSequence: nearestAuthCity.userId.accountSequence, treeCount: afterTargetCount, - reason: '考核达标后权益生效', + reason: `考核达标后权益生效(第${initialTarget + 1}棵起)`, }) } // 自动激活权益(本次认种使其达标) @@ -1870,40 +1908,46 @@ export class AuthorizationApplicationService { // 自动激活权益 await this.tryActivateBenefit(cityCompany) } else { - // remaining: 还差多少棵达标(不包括达标那一棵本身) - const remaining = Math.max(0, initialTarget - currentTeamCount - 1) + // toReachTarget: 还差多少棵达到考核目标(包括达标那一棵) + // 业务规则:达标前的全部进系统市账户,超过达标点后才给该市公司 + const toReachTarget = Math.max(0, initialTarget - currentTeamCount) const afterPlantingCount = currentTeamCount + treeCount - if (afterPlantingCount < initialTarget) { - // 本次认种后仍未达标,全部进系统市账户 + if (afterPlantingCount <= initialTarget) { + // 本次认种后仍未超过目标(包括刚好达标),全部进系统市账户 distributions.push({ accountSequence: systemCityAccountId, treeCount, reason: `初始考核中(${currentTeamCount}+${treeCount}=${afterPlantingCount}/${initialTarget}),进系统市账户`, isSystemAccount: true, }) + + // 如果刚好达标,激活权益(但本批次树全部进系统市账户) + if (afterPlantingCount === initialTarget) { + await this.tryActivateBenefit(cityCompany) + } } else { - // 本次认种达到或跨越考核达标点 (afterPlantingCount >= initialTarget) - // 考核前的部分进系统市账户(remaining 可能为0,此时不添加分配记录) - if (remaining > 0) { + // 本次认种跨越考核达标点 (afterPlantingCount > initialTarget) + // 达标前的部分进系统市账户 + if (toReachTarget > 0) { distributions.push({ accountSequence: systemCityAccountId, - treeCount: remaining, - reason: `初始考核(${currentTeamCount}+${remaining}=${currentTeamCount + remaining}/${initialTarget}),进系统市账户`, + treeCount: toReachTarget, + reason: `初始考核(${currentTeamCount}+${toReachTarget}=${initialTarget}/${initialTarget}),进系统市账户`, isSystemAccount: true, }) } - // 达标的那一棵 + 之后多出来的,全部给该市公司 - const afterTargetCount = treeCount - remaining + // 超过达标点的部分,给该市公司 + const afterTargetCount = treeCount - toReachTarget if (afterTargetCount > 0) { distributions.push({ accountSequence: cityCompany.userId.accountSequence, treeCount: afterTargetCount, - reason: '考核达标后权益生效', + reason: `考核达标后权益生效(第${initialTarget + 1}棵起)`, isSystemAccount: false, }) } - // 自动激活权益 + // 自动激活权益(本次认种使其达标) await this.tryActivateBenefit(cityCompany) } }