fix(authorization-service): 修复权益分配边界逻辑 + 添加 addMonthlyTrees 调用

边界逻辑修复:
- 社区/省/市团队和区域权益分配:第N棵(达标棵)也给上级,第N+1棵起才给自己
- 例如社区:第1-10棵全部给上级的上级/总部,第11棵起才归该社区

addMonthlyTrees 调用:
- 权益已激活时:累加全部树数
- 初始考核达标后:累加归自己的那部分(第11棵起)
- 已达标但未激活时:累加全部树数

🤖 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-13 21:24:16 -08:00
parent 6bd6c6b5be
commit d12bf6df2f
1 changed files with 107 additions and 63 deletions

View File

@ -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)
}
}