根据memberGroupId和effectiveEndTime统计不同分类下的已过期人数和未过期人数,会费,注意:effectiveEndTime可能为空,为空则记为待缴纳人数
1.创建一个用于存储统计结果的类
package com.qhjk.gyzx.module.member.controller.admin.free.vo;import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;import java.math.BigDecimal;/*** @ClassName MemberFreeTypeDetailVO* @Description TODD* @Author luwei* @Date 2024/4/24 10:10**/
@Schema(description = "管理后台 - 缴费批次价目明细数据 Req VO")
@Data
public class MemberFreeTypeDetailVO {/*** 缴费批次名称*/@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13233456")private Long id;/*** 缴费批次名称*/@Schema(description = "会员二级类型id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13233456")private Long memberGroupId;/*** 有效状态0-启用,1-停用*/@Schema(description = "有效状态0-启用,1-停用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")private Integer status;/*** 缴费批次名称*/@Schema(description = "会员二级类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "个人会员")private String groupName;@Schema(description = "已缴费人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")private Integer finshPayNum;@Schema(description = "待缴费人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")private Integer waitPayNum;@Schema(description = "票价金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000")private BigDecimal memberFree;private BigDecimal totalFee;}
2.创建一个方法来处理统计逻辑
public List<MemberFreeTypeDetailVO> calculateStatistics(List<MemberUserInfofeeReqlVO> memberInfos) {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 请替换为实际日期格式MathContext mc = new MathContext(4); // 例子中精度设置为4,根据实际情况调整return memberInfos.stream().collect(Collectors.groupingBy(MemberUserInfofeeReqlVO::getMemberGroupId)).entrySet().stream().map(entry -> {Long memberGroupId = entry.getKey();List<MemberUserInfofeeReqlVO> groupMembers = entry.getValue();int expiredCount = 0;int unexpiredOrPendingCount = 0;BigDecimal totalFee = BigDecimal.ZERO; // 初始化总费用为零String groupName = groupMembers.stream().findFirst().map(MemberUserInfofeeReqlVO::getGroupName).orElse(null);BigDecimal memberFee = groupMembers.stream().findFirst().map(MemberUserInfofeeReqlVO::getMemberFree).orElse(null);Long id = groupMembers.stream().findFirst().map(MemberUserInfofeeReqlVO::getMemberId).orElse(null);Integer status = groupMembers.stream().findFirst().map(MemberUserInfofeeReqlVO::getStatus).orElse(null);for (MemberUserInfofeeReqlVO member : groupMembers) {LocalDate effectiveEndTime = member.getEffectiveEndTime() != null ?LocalDate.parse(member.getEffectiveEndTime(), formatter) : null;if (effectiveEndTime != null && effectiveEndTime.isAfter(LocalDate.now()) && member.getPayStatus()==1) {expiredCount++;} else {unexpiredOrPendingCount++;}totalFee = totalFee.add(member.getMemberFree(), mc); // 使用add方法累加,并控制精度}return new MemberFreeTypeDetailVO().setWaitPayNum(unexpiredOrPendingCount).setMemberGroupId(memberGroupId).setFinshPayNum(expiredCount).setGroupName(groupName).setTotalFee(totalFee).setMemberFree(memberFee).setId(id).setStatus(status);}).collect(Collectors.toList());}
package com.qhjk.gyzx.module.member.controller.admin.free.vo;import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.apache.poi.hpsf.Decimal;import java.math.BigDecimal;
import java.time.LocalDate;/*** @ClassName MemberFreeTypeDetailVO* @Description TODD* @Author luwei* @Date 2024/4/24 10:10**/
@Schema(description = "管理后台 - 缴费批次价目明细数据 Req VO")
@Data
public class MemberUserInfofeeReqlVO {@Schema(description = "id")private Long memberId;@Schema(description = "子分类")private Long memberGroupId;private Integer status;private Integer payStatus;@Schema(description = "到期时间")private String effectiveEndTime;@Schema(description = "会费名称")private String groupName;@Schema(description = "会费")private BigDecimal memberFree;
}
首先根据memberGroupId对会员信息进行分组,然后遍历每个分组,计算已过期、未过期的人数和会费总额。最后,将统计结果转换为GroupStatistics对象并返回列表。
请注意,如果effectiveEndTime是日期时间类型而不是字符串,你需要相应地调整日期解析部分。