Files
zszq-trs/YLErpDAL/Modules/SuperviseReportModule/ExtendReport/ZheQi/TransactionDetails.cs
T
2024-05-09 14:06:26 +08:00

176 lines
7.9 KiB
C#

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<DealInfo>();
var settlementList = new List<SettlementInfo>();
var sList = new SearchListResult<object>();
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;
}
}
}