176 lines
7.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|