电商网站建设与运营实训,淇县住房和城乡建设局网站,建筑设计作品集,濮阳市平台公司根据memberGroupId和effectiveEndTime统计不同分类下的已过期人数和未过期人数#xff0c;会费#xff0c;注意#xff1a;effectiveEndTime可能为空#xff0c;为空则记为待缴纳人数
1.创建一个用于存储统计结果的类
package com.qhjk.gyzx.module.member.controller.ad…根据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 ListMemberFreeTypeDetailVO calculateStatistics(ListMemberUserInfofeeReqlVO 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();ListMemberUserInfofeeReqlVO 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是日期时间类型而不是字符串你需要相应地调整日期解析部分。