From 7855c0b09a83dde936500fc1d2cd4da6bd7b20d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=B0=8F=E6=B1=9F?= <461355754@qq.com> Date: Tue, 14 Oct 2025 17:15:09 +0800 Subject: [PATCH] =?UTF-8?q?1:=E7=BA=A2=E5=8C=85=E5=8F=91=E5=B8=83=E5=92=8C?= =?UTF-8?q?=E6=89=93=E5=BC=80=202=EF=BC=9A=E6=8A=A2=E6=9C=80=E6=A0=87?= =?UTF-8?q?=E5=87=86=E7=9A=84=E7=BA=A2=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xscm/moduleutil/bean/RedPackGrab.java | 8 + .../xscm/moduleutil/bean/RedPacketInfo.java | 52 ++++ .../xscm/moduleutil/bean/RedpacketDetail.java | 35 +++ .../moduleutil/event/RedEnvelopeStatus.java | 11 + .../moduleutil/utils/QXRedPacketManager.java | 239 ++++++++++++++++++ 5 files changed, 345 insertions(+) create mode 100644 moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedPackGrab.java create mode 100644 moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedPacketInfo.java create mode 100644 moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedpacketDetail.java create mode 100644 moduleUtil/src/main/java/com/xscm/moduleutil/event/RedEnvelopeStatus.java create mode 100644 moduleUtil/src/main/java/com/xscm/moduleutil/utils/QXRedPacketManager.java diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedPackGrab.java b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedPackGrab.java new file mode 100644 index 0000000..4d9807c --- /dev/null +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedPackGrab.java @@ -0,0 +1,8 @@ +package com.xscm.moduleutil.bean; + +import lombok.Data; + +@Data +public class RedPackGrab { + private int code;//1:正常抢 2:已经抢过了 3:手慢了 +} diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedPacketInfo.java b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedPacketInfo.java new file mode 100644 index 0000000..4f5784a --- /dev/null +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedPacketInfo.java @@ -0,0 +1,52 @@ +package com.xscm.moduleutil.bean; + +import lombok.Data; + +/** + * 红包推送的对象 + */ +@Data +public class RedPacketInfo { + private int id; + private String remark;// 备注 + private String password;// 开始时间 + private int countdown;//0:立即开抢,其他:倒计时抢 + private String conditions;//条件 + private String total_amount;//红包总金额 + private int room_id;//房间ID + private int type;//红包类型 + private int total_count;//红包数量 + private int coin_type;//币种 + private int user_id;//用户ID + private String nickname;// 昵称 + private String redpacket_id;//红包ID + + private String avatar;//头像 + private String redpacket_time;//红包消失的时间 + private long start_time; + + private boolean isAvailable;//是否可以领取 + + private String left_amount;//33.00", + private int left_count; + private long end_time; + private long createtime; + private String updatetime; + + + // 获取剩余时间 + public long remainingTime() { + long needTime = 0; + // 获取当前时间戳(毫秒) + long currentTimeMillis = System.currentTimeMillis(); + // 计算剩余时间 + needTime = start_time - currentTimeMillis; + return needTime; + } + + // 判断红包是否可以领取 + public boolean canOpenNow(){ + return remainingTime()<=0; + } + +} diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedpacketDetail.java b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedpacketDetail.java new file mode 100644 index 0000000..e43ebf2 --- /dev/null +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RedpacketDetail.java @@ -0,0 +1,35 @@ +package com.xscm.moduleutil.bean; + +import lombok.Data; + +import java.util.List; + +@Data +public class RedpacketDetail { + private RedPacketInfo redPacket_info; + + private List records; + private MyRecord my_record; + private boolean has_grabbed; + @Data + public static class Records { + private int id; + private int redpacket_id; + private int user_id; + private String nickname; + private String avatar; + private String amount; + private String createtime; + } + + @Data + public static class MyRecord { + private int id; + private int redpacket_id; + private String nickname; + private String user_id; + private String avatar; + private String amount; + private String createtime; + } +} diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/event/RedEnvelopeStatus.java b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RedEnvelopeStatus.java new file mode 100644 index 0000000..82d24ef --- /dev/null +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RedEnvelopeStatus.java @@ -0,0 +1,11 @@ +package com.xscm.moduleutil.event; +/** + * 红包打开状态 + */ +public enum RedEnvelopeStatus { + + READY_TO_OPEN, // 可以直接打开 + COUNTDOWN_TO_OPEN, // 倒计时后可打开 + CONDITION_TO_OPEN, // 满足条件后可打开 + COUNTDOWN_AND_CONDITION // 先倒计时,再满足条件后可打开 +} diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/utils/QXRedPacketManager.java b/moduleUtil/src/main/java/com/xscm/moduleutil/utils/QXRedPacketManager.java new file mode 100644 index 0000000..5aebda6 --- /dev/null +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/utils/QXRedPacketManager.java @@ -0,0 +1,239 @@ +package com.xscm.moduleutil.utils; + +import android.os.Handler; +import android.os.Looper; +import com.xscm.moduleutil.bean.RedPacketInfo; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 红包管理器单例类 + */ +public class QXRedPacketManager { + private static QXRedPacketManager instance; + private final Map redPackets; + private Handler checkTimerHandler; + private Runnable checkTimerRunnable; + + // 私有构造函数,防止外部实例化 + private QXRedPacketManager() { + this.redPackets = new HashMap<>(); + } + + /** + * 获取单例实例 + * + * @return QXRedPacketManager 单例 + */ + public static QXRedPacketManager getInstance() { + if (instance == null) { + synchronized (QXRedPacketManager.class) { + if (instance == null) { + instance = new QXRedPacketManager(); + } + } + } + return instance; + } + + /** + * 添加红包列表 + * + * @param redPackets 红包模型列表 + */ + public void addRedPackets(List redPackets) { + if (redPackets == null || redPackets.isEmpty()) { + return; + } + + for (RedPacketInfo model : redPackets) { + this.redPackets.put(model.getRedpacket_id(), model); + } + + if (this.delegate != null && this.delegate instanceof QXRedPacketManagerDelegate) { + ((QXRedPacketManagerDelegate) this.delegate).onRedPacketsAdded(redPackets, this.redPackets.size()); + } + } + + /** + * 添加单个红包 + * + * @param redPacket 红包模型 + */ + public void addRedPacket(RedPacketInfo redPacket) { + if (redPacket == null || redPacket.getRedpacket_id() == null) { + return; + } + + this.redPackets.put(redPacket.getRedpacket_id(), redPacket); + + if (this.delegate != null && this.delegate instanceof QXRedPacketManagerDelegate) { + ((QXRedPacketManagerDelegate) this.delegate).onRedPacketAdded(redPacket, this.redPackets.size()); + } + } + + /** + * 移除红包 + * + * @param packetId 红包ID + */ + public void removeRedPacket(String packetId) { + this.redPackets.remove(packetId); + + if (this.delegate != null && this.delegate instanceof QXRedPacketManagerDelegate) { + ((QXRedPacketManagerDelegate) this.delegate).onRedPacketRemoved(packetId, this.redPackets.size()); + } + } + + /** + * 获取所有红包 + * + * @return 红包列表 + */ + public List getAllRedPackets() { + return new ArrayList<>(this.redPackets.values()); + } + + /** + * 根据ID获取红包 + * + * @param packetId 红包ID + * @return 红包模型 + */ + public RedPacketInfo getRedPacket(String packetId) { + return this.redPackets.get(packetId); + } + + /** + * 开始检查定时器 + */ + public void startCheckTimer() { + if (checkTimerRunnable == null) { + checkTimerRunnable = new Runnable() { + @Override + public void run() { + checkAndUpdateRedPackets(); + } + }; + + checkTimerHandler = new Handler(Looper.getMainLooper()); + checkTimerHandler.post(checkTimerRunnable); + } + } + + /** + * 检查并更新红包状态 + */ + private void checkAndUpdateRedPackets() { + List packets = new ArrayList<>(this.redPackets.values()); + + for (RedPacketInfo packet : packets) { + boolean wasAvailable = packet.isAvailable(); + packet.setAvailable(packet.canOpenNow()); + + // 状态发生变化时通知 + if (wasAvailable != packet.isAvailable()) { + if (this.delegate != null && this.delegate instanceof QXRedPacketManagerDelegate) { + ((QXRedPacketManagerDelegate) this.delegate).onRedPacketUpdated(packet, this.redPackets.size()); + } + } + + // 倒计时结束的红包可以设置自动移除 + if (packet.getCountdown() > 0 && packet.remainingTime() <= -(Long.getLong(packet.getRedpacket_time()))) { + // 倒计时结束10秒后自动移除 + removeRedPacket(packet.getRedpacket_id()); + } + } + + // 继续执行定时任务 + checkTimerHandler.postDelayed(checkTimerRunnable, 1000); + } + + /** + * 移除所有红包 + */ + public void removeAllRedPackets() { + this.redPackets.clear(); + } + + /** + * 结束检查定时器 + */ + public void endCheckTimer() { + if (checkTimerHandler != null) { + checkTimerHandler.removeCallbacks(checkTimerRunnable); + checkTimerHandler = null; + checkTimerRunnable = null; + } + } + + /** + * 销毁红包信息 + */ + public void destroyRedpacketInfo() { + removeAllRedPackets(); + endCheckTimer(); + this.delegate = null; + } + + /** + * 设置委托对象 + * + * @param delegate 委托对象 + */ + public void setDelegate(QXRedPacketManagerDelegate delegate) { + this.delegate = delegate; + } + + /** + * 获取委托对象 + * + * @return 委托对象 + */ + public QXRedPacketManagerDelegate getDelegate() { + return this.delegate; + } + + /** + * 委托接口 + */ + public interface QXRedPacketManagerDelegate { + /** + * 添加红包列表回调 + * + * @param redPackets 红包列表 + * @param remainingCount 剩余数量 + */ + void onRedPacketsAdded(List redPackets, int remainingCount); + + /** + * 添加单个红包回调 + * + @param redPacket 红包模型 + * @param remainingCount 剩余数量 + */ + void onRedPacketAdded(RedPacketInfo redPacket, int remainingCount); + + /** + * 移除红包回调 + * + * @param packetId 红包ID + * @param remainingCount 剩余数量 + */ + void onRedPacketRemoved(String packetId, int remainingCount); + + /** + * 更新红包状态回调 + * + * @param packet 红包模型 + * @param remainingCount 剩余数量 + */ + void onRedPacketUpdated(RedPacketInfo packet, int remainingCount); + } + + private QXRedPacketManagerDelegate delegate; +} +