幸运数字-领取和轮次结果

This commit is contained in:
khalil
2025-04-29 15:39:04 +08:00
parent cc274dedc6
commit 27ae2cf61f
11 changed files with 313 additions and 67 deletions

View File

@@ -20,6 +20,7 @@ public class LuckyNumberActInputRecord {
@TableField(typeHandler = IntegerListTypeHandler.class)
private List<Integer> numberList;
private Byte luckyStatus;
private BigDecimal output;
private Date createTime;
private Date updateTime;

View File

@@ -0,0 +1,29 @@
package com.accompany.business.vo.activity;
import com.accompany.core.vo.UserVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel
public class LuckyNumberActRoundHistoryDetailVo extends LuckyNumberActRoundHistoryVo {
@ApiModelProperty("状态(-1=过期0=没有1=已领取")
private Byte status;
@ApiModelProperty("用户奖励")
private BigDecimal jackpot;
@ApiModelProperty("已领取用户列表")
private List<ReceiverVo> receiverList;
@Data
public static class ReceiverVo extends UserVo {
private String receiveTime;
private BigDecimal jackpot;
}
}

View File

@@ -0,0 +1,20 @@
package com.accompany.business.vo.activity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel
public class LuckyNumberActRoundHistoryVo {
@ApiModelProperty(value = "日期")
private String date;
@ApiModelProperty(value = "分区id")
private Integer partitionId;
@ApiModelProperty(value = "幸运号码")
private Integer luckyNumber;
@ApiModelProperty(value = "结束时间")
private String endTime;
}

View File

@@ -0,0 +1,25 @@
package com.accompany.business.vo.activity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel
public class LuckyNumberActRoundInputVo {
@ApiModelProperty(value = "日期")
private String date;
@ApiModelProperty(value = "幸运号码")
private Integer luckyNumber;
@ApiModelProperty(value = "开奖时间")
private String endTime;
@ApiModelProperty(value = "我的幸运号码列表")
private List<Integer> numberList;
//@ApiModelProperty(value = "状态(-1=没中、0=未结算、1=可领、2=已领取、3=过期)")
@ApiModelProperty(value = "状态(-1=过期、0=没中or已领、1=可领)")
private Byte status;
}

View File

@@ -13,11 +13,20 @@ public class LuckyNumberActRoundVo {
@ApiModelProperty(value = "日期")
private String date;
@ApiModelProperty(value = "分区id")
private Integer partitionId;
@ApiModelProperty(value = "幸运号码")
@ApiModelProperty(value = "参与玩家数量")
private Integer playerNum;
private Long uid;
@ApiModelProperty(value = "玩家本轮投入号码")
private List<Integer> numberList;
@ApiModelProperty(value = "活动状态(0=可投入、1=停止投入原地等待、2=结果展示)")
private Byte status;
@ApiModelProperty(value = "倒计时秒数")
private Long countDownSecond;
@ApiModelProperty(value = "中奖号码")
private Integer luckyNumber;
@ApiModelProperty(value = "结束时间")
private String endTime;
@ApiModelProperty(value = "投入")
private BigDecimal price;
}

View File

@@ -1,32 +0,0 @@
package com.accompany.business.vo.activity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel
public class LuckyNumberActVo {
@ApiModelProperty(value = "日期")
private String date;
@ApiModelProperty(value = "参与玩家数量")
private Integer playerNum;
private Long uid;
@ApiModelProperty(value = "玩家本轮投入号码")
private List<Integer> numberList;
@ApiModelProperty(value = "活动状态(0=可投入、1=停止投入原地等待、2=结果展示)")
private Byte status;
@ApiModelProperty(value = "倒计时秒数")
private Long countDownSecond;
@ApiModelProperty(value = "中奖号码")
private Integer luckyNumber;
@ApiModelProperty(value = "投入")
private BigDecimal price;
}

View File

@@ -3,16 +3,18 @@ package com.accompany.business.service.activity;
import com.accompany.business.model.activity.LuckyNumberActInputRecord;
import com.accompany.business.mybatismapper.activity.LuckyNumberActInputRecordMapper;
import com.accompany.common.constant.Constant;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.exception.ServiceException;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
@@ -33,4 +35,32 @@ public class LuckyNumberActPlayerRecordService extends ServiceImpl<LuckyNumberAc
inputRecord.getNumberList();
}
public void pageHistory(Page<LuckyNumberActInputRecord> page, Long uid, Integer partitionId) {
this.baseMapper.selectPage(page, Wrappers.<LuckyNumberActInputRecord>lambdaQuery()
.eq(LuckyNumberActInputRecord::getUid, uid)
.eq(LuckyNumberActInputRecord::getPartitionId, partitionId)
.ne(LuckyNumberActInputRecord::getLuckyStatus, Constant.StatusV2.invalid)
.orderByDesc(LuckyNumberActInputRecord::getDate));
}
public BigDecimal getJackpot(String date, Long uid, Integer partitionId) {
LuckyNumberActInputRecord inputRecord = getOne(Wrappers.<LuckyNumberActInputRecord>lambdaQuery()
.select(LuckyNumberActInputRecord::getNumberList)
.eq(LuckyNumberActInputRecord::getDate, date)
.eq(LuckyNumberActInputRecord::getUid, uid)
.eq(LuckyNumberActInputRecord::getPartitionId, partitionId), false);
if (null == inputRecord || !inputRecord.getLuckyStatus().equals(Constant.StatusV2.valid)){
throw new ServiceException(BusiStatus.PARAMERROR);
}
boolean success = update(Wrappers.<LuckyNumberActInputRecord>lambdaUpdate()
.set(LuckyNumberActInputRecord::getLuckyStatus, Constant.status.invalid)
.eq(LuckyNumberActInputRecord::getDate, date)
.eq(LuckyNumberActInputRecord::getUid, uid)
.eq(LuckyNumberActInputRecord::getPartitionId, partitionId)
.eq(LuckyNumberActInputRecord::getLuckyStatus, Constant.StatusV2.valid));
if (!success){
throw new ServiceException(BusiStatus.PARAMERROR);
}
return inputRecord.getOutput();
}
}

View File

@@ -11,6 +11,8 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
@@ -48,4 +50,11 @@ public class LuckyNumberActRoundService extends ServiceImpl<LuckyNumberActRoundM
baseMapper.updateJackpot(roundId, partitionId, input);
}
public Map<String, LuckyNumberActRound> mapHistoryRoundInDate(List<String> dateList, Integer partitionId) {
return baseMapper.selectList(Wrappers.<LuckyNumberActRound>lambdaQuery()
.in(LuckyNumberActRound::getDate, dateList)
.eq(LuckyNumberActRound::getPartitionId, partitionId))
.stream()
.collect(Collectors.toMap(LuckyNumberActRound::getDate, v -> v));
}
}

View File

@@ -2,12 +2,15 @@
package com.accompany.business.service.activity;
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.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.LuckyNumberActVo;
import com.accompany.common.constant.Constant;
import com.accompany.common.status.BusiStatus;
import com.accompany.common.utils.DateTimeUtil;
@@ -16,11 +19,15 @@ import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.accompany.core.service.SysConfService;
import com.accompany.core.vo.UserVo;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@@ -29,6 +36,8 @@ import java.math.RoundingMode;
import java.time.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Slf4j
@@ -48,7 +57,7 @@ public class LuckyNumberActService {
@Autowired
private LuckyNumberActPlayerRecordService playerRecordService;
public LuckyNumberActVo getConfigVo(Long uid) {
public LuckyNumberActRoundVo getRoundVo(Long uid) {
Users u = usersService.getNotNullUsersByUid(uid);
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(u.getPartitionId());
ZonedDateTime now = DateTimeUtil.getDateTimeByZoneId(partitionEnum.getZoneId());
@@ -70,7 +79,7 @@ public class LuckyNumberActService {
long countDownSecond = status != Constant.status.valid? Duration.between(now, roundEndTime).getSeconds(): 0L;
LuckyNumberActVo vo = new LuckyNumberActVo();
LuckyNumberActRoundVo vo = new LuckyNumberActRoundVo();
vo.setUid(uid);
vo.setDate(date);
vo.setStatus(status);
@@ -82,6 +91,63 @@ public class LuckyNumberActService {
return vo;
}
public List<LuckyNumberActRoundHistoryVo> listHistoryRound(Long uid) {
Users u = usersService.getNotNullUsersByUid(uid);
Page<LuckyNumberActRound> page = new Page<>(1, 30);
roundService.pageHistory(page, u.getPartitionId());
if (CollectionUtils.isEmpty(page.getRecords())){
return Collections.emptyList();
}
return page.getRecords().stream().map(round -> {
LuckyNumberActRoundHistoryVo vo = new LuckyNumberActRoundHistoryVo();
vo.setDate(round.getDate());
vo.setPartitionId(round.getPartitionId());
vo.setLuckyNumber(round.getLuckyNumber());
ZonedDateTime zdt = ZonedDateTime.parse(round.getEndTime(), DateTimeUtil.zoneDatetimeFormatter);
vo.setEndTime(zdt.format(DateTimeUtil.dateHourFormatter));
return vo;
}).collect(Collectors.toList());
}
public List<LuckyNumberActRoundInputVo> listHistoryInput(Long uid) {
Users u = usersService.getNotNullUsersByUid(uid);
Page<LuckyNumberActInputRecord> page = new Page<>(1, 30);
playerRecordService.pageHistory(page, uid, u.getPartitionId());
if (CollectionUtils.isEmpty(page.getRecords())){
return Collections.emptyList();
}
List<String> dateList = page.getRecords().stream().map(LuckyNumberActInputRecord::getDate).distinct().sorted().collect(Collectors.toList());
Map<String, LuckyNumberActRound> roundMap = roundService.mapHistoryRoundInDate(dateList, u.getPartitionId());
return page.getRecords().stream().map(record -> {
LuckyNumberActRound round = roundMap.get(record.getDate());
if (round == null){
return null;
}
LuckyNumberActRoundInputVo vo = new LuckyNumberActRoundInputVo();
vo.setDate(record.getDate());
vo.setEndTime(round.getEndTime());
vo.setLuckyNumber(round.getLuckyNumber());
vo.setNumberList(record.getNumberList());
byte status = Constant.status.valid.equals(record.getLuckyStatus()) ?
record.getLuckyStatus():
Constant.StatusV2.valid + Constant.status.invalid == record.getLuckyStatus()?
Constant.StatusV2.delete: Constant.StatusV2.invalid;
vo.setStatus(status);
return vo;
}).filter(Objects::nonNull).collect(Collectors.toList());
}
public void input(Long uid, Integer number){
if (number <= 0 || number >= 100){
throw new ServiceException(BusiStatus.PARAMERROR);
@@ -105,7 +171,7 @@ public class LuckyNumberActService {
double price = config.getPrice().doubleValue();
userPurseService.subDiamond(uid, price, BillObjTypeEnum.LUCKY_NUM_JACKPOT_INPUT_GOLD, (userPurse) -> {
String objId = String.join("_", roundDate, number.toString());
String objId = String.join("_", roundDate, uid.toString(), u.getPartitionId().toString(), number.toString());
billRecordService.insertGeneralBillRecord(uid, objId, BillObjTypeEnum.LUCKY_NUM_JACKPOT_INPUT_GOLD, price, userPurse);
});
@@ -115,27 +181,78 @@ public class LuckyNumberActService {
roundService.updateJackpot(roundDate, u.getPartitionId(), input);
}
public List<LuckyNumberActRoundVo> listHistory(Long uid) {
@Transactional(rollbackFor = Exception.class)
public void getJackpot(Long uid, String date) {
Users u = usersService.getNotNullUsersByUid(uid);
BigDecimal jackpot = playerRecordService.getJackpot(date, uid, u.getPartitionId());
Page<LuckyNumberActRound> page = new Page<>(1, 15);
roundService.pageHistory(page, u.getPartitionId());
double output = jackpot.doubleValue();
userPurseService.addDiamond(uid, output, BillObjTypeEnum.LUCKY_NUM_JACKPOT_OUTPUT_GOLD, (userPurse) -> {
String objId = String.join("_", date, uid.toString(), u.getPartitionId().toString());
billRecordService.insertGeneralBillRecord(uid, objId, BillObjTypeEnum.LUCKY_NUM_JACKPOT_OUTPUT_GOLD, output, userPurse);
});
}
if (CollectionUtils.isEmpty(page.getRecords())){
return Collections.emptyList();
public LuckyNumberActRoundHistoryDetailVo getHistoryRoundDetail(Long uid, String date) {
Users u = usersService.getNotNullUsersByUid(uid);
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(u.getPartitionId());
LuckyNumberActRound round = roundService.getByDate(date, u.getPartitionId());
if (null == round || null == round.getLuckyNumber()){
throw new ServiceException(BusiStatus.PARAMERROR);
}
return page.getRecords().stream().map(round -> {
LuckyNumberActRoundVo vo = new LuckyNumberActRoundVo();
vo.setDate(round.getDate());
vo.setPartitionId(round.getPartitionId());
vo.setLuckyNumber(round.getLuckyNumber());
LuckyNumberActInputRecord meRecord = playerRecordService.getOne(Wrappers.<LuckyNumberActInputRecord>lambdaQuery()
.eq(LuckyNumberActInputRecord::getDate, date)
.eq(LuckyNumberActInputRecord::getUid, uid)
.eq(LuckyNumberActInputRecord::getPartitionId, u.getPartitionId()));
if (null == meRecord){
throw new ServiceException(BusiStatus.PARAMERROR);
}
ZonedDateTime zdt = ZonedDateTime.parse(round.getEndTime(), DateTimeUtil.zoneDatetimeFormatter);
vo.setEndTime(zdt.format(DateTimeUtil.dateHourFormatter));
List<LuckyNumberActInputRecord> receiverRecordList = playerRecordService.list(Wrappers.<LuckyNumberActInputRecord>lambdaQuery()
.eq(LuckyNumberActInputRecord::getDate, date)
.eq(LuckyNumberActInputRecord::getPartitionId, u.getPartitionId())
.eq(LuckyNumberActInputRecord::getLuckyStatus, Constant.status.invalid)
.orderByAsc(LuckyNumberActInputRecord::getUpdateTime));
LuckyNumberActRoundHistoryDetailVo vo = new LuckyNumberActRoundHistoryDetailVo();
vo.setDate(round.getDate());
vo.setPartitionId(round.getPartitionId());
Byte status = Constant.status.invalid.equals(meRecord.getLuckyStatus()) ?
Constant.StatusV2.valid:
Constant.StatusV2.valid + Constant.status.invalid == meRecord.getLuckyStatus()?
Constant.StatusV2.delete: Constant.StatusV2.invalid;
vo.setStatus(status);
vo.setJackpot(round.getJackpot());
if (CollectionUtils.isEmpty(receiverRecordList)){
return vo;
}).collect(Collectors.toList());
}
List<Long> uidList = receiverRecordList.stream().map(LuckyNumberActInputRecord::getUid).sorted().collect(Collectors.toList());
Map<Long, UserVo> userVoMap = usersService.getUsersVoListByUids(uidList).stream().collect(Collectors.toMap(UserVo::getUid, userVo -> userVo));
List<LuckyNumberActRoundHistoryDetailVo.ReceiverVo> receiverVoList = receiverRecordList.stream().map(record -> {
UserVo userVo = userVoMap.get(record.getUid());
if (null == userVo){
return null;
}
LuckyNumberActRoundHistoryDetailVo.ReceiverVo receiverVo = new LuckyNumberActRoundHistoryDetailVo.ReceiverVo();
BeanUtils.copyProperties(userVo, receiverVo);
receiverVo.setJackpot(record.getOutput());
ZonedDateTime zdt = DateTimeUtil.convertWithZoneId(record.getUpdateTime(), partitionEnum.getZoneId());
receiverVo.setReceiveTime(zdt.format(DateTimeUtil.datetimeFormatter));
return receiverVo;
}).filter(Objects::nonNull).collect(Collectors.toList());
vo.setReceiverList(receiverVoList);
return vo;
}
private LuckyNumberActConfig getConfig() {

View File

@@ -3,8 +3,8 @@
<mapper namespace="com.accompany.business.mybatismapper.activity.LuckyNumberActInputRecordMapper">
<update id="saveRecord">
insert into lucky_number_act_input_record(date, uid, partition_id, `input`, number_list, lucky_status, create_time, update_time)
values(#{date}, #{uid}, #{partitionId}, #{input}, JSON_ARRAY(#{number}), 0, now(), now())
insert into lucky_number_act_input_record(date, uid, partition_id, `input`, number_list, lucky_status, `output`, create_time, update_time)
values(#{date}, #{uid}, #{partitionId}, #{input}, JSON_ARRAY(#{number}), 0, 0, now(), now())
on duplicate key update
`input` = input + values(`input`),
number_list = JSON_ARRAY_APPEND(number_list, '$', #{number}),

View File

@@ -1,8 +1,10 @@
package com.accompany.business.controller.activity;
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.LuckyNumberActVo;
import com.accompany.common.annotation.Authorization;
import com.accompany.common.result.BusiResult;
import com.accompany.common.status.BusiStatus;
@@ -12,6 +14,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -30,13 +33,22 @@ public class LuckyNumberActController {
@ApiOperation(value = "获取活动首页")
@Authorization
@GetMapping(value = "/getConfig")
public BusiResult<LuckyNumberActVo> getWeekStarList(){
@GetMapping(value = "/getRound")
public BusiResult<LuckyNumberActRoundVo> getRound(){
Long uid = UidContextHolder.get();
LuckyNumberActVo vo = actService.getConfigVo(uid);
LuckyNumberActRoundVo vo = actService.getRoundVo(uid);
return BusiResult.success(vo);
}
@ApiOperation(value = "历史轮次")
@Authorization
@PostMapping(value = "/listHistoryRound")
public BusiResult<List<LuckyNumberActRoundHistoryVo>> listHistoryRound(){
Long uid = UidContextHolder.get();
List<LuckyNumberActRoundHistoryVo> roundList = actService.listHistoryRound(uid);
return BusiResult.success(roundList);
}
@ApiOperation(value = "投入")
@Authorization
@PostMapping(value = "/input")
@@ -50,13 +62,39 @@ public class LuckyNumberActController {
return BusiResult.success();
}
@ApiOperation(value = "历史轮次")
@ApiOperation(value = "我的历史")
@Authorization
@PostMapping(value = "/listHistory")
public BusiResult<List<LuckyNumberActRoundVo>> listHistory(){
@PostMapping(value = "/listHistoryInput")
public BusiResult<List<LuckyNumberActRoundInputVo>> listHistoryInput(){
Long uid = UidContextHolder.get();
List<LuckyNumberActRoundVo> roundList = actService.listHistory(uid);
return BusiResult.success(roundList);
List<LuckyNumberActRoundInputVo> historyInputList = actService.listHistoryInput(uid);
return BusiResult.success(historyInputList);
}
@ApiOperation(value = "领取")
@Authorization
@PostMapping(value = "/getJackpot")
public BusiResult<Void> getJackpot(String date){
if (!StringUtils.hasText(date)){
throw new ServiceException(BusiStatus.PARAMERROR);
}
Long uid = UidContextHolder.get();
actService.getJackpot(uid, date);
return BusiResult.success();
}
@ApiOperation(value = "历史轮次详情")
@Authorization
@PostMapping(value = "/getHistoryRoundDetail")
public BusiResult<LuckyNumberActRoundHistoryDetailVo> getHistoryRoundDetail(String date){
if (!StringUtils.hasText(date)){
throw new ServiceException(BusiStatus.PARAMERROR);
}
Long uid = UidContextHolder.get();
LuckyNumberActRoundHistoryDetailVo detailVo = actService.getHistoryRoundDetail(uid, date);
return BusiResult.success(detailVo);
}
}