src/main/java/com/xcong/excoin/modules/fish/controller/MemberCannonController.java
@@ -5,10 +5,7 @@ import com.xcong.excoin.modules.coin.parameter.vo.OrderWalletCoinDealVo; import com.xcong.excoin.modules.fish.dto.*; import com.xcong.excoin.modules.fish.service.MemberCannonService; import com.xcong.excoin.modules.fish.vo.AccountAvaBanlaceVo; import com.xcong.excoin.modules.fish.vo.CannonSettingVo; import com.xcong.excoin.modules.fish.vo.GoldAccountVo; import com.xcong.excoin.modules.fish.vo.OwnCannonVo; import com.xcong.excoin.modules.fish.vo.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; @@ -104,4 +101,25 @@ return memberCannonService.fishing(fishingDto); } /** * 获取奖品列表 */ @ApiOperation(value="获取奖品列表", notes="获取奖品列表") @ApiResponses({@ApiResponse( code = 200, message = "success", response = AwardsVo.class)}) @GetMapping(value="/getAwards") public Result getAwards() { return memberCannonService.getAwards(); } /** *点击抽奖 */ @ApiOperation(value = "点击抽奖") @PostMapping(value = "/lotteryDraw") public Result lotteryDraw(@RequestBody @Valid LotteryDrawDto lotteryDrawDto) { return memberCannonService.lotteryDraw(lotteryDrawDto); } } src/main/java/com/xcong/excoin/modules/fish/dao/CannonOwnRecordDao.java
@@ -1,10 +1,15 @@ package com.xcong.excoin.modules.fish.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xcong.excoin.modules.fish.entity.CannonAccountMoneyChange; import com.xcong.excoin.modules.fish.entity.CannonAward; import com.xcong.excoin.modules.fish.entity.CannonAwardSet; import com.xcong.excoin.modules.fish.entity.CannonOwnRecord; import com.xcong.excoin.modules.fish.vo.AwardsVo; import com.xcong.excoin.modules.fish.vo.OwnCannonVo; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; import java.util.List; public interface CannonOwnRecordDao extends BaseMapper<CannonOwnRecord> { @@ -14,4 +19,14 @@ List<OwnCannonVo> selectCannonOwnRecordsByMemberId(@Param("memberId")Long memberId); List<CannonOwnRecord> selectCannonOwnRecordsByIdAndMemberId(@Param("id")Long cannonOwnId, @Param("memberId")Long memberId); AwardsVo getAwards(); CannonAwardSet getCannonAwardSet(); List<CannonAward> selectCannonAward(); CannonAward selectCannonAwardByCode(@Param("code")String code); Integer selectCannonAccountMoneyChangeByMemberId(@Param("memberId")Long memberId); } src/main/java/com/xcong/excoin/modules/fish/dto/LotteryDrawDto.java
New file @@ -0,0 +1,9 @@ package com.xcong.excoin.modules.fish.dto; import io.swagger.annotations.ApiModel; import lombok.Data; @Data @ApiModel(value = "LotteryDrawDto", description = "参数类") public class LotteryDrawDto { } src/main/java/com/xcong/excoin/modules/fish/entity/CannonAccountMoneyChange.java
@@ -16,7 +16,7 @@ private Long memberId; //金额 private BigDecimal amount; //1:USDT购买炮台 2:金币兑换1代币 3:1代币兑换金币 //1:USDT购买炮台 2:金币兑换1代币 3:1代币兑换金币 4:抽奖记录 private Integer type; //内容 private String content; src/main/java/com/xcong/excoin/modules/fish/entity/CannonAward.java
New file @@ -0,0 +1,22 @@ package com.xcong.excoin.modules.fish.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; @Data @TableName("cannon_award") public class CannonAward { private Long id; private String name; //活动编码 private String code; private Integer quantity; private Integer surplusQuantity; private Integer type; private Integer state; private Integer chance; private String activityCode; } src/main/java/com/xcong/excoin/modules/fish/entity/CannonAwardSet.java
New file @@ -0,0 +1,18 @@ package com.xcong.excoin.modules.fish.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; @Data @TableName("cannon_award_set") public class CannonAwardSet { private Long id; //每次消耗USDT数量 private BigDecimal consume; //活动编码 private String code; } src/main/java/com/xcong/excoin/modules/fish/service/MemberCannonService.java
@@ -27,4 +27,8 @@ Result fishing(FishingDto fishingDto); Result getAccountAvaBanlace(); Result getAwards(); Result lotteryDraw(LotteryDrawDto lotteryDrawDto); } src/main/java/com/xcong/excoin/modules/fish/service/impl/MemberCannonServiceImpl.java
@@ -3,6 +3,8 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.UUID; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -14,10 +16,7 @@ import com.xcong.excoin.modules.fish.dto.*; import com.xcong.excoin.modules.fish.entity.*; import com.xcong.excoin.modules.fish.service.MemberCannonService; import com.xcong.excoin.modules.fish.vo.AccountAvaBanlaceVo; import com.xcong.excoin.modules.fish.vo.CannonSettingVo; import com.xcong.excoin.modules.fish.vo.GoldAccountVo; import com.xcong.excoin.modules.fish.vo.OwnCannonVo; import com.xcong.excoin.modules.fish.vo.*; import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao; import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity; import com.xcong.excoin.utils.RedisUtils; @@ -279,6 +278,107 @@ return Result.ok(accountAvaBanlaceVo); } @Override public Result getAwards() { Long memberId = LoginUserUtils.getAppLoginUser().getId(); AwardsVo awardsVo = cannonOwnRecordDao.getAwards(); return Result.ok(awardsVo); } @Override public Result lotteryDraw(LotteryDrawDto lotteryDrawDto) { Long memberId = LoginUserUtils.getAppLoginUser().getId(); //获取每次抽奖需要的USDT数量 CannonAwardSet cannonAwardSet = cannonOwnRecordDao.getCannonAwardSet(); if(ObjectUtil.isEmpty(cannonAwardSet)){ Result.fail("活动还没开始,请稍候"); } BigDecimal consume = cannonAwardSet.getConsume() == null ? BigDecimal.ZERO : cannonAwardSet.getConsume(); if(consume.compareTo(BigDecimal.ZERO) <= 0){ Result.fail("活动还没开始,请稍候"); } //验证账户USDT余额是否足够 MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name()); BigDecimal availableBalance = memberWalletCoinEntity.getAvailableBalance() == null ? BigDecimal.ZERO : memberWalletCoinEntity.getAvailableBalance(); if(availableBalance.compareTo(consume) < 0){ Result.fail("用户USDT余额不足"); } //用户USDT余额减少 coinService.updateWalletBalance(memberWalletCoinEntity.getId(),consume.negate(),consume.negate(),null); //增加一条抽奖记录 CannonAccountMoneyChange cannonAccountMoneyChange = new CannonAccountMoneyChange(); cannonAccountMoneyChange.setMemberId(memberId); cannonAccountMoneyChange.setAmount(consume); cannonAccountMoneyChange.setType(4); cannonAccountMoneyChange.setContent("抽奖"); cannonAccountMoneyChange.setChangeBalance(consume); cannonAccountMoneyChange.setChangeBefore(memberWalletCoinEntity.getAvailableBalance()); cannonAccountMoneyChange.setChangeAfter(memberWalletCoinEntity.getAvailableBalance().subtract(consume)); cannonAccountMoneyChangeDao.insert(cannonAccountMoneyChange); //抽奖品 CannonAwardVo award = getAward(memberId); return Result.ok(award); } private CannonAwardVo getAward(Long memberId) { CannonAwardVo cannonAwardVo = new CannonAwardVo(); //获取所有的奖品列表 List<CannonAward> cannonAwards = cannonOwnRecordDao.selectCannonAward(); if(CollUtil.isNotEmpty(cannonAwards)){ CannonAward cannonAward = RandomUtil.randomEle(cannonAwards); //获得金币 if(cannonAward.getCode() == "GOLD"){ BigDecimal quantity = new BigDecimal(cannonAward.getQuantity()); MemberAccountGold memberAccountGold = memberAccountGoldDao.selectAccountGoldByMemberId(memberId); memberCannonService.updateTotalBalanceAndAvailableBalance(memberAccountGold.getId(),quantity,quantity,null); cannonAwardVo.setName(cannonAward.getName()); cannonAwardVo.setQuantity(cannonAward.getQuantity()); }else if(cannonAward.getCode() == "COIN"){ BigDecimal quantity = new BigDecimal(cannonAward.getQuantity()); MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.XCC.name()); coinService.updateWalletBalance(memberWalletCoinEntity.getId(),quantity,quantity,null); cannonAwardVo.setName(cannonAward.getName()); cannonAwardVo.setQuantity(cannonAward.getQuantity()); }else if(cannonAward.getCode() == "USDT"){ BigDecimal quantity = new BigDecimal(cannonAward.getQuantity()); MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name()); coinService.updateWalletBalance(memberWalletCoinEntity.getId(),quantity,quantity,null); cannonAwardVo.setName(cannonAward.getName()); cannonAwardVo.setQuantity(cannonAward.getQuantity()); }else{ CannonSetting cannonSetting = cannonSettingDao.selectCannonSettingByCannonCode(cannonAward.getCode()); List<CannonOwnRecord> cannonOwnRecords = cannonOwnRecordDao.selectCannonOwnRecordsByMemberIdAndCannonCode(memberId, cannonAward.getCode()); Integer cannonAccountMoneyChanges = cannonOwnRecordDao.selectCannonAccountMoneyChangeByMemberId(memberId); //抽奖次数小于十次的抽不到炮台 if(CollUtil.isEmpty(cannonOwnRecords) && cannonAccountMoneyChanges > 10){ //增加一条拥有记录【cannon_own_record】 CannonOwnRecord cannonOwnRecord = new CannonOwnRecord(); cannonOwnRecord.setMemberId(memberId); cannonOwnRecord.setCannonUuid(UUID.randomUUID().toString()); cannonOwnRecord.setCannonCode(cannonSetting.getCode()); cannonOwnRecord.setCannonName(cannonSetting.getName()); cannonOwnRecord.setCannonPrice(cannonSetting.getExchangePrice()); cannonOwnRecord.setType(1); cannonOwnRecordDao.insert(cannonOwnRecord); cannonAwardVo.setName(cannonAward.getName()); cannonAwardVo.setQuantity(cannonAward.getQuantity()); }else{ CannonAward cannonAwardGold = cannonOwnRecordDao.selectCannonAwardByCode("GOLD"); BigDecimal quantity = new BigDecimal(cannonAwardGold.getQuantity()); MemberAccountGold memberAccountGold = memberAccountGoldDao.selectAccountGoldByMemberId(memberId); memberCannonService.updateTotalBalanceAndAvailableBalance(memberAccountGold.getId(),quantity,quantity,null); cannonAwardVo.setName(cannonAwardGold.getName()); cannonAwardVo.setQuantity(cannonAwardGold.getQuantity()); } } } return cannonAwardVo; } public static void main(String[] args) { System.out.println(UUID.randomUUID().toString()); } src/main/java/com/xcong/excoin/modules/fish/vo/AwardVo.java
New file @@ -0,0 +1,14 @@ package com.xcong.excoin.modules.fish.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "AwardVo", description = "") public class AwardVo { @ApiModelProperty(value = "奖品名称") private String name; } src/main/java/com/xcong/excoin/modules/fish/vo/AwardsVo.java
New file @@ -0,0 +1,20 @@ package com.xcong.excoin.modules.fish.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data @ApiModel(value = "AwardsVo", description = "") public class AwardsVo { @ApiModelProperty(value = "奖品") private List<AwardVo> awardVo; @ApiModelProperty(value = "每次参与消耗USDT数量") private BigDecimal consume; } src/main/java/com/xcong/excoin/modules/fish/vo/CannonAwardVo.java
New file @@ -0,0 +1,16 @@ package com.xcong.excoin.modules.fish.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "CannonAwardVo", description = "") public class CannonAwardVo { @ApiModelProperty(value = "奖品名称") private String name; @ApiModelProperty(value = "奖品数量") private Integer quantity; } src/main/resources/mapper/fish/CannonOwnRecordDao.xml
@@ -18,4 +18,47 @@ select a.* from cannon_own_record a where a.member_id = #{memberId} and a.id = #{id} </select> <resultMap id="awardsMap" type="com.xcong.excoin.modules.fish.vo.AwardsVo"> <result property="consume" column="consume" /> <collection property="awardVo" ofType="com.xcong.excoin.modules.fish.vo.AwardVo" > <result property="name" column="name" /> </collection> </resultMap> <select id="getAwards" resultMap="awardsMap"> select a.consume, b.name from cannon_award_set a inner join cannon_award b on a.code = b.activity_code where b.type = 1; </select> <select id="getCannonAwardSet" resultType="com.xcong.excoin.modules.fish.entity.CannonAwardSet"> select a.* from cannon_award_set a </select> <select id="selectCannonAward" resultType="com.xcong.excoin.modules.fish.entity.CannonAward"> select a.* from cannon_award a where a.type = 1; </select> <select id="selectCannonAwardByCode" resultType="com.xcong.excoin.modules.fish.entity.CannonAward"> select a.* from cannon_award a where a.code = #{code} </select> <select id="selectCannonAccountMoneyChangeByMemberId" resultType="java.lang.Integer"> select COUNT(a.id) from cannon_account_money_change a where a.type = 4 </select> </mapper>