From be6f79a634727b59c6a40e3fffa989b5de1b0ec7 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Wed, 24 Nov 2021 16:54:01 +0800
Subject: [PATCH] Merge branch 'fish' of http://120.27.238.55:7000/r/exchange into fish

---
 src/main/java/com/xcong/excoin/modules/fish/service/impl/MemberCannonServiceImpl.java |  263 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 263 insertions(+), 0 deletions(-)

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
new file mode 100644
index 0000000..ea0460d
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/fish/service/impl/MemberCannonServiceImpl.java
@@ -0,0 +1,263 @@
+package com.xcong.excoin.modules.fish.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.enumerates.CoinTypeEnum;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.coin.service.CoinService;
+import com.xcong.excoin.modules.fish.dao.CannonAccountMoneyChangeDao;
+import com.xcong.excoin.modules.fish.dao.CannonOwnRecordDao;
+import com.xcong.excoin.modules.fish.dao.CannonSettingDao;
+import com.xcong.excoin.modules.fish.dao.MemberAccountGoldDao;
+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.CannonSettingVo;
+import com.xcong.excoin.modules.fish.vo.GoldAccountVo;
+import com.xcong.excoin.modules.fish.vo.OwnCannonVo;
+import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
+import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
+import com.xcong.excoin.utils.RedisUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Service
+public class MemberCannonServiceImpl extends ServiceImpl<CannonOwnRecordDao, CannonOwnRecord> implements MemberCannonService {
+
+    @Resource
+    CannonSettingDao cannonSettingDao;
+    @Resource
+    MemberAccountGoldDao memberAccountGoldDao;
+    @Resource
+    CannonAccountMoneyChangeDao cannonAccountMoneyChangeDao;
+    @Resource
+    MemberWalletCoinDao memberWalletCoinDao;
+    @Resource
+    CannonOwnRecordDao cannonOwnRecordDao;
+    @Resource
+    RedisUtils redisUtils;
+    @Resource
+    private CoinService coinService;
+    @Resource
+    private MemberCannonService memberCannonService;
+
+    @Override
+    public Result coinGoldExchange(CoinGoldExchangeDto coinGoldExchangeDto) {
+        BigDecimal balance = coinGoldExchangeDto.getBalance();
+        if (balance.compareTo(BigDecimal.ZERO) <= 0) {
+            return Result.fail("兑换金额不能小于或等于0");
+        }
+        Long memberId = LoginUserUtils.getAppLoginUser().getId();
+        //获取兑换比例
+        List<CannonExchangeRatio> cannonExchangeRatios = cannonSettingDao.selectCannonExchangeRatio();
+        if(CollUtil.isEmpty(cannonExchangeRatios)){
+            return Result.fail("系统繁忙请稍候重试");
+        }
+        CannonExchangeRatio cannonExchangeRatio = cannonExchangeRatios.get(0);
+        Integer type = coinGoldExchangeDto.getType();
+        //1:金币兑换1代币 2:1代币兑换金币
+        if(type == 1){
+            MemberAccountGold memberAccountGold = memberAccountGoldDao.selectAccountGoldByMemberId(memberId);
+            MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.XCT.name());
+            if(balance.compareTo(memberAccountGold.getAvailableBalance()) > 0){
+                return Result.fail("金币不足");
+            }
+            BigDecimal coinRatio = cannonExchangeRatio.getCoinRatio();
+            BigDecimal divide = balance.divide(coinRatio).setScale(8,BigDecimal.ROUND_DOWN);
+            //金币账户减少
+            memberCannonService.updateTotalBalanceAndAvailableBalance(memberAccountGold.getId(),balance.negate(),balance.negate(),null);
+            //代币账户增加
+            coinService.updateWalletBalance(memberWalletCoinEntity.getId(),divide,divide,null);
+
+            CannonAccountMoneyChange cannonAccountMoneyChange = new CannonAccountMoneyChange();
+            cannonAccountMoneyChange.setMemberId(memberId);
+            cannonAccountMoneyChange.setAmount(balance.negate());
+            cannonAccountMoneyChange.setType(2);
+            cannonAccountMoneyChange.setContent("金币兑换");
+            cannonAccountMoneyChange.setChangeBalance(balance);
+            cannonAccountMoneyChange.setChangeBefore(memberAccountGold.getAvailableBalance());
+            cannonAccountMoneyChange.setChangeAfter(memberAccountGold.getAvailableBalance().subtract(balance));
+            cannonAccountMoneyChangeDao.insert(cannonAccountMoneyChange);
+        }else if(type == 2){
+            MemberAccountGold memberAccountGold = memberAccountGoldDao.selectAccountGoldByMemberId(memberId);
+            MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.XCT.name());
+            if(balance.compareTo(memberWalletCoinEntity.getAvailableBalance()) > 0){
+                return Result.fail("代币不足");
+            }
+            BigDecimal coinRatio = cannonExchangeRatio.getCoinRatio();
+            BigDecimal multiply = balance.multiply(coinRatio);
+            //金币账户增加
+            memberCannonService.updateTotalBalanceAndAvailableBalance(memberAccountGold.getId(),multiply,multiply,null);
+            //代币账户减少
+            coinService.updateWalletBalance(memberWalletCoinEntity.getId(),balance.negate(),balance.negate(),null);
+
+            CannonAccountMoneyChange cannonAccountMoneyChange = new CannonAccountMoneyChange();
+            cannonAccountMoneyChange.setMemberId(memberId);
+            cannonAccountMoneyChange.setAmount(balance);
+            cannonAccountMoneyChange.setType(3);
+            cannonAccountMoneyChange.setContent("兑换金币");
+            cannonAccountMoneyChange.setChangeBalance(balance);
+            cannonAccountMoneyChange.setChangeBefore(memberWalletCoinEntity.getAvailableBalance());
+            cannonAccountMoneyChange.setChangeAfter(memberWalletCoinEntity.getAvailableBalance().add(balance));
+            cannonAccountMoneyChangeDao.insert(cannonAccountMoneyChange);
+        }
+        return Result.ok("兑换成功");
+    }
+
+    @Override
+    public void updateTotalBalanceAndAvailableBalance(Long id, BigDecimal availableBalance,  BigDecimal totalBalance,BigDecimal frozenBalance) {
+        if(id==null){
+            return;
+        }
+        // 这里需要加锁 保证同一个时间只有一个线程操作一个钱包
+        String key = "UPDATE_MEMBER_GOLD_"+id;
+        while (true){
+            boolean b = redisUtils.setNotExist(key, 1, 2);
+            if(b){
+                //System.out.println("我拿到了锁");
+                // 拿到了锁才能扣
+                memberAccountGoldDao.updateTotalBalanceAndAvailableBalance(id,availableBalance,totalBalance,frozenBalance);
+                // 扣完释放锁
+                redisUtils.del(key);
+                break;
+            }else {
+
+            }
+        }
+    }
+
+    @Override
+    public Result getCannons(GetCannonsDto getCannonsDto) {
+        Long memberId = LoginUserUtils.getAppLoginUser().getId();
+        Page<CannonSettingVo> page = new Page<>(getCannonsDto.getPageNum(), getCannonsDto.getPageSize());
+        CannonSetting cannonSetting = new CannonSetting();
+        IPage<CannonSettingVo> list = cannonSettingDao.findCannonSettingInPage(page, cannonSetting);
+        return Result.ok(list);
+    }
+
+    @Override
+    public Result cannonExchange(CannonExchangeDto cannonExchangeDto) {
+        Long memberId = LoginUserUtils.getAppLoginUser().getId();
+        Long cannonId = cannonExchangeDto.getCannonId();
+        CannonSetting cannonSetting = cannonSettingDao.selectById(cannonId);
+        BigDecimal exchangePrice = cannonSetting.getExchangePrice();
+        if(ObjectUtil.isEmpty(cannonSetting)){
+            return Result.fail("炮塔不存在");
+        }
+        List<CannonOwnRecord> cannonOwnRecords = cannonOwnRecordDao.selectCannonOwnRecordsByMemberIdAndCannonCode(memberId,cannonSetting.getCode());
+        if(CollUtil.isNotEmpty(cannonOwnRecords)){
+            return Result.fail("炮塔已拥有");
+        }
+        //获取用户的USDT账户,可用余额总金额减少
+        MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name());
+        if(exchangePrice.compareTo(memberWalletCoinEntity.getAvailableBalance()) > 0){
+            return Result.fail("可用余额不足");
+        }
+        coinService.updateWalletBalance(memberWalletCoinEntity.getId(),exchangePrice.negate(),exchangePrice.negate(),null);
+        //增加一条拥有记录【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);
+        //增加一条买卖记录
+        CannonAccountMoneyChange cannonAccountMoneyChange = new CannonAccountMoneyChange();
+        cannonAccountMoneyChange.setMemberId(memberId);
+        cannonAccountMoneyChange.setAmount(exchangePrice);
+        cannonAccountMoneyChange.setType(1);
+        cannonAccountMoneyChange.setContent("购买炮塔");
+        cannonAccountMoneyChange.setChangeBalance(exchangePrice);
+        cannonAccountMoneyChange.setChangeBefore(memberWalletCoinEntity.getAvailableBalance());
+        cannonAccountMoneyChange.setChangeAfter(memberWalletCoinEntity.getAvailableBalance().subtract(exchangePrice));
+        cannonAccountMoneyChangeDao.insert(cannonAccountMoneyChange);
+        return Result.ok("购买成功");
+    }
+
+    @Override
+    public Result goldExchange(GoldExchangeDto goldExchangeDto) {
+        Long memberId = LoginUserUtils.getAppLoginUser().getId();
+        BigDecimal balance = goldExchangeDto.getBalance();
+        if (balance.compareTo(BigDecimal.ZERO) <= 0) {
+            return Result.fail("兑换金额不能小于或等于0");
+        }
+        //获取兑换比例
+        List<CannonExchangeRatio> cannonExchangeRatios = cannonSettingDao.selectCannonExchangeRatio();
+        if(CollUtil.isEmpty(cannonExchangeRatios)){
+            return Result.fail("系统繁忙请稍候重试");
+        }
+        CannonExchangeRatio cannonExchangeRatio = cannonExchangeRatios.get(0);
+        //金币账户增加
+        MemberAccountGold memberAccountGold = memberAccountGoldDao.selectAccountGoldByMemberId(memberId);
+        BigDecimal goldRatio = cannonExchangeRatio.getGoldRatio();
+        BigDecimal multiply = balance.multiply(goldRatio);
+        memberCannonService.updateTotalBalanceAndAvailableBalance(memberAccountGold.getId(),multiply,multiply,null);
+        //获取用户的USDT账户,可用余额总金额减少
+        MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name());
+        if(balance.compareTo(memberWalletCoinEntity.getAvailableBalance()) > 0){
+            return Result.fail("可用余额不足");
+        }
+        coinService.updateWalletBalance(memberWalletCoinEntity.getId(),balance.negate(),balance.negate(),null);
+        return Result.ok("兑换成功");
+    }
+
+    @Override
+    public Result getGoldAccount() {
+        Long memberId = LoginUserUtils.getAppLoginUser().getId();
+        MemberAccountGold memberAccountGold = memberAccountGoldDao.selectAccountGoldByMemberId(memberId);
+        if(ObjectUtil.isEmpty(memberAccountGold)){
+            MemberAccountGold memberAccountGoldNew = new MemberAccountGold();
+            memberAccountGoldNew.setMemberId(memberId);
+            memberAccountGoldNew.setTotalBalance(BigDecimal.ZERO);
+            memberAccountGoldNew.setAvailableBalance(BigDecimal.ZERO);
+            memberAccountGoldNew.setFrozenBalance(BigDecimal.ZERO);
+            memberAccountGoldDao.insert(memberAccountGoldNew);
+        }
+        GoldAccountVo goldAccountVo = memberAccountGoldDao.selectAccountGoldVoByMemberId(memberId);
+        return Result.ok(goldAccountVo);
+    }
+
+    @Override
+    public Result getOwnCannon() {
+        Long memberId = LoginUserUtils.getAppLoginUser().getId();
+        List<OwnCannonVo> cannonOwnRecords = cannonOwnRecordDao.selectCannonOwnRecordsByMemberId(memberId);
+        return Result.ok(cannonOwnRecords);
+    }
+
+    @Override
+    public Result fishing(FishingDto fishingDto) {
+        Long memberId = LoginUserUtils.getAppLoginUser().getId();
+        Integer goldWin = fishingDto.getGoldWin() == null?0:fishingDto.getGoldWin();
+        if(goldWin < 0){
+            return Result.fail("请求异常,请刷新页面");
+        }
+        Long cannonOwnId = fishingDto.getCannonOwnId();
+        List<CannonOwnRecord> cannonOwnRecords = cannonOwnRecordDao.selectCannonOwnRecordsByIdAndMemberId(cannonOwnId,memberId);
+        if(CollUtil.isEmpty(cannonOwnRecords)){
+            Result.fail("请求异常,请刷新页面");
+        }
+        //消耗金币 = 每发炮弹的消耗 - 获得金币;
+        CannonOwnRecord cannonOwnRecord = cannonOwnRecords.get(0);
+        CannonSetting cannonSetting = cannonSettingDao.selectCannonSettingByCannonCode(cannonOwnRecord.getCannonCode());
+        BigDecimal goldConsume = cannonSetting.getGoldConsume().subtract(new BigDecimal(goldWin)).setScale(0,BigDecimal.ROUND_DOWN);
+        MemberAccountGold memberAccountGold = memberAccountGoldDao.selectAccountGoldByMemberId(memberId);
+        memberCannonService.updateTotalBalanceAndAvailableBalance(memberAccountGold.getId(),goldConsume.negate(),goldConsume.negate(),null);
+        return Result.ok("success");
+    }
+
+    public static void main(String[] args) {
+        System.out.println(UUID.randomUUID().toString());
+    }
+
+
+}

--
Gitblit v1.9.1