幸运活动数字-增加用户获奖的全平台通知

This commit is contained in:
2025-06-16 13:47:22 +08:00
parent 63eff47bc1
commit f19e249c67
7 changed files with 163 additions and 8 deletions

View File

@@ -303,6 +303,8 @@ public enum I18nAlertEnum {
USER_EVENT_SHARE_TEXT("快来加入我们一起聊天吧!{0}"),
GOLD_NAME("GOLD"),
MEDAL_EXPIRE_MSG("您的[{0}]已过期,已自动摘下"),
LUCKY_NUMBER_HAS_JACKPOT_SYS("恭喜 {0} 猜中本期Moli百万幸运数字:{1},一举斩获 {2} 金币大奖! \uD83C\uDFC6"),
;

View File

@@ -0,0 +1,18 @@
package com.accompany.business.vo.activity;
import com.accompany.business.vo.SimpleUserVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class LuckyNumberActOutputVo extends SimpleUserVo {
@ApiModelProperty("日期")
private String date;
@ApiModelProperty("幸运数字")
private Integer luckyNumber;
@ApiModelProperty("用户奖励")
private BigDecimal jackpot;
}

View File

@@ -17,4 +17,8 @@ public class LuckyNumberActRoundHistoryVo {
@ApiModelProperty(value = "结束时间")
private String endTime;
private String avatar;
private Long erbanNo;
private String nick;
}

View File

@@ -43,6 +43,13 @@ public class LuckyNumberActPlayerRecordService extends ServiceImpl<LuckyNumberAc
.orderByDesc(LuckyNumberActInputRecord::getDate));
}
public void pageHistoryOutput(Page<LuckyNumberActInputRecord> page, Integer partitionId) {
this.baseMapper.selectPage(page, Wrappers.<LuckyNumberActInputRecord>lambdaQuery()
.eq(LuckyNumberActInputRecord::getPartitionId, partitionId)
.gt(LuckyNumberActInputRecord::getOutput, 0)
.orderByDesc(LuckyNumberActInputRecord::getDate));
}
public BigDecimal getJackpot(String date, Long uid, Integer partitionId) {
LuckyNumberActInputRecord inputRecord = getOne(Wrappers.<LuckyNumberActInputRecord>lambdaQuery()
.eq(LuckyNumberActInputRecord::getDate, date)

View File

@@ -32,6 +32,12 @@ public class LuckyNumberActRoundService extends ServiceImpl<LuckyNumberActRoundM
.eq(LuckyNumberActRound::getPartitionId, partitionId));
}
public List<LuckyNumberActRound> getByDates(List<String> dates, Integer partitionId) {
return baseMapper.selectList(Wrappers.<LuckyNumberActRound>lambdaQuery()
.in(LuckyNumberActRound::getDate, dates)
.eq(LuckyNumberActRound::getPartitionId, partitionId));
}
public LuckyNumberActRound getOrDefault(String date, Integer partitionId) {
return getOrDefault(date, partitionId, false);
}

View File

@@ -9,15 +9,14 @@ import com.accompany.business.dto.activity.LuckyNumberActConfig;
import com.accompany.business.model.activity.LuckyNumberActInputRecord;
import com.accompany.business.model.activity.LuckyNumberActRound;
import com.accompany.business.model.activity.h5.ActivityH5AwardRecord;
import com.accompany.business.param.neteasepush.NeteaseSendMsgBatchParam;
import com.accompany.business.service.SendSysMsgService;
import com.accompany.business.service.activity.h5.ActivityH5AwardRecordService;
import com.accompany.business.service.purse.UserPurseService;
import com.accompany.business.service.record.BillRecordService;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.vo.activity.LuckyNumberActRoundHistoryDetailVo;
import com.accompany.business.vo.activity.LuckyNumberActRoundHistoryVo;
import com.accompany.business.vo.activity.LuckyNumberActRoundInputVo;
import com.accompany.business.vo.activity.LuckyNumberActRoundVo;
import com.accompany.business.vo.activity.*;
import com.accompany.common.config.SystemConfig;
import com.accompany.common.config.WebSecurityConfig;
import com.accompany.common.constant.Constant;
import com.accompany.common.push.MarkdownMessage;
@@ -29,10 +28,12 @@ import com.accompany.core.enumeration.I18nAlertEnum;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.accompany.core.mybatismapper.AccountLoginRecordMapperExpand;
import com.accompany.core.service.SysConfService;
import com.accompany.core.service.message.MessageRobotPushService;
import com.accompany.core.util.I18NMessageSourceUtil;
import com.accompany.core.vo.UserVo;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -51,6 +52,8 @@ import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import static com.accompany.business.service.SendSysMsgService.MSG_TYPE_FOR_TEXT;
@Slf4j
@Service
public class LuckyNumberActService {
@@ -75,6 +78,8 @@ public class LuckyNumberActService {
private MessageRobotPushService messageRobotPushService;
@Autowired
private WebSecurityConfig webSecurityConfig;
@Autowired
private AccountLoginRecordMapperExpand accountLoginRecordMapperExpand;
public LuckyNumberActRoundVo getRoundVo(Long uid) {
Users u = usersService.getNotNullUsersByUid(uid);
@@ -135,6 +140,41 @@ public class LuckyNumberActService {
}).collect(Collectors.toList());
}
public List<LuckyNumberActOutputVo> listHistoryOutput(Long uid) {
Users u = usersService.getNotNullUsersByUid(uid);
Page<LuckyNumberActInputRecord> page = new Page<>(1, 3, false);
Integer partitionId = u.getPartitionId();
playerRecordService.pageHistoryOutput(page, partitionId);
List<LuckyNumberActInputRecord> records = page.getRecords();
if (CollectionUtils.isEmpty(records)){
return Collections.emptyList();
}
Set<Long> uids = new HashSet<>();
Set<String> dateStrs = new HashSet<>();
for (LuckyNumberActInputRecord record : records) {
uids.add(record.getUid());
dateStrs.add(record.getDate());
}
Map<Long, Users> usersMap = usersService.getUsersMapByUids(new ArrayList<>(uids));
List<LuckyNumberActRound> roundByDates = roundService.getByDates(new ArrayList<>(dateStrs), partitionId);
Map<String, LuckyNumberActRound> roundMap = roundByDates.stream().collect(Collectors.toMap(LuckyNumberActRound::getDate, x -> x));
return records.stream().map(record -> {
LuckyNumberActOutputVo vo = new LuckyNumberActOutputVo();
Users users = usersMap.get(record.getUid());
vo.setUid(record.getUid());
vo.setErbanNo(users.getErbanNo());
vo.setAvatar(users.getAvatar());
vo.setNick(users.getNick());
vo.setDate(record.getDate());
LuckyNumberActRound round = roundMap.get(record.getDate());
vo.setLuckyNumber(round.getLuckyNumber());
return vo;
}).collect(Collectors.toList());
}
public List<LuckyNumberActRoundInputVo> listHistoryInput(Long uid) {
Users u = usersService.getNotNullUsersByUid(uid);
@@ -207,6 +247,42 @@ public class LuckyNumberActService {
roundService.updateJackpot(roundDate, u.getPartitionId(), input);
}
public void batchInput(Long uid, List<Integer> numbers){
for (Integer number : numbers) {
if (number < 0 || number >= 100){
throw new ServiceException(BusiStatus.PARAMERROR);
}
}
Users u = usersService.getNotNullUsersByUid(uid);
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(u.getPartitionId());
ZonedDateTime now = DateTimeUtil.getDateTimeByZoneId(partitionEnum.getZoneId());
LuckyNumberActConfig config = getConfig();
LocalDate today = LocalDate.now();
ZoneId zoneId = ZoneId.of(partitionEnum.getZoneId());
ZonedDateTime roundWaitTime = LocalDateTime.of(today, config.getRoundWaitTime()).atZone(zoneId);
if (now.compareTo(roundWaitTime) >= 0){
throw new ServiceException(BusiStatus.NOT_IN_ACT_TIME_RANGE);
}
String roundDate = now.format(DateTimeUtil.dateFormatter);
double price = config.getPrice().doubleValue() * numbers.size();
userPurseService.subDiamond(uid, price, BillObjTypeEnum.LUCKY_NUM_JACKPOT_INPUT_GOLD, (userPurse) -> {
String objId = String.join("_", roundDate, uid.toString(), u.getPartitionId().toString(), JSONObject.toJSONString(numbers));
billRecordService.insertGeneralBillRecord(uid, objId, BillObjTypeEnum.LUCKY_NUM_JACKPOT_INPUT_GOLD, price, userPurse);
});
BigDecimal input = config.getPrice().multiply(config.getJackpotRatio()).multiply(BigDecimal.valueOf(numbers.size())).setScale(2, RoundingMode.HALF_DOWN);
for (Integer number : numbers) {
playerRecordService.saveRecord(roundDate, uid, u.getPartitionId(), input, number);
}
roundService.updateJackpot(roundDate, u.getPartitionId(), input);
}
public void getJackpot(Long uid, String date) {
Users u = usersService.getNotNullUsersByUid(uid);
BigDecimal jackpot = playerRecordService.getJackpot(date, uid, u.getPartitionId());
@@ -420,11 +496,29 @@ public class LuckyNumberActService {
.eq(LuckyNumberActInputRecord::getLuckyStatus, Constant.StatusV2.valid));
String tip = I18NMessageSourceUtil.getMessage(I18nAlertEnum.LUCKY_NUMBER_HAS_JACKPOT_TIP, partitionId);
List<String> sysTip = new ArrayList<>();
for (LuckyNumberActInputRecord record : luckyPlayerRecordList){
sendSysMsgService.sendPersonTextMsg(record.getUid(), tip);
Users users = usersService.getUsersByUid(record.getUid());
sysTip.add(I18NMessageSourceUtil.getMessage(I18nAlertEnum.LUCKY_NUMBER_HAS_JACKPOT_SYS, new Object[]{users.getNick(), round.getLuckyNumber(), record.getOutput()}, partitionId));
}
sendLastRoundTip(date, partitionId);
for (String msg : sysTip) {
int page = 1;
int batchSize = 500;
for (List<Long> uidList = accountLoginRecordMapperExpand.getUidByRecent60Day(null, null, null, partitionId, 0, batchSize);
uidList != null && !uidList.isEmpty();
uidList = accountLoginRecordMapperExpand.getUidByRecent60Day(null, null, null, partitionId, (++page - 1) * batchSize, batchSize)) {
NeteaseSendMsgBatchParam neteaseSendMsgBatchParam = new NeteaseSendMsgBatchParam();
neteaseSendMsgBatchParam.setToAccids(uidList.stream().map(String::valueOf).collect(Collectors.toList()));
neteaseSendMsgBatchParam.setFromAccid(SystemConfig.systemMessageUid);
neteaseSendMsgBatchParam.setContent(msg);
neteaseSendMsgBatchParam.setType(MSG_TYPE_FOR_TEXT);
sendSysMsgService.sendBatchMsgMsg(neteaseSendMsgBatchParam);
}
}
}
private void sendLastRoundTip(String date, Integer partitionId){

View File

@@ -1,10 +1,8 @@
package com.accompany.business.controller.activity;
import cn.hippo4j.common.toolkit.CollectionUtil;
import com.accompany.business.service.activity.LuckyNumberActService;
import com.accompany.business.vo.activity.LuckyNumberActRoundHistoryDetailVo;
import com.accompany.business.vo.activity.LuckyNumberActRoundHistoryVo;
import com.accompany.business.vo.activity.LuckyNumberActRoundInputVo;
import com.accompany.business.vo.activity.LuckyNumberActRoundVo;
import com.accompany.business.vo.activity.*;
import com.accompany.common.annotation.Authorization;
import com.accompany.common.result.BusiResult;
import com.accompany.common.status.BusiStatus;
@@ -51,6 +49,15 @@ public class LuckyNumberActController {
return BusiResult.success(roundList);
}
@ApiOperation(value = "历史获奖数据")
@Authorization
@PostMapping(value = "/listHistoryOutput")
public BusiResult<List<LuckyNumberActOutputVo>> listHistoryOutput(){
Long uid = UidContextHolder.get();
List<LuckyNumberActOutputVo> roundList = actService.listHistoryOutput(uid);
return BusiResult.success(roundList);
}
@ApiOperation(value = "投入")
@ApiImplicitParams({
@ApiImplicitParam(name = "number", value = "数字", required = true)
@@ -67,6 +74,23 @@ public class LuckyNumberActController {
return BusiResult.success();
}
@ApiOperation(value = "投入")
@ApiImplicitParams({
@ApiImplicitParam(name = "number", value = "数字", required = true)
})
@Authorization
@PostMapping(value = "/batchInput")
public BusiResult<Void> batchInput(List<Integer> numbers){
if (CollectionUtil.isEmpty(numbers)){
throw new ServiceException(BusiStatus.PARAMERROR);
}
Long uid = UidContextHolder.get();
actService.batchInput(uid, numbers);
return BusiResult.success();
}
@ApiOperation(value = "我的历史")
@Authorization
@PostMapping(value = "/listHistoryInput")