using System.Threading.Tasks;
using System;
using Wicture.DbRESTFul.Infrastructure.Repository;
using System.Linq;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Net.Http;
using JiaZhiQuan.Common.Utils;
using Wicture.DbRESTFul.Cache;
using Newtonsoft.Json;
using Polly;
using Wicture.DbRESTFul.Rpc.Client;
namespace JiaZhiQuan.Common
{
public static partial class RepositoryExtension
{
///
/// 获取至少前7个交易日(不考虑停牌)
///
public static async Task> GetQTRecentTradeDaysBefore7(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, string dateStr)
{
var key = CacheKeys.QTRecentTradeDaysBefore7(dateStr);
var tradeDates = await cacheProvider.Get>(key);
if (tradeDates == null || tradeDates.Count == 0)
{
tradeDates = (await repository.QueryAsync(
$"select `date` from n_stock_trade_date where `date`<='{dateStr}' order by `date` desc limit 7"))
.Select(e => e.ToString("yyyy-MM-dd")).ToList();
await cacheProvider.Set(key, tradeDates, CacheKeys.QTRecentTradeDaysCacheSecs);
}
return tradeDates;
}
///
/// 获取当日最近前后3个交易日(不考虑停牌)
///
public static async Task> GetQTTradeDaysAround3Days(this DbRESTFulRepository repository,
string dateStr, RedisCacheProvider cacheProvider)
{
// 获取当日最近前后3个交易日
var key = CacheKeys.QTRecentTradeDaysRound3(dateStr);
var tradeDates = await cacheProvider.Get>(key);
if (tradeDates == null || tradeDates.Count == 0)
{
var tradeDatesBefore = (await repository.QueryAsync(
$"select `date` from n_stock_trade_date where `date`<='{dateStr}' order by `date` desc limit 4")).ToList();
var tradeDatesAfter = (await repository.QueryAsync(
$"select `date` from n_stock_trade_date where `date`>='{dateStr}' order by `date` asc limit 4")).ToList();
tradeDates = tradeDatesBefore.Concat(tradeDatesAfter).Distinct().OrderBy(e => e)
.Select(e => e.ToString("yyyy-MM-dd")).ToList();
await cacheProvider.Set(key, tradeDates, CacheKeys.QTRecentTradeDaysCacheSecs);
}
return tradeDates;
}
///
/// 获取某日对应的停牌信息(通过AKShare获取)
///
public static async Task> GetQTSuspensionDataList(this DbRESTFulRepository repository,
string dateStr, RedisCacheProvider cacheProvider, IHttpClientFactory clientFactory)
{
var key = CacheKeys.QTSuspensionDataList(dateStr);
var list = await cacheProvider.Get>(key);
if (list == null)
{
list = await QTUtils.GetAKSData>(clientFactory, "stock_tfp_em",
new { date = dateStr.Replace("-", "") });
await cacheProvider.Set(key, list, CacheKeys.QTSuspensionDataListCacheSecs);
}
return list;
}
///
/// 判断某一个合约在某一个交易日是否停牌
///
public static bool QTIsSuspended(this DbRESTFulRepository repository, string contractCode, DateTime tradeDate, List suspensions)
{
var isIndex = (contractCode.Contains("SH") && !contractCode.StartsWith("6")) ||
(contractCode.Contains("SZ") && !contractCode.StartsWith("0"));
if (isIndex) return false;
var codePart = contractCode.Split('.', StringSplitOptions.RemoveEmptyEntries)[0];
return suspensions.Any(e =>
codePart.Equals(e.代码) && e.停牌时间 != null &&
e.停牌时间.Value.Date <= tradeDate.Date &&
(e.停牌截止时间 == null || e.停牌截止时间 >= tradeDate.Date) &&
!(e.停牌期限 ?? string.Empty).Contains("盘中"));
}
}
}