trading-order-admin/src/main/java/com/yami/trading/admin/task/RealtimePushJob.java
@@ -12,6 +12,7 @@ import com.yami.trading.common.web.ResultObject; import com.yami.trading.huobi.data.AdjustmentValueCache; import com.yami.trading.huobi.data.DataCache; import com.yami.trading.huobi.data.internal.DataDBService; import com.yami.trading.service.item.ItemService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -30,6 +31,8 @@ public class RealtimePushJob implements Runnable { @Autowired private ItemService itemService; @Autowired DataDBService dataDBService; public void start() { new Thread(this, "realtimePushJob").start(); @@ -114,7 +117,7 @@ map.put("timestamp", realtime.getTs()); map.put("current_time", realtime.getCurrentTime()); map.put("name", realtime.getName()); map.put("change_ratio", realtime.getChangeRatio()); map.put("change_ratio", dataDBService.getChangeRatio(realtime, symbol)); map.put("netChange", realtime.getNetChange()); map.put("open", realtime.getOpen()); map.put("close", realtime.getClose()); trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java
@@ -160,7 +160,7 @@ if (CollectionUtil.isNotEmpty(realtimes)) { Realtime realtime = realtimes.get(0); symbolDTO.setChangeRatio(realtime.getChangeRatio()); symbolDTO.setChangeRatio(realtime.getChangeRatio2()); symbolDTO.setAmount(realtime.getAmount()); symbolDTO.setVolume(realtime.getVolume()); symbolDTO.setClose(realtime.getClose()); trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java
@@ -12,6 +12,7 @@ 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.DataDBService; import com.yami.trading.service.data.DataService; import com.yami.trading.service.item.ItemService; import io.swagger.annotations.Api; @@ -49,6 +50,8 @@ private DataService dataService; @Autowired private ItemService itemService; @Autowired DataDBService dataDBService; @ApiOperation(value = "行情") @GetMapping(HOBI + "getRealtime.action") @@ -81,6 +84,7 @@ d.setAmount(d.getAmount().setScale(2, RoundingMode.HALF_UP)); } d.setSymbolData(bySymbol.getSymbolData()); d.setChangeRatio(dataDBService.getChangeRatio(d, d.getSymbol())); }); List<Realtime> result = new ArrayList<>(); trading-order-bean/src/main/java/com/yami/trading/bean/data/domain/Realtime.java
@@ -89,6 +89,7 @@ */ @TableField(exist = false) @ApiModelProperty("涨跌幅") @JSONField(name = "changeRatio") private BigDecimal changeRatio; /** @@ -167,7 +168,8 @@ return 0; } public BigDecimal getChangeRatio() { public BigDecimal getChangeRatio2() { if (BigDecimal.ZERO.compareTo(open) == 0) { return BigDecimal.ZERO; @@ -180,7 +182,7 @@ } public BigDecimal getNetChange() { BigDecimal netChange = close.multiply(getChangeRatio()).divide(new BigDecimal(100), 10, RoundingMode.HALF_UP); BigDecimal netChange = close.multiply(getChangeRatio2()).divide(new BigDecimal(100), 10, RoundingMode.HALF_UP); netChange = netChange.setScale(4, RoundingMode.DOWN); return netChange; } trading-order-common/src/main/java/com/yami/trading/common/constants/RedisKeys.java
@@ -275,4 +275,5 @@ public final static String SYMBOL_AMOUNT_VOLUME = "SYMBOL_AMOUNT_VOLUME_"; public final static String REAL_TIME_BEFORE = "REAL_TIME_BEFORE"; } trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBService.java
@@ -3,6 +3,7 @@ import com.yami.trading.bean.data.domain.Realtime; import java.math.BigDecimal; import java.util.List; public interface DataDBService { @@ -15,6 +16,11 @@ * 数据库最新的实时价格 */ public Realtime get(String symbol); /** * 数据库前一天最后价格 */ public Realtime getBefore(String symbol); /** * 批量保存 @@ -34,4 +40,5 @@ */ List<Realtime> listRealTime60s(String symbol); public BigDecimal getChangeRatio(Realtime realtime, String symbol); } trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java
@@ -2,9 +2,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.yami.trading.bean.data.domain.Kline; import com.yami.trading.bean.data.domain.Realtime; import com.yami.trading.bean.item.domain.Item; import com.yami.trading.common.config.RequestDataHelper; import com.yami.trading.common.constants.Constants; import com.yami.trading.common.constants.RedisKeys; import com.yami.trading.common.util.DateUtils; import com.yami.trading.huobi.data.DataCache; import com.yami.trading.huobi.data.job.RealtimeQueue; @@ -13,11 +16,14 @@ import com.yami.trading.service.syspara.SysparaService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.*; import java.util.*; import java.util.stream.Collectors; @@ -34,6 +40,8 @@ private RealtimeService realtimeService; @Autowired private JdbcTemplate jdbcTemplate; @Autowired RedisTemplate redisTemplate; @Override public void saveAsyn(Realtime realtime) { @@ -86,6 +94,44 @@ RequestDataHelper.clear(); return realtime; } @Override public Realtime getBefore(String symbol) { Realtime realtime = (Realtime) redisTemplate.opsForValue().get(RedisKeys.REAL_TIME_BEFORE + symbol); if (realtime != null) { long ts = realtime.getTs(); // 1. 确定时间戳单位(假设ts是毫秒级,若为秒级需用ofEpochSecond()) Instant instant = Instant.ofEpochMilli(ts); // 2. 将时间戳转换为当地时区的日期(指定时区更准确,如Asia/Shanghai) LocalDate tsDate = instant.atZone(ZoneId.of("Asia/Shanghai")).toLocalDate(); // 3. 获取“昨天的日期”(当前日期减1天) LocalDate yesterday = LocalDate.now(ZoneId.of("Asia/Shanghai")).minusDays(1); // 4. 判断是否为昨天 boolean isYesterday = tsDate.equals(yesterday); if (isYesterday) { return realtime; } } // 没缓存重新保存 // 计算当天0点的时间戳(毫秒级) LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); long todayStartTime = todayStart.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); RequestDataHelper.set("symbol", symbol); LambdaQueryWrapper<Realtime> queryWrapper = new LambdaQueryWrapper<Realtime>() .eq(Realtime::getSymbol, symbol) .lt(Realtime::getTs, todayStartTime) .orderByDesc(Realtime::getTs) .last("LIMIT 1"); realtime = realtimeService.getBaseMapper().selectOne(queryWrapper); RequestDataHelper.clear(); if (realtime != null) { redisTemplate.opsForValue().set(RedisKeys.REAL_TIME_BEFORE + symbol, realtime); } return realtime; } public void deleteRealtime(int days) { @@ -142,5 +188,20 @@ return realtimes; } @Override public BigDecimal getChangeRatio(Realtime realtime, String symbol) { Item item = itemService.findBySymbol(symbol); if (item.getType().equals(Item.cryptos) && (item.getCurrencyType() != null && item.getCurrencyType() == 1)) { Realtime realtimeBefore = getBefore(symbol); if (realtimeBefore == null) { return BigDecimal.ZERO; } BigDecimal open = realtimeBefore.getClose(); BigDecimal changeRatio = realtime.getClose().subtract(open).divide(open, 10, RoundingMode.HALF_UP); changeRatio = changeRatio.multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN); return changeRatio; } else { return realtime.getChangeRatio2(); } } } trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalListService.java
@@ -97,7 +97,7 @@ dto.setName(itemService.findBySymbol(dto.getSymbol()).getName()); Realtime realtime = dataService.realtime(dto.getSymbol()).get(0); dto.setClose(realtime.getClose()); dto.setChangeRatio(realtime.getChangeRatio()); dto.setChangeRatio(realtime.getChangeRatio2()); dto.setTurnoverRate(realtime.getTurnoverRate()); dto.setVolumeRatio(realtime.getVolumeRatio()); allSymbos.add(dto.getSymbol()); @@ -128,7 +128,7 @@ // 设置 DTO 属性 dto.setClose(realtime.getClose()); dto.setChangeRatio(realtime.getChangeRatio()); dto.setChangeRatio(realtime.getChangeRatio2()); dto.setTurnoverRate(realtime.getTurnoverRate()); dto.setVolumeRatio(realtime.getVolumeRatio()); trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalService.java
@@ -72,7 +72,7 @@ if(!CollectionUtil.isEmpty(realtimes)){ Realtime realtime = realtimes.get(0); dto.setClose(realtime.getClose()); dto.setChangeRatio(realtime.getChangeRatio()); dto.setChangeRatio(realtime.getChangeRatio2()); dto.setTurnoverRate(realtime.getTurnoverRate()); dto.setVolumeRatio(realtime.getVolumeRatio()); }else{