1
zj
2024-08-02 a7bd76dfd00efc7b03999c4559cf8554e34c19cb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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<Realtime> list = DataCache.getRealtimeHistory().get(entity.getSymbol());
            if (list == null) list = new LinkedList<Realtime>();
            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<Realtime> 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<Realtime> 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<String, Object> parameters = new HashMap<String, Object>();
        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<Realtime> 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;
    }
}