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<OrderCoinDao, OrderCoinEntity> 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<MemberSelectSymbolsEntity> memSymbols = memberSelectSymbolsDao.selectSymbolByMemIdAndSymbol(memberId, symbol);
|
|
CnyUsdtExchange cnyUsdtExchange = cnyUsdtExchangeDao.getCNYAndUSDTOne();
|
BigDecimal cnyUsdt = cnyUsdtExchange.getValue();
|
|
Map<String, Object> map = new HashMap<String, Object>();
|
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"));
|
}
|
|
}
|