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

173 lines
5.5 KiB
C#

using YLErp.DBModels.Enums;
namespace YLErp.Modules.ExchangeTradeModule
{
/// <summary>
/// 对冲交易API服务
/// </summary>
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;
}
}
}