日常任务-新主播上麦奖励

This commit is contained in:
2025-08-29 16:33:33 +08:00
parent 3c0fbae36e
commit 0f778f78fa
12 changed files with 221 additions and 33 deletions

View File

@@ -20,9 +20,8 @@ public interface DailyTaskConstant {
send_gold_num,//送礼金币
send_gift_num,//送礼数量
task_config,//任务配置
up_mic_coin_ip_limit,//主播上麦领取ip限制
up_mic_coin_uid_limit,//主播上麦领取ip限制
up_mic_coin_device_limit,//主播上麦领取设备限制
ip_limit,//主播上麦领取ip限制
device_limit,//主播上麦领取设备限制
;
@Override

View File

@@ -18,9 +18,10 @@ public enum DailyTaskTypeEnum {
UP_MIC_COIN("UP_MIC_COIN"),//周上麦聊天(获得金币)
ROOM_DAY_DIAMOND("ROOM_DAY_DIAMOND"),//房间日流水奖励
GUILD_WEEK_REWARD("GUILD_WEEK_REWARD"),//公会周奖励
ROOM_SEND_NOMAL_GIFT_GOLD("ROOM_SEND_NOMAL_GIFT_GOLD"),//房间送普通礼物礼单个送礼达到金币
ROOM_SEND_NOMAL_GIFT_GOLD("ROOM_SEND_NOMAL_GIFT_GOLD"),//房间送普通礼物礼单个送礼达到20000金币
ROOM_SEND_LUCKY_NUM("ROOM_SEND_LUCKY_NUM"),//送出77个lucky礼物
ROOM_SEND_BRAVO_NUM("ROOM_SEND_BRAVO_NUM"),//送出77个BRAVO礼物
GM_UP_MIC("GM_UP_MIC"),//每日任务新主播上麦(薅羊毛)
;
private String handlerType;

View File

@@ -36,4 +36,6 @@ public class DailyTaskVo {
@ApiModelProperty("房间流水奖励")
private DailyTaskRoomDiamondVo diamondVo;
private List<GuildMemberWeekLevelRewardItemVo> guildWeekRewardItems;
@ApiModelProperty("任务剩余时间")
private Long expireSecond;
}

View File

@@ -49,8 +49,7 @@ import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
import static com.accompany.core.enumeration.I18nAlertEnum.GOLD_BEAN_NAME;
import static com.accompany.core.enumeration.I18nAlertEnum.GOLD_NAME;
import static com.accompany.core.enumeration.I18nAlertEnum.*;
/**
* <p>
@@ -327,6 +326,10 @@ public class ActivityH5LevelAwardServiceImpl extends ServiceImpl<ActivityH5Level
i18nValue = I18NMessageSourceUtil.getMessage(GOLD_NAME, partitionId);
vo.setPic("https://image.molistar.xyz/Molistarcoins.png");
break;
case GOLD:
i18nValue = I18NMessageSourceUtil.getMessage(DIAMOND_NAME, partitionId);
vo.setPic("https://image.molistar.xyz/diamond_dailytast.png");
break;
case VIP:
VipInfo vipInfo = vipInfoService.getByVipLevel(refId);
if (null == vipInfo) {

View File

@@ -26,6 +26,7 @@ import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.IntegerCodec;
import org.redisson.client.codec.LongCodec;
import org.redisson.codec.TypedJsonJacksonCodec;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
@@ -65,6 +66,7 @@ public abstract class AbstractDailyTaskHandler implements DailyTaskHandler {
if (dailyTaskVo == null) {
return dailyTaskVo;
}
dailyTaskVo.setTaskConfigId(context.getTaskConfigId());
dailyTaskVo.setRewardVos(context.getRewardVos());
dailyTaskVo.setConfigRewards(context.getConfigRewards());
dailyTaskVo.setTodayDate(todayDate);
@@ -123,14 +125,14 @@ public abstract class AbstractDailyTaskHandler implements DailyTaskHandler {
if (!taskStatus.isExists()) {
throw new ServiceException(BusiStatus.DAILY_TASK_UNCOMPLETED);
}
if (CollectionUtils.isEmpty(dailyTaskVo.getConfigRewards())) {
throw new ServiceException(BusiStatus.DAILY_TASK_REWARD_ERROR);
}
Integer receiveStatus = receiveStatus(uid, receiveDate, dailyTaskTypeEnum)
.getAndSet(1, Duration.ofDays(getReceiveExpireDay()));
if (receiveStatus != null) {
throw new ServiceException(BusiStatus.DAILY_RECEIVE_EXIST);
}
if (CollectionUtils.isEmpty(dailyTaskVo.getConfigRewards())) {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
Long guildMemberId = 0L;
Integer guildId = 0;
@@ -216,4 +218,13 @@ public abstract class AbstractDailyTaskHandler implements DailyTaskHandler {
protected RMap<Long, Long> sendGiftNum(DailyTaskTypeEnum dailyTaskTypeEnum, Integer partitionId, String todayDate) {
return redissonClient.getMap(send_gift_num.getKey(partitionId.toString(), dailyTaskTypeEnum.name(), todayDate), LongCodec.INSTANCE);
}
protected RMap<String, Long> getIpCache(DailyTaskTypeEnum dailyTaskTypeEnum, String monday) {
return redissonClient.getMap(ip_limit.getKey(dailyTaskTypeEnum.name(), monday), new TypedJsonJacksonCodec(String.class, Long.class));
}
protected RMap<String, Long> getDeveiceCache(DailyTaskTypeEnum dailyTaskTypeEnum, String monday) {
return redissonClient.getMap(device_limit.getKey(dailyTaskTypeEnum.name(), monday), new TypedJsonJacksonCodec(String.class, Long.class));
}
}

View File

@@ -48,6 +48,9 @@ public class DailyTaskConfigService extends ServiceImpl<DailyTaskConfigMapper, D
.eq(DailyTaskConfig::getEnable, 1)
.orderByAsc(DailyTaskConfig::getTaskSeq);
DailyTaskConfig taskConfig = baseMapper.selectOne(wrapper, false);
if (taskConfig == null) {
return null;
}
cacheMap.put(taskKey, taskConfig);
return taskConfig;
}

View File

@@ -61,4 +61,32 @@ public class DailyTaskRewardRecordService extends ServiceImpl<DailyTaskRewardRec
.like(StringUtils.isNotEmpty(ip), DailyTaskRewardRecord::getLoginIp, ip);
return this.baseMapper.selectPage(new Page<>(pageNo, pageSize), wrapper);
}
public DailyTaskRewardRecord getOneByGuildMember(Long uid,Integer partitionId, String taskKey){
LambdaQueryWrapper<DailyTaskRewardRecord> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DailyTaskRewardRecord::getPartitionId, partitionId)
.eq(DailyTaskRewardRecord::getUid, uid)
.eq(DailyTaskRewardRecord::getTaskKey, taskKey)
.orderByAsc(DailyTaskRewardRecord::getStatDate)
.last("limit 1");
return this.baseMapper.selectOne(wrapper, false);
}
public DailyTaskRewardRecord getFirstOneByIp(String ip, String taskKey){
LambdaQueryWrapper<DailyTaskRewardRecord> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DailyTaskRewardRecord::getLoginIp, ip)
.eq(DailyTaskRewardRecord::getTaskKey, taskKey)
.orderByAsc(DailyTaskRewardRecord::getStatDate)
.last("limit 1");
return this.baseMapper.selectOne(wrapper, false);
}
public DailyTaskRewardRecord getFirstOneByDevice(String deviceId, String taskKey){
LambdaQueryWrapper<DailyTaskRewardRecord> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DailyTaskRewardRecord::getDeviceId, deviceId)
.eq(DailyTaskRewardRecord::getTaskKey, taskKey)
.orderByAsc(DailyTaskRewardRecord::getStatDate)
.last("limit 1");
return this.baseMapper.selectOne(wrapper, false);
}
}

View File

@@ -0,0 +1,151 @@
package com.accompany.business.service.dailytask.handler;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.constant.CountryEnum;
import com.accompany.business.constant.dailytask.DailyTaskConstant;
import com.accompany.business.constant.dailytask.DailyTaskTypeEnum;
import com.accompany.business.model.dailytask.DailyTaskRewardRecord;
import com.accompany.business.model.guild.Guild;
import com.accompany.business.model.guild.GuildMember;
import com.accompany.business.service.dailytask.AbstractDailyTaskHandler;
import com.accompany.business.service.dailytask.DailyTaskRewardRecordService;
import com.accompany.business.service.dailytask.annotation.DailyTaskHandlerType;
import com.accompany.business.service.guild.GuildMemberService;
import com.accompany.business.service.guild.GuildService;
import com.accompany.business.service.guildpolicy2.GuildMicStatisticsPolicy2Service;
import com.accompany.business.vo.dailytask.DailyProgressContext;
import com.accompany.business.vo.dailytask.DailyTaskContext;
import com.accompany.business.vo.dailytask.DailyTaskVo;
import com.accompany.common.result.BusiResult;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.RegionInfo;
import com.accompany.core.model.Users;
import com.accompany.core.service.region.RegionInfoService;
import org.redisson.api.RBucket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.util.Date;
/**
* 新账号注册后30天内
* 加入菲律宾公会
* 公会所属国家为菲律宾而不是公会长所属国家注册后30天内 在加入公会后7天内会显示该任务
*/
@Component
@DailyTaskHandlerType(DailyTaskTypeEnum.GM_UP_MIC)
public class GuildMemberUpMicHandler extends AbstractDailyTaskHandler {
@Autowired
private GuildMicStatisticsPolicy2Service guildMicStatisticsPolicy2Service;
@Autowired
private GuildMemberService guildMemberService;
@Autowired
private GuildService guildService;
@Autowired
private RegionInfoService regionInfoService;
@Autowired
private DailyTaskRewardRecordService dailyTaskRewardRecordService;
@Override
public void doExecuteProgress(DailyProgressContext progressContext) {
}
@Override
public DailyTaskVo doHandle(DailyTaskContext context) {
Long uid = context.getUid();
DailyTaskVo dailyTaskVo = new DailyTaskVo();
String deviceId = context.getDeviceId();
DailyTaskTypeEnum taskType = context.getDailyTaskTypeEnum();
String realIpAddress = context.getRealIpAddress();
String taskDate = context.getTodayDate();
Date now = new Date();
String nowDate = getNowDate(context.getPartitionId(), now);
Users users = usersService.getUsersByUid(uid);
Integer partitionId = context.getPartitionId();
GuildMember guildMember = guildMemberService.getVaildGuildMemberByUid(uid);
if (null == guildMember) {
return null;
}
Guild guild = guildService.getVaildGuildById(guildMember.getGuildId());
if (guild == null || guild.getRegionId() == null) {
return null;
}
RegionInfo regionInfo = regionInfoService.getById(guild.getRegionId());
if (regionInfo == null || !regionInfo.getCode().equals(CountryEnum.PH.name())) {
return null;
}
Date joinGuildTime = guildMember.getCreateTime();
Date joinGuildAfterSevenDay = DateUtil.offsetDay(joinGuildTime, 7);
Date thirdDay = DateUtil.offsetDay(users.getCreateTime(), 30);
dailyTaskVo.setExpireSecond(DateUtil.between(joinGuildAfterSevenDay, now, DateUnit.SECOND));
//注册后30天内 在加入公会后7天内会显示该任务
if (!(joinGuildTime.before(thirdDay) && now.before(thirdDay)) || joinGuildAfterSevenDay.before(now)) {//过期
return null;
}
DailyTaskRewardRecord taskRewardRecord = dailyTaskRewardRecordService.getOneByGuildMember(uid, partitionId, taskType.name());
//已经在本公会领过该任务的账号不满7天退出后再次加入该公会不会显示和服务端拦截领取该任务
//已经在上个公会领过该任务的账号(无论多少天),退出后加入其他公会,不会显示和服务端拦截领取该任务
if (taskRewardRecord != null && !taskRewardRecord.getGuildMemberId().equals(guildMember.getId())) {
return null;
}
DailyTaskRewardRecord getFirstOneByIp = dailyTaskRewardRecordService.getFirstOneByIp(realIpAddress, taskType.name());
if (getFirstOneByIp != null && !uid.equals(getFirstOneByIp.getUid())) {
return null;
}
DailyTaskRewardRecord getFirstOneByDevice = dailyTaskRewardRecordService.getFirstOneByDevice(deviceId, taskType.name());
if (getFirstOneByDevice != null && !uid.equals(getFirstOneByDevice.getUid())) {
return null;
}
RBucket<Integer> taskStatus = taskStatus(uid, taskDate, taskType);
Integer totalDuration;
if (!taskStatus.isExists()) { //达标之后不再统计上麦时长
totalDuration = guildMicStatisticsPolicy2Service.getMinutes(context.getPartitionId(), guildMember.getId(), nowDate);
} else {
totalDuration = taskStatus.get();
}
dailyTaskVo.setTodayDate(taskDate);
if (totalDuration != null && totalDuration >= context.getStandardValue()) {
taskStatus.set(totalDuration, Duration.ofDays(getReceiveExpireDay()));
}
DailyTaskConstant.ReceiveStatus receiveStatus = computeReceiveStatus(uid, taskDate, taskType);
dailyTaskVo.setReceiveStatus(receiveStatus);
if (receiveStatus == DailyTaskConstant.ReceiveStatus.RECEIVED) {
return dailyTaskVo;
}
dailyTaskVo.setReachNum(totalDuration.longValue());
return dailyTaskVo;
}
@Override
public BusiResult receive(Long uid, String receiveDate, DailyTaskVo dailyTaskVo, String deviceId, String realIpAddress) {
DailyTaskTypeEnum taskType = dailyTaskVo.getTaskType();
DailyTaskRewardRecord getFirstOneByIp = dailyTaskRewardRecordService.getFirstOneByIp(realIpAddress, taskType.name());
if (getFirstOneByIp != null && !uid.equals(getFirstOneByIp.getUid())) {
throw new ServiceException(BusiStatus.DAILY_TASK_RECEIVE_END);
}
DailyTaskRewardRecord getFirstOneByDevice = dailyTaskRewardRecordService.getFirstOneByDevice(deviceId, taskType.name());
if (getFirstOneByDevice != null && !uid.equals(getFirstOneByDevice.getUid())) {
throw new ServiceException(BusiStatus.DAILY_TASK_RECEIVE_END);
}
super.receive(uid, receiveDate, dailyTaskVo, deviceId, realIpAddress);
return BusiResult.success();
}
@Override
protected Integer getReceiveExpireDay() {
return 7;
}
}

View File

@@ -36,7 +36,7 @@ public class RoomSendLuckyNumHandler extends AbstractDailyTaskHandler {
return;
}
RMap<Long, Long> sendGoldNum = sendGiftNum(ROOM_SEND_LUCKY_NUM, partitionId, todayDate);
Long addAndGet = sendGoldNum.addAndGet(uid, progressContext.getGiftNum());
Long addAndGet = sendGoldNum.addAndGet(uid, progressContext.getGiftNum().longValue());
sendGoldNum.expire(Duration.ofDays(EXPIRE_DAY));
DailyTaskConfig dailyTaskConfig = dailyTaskConfigService.getByPartTaskKey(partitionId, ROOM_SEND_LUCKY_NUM.name());
if (dailyTaskConfig != null && addAndGet != null && addAndGet >= dailyTaskConfig.getReachNum()) {

View File

@@ -17,7 +17,6 @@ import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import org.redisson.api.RBucket;
import org.redisson.api.RMap;
import org.redisson.codec.TypedJsonJacksonCodec;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -27,9 +26,6 @@ import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import static com.accompany.business.constant.dailytask.DailyTaskConstant.RedisKey.up_mic_coin_device_limit;
import static com.accompany.business.constant.dailytask.DailyTaskConstant.RedisKey.up_mic_coin_ip_limit;
@Component
@DailyTaskHandlerType(DailyTaskTypeEnum.UP_MIC_COIN)
public class UpMicCoinHandler extends AbstractDailyTaskHandler {
@@ -51,18 +47,18 @@ public class UpMicCoinHandler extends AbstractDailyTaskHandler {
String deviceId = context.getDeviceId();
DailyTaskTypeEnum taskType = context.getDailyTaskTypeEnum();
String realIpAddress = context.getRealIpAddress();
String mondayDate = context.getTodayDate();
String taskDate = context.getTodayDate();
String nowDate = getNowDate(context.getPartitionId(), new Date());
Long receivUid = getIpCache(mondayDate).getOrDefault(realIpAddress, 0L);
Long receivUid = getIpCache(taskType, taskDate).getOrDefault(realIpAddress, 0L);
if (receivUid > 0 && !receivUid.equals(uid)) {
return null;
}
receivUid = getDeveiceCache(mondayDate).getOrDefault(deviceId, 0L);
receivUid = getDeveiceCache(taskType, taskDate).getOrDefault(deviceId, 0L);
if (receivUid > 0 && !receivUid.equals(uid)) {
return null;
}
RBucket<Integer> taskStatus = taskStatus(uid, mondayDate, taskType);
RBucket<Integer> taskStatus = taskStatus(uid, taskDate, taskType);
Integer totalDuration;
if (!taskStatus.isExists()) { //达标之后不再统计上麦时长
GuildMember guildMember = guildMemberService.getVaildGuildMemberByUid(uid);
@@ -73,11 +69,11 @@ public class UpMicCoinHandler extends AbstractDailyTaskHandler {
} else {
totalDuration = taskStatus.get();
}
dailyTaskVo.setTodayDate(mondayDate);
dailyTaskVo.setTodayDate(taskDate);
if (totalDuration != null && totalDuration >= context.getStandardValue()) {
taskStatus.set(totalDuration, Duration.ofDays(getReceiveExpireDay()));
}
DailyTaskConstant.ReceiveStatus receiveStatus = computeReceiveStatus(uid, mondayDate, taskType);
DailyTaskConstant.ReceiveStatus receiveStatus = computeReceiveStatus(uid, taskDate, taskType);
dailyTaskVo.setReceiveStatus(receiveStatus);
if (receiveStatus == DailyTaskConstant.ReceiveStatus.RECEIVED) {
return dailyTaskVo;
@@ -88,20 +84,21 @@ public class UpMicCoinHandler extends AbstractDailyTaskHandler {
@Override
public BusiResult receive(Long uid, String receiveDate, DailyTaskVo dailyTaskVo, String deviceId, String realIpAddress) {
Long receivUid = getIpCache(receiveDate).getOrDefault(realIpAddress, 0L);
DailyTaskTypeEnum taskType = dailyTaskVo.getTaskType();
Long receivUid = getIpCache(taskType, receiveDate).getOrDefault(realIpAddress, 0L);
if (receivUid > 0 && !receivUid.equals(uid)) {
throw new ServiceException(BusiStatus.DAILY_TASK_RECEIVE_END);
}
receivUid = getDeveiceCache(receiveDate).getOrDefault(deviceId, 0L);
receivUid = getDeveiceCache(taskType, receiveDate).getOrDefault(deviceId, 0L);
if (receivUid > 0 && !receivUid.equals(uid)) {
throw new ServiceException(BusiStatus.DAILY_TASK_RECEIVE_END);
}
super.receive(uid, receiveDate, dailyTaskVo, deviceId, realIpAddress);
RMap<String, Long> deveiceCache = getDeveiceCache(receiveDate);
RMap<String, Long> deveiceCache = getDeveiceCache(taskType, receiveDate);
deveiceCache.put(deviceId, uid);
RMap<String, Long> ipCache = getIpCache(receiveDate);
RMap<String, Long> ipCache = getIpCache(taskType, receiveDate);
ipCache.put(realIpAddress, uid);
deveiceCache.expire(Duration.ofDays(getReceiveExpireDay()));
ipCache.expire(Duration.ofDays(getReceiveExpireDay()));
@@ -116,15 +113,6 @@ public class UpMicCoinHandler extends AbstractDailyTaskHandler {
return zonedDateTime.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).format(DateTimeUtil.dateFormatter);
}
private RMap<String, Long> getIpCache(String monday) {
return redissonClient.getMap(up_mic_coin_ip_limit.getKey(monday), new TypedJsonJacksonCodec(String.class, Long.class));
}
private RMap<String, Long> getDeveiceCache(String monday) {
return redissonClient.getMap(up_mic_coin_device_limit.getKey(monday), new TypedJsonJacksonCodec(String.class, Long.class));
}
@Override
protected Integer getReceiveExpireDay() {
return 7;