日常任务-日任务奖励领取详情

This commit is contained in:
2025-08-27 16:49:57 +08:00
parent 0165dd10ee
commit 79b957f3fb
24 changed files with 339 additions and 10 deletions

View File

@@ -0,0 +1,51 @@
package com.accompany.admin.service.dailytask;
import com.accompany.business.model.dailytask.DailyTaskRecvCoinStat;
import com.accompany.business.service.dailytask.DailyTaskRecvCoinStatService;
import com.accompany.business.service.dailytask.DailyTaskStatService;
import com.accompany.business.vo.dailytask.DailyCoinRecvVo;
import com.accompany.common.result.PageResult;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.enumeration.PartitionEnum;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Service
public class DailyTaskAdminService {
@Autowired
private DailyTaskRecvCoinStatService dailyTaskRecvCoinStatService;
@Autowired
private DailyTaskStatService dailyTaskStatService;
public PageResult<DailyCoinRecvVo> list(Integer pageNo, Integer pageSize, Integer partitionId, String startDate, String endDate) {
IPage<DailyTaskRecvCoinStat> dailyTaskRecvCoinStatIPage = dailyTaskRecvCoinStatService.selectDailyCoinRecvStat(partitionId, startDate, endDate, pageNo, pageSize);
PageResult<DailyCoinRecvVo> pageResult = new PageResult<>();
List<DailyCoinRecvVo> recvVoList = new ArrayList<>();
pageResult.setRows(recvVoList);
pageResult.setTotal((int) dailyTaskRecvCoinStatIPage.getTotal());
List<DailyTaskRecvCoinStat> records = dailyTaskRecvCoinStatIPage.getRecords();
if (pageNo == 1) {
String todayDate = DateTimeUtil.convertWithZoneId(new Date(),
PartitionEnum.getByPartitionId(partitionId).getZoneId()).format(DateTimeUtil.dateFormatter);
records.add(dailyTaskStatService.statDailyCoinRecvStat(partitionId, todayDate));
}
if (CollectionUtils.isEmpty(records)) {
return pageResult;
}
for (DailyTaskRecvCoinStat record : records) {
DailyCoinRecvVo dailyCoinRecvVo = new DailyCoinRecvVo();
BeanUtils.copyProperties(record, dailyCoinRecvVo);
recvVoList.add(dailyCoinRecvVo);
}
return pageResult;
}
}

View File

@@ -0,0 +1,37 @@
package com.accompany.admin.controller.dailytask;
import com.accompany.admin.service.dailytask.DailyTaskAdminService;
import com.accompany.business.vo.dailytask.DailyCoinRecvVo;
import com.accompany.common.result.PageResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "每日任务相关", value = "每日任务相关")
@RestController
@RequestMapping("/admin/dailyTask")
public class DailyTaskAdminController {
@Autowired
private DailyTaskAdminService dailyTaskAdminService;
@GetMapping("/coinRecvNums")
@ApiImplicitParams( {
@ApiImplicitParam(name = "partitionId", value = "分区id", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "startDate", value = "开始时间", required = true, dataType = "String"),
@ApiImplicitParam(name = "endDate", value = "结束时间", required = true, dataType = "String"),
@ApiImplicitParam(name = "pageNo", value = "页码", dataType = "Integer"),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "Integer")
})
@ApiOperation(value = "日任务奖励领取详情", httpMethod = "GET")
public PageResult<DailyCoinRecvVo> list(Integer pageNo, Integer pageSize, @RequestParam(defaultValue = "16") Integer partitionId,
String startDate, String endDate) {
return dailyTaskAdminService.list(pageNo, pageSize, partitionId, startDate, endDate);
}
}

View File

@@ -0,0 +1,53 @@
package com.accompany.business.model.dailytask;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 上麦达标&领取&公会总数实体类
*
* @author
* @since 2025-08-27
*/
@Data
public class DailyTaskRecvCoinStat implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 分区id
*/
private Integer partitionId;
/**
* 统计日期
*/
private String statDate;
/**
* 达到人数
*/
private Integer reachNum;
/**
* 领取人数
*/
private Integer receiveNum;
/**
* 公会成员
*/
private Integer guildMemberNumn;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}

View File

@@ -48,6 +48,8 @@ public class DailyTaskRewardRecord implements Serializable {
* 奖品数量
*/
private Long awardNum;
private String deviceId;
private String loginIp;
/**
* 创建时间
*/

View File

@@ -0,0 +1,19 @@
package com.accompany.business.vo.dailytask;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("公会任务领取金币统计")
@Data
public class DailyCoinRecvVo {
private Integer partitionId;
@ApiModelProperty(value = "统计日期")
private String statDate;
@ApiModelProperty(value = "达到人数")
private Integer reachNum;
@ApiModelProperty(value = "领取人数")
private Integer receiveNum;
@ApiModelProperty(value = "公会成员人数")
private Integer guildMemberNumn;
}

View File

@@ -0,0 +1,14 @@
package com.accompany.business.mybatismapper.dailytask;
import com.accompany.business.model.dailytask.DailyTaskRecvCoinStat;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 上麦达标&领取&公会总数 Mapper 接口
*
* @author
* @since 2025-08-27
*/
public interface DailyTaskRecvCoinStatMapper extends BaseMapper<DailyTaskRecvCoinStat> {
}

View File

@@ -31,4 +31,6 @@ public interface GuildMicStatisticsPolicy2Mapper extends BaseMapper<GuildMicStat
List<GuildPolicy2PersonalVo> listPersonalMicData(@Param("cycleDate")String cycleDate, @Param("guildMemberId")Long guildMemberId);
Integer getMinutes(@Param("partitionId") Integer partitionId, @Param("guildMemberId") Long guildMemberId, @Param("statDate") String statDate);
Integer countByPartitionDate(@Param("statDate")String statDate, @Param("partitionId") Integer partitionId, @Param("reachMinutes") Integer reachMinutes);
}

View File

@@ -133,7 +133,7 @@ public abstract class AbstractDailyTaskHandler implements DailyTaskHandler {
for (DailyTaskReward configReward : dailyTaskVo.getConfigRewards()) {
dailyTaskRewardRecordService.addRecord(configReward.getTaskConfigId(), dailyTaskVo.getTaskType().name(),
uid, partitionId, guildId, guildMemberId, configReward.getAwardType(),
configReward.getAwardId(), configReward.getAwardNum(), receiveDate);
configReward.getAwardId(), configReward.getAwardNum(), receiveDate, realIpAddress, deviceId);
if (RewardTypeEnum.GOLDBEAN.getType().equals(configReward.getAwardType())) {
userGoldBeanService.addGoldBean(uid, BigDecimal.valueOf(configReward.getAwardNum()), GoldBeanBillType.TASK_GAIN,
String.valueOf(dailyTaskTypeEnum.ordinal()), 1, dailyTaskVo.getTaskType().name(),

View File

@@ -0,0 +1,30 @@
package com.accompany.business.service.dailytask;
import com.accompany.business.model.dailytask.DailyTaskRecvCoinStat;
import com.accompany.business.mybatismapper.dailytask.DailyTaskRecvCoinStatMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* 上麦达标&领取&公会总数 服务实现类
*
* @author
* @since 2025-08-27
*/
@Service
public class DailyTaskRecvCoinStatService extends ServiceImpl<DailyTaskRecvCoinStatMapper, DailyTaskRecvCoinStat> {
public IPage<DailyTaskRecvCoinStat> selectDailyCoinRecvStat(Integer partitionId, String startDate, String endDate, Integer pageNo, Integer pageSize) {
LambdaQueryWrapper<DailyTaskRecvCoinStat> wrapper = Wrappers.lambdaQuery();
wrapper.eq(DailyTaskRecvCoinStat::getPartitionId, partitionId)
.ge(DailyTaskRecvCoinStat::getStatDate, startDate)
.le(DailyTaskRecvCoinStat::getStatDate, endDate)
.orderByDesc(DailyTaskRecvCoinStat::getStatDate);
return baseMapper.selectPage(new Page<>(pageNo, pageSize), wrapper);
}
}

View File

@@ -2,6 +2,7 @@ package com.accompany.business.service.dailytask;
import com.accompany.business.model.dailytask.DailyTaskRewardRecord;
import com.accompany.business.mybatismapper.dailytask.DailyTaskRewardRecordMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@@ -17,7 +18,7 @@ import java.util.Date;
public class DailyTaskRewardRecordService extends ServiceImpl<DailyTaskRewardRecordMapper, DailyTaskRewardRecord> {
public Integer addRecord(Integer taskConfigId, String taskKey, Long uid, Integer partitionId, Integer guildId,
Long guildMemberId, Byte awardType, Long awardId, Long awardNum, String statDate) {
Long guildMemberId, Byte awardType, Long awardId, Long awardNum, String statDate, String ip, String deviceId) {
DailyTaskRewardRecord entity = new DailyTaskRewardRecord();
entity.setTaskConfigId(taskConfigId);
entity.setTaskKey(taskKey);
@@ -31,8 +32,18 @@ public class DailyTaskRewardRecordService extends ServiceImpl<DailyTaskRewardRec
entity.setAwardType(awardType);
entity.setAwardId(awardId);
entity.setAwardNum(awardNum);
entity.setLoginIp(ip);
entity.setDeviceId(deviceId);
entity.setCreateTime(new Date());
entity.setUpdateTime(new Date());
return this.baseMapper.insert(entity);
}
public Integer selectCount(Integer partitionId, String taskKey, String statDate) {
LambdaQueryWrapper<DailyTaskRewardRecord> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DailyTaskRewardRecord::getPartitionId, partitionId)
.eq(DailyTaskRewardRecord::getTaskKey, taskKey)
.eq(DailyTaskRewardRecord::getStatDate, statDate);
return this.baseMapper.selectCount(wrapper).intValue();
}
}

View File

@@ -0,0 +1,39 @@
package com.accompany.business.service.dailytask;
import com.accompany.business.constant.dailytask.DailyTaskTypeEnum;
import com.accompany.business.model.dailytask.DailyTaskRecvCoinStat;
import com.accompany.business.service.guild.GuildMemberService;
import com.accompany.business.service.guildpolicy2.GuildMicStatisticsPolicy2Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
public class DailyTaskStatService {
@Autowired
private DailyTaskRewardRecordService dailyTaskRewardRecordService;
@Autowired
private GuildMicStatisticsPolicy2Service guildMicStatisticsPolicy2Service;
@Autowired
private GuildMemberService guildMemberService;
@Autowired
private DailyTaskRecvCoinStatService dailyTaskRecvCoinStatService;
public DailyTaskRecvCoinStat statDailyCoinRecvStat(Integer partitionId, String statDate) {
DailyTaskRecvCoinStat dailyTaskRecvCoinStat = new DailyTaskRecvCoinStat();
Integer receiveNum = dailyTaskRewardRecordService.selectCount(partitionId, DailyTaskTypeEnum.UP_MIC_COIN.name(), statDate);
long guildMember = guildMemberService.countValidGuildMember(partitionId);
Integer reachNum = guildMicStatisticsPolicy2Service.countByPartitionDate(statDate, partitionId, 120);
dailyTaskRecvCoinStat.setStatDate(statDate);
dailyTaskRecvCoinStat.setPartitionId(partitionId);
dailyTaskRecvCoinStat.setReachNum(reachNum);
dailyTaskRecvCoinStat.setReceiveNum(receiveNum);
dailyTaskRecvCoinStat.setGuildMemberNumn((int)guildMember);
dailyTaskRecvCoinStat.setCreateTime(new Date());
dailyTaskRecvCoinStat.setUpdateTime(dailyTaskRecvCoinStat.getCreateTime());
dailyTaskRecvCoinStatService.save(dailyTaskRecvCoinStat);
return dailyTaskRecvCoinStat;
}
}

View File

@@ -25,7 +25,7 @@ public class ChargeGoldNumHandler extends AbstractDailyTaskHandler {
Long uid = progressContext.getUid();
Integer partitionId = progressContext.getPartitionId();
String todayDate = getTodayDate(partitionId, progressContext.getCreateTime());
String todayDate = getTaskDate(partitionId, progressContext.getCreateTime());
RMap<Long, Long> dailyChargeGold = dailyChargeGold(partitionId, todayDate);
Long chargeGold = dailyChargeGold.addAndGet(uid, progressContext.getChargeGoldNum());
dailyChargeGold.expire(Duration.ofDays(EXPIRE_DAY));

View File

@@ -19,7 +19,7 @@ public class DailySignHandler extends AbstractDailyTaskHandler {
public void doExecuteProgress(DailyProgressContext progressContext) {
Long uid = progressContext.getUid();
Integer partitionId = progressContext.getPartitionId();
String todayDate = getTodayDate(partitionId, progressContext.getCreateTime());
String todayDate = getTaskDate(partitionId, progressContext.getCreateTime());
taskStatus(uid, todayDate, DailyTaskTypeEnum.DAILY_SIGN).set(1, Duration.ofDays(EXPIRE_DAY));
}

View File

@@ -23,7 +23,7 @@ public class PlayGameHandler extends AbstractDailyTaskHandler {
public void doExecuteProgress(DailyProgressContext progressContext) {
Long uid = progressContext.getUid();
Integer partitionId = progressContext.getPartitionId();
String todayDate = getTodayDate(partitionId, progressContext.getCreateTime());
String todayDate = getTaskDate(partitionId, progressContext.getCreateTime());
RSet<String> playGameCategory = playGameCategory(uid, todayDate);
String gameId = progressContext.getGameId();
if (playGameCategory.contains(gameId)) {

View File

@@ -24,7 +24,7 @@ public class RecvLuckyGiftHandler extends AbstractDailyTaskHandler {
public void doExecuteProgress(DailyProgressContext progressContext) {
Long uid = progressContext.getUid();
Integer partitionId = progressContext.getPartitionId();
String todayDate = getTodayDate(partitionId, progressContext.getCreateTime());
String todayDate = getTaskDate(partitionId, progressContext.getCreateTime());
RBucket<Integer> taskStatus = taskStatus(uid, todayDate, DailyTaskTypeEnum.RECV_LUCKY_GIFT);
if (taskStatus.isExists()) {
return;

View File

@@ -25,7 +25,7 @@ public class RecvNomalGiftGoldHandler extends AbstractDailyTaskHandler {
public void doExecuteProgress(DailyProgressContext progressContext) {
Long uid = progressContext.getUid();
Integer partitionId = progressContext.getPartitionId();
String todayDate = getTodayDate(partitionId, progressContext.getCreateTime());
String todayDate = getTaskDate(partitionId, progressContext.getCreateTime());
RMap<Long, Long> recvGoldNum = recvGoldNum(partitionId, todayDate);
Long addAndGet = recvGoldNum.addAndGet(uid, progressContext.getRecvGoldNum());
recvGoldNum.expire(Duration.ofDays(EXPIRE_DAY));

View File

@@ -24,7 +24,7 @@ public class RecvNomalGiftHandler extends AbstractDailyTaskHandler {
public void doExecuteProgress(DailyProgressContext progressContext) {
Long uid = progressContext.getUid();
Integer partitionId = progressContext.getPartitionId();
String todayDate = getTodayDate(partitionId, progressContext.getCreateTime());
String todayDate = getTaskDate(partitionId, progressContext.getCreateTime());
RBucket<Integer> taskStatus = taskStatus(uid, todayDate, DailyTaskTypeEnum.RECV_NOMAL_GIFT);
if (taskStatus.isExists()) {
return;

View File

@@ -11,6 +11,7 @@ import com.accompany.business.service.room.RoomDayDiamondRewardService;
import com.accompany.business.service.room.RoomService;
import com.accompany.business.vo.dailytask.*;
import com.accompany.core.model.Room;
import com.accompany.core.model.Users;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -48,7 +49,12 @@ public class RoomDayDiamondHandler extends AbstractDailyTaskHandler {
String todayDate = context.getTodayDate();
dailyTaskRoomDiamondVo.setStatDate(todayDate);
Room roomByUid = roomService.getRoomByUid(uid);
dailyTaskRoomDiamondVo.setAvatar(roomByUid.getAvatar());
if (roomByUid == null) {
Users users = usersService.getUsersByUid(uid);
dailyTaskRoomDiamondVo.setAvatar(users.getAvatar());
} else {
dailyTaskRoomDiamondVo.setAvatar(roomByUid.getAvatar());
}
BigDecimal totalGoldNum = roomDayDiamondNumService.getGoldNum(partitionId, uid, todayDate);
dailyTaskRoomDiamondVo.setTotalGoldNum(totalGoldNum);
List<DailyTaskRoomDiamondDetailVo> rewardList = new ArrayList<>();

View File

@@ -19,7 +19,7 @@ public class RoomSendGiftHandler extends AbstractDailyTaskHandler {
public void doExecuteProgress(DailyProgressContext progressContext) {
Long uid = progressContext.getUid();
Integer partitionId = progressContext.getPartitionId();
String todayDate = getTodayDate(partitionId, progressContext.getCreateTime());
String todayDate = getTaskDate(partitionId, progressContext.getCreateTime());
RBucket<Integer> taskStatus = taskStatus(uid, todayDate, DailyTaskTypeEnum.ROOM_SEND_GIFT);
if (taskStatus.isExists()) {
return;

View File

@@ -99,4 +99,11 @@ public class GuildMemberService extends ServiceImpl<GuildMemberMapper, GuildMemb
public List<GuildMember> listGuildMemberByPartitionIdBetweenTime(Integer partitionId, Date startTime, Date endTime) {
return this.baseMapper.listGuildMemberByPartitionIdBetweenTime(partitionId, startTime, endTime);
}
public long countValidGuildMember(Integer partitionId) {
return this.lambdaQuery()
.eq(GuildMember::getPartitionId, partitionId)
.eq(GuildMember::getEnable, Boolean.TRUE)
.count();
}
}

View File

@@ -60,4 +60,8 @@ public class GuildMicStatisticsPolicy2Service extends ServiceImpl<GuildMicStatis
Integer minutes = baseMapper.getMinutes(partitionId, guildMemberId, statDate);
return minutes == null ? 0 : minutes;
}
public Integer countByPartitionDate(String statDate, Integer partitionId, Integer reachMinutes) {
return baseMapper.countByPartitionDate(statDate, partitionId, reachMinutes);
}
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.accompany.business.mybatismapper.dailytask.DailyTaskRecvCoinStatMapper">
</mapper>

View File

@@ -59,4 +59,13 @@
and guild_member_id = #{guildMemberId}
</select>
<select id="countByPartitionDate" resultType="java.lang.Integer">
select
count(sum(mic_minutes) > #{reachMinutes}) reachNum,
from guild_mic_statistics_policy2
where stat_date = #{statDate} and partition_id = #{partitionId}
</select>
</mapper>

View File

@@ -0,0 +1,40 @@
package com.accompany.scheduler.task.dailytask;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.service.dailytask.DailyTaskStatService;
import com.accompany.core.enumeration.PartitionEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
@Component
@Slf4j
public class DailyTaskStatTask {
@Autowired
private DailyTaskStatService dailyTaskStatService;
/**
* 公户月结算,用户明细
* 每月1号凌晨0点10分执行
*/
@Scheduled(cron = "20 0 0 * * ?")
public void dailyTaskStat4EnTask() {
Date date = new Date();
List<PartitionEnum> partitionEnumList = List.of(PartitionEnum.ENGLISH2);
for (PartitionEnum partitionEnum : partitionEnumList) {
try {
Date statDate = DateUtil.offsetDay(date, -1);
log.info("=-=dailyTaskStat4EnTask=-=:statDate:{}", DateUtil.formatDateTime(date));
dailyTaskStatService.statDailyCoinRecvStat(partitionEnum.getId(), DateUtil.formatDate(statDate));
log.info("=-=dailyTaskStat4EnTask=-= end");
} catch (Exception e) {
log.error("[dailyTaskStat4EnTask] 异常", e);
}
}
}
}