从山证v2.3.0拷贝
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
using YLErp.DBModels.Consts;
|
||||
using YLErp.Models;
|
||||
using YLErp.Modules.TradeModule.DealModule;
|
||||
using YLErp.Modules.UnderlyingModule;
|
||||
|
||||
namespace YLErp.Modules.EodModule.SettlementModule
|
||||
{
|
||||
/// <summary>
|
||||
/// 篮子标的日终结算价格保存服务
|
||||
/// </summary>
|
||||
class EodBasketPriceSaveService : EodSettleServiceBase
|
||||
{
|
||||
public const string Step = "合成篮子标的价格";
|
||||
|
||||
public EodBasketPriceSaveService(EodSettlementContextBase context) : base(context)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存篮子标的日终结算价格
|
||||
/// </summary>
|
||||
public void Execute()
|
||||
{
|
||||
//取出来未在结算价表中的篮子标的
|
||||
//如果篮子标的已禁用并且未在交易中使用则可以忽略合成
|
||||
|
||||
var settleDate = _context.SettleDate;
|
||||
var eodStockQuery = DbContext.eod_stock_price.Where(c => c.ValueDate == settleDate);
|
||||
var eodCommodityQuery = DbContext.eod_commodity_future_price.Where(c => c.ValueDate == settleDate);
|
||||
var umQuery = from um in DbContext.underlying_manager.AsNoTracking()
|
||||
where um.CommodityCode == "篮子标的" && um.OpenDate <= settleDate
|
||||
&& !eodStockQuery.Any(n => n.UnderlyingCode == um.UnderlyingCode)
|
||||
&& !eodCommodityQuery.Any(n => n.UnderlyingCode == um.UnderlyingCode)
|
||||
select new
|
||||
{
|
||||
um.id,
|
||||
um.UnderlyingCode,
|
||||
um.SubData,
|
||||
um.LaunchState
|
||||
};
|
||||
|
||||
var basketUmList = umQuery.ToArray();
|
||||
|
||||
if (!basketUmList.Any())
|
||||
{
|
||||
return;
|
||||
}
|
||||
#region 增加客户筛选 tw
|
||||
var edQuery = DbContext.eod_trade_position.Where(d => d.ValueDate == _context.PreSettleDate&& d.TradeType != "自定义交易");
|
||||
var tdQuery = DbContext.trade.Where(t => t.TradeDate == settleDate && t.ValidState != ConsGlobal.InValid && t.TradeType != "自定义交易");
|
||||
if (_context.Request.ClientIds != null)
|
||||
{
|
||||
edQuery = edQuery.Where(t => _context.Request.ClientIds.Contains(t.ClientId));
|
||||
tdQuery = tdQuery.Where(t => _context.Request.ClientIds.Contains(t.ClientId));
|
||||
}
|
||||
var edCodeQuery = edQuery.Select(n => n.UnderlyingCode);
|
||||
var tdCodeQuery = tdQuery.Select(n => n.UnderlyingCode);
|
||||
#endregion
|
||||
|
||||
var usedCodes = edCodeQuery.Union(tdCodeQuery).ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
var ids = basketUmList.Select(O => O.id);
|
||||
|
||||
var hisDic = new DbRecordChangesService<UnderlyingChanges>(this)
|
||||
.GetValueOfLatest(ConsInfoChangeType.Dividend, ids, nameof(underlying_manager.SubData), settleDate.AddDays(-1))
|
||||
.ToDictionary(K => K.RecordId, V => V.FieldValue);
|
||||
|
||||
var eodPriceProvider = _context.GetEodPriceProvider();
|
||||
|
||||
foreach (var basketUm in basketUmList)
|
||||
{
|
||||
if (!usedCodes.Contains(basketUm.UnderlyingCode))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!hisDic.TryGetValue(basketUm.id, out var subData))
|
||||
{
|
||||
subData = basketUm.SubData;
|
||||
}
|
||||
|
||||
var result = BasketUnderlyingHelper.GetBasketPrice(subData, eodPriceProvider, false);
|
||||
|
||||
if (result.HasError)
|
||||
{
|
||||
_context.RaiseError(Step, $"篮子标的'{basketUm.UnderlyingCode}'合成价格失败,标的价格未找到:{string.Join(",", result.ErrorCodeList)}");
|
||||
}
|
||||
|
||||
var eodPrice = new eod_stock_price
|
||||
{
|
||||
ValueDate = settleDate,
|
||||
UnderlyingCode = basketUm.UnderlyingCode,
|
||||
UnderlyingStatus = null,
|
||||
|
||||
ClosePrice = result.Price,
|
||||
SettlePrice = result.SettlePrice,
|
||||
|
||||
ReferencePrice = null,
|
||||
LowPrice = null,
|
||||
HighPrice = null,
|
||||
|
||||
OptDate = DateTime.Now,
|
||||
OptId = 0,
|
||||
OptName = ConsGlobal.XiTong,
|
||||
DataSource = ConsGlobal.XiTong
|
||||
};
|
||||
|
||||
DbContext.eod_stock_price.Add(eodPrice);
|
||||
|
||||
var eodPrice2 = new EodPrice
|
||||
{
|
||||
IsStock = true,
|
||||
|
||||
ValueDate = settleDate,
|
||||
UnderlyingId = basketUm.id,
|
||||
UnderlyingCode = basketUm.UnderlyingCode,
|
||||
UnderlyingStatus = null,
|
||||
|
||||
ClosePrice = result.Price,
|
||||
SettlePrice = result.SettlePrice,
|
||||
ReferencePrice = null,
|
||||
LowPrice = null,
|
||||
HighPrice = null
|
||||
};
|
||||
|
||||
eodPriceProvider.SetPrice(eodPrice2);
|
||||
}
|
||||
|
||||
var changes = DbContext.SaveChanges(_context.CancellationToken);
|
||||
|
||||
//直接使用MYSQL语句做了昨日收盘价的处理
|
||||
if (_context.IsCurrentDay)
|
||||
{
|
||||
var sql = $@"
|
||||
update underlying_manager um join eod_stock_price ep on um.UnderlyingCode=ep.StockId
|
||||
set um.PrevClosePrice=ep.ClosePrice,um.Price=ep.ClosePrice
|
||||
where um.CommodityCode='篮子标的' and ep.ValueDate='{settleDate:yyyy-MM-dd}'";
|
||||
DbContext.Database.ExecuteSqlRaw(sql);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user