using BaseOUDAL; using YLErp.BLL; using YLErp.Model; namespace YLErp.Modules.SuperviseReportModule.ExtendReport.ZheQi { public class TransactionDetails : SimpleExtendReportBaseService { public TransactionDetails(OptUserInfo userInfo, SuperviseReportReq req) : base(userInfo, req) { } public override string TemplateName => "浙期每日成交信息模板.xlsx"; public override string TargetFileName => base.RequestInfo.ValueDate.ToString("yyyyMMdd") + "成交信息.xlsx"; public override string[] SheetNames => new[] { "交易确认" }; public override object SearchReportInfo(string sheetName) { var actions = new string[] { "系统操作-期权费", "系统操作-平仓费", "系统操作-行权费" }; var dealList = new List(); var settlementList = new List(); var sList = new SearchListResult(); var list = (from tc in DbContext.trade_cash join t in DbContext.trade on tc.TradeId equals t.id join tr in DbContext.trade_contract_r.Where(O => O.IsValid) on tc.id equals tr.TradeCashId into temp from tr in temp.DefaultIfEmpty() where tc.ValueDate == RequestInfo.ValueDate && (actions.Contains(tc.Action) || tc.IsLastAction) && tc.ValidState != "InValid" && tc.IsDeleted == false && t.ValidState != "InValid" select new { t, tc, tr }).ToArray(); foreach (var item in list) { var um = DataCacheProvider.GetUnderlyingDataSource().GetData(item.t.UnderlyingCode); if (item.tc.Action == "系统操作-期权费") { var obj = new DealInfo(); obj.index = dealList.Count + 1; obj.TradeDate = item.t.TradeDateString; obj.TradeNumber = item.t.TradeNumber; obj.ClientName = item.t.ClientName; obj.ClientBuySell = GetClientBuySell(item.t); obj.UnderlyingCode = item.t.UnderlyingCode; if (!string.IsNullOrWhiteSpace(item.t.BasisUnderlyingCode)) { obj.UnderlyingCode += "-" + item.t.BasisUnderlyingCode; } obj.SettlementDate = item.t.ExerciseDateString; obj.TradeAmount = (item.t.OriginalNotional ?? 0) / (um?.CountRatio ?? 1); obj.TradeNotional = item.t.OriginalNotional ?? 0; obj.OptionType = GetOptionType(item.t); obj.Strike = (item.t.IsMoneynessOptionData ? (item.t.Strike * item.t.SpotPrice) : item.t.Strike) ?? 0; obj.TradeSinglePrice = item.t.TradeSinglePrice ?? 0; obj.StockEqvNotional = item.t.OriginalStockEqvNotional ?? 0; obj.TradePrice = item.t.TradePrice ?? 0; obj.Remakes = GetRemarks(item.t); dealList.Add(obj); } else { var sign = (item.t.BuySell == "卖出" || item.t.TradeType == "远期") ? 1 : -1; var obj = new SettlementInfo(); obj.index = settlementList.Count + 1; obj.TradeDate = item.t.TradeDateString; obj.TradeNumber = item.t.TradeNumber; obj.ClientName = item.t.ClientName; obj.ClientBuySell = GetClientBuySell(item.t); obj.UnderlyingCode = item.t.UnderlyingCode; if (!string.IsNullOrWhiteSpace(item.t.BasisUnderlyingCode)) { obj.UnderlyingCode += "-" + item.t.BasisUnderlyingCode; } obj.SettlementDate = item.tc.ValueDateString; obj.TradeNotional = item.tc.UnwindNotional ?? (item.tc.UnwindPercentRate * item.t.OriginalNotional) ?? 0; obj.TradeAmount = obj.TradeNotional / (um?.CountRatio ?? 1); obj.OptionType = GetOptionType(item.t); obj.Strike = (item.t.IsMoneynessOptionData ? (item.t.Strike * item.t.SpotPrice) : item.t.Strike) ?? 0; obj.TradeSinglePrice = item.t.TradeSinglePrice ?? 0; obj.SettlementType = item.tc.Action == "系统操作-行权费" ? "到期行权" : "提前平仓"; obj.SettlementPrice = item.tc.FinalPrice ?? 0; obj.SettlementTradeSinglePrice = item.tc.Amount / obj.TradeNotional; obj.ClientWinloss = -(item.tc.Amount + (item.tc.UnwindNotional / item.t.OriginalNotional * item.t.TradePrice * sign) ?? 0); obj.ContractCode = item.tr?.ContractCode; settlementList.Add(obj); } } return new { DataDate = RequestInfo.ValueDate.ToString("yyyy-MM-dd"), DealList = dealList, SettleList = settlementList, SumWinloss = settlementList.Sum(O => O.ClientWinloss), }; } private string GetClientBuySell(trade t) { var buySell = ""; if (t.TradeType == "远期") { buySell = t.OptionType == "看涨" ? "买入" : "卖出"; } else { buySell = t.BuySell == "买入" ? "卖出" : "买入"; } return buySell; } private string GetOptionType(trade t) { var optionType = ""; switch (t.StructureType ?? t.TradeType) { case "凤凰期权": case "雪球期权": optionType = t.TradeType.Replace("期权", "") + t.OptionType; break; case "累计期权": optionType = t.OptionType == "看涨" ? "累购" : "累沽"; break; case "远期": case "掉期": optionType = t.StructureType ?? t.TradeType; break; default: if (string.IsNullOrWhiteSpace(t.StructureType)) { optionType = t.ExerciseModeCn + t.TradeType.Replace("期权", "") + t.OptionType; } else { optionType = t.StructureType; } break; } return optionType; } private string GetRemarks(trade t) { var remarks = ""; switch (t.TradeType) { case "亚式期权": tradeBLL.SetFieldsByTradeType(t); if (t.trade_asian_option.AveragingPeriodStartDate != null) { remarks = $"{t.trade_asian_option.AveragingPeriodStartDate.Value.ToString("yyyy/MM/dd")}-{t.ExerciseDate.Value.ToString("yyyy/MM/dd")}"; } break; case "远期": tradeBLL.SetFieldsByTradeType(t); if (t.trade_forward.ObservationDates != null) { var dates = t.trade_forward.ObservationDates.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (dates.Length > 0) { remarks = $"{DateTime.Parse(dates[0]):yyyy/MM/dd}-{DateTime.Parse(dates[dates.Length - 1]):yyyy/MM/dd}"; } } break; } return remarks; } } }