1:红包发布和打开

2:抢最标准的红包
This commit is contained in:
2025-10-14 17:15:09 +08:00
parent c72e2d7919
commit fcb538a621
5 changed files with 345 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
package com.xscm.moduleutil.bean;
import lombok.Data;
@Data
public class RedPackGrab {
private int code;//1:正常抢 2已经抢过了 3手慢了
}

View File

@@ -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;
}
}

View File

@@ -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> 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;
}
}

View File

@@ -0,0 +1,11 @@
package com.xscm.moduleutil.event;
/**
* 红包打开状态
*/
public enum RedEnvelopeStatus {
READY_TO_OPEN, // 可以直接打开
COUNTDOWN_TO_OPEN, // 倒计时后可打开
CONDITION_TO_OPEN, // 满足条件后可打开
COUNTDOWN_AND_CONDITION // 先倒计时,再满足条件后可打开
}

View File

@@ -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<String, RedPacketInfo> 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<RedPacketInfo> 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<RedPacketInfo> 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<RedPacketInfo> 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<RedPacketInfo> 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;
}