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:
parent
6bd6c6b5be
commit
d12bf6df2f
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue