| | |
| | | package com.yami.trading.api.controller.exchange; |
| | | |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.yami.trading.bean.data.domain.Realtime; |
| | | import com.yami.trading.bean.exchange.ExchangeApplyOrder; |
| | | import com.yami.trading.bean.exchange.dto.ExchangeSymbolDto; |
| | | import com.yami.trading.bean.exchange.dto.SumEtfDto; |
| | | import com.yami.trading.bean.item.domain.Item; |
| | | import com.yami.trading.bean.model.*; |
| | | import com.yami.trading.bean.purchasing.dto.ExchangeLock; |
| | | import com.yami.trading.bean.syspara.domain.Syspara; |
| | | import com.yami.trading.common.domain.Result; |
| | | import com.yami.trading.common.domain.UUIDEntity; |
| | | import com.yami.trading.common.exception.YamiShopBindException; |
| | | import com.yami.trading.common.util.Arith; |
| | | import com.yami.trading.common.util.DateUtils; |
| | |
| | | import com.yami.trading.service.item.ItemService; |
| | | import com.yami.trading.service.syspara.SysparaService; |
| | | import com.yami.trading.service.user.UserService; |
| | | import com.yami.trading.service.user.WalletExtendService; |
| | | import io.swagger.annotations.Api; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | ItemService itemService; |
| | | @Autowired |
| | | CapitaltWalletService capitaltWalletService; |
| | | |
| | | @Autowired |
| | | WalletExtendService walletExtendService; |
| | | /** |
| | | * 兑换币 如果是使用usdt兑换其他币种,则直接执行正常买币open流程 如果是其他币种--》usdt 则是直接卖币流程 |
| | | * 如果是其他币种到另一个币种,则需要先卖出,然后再买入 |
| | |
| | | } |
| | | symbol = symbol.toLowerCase(); |
| | | symbol_to = symbol_to.toLowerCase(); |
| | | String relation_order_no = UUID.randomUUID().toString(); |
| | | // 如果是使用usdt兑换其他币种,则直接执行正常买币open流程 |
| | | if ("usdt".equals(symbol) || "usdt".equals(symbol_to)) { |
| | | ExchangeApplyOrder order = new ExchangeApplyOrder(); |
| | | order.setPartyId(partyId); |
| | | order.setVolume(volume); |
| | | order.setOrderPriceType("opponent"); |
| | | order.setRelationOrderNo(relation_order_no); |
| | | if ("usdt".equals(symbol)) { |
| | | order.setSymbol(symbol_to); |
| | | double openPrice = getRealtimePrice(symbol_to); |
| | | order.setPrice(openPrice); |
| | | order.setOffset(ExchangeApplyOrder.OFFSET_OPEN); |
| | | } else if ("usdt".equals(symbol_to)) { |
| | | order.setSymbol(symbol); |
| | | double closePrice = getRealtimePrice(symbol); |
| | | order.setPrice(closePrice); |
| | | order.setOffset(ExchangeApplyOrder.OFFSET_CLOSE); |
| | | |
| | | Map<String, Object> parities = parities(symbol, symbol_to, volume_temp); |
| | | Object getVolume = parities.get("get_volume"); |
| | | if(symbol.equals("usdt")){ |
| | | CapitaltWallet userIdWallet = capitaltWalletService.getUserIdWallet(partyId); |
| | | if(userIdWallet.getMoney().compareTo(new BigDecimal(volume_temp)) < 0){ |
| | | throw new YamiShopBindException("not sufficient funds"); |
| | | } |
| | | exchangeApplyOrderService.saveCreate(order); |
| | | } else { |
| | | // 非usdt则需要进行一次卖出 |
| | | ExchangeApplyOrder order_sell = new ExchangeApplyOrder(); |
| | | order_sell.setPartyId(partyId); |
| | | order_sell.setSymbol(symbol); |
| | | order_sell.setOffset(ExchangeApplyOrder.OFFSET_CLOSE); |
| | | order_sell.setVolume(volume); |
| | | order_sell.setOrderPriceType("opponent"); |
| | | order_sell.setRelationOrderNo(relation_order_no); |
| | | double sellClose = getRealtimePrice(symbol); |
| | | order_sell.setPrice(sellClose); |
| | | this.exchangeApplyOrderService.saveCreate(order_sell); |
| | | double close = getRealtimePrice(symbol); |
| | | double sub = Arith.sub(volume, |
| | | Arith.mul(volume, sysparaService.find("exchange_apply_order_sell_fee").getDouble())); |
| | | double amount = Arith.mul(sub, close); |
| | | // 再买入币种 |
| | | ExchangeApplyOrder order_buy = new ExchangeApplyOrder(); |
| | | order_buy.setPartyId(partyId); |
| | | order_buy.setSymbol(symbol_to); |
| | | order_buy.setOffset(ExchangeApplyOrder.OFFSET_OPEN); |
| | | order_buy.setVolume(amount); |
| | | order_buy.setRelationOrderNo(relation_order_no); |
| | | order_buy.setOrderPriceType("opponent"); |
| | | double buyClose = getRealtimePrice(symbol_to); |
| | | order_buy.setPrice(buyClose); |
| | | exchangeApplyOrderService.saveCreate(order_buy); |
| | | Double value = Double.valueOf(volume_temp); |
| | | capitaltWalletService.update(userIdWallet, -value); |
| | | |
| | | WalletExtend walletExtend = walletExtendService.getOne(new LambdaQueryWrapper<>(WalletExtend.class) |
| | | .eq(WalletExtend::getWallettype, symbol_to) |
| | | .eq(WalletExtend::getPartyId,partyId) |
| | | .last(" limit 1")); |
| | | if(ObjectUtil.isNotEmpty(walletExtend)){ |
| | | Double valueOf = Double.valueOf(getVolume.toString()); |
| | | walletExtend.setAmount(walletExtend.getAmount() + valueOf); |
| | | System.out.println("-----------------------:"+walletExtend.toString()); |
| | | walletExtendService.update(walletExtend,new LambdaUpdateWrapper<WalletExtend>().eq(UUIDEntity::getUuid,walletExtend.getUuid())); |
| | | }else{ |
| | | WalletExtend extend = new WalletExtend(); |
| | | extend.setPartyId(partyId); |
| | | extend.setWallettype(symbol_to); |
| | | extend.setAmount(Double.valueOf(getVolume.toString())); |
| | | walletExtendService.save(extend); |
| | | } |
| | | }else if(symbol_to.equals("usdt")){ |
| | | |
| | | |
| | | WalletExtend walletExtend = walletExtendService.getOne(new LambdaQueryWrapper<>(WalletExtend.class) |
| | | .eq(WalletExtend::getWallettype, symbol) |
| | | .eq(WalletExtend::getPartyId,partyId) |
| | | .last(" limit 1")); |
| | | if(ObjectUtil.isEmpty(walletExtend) || walletExtend.getAmount() < Double.valueOf(volume_temp)){ |
| | | throw new YamiShopBindException("not sufficient funds"); |
| | | } |
| | | Double valueOf = Double.valueOf(volume_temp); |
| | | walletExtend.setAmount(walletExtend.getAmount() - valueOf); |
| | | walletExtendService.update(walletExtend,new LambdaUpdateWrapper<WalletExtend>().eq(UUIDEntity::getUuid,walletExtend.getUuid())); |
| | | |
| | | |
| | | CapitaltWallet userIdWallet = capitaltWalletService.getUserIdWallet(partyId); |
| | | capitaltWalletService.update(userIdWallet,Double.valueOf(getVolume.toString())); |
| | | }else{ |
| | | WalletExtend walletExtend = walletExtendService.getOne(new LambdaQueryWrapper<>(WalletExtend.class) |
| | | .eq(WalletExtend::getWallettype, symbol) |
| | | .eq(WalletExtend::getPartyId,partyId) |
| | | .last(" limit 1")); |
| | | if(ObjectUtil.isEmpty(walletExtend) || walletExtend.getAmount() < Double.valueOf(volume_temp)){ |
| | | throw new YamiShopBindException("not sufficient funds"); |
| | | } |
| | | Double valueOf = Double.valueOf(volume_temp); |
| | | walletExtend.setAmount(walletExtend.getAmount() - valueOf); |
| | | walletExtendService.update(walletExtend,new LambdaUpdateWrapper<WalletExtend>().eq(UUIDEntity::getUuid,walletExtend.getUuid())); |
| | | |
| | | WalletExtend toWalletExtend = walletExtendService.getOne(new LambdaQueryWrapper<>(WalletExtend.class) |
| | | .eq(WalletExtend::getWallettype, symbol_to) |
| | | .eq(WalletExtend::getPartyId,partyId) |
| | | .last(" limit 1")); |
| | | Double value = Double.valueOf(getVolume.toString()); |
| | | if(ObjectUtil.isNotEmpty(toWalletExtend)){ |
| | | toWalletExtend.setAmount(toWalletExtend.getAmount() + value); |
| | | walletExtendService.update(toWalletExtend,new LambdaUpdateWrapper<WalletExtend>().eq(UUIDEntity::getUuid,toWalletExtend.getUuid())); |
| | | }else{ |
| | | WalletExtend extend = new WalletExtend(); |
| | | extend.setPartyId(partyId); |
| | | extend.setWallettype(symbol_to); |
| | | extend.setAmount(value); |
| | | walletExtendService.save(extend); |
| | | } |
| | | } |
| | | return Result.succeed(); |
| | | } |
| | | |
| | | private double getRealtimePrice(String symbol) { |
| | | List<Realtime> realtimes = dataService.realtime(symbol); |
| | | double close = 1; |
| | | if (realtimes != null && realtimes.size() > 0) { |
| | | close = realtimes.get(0).getClose().doubleValue(); |
| | | } else { |
| | | throw new YamiShopBindException("参数错误"); |
| | | } |
| | | return close; |
| | | } |
| | | |
| | | /** |
| | | * 首次进入页面,传递session_token |
| | | */ |
| | | @RequestMapping(action + "view.action") |
| | | public Result view() { |
| | | String partyId = SecurityUtils.getUser().getUserId(); |
| | | Map<String, Object> session = new HashMap<String, Object>(); |
| | | String session_token = sessionTokenService.savePut(partyId); |
| | | session.put("session_token", session_token); |
| | | return Result.succeed(session); |
| | | } |
| | | |
| | | /** |
| | | * 兑换汇率 |
| | | */ |
| | | @RequestMapping(action + "buy_and_sell_fee.action") |
| | | public Object buy_and_sell_fee(HttpServletRequest request) { |
| | | // 需兑换币种 |
| | | String symbol = request.getParameter("symbol"); |
| | | // 兑换后的币种 |
| | | String symbol_to = request.getParameter("symbol_to"); |
| | | if (symbol.equals(symbol_to)) { |
| | | throw new YamiShopBindException("请选择正确的币种"); |
| | | } |
| | | // 委托数量 |
| | | String volume_temp = request.getParameter("volume"); |
| | | if (StringUtils.isNullOrEmpty(volume_temp) |
| | | || !StringUtils.isDouble(volume_temp) || Double.valueOf(volume_temp) < 0) { |
| | | throw new YamiShopBindException("请输入正确的兑换数量"); |
| | | } |
| | | public Map<String,Object> parities(String symbol,String symbol_to,String volume_temp){ |
| | | Map<String, Object> data = new HashMap<String, Object>(); |
| | | symbol = symbol.toLowerCase(); |
| | | symbol_to = symbol_to.toLowerCase(); |
| | |
| | | if (symbol_price == 0) { |
| | | symbol_price = 1; |
| | | } |
| | | data.put("get_rate", Arith.div(symbol_price, symbol_to_price, 5)); |
| | | data.put("get_rate", Arith.div(symbol_price, symbol_to_price, 8)); |
| | | // 总手续费比例 |
| | | double all_fee = Arith.add(buy_fee, sell_fee); |
| | | // 实际兑换数量= 兑换数量-手续费数量 |
| | |
| | | // 实际价值 = 实际兑换数量 * 被兑换品种价格 |
| | | double fact_price = Arith.mul(fact_volume, symbol_price); |
| | | // 实际获取数量 = 实际价值 / 将要兑换的品种的价值 |
| | | data.put("get_volume", Arith.div(fact_price, symbol_to_price, 5)); |
| | | data.put("get_volume", Arith.div(fact_price, symbol_to_price, 8)); |
| | | } |
| | | return Result.succeed(data); |
| | | return data; |
| | | } |
| | | |
| | | |
| | | private double getRealtimePrice(String symbol) { |
| | | List<Realtime> realtimes = dataService.realtime(symbol); |
| | | double close = 1; |
| | | if (realtimes != null && realtimes.size() > 0) { |
| | | close = realtimes.get(0).getClose().doubleValue(); |
| | | } else { |
| | | throw new YamiShopBindException("参数错误"); |
| | | } |
| | | return close; |
| | | } |
| | | |
| | | /** |
| | | * 首次进入页面,传递session_token |
| | | */ |
| | | @RequestMapping(action + "view.action") |
| | | public Result view() { |
| | | String partyId = SecurityUtils.getUser().getUserId(); |
| | | Map<String, Object> session = new HashMap<String, Object>(); |
| | | String session_token = sessionTokenService.savePut(partyId); |
| | | session.put("session_token", session_token); |
| | | return Result.succeed(session); |
| | | } |
| | | |
| | | /** |
| | | * 兑换汇率 |
| | | */ |
| | | @RequestMapping(action + "buy_and_sell_fee.action") |
| | | public Object buy_and_sell_fee(HttpServletRequest request) { |
| | | // 需兑换币种 |
| | | String symbol = request.getParameter("symbol"); |
| | | // 兑换后的币种 |
| | | String symbol_to = request.getParameter("symbol_to"); |
| | | if (symbol.equals(symbol_to)) { |
| | | throw new YamiShopBindException("请选择正确的币种"); |
| | | } |
| | | // 委托数量 |
| | | String volume_temp = request.getParameter("volume"); |
| | | if (StringUtils.isNullOrEmpty(volume_temp) |
| | | || !StringUtils.isDouble(volume_temp) || Double.valueOf(volume_temp) < 0) { |
| | | throw new YamiShopBindException("请输入正确的兑换数量"); |
| | | } |
| | | Map<String, Object> parities = parities(symbol, symbol_to, volume_temp); |
| | | return Result.succeed(parities); |
| | | } |
| | | |
| | | /** |
| | |
| | | String session_token = sessionTokenService.savePut(partyId); |
| | | data.put("session_token", session_token); |
| | | data.put("fee", sysparaService.find("exchange_apply_order_sell_fee").getSvalue()); |
| | | Item item = itemService.findCurrBySymbol(symbol); |
| | | data.put("status", item.getStatus() == null || item.getStatus() == 1 ? 1 :0); |
| | | } |
| | | return Result.succeed(data); |
| | | } |