package project.data.internal; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import kernel.util.Arith; import kernel.util.DateUtils; import kernel.web.ApplicationUtil; import kernel.web.Page; import project.data.DataCache; import project.data.DataDBService; import project.data.job.RealtimeQueue; import project.data.model.Realtime; import project.item.ItemService; import project.item.model.Item; import project.syspara.SysparaService; public class DataDBServiceImpl implements DataDBService { private NamedParameterJdbcOperations namedParameterJdbcTemplate; private SysparaService sysparaService; private ItemService itemService; @Override public void saveAsyn(Realtime entity) { Realtime current = DataCache.getRealtime(entity.getSymbol()); if (current == null || current.getTs() != entity.getTs()) { Item item = itemService.cacheBySymbol(entity.getSymbol(), true); /** * 交易量倍数不为空或0时修改倍数 */ if (item.getMultiple() > 0) { entity.setVolume(Arith.mul(entity.getVolume(), item.getMultiple())); entity.setAmount(Arith.mul(entity.getAmount(), item.getMultiple())); } Double high = DataCache.getRealtimeHigh().get(entity.getSymbol()); if (high != null && high >= entity.getClose()) { entity.setHigh(high); } Double low = DataCache.getRealtimeLow().get(entity.getSymbol()); if (low != null && low <= entity.getClose()) { entity.setLow(low); } // Double h24Before = DataCache.getRealtime24HBeforeOpen().get(entity.getSymbol()); // if (h24Before != null) { // entity.setOpen(h24Before); // } /** * 时间有变化,才保存 */ DataCache.putRealtime(entity.getSymbol(), entity); List list = DataCache.getRealtimeHistory().get(entity.getSymbol()); if (list == null) list = new LinkedList(); if (entity.getLow() > 0) { if (entity.getHigh() < entity.getClose()) { entity.setHigh(entity.getClose()); } if (entity.getLow() > entity.getClose()) { entity.setLow(entity.getClose()); } /** * 修正最低为0的BUG,直接丢弃 */ list.add(entity); DataCache.getRealtimeHistory().put(entity.getSymbol(), list); RealtimeQueue.add(entity); } } } @Override public void saveBatch(List entities) { for (int i = 0; i < entities.size(); ApplicationUtil.executeSaveOrUpdate(entities.get(i++))); } @Override public Realtime get(String symbol) { Page page = new Page(1, 1, Integer.MAX_VALUE); List list = ApplicationUtil.executeSelect(Realtime.class,"WHERE SYMBOL=? LIMIT ?,?",new Object[] {symbol,page.getFirstElementNumber(),page.getPageSize()}); return list.size()<=0?null:list.get(0); } public void deleteRealtime(int days) { Map parameters = new HashMap(); Long ts = DateUtils.addDate(new Date(), days).getTime(); parameters.put("ts", ts); this.namedParameterJdbcTemplate.update("DELETE FROM T_REALTIME WHERE ts < :ts", parameters); } @Override public void updateOptimize(String table) { ApplicationUtil.executeSQL("OPTIMIZE TABLE "+table); } @Override public List findRealtimeOneDay(String symbol,int num) { Page page = new Page(1,num,Integer.MAX_VALUE); return ApplicationUtil.executeSelect(Realtime.class,"WHERE SYMBOL=? ORDER BY TS ASC LIMIT ?,?",new Object[] {symbol,page.getFirstElementNumber(),page.getPageSize()}); } public void setNamedParameterJdbcTemplate(NamedParameterJdbcOperations namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; } public void setSysparaService(SysparaService sysparaService) { this.sysparaService = sysparaService; } public void setItemService(ItemService itemService) { this.itemService = itemService; } }