代理工资结算调整

This commit is contained in:
tianfeng 2025-11-03 16:14:36 +08:00
parent 61cfebbfe3
commit 06e905aa4a
3 changed files with 102 additions and 159 deletions

View File

@ -152,12 +152,12 @@ public class TeamBillSettleListener implements MessageListener {
teamBillCycle.getBillBelong());
log.warn("团队账单结算teamMemberTargets."+teamMemberTargets);
teamMemberTargets.forEach(teamMemberTarget -> {
TeamMember teamMember = teamMemberService.getByMemberId(teamMemberTarget.getUserId());
if (Objects.nonNull(teamMember) && TeamMemberRole.OWN.eq(teamMember.getRole())) {
teamMemberTarget.setIsOwn(true);
}
});
// teamMemberTargets.forEach(teamMemberTarget -> {
// TeamMember teamMember = teamMemberService.getByMemberId(teamMemberTarget.getUserId());
// if (Objects.nonNull(teamMember) && TeamMemberRole.OWN.eq(teamMember.getRole())) {
// teamMemberTarget.setIsOwn(true);
// }
// });
// 获得区域配置细信息
SysRegionConfig regionConfig = sysRegionConfigService.getById(teamProfile.getRegion());
@ -167,14 +167,14 @@ public class TeamBillSettleListener implements MessageListener {
}
List<TeamBillMemberTarget> teamBillMemberTargets =
TeamBillCycleUtils.calculatorPolicyTargetNew(teamMemberTargets, regionPolicyManager, regionConfig);
TeamBillCycleUtils.calculatorPolicyTarget(teamMemberTargets, regionPolicyManager);
log.warn("团队账单结算teamBillMemberTargets."+teamBillMemberTargets);
// 结算账单.
TeamBillSettleResult settleResult = new TeamBillSettleResult()
.setPolicy(regionPolicyManager)
.setWorkMembers(countWorkMembers(teamMemberTargets))
.setFinishMembers(teamBillMemberTargets.size())
.setFinishMembers(teamBillMemberTargets.stream().filter(TeamBillMemberTarget::getSatisfyLevel).toList().size())
.setMemberSalary(sumMemberSalary(teamBillMemberTargets))
.setOwnSalary(ownSalary(teamBillMemberTargets))
.setTotalSalary(ownTotalSalary(teamBillMemberTargets));

View File

@ -137,97 +137,6 @@ public final class TeamBillCycleUtils {
return calculatorPolicyTarget(List.of(target), policy).get(0);
}
/**
* 计算成员工作情况.
*/
public static List<TeamBillMemberTarget> calculatorPolicyTargetNew(List<TeamMemberTarget> targets,
TeamPolicyManager policy, SysRegionConfig regionConfig) {
if (CollectionUtils.isEmpty(targets)) {
return Lists.newArrayList();
}
List<TeamPolicy> teamPolicies = Objects.nonNull(policy)
? policy.getPolicy().stream()
.sorted(Comparator.comparing(TeamPolicy::getLevel, Comparator.reverseOrder()))
.collect(Collectors.toList())
: Lists.newArrayList();
return targets.stream().map(target -> {
long targetTimeHours = target.sumAllTargetTime() / 60;
Long acceptGiftValue = target.sumAcceptGiftValue();
// 计算有效天数统计每日在线时长 >= 120分钟的天数
Integer effectiveDay = calculateEffectiveDay(target);
TeamBillMemberTarget resultTarget = new TeamBillMemberTarget()
.setTargetId(target.getTimeId())
.setSysOrigin(target.getSysOrigin())
.setUserId(target.getUserId())
.setAcceptGiftValue(target.sumAcceptGiftValue())
.setGiveGiftValue(target.sumGiveGiftValue())
.setRoomValue(target.sumRoomValue())
.setOnlineTime(target.sumAllTargetTime())
.setMemberSalary(BigDecimal.ZERO)
.setOwnSalary(BigDecimal.ZERO)
.setTotalSalary(BigDecimal.ZERO)
.setSatisfyLevel(Boolean.FALSE);
for (TeamPolicy teamPolicy : teamPolicies) {
Long policyOnlineTimeHours = NumUtils.isNullDefaultZero(teamPolicy.getOnlineTime());
Long policyGiftValue = NumUtils.isNullDefaultZero(teamPolicy.getTarget());
// 南亚区域特殊处理
if ("SA".equals(regionConfig.getRegionCode())) {
if (acceptGiftValue < policyGiftValue) {
continue;
}
Integer policyEffectiveDay = NumUtils.isNullDefaultZero(teamPolicy.getEffectiveDay());
if (targetTimeHours >= policyOnlineTimeHours && effectiveDay >= policyEffectiveDay) {
resultTarget.setMemberSalary(teamPolicy.getMemberSalary());
resultTarget.setOwnSalary(teamPolicy.getOwnSalary());
resultTarget.setTotalSalary(teamPolicy.getTotalSalary());
} else if (acceptGiftValue >= policyGiftValue && !Boolean.TRUE.equals(target.getIsOwn())){
resultTarget.setMemberSalary(teamPolicy.getMemberSalary().multiply(new BigDecimal("0.9")).setScale(2, RoundingMode.DOWN));
resultTarget.setTotalSalary(teamPolicy.getMemberSalary().multiply(new BigDecimal("0.9")).setScale(2, RoundingMode.DOWN));
}
resultTarget.setLevel(teamPolicy.getLevel());
resultTarget.setSatisfyLevel(Boolean.TRUE);
resultTarget.setPropsRewards(teamPolicy.getPropsRewards());
return resultTarget;
} else {
// 20240918 政策新增有效天字段大于1小时60分钟即可获取当天有效天
Integer policyEffectiveDay = NumUtils.isNullDefaultZero(teamPolicy.getEffectiveDay());
// 完全满足条件在线时长礼物价值有效天数都达标
if (targetTimeHours >= policyOnlineTimeHours && acceptGiftValue >= policyGiftValue && effectiveDay >= policyEffectiveDay) {
resultTarget.setMemberSalary(teamPolicy.getMemberSalary());
resultTarget.setOwnSalary(teamPolicy.getOwnSalary());
resultTarget.setTotalSalary(teamPolicy.getTotalSalary());
resultTarget.setLevel(teamPolicy.getLevel());
resultTarget.setSatisfyLevel(Boolean.TRUE);
resultTarget.setPropsRewards(teamPolicy.getPropsRewards());
return resultTarget;
}
// 部分满足条件礼物价值达标但不是主播本人
else if (acceptGiftValue >= policyGiftValue && !Boolean.TRUE.equals(target.getIsOwn())) {
resultTarget.setMemberSalary(teamPolicy.getMemberSalary().multiply(new BigDecimal("0.9")).setScale(2, RoundingMode.DOWN));
resultTarget.setTotalSalary(teamPolicy.getMemberSalary().multiply(new BigDecimal("0.9")).setScale(2, RoundingMode.DOWN));
resultTarget.setLevel(teamPolicy.getLevel());
resultTarget.setSatisfyLevel(Boolean.TRUE);
resultTarget.setPropsRewards(teamPolicy.getPropsRewards());
return resultTarget;
}
}
}
return resultTarget;
}).filter(Objects::nonNull).collect(Collectors.toList());
}
/**
* 计算有效天数
* 规则每日在线时长 >= 120分钟算作有效一天
@ -305,24 +214,27 @@ public final class TeamBillCycleUtils {
for (TeamPolicy teamPolicy : teamPolicies) {
Long policyOnlineTimeHours = NumUtils.isNullDefaultZero(teamPolicy.getOnlineTime());
Long policyGiftValue = NumUtils.isNullDefaultZero(teamPolicy.getTarget());
// 20240918 政策新增有效天字段大于1小时60分钟即可获取当天有效天
// 礼物流水不满足条件
if (acceptGiftValue < policyGiftValue) {
continue;
}
// 完全满足条件在线时长礼物流水有效天数都达标
Integer policyEffectiveDay = NumUtils.isNullDefaultZero(teamPolicy.getEffectiveDay());
if (targetTimeHours >= policyOnlineTimeHours && acceptGiftValue >= policyGiftValue && effectiveDay >= policyEffectiveDay) {
if (targetTimeHours >= policyOnlineTimeHours && effectiveDay >= policyEffectiveDay) {
resultTarget.setMemberSalary(teamPolicy.getMemberSalary());
resultTarget.setOwnSalary(teamPolicy.getOwnSalary());
resultTarget.setTotalSalary(teamPolicy.getTotalSalary());
resultTarget.setLevel(teamPolicy.getLevel());
resultTarget.setSatisfyLevel(Boolean.TRUE);
resultTarget.setPropsRewards(teamPolicy.getPropsRewards());
return resultTarget;
} else if (acceptGiftValue >= policyGiftValue && !Boolean.TRUE.equals(target.getIsOwn())) {
resultTarget.setMemberSalary(teamPolicy.getMemberSalary().multiply(new BigDecimal("0.9")).setScale(2, RoundingMode.DOWN));
resultTarget.setTotalSalary(teamPolicy.getMemberSalary().multiply(new BigDecimal("0.9")).setScale(2, RoundingMode.DOWN));
resultTarget.setLevel(teamPolicy.getLevel());
resultTarget.setSatisfyLevel(Boolean.TRUE);
resultTarget.setPropsRewards(teamPolicy.getPropsRewards());
return resultTarget;
} else {
resultTarget.setMemberSalary(teamPolicy.getMemberSalary().multiply(new BigDecimal("0.9")).setScale(2, RoundingMode.DOWN));
resultTarget.setTotalSalary(teamPolicy.getMemberSalary().multiply(new BigDecimal("0.9")).setScale(2, RoundingMode.DOWN));
}
resultTarget.setLevel(teamPolicy.getLevel());
resultTarget.setSatisfyLevel(Boolean.TRUE);
resultTarget.setPropsRewards(teamPolicy.getPropsRewards());
return resultTarget;
}
return resultTarget;
}).filter(Objects::nonNull).collect(Collectors.toList());

View File

@ -30,6 +30,7 @@ import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.List;
@SpringBootTest(classes = OtherServiceApplication.class)
@ -61,56 +62,86 @@ public class TeamMonthBillTest {
teamBillTask.processTeamMonthBillTest();
}
/**
* listener直接处理团队账单
*/
@Test
public void testListener() {
Long teamId = 1969441508127473665L;
// 获取团队信息
TeamProfile teamProfile = teamProfileService.getById(teamId);
TeamBillCycle teamBillCycle = new TeamBillCycle();
teamBillCycle.setSysOrigin("LIKEI");
teamBillCycle.setRegion(teamProfile.getRegion());
teamBillCycle.setBillBelong(20251016);
teamBillCycle.setTeamId(teamId);
// 获取团队区域政策
TeamPolicyManager regionPolicyManager = teamPolicyManagerService.getReleaseByRegionAndType(
teamBillCycle.getSysOrigin(),
teamBillCycle.getRegion()
);
SysRegionConfig regionConfig = sysRegionConfigService.getById(teamProfile.getRegion());
List<TeamMemberTarget> teamMemberTargets = teamMemberTargetService.listByBillBelong(
teamBillCycle.getTeamId(),
teamBillCycle.getBillBelong());
List<TeamBillMemberTarget> teamBillMemberTargets =
TeamBillCycleUtils.calculatorPolicyTargetNew(teamMemberTargets, regionPolicyManager, regionConfig);
// 结算账单.
TeamBillSettleResult settleResult = new TeamBillSettleResult()
.setPolicy(regionPolicyManager)
.setWorkMembers(countWorkMembers(teamMemberTargets))
.setFinishMembers(teamBillMemberTargets.size())
.setMemberSalary(sumMemberSalary(teamBillMemberTargets))
.setOwnSalary(ownSalary(teamBillMemberTargets))
.setTotalSalary(ownTotalSalary(teamBillMemberTargets));
System.out.println("============= 账单结算结果 =============");
System.out.printf("政策信息: %s%n", settleResult.getPolicy());
System.out.printf("工作人数: %d%n", settleResult.getWorkMembers());
System.out.printf("完成人数: %d%n", settleResult.getFinishMembers());
System.out.printf("成员工资: %s%n", settleResult.getMemberSalary());
System.out.printf("拥有者工资: %s%n", settleResult.getOwnSalary());
System.out.printf("工资合计: %s%n", settleResult.getTotalSalary());
System.out.println("=======================================");
/**
* 批量团队结算
*/
@Test
public void processTeamBillSettle() {
String json = " [\n" +
"\"1970912960966479874\",\n" +
"\"1965724731682754561\",\n" +
"\"1982985325435207682\",\n" +
"\"1978213327176196097\",\n" +
"\"1981316214519701506\",\n" +
"\"1980616977268658178\",\n" +
"\"1982190084063019010\",\n" +
"\"1982431621845925889\",\n" +
"\"1982372655623356418\",\n" +
"\"1980617113277353986\",\n" +
"\"1978447372520308737\"\n" +
" ]";
List<String> teamList = JSON.parseArray(json, String.class);
for (String teamId : teamList) {
Long id = Long.parseLong(teamId);
teamBillSettleListener.processBillTest(id);
}
}
private int countWorkMembers(List<TeamMemberTarget> teamMemberTargets) {
@Test
public void testListener() {
Long teamId = 1970912960966479874L;
queryTeamSalary(teamId, 2025016);
}
/**
* 查询团队工资
*/
private void queryTeamSalary(Long teamId, Integer billBelong) {
// 获取团队信息
TeamProfile teamProfile = teamProfileService.getById(teamId);
TeamBillCycle teamBillCycle = new TeamBillCycle();
teamBillCycle.setSysOrigin("LIKEI");
teamBillCycle.setRegion(teamProfile.getRegion());
teamBillCycle.setBillBelong(billBelong);
teamBillCycle.setTeamId(teamId);
// 获取团队区域政策
TeamPolicyManager regionPolicyManager = teamPolicyManagerService.getReleaseByRegionAndType(
teamBillCycle.getSysOrigin(),
teamBillCycle.getRegion()
);
List<TeamMemberTarget> teamMemberTargets = teamMemberTargetService.listByBillBelong(
teamBillCycle.getTeamId(),
teamBillCycle.getBillBelong());
List<TeamBillMemberTarget> teamBillMemberTargets =
TeamBillCycleUtils.calculatorPolicyTarget(teamMemberTargets, regionPolicyManager);
// 结算账单.
TeamBillSettleResult settleResult = new TeamBillSettleResult()
.setPolicy(regionPolicyManager)
.setWorkMembers(countWorkMembers(teamMemberTargets))
.setFinishMembers(teamBillMemberTargets.stream().filter(TeamBillMemberTarget::getSatisfyLevel).toList().size())
.setMemberSalary(sumMemberSalary(teamBillMemberTargets))
.setOwnSalary(ownSalary(teamBillMemberTargets))
.setTotalSalary(ownTotalSalary(teamBillMemberTargets));
System.out.println("============= 账单结算结果 =============");
System.out.printf("政策信息: %s%n", settleResult.getPolicy());
System.out.printf("工作人数: %d%n", settleResult.getWorkMembers());
System.out.printf("完成人数: %d%n", settleResult.getFinishMembers());
System.out.printf("成员工资: %s%n", settleResult.getMemberSalary());
System.out.printf("拥有者工资: %s%n", settleResult.getOwnSalary());
System.out.printf("工资合计: %s%n", settleResult.getTotalSalary());
System.out.println("=======================================");
}
private int countWorkMembers(List<TeamMemberTarget> teamMemberTargets) {
return CollectionUtils.isNotEmpty(teamMemberTargets) ? teamMemberTargets.size() : 0;
}