Files
zszq-trs/YLErpDAL/Modules/EodModule/ManuallyTradeObservationPriceService.cs
T
2024-05-09 14:06:26 +08:00

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