package com.yami.trading.api.controller; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; import com.yami.trading.bean.data.domain.Kline; import com.yami.trading.bean.data.domain.Realtime; import com.yami.trading.bean.data.domain.TradeDetails; import com.yami.trading.bean.item.domain.Item; import com.yami.trading.common.domain.Result; import com.yami.trading.common.exception.YamiShopBindException; import com.yami.trading.common.lang.LangUtils; import com.yami.trading.common.util.StringUtils; import com.yami.trading.common.web.ResultObject; import com.yami.trading.huobi.data.DataCache; import com.yami.trading.huobi.data.internal.KlineConstant; import com.yami.trading.huobi.data.internal.KlineService; import com.yami.trading.service.data.DataService; import com.yami.trading.service.item.ItemService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.utils.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.List; import java.util.Map; /** * 行情实时价格 http接口 * */ @RestController @CrossOrigin @Slf4j @Api(tags = "实时行情数据") public class RealtimeController { public static final String HOBI = "api/hobi!"; @Qualifier("dataService") @Autowired private DataService dataService; @Autowired private ItemService itemService; @Autowired private KlineService klineService; @ApiOperation(value = "行情") @GetMapping(HOBI + "getRealtime.action") public Result> getRealtime(@RequestParam(value = "",required = false) String symbol) { try { if(StringUtils.isEmptyString(symbol)){ List items = itemService.findByType("forex"); StringBuilder symbolBuilder = new StringBuilder(); if (items != null && !items.isEmpty()) { for (Item item : items) { symbolBuilder.append(item.getSymbol()).append(","); } // 移除最后一个逗号 if (symbolBuilder.length() > 0) { symbolBuilder.setLength(symbolBuilder.length() - 1); } } symbol = symbolBuilder.toString(); } List data = this.dataService.realtime(symbol); data.forEach(d->{ Item bySymbol = itemService.findBySymbol(d.getSymbol()); if(LangUtils.isEnItem()){ bySymbol.transName(); } d.setType(bySymbol.getType()); d.setName(bySymbol.getName()); Integer decimals = bySymbol.getDecimals(); d.setClose(d.getClose().setScale(decimals, RoundingMode.HALF_UP)); d.setOpen(d.getOpen().setScale(decimals, RoundingMode.HALF_UP)); d.setHigh(d.getHigh().setScale(decimals, RoundingMode.HALF_UP)); d.setLow(d.getLow().setScale(decimals, RoundingMode.HALF_UP)); BigDecimal bigDecimal = BigDecimal.valueOf(1, decimals); d.setAsk(d.getClose().add(bigDecimal).setScale(decimals, RoundingMode.HALF_UP)); d.setBid(d.getClose().subtract(bigDecimal).setScale(decimals, RoundingMode.HALF_UP)); //涨跌幅 = (当天收盘价 - 前一日收盘价) / 前一日收盘价 * 100% // if(null != bySymbol.getYesterdayLastPrice() && bySymbol.getYesterdayLastPrice().compareTo(BigDecimal.ZERO) != 0){ // BigDecimal changePercent = (d.getClose().subtract(bySymbol.getYesterdayLastPrice())) // .divide(bySymbol.getYesterdayLastPrice(), 5, RoundingMode.HALF_UP) // 精确到4位小数 // .multiply(new BigDecimal("100").setScale(2)).setScale(4,RoundingMode.HALF_UP); // 乘以100得到百分比 // d.setChangeRatioStr(changePercent); // } if(d.getVolume()!=null){ d.setVolume(d.getVolume().setScale(2, RoundingMode.HALF_UP)); } if(d.getAmount()!=null){ d.setAmount(d.getAmount().setScale(2, RoundingMode.HALF_UP)); } d.setSymbolData(bySymbol.getSymbolData()); }); return Result.ok(data); } catch (Exception e) { log.error("生成实时数据失败", e); throw new YamiShopBindException("生成实时数据失败"); } } @ApiOperation(value = "行情") @GetMapping(HOBI + "getStockTradeList.action") public Result> getTradeDetails(@RequestParam String symbol) { try { List stockTradeList = DataCache.getStockTradeList(symbol); Integer decimal = itemService.getDecimal(symbol); String format = ""; if (decimal == 0) { format = "#"; } else { format = "#."; for (int j = 0; j < decimal; j++) { format = format + "#"; } } DecimalFormat df = new DecimalFormat(format); df.setRoundingMode(RoundingMode.FLOOR);// 向下取整 if(CollectionUtil.isEmpty(stockTradeList)){ return Result.ok(Lists.newArrayList()); } for (TradeDetails tradeDetails : stockTradeList) { tradeDetails.setCurrentStr(df.format(tradeDetails.getCurrent())); } return Result.ok(stockTradeList); } catch (Exception e) { log.error("生成实时数据失败", e); throw new YamiShopBindException("生成实时数据失败"); } } public static void main(String[] args) { BigDecimal bigDecimal = BigDecimal.valueOf(1, 4); System.out.println(bigDecimal); } }