src/main/java/com/xcong/excoin/common/system/mapper/CandlestickMapper.java
New file @@ -0,0 +1,21 @@ package com.xcong.excoin.common.system.mapper; import com.huobi.client.model.Candlestick; import com.xcong.excoin.modules.symbols.parameter.vo.KlineDataVo; import com.xcong.excoin.utils.api.response.KlineReturn; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; /** * @author wzy * @date 2020-05-29 **/ @Mapper public abstract class CandlestickMapper { public static final CandlestickMapper INSTANCE = Mappers.getMapper(CandlestickMapper.class); @Mapping(source = "timestamp", target = "time") public abstract KlineDataVo toKlineDataVo(Candlestick candlestick); } src/main/java/com/xcong/excoin/modules/symbols/controller/SymbolsController.java
@@ -2,10 +2,11 @@ import com.xcong.excoin.common.response.Result; import com.xcong.excoin.modules.symbols.parameter.dto.KlineDetailDto; import com.xcong.excoin.modules.symbols.parameter.vo.HomeSymbolsVo; import com.xcong.excoin.modules.symbols.parameter.vo.KlineDataVo; import com.xcong.excoin.modules.symbols.service.SymbolsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import com.xcong.excoin.utils.TypeJudgeUtils; import io.swagger.annotations.*; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -26,21 +27,34 @@ private SymbolsService symbolsService; @ApiOperation(value = "轮询获取app首页币种交易信息", notes = "轮询获取app首页币种交易信息") @ApiResponses({ @ApiResponse(code = 0, message = "success", response = HomeSymbolsVo.class) }) @GetMapping(value = "/homeSymbols") public Result homeSymbols(@ApiParam(name = "type", value = "类型1-币币2-合约3-自选", required = true, example = "1") Integer type) { return symbolsService.homeSymbols(type); } @ApiOperation(value = "根据币种查询币种当前各种数据", notes = "根据币种查询币种当前各种数据") @ApiResponses({ @ApiResponse(code = 0, message = "success", response = HomeSymbolsVo.class) }) @GetMapping(value = "/findSymbolData") public Result findSymbolData(@ApiParam(name = "symbol", value="币种", required = true, example = "BTC/USDT") String symbol) { public Result findSymbolData(@ApiParam(name = "symbol", value = "币种", required = true, example = "BTC/USDT") String symbol) { return symbolsService.findSymbolData(symbol); } @ApiOperation(value = "查询历史K线数据", notes = "查询历史K线数据") @ApiResponses({ @ApiResponse(code = 0, message = "success", response = KlineDataVo.class) }) @PostMapping(value = "/klineDetail") public Result klineDetail(@RequestBody @Valid KlineDetailDto klineDetailDto) { return null; if (!TypeJudgeUtils.klinePeriod(klineDetailDto.getPeriod())) { return Result.fail("非法参数"); } return symbolsService.findKlineDetails(klineDetailDto); } } src/main/java/com/xcong/excoin/modules/symbols/parameter/dto/KlineDetailDto.java
@@ -20,14 +20,10 @@ private String symbol; @NotNull @ApiModelProperty(value = "", example = "5min") @ApiModelProperty(value = "k线时长", example = "5min") private String period; @NotNull @ApiModelProperty(value = "", example = "150") private Integer size; @NotNull @ApiModelProperty(value = "", example = "1") @ApiModelProperty(value = "类型 1-币币2-合约", example = "1") private Integer type; } src/main/java/com/xcong/excoin/modules/symbols/parameter/vo/KlineDataVo.java
New file @@ -0,0 +1,40 @@ package com.xcong.excoin.modules.symbols.parameter.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * k线返回类 * * @author wzy * @date 2020-05-29 **/ @Data @ApiModel(value = "KlineDataVo", description = "k线返回类") public class KlineDataVo { @ApiModelProperty(value = "时间") private long time; @ApiModelProperty(value = "开盘指数价") private BigDecimal open; @ApiModelProperty(value = "收盘指数价") private BigDecimal high; @ApiModelProperty(value = "最低指数价") private BigDecimal low; @ApiModelProperty(value = "最高指数价") private BigDecimal close; @ApiModelProperty(value = "成交量张数") private BigDecimal volume; @ApiModelProperty(value = "成交量") private BigDecimal amount; } src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java
@@ -2,6 +2,7 @@ import com.xcong.excoin.common.response.Result; import com.xcong.excoin.modules.symbols.parameter.dto.KlineDetailDto; /** * @author wzy @@ -15,4 +16,6 @@ public Result findSymbolData(String symbol); public Result findKlineDetails(KlineDetailDto klineDetailDto); } src/main/java/com/xcong/excoin/modules/symbols/service/impl/SymbolsServiceImpl.java
@@ -1,13 +1,17 @@ package com.xcong.excoin.modules.symbols.service.impl; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.huobi.client.model.Candlestick; import com.xcong.excoin.common.contants.AppContants; import com.xcong.excoin.common.enumerates.SymbolEnum; import com.xcong.excoin.common.response.Result; import com.xcong.excoin.common.system.mapper.CandlestickMapper; import com.xcong.excoin.modules.platform.dao.PlatformCnyUsdtExchangeDao; import com.xcong.excoin.modules.platform.entity.PlatformCnyUsdtExchangeEntity; import com.xcong.excoin.modules.symbols.parameter.dto.KlineDetailDto; import com.xcong.excoin.modules.symbols.parameter.vo.HomeSymbolsVo; import com.xcong.excoin.modules.symbols.parameter.vo.KlineDataVo; import com.xcong.excoin.modules.symbols.service.SymbolsService; import com.xcong.excoin.utils.CoinTypeConvert; import com.xcong.excoin.utils.RedisUtils; @@ -143,4 +147,39 @@ return homeSymbolsVo; } @Override public Result findKlineDetails(KlineDetailDto klineDetailDto) { String key = "KINE_{}_{}"; // 币币k线数据 if (AppContants.HOME_SYMBOLS_COIN == klineDetailDto.getType()) { key = StrUtil.format(key, klineDetailDto.getSymbol(), klineDetailDto.getPeriod()); // 合约k线数据 } else { key = StrUtil.format(key, klineDetailDto.getSymbol(), klineDetailDto.getPeriod()); } Object data = redisUtils.get(key); if (data != null) { List list = (List) data; int length = 0; // 默认获取k线900个柱状(超出会报错) int size = 900; if (list.size() > size) { length = size - 1; } else { length = list.size() - 1; } List<KlineDataVo> result = new ArrayList<>(length); for (int i = length; i > 0; i--) { Candlestick object = (Candlestick) list.get(i); KlineDataVo klineDataVo = CandlestickMapper.INSTANCE.toKlineDataVo(object); result.add(klineDataVo); } return Result.ok(result); } return Result.fail("获取数据失败"); } } src/main/java/com/xcong/excoin/quartz/job/UsdtCnyExchangePriceUpdateJob.java
@@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.modules.platform.dao.PlatformCnyUsdtExchangeDao; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -20,6 +21,7 @@ * @author wzy * @date 2020-05-28 **/ @Slf4j @Component @ConditionalOnProperty(prefix = "app", name = "other-job", havingValue = "true") public class UsdtCnyExchangePriceUpdateJob { @@ -56,6 +58,9 @@ String code = jsonObject.getString("code"); if ("200".equals(code)) { JSONObject jsonData = (JSONObject) jsonObject.get("data"); log.info("{}", jsonData); log.info("{}", jsonData.getDouble("price")); log.info("{}", jsonData.getString("price")); cnyUsdtExchangeDao.updateUsdt(BigDecimal.valueOf(jsonData.getDouble("price"))); } } catch (Exception e) { src/main/java/com/xcong/excoin/utils/TypeJudgeUtils.java
@@ -25,4 +25,26 @@ return false; } } /** * 判断k线区间 * * @param period * @return */ public static boolean klinePeriod(String period) { switch (period) { case "1min": case "5min": case "30min": case "60min": case "4hour": case "1day": case "1week": return true; default: return false; } } } src/main/resources/application.yml
@@ -96,9 +96,9 @@ # k线更新任务控制 kline-update-job: false #最新价任务控制 newest-price-update-job: true newest-price-update-job: false #其他任务控制 other-job: true other-job: false rsa: public_key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCf8UFZK54AiK4PRu7tNd+Z8qZ77o/QXCnk25DRmygVpOEu5mGNSAvfnWmKp2pEV2RljeXq3Rid/+LQkonaebMJeXKSF0yxL/VgyeT8JaQ5gNbOrdfdlc+mFkXJyzyJt8YkvApEdPRNSU2ENBn7mgRfD0BYPM4vZ6/rv+de38FJwIDAQAB