From 03a30ab3d3922c9a7306b775e2b27ddf233d287b Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Tue, 07 Dec 2021 14:10:45 +0800
Subject: [PATCH] 20211207  fish

---
 src/main/java/com/xcong/excoin/modules/fish/service/impl/MemberCannonServiceImpl.java |  108 ++++++++++++++++++++
 src/main/java/com/xcong/excoin/modules/fish/dao/CannonOwnRecordDao.java               |   15 +++
 src/main/resources/mapper/fish/CannonOwnRecordDao.xml                                 |   43 ++++++++
 src/main/java/com/xcong/excoin/modules/fish/vo/CannonAwardVo.java                     |   16 +++
 src/main/java/com/xcong/excoin/modules/fish/entity/CannonAward.java                   |   22 ++++
 src/main/java/com/xcong/excoin/modules/fish/vo/AwardVo.java                           |   14 ++
 src/main/java/com/xcong/excoin/modules/fish/vo/AwardsVo.java                          |   20 ++++
 src/main/java/com/xcong/excoin/modules/fish/dto/LotteryDrawDto.java                   |    9 +
 src/main/java/com/xcong/excoin/modules/fish/controller/MemberCannonController.java    |   26 ++++
 src/main/java/com/xcong/excoin/modules/fish/entity/CannonAccountMoneyChange.java      |    2 
 src/main/java/com/xcong/excoin/modules/fish/service/MemberCannonService.java          |    4 
 src/main/java/com/xcong/excoin/modules/fish/entity/CannonAwardSet.java                |   18 +++
 12 files changed, 288 insertions(+), 9 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/fish/controller/MemberCannonController.java b/src/main/java/com/xcong/excoin/modules/fish/controller/MemberCannonController.java
index 63fcbd0..322462e 100644
--- a/src/main/java/com/xcong/excoin/modules/fish/controller/MemberCannonController.java
+++ b/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);
+    }
+
+
+
 }
diff --git a/src/main/java/com/xcong/excoin/modules/fish/dao/CannonOwnRecordDao.java b/src/main/java/com/xcong/excoin/modules/fish/dao/CannonOwnRecordDao.java
index 722e17b..bce341f 100644
--- a/src/main/java/com/xcong/excoin/modules/fish/dao/CannonOwnRecordDao.java
+++ b/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);
 }
diff --git a/src/main/java/com/xcong/excoin/modules/fish/dto/LotteryDrawDto.java b/src/main/java/com/xcong/excoin/modules/fish/dto/LotteryDrawDto.java
new file mode 100644
index 0000000..8131af4
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/fish/dto/LotteryDrawDto.java
@@ -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 {
+}
diff --git a/src/main/java/com/xcong/excoin/modules/fish/entity/CannonAccountMoneyChange.java b/src/main/java/com/xcong/excoin/modules/fish/entity/CannonAccountMoneyChange.java
index e770697..23f850d 100644
--- a/src/main/java/com/xcong/excoin/modules/fish/entity/CannonAccountMoneyChange.java
+++ b/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;
diff --git a/src/main/java/com/xcong/excoin/modules/fish/entity/CannonAward.java b/src/main/java/com/xcong/excoin/modules/fish/entity/CannonAward.java
new file mode 100644
index 0000000..d266a3f
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/fish/entity/CannonAward.java
@@ -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;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/fish/entity/CannonAwardSet.java b/src/main/java/com/xcong/excoin/modules/fish/entity/CannonAwardSet.java
new file mode 100644
index 0000000..23f95cb
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/fish/entity/CannonAwardSet.java
@@ -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;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/fish/service/MemberCannonService.java b/src/main/java/com/xcong/excoin/modules/fish/service/MemberCannonService.java
index f57cb6c..c8f716c 100644
--- a/src/main/java/com/xcong/excoin/modules/fish/service/MemberCannonService.java
+++ b/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);
 }
diff --git a/src/main/java/com/xcong/excoin/modules/fish/service/impl/MemberCannonServiceImpl.java b/src/main/java/com/xcong/excoin/modules/fish/service/impl/MemberCannonServiceImpl.java
index d0671f2..c049297 100644
--- a/src/main/java/com/xcong/excoin/modules/fish/service/impl/MemberCannonServiceImpl.java
+++ b/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());
     }
diff --git a/src/main/java/com/xcong/excoin/modules/fish/vo/AwardVo.java b/src/main/java/com/xcong/excoin/modules/fish/vo/AwardVo.java
new file mode 100644
index 0000000..29be936
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/fish/vo/AwardVo.java
@@ -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;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/fish/vo/AwardsVo.java b/src/main/java/com/xcong/excoin/modules/fish/vo/AwardsVo.java
new file mode 100644
index 0000000..6fa8f49
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/fish/vo/AwardsVo.java
@@ -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;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/fish/vo/CannonAwardVo.java b/src/main/java/com/xcong/excoin/modules/fish/vo/CannonAwardVo.java
new file mode 100644
index 0000000..a7a1197
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/fish/vo/CannonAwardVo.java
@@ -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;
+}
diff --git a/src/main/resources/mapper/fish/CannonOwnRecordDao.xml b/src/main/resources/mapper/fish/CannonOwnRecordDao.xml
index 2b2239f..465b3f0 100644
--- a/src/main/resources/mapper/fish/CannonOwnRecordDao.xml
+++ b/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>
\ No newline at end of file

--
Gitblit v1.9.1