| | |
| | | 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.admin.dto.PurchaseRecordDto; |
| | | 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.ico.domain.Ico; |
| | | 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.common.util.StringUtils; |
| | | import com.yami.trading.common.util.ThreadUtils; |
| | | import com.yami.trading.common.util.*; |
| | | import com.yami.trading.security.common.util.SecurityUtils; |
| | | import com.yami.trading.service.CapitaltWalletService; |
| | | import com.yami.trading.service.RealNameAuthRecordService; |
| | |
| | | import com.yami.trading.service.exchange.ExchangeApplyOrderService; |
| | | import com.yami.trading.service.item.ItemService; |
| | | import com.yami.trading.service.syspara.SysparaService; |
| | | import com.yami.trading.service.user.PurchaseRecordService; |
| | | import com.yami.trading.service.user.UserService; |
| | | import com.yami.trading.service.user.WalletExtendService; |
| | | import com.yami.trading.util.ConverterUtil; |
| | | import io.swagger.annotations.Api; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.jetbrains.annotations.NotNull; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.CrossOrigin; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.text.DecimalFormat; |
| | | import java.time.LocalDate; |
| | | import java.util.*; |
| | | |
| | | /** |
| | |
| | | CapitaltWalletService capitaltWalletService; |
| | | @Autowired |
| | | WalletExtendService walletExtendService; |
| | | @Autowired |
| | | PurchaseRecordService purchaseRecordService; |
| | | |
| | | |
| | | /** |
| | | * 12.29定制ico购买 |
| | | */ |
| | | @RequestMapping(action + "ico_buy.action") |
| | | public Object ico_buy(HttpServletRequest request) { |
| | | |
| | | // 委托数量 |
| | | String volume = request.getParameter("volume"); |
| | | String session_token = request.getParameter("session_token"); |
| | | String symbol = request.getParameter("symbol"); |
| | | // limit order的交易价格 |
| | | String price = request.getParameter("price"); |
| | | // 计划委托 是之前火币那边拷贝学过来的一个功能 只是只有一个盘在用,暂时注释不用 |
| | | // 是否计划委托 |
| | | String is_trigger_order = request.getParameter("is_trigger_order"); |
| | | // 计划委托的触发价 |
| | | String trigger_price = request.getParameter("trigger_price"); |
| | | // 订单报价类型。 "limit":限价 "opponent":对手价(市价) |
| | | String order_price_type = request.getParameter("order_price_type"); |
| | | |
| | | Result<Object> result = getObjectResult(volume, session_token, symbol, price, is_trigger_order, trigger_price, order_price_type); |
| | | if(!result.isSucceed()){ |
| | | return result; |
| | | } |
| | | |
| | | String partyId = SecurityUtils.getUser().getUserId(); |
| | | User user = userService.getById(partyId); |
| | | |
| | | PurchaseRecord purchaseRecord = purchaseRecordService.getOne(new LambdaQueryWrapper<>(PurchaseRecord.class) |
| | | .eq(PurchaseRecord::getUserId, user.getUserId())); |
| | | |
| | | BigDecimal amount = new BigDecimal(volume).divide(new BigDecimal(price)).setScale(4,RoundingMode.HALF_UP); |
| | | if(ObjectUtil.isEmpty(purchaseRecord)){ |
| | | PurchaseRecord record = new PurchaseRecord(); |
| | | record.setUserId(user.getUserId()); |
| | | record.setPurchaseQuantity(amount); |
| | | record.setPurchasePrice(new BigDecimal(price)); |
| | | record.setTotalAmount(new BigDecimal(volume)); |
| | | purchaseRecordService.save(record); |
| | | return Result.succeed(); |
| | | } |
| | | purchaseRecord.setPurchaseQuantity(purchaseRecord.getPurchaseQuantity().add(amount)); |
| | | purchaseRecord.setTotalAmount(purchaseRecord.getTotalAmount().add(new BigDecimal(volume))); |
| | | purchaseRecord.setPurchasePrice(purchaseRecord.getTotalAmount().divide(purchaseRecord.getPurchaseQuantity(), 4,RoundingMode.HALF_UP)); |
| | | purchaseRecordService.updateById(purchaseRecord); |
| | | return Result.succeed(); |
| | | } |
| | | |
| | | /** |
| | | * 12.29定制ico购买 |
| | | */ |
| | | @RequestMapping(action + "get_ico_position.action") |
| | | public Object get_ico_position(HttpServletRequest request) { |
| | | String partyId = SecurityUtils.getUser().getUserId(); |
| | | User user = userService.getById(partyId); |
| | | List<Realtime> realtime_list = this.dataService.realtime("pendleusdt"); |
| | | Realtime realtime = null; |
| | | if (realtime_list.size() > 0) { |
| | | realtime = realtime_list.get(0); |
| | | } |
| | | BigDecimal close = BigDecimal.ZERO; |
| | | if (null != realtime) { |
| | | close = realtime.getClose(); |
| | | } |
| | | |
| | | |
| | | |
| | | PurchaseRecord purchaseRecord = purchaseRecordService.getOne(new LambdaQueryWrapper<>(PurchaseRecord.class) |
| | | .eq(PurchaseRecord::getUserId, user.getUserId())); |
| | | if(ObjectUtil.isNotEmpty(purchaseRecord)){ |
| | | PurchaseRecordDto purchaseRecordDto = ConverterUtil.convert(purchaseRecord, PurchaseRecordDto.class); |
| | | Item item = itemService.getOne(new LambdaQueryWrapper<Item>().eq(Item::getName, "CLK/USDT")); |
| | | if (item != null) { |
| | | WalletExtend walletExtend = walletExtendService.getOne(new LambdaQueryWrapper<>(WalletExtend.class) |
| | | .eq(WalletExtend::getWallettype, item.getSymbol()) |
| | | .eq(WalletExtend::getPartyId, user.getUserId()) |
| | | .last(" limit 1")); |
| | | if (walletExtend != null) { |
| | | purchaseRecordDto.setPurchaseQuantity(BigDecimal.valueOf(walletExtend.getAmount()).setScale(4,RoundingMode.HALF_UP)); |
| | | } |
| | | } |
| | | |
| | | purchaseRecordDto.setCurrentPrice(close); |
| | | //持仓市值 |
| | | purchaseRecordDto.setPositionvalue(close.multiply(purchaseRecordDto.getPurchaseQuantity()).setScale(4, RoundingMode.HALF_UP)); |
| | | //均价总额 |
| | | BigDecimal currentTotalPrice = purchaseRecordDto.getPurchaseQuantity().multiply(purchaseRecord.getPurchasePrice()); |
| | | BigDecimal profit = purchaseRecordDto.getPositionvalue().subtract(currentTotalPrice); |
| | | purchaseRecordDto.setProfit(profit.setScale(4, RoundingMode.HALF_UP)); |
| | | if (currentTotalPrice.compareTo(BigDecimal.ZERO) != 0) { |
| | | BigDecimal profitPercent = (purchaseRecordDto.getPositionvalue().subtract(currentTotalPrice)).divide(currentTotalPrice,4,RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); |
| | | purchaseRecordDto.setProfitPercent(profitPercent); |
| | | } |
| | | purchaseRecordDto.setLockingTime(LocalDate.of(2026, 2, 4)); |
| | | return Result.succeed(purchaseRecordDto); |
| | | } |
| | | return Result.succeed(new PurchaseRecordDto()); |
| | | } |
| | | |
| | | /** |
| | | * 兑换币 如果是使用usdt兑换其他币种,则直接执行正常买币open流程 如果是其他币种--》usdt 则是直接卖币流程 |
| | | * 如果是其他币种到另一个币种,则需要先卖出,然后再买入 |
| | |
| | | String volume_temp = request.getParameter("volume"); |
| | | if (StringUtils.isNullOrEmpty(volume_temp) |
| | | || !StringUtils.isDouble(volume_temp) || Double.valueOf(volume_temp) <= 0) { |
| | | throw new YamiShopBindException("请输入正确的货币数量"); |
| | | throw new YamiShopBindException("Please enter a valid currency amount"); |
| | | } |
| | | double volume = Double.valueOf(volume_temp); |
| | | String symbol = request.getParameter("symbol"); |
| | | String symbol_to = request.getParameter("symbol_to"); |
| | | if (symbol.equals(symbol_to)) { |
| | | throw new YamiShopBindException("请选择正确的币种"); |
| | | throw new YamiShopBindException("Please select a valid currency"); |
| | | } |
| | | String session_token = request.getParameter("session_token"); |
| | | String partyId = SecurityUtils.getUser().getUserId(); |
| | |
| | | if ((object == null) || (!partyId.equals((String) object))) { |
| | | log.info("sessionToken{}", object); |
| | | System.out.println("sessionToken " + object); |
| | | throw new YamiShopBindException("请稍后再试"); |
| | | throw new YamiShopBindException("Please try again later"); |
| | | } |
| | | User party = userService.getById(partyId); |
| | | if (!party.isEnabled()) { |
| | | throw new YamiShopBindException("用户已禁用!"); |
| | | throw new YamiShopBindException("User is disabled!"); |
| | | } |
| | | symbol = symbol.toLowerCase(); |
| | | symbol_to = symbol_to.toLowerCase(); |
| | |
| | | if (realtime_list.size() > 0) { |
| | | realtime = realtime_list.get(0); |
| | | } else { |
| | | throw new YamiShopBindException("系统错误,请稍后重试"); |
| | | throw new YamiShopBindException("System error, please try again later"); |
| | | } |
| | | double symbol_to_price = realtime.getClose().doubleValue(); |
| | | // usdt除以的数量 |
| | |
| | | if (realtime_list.size() > 0) { |
| | | realtime = realtime_list.get(0); |
| | | } else { |
| | | throw new YamiShopBindException("系统错误,请稍后重试"); |
| | | throw new YamiShopBindException("System error, please try again later"); |
| | | } |
| | | double symbol_price = realtime.getClose().doubleValue(); |
| | | // 对应usdt数量 |
| | |
| | | realtime = realtime_list.get(0); |
| | | symbol_price = realtime.getClose().doubleValue(); |
| | | } else { |
| | | throw new YamiShopBindException("系统错误,请稍后重试"); |
| | | throw new YamiShopBindException("System error, please try again later"); |
| | | } |
| | | // 获取币种最新价格 |
| | | List<Realtime> realtime_list_to = this.dataService.realtime(symbol_to); |
| | |
| | | realtime_to = realtime_list_to.get(0); |
| | | symbol_to_price = realtime_to.getClose().doubleValue(); |
| | | } else { |
| | | throw new YamiShopBindException("系统错误,请稍后重试"); |
| | | throw new YamiShopBindException("System error, please try again later"); |
| | | } |
| | | if (symbol_to_price == 0) { |
| | | symbol_to_price = 1; |
| | |
| | | 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 data; |
| | | } |
| | |
| | | if (realtimes != null && realtimes.size() > 0) { |
| | | close = realtimes.get(0).getClose().doubleValue(); |
| | | } else { |
| | | throw new YamiShopBindException("参数错误"); |
| | | throw new YamiShopBindException("Invalid parameters"); |
| | | } |
| | | return close; |
| | | } |
| | |
| | | // 兑换后的币种 |
| | | String symbol_to = request.getParameter("symbol_to"); |
| | | if (symbol.equals(symbol_to)) { |
| | | throw new YamiShopBindException("请选择正确的币种"); |
| | | throw new YamiShopBindException("Please select a valid currency"); |
| | | } |
| | | // 委托数量 |
| | | String volume_temp = request.getParameter("volume"); |
| | | if (StringUtils.isNullOrEmpty(volume_temp) |
| | | || !StringUtils.isDouble(volume_temp) || Double.valueOf(volume_temp) < 0) { |
| | | throw new YamiShopBindException("请输入正确的兑换数量"); |
| | | throw new YamiShopBindException("Please enter a valid exchange amount"); |
| | | } |
| | | 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); |
| | | } |
| | |
| | | String volume = request.getParameter("volume"); |
| | | String session_token = request.getParameter("session_token"); |
| | | String symbol = request.getParameter("symbol"); |
| | | // Item bySymbol = itemService.findBySymbol(symbol); |
| | | // if(bySymbol == null){ |
| | | // throw new YamiShopBindException("当前币对不存在"); |
| | | // } |
| | | // boolean isOpen = MarketOpenChecker.isMarketOpenByItemCloseType(bySymbol.getOpenCloseType()); |
| | | // if(!isOpen){ |
| | | // throw new YamiShopBindException("当前已经休市"); |
| | | // } |
| | | // limit order的交易价格 |
| | | String price = request.getParameter("price"); |
| | | // 计划委托 是之前火币那边拷贝学过来的一个功能 只是只有一个盘在用,暂时注释不用 |
| | |
| | | String trigger_price = request.getParameter("trigger_price"); |
| | | // 订单报价类型。 "limit":限价 "opponent":对手价(市价) |
| | | String order_price_type = request.getParameter("order_price_type"); |
| | | return getObjectResult(volume, session_token, symbol, price, is_trigger_order, trigger_price, order_price_type); |
| | | } |
| | | |
| | | @NotNull |
| | | private Result<Object> getObjectResult(String volume, String session_token, String symbol, String price, String is_trigger_order, String trigger_price, String order_price_type) { |
| | | String partyId = SecurityUtils.getUser().getUserId(); |
| | | if (StringUtils.isNullOrEmpty(volume) |
| | | || !StringUtils.isDouble(volume) |
| | | || Double.valueOf(volume) <= 0) { |
| | | throw new YamiShopBindException("请输入正确的货币数量"); |
| | | throw new YamiShopBindException("Please enter a valid currency amount"); |
| | | } |
| | | Object object = this.sessionTokenService.cacheGet(session_token); |
| | | this.sessionTokenService.del(session_token); |
| | | if ((object == null) || (!partyId.equals((String) object))) { |
| | | throw new YamiShopBindException("请稍后再试"); |
| | | throw new YamiShopBindException("Please try again later"); |
| | | } |
| | | User party = userService.getById(partyId); |
| | | if (!party.isEnabled()) { |
| | | throw new YamiShopBindException("用户已禁用"); |
| | | throw new YamiShopBindException("User is disabled"); |
| | | } |
| | | |
| | | String userName = party.getUserName(); |
| | |
| | | System.out.println("stopUserInternet = " + stopUserInternet); |
| | | |
| | | if(Arrays.asList(stopUsers).contains(userName.trim())){ |
| | | throw new YamiShopBindException("无网络"); |
| | | throw new YamiShopBindException("No network connection"); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | RealNameAuthRecord party_kyc = realNameAuthRecordService.getByUserId(partyId); |
| | | if (party_kyc != null) { |
| | | if (!(party_kyc.getStatus() == 2) && "true".equals(sysparaService.find("exchange_by_kyc").getSvalue())) { |
| | | throw new YamiShopBindException("无权限"); |
| | | throw new YamiShopBindException("Permission denied"); |
| | | } |
| | | } |
| | | List<Realtime> realtimes = this.dataService.realtime(symbol); |
| | |
| | | if (realtimes != null) { |
| | | close = realtimes.get(0).getClose().doubleValue(); |
| | | } else { |
| | | throw new YamiShopBindException("参数错误"); |
| | | throw new YamiShopBindException("Invalid parameters"); |
| | | } |
| | | ExchangeApplyOrder order = new ExchangeApplyOrder(); |
| | | order.setPartyId(partyId); |
| | |
| | | } |
| | | exchangeApplyOrderService.saveCreate(order); |
| | | return Result.succeed(); |
| | | } |
| | | |
| | | public static boolean isAfterFebruary9th2026() { |
| | | LocalDate today = LocalDate.now(); |
| | | LocalDate targetDate = LocalDate.of(2026, 2, 9); |
| | | |
| | | return today.isAfter(targetDate); |
| | | } |
| | | |
| | | /** |
| | |
| | | String order_price_type = request.getParameter("order_price_type"); |
| | | String partyId = SecurityUtils.getUser().getUserId(); |
| | | boolean lock = false; |
| | | |
| | | // |
| | | // if(symbol.equals("pendleusdt") && !isAfterFebruary9th2026()){ |
| | | // throw new YamiShopBindException("This coin has no issue time yet"); |
| | | // } |
| | | |
| | | |
| | | if (StringUtils.isNullOrEmpty(volume) |
| | | || !StringUtils.isDouble(volume) |
| | | || Double.valueOf(volume) <= 0) { |
| | | throw new YamiShopBindException("请输入正确的货币数量"); |
| | | throw new YamiShopBindException("Please enter a valid currency amount"); |
| | | } |
| | | lock = true; |
| | | Object object = this.sessionTokenService.cacheGet(session_token); |
| | | this.sessionTokenService.del(session_token); |
| | | if ((object == null) || (!partyId.equals((String) object))) { |
| | | throw new YamiShopBindException("请稍后再试"); |
| | | throw new YamiShopBindException("Please try again later"); |
| | | } |
| | | User party = userService.getById(partyId); |
| | | if (!party.isEnabled()) { |
| | | throw new YamiShopBindException("用户已禁用"); |
| | | throw new YamiShopBindException("User is disabled"); |
| | | } |
| | | |
| | | Syspara syspara = sysparaService.find("stop_user_internet"); |
| | |
| | | System.out.println("stopUserInternet = " + stopUserInternet); |
| | | |
| | | if(Arrays.asList(stopUsers).contains(party.getUserName())){ |
| | | throw new YamiShopBindException("无网络"); |
| | | throw new YamiShopBindException("No network connection"); |
| | | } |
| | | } |
| | | |
| | |
| | | if (realtimes != null) { |
| | | close = realtimes.get(0).getClose().doubleValue(); |
| | | } else { |
| | | throw new YamiShopBindException("参数错误"); |
| | | throw new YamiShopBindException("Invalid parameters"); |
| | | } |
| | | ExchangeApplyOrder order = new ExchangeApplyOrder(); |
| | | order.setPartyId(partyId); |