129 lines
4.2 KiB
C#
129 lines
4.2 KiB
C#
using YLErp.Modules.TradeModule;
|
|
using YLErp.Modules.TradeModule.ObservationModule;
|
|
|
|
namespace YLErp.Modules.EodModule
|
|
{
|
|
/// <summary>
|
|
/// 手工价格观察服务
|
|
/// </summary>
|
|
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();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 设置观察价格,因为现有的设置观察价格逻辑存在缺陷(比如设置历史观察日时其实应该需要先做交易回退处理)
|
|
/// 所以只提供最简单的保存逻辑API
|
|
/// </summary>
|
|
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();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 设置观察价格请求
|
|
/// </summary>
|
|
public class SetObservationPriceApiRequest
|
|
{
|
|
/// <summary>
|
|
/// 观察价格设置日期
|
|
/// </summary>
|
|
public DateTime? ValueDate { get; set; }
|
|
|
|
/// <summary>
|
|
/// 交易编号
|
|
/// </summary>
|
|
public string TradeNumber { get; set; }
|
|
|
|
/// <summary>
|
|
/// 标的价格
|
|
/// </summary>
|
|
public double UnderlyingPrice { get; set; }
|
|
|
|
/// <summary>
|
|
/// 结算金额(为空则系统计算)
|
|
/// </summary>
|
|
public double? SettlementAmount { get; set; }
|
|
|
|
/// <summary>
|
|
/// 收盘时执行观察操作
|
|
/// </summary>
|
|
public bool ExecuteAtEod { get; set; } = true;
|
|
}
|
|
}
|