zj
2025-01-06 0e7b38c2b3af72ea2a7f8a2fcbaad4d78e2c1977
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
package com.gear.swx.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gear.common.core.redis.RedisCache;
import com.gear.common.constant.SwxConstons;
import com.gear.swx.domain.*;
import com.gear.swx.mapper.*;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.gear.swx.service.ISwxMarketService;
import org.springframework.transaction.annotation.Transactional;
 
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
/**
 * 市场产品管理Service业务层处理
 *
 * @author czx
 * @date 2023-11-18
 */
@Service
public class SwxMarketServiceImpl extends ServiceImpl<SwxMarketMapper, SwxMarket> implements ISwxMarketService {
    @Autowired
    private SwxMarketMapper swxMarketMapper;
 
    @Autowired
    private SwxMarketAllMapper swxMarketAllMapper;
 
    @Autowired
    private SwxMarketOptionsMapper swxMarketOptionsMapper;
 
    @Autowired
    private SwxMarketContractsMapper swxMarketContractsMapper;
 
    @Autowired
    private SwxMarketSmartMapper swxMarketSmartMapper;
 
    @Autowired
    private SwxSettingsMapper swxSettingsMapper;
 
 
    @Autowired
    private RedisCache redisCache;
 
    /**
     * 程序初始化时,将市场数据放入缓存
     */
    @PostConstruct
    public void init(){
        List<SwxMarket> forceList = new ArrayList<>();
        List<SwxMarket> stocksList = new ArrayList<>();
        List<SwxMarket> metalList = new ArrayList<>();
        List<SwxMarket> crytoList = new ArrayList<>();
        List<SwxMarket> futursList = new ArrayList<>();
        List<SwxMarket> marketList = swxMarketMapper.selectList(new QueryWrapper<SwxMarket>().lambda().eq(SwxMarket::getStatus,SwxConstons.NOMARL_STATUS_YES));
        String syncForce  = "";
        String syncStocks  = "";
        String syncETF  = "";
        String syncCrypto  = "";
        String syncFutures  = "";
        String syncCryptoKcode = "";
        for(SwxMarket item : marketList){
            if (item.getType() == SwxConstons.MARKET_TYPE_FOREX){
                forceList.add(item);
                syncForce = syncForce + item.getCode()+",";
            }else if(item.getType() == SwxConstons.MARKET_TYPE_STOCKS){
                stocksList.add(item);
                syncStocks = syncStocks + item.getCode()+",";
            }else if(item.getType() == SwxConstons.MARKET_TYPE_METAL){
                metalList.add(item);
                syncETF = syncETF + item.getCode()+",";
            }else if(item.getType() == SwxConstons.MARKET_TYPE_CRYPTO){
                crytoList.add(item);
                syncCrypto = syncCrypto + item.getCode()+",";
                syncCryptoKcode = syncCryptoKcode + item.getKCode()+",";
            }else if(item.getType() == SwxConstons.MARKET_TYPE_FUTURES){
                futursList.add(item);
                syncFutures = syncFutures + item.getCode()+",";
            }
        }
        if(!CollectionUtils.isEmpty(forceList)){
            redisCache.setCacheList(SwxConstons.REDIS_CACHE_MARKET_TYPE_FOREX,forceList);
            redisCache.setCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX,syncForce.substring(0,syncForce.length()-1));
        }
        if(!CollectionUtils.isEmpty(stocksList)){
            redisCache.setCacheList(SwxConstons.REDIS_CACHE_MARKET_TYPE_STOCKS,stocksList);
            redisCache.setCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS,syncStocks.substring(0,syncStocks.length()-1));
        }
        if(!CollectionUtils.isEmpty(metalList)){
            redisCache.setCacheList(SwxConstons.REDIS_CACHE_MARKET_TYPE_METAL,metalList);
            redisCache.setCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL,syncETF.substring(0,syncETF.length()-1));
        }
        if(!CollectionUtils.isEmpty(crytoList)){
            redisCache.setCacheList(SwxConstons.REDIS_CACHE_MARKET_TYPE_CRYPTO,crytoList);
            redisCache.setCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_CRYPTO,syncCrypto.substring(0,syncCrypto.length()-1));
            redisCache.setCacheObject("syncCryptoKCode",syncCryptoKcode);
        }
        if(!CollectionUtils.isEmpty(futursList)){
            redisCache.setCacheList(SwxConstons.REDIS_CACHE_MARKET_TYPE_FUTURES,futursList);
            redisCache.setCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES,syncFutures.substring(0,syncFutures.length()-1));
        }
    }
 
    /**
     * 清空缓存中market数据
     */
    @PreDestroy
    public void destroy() {
        String[] redisKeys = new String[]{SwxConstons.REDIS_CACHE_MARKET_TYPE_FOREX,SwxConstons.REDIS_CACHE_MARKET_TYPE_STOCKS,SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL,SwxConstons.REDIS_CACHE_MARKET_TYPE_CRYPTO,SwxConstons.REDIS_CACHE_MARKET_TYPE_FUTURES,};
        String[] syncKeys = new String[]{SwxConstons.REDIS_CACHE_SYNC_TYPE_CRYPTO,SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES,SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL,SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS,SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX,"syncCryptoKCode"};
        redisCache.deleteObject(Arrays.asList(redisKeys));
        redisCache.deleteObject(Arrays.asList(syncKeys));
    }
    @Override
    @Transactional
    public boolean save(SwxMarket swxMarket) {
        swxMarketMapper.insert(swxMarket);
        List<SwxSettings> list = swxSettingsMapper.selectList(new QueryWrapper<SwxSettings>().lambda().eq(SwxSettings::getType,SwxConstons.SETTINGS_MARKET));
        //插入合约产品表,状态为启用或未启用
        SwxMarketContracts swxMarketContracts = new SwxMarketContracts();
        swxMarketContracts.setMId(swxMarket.getId());
        SwxSettings margin = null;
        for (SwxSettings item:list) {
            if (item.getParamKey().equals("default_margin")){
                margin = item;
                break;
            }
        }
        SwxSettings leverage = null;
        for (SwxSettings item:list) {
            if (item.getParamKey().equals("default_max_leverage")){
                leverage = item;
                break;
            }
        }
        SwxSettings cantradeDate = null;
        for (SwxSettings item:list) {
            if (item.getParamKey().equals("default_trade_date")){
                cantradeDate = item;
                break;
            }
        }
        SwxSettings handNum = null;
        for (SwxSettings item:list) {
            if (item.getParamKey().equals("default_hand_num")){
                handNum = item;
                break;
            }
        }
        SwxSettings tradeDateType = null;
        for (SwxSettings item:list) {
            if (item.getParamKey().equals("default_trade_date_type")){
                tradeDateType = item;
                break;
            }
        }
        SwxSettings tradeTime = null;
        for (SwxSettings item:list) {
            if (item.getParamKey().equals("default_trade_time")){
                tradeTime = item;
                break;
            }
        }
        SwxSettings defaultStop = null;
        for (SwxSettings item:list) {
            if (item.getParamKey().equals("default_stop")){
                defaultStop = item;
                break;
            }
        }
        SwxSettings tradeFee = null;
        for (SwxSettings item:list) {
            if (item.getParamKey().equals("default_trade_fee")){
                defaultStop = item;
                break;
            }
        }
        swxMarketContracts.setMargin(margin == null ? new BigDecimal(0) : new BigDecimal(margin.getParamValue()));
        swxMarketContracts.setCanTradeDate(cantradeDate == null ? "" : cantradeDate.getParamValue());
        swxMarketContracts.setHandNum(handNum == null ? 10000 : Integer.parseInt(handNum.getParamValue()));
        swxMarketContracts.setCanTradeDateType(tradeDateType == null ? 2 : Integer.parseInt(tradeDateType.getParamValue()));
        swxMarketContracts.setCanTradeTime(tradeTime == null ? "" : tradeTime.getParamValue());
        swxMarketContracts.setDefaultStop(defaultStop == null ? new BigDecimal(10) : new BigDecimal(defaultStop.getParamValue()));
        swxMarketContracts.setMaxLeverage(leverage == null ? 1 : Integer.parseInt(leverage.getParamValue()));
        swxMarketContracts.setTradeFee(tradeFee == null ? new BigDecimal(0) : new BigDecimal(tradeFee.getParamValue()));
        swxMarketContracts.setMaxStopLoss(defaultStop == null ? new BigDecimal(10) : new BigDecimal(defaultStop.getParamValue()));
        swxMarketContracts.setMaxStopProfit(defaultStop == null ? new BigDecimal(10) : new BigDecimal(defaultStop.getParamValue()));
        swxMarketContracts.setStatus(swxMarket.getCanContracts());
        swxMarketContractsMapper.insert(swxMarketContracts);
 
        //插入期权产品表
        SwxSettings optionsSetting = null;
        for (SwxSettings item:list) {
            if (item.getParamKey().equals("default_options")){
                optionsSetting = item;
                break;
            }
        }
        SwxMarketOptions swxMarketOptions = new SwxMarketOptions();
        swxMarketOptions.setMId(swxMarket.getId());
        swxMarketOptions.setCanTradeDate(cantradeDate == null ? "" : cantradeDate.getParamValue());
        swxMarketOptions.setCanTradeDateType(tradeDateType == null ? 2 : Integer.parseInt(tradeDateType.getParamValue()));
        swxMarketOptions.setCanTradeTime(tradeTime == null ? "" : tradeTime.getParamValue());
        if(optionsSetting != null){
            swxMarketOptions.setOptionsInfo(optionsSetting.getParamValue());
        }
        swxMarketOptions.setStatus(swxMarket.getCanOptions());
        swxMarketOptionsMapper.insert(swxMarketOptions);
 
 
        //插入智能交易
        SwxSettings smartSettings = null;
        for (SwxSettings item:list) {
            if (item.getParamKey().equals("default_smart_info")){
                smartSettings = item;
                break;
            }
        }
        SwxMarketSmart swxMarketSmart = new SwxMarketSmart();
        swxMarketSmart.setMId(swxMarket.getId());
        if(smartSettings != null){
            swxMarketSmart.setSmartInfo(smartSettings.getParamValue());
        }
        swxMarketSmart.setStatus(swxMarket.getCanSmart());
        swxMarketSmartMapper.insert(swxMarketSmart);
        //将产品放入redis中
        String redisCacheName = "";
        String syncCacheName = "";
        if (swxMarket.getType() == SwxConstons.MARKET_TYPE_FOREX){
            redisCacheName = SwxConstons.REDIS_CACHE_MARKET_TYPE_FOREX;
            syncCacheName = SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX;
        }else if(swxMarket.getType() == SwxConstons.MARKET_TYPE_STOCKS){
            redisCacheName = SwxConstons.REDIS_CACHE_MARKET_TYPE_STOCKS;
            syncCacheName = SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS;
        }else if(swxMarket.getType() == SwxConstons.MARKET_TYPE_METAL){
            redisCacheName = SwxConstons.REDIS_CACHE_MARKET_TYPE_METAL;
            syncCacheName = SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL;
        }else if(swxMarket.getType() == SwxConstons.MARKET_TYPE_CRYPTO){
            redisCacheName = SwxConstons.REDIS_CACHE_MARKET_TYPE_CRYPTO;
            syncCacheName = SwxConstons.REDIS_CACHE_SYNC_TYPE_CRYPTO;
            //虚拟货币需要获取kcode
            String syncCryptoKCode = redisCache.getCacheObject("syncCryptoKCode");
            if (Strings.isEmpty(syncCryptoKCode)){
                syncCryptoKCode = swxMarket.getKCode();
            }else{
                syncCryptoKCode = syncCryptoKCode + "," + swxMarket.getKCode();
            }
            redisCache.setCacheObject("syncCryptoKCode",syncCryptoKCode);
        }else if(swxMarket.getType() == SwxConstons.MARKET_TYPE_FUTURES){
            redisCacheName = SwxConstons.REDIS_CACHE_MARKET_TYPE_FUTURES;
            syncCacheName = SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES;
        }
        List<SwxMarket> cacheList = redisCache.getCacheList(redisCacheName);
        if(cacheList == null){
            cacheList = new ArrayList<>();
        }else{
            redisCache.deleteObject(redisCacheName);
        }
        String syncCode = redisCache.getCacheObject(syncCacheName);
        if(Strings.isEmpty(syncCode)){
            syncCode = swxMarket.getCode();
        }else{
            syncCode = syncCode + "," + swxMarket.getCode();
        }
        cacheList.add(swxMarket);
        redisCache.setCacheList(redisCacheName,cacheList);
        redisCache.setCacheObject(syncCacheName,syncCode);
        //修改marketAll不显示该产品
        SwxMarketAll marketAll = swxMarketAllMapper.selectById(swxMarket.getMarketAllId());
        marketAll.setStatus(SwxConstons.NOMARL_STATUS_YES);
        swxMarketAllMapper.updateById(marketAll);
        return true;
    }
 
    @Override
    @Transactional
    public boolean updateById(SwxMarket swxMarket) {
        //判断是否修改了对应子表信息
        if(swxMarket.getCanContracts() != null){
            QueryWrapper<SwxMarketContracts> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda().eq(SwxMarketContracts::getMId,swxMarket.getId());
            SwxMarketContracts swxMarketContracts = swxMarketContractsMapper.selectOne(queryWrapper);
            swxMarketContracts.setStatus(swxMarket.getCanContracts());
            swxMarketContractsMapper.updateById(swxMarketContracts);
        }
        if(swxMarket.getCanOptions() != null){
            QueryWrapper<SwxMarketOptions> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda().eq(SwxMarketOptions::getMId,swxMarket.getId());
            SwxMarketOptions swxMarketOptions = swxMarketOptionsMapper.selectOne(queryWrapper);
            swxMarketOptions.setStatus(swxMarket.getCanContracts());
            swxMarketOptionsMapper.updateById(swxMarketOptions);
        }
        if(swxMarket.getCanSmart() != null){
            QueryWrapper<SwxMarketSmart> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda().eq(SwxMarketSmart::getMId,swxMarket.getId());
            SwxMarketSmart swxMarketSmart = swxMarketSmartMapper.selectOne(queryWrapper);
            swxMarketSmart.setStatus(swxMarket.getCanContracts());
            swxMarketSmartMapper.updateById(swxMarketSmart);
        }
        return swxMarketMapper.updateById(swxMarket) == 1;
    }
 
    @Override
    @Transactional
    public boolean removeBatchByIds(List<String> ids) {
        //删除子表信息 并清除redis缓存对应
        for (String id : ids){
            SwxMarket swxMarket = swxMarketMapper.selectById(id);
            if (swxMarket != null){
                QueryWrapper<SwxMarketContracts> queryWrapper = new QueryWrapper<>();
                queryWrapper.lambda().eq(SwxMarketContracts::getMId,id);
                SwxMarketContracts swxMarketContracts = swxMarketContractsMapper.selectOne(queryWrapper);
                swxMarketContractsMapper.deleteById(swxMarketContracts.getId());
                QueryWrapper<SwxMarketOptions> queryWrapper1 = new QueryWrapper<>();
                queryWrapper1.lambda().eq(SwxMarketOptions::getMId,id);
                SwxMarketOptions swxMarketOptions = swxMarketOptionsMapper.selectOne(queryWrapper1);
                swxMarketOptionsMapper.deleteById(swxMarketOptions.getId());
                QueryWrapper<SwxMarketSmart> queryWrapper2 = new QueryWrapper<>();
                queryWrapper2.lambda().eq(SwxMarketSmart::getMId,id);
                SwxMarketSmart swxMarketSmart = swxMarketSmartMapper.selectOne(queryWrapper2);
                swxMarketSmartMapper.deleteById(swxMarketSmart.getId());
                SwxMarketAll marketAll = swxMarketAllMapper.selectOne(new QueryWrapper<SwxMarketAll>().lambda().eq(SwxMarketAll::getCode,swxMarket.getCode()));
                marketAll.setStatus(SwxConstons.NOMARL_STATUS_NO);
                swxMarketAllMapper.updateById(marketAll);
            }
        }
        //重写redis
        this.destroy();
        this.init();
 
        return swxMarketMapper.deleteBatchIds(ids) > 0;
    }
}