统计不同memberGroupId下已过期和未过期的会员人数以及会费总额

根据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是日期时间类型而不是字符串,你需要相应地调整日期解析部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Inner-IoU

文章目录 AbstractMethodBBox Regression Mode AnalysisInner-IOU Loss paper code Abstract 作者指出IoU损失在理论上有能力精确描述边界框回归状态&#xff0c;但在实践中&#xff0c;它不能自适应地匹配不同的检测器和检测任务&#xff0c;导致泛化能力较弱。 为了解决这个…

在web浏览器中轻松实现动态控制

虽然使用javascript的人很多&#xff0c;但是为了提高开发效率&#xff0c;将库和框架结合起来使用的案例也在增加。其中jquery就是一个流行了很长时间的库。如果只使用标准的javascript来实现&#xff0c;需要编写大量代码才能完成处理&#xff0c;而使用jquery只需要几行代码…

Oracle数据库面试题-7

41. 请解释Oracle数据库中的空间数据处理方法。 Oracle数据库中的空间数据处理 Oracle数据库提供了丰富的空间数据处理功能&#xff0c;包括对二维和三维空间数据的存储、索引、查询和分析。以下是Oracle数据库中空间数据处理的关键特性&#xff1a; 空间数据类型&#xff1a…

防火墙端口定时开放工具v2

自动防火墙端口管理脚本 简介 该脚本用于在指定的时间内自动打开和关闭指定的防火墙端口。它支持 ufw 和 firewalld 两种防火墙工具&#xff0c;并确保脚本在后台运行&#xff0c;即使终端关闭也能继续执行。 #!/bin/bash# 检查参数数量 if [ "$#" -ne 2 ]; thenech…

C++中的if constexpr

目录 摘要 那什么是 if constexpr&#xff1f; 为什么 if constexpr 很重要&#xff1f; 为什么不用普通的 if&#xff1f; 总结 摘要 if constexpr 是 C17 引入的一种条件编译机制&#xff0c;允许在编译时根据条件判断选择性地编译代码。这在模板元编程中尤为重要&…

Linux磁盘分区(fdisk)和卷管理详解(VG-LV-PV)

先看整体图&#xff0c;再讲解概念 一、磁盘分区 一个磁盘disk可以分多个区part&#xff0c;用fdisk命令&#xff0c;举例把/dev/vdb划分为/dev/vdb1和/dev/vdb2 二、创建虚拟卷 LVM是逻辑盘卷管理&#xff08;Logical Volume Manager&#xff09;的简称&#xff0c;他是磁盘…

基于Sentry+OpenTelemetry实现微服务前后端全链路监控

文章目录 前⾔背景技术⽅案Sentry私有化部署部署环境准备 项目集成前端后端agent探针集成sentry sdk集成增强探针为⽇志注⼊TraceID异常处理SDK⾃定义开发sentry sdk⾃定义开发⾃定义SentryEvent注⼊otel追踪信息⾃定义全局异常上报issue事件新增动态过滤功能 Java Agent Exten…

六位一线AI工程师总结大模型应用摸爬滚打一年的心得,网友:全程高能!

六位一线AI工程师和创业者&#xff0c;把在大模型应用开发上摸爬滚打一整年的心得&#xff0c;全&#xff01;分&#xff01;享&#xff01;了&#xff01; &#xff08;奇怪的六一儿童节大礼包出现了&#xff09; 这篇干货长文&#xff0c;一时间成为开发者社区热议的话题。…

紧急通知!Win10将于2025年终止支持,快来升级Win11吧!

近期&#xff0c;微软更新了官方支持页面&#xff0c;我们可以看到微软官方在2025年10月14日之后&#xff0c;不再为 Win10系统提供安全更新或技术支持。到这个时间&#xff0c;Win10用户的电脑仍可正常工作&#xff0c;但建议Win10用户都升级为Win11版本&#xff0c;接下来小编…

东航携手抖音生活服务开启机票首播,推出国内、国际超值机票次卡

在民航暑运旺季到来之际&#xff0c;越来越多的用户选择提前做好旅行规划&#xff0c;囤下高性价比的出游商品。6月6日18点&#xff0c;中国东方航空&#xff08;以下简称“东航”&#xff09;将在抖音开启首次机票直播&#xff0c;推荐多款超值机票次卡及空中Wi-Fi等特色产品&…

Angular17版本集成Quill富文本编辑器

Angular17版本集成Quill富文本编辑器 前言:网上找了好多富文本资源,对应Angular17版本的且兼容的太少了,且找到不到对应的版本 自己就去网上找个兼容的免费的富文本组件 1.兼容Angular17版本的quill包 "types/quill": "^1.3.10","ngx-quill": …

备战618!各广告平台SDK版本更新;最新支持eCPR指标;新增自动创建广告源平台 | TopOn产品更新

「TopPro 每月产品速递」是由TopOn最新推出的产品专栏&#xff0c;将会以月为周期梳理TopOn最新产品动态&#xff0c;致力于为互联网从业者提供优质服务&#xff0c;引领行业产品发展。 TopPro | 3~5月产品速递 2024.03.01-05.30 01 eCPR指标支持 // 功能描述 TopOn后台支…

C语言字符、数组指针变量

目录 一、字符指针变量 二、数组指针变量 a.数组指针变量是什么 b.数组指针变量的书写格式 c.数组指针变量如何初始化 d.二维数组传参的本质 一、字符指针变量 在指针的类型中我们知道有一种指针类型为字符指针 char* 。 其一般使用&#xff1a; int main() {char ch w…

ES 8的向量检索性能调优实践

前言 ES的官方实验室曾发布过一篇博客,介绍了使ES向量检索性能获得显著提升的技术要点与展望: 多线程搜索能力的利用:Lucene 的分段架构允许实现多线程搜索能力。Elasticsearch 通过同时搜索多个段来提高性能,使用所有可用的 CPU 核心的计算能力显著减少了单个搜索的延迟。…

关闭windows11磁盘地址栏上的历史记录

关闭windows11的磁盘地址栏上的历史记录 windows11打开磁盘后访问某一个磁盘路径后会记录这个磁盘路径&#xff0c;而且有时候会卡住这个地址栏&#xff08;关都关不掉&#xff09;&#xff0c;非常麻烦。 如下图所示&#xff1a; 关闭地址栏历史记录 按下windows键打开开…

Python 机器学习 基础 之 【常用机器学习库】 Matplotlib 数据可视化库

Python 机器学习 基础 之 【常用机器学习库】 Matplotlib 数据可视化库 目录 Python 机器学习 基础 之 【常用机器学习库】 Matplotlib 数据可视化库 一、简单介绍 二、Matplotlib 基础 1、安装 Matplotlib 2、导入 Matplotlib 3、基本绘图 3.1 绘制简单折线图 3.2、绘…

【AutoSar网络管理】如何循环测试CAN网络管理的唤醒时间

测试用例: Preconditions: DUT出于休眠状态 Steps to reproduce: Step1:仿真外部NM报文,唤醒ECU。 Step2:停止仿真Step1的报文,从总线上最后一帧NM开始,等待时间T。 Step3:仿真外部NM报文,此时记录为T1。 Step4:等待DUT发送第一帧报文,此时记录为T2,计算T2 - T1。…

8086 汇编笔记(十二):int 指令 端口 直接定址表

一、int 指令 int 指令的格式为:int n&#xff0c;n 为中断类型码&#xff0c;它的功能是引发中断过程 CPU 执行 intn 指令&#xff0c;相当于引发一个n号中断的中断过程&#xff0c;执行过程如下&#xff1a; (1) 取中断类型码 n; (2) 标志寄存器入栈&#xff0c;IF0&…

Vue3页面进入动画

这里我使用了一种页面动画库animate.css 这里我附上它的链接 Animate.css | A cross-browser library of CSS animations. 我使用的是Vue3 //App.vue代码如下 <router-view v-slot"{ Component, route }"><transitionbefore-enter"beforeEnter"en…

Framework | Android Rescue Party: 提升设备恢复力的机制

Framework | Android Rescue Party: 提升设备恢复力的机制 什么是 Rescue Party? Rescue Party 是 Android 操作系统中的一种机制,旨在当设备遇到系统崩溃或启动失败时提供自动恢复的方案。这一机制特别针对系统关键组件的反复崩溃,防止设备陷入无法使用的状态。 主要功能…