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;
|
}
|
}
|