ipo
zyy
2025-12-31 f7d714ecc4210b96de9e78eacf6fad394533a082
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
package com.yami.trading.admin.facade;
 
 
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.yami.trading.bean.data.domain.Kline;
import com.yami.trading.bean.item.domain.Item;
import com.yami.trading.common.config.ThreadPool;
import com.yami.trading.huobi.data.DataCache;
import com.yami.trading.huobi.data.internal.KlineService;
import com.yami.trading.huobi.hobi.http.HttpHelper;
import com.yami.trading.huobi.hobi.internal.SpiderService;
import com.yami.trading.huobi.hobi.internal.XueQiuDataServiceImpl;
import com.yami.trading.service.item.ItemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
@Component
@Slf4j
public class ItemVisitFacade {
 
    @Autowired
    private JdbcTemplate jdbcTemplate;
 
    @Autowired
    private ItemService itemService;
    @Autowired
    private XueQiuDataServiceImpl xueQiuDataService;
    @Autowired
    private KlineService klineService;
    @Autowired
    private SpiderService spiderService;
 
    /**
     * 次逻辑不会涉及高并发
     *
     * @param symbol
     */
    @Transactional
    public void updateOrInsertVisit(String symbol) {
        log.info("ItemVisitFacade 正在访问 {}", symbol);
        Item item = itemService.findBySymbol(symbol);
        // 如果当前不是默认激活和激活,激活先.并且初始化k线图
        if (!StrUtil.equalsAny(item.getCrawlStatus(), Item.ACTIVE, Item.DEFAULT_ACTIVE)) {
            log.info("ItemVisitFacade 正在激活 {}", symbol);
            itemService.crawlActive(symbol);
            log.info("ItemVisitFacade 数据库激活 {} 完成", symbol);
 
            ThreadPool.getApplicationThreadPool().execute(() -> {
                        //xueQiuDataService.lease(symbol);
                        log.info("ItemVisitFacade 开始初始化k线图 {}", symbol);
                        boolean selfDataInitSuccess = saveInitSelfData(symbol);
                        log.info("ItemVisitFacade 从自己数据源初始化k线图获取 {} 状态为 {}", symbol, selfDataInitSuccess);
                        String cookie = HttpHelper.getCookie("https://xueqiu.com/");
                        Map<String, List<Kline>> dailyWeekMonthHistoryMap = xueQiuDataService.getDailyWeekMonthHistory(symbol, cookie);
                        Map<String, List<Kline>> hourlyAndMinuteHistoryMap = xueQiuDataService.getHourlyAndMinuteHistory(symbol, cookie);
                        if (CollectionUtil.isNotEmpty(dailyWeekMonthHistoryMap) && CollectionUtil.isNotEmpty(hourlyAndMinuteHistoryMap)){
                            klineService.saveInit(symbol, dailyWeekMonthHistoryMap, hourlyAndMinuteHistoryMap);
                        }
                        log.info("ItemVisitFacade 初始化k线图 {} 完成", symbol);
                    }
            );
        }
 
        String defaultActive = Item.DEFAULT_ACTIVE.equalsIgnoreCase(item.getCrawlStatus()) ? "1" : "0";
        // 将币对的访问次数+1
        String sql = "INSERT INTO t_item_visit (symbol, visit_count, last_visit_time, default_active) " +
                "VALUES (?, 1, NOW(), ?) " +
                "ON DUPLICATE KEY UPDATE " +
                "visit_count = visit_count + 1, " +
                "last_visit_time = NOW()";
 
        jdbcTemplate.update(sql, symbol, defaultActive);
        log.info("ItemVisitFacade 访问次数+1 {} 完成", symbol);
 
    }
 
    private boolean saveInitSelfData(String symbols) {
        log.info("正在通过自己数据源 初始化k綫圖:{}", symbols);
        List<Map<String, List<Kline>>> klines = spiderService.getKlines(symbols);
        if (CollectionUtil.isEmpty(klines)) {
            return false;
        }
        for (Map<String, List<Kline>> map : klines) {
            List<Kline> klines5P = map.get(Kline.PERIOD_5MIN);
            if (CollectionUtil.isNotEmpty(klines5P)) {
                String symbol = klines5P.get(0).getSymbol();
                klineService.saveInit(symbol, map);
                DataCache.clearLatestRealTime60s(symbol);
                //  dataDBService.delete(symbols);
                log.info("初始化k线图{} 数量为{}", symbol, map.size());
                return true;
            }
        }
        log.info("完成自己数据源 初始化k綫圖:{}", symbols);
        return false;
 
    }
 
    public List<String> getSymbolsOlderThanNDay(int days) {
        String query = "SELECT symbol FROM t_item_visit WHERE default_active = 0 and last_visit_time <= DATE_SUB(NOW(), INTERVAL ? DAY)";
        return jdbcTemplate.queryForList(query, new Object[]{days}, String.class);
    }
 
 
    public static void main(String[] args) {
        XueQiuDataServiceImpl xueQiuDataService = new XueQiuDataServiceImpl();
        String cookie = HttpHelper.getCookie("https://xueqiu.com/");
        String symbol = "SZ300066";
        Map<String, List<Kline>> dailyWeekMonthHistoryMap = xueQiuDataService.getDailyWeekMonthHistory(symbol, cookie);
        Map<String, List<Kline>> hourlyAndMinuteHistoryMap = xueQiuDataService.getHourlyAndMinuteHistory(symbol, cookie);
        System.out.println(dailyWeekMonthHistoryMap);
    }
}