using YLErp.DBModels.Enums; namespace YLErp.Modules.ExchangeTradeModule { /// /// 对冲交易API服务 /// public class ExchangeTradeApiService : ExchangeTradeSaveServiceBase { public ExchangeTradeApiService(YLBaseService baseService) : base(baseService) { } public ExchangeTradeApiService(OptUserInfo userInfo) : base(userInfo) { } public ExchangeTrade Save(ExchangeTradeApiReq req, string tradeSource, out bool isAddNew) { var reqTrade = PrepareReqTrad(req, tradeSource); var dbTrade = DbContext.ExchangeTrade.FirstOrDefault(x => x.TradeDate == req.TradeDate && x.TradeNumber == req.TradeNumber && x.IsValid); var canUpdate = dbTrade != null && req.TradeType == dbTrade.TradeType && req.TradeSide == dbTrade.TradeSide && req.ExchangeAccountCode.Equals(dbTrade.ExchangeAccountCode, StringComparison.OrdinalIgnoreCase) && (dbTrade.TradeType == "场内期权" ? req.OptionCode.Equals(dbTrade.OptionCode) : req.UnderlyingCode.Equals(dbTrade.UnderlyingCode, StringComparison.OrdinalIgnoreCase)); SaveExchangeTradePosition(reqTrade, canUpdate ? dbTrade : null); if (canUpdate) { dbTrade.UnderlyingCode = reqTrade.UnderlyingCode; dbTrade.TradeSinglePrice = reqTrade.TradeSinglePrice; dbTrade.Notional = reqTrade.Notional; dbTrade.TradeAmount = reqTrade.TradeAmount; dbTrade.TradeLots = reqTrade.TradeLots; dbTrade.TraderId = reqTrade.TraderId; dbTrade.TraderName = reqTrade.TraderName; dbTrade.UnderlyingId = reqTrade.UnderlyingId; dbTrade.MaturityDate = reqTrade.MaturityDate; dbTrade.OptionStrike = reqTrade.OptionStrike; dbTrade.OptionType = reqTrade.OptionType; dbTrade.ExerciseMode = reqTrade.ExerciseMode; dbTrade.AssetBookId = reqTrade.AssetBookId; dbTrade.ExchangeAccountId = reqTrade.ExchangeAccountId; dbTrade.InstrumentType = reqTrade.InstrumentType; dbTrade.OptDate = DateTime.Now; } else { DbContext.ExchangeTrade.Add(dbTrade = reqTrade); } isAddNew = !canUpdate; DbContext.SaveChanges(); return dbTrade; } //将req转换交易对象 private ExchangeTrade PrepareReqTrad(ExchangeTradeApiReq req, string tradeSource) { req.TradeType = CheckTradeType(req.TradeType); if (req.TradeDate == DateTime.MinValue) { throw new ServiceException("交易日期 必须填写"); } CheckTradeSide(req.TradeSide); if (string.IsNullOrWhiteSpace(req.AssetBookName)) { throw new ServiceException("簿记账户 必须填写"); } //if (string.IsNullOrWhiteSpace(req.ExchangeAccountCode)) //{ // throw new ServiceException("对冲账户 必须填写"); //} var td = new ExchangeTrade { IsValid = true, TradeType = req.TradeType, TradeDate = req.TradeDate, TradeNumber = req.TradeNumber, TradeSide = req.TradeSide, TradeSinglePrice = req.TradeSinglePrice, UnderlyingCode = req.UnderlyingCode, ExchangeAccountCode = req.ExchangeAccountCode, TradeSource = tradeSource, Commission = 0, CommissionType = CommissionType.系统计算, OptId = 0, OptDate = DateTime.Now, OptName = UserName, CreateTime = DateTime.Now, Notional = 0, TradeAmount = 0, TradeLots = 0, TraderId = 0, TraderName = UserName, UnderlyingId = 0, MaturityDate = null, OptionCode = null, OptionStrike = null, OptionType = null, ExerciseMode = null, AssetBookId = 0, ExchangeAccountId = 0, InstrumentType = null, Comments = null, }; var contractSize = 0d; //场内期权 if (td.TradeType == "场内期权") { SetTradeOptionInfo(td, req.OptionCode, out var option); contractSize = option.ContractSize; req.UnderlyingCode = option.UnderlyingCode; } //标的信息 SetTradeUnderlyingInfo(td, req.UnderlyingCode, out var um); //数量信息 SetTradeLotsInfo(td, req.TradeLots, contractSize < 1 ? um.ContractSize : contractSize, um.UnderlyingTypeId); //簿记账户和对冲账户 SetAssetAndExchangeAccount(td, req.AssetBookName, req.ExchangeAccountCode, um.UnderlyingTypeId); //交易员信息 SetTraderInfo(td, req.TraderName); //交易手续费 if (req.Commission.HasValue) { td.Commission = req.Commission.Value; td.CommissionType = CommissionType.手动录入; } return td; } } }