xiaoyong931011
2021-12-07 03a30ab3d3922c9a7306b775e2b27ddf233d287b
20211207  fish
6 files modified
6 files added
297 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/fish/controller/MemberCannonController.java 26 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/fish/dao/CannonOwnRecordDao.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/fish/dto/LotteryDrawDto.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/fish/entity/CannonAccountMoneyChange.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/fish/entity/CannonAward.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/fish/entity/CannonAwardSet.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/fish/service/MemberCannonService.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/fish/service/impl/MemberCannonServiceImpl.java 108 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/fish/vo/AwardVo.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/fish/vo/AwardsVo.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/fish/vo/CannonAwardVo.java 16 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/fish/CannonOwnRecordDao.xml 43 ●●●●● patch | view | raw | blame | history
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>