@date 2020-06-19 19:59
*/
@Service
@Slf4j
public class StatisticsOdsService {
@Resource
private StatisticsOdsMapper statisticsOdsMapper;
@Resource
private StatisticsClearOdsMapper statisticsClearOdsMapper;
@Resource
private GrpcTokenService grpcTokenService;
private final Integer PH_DEPOSIT = 701;
private final Integer PH_WITHDRAWAL = 702;
private final Integer FIAT_DEPOSIT = 12;
private final Integer FIAT_WITHDRAWAL = 22;
private final Integer CHAIN_DEPOSIT = 10;
private final Integer CHAIN_WITHDRAWAL = 20;
private final Integer BUY_LOAD = 16;
private final Integer PAY_BILL = 17;
private final Integer INVOICE_PAY = 24;
private LoadingCache<String, RateBo> TOKEN_RATE_CACHE;
private LoadingCache<String, BigDecimal> BALANCE_FLOW_CACHE;
@Resource
@Qualifier("quoteRedisTemplate")
private RedisTemplate quoteRedisTemplate;
private final String RATE_KEY = "MKT:QUOTE:RATE";
private final RateBo NULL = new RateBo();
@PostConstruct
public void init() {
TOKEN_RATE_CACHE = CacheBuilder.newBuilder()
.refreshAfterWrite(60, TimeUnit.SECONDS)
.maximumSize(1000)
.build(new CacheLoader<>() {
@Override
public RateBo load(String token) {
try {
Object tokenObj = quoteRedisTemplate.opsForHash().get(RATE_KEY, token);
if (Objects.isNull(tokenObj)) {
return NULL;
}
log.info("tokenObj,{}",tokenObj.toString());
return JsonConvertor.fromJsonString(tokenObj.toString(), RateBo.class);
} catch (Exception e) {
log.error("loadExchangeRateFromRedis error.", e);
}
return NULL;
}
});
BALANCE_FLOW_CACHE = CacheBuilder.newBuilder()
.refreshAfterWrite(60, TimeUnit.SECONDS)
.maximumSize(1000)
.build(new CacheLoader<>() {
@Override
public BigDecimal load(String key) {
String[] split = key.split("#");
Integer type = Integer.valueOf(split[0]);
BigDecimal money = statisticsClearOdsMapper.groupBySubject(type,split[1],split[2],split[3]);
return money == null ? BigDecimal.ZERO:money;
}
});
}
public BigDecimal getRate(String baseToken, String quoteToken) {
if (baseToken.equalsIgnoreCase(quoteToken)) {
return BigDecimal.ONE;
}
try {
RateBo rateBo = TOKEN_RATE_CACHE.get(baseToken);
if (rateBo != null) {
return rateBo.getRate(quoteToken);
}
} catch (Exception e) {
log.error("getRate error.{},quoteToken.{},message.{}", baseToken, quoteToken, e.getMessage());
}
return BigDecimal.ZERO;
}