fix: use bill policy for salary catch-up

This commit is contained in:
ZuoZuo 2026-05-01 20:26:08 +08:00
parent e8975dca9d
commit 17e4cd69bb
3 changed files with 94 additions and 62 deletions

View File

@ -18,6 +18,7 @@ import com.red.circle.mq.business.model.event.team.TeamSalaryPaymentEvent;
import com.red.circle.mq.rocket.business.streams.TeamSalaryPaymentSink; import com.red.circle.mq.rocket.business.streams.TeamSalaryPaymentSink;
import com.red.circle.other.infra.common.props.PropsSendCommon; import com.red.circle.other.infra.common.props.PropsSendCommon;
import com.red.circle.other.infra.database.mongo.dto.team.TeamBillMemberTarget; 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.dto.team.TeamPolicy; import com.red.circle.other.infra.database.mongo.dto.team.TeamPolicy;
import com.red.circle.other.infra.database.mongo.dto.team.TeamSalaryPaymentDetails; import com.red.circle.other.infra.database.mongo.dto.team.TeamSalaryPaymentDetails;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamBillCycle; import com.red.circle.other.infra.database.mongo.entity.team.team.TeamBillCycle;
@ -150,9 +151,9 @@ public class TeamSalaryPaymentListener implements MessageListener {
return; return;
} }
Map<String, TeamPolicyManager> regionPolicyMap = teamPolicyManagerService.mapRegionReleaseWithCountry(Set.of(teamProfile.getRegion())); Map<String, TeamPolicyManager> regionPolicyMap = getPaymentPolicyMap(teamProfile, billCycle, event);
if (MapUtil.isEmpty(regionPolicyMap)) { if (MapUtil.isEmpty(regionPolicyMap)) {
// [满足政策的团队工资实时发送]该团队没有区域政策 // [满足政策的团队工资实时发送]该团队没有区域政策或账单政策
return; return;
} }
@ -228,11 +229,11 @@ public class TeamSalaryPaymentListener implements MessageListener {
log.warn("发送团队成员美元工资:{}\n{}\n{}\n{}\n{}\n{}", teamProfile, memberTarget, region, policy, payment, billCycle); log.warn("发送团队成员美元工资:{}\n{}\n{}\n{}\n{}\n{}", teamProfile, memberTarget, region, policy, payment, billCycle);
// 发送团队成员工资 // 发送团队成员工资
memberBankBalancePayment(teamProfile, memberTarget.getId(), tmpBillMemberTarget, memberBankBalancePayment(teamProfile, memberTarget.getId(), tmpBillMemberTarget,
region.getMetadata(), policy, payment); region.getMetadata(), policy, payment, billCycle.getId());
// 发送团队拥有者(代理)工资 // 发送团队拥有者(代理)工资
teamBankBalancePayment(teamProfile, memberTarget.getId(), tmpBillMemberTarget, teamBankBalancePayment(teamProfile, memberTarget.getId(), tmpBillMemberTarget,
region.getMetadata(), policy, payment); region.getMetadata(), policy, payment, billCycle.getId());
} else { } else {
// 辅助:组装钻石工资辅助模型 // 辅助:组装钻石工资辅助模型
tmpBillMemberTarget = buildDiamondTmpBillMemberTarget(policy, billTarget); tmpBillMemberTarget = buildDiamondTmpBillMemberTarget(policy, billTarget);
@ -487,18 +488,37 @@ public class TeamSalaryPaymentListener implements MessageListener {
if (Boolean.TRUE.equals(event.getThisMonthFirstDay())) { if (Boolean.TRUE.equals(event.getThisMonthFirstDay())) {
// 如果为1号则自动结算一次上个月工资 // 如果为1号则自动结算一次上个月工资
return teamBillCycleService.getTeamBill(teamProfile.getId(), event.getLastMonth()); TeamBillCycle legacyMonthBill = teamBillCycleService.getTeamBill(teamProfile.getId(), event.getLastMonth());
if (Objects.nonNull(legacyMonthBill)) {
return legacyMonthBill;
}
return teamBillCycleService.getLatestTeamBillByMonth(teamProfile.getId(), event.getLastMonth());
} }
// 结算本月工资 // 结算本月工资
return teamBillCycleService.getLatestByTeamId(teamProfile.getId()); return teamBillCycleService.getLatestByTeamId(teamProfile.getId());
} }
/**
* 获得本次发放使用的政策.
*/
private Map<String, TeamPolicyManager> getPaymentPolicyMap(TeamProfile teamProfile,
TeamBillCycle billCycle, TeamSalaryPaymentEvent event) {
if (Boolean.TRUE.equals(event.getThisMonthFirstDay())) {
return Optional.ofNullable(billCycle.getSettleResult())
.map(TeamBillSettleResult::getPolicy)
.orElseGet(CollectionUtils::newHashMap);
}
return teamPolicyManagerService.mapRegionReleaseWithCountry(Set.of(teamProfile.getRegion()));
}
/** /**
* 发送团队拥有者工资到银行账户 * 发送团队拥有者工资到银行账户
*/ */
private void teamBankBalancePayment(TeamProfile teamProfile, String memberTargetId, private void teamBankBalancePayment(TeamProfile teamProfile, String memberTargetId,
TeamBillMemberTarget target, Map<String, String> metadata, TeamPolicy policy, TeamBillMemberTarget target, Map<String, String> metadata, TeamPolicy policy,
TeamSalaryPayment payment) { TeamSalaryPayment payment, Long teamBillId) {
// 是否已经发送过代理部份工资 // 是否已经发送过代理部份工资
if (Boolean.FALSE.equals( if (Boolean.FALSE.equals(
@ -526,7 +546,7 @@ public class TeamSalaryPaymentListener implements MessageListener {
.setTeamId(teamProfile.getId()) .setTeamId(teamProfile.getId())
.setTeamOwnId(teamProfile.getOwnUserId()) .setTeamOwnId(teamProfile.getOwnUserId())
.setTeamMemberId(target.getUserId()) .setTeamMemberId(target.getUserId())
.setTeamBillId(getBillIdByTeamId(teamProfile)) .setTeamBillId(teamBillId)
.setTeamRegionId(teamProfile.getRegion()) .setTeamRegionId(teamProfile.getRegion())
.setRemarks(Lists.newArrayList(new TeamSalaryPaymentRemark() .setRemarks(Lists.newArrayList(new TeamSalaryPaymentRemark()
.setRemark("将代理工资放入代理钱包") .setRemark("将代理工资放入代理钱包")
@ -575,7 +595,7 @@ public class TeamSalaryPaymentListener implements MessageListener {
.setMemberTargetId(memberTargetId) .setMemberTargetId(memberTargetId)
.setTeamOwnId(teamProfile.getOwnUserId()) .setTeamOwnId(teamProfile.getOwnUserId())
.setTeamMemberId(target.getUserId()) .setTeamMemberId(target.getUserId())
.setTeamBillId(getBillIdByTeamId(teamProfile)) .setTeamBillId(teamBillId)
.setTeamRegionId(teamProfile.getRegion()) .setTeamRegionId(teamProfile.getRegion())
.setRemarks(Lists.newArrayList(new TeamSalaryPaymentRemark() .setRemarks(Lists.newArrayList(new TeamSalaryPaymentRemark()
.setRemark("本次主播工资已转入代理钱包") .setRemark("本次主播工资已转入代理钱包")
@ -603,7 +623,7 @@ public class TeamSalaryPaymentListener implements MessageListener {
*/ */
private void memberBankBalancePayment(TeamProfile teamProfile, String memberTargetId, private void memberBankBalancePayment(TeamProfile teamProfile, String memberTargetId,
TeamBillMemberTarget target, Map<String, String> metadata, TeamPolicy policy, TeamBillMemberTarget target, Map<String, String> metadata, TeamPolicy policy,
TeamSalaryPayment payment) { TeamSalaryPayment payment, Long teamBillId) {
// 是否已经发送过该成员工资 // 是否已经发送过该成员工资
if (Boolean.TRUE.equals( if (Boolean.TRUE.equals(
@ -635,7 +655,7 @@ public class TeamSalaryPaymentListener implements MessageListener {
.setMemberTargetId(memberTargetId) .setMemberTargetId(memberTargetId)
.setTeamOwnId(teamProfile.getOwnUserId()) .setTeamOwnId(teamProfile.getOwnUserId())
.setTeamMemberId(target.getUserId()) .setTeamMemberId(target.getUserId())
.setTeamBillId(getBillIdByTeamId(teamProfile)) .setTeamBillId(teamBillId)
.setTeamRegionId(teamProfile.getRegion()) .setTeamRegionId(teamProfile.getRegion())
.setRemarks(Lists.newArrayList(new TeamSalaryPaymentRemark() .setRemarks(Lists.newArrayList(new TeamSalaryPaymentRemark()
.setRemark("将主播工资发放至主播钱包") .setRemark("将主播工资发放至主播钱包")
@ -726,13 +746,6 @@ public class TeamSalaryPaymentListener implements MessageListener {
// policy.getLevel(), isPayMember); // policy.getLevel(), isPayMember);
} }
/**
* 获得账单ID.
*/
private Long getBillIdByTeamId(TeamProfile teamProfile) {
return teamBillCycleService.getLatestBillIdByTeamId(teamProfile.getId());
}
/** /**
* 基于当前等级获得上一个等级政策. * 基于当前等级获得上一个等级政策.
* *

View File

@ -87,6 +87,11 @@ public interface TeamBillCycleService {
*/ */
TeamBillCycle getTeamBill(Long teamId, Integer billBelong); TeamBillCycle getTeamBill(Long teamId, Integer billBelong);
/**
* 获取团队指定月份最新账单兼容 yyyyMM yyyyMM01/yyyyMM16 账期.
*/
TeamBillCycle getLatestTeamBillByMonth(Long teamId, Integer yearMonth);
/** /**
* 查询账单. * 查询账单.
*/ */

View File

@ -427,6 +427,20 @@ public class TeamBillCycleServiceImpl implements TeamBillCycleService {
TeamBillCycle.class); TeamBillCycle.class);
} }
@Override
public TeamBillCycle getLatestTeamBillByMonth(Long teamId, Integer yearMonth) {
if (Objects.isNull(teamId) || Objects.isNull(yearMonth)) {
return null;
}
Integer normalizedYearMonth = yearMonth > 999999
? Integer.valueOf(yearMonth.toString().substring(0, 6))
: yearMonth;
return mongoTemplate.findOne(
Query.query(getBillBelongCriteria(normalizedYearMonth).and("teamId").is(teamId))
.with(Sort.by(Sort.Order.desc("billBelong"), Sort.Order.desc("id"))),
TeamBillCycle.class);
}
@Override @Override
public List<TeamBillCycle> list(TeamBillCycleBackQryCmd query) { public List<TeamBillCycle> list(TeamBillCycleBackQryCmd query) {
Criteria criteria = new Criteria(); Criteria criteria = new Criteria();