diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/utils/DateTimeUtil.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/utils/DateTimeUtil.java index a7c01c398..38756863c 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/common/utils/DateTimeUtil.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/utils/DateTimeUtil.java @@ -1148,9 +1148,10 @@ public class DateTimeUtil { return Date.from(eastEightZonedDateTime.toInstant()); } - public static Date convertToEastEightZone(ZonedDateTime originalDate) { + public static Date convertToEastEightZone(Date date, String originalZoneId) { + ZonedDateTime cycleBeginDateZoneDate = DateTimeUtil.convertWithZoneId(date, originalZoneId); // 2. 转换为东八区时间 - ZonedDateTime eastEightZonedDateTime = originalDate + ZonedDateTime eastEightZonedDateTime = cycleBeginDateZoneDate .withZoneSameInstant(ZoneId.of("Asia/Shanghai")); // 3. 返回Date对象 diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildDiamondStatisticsPolicy2Settle.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildDiamondStatisticsPolicy2Settle.java index 4f536d65e..7c16c81b8 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildDiamondStatisticsPolicy2Settle.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildDiamondStatisticsPolicy2Settle.java @@ -53,6 +53,10 @@ public class GuildDiamondStatisticsPolicy2Settle implements Serializable { * 公会长薪资 */ private BigDecimal ownerSalary; + /** + * 问题薪资 + */ + private BigDecimal issueSalary; /** * 创建时间 */ diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildpolicy/GuildPolicy2MyVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildpolicy/GuildPolicy2MyVo.java index eccfa26da..3be008c12 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildpolicy/GuildPolicy2MyVo.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildpolicy/GuildPolicy2MyVo.java @@ -13,6 +13,8 @@ import java.util.List; public class GuildPolicy2MyVo { @ApiModelProperty("周期开始日期yyyy-MM-dd") private String cycleDate; + @ApiModelProperty("当前") + private String curCycleDate; @ApiModelProperty("钻石数量") private BigDecimal diamondNum = BigDecimal.ZERO; diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildpolicy/GuildPolicy2SalaryVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildpolicy/GuildPolicy2SalaryVo.java index 0a4f47bf2..59557fb00 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildpolicy/GuildPolicy2SalaryVo.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildpolicy/GuildPolicy2SalaryVo.java @@ -2,10 +2,16 @@ package com.accompany.business.vo.guildpolicy; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.math.BigDecimal; +@Builder +@NoArgsConstructor +@AllArgsConstructor @ApiModel @Data public class GuildPolicy2SalaryVo { diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildpolicy2/GuildDiamondStatisticsPolicy2SettleMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildpolicy2/GuildDiamondStatisticsPolicy2SettleMapper.java index 3e83a6b72..a23db69b8 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildpolicy2/GuildDiamondStatisticsPolicy2SettleMapper.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildpolicy2/GuildDiamondStatisticsPolicy2SettleMapper.java @@ -24,4 +24,7 @@ public interface GuildDiamondStatisticsPolicy2SettleMapper extends BaseMapper groupByMemberStatDate(@Param("cycleDate") String cycleDate, @Param("partitionId") Integer partitionId, + @Param("guildMemberId") Long guildMemberId, @Param("guildId") Integer guildId); } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildDiamondStatisticsPolicy2SettleService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildDiamondStatisticsPolicy2SettleService.java index a2a7c468a..7e113c1e2 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildDiamondStatisticsPolicy2SettleService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildDiamondStatisticsPolicy2SettleService.java @@ -6,6 +6,7 @@ import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberAdminVo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import java.util.List; @@ -31,4 +32,20 @@ public class GuildDiamondStatisticsPolicy2SettleService extends ServiceImpl page = new Page<>(pageNo, pageSize); return baseMapper.listByStatDate(page, cycleDate, guildId, uid, partitionId); } + + public GuildDiamondStatisticsPolicy2Settle groupByMemberStatDate(String cycleDate, Integer partitionId, + Long guildMemberId) { + List guildDiamondStatisticsPolicy2Settles = + baseMapper.groupByMemberStatDate(cycleDate, partitionId, guildMemberId, null); + if (CollectionUtils.isEmpty(guildDiamondStatisticsPolicy2Settles)) { + return null; + } + return guildDiamondStatisticsPolicy2Settles.get(0); + } + + public List groupByGuildMemberStatDate(String cycleDate, Integer partitionId, + Integer guildId) { + return baseMapper.groupByMemberStatDate(cycleDate, partitionId, null, guildId); + } + } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java index fc812112d..85953c115 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java @@ -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 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 myMicData = guildMicStatisticsPolicy2Service.listPersonalMicData(cycleBeginDate, guildMemberId); if (isCurrentOrPastCycle(cycleBeginDate, curCycleBeginDate)) {// 当前周期 guildPolicy2MyVo.setDiamondNum(guildDiamondStatisticsPolicy2Service.getTotalDiamondInCycleMember(cycleBeginDate, guildMemberId)); - List myDiamondData = guildDiamondStatisticsPolicy2Service.listPersonalDiamondData(cycleBeginDate, guildMemberId); - List 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 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 myMicData, GuildPolicy2MyVo guildPolicy2MyVo, PartitionEnum partitionEnum) { + List myDiamondData = guildDiamondStatisticsPolicy2Service.listPersonalDiamondData(cycleBeginDate, guildMemberId); + List myData = this.mergeMyDataLists(myDiamondData, myMicData); + + if (CollectionUtils.isNotEmpty(myData)) { + guildPolicy2MyVo.setMicDay(myData.stream().collect(Collectors.summingInt(GuildPolicy2PersonalVo::getMicDay))); + } + //填满整月天数 + List resultMyDate = new ArrayList<>(); + ZonedDateTime nowZoneDateTime = DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId()); + Map 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 mergeMyDataLists(List list1, List list2) { // 处理空列表情况 @@ -154,34 +206,6 @@ public class GuildPolicy2Service { return new ArrayList<>(mergedMap.values()); } - private void fillAllDayOfMonth(GuildPolicy2MyVo guildPolicy2MyVo, List myData, String cycleBeginDate, PartitionEnum partitionEnum) { - List resultMyDate = new ArrayList<>(); - ZonedDateTime nowZoneDateTime = DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId()); - Map 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 getGuildMemberPolicy2(Long uid, String cycleBeginDate) { GuildPolicy2AgencyVo guildPolicy2AgencyVo = new GuildPolicy2AgencyVo(); guildPolicy2AgencyVo.setCycleDate(cycleBeginDate); @@ -207,14 +231,10 @@ public class GuildPolicy2Service { List 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 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 settleList = guildDiamondStatisticsPolicy2SettleService + .groupByGuildMemberStatDate(cycleBeginDate, partitionEnum.getId(), guildMember.getGuildId()); + if (CollectionUtils.isEmpty(settleList)) { + return BusiResult.success(guildPolicy2AgencyVo); + } + List memberData = guildPolicy2AgencyVo.getMemberData(); + List uids = settleList.stream().map(GuildDiamondStatisticsPolicy2Settle::getUid).collect(Collectors.toList()); + Map 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 uids = list.stream().map(GuildDiamondStatisticsPolicy2Settle::getUid).collect(Collectors.toList()); + Map refundGroupUidDateMap = chargeRecordService.getRefundGroupUidDateMap(uids, beginOfMonth, endOfMonth); + Date date = new Date(); TreeMap 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); } diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildDiamondStatisticsPolicy2SettleMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildDiamondStatisticsPolicy2SettleMapper.xml index ab4efe1a5..bff5d3107 100644 --- a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildDiamondStatisticsPolicy2SettleMapper.xml +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildDiamondStatisticsPolicy2SettleMapper.xml @@ -59,4 +59,30 @@ group by gm.id ORDER BY diamondNum desc + +