using YLErp.Modules.TradeModule; using YLErp.Modules.TradeModule.ObservationModule; namespace YLErp.Modules.EodModule { /// /// 手工价格观察服务 /// public class ManuallyTradeObservationPriceService : TradeServiceBase { public ManuallyTradeObservationPriceService(YLBaseService baseService) : base(baseService) { } public ManuallyTradeObservationPriceService(OptUserInfo userInfo) : base(userInfo) { } public void RemoveManuallyTradeObservationPrice(int tradeId, DateTime? valueDate = null) { if (valueDate == null) { var records = DbContext.manually_trade_observation_price.Where(x => x.TradeId == tradeId); DbContext.manually_trade_observation_price.RemoveRange(records); } else { var records = DbContext.manually_trade_observation_price.Where(x => x.TradeId == tradeId && x.ValueDate >= valueDate); DbContext.manually_trade_observation_price.RemoveRange(records); } DbContext.SaveChanges(); } /// /// 设置观察价格,因为现有的设置观察价格逻辑存在缺陷(比如设置历史观察日时其实应该需要先做交易回退处理) /// 所以只提供最简单的保存逻辑API /// public void SetObservationPriceApi(SetObservationPriceApiRequest req) { if (string.IsNullOrWhiteSpace(req.TradeNumber)) { throw new ServiceException("交易编号不可为空"); } var valueDate = req.ValueDate.HasValue && req.ValueDate.Value != default ? req.ValueDate.Value : BLL.valuedateBLL.ValueDate; if (!req.ExecuteAtEod) { new OptionObservationService(this).SaveManuallyTradeObservationPrice(new SaveManuallyTradeObservationRequest { price = req.UnderlyingPrice, SettlementAmount = req.SettlementAmount, tradeId = 0, tradeNumber = req.TradeNumber, valueDate = BLL.valuedateBLL.ValueDate }); return; } var td = DbContext.trade.Where(n => n.TradeNumber == req.TradeNumber).FirstOrDefault(); if (td == null) { throw new ServiceException("交易信息不存在:" + req.TradeNumber); } if (td.TradeStatus != ConsTrade.确认成交) { throw new ServiceException("该交易非存续状态,无法设置"); } var records = DbContext.manually_trade_observation_price.Where(x => x.TradeId == td.id && x.ValueDate == valueDate); DbContext.manually_trade_observation_price.RemoveRange(records); var r = new manually_trade_observation_price { SettlementAmount = req.SettlementAmount, Price = req.UnderlyingPrice, TradeId = td.id, ValueDate = valueDate, OptDate = DateTime.Now, OptId = UserId, OptName = UserName }; DbContext.manually_trade_observation_price.Add(r); AddTradeOperationHistoryAndSetParentTradeInfo(false, td, "设置观察价格(API)"); DbContext.SaveChanges(); } } /// /// 设置观察价格请求 /// public class SetObservationPriceApiRequest { /// /// 观察价格设置日期 /// public DateTime? ValueDate { get; set; } /// /// 交易编号 /// public string TradeNumber { get; set; } /// /// 标的价格 /// public double UnderlyingPrice { get; set; } /// /// 结算金额(为空则系统计算) /// public double? SettlementAmount { get; set; } /// /// 收盘时执行观察操作 /// public bool ExecuteAtEod { get; set; } = true; } }