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 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 forceList = new ArrayList<>(); List stocksList = new ArrayList<>(); List metalList = new ArrayList<>(); List crytoList = new ArrayList<>(); List futursList = new ArrayList<>(); List marketList = swxMarketMapper.selectList(new QueryWrapper().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 list = swxSettingsMapper.selectList(new QueryWrapper().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 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 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 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 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 ids) { //删除子表信息 并清除redis缓存对应 for (String id : ids){ SwxMarket swxMarket = swxMarketMapper.selectById(id); if (swxMarket != null){ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(SwxMarketContracts::getMId,id); SwxMarketContracts swxMarketContracts = swxMarketContractsMapper.selectOne(queryWrapper); swxMarketContractsMapper.deleteById(swxMarketContracts.getId()); QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.lambda().eq(SwxMarketOptions::getMId,id); SwxMarketOptions swxMarketOptions = swxMarketOptionsMapper.selectOne(queryWrapper1); swxMarketOptionsMapper.deleteById(swxMarketOptions.getId()); QueryWrapper queryWrapper2 = new QueryWrapper<>(); queryWrapper2.lambda().eq(SwxMarketSmart::getMId,id); SwxMarketSmart swxMarketSmart = swxMarketSmartMapper.selectOne(queryWrapper2); swxMarketSmartMapper.deleteById(swxMarketSmart.getId()); SwxMarketAll marketAll = swxMarketAllMapper.selectOne(new QueryWrapper().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; } }