2025-12-02 10:11:28 +08:00

194 lines
7.6 KiB
Java

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.red.circle.OtherServiceApplication;
import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
import com.red.circle.other.app.listener.team.TeamBillSettleListener;
import com.red.circle.other.app.manager.activity.award.WeeklyRewardsSentManager;
import com.red.circle.other.app.scheduler.TeamBillTask;
import com.red.circle.other.infra.database.mongo.dto.team.TeamBillMemberTarget;
import com.red.circle.other.infra.database.mongo.dto.team.TeamBillSettleResult;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamBillCycle;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamMemberTarget;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamProfile;
import com.red.circle.other.infra.database.mongo.entity.user.region.SysRegionConfig;
import com.red.circle.other.infra.database.mongo.service.team.TeamBillCycleUtils;
import com.red.circle.other.infra.database.mongo.service.team.team.TeamBillCycleService;
import com.red.circle.other.infra.database.mongo.service.team.team.TeamMemberTargetService;
import com.red.circle.other.infra.database.mongo.service.team.team.TeamPolicyManagerService;
import com.red.circle.other.infra.database.mongo.service.team.team.TeamProfileService;
import com.red.circle.other.infra.database.mongo.service.team.team.impl.TeamBillCycleServiceImpl;
import com.red.circle.other.infra.database.mongo.service.user.region.SysRegionConfigService;
import com.red.circle.tool.core.collection.CollectionUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
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)
@RunWith(SpringRunner.class)
public class TeamMonthBillTest {
@Autowired
private TeamBillTask teamBillTask;
@Autowired
private TeamBillSettleListener teamBillSettleListener;
@Autowired
private WeeklyRewardsSentManager weeklyRewardsSentManager;
@Autowired
private TeamBillCycleService teamBillCycleService;
@Autowired
private TeamBillCycleServiceImpl teamBillCycleServiceImpl;
@Autowired
private TeamPolicyManagerService teamPolicyManagerService;
@Autowired
private SysRegionConfigService sysRegionConfigService;
@Autowired
private TeamProfileService teamProfileService;
@Autowired
private TeamMemberTargetService teamMemberTargetService;
@Test
public void testBill() {
teamBillCycleServiceImpl.billStatusPayOutTest();
}
/**
* 更新账单 然很发布消息
*/
@Test
public void processTeamBill() {
teamBillTask.processTeamMonthBillTest();
}
/**
* 批量团队结算
*/
@Test
public void processTeamBillSettle() {
String json = "['1989278352807731201']";
List<String> teamList = JSON.parseArray(json, String.class);
for (String teamId : teamList) {
Long id = Long.parseLong(teamId);
teamBillSettleListener.processBillTest(id);
}
}
@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 = getTeamMemberTargets(teamBillCycle);
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 List<TeamMemberTarget> getTeamMemberTargets(TeamBillCycle teamBillCycle) {
Integer billBelong = teamBillCycle.getBillBelong();
Integer batchNumber = TeamBillCycleUtils.extractBatch(billBelong);
List<TeamMemberTarget> teamMemberTargets;
if (batchNumber != null && batchNumber == 2) {
teamMemberTargets = teamMemberTargetService.listByMonthlyBillBelong(
teamBillCycle.getTeamId(),
TeamBillCycleUtils.extractMonth(billBelong)
);
} else {
// 上半月结算:直接查询当前批次数据
teamMemberTargets = teamMemberTargetService.listByBillBelong(
teamBillCycle.getTeamId(),
billBelong
);
}
return teamMemberTargets;
}
private int countWorkMembers(List<TeamMemberTarget> teamMemberTargets) {
return CollectionUtils.isNotEmpty(teamMemberTargets) ? teamMemberTargets.size() : 0;
}
private BigDecimal sumMemberSalary(List<TeamBillMemberTarget> teamBillMemberTargets) {
return teamBillMemberTargets.stream().map(TeamBillMemberTarget::getMemberSalary)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(2, RoundingMode.DOWN);
}
private BigDecimal ownSalary(List<TeamBillMemberTarget> teamBillMemberTargets) {
return teamBillMemberTargets.stream().map(TeamBillMemberTarget::getOwnSalary)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(2, RoundingMode.DOWN);
}
private BigDecimal ownTotalSalary(List<TeamBillMemberTarget> teamBillMemberTargets) {
return teamBillMemberTargets.stream().map(TeamBillMemberTarget::getTotalSalary)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(2, RoundingMode.DOWN);
}
@Test
public void weeklyRewardsSent() {
weeklyRewardsSentManager.sendLastWeekStarV1(SysOriginPlatformEnum.LIKEI);
}
@Test
public void weeklyKingQueenSent() {
weeklyRewardsSentManager.sendLastWeekKingQueen(SysOriginPlatformEnum.LIKEI);
}
}