package com.xcong.excoin.modules.coin.service.impl; import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.kebex.app.entity.member.Member; import com.kebex.app.entity.member.MemberAccountFlowRecord; import com.kebex.app.entity.member.WalletCoin; import com.kebex.app.entity.order.CoinOrderMain; import com.kebex.app.entity.order.CoinsOrderDetail; import com.kebex.app.entity.trade.TradeSetting; import com.kebex.common.huobiapi.CoinTypeConConvert; import com.xcong.excoin.common.LoginUserUtils; import com.xcong.excoin.common.enumerates.MemberWalletCoinEnum; import com.xcong.excoin.common.response.Result; import com.xcong.excoin.modules.coin.dao.MemberSelectSymbolsDao; import com.xcong.excoin.modules.coin.dao.OrderCoinDao; import com.xcong.excoin.modules.coin.dao.platform.CnyUsdtExchangeDao; import com.xcong.excoin.modules.coin.dao.platform.TradeSettingDao; import com.xcong.excoin.modules.coin.entity.CnyUsdtExchange; import com.xcong.excoin.modules.coin.entity.OrderCoinEntity; import com.xcong.excoin.modules.coin.entity.PlatformTradeSettingEntity; import com.xcong.excoin.modules.coin.service.OrderCoinService; import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao; import com.xcong.excoin.modules.member.entity.MemberSelectSymbolsEntity; import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity; import com.xcong.excoin.utils.MessageSourceUtils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @Service public class OrderCoinServiceImpl extends ServiceImpl implements OrderCoinService{ @Resource TradeSettingDao platformTradeSettingDao; @Resource MemberWalletCoinDao memberWalletCoinDao; @Resource MemberSelectSymbolsDao memberSelectSymbolsDao; @Resource CnyUsdtExchangeDao cnyUsdtExchangeDao; @Override public Result enterTransactionPageOfWalletCoin(String symbol, String type) { if (StrUtil.isBlank(symbol)) { return Result.fail(MessageSourceUtils.getString("order_service_0001")); } //获取用户ID Long memberId = LoginUserUtils.getAppLoginUser().getId(); //获取该币种的币币账户信息 MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbol); PlatformTradeSettingEntity tradeSetting = platformTradeSettingDao.findTradeSetting(); if (tradeSetting == null) { return Result.fail(MessageSourceUtils.getString("order_service_0003")); } //获取USDT的币币账户信息 MemberWalletCoinEntity walletCoinUsdt = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, MemberWalletCoinEnum.WALLETCOINCODE.getValue()); /** * todo */ //获取某个币种的收盘价 //Double closePrice = symbolsService.getCloseSymbolsBySymbolsName(symbol+"/USDT"); BigDecimal closePrice = new BigDecimal("100.0000"); List memSymbols = memberSelectSymbolsDao.selectSymbolByMemIdAndSymbol(memberId, symbol); CnyUsdtExchange cnyUsdtExchange = cnyUsdtExchangeDao.getCNYAndUSDTOne(); BigDecimal cnyUsdt = cnyUsdtExchange.getValue(); Map map = new HashMap(); if(CollUtil.isEmpty(memSymbols)) { map.put(MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_ISCOLLECT_NO.getName(), MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_ISCOLLECT_NO.getValue());//是否已经自选该币种 }else { map.put(MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_ISCOLLECT_YES.getName(), MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_ISCOLLECT_YES.getValue());//是否已经自选该币种 } if (ObjectUtil.isEmpty(walletCoin)) return Result.fail(MessageSourceUtils.getString("order_service_0003")); map.put(MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_SPREAD.getValue(), tradeSetting.getSpread());// 点差 map.put(MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_CLOSINGRATIO.getValue(), tradeSetting.getFeeRatio());// 手续费用率 if(MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_BUY.getValue().equals(type)) {//买入 map.put(MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_MEMBERMONEY.getValue(), walletCoinUsdt.getAvailableBalance());// 用户可用金额 }else { map.put(MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_MEMBERMONEY.getValue(), walletCoin.getAvailableBalance());// 用户可用金额 } map.put(MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_CURRENTPRICE.getValue(), closePrice);//当前价 map.put(MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_CNYUSDT.getValue(), cnyUsdt);//比例 map.put(MemberWalletCoinEnum.ENTERTRANSACTIONPAGEOFWALLETCOIN_CURRENTPRICECNY.getValue(), cnyUsdt.multiply(closePrice));//换算成人民币的币种价格 return Result.ok(map); } @Override @Transactional public Result submitSalesWalletCoinOrder(String symbol, Integer type, Integer tradeType, BigDecimal price, BigDecimal amount) { try { //获取用户ID Long memberId = LoginUserUtils.getAppLoginUser().getId(); String[] symbols = symbol.split("/"); if (symbols.length <= 0) { return Result.fail(MessageSourceUtils.getString("order_service_0008")); } /** * todo */ //查询当前价 //BigDecimal nowPrice = new BigDecimal(redisUtil.getString(CoinTypeConConvert.convertToKey(symbol+"/USDT"))); BigDecimal nowPrice = new BigDecimal("100.0000"); // 获取交易管理的杠杠倍率,手续费率等信息,由平台进行设置 symbol = symbol.toUpperCase(); MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbols[0]); MemberWalletCoinEntity walletCoinUsdt = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, MemberWalletCoinEnum.WALLETCOINCODE.getValue()); if (ObjectUtil.isEmpty(walletCoin) || ObjectUtil.isEmpty(walletCoinUsdt) ) { return Result.fail(MessageSourceUtils.getString("order_service_0003")); } // 查询交易设置 PlatformTradeSettingEntity tradeSetting = platformTradeSettingDao.findTradeSetting(); if(ObjectUtil.isEmpty(tradeSetting)) { return Result.fail(MessageSourceUtils.getString("order_service_0009")); } //手续费率 BigDecimal ServiceRate = new BigDecimal(MemberWalletCoinEnum.SUBMITSALESWALLETCOINORDER_SERVICERATE.getValue()); // 手续费用(手续费=建仓价X数量X手续费率) BigDecimal closingPrice = price.multiply(amount).multiply(ServiceRate).setScale(4, BigDecimal.ROUND_DOWN); //总费用 = 成交价*数量+手续费 BigDecimal totalPayPrice = price.multiply(amount).add(closingPrice).setScale(4, BigDecimal.ROUND_DOWN); if(MemberWalletCoinEnum.SUBMITSALESWALLETCOINORDER_TYPE.getValue().equals(type.toString())) { //买入,所需总费用跟用户USDT金额进行比较 if (totalPayPrice.compareTo(walletCoinUsdt.getAvailableBalance()) > 0) { return Result.fail(MessageSourceUtils.getString("order_service_0010")); } }else { //卖出,所需总费用跟用户所对应的币种金额进行比较 if (amount.compareTo(walletCoin.getAvailableBalance()) > 0) { return Result.fail(MessageSourceUtils.getString("order_service_0010")); } } CoinOrderMain order = new CoinOrderMain(); // 创建订单 if (tradeType == 2) {// 如果是限价交易直接插入主表数据 order.setStatus(1); order.setMemId(member.getmId()); order.setOpenPrice(price.doubleValue()); order.setOpenTime(new Date()); order.setOrderNo(generateSimpleSerialno(member.getmId() + "")); order.setOrderType(type); order.setRewardRatio(price .multiply(amount).doubleValue()); order.setForceSetPrice(nowPrice.doubleValue()); // order.setStatus(3); order.setSysbol(symbol); order.setSysbolNumber(amount); order.setSysbolFlatNumber(amount); order.setTradeType(tradeType); order.setVersion(1); order.setClosingPrice(closingPrice); orderMapper.addCoinMainOrder(order); //更新用户钱包信息 //冻结相应的资产 if(type == 1) {//如果是买入,所对应的币种增加,USDT账户减少金额 // 更新用户的可用金额,冻结金额 walletCoinUsdt.setAvailableBalance(walletCoinUsdt.getAvailableBalance()-totalPayPrice.doubleValue()); walletCoinUsdt.setFrozenBalance(walletCoinUsdt.getFrozenBalance()+totalPayPrice.doubleValue()); walletCoinDao.updateByModel(walletCoinUsdt); }else { //如果是卖出,币种减少,USDT增加 BigDecimal availableBalance = new BigDecimal(walletCoin.getAvailableBalance()).subtract(amount).setScale(8, BigDecimal.ROUND_HALF_UP); walletCoin.setAvailableBalance(availableBalance.doubleValue()); walletCoin.setFrozenBalance(walletCoin.getFrozenBalance()+amount.doubleValue()); walletCoinDao.updateByModel(walletCoin); } } else { //如果是市价交易,主表和附表都需要插入数据 order.setStatus(3); order.setMemId(member.getmId()); order.setForceSetPrice(nowPrice.doubleValue()); order.setOpenPrice(nowPrice.doubleValue()); order.setOpenTime(new Date()); order.setOrderNo(generateSimpleSerialno(member.getmId() + "")); order.setOrderType(type); order.setRewardRatio(nowPrice .multiply(amount).doubleValue()); // order.setStatus(3); order.setSysbol(symbol); order.setSysbolNumber(amount); order.setSysbolFlatNumber(amount); order.setTradeType(tradeType); order.setVersion(1); order.setClosingPrice(closingPrice); orderMapper.addCoinMainOrder(order); // CoinsOrderDetail detail = new CoinsOrderDetail(); detail.setClosingPrice(closingPrice.doubleValue()); detail.setCreateTime(new Date()); detail.setEntrustStatus(1); detail.setEntrustType(type); detail.setExitPrice(price.doubleValue()); detail.setExitType(1); detail.setMainId(order.getId()); detail.setMemberId(member.getmId()); detail.setMemberPhone(member.getPhone()); detail.setPrePrice(price .multiply(amount).doubleValue()); detail.setRewardRatio(0.0); detail.setSerialno(generateSimpleSerialno(member.getmId() + "")); detail.setSymbol(symbol); detail.setSymbolSku(amount); detail.setSymbolSkuNumber(amount); detail.setTradePrice(price.doubleValue()); detail.setTradeType(tradeType); detail.setVersion(1); coinOrderDetailMapper.insert(detail); if(type == 1) {//如果是买入,所对应的币种增加,USDT账户减少金额 // 更新用户的可用金额 BigDecimal availableBalance = new BigDecimal(walletCoin.getAvailableBalance()).add(amount).setScale(8, BigDecimal.ROUND_HALF_UP); walletCoin.setAvailableBalance(availableBalance.doubleValue()); walletCoinDao.updateByModel(walletCoin); walletCoinUsdt.setAvailableBalance(walletCoinUsdt.getAvailableBalance()-totalPayPrice.doubleValue()); walletCoinDao.updateByModel(walletCoinUsdt); }else { //如果是卖出,币种减少,USDT增加 BigDecimal availableBalance = new BigDecimal(walletCoin.getAvailableBalance()).subtract(amount).setScale(8, BigDecimal.ROUND_HALF_UP); walletCoin.setAvailableBalance(availableBalance.doubleValue()); walletCoinDao.updateByModel(walletCoin); walletCoinUsdt.setAvailableBalance(walletCoinUsdt.getAvailableBalance()+totalPayPrice.doubleValue()); walletCoinDao.updateByModel(walletCoinUsdt); } //返佣 // calYj(member.getmId(), closingPrice, order); // String reference = member.getReference(); //返佣 // agentReturn(reference,closingPrice.doubleValue(),detail); } // 流水记录 MemberAccountFlowRecord record = new MemberAccountFlowRecord(); record.setCreateTime(new Date()); if (type == 1) { record.setDirectionSource("币币买入"+symbol); record.setRemark("买入"+symbol+":"+amount); record.setPrice(totalPayPrice.doubleValue()); } else { record.setDirectionSource("币币卖出"+symbol); record.setRemark("卖出"+symbol+":"+amount); record.setPrice(-totalPayPrice.doubleValue()); } record.setMemberBalance(walletCoinUsdt.getAvailableBalance()); record.setMemberid(member.getmId()); record.setSymbolName(symbol); record.setMemberName(member.getRealName()); record.setMemberPhone(member.getPhone()); memberMapper.addFlowRecord(record); } catch (Exception e) { e.printStackTrace(); } return Result.success(MessageSourceUtils.getString("order_service_0011")); } }