|
|
|
@@ -20,6 +20,7 @@ import com.accompany.common.constant.Constant;
|
|
|
|
|
import com.accompany.common.result.BusiResult;
|
|
|
|
|
import com.accompany.common.status.BusiStatus;
|
|
|
|
|
import com.accompany.common.utils.DateTimeUtil;
|
|
|
|
|
import com.accompany.common.utils.StringUtils;
|
|
|
|
|
import com.accompany.core.enumeration.BillObjTypeEnum;
|
|
|
|
|
import com.accompany.core.enumeration.PartitionEnum;
|
|
|
|
|
import com.accompany.core.exception.ServiceException;
|
|
|
|
@@ -29,6 +30,7 @@ import com.accompany.payment.service.ChargeRecordService;
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
@@ -95,6 +97,16 @@ public class GuildPolicy2Service {
|
|
|
|
|
return cycleBeginDate.equals(curCycleBeginDate) || cycleBeginDate.compareTo(MIN_CYCLE_DATE) < 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@NotNull
|
|
|
|
|
private static BigDecimal getIssiueSalary(ChargeRecord chargeRecord) {
|
|
|
|
|
if (chargeRecord == null) {
|
|
|
|
|
return BigDecimal.ZERO;
|
|
|
|
|
}
|
|
|
|
|
return BigDecimal.valueOf(chargeRecord.getAmount() != null ? chargeRecord.getAmount() : 0D)
|
|
|
|
|
.divide(BigDecimal.valueOf(100))
|
|
|
|
|
.multiply(ISSUE_SALARY_RATE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public BusiResult<GuildPolicy2MyVo> getGuildPolicy2(Long uid, String cycleBeginDate) {
|
|
|
|
|
GuildPolicy2MyVo guildPolicy2MyVo = new GuildPolicy2MyVo();
|
|
|
|
|
guildPolicy2MyVo.setCycleDate(cycleBeginDate);
|
|
|
|
@@ -105,29 +117,69 @@ public class GuildPolicy2Service {
|
|
|
|
|
Long guildMemberId = guildMember.getId();
|
|
|
|
|
|
|
|
|
|
String curCycleBeginDate = FullMonthCycleTimeUtil.getCycleDate(DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId()));
|
|
|
|
|
guildPolicy2MyVo.setCurCycleDate(curCycleBeginDate);
|
|
|
|
|
|
|
|
|
|
List<GuildPolicy2PersonalVo> myMicData = guildMicStatisticsPolicy2Service.listPersonalMicData(cycleBeginDate, guildMemberId);
|
|
|
|
|
|
|
|
|
|
if (isCurrentOrPastCycle(cycleBeginDate, curCycleBeginDate)) {// 当前周期
|
|
|
|
|
guildPolicy2MyVo.setDiamondNum(guildDiamondStatisticsPolicy2Service.getTotalDiamondInCycleMember(cycleBeginDate, guildMemberId));
|
|
|
|
|
List<GuildPolicy2PersonalVo> myDiamondData = guildDiamondStatisticsPolicy2Service.listPersonalDiamondData(cycleBeginDate, guildMemberId);
|
|
|
|
|
List<GuildPolicy2PersonalVo> myData = this.mergeMyDataLists(myDiamondData, myMicData);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(myData)) {
|
|
|
|
|
guildPolicy2MyVo.setMicDay(myData.stream().collect(Collectors.summingInt(GuildPolicy2PersonalVo::getMicDay)));
|
|
|
|
|
}
|
|
|
|
|
//填满整月天数
|
|
|
|
|
this.fillAllDayOfMonth(guildPolicy2MyVo, myData, cycleBeginDate, partitionEnum);
|
|
|
|
|
|
|
|
|
|
TreeMap<BigDecimal, GuildDiamondWagePolicy2> diamondWageMap = guildDiamondWagePolicy2Service.getDiamondWageMap(partitionEnum.getId());
|
|
|
|
|
GuildPolicy2SalaryVo salaryVo = guildDiamondWagePolicy2Service.getSalaryVo(diamondWageMap, guildPolicy2MyVo.getDiamondNum(), guildPolicy2MyVo.getMicDay());
|
|
|
|
|
guildPolicy2MyVo.setMySalary(salaryVo);
|
|
|
|
|
} else {
|
|
|
|
|
//to-do
|
|
|
|
|
GuildDiamondStatisticsPolicy2Settle settleMap = guildDiamondStatisticsPolicy2SettleService
|
|
|
|
|
.groupByMemberStatDate(cycleBeginDate, partitionEnum.getId(), guildMemberId);
|
|
|
|
|
if (settleMap == null || !settleMap.getGuildMemberId().equals(guildMemberId)) {//历史周期是否有结算,或者不在当前公会
|
|
|
|
|
return BusiResult.success(guildPolicy2MyVo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
guildPolicy2MyVo.setDiamondNum(settleMap.getDiamondNum());
|
|
|
|
|
guildPolicy2MyVo.setMySalary(GuildPolicy2SalaryVo.builder()
|
|
|
|
|
.diamondNum(settleMap.getDiamondNum())
|
|
|
|
|
.micSalary(settleMap.getAnchorMicSalary())
|
|
|
|
|
.ownerSalary(settleMap.getOwnerSalary())
|
|
|
|
|
.build());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.fillPersonDetailData(cycleBeginDate, guildMemberId, myMicData, guildPolicy2MyVo, partitionEnum);
|
|
|
|
|
return BusiResult.success(guildPolicy2MyVo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void fillPersonDetailData(String cycleBeginDate, Long guildMemberId, List<GuildPolicy2PersonalVo> myMicData, GuildPolicy2MyVo guildPolicy2MyVo, PartitionEnum partitionEnum) {
|
|
|
|
|
List<GuildPolicy2PersonalVo> myDiamondData = guildDiamondStatisticsPolicy2Service.listPersonalDiamondData(cycleBeginDate, guildMemberId);
|
|
|
|
|
List<GuildPolicy2PersonalVo> myData = this.mergeMyDataLists(myDiamondData, myMicData);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(myData)) {
|
|
|
|
|
guildPolicy2MyVo.setMicDay(myData.stream().collect(Collectors.summingInt(GuildPolicy2PersonalVo::getMicDay)));
|
|
|
|
|
}
|
|
|
|
|
//填满整月天数
|
|
|
|
|
List<GuildPolicy2PersonalVo> resultMyDate = new ArrayList<>();
|
|
|
|
|
ZonedDateTime nowZoneDateTime = DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId());
|
|
|
|
|
Map<String, GuildPolicy2PersonalVo> realMap = new HashMap<>();
|
|
|
|
|
if (CollectionUtils.isNotEmpty(myData)) {
|
|
|
|
|
myData.forEach(item -> realMap.put(item.getStatDate(), item));
|
|
|
|
|
}
|
|
|
|
|
Date monthBegin = DateUtil.parseDate(cycleBeginDate);
|
|
|
|
|
Date now = DateUtil.parseDate(nowZoneDateTime.format(DateTimeUtil.dateFormatter));
|
|
|
|
|
Date monthEnd = DateUtil.beginOfDay(DateUtil.endOfMonth(monthBegin));
|
|
|
|
|
if (monthEnd.after(now)) {
|
|
|
|
|
monthEnd = now;
|
|
|
|
|
}
|
|
|
|
|
while (monthEnd.after(monthBegin) || monthEnd.equals(monthBegin)){
|
|
|
|
|
String date = DateUtil.formatDate(monthEnd);
|
|
|
|
|
GuildPolicy2PersonalVo guildPolicy2PersonalVo = realMap.getOrDefault(date, GuildPolicy2PersonalVo.builder()
|
|
|
|
|
.statDate(date)
|
|
|
|
|
.cycleDate(cycleBeginDate)
|
|
|
|
|
.diamondNum(BigDecimal.ZERO)
|
|
|
|
|
.micMinute(0)
|
|
|
|
|
.validMicDay(false)
|
|
|
|
|
.build());
|
|
|
|
|
resultMyDate.add(guildPolicy2PersonalVo);
|
|
|
|
|
monthEnd = DateUtil.offsetDay(monthEnd, -1);
|
|
|
|
|
}
|
|
|
|
|
guildPolicy2MyVo.setMyData(resultMyDate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//合并流水与在麦天数数据
|
|
|
|
|
private List<GuildPolicy2PersonalVo> mergeMyDataLists(List<GuildPolicy2PersonalVo> list1, List<GuildPolicy2PersonalVo> list2) {
|
|
|
|
|
// 处理空列表情况
|
|
|
|
@@ -154,34 +206,6 @@ public class GuildPolicy2Service {
|
|
|
|
|
return new ArrayList<>(mergedMap.values());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void fillAllDayOfMonth(GuildPolicy2MyVo guildPolicy2MyVo, List<GuildPolicy2PersonalVo> myData, String cycleBeginDate, PartitionEnum partitionEnum) {
|
|
|
|
|
List<GuildPolicy2PersonalVo> resultMyDate = new ArrayList<>();
|
|
|
|
|
ZonedDateTime nowZoneDateTime = DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId());
|
|
|
|
|
Map<String, GuildPolicy2PersonalVo> realMap = new HashMap<>();
|
|
|
|
|
if (CollectionUtils.isNotEmpty(myData)) {
|
|
|
|
|
myData.forEach(item -> realMap.put(item.getStatDate(), item));
|
|
|
|
|
}
|
|
|
|
|
Date monthBegin = DateUtil.parseDate(cycleBeginDate);
|
|
|
|
|
Date now = DateUtil.parseDate(nowZoneDateTime.format(DateTimeUtil.dateFormatter));
|
|
|
|
|
Date monthEnd = DateUtil.beginOfDay(DateUtil.endOfMonth(monthBegin));
|
|
|
|
|
if (monthEnd.after(now)) {
|
|
|
|
|
monthEnd = now;
|
|
|
|
|
}
|
|
|
|
|
while (monthEnd.after(monthBegin) || monthEnd.equals(monthBegin)){
|
|
|
|
|
String date = DateUtil.formatDate(monthEnd);
|
|
|
|
|
GuildPolicy2PersonalVo guildPolicy2PersonalVo = realMap.getOrDefault(date, GuildPolicy2PersonalVo.builder()
|
|
|
|
|
.statDate(date)
|
|
|
|
|
.cycleDate(cycleBeginDate)
|
|
|
|
|
.diamondNum(BigDecimal.ZERO)
|
|
|
|
|
.micMinute(0)
|
|
|
|
|
.validMicDay(false)
|
|
|
|
|
.build());
|
|
|
|
|
resultMyDate.add(guildPolicy2PersonalVo);
|
|
|
|
|
monthEnd = DateUtil.offsetDay(monthEnd, -1);
|
|
|
|
|
}
|
|
|
|
|
guildPolicy2MyVo.setMyData(resultMyDate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public BusiResult<GuildPolicy2AgencyVo> getGuildMemberPolicy2(Long uid, String cycleBeginDate) {
|
|
|
|
|
GuildPolicy2AgencyVo guildPolicy2AgencyVo = new GuildPolicy2AgencyVo();
|
|
|
|
|
guildPolicy2AgencyVo.setCycleDate(cycleBeginDate);
|
|
|
|
@@ -207,14 +231,10 @@ public class GuildPolicy2Service {
|
|
|
|
|
|
|
|
|
|
List<Long> uids = memberData.stream().map(GuildPolicy2MemberVo::getUid).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
Date cycleBegin = DateUtil.parseDate(cycleBeginDate);
|
|
|
|
|
Date cycleBegin = DateUtil.beginOfDay(DateUtil.parseDate(cycleBeginDate));
|
|
|
|
|
Date cycleEnd = DateUtil.endOfMonth(cycleBegin);
|
|
|
|
|
ZonedDateTime cycleBeginDateZoneDate = DateTimeUtil.convertWithZoneId(cycleBegin, partitionEnum.getZoneId());
|
|
|
|
|
ZonedDateTime zoneBeginTime = cycleBeginDateZoneDate.withHour(0).withMinute(0).withSecond(0).withNano(0);
|
|
|
|
|
ZonedDateTime cycleEndDateZoneDate = DateTimeUtil.convertWithZoneId(cycleEnd, partitionEnum.getZoneId());
|
|
|
|
|
ZonedDateTime zoneEndTime = cycleEndDateZoneDate.withHour(23).withMinute(59).withSecond(59).withNano(999_999_999);
|
|
|
|
|
Date beginOfMonth = DateTimeUtil.convertToEastEightZone(zoneBeginTime);
|
|
|
|
|
Date endOfMonth = DateTimeUtil.convertToEastEightZone(zoneEndTime);
|
|
|
|
|
Date beginOfMonth = DateTimeUtil.convertToEastEightZone(cycleBegin, partitionEnum.getZoneId());
|
|
|
|
|
Date endOfMonth = DateTimeUtil.convertToEastEightZone(cycleEnd, partitionEnum.getZoneId());
|
|
|
|
|
|
|
|
|
|
Map<Long, ChargeRecord> refundGroupUidDateMap = chargeRecordService.getRefundGroupUidDateMap(uids, beginOfMonth, endOfMonth);
|
|
|
|
|
|
|
|
|
@@ -224,12 +244,7 @@ public class GuildPolicy2Service {
|
|
|
|
|
item.setMicSalary(item.getMicSalary().add(diamondWageVo.getAnchorMicSalary()));
|
|
|
|
|
item.setOwnerSalary(item.getOwnerSalary().add(diamondWageVo.getOwnerSalary()));
|
|
|
|
|
ChargeRecord chargeRecord = refundGroupUidDateMap.get(item.getUid());
|
|
|
|
|
if (chargeRecord != null) {
|
|
|
|
|
BigDecimal refundAmount = BigDecimal.valueOf(chargeRecord.getAmount() != null ? chargeRecord.getAmount() : 0D)
|
|
|
|
|
.divide(BigDecimal.valueOf(100))
|
|
|
|
|
.multiply(ISSUE_SALARY_RATE);
|
|
|
|
|
item.setIssueSalary(refundAmount);
|
|
|
|
|
}
|
|
|
|
|
item.setIssueSalary(this.getIssiueSalary(chargeRecord));
|
|
|
|
|
});
|
|
|
|
|
GuildPolicy2SalaryVo salaryVo = new GuildPolicy2SalaryVo();
|
|
|
|
|
salaryVo.setDiamondSalary(memberData.stream().map(GuildPolicy2MemberVo::getDiamondSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
|
@@ -238,7 +253,39 @@ public class GuildPolicy2Service {
|
|
|
|
|
salaryVo.setIssueSalary(memberData.stream().map(GuildPolicy2MemberVo::getIssueSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
|
|
guildPolicy2AgencyVo.setGuildSalary(salaryVo);
|
|
|
|
|
} else {
|
|
|
|
|
//to-do
|
|
|
|
|
List<GuildDiamondStatisticsPolicy2Settle> settleList = guildDiamondStatisticsPolicy2SettleService
|
|
|
|
|
.groupByGuildMemberStatDate(cycleBeginDate, partitionEnum.getId(), guildMember.getGuildId());
|
|
|
|
|
if (CollectionUtils.isEmpty(settleList)) {
|
|
|
|
|
return BusiResult.success(guildPolicy2AgencyVo);
|
|
|
|
|
}
|
|
|
|
|
List<GuildPolicy2MemberVo> memberData = guildPolicy2AgencyVo.getMemberData();
|
|
|
|
|
List<Long> uids = settleList.stream().map(GuildDiamondStatisticsPolicy2Settle::getUid).collect(Collectors.toList());
|
|
|
|
|
Map<Long, Users> usersMap = usersService.getUsersMapByUids(uids);
|
|
|
|
|
for (GuildDiamondStatisticsPolicy2Settle policy2Settle : settleList) {
|
|
|
|
|
GuildPolicy2MemberVo memberVo = new GuildPolicy2MemberVo();
|
|
|
|
|
memberVo.setUid(policy2Settle.getUid());
|
|
|
|
|
memberVo.setMicDay(policy2Settle.getMicDay());
|
|
|
|
|
memberVo.setDiamondNum(policy2Settle.getDiamondNum());
|
|
|
|
|
memberVo.setDiamondSalary(policy2Settle.getAnchorSalary());
|
|
|
|
|
memberVo.setMicSalary(policy2Settle.getAnchorMicSalary());
|
|
|
|
|
memberVo.setOwnerSalary(policy2Settle.getOwnerSalary());
|
|
|
|
|
memberVo.setIssueSalary(policy2Settle.getIssueSalary());
|
|
|
|
|
Users users = usersMap.get(memberVo.getUid());
|
|
|
|
|
if (null != users) {
|
|
|
|
|
memberVo.setNick(users.getNick());
|
|
|
|
|
memberVo.setErbanNo(users.getErbanNo());
|
|
|
|
|
memberVo.setAvatar(users.getAvatar());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memberData.add(memberVo);
|
|
|
|
|
}
|
|
|
|
|
GuildPolicy2SalaryVo salaryVo = new GuildPolicy2SalaryVo();
|
|
|
|
|
salaryVo.setDiamondSalary(memberData.stream().map(GuildPolicy2MemberVo::getDiamondSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
|
|
salaryVo.setMicSalary(memberData.stream().map(GuildPolicy2MemberVo::getMicSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
|
|
salaryVo.setOwnerSalary(memberData.stream().map(GuildPolicy2MemberVo::getOwnerSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
|
|
salaryVo.setIssueSalary(memberData.stream().map(GuildPolicy2MemberVo::getIssueSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
|
|
guildPolicy2AgencyVo.setDiamondNum(memberData.stream().map(GuildPolicy2MemberVo::getDiamondNum).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
|
|
guildPolicy2AgencyVo.setGuildSalary(salaryVo);
|
|
|
|
|
}
|
|
|
|
|
return BusiResult.success(guildPolicy2AgencyVo);
|
|
|
|
|
}
|
|
|
|
@@ -368,7 +415,7 @@ public class GuildPolicy2Service {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void settle(PartitionEnum partitionEnum, String cycleDate) {
|
|
|
|
|
if (!GUILD_POLICY2.equals(partitionEnum.getClanMode())) {
|
|
|
|
|
if (!GUILD_POLICY2.equals(partitionEnum.getClanMode()) || StringUtils.isEmpty(cycleDate)) {
|
|
|
|
|
log.info("GuildPolicy2Service.settle partitionEnum:{}, clanMode:{} cycleDate:{}", partitionEnum, partitionEnum.getClanMode(), cycleDate);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@@ -378,6 +425,14 @@ public class GuildPolicy2Service {
|
|
|
|
|
log.info("Policy2Settle.emptyData");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date cycleBegin = DateUtil.beginOfDay(DateUtil.parseDate(cycleDate));
|
|
|
|
|
Date cycleEnd = DateUtil.endOfMonth(cycleBegin);
|
|
|
|
|
Date beginOfMonth = DateTimeUtil.convertToEastEightZone(cycleBegin, partitionEnum.getZoneId());
|
|
|
|
|
Date endOfMonth = DateTimeUtil.convertToEastEightZone(cycleEnd, partitionEnum.getZoneId());
|
|
|
|
|
List<Long> uids = list.stream().map(GuildDiamondStatisticsPolicy2Settle::getUid).collect(Collectors.toList());
|
|
|
|
|
Map<Long, ChargeRecord> refundGroupUidDateMap = chargeRecordService.getRefundGroupUidDateMap(uids, beginOfMonth, endOfMonth);
|
|
|
|
|
|
|
|
|
|
Date date = new Date();
|
|
|
|
|
TreeMap<BigDecimal, GuildDiamondWagePolicy2> diamondWageMap = guildDiamondWagePolicy2Service.getDiamondWageMap(partitionId);
|
|
|
|
|
for (GuildDiamondStatisticsPolicy2Settle settle : list) {
|
|
|
|
@@ -391,6 +446,8 @@ public class GuildPolicy2Service {
|
|
|
|
|
settle.setAnchorSalary(diamondWagePolicy2.getAnchorDiamondSalary());
|
|
|
|
|
settle.setOwnerSalary(diamondWagePolicy2.getOwnerSalary());
|
|
|
|
|
settle.setAnchorMicSalary(diamondWagePolicy2.getAnchorMicSalary());
|
|
|
|
|
ChargeRecord chargeRecord = refundGroupUidDateMap.get(settle.getUid());
|
|
|
|
|
settle.setIssueSalary(this.getIssiueSalary(chargeRecord));
|
|
|
|
|
}
|
|
|
|
|
guildDiamondStatisticsPolicy2SettleService.saveBatch(list);
|
|
|
|
|
}
|
|
|
|
|