package com.yami.trading.huobi.data.internal;
|
|
import com.yami.trading.bean.data.domain.Realtime;
|
import com.yami.trading.bean.item.domain.Item;
|
import com.yami.trading.common.exception.YamiShopBindException;
|
import com.yami.trading.common.util.Arith;
|
import com.yami.trading.huobi.data.AdjustmentValueCache;
|
import com.yami.trading.huobi.data.model.AdjustmentValue;
|
import com.yami.trading.service.data.DataService;
|
import com.yami.trading.service.item.ItemService;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.stereotype.Component;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
|
@Component
|
public class AdjustmentValueServiceImpl implements AdjustmentValueService {
|
|
@Autowired
|
@Qualifier("dataService")
|
private DataService dataService;
|
@Autowired
|
private ItemService itemService;
|
|
@Override
|
public void adjust(String symbol, double value, double second) {
|
if (value == 0) {
|
return;
|
}
|
|
Realtime realtime = dataService.realtime(symbol).get(0);
|
BigDecimal newPrice = BigDecimal.valueOf(realtime.getClose());
|
BigDecimal plus = BigDecimal.valueOf(Math.abs(value));
|
if (plus.divide(newPrice, 2, RoundingMode.HALF_UP).compareTo(new BigDecimal("0.1")) > 0) {
|
throw new YamiShopBindException("调整偏差过大,超过10%");
|
}
|
|
if (second <= 0) {
|
// 即时生效
|
double currentValue = AdjustmentValueCache.getCurrentValue().get(symbol);
|
if (currentValue == 0) {
|
AdjustmentValueCache.getCurrentValue().put(symbol, value);
|
} else {
|
AdjustmentValueCache.getCurrentValue().put(symbol, Arith.add(currentValue, value));
|
}
|
// 马上扣除价格,避免因为数据没有拉取导致加不正确
|
realtime.setClose(Arith.add(realtime.getClose(), value));
|
// 持久化缓存
|
Item item = this.itemService.findBySymbol(symbol);
|
if (item.getAdjustmentValue() != AdjustmentValueCache.getCurrentValue().get(symbol)) {
|
item.setAdjustmentValue(AdjustmentValueCache.getCurrentValue().get(symbol));
|
itemService.saveOrUpdate(item);
|
}
|
} else {
|
AdjustmentValue adjustmentValue = new AdjustmentValue();
|
adjustmentValue.setSymbol(symbol);
|
adjustmentValue.setValue(value);
|
adjustmentValue.setSecond(second);
|
AdjustmentValueCache.getDelayValue().put(symbol, adjustmentValue);
|
}
|
}
|
|
@Override
|
public double getCurrentValue(String symbol) {
|
return AdjustmentValueCache.getCurrentValue().get(symbol);
|
}
|
|
@Override
|
public AdjustmentValue getDelayValue(String symbol) {
|
return AdjustmentValueCache.getDelayValue().get(symbol);
|
}
|
|
public void setDataService(DataService dataService) {
|
this.dataService = dataService;
|
}
|
|
public void setItemService(ItemService itemService) {
|
this.itemService = itemService;
|
}
|
|
}
|