717 lines
33 KiB
C#
717 lines
33 KiB
C#
using BaseOUDAL;
|
|
using YLErp.BLL;
|
|
using YLErp.Configuration;
|
|
using YLErp.Model;
|
|
using YLErp.Models.Tag;
|
|
using YLErp.Modules.RiskListModule;
|
|
using YLErp.Modules.TagModule;
|
|
using YLErp.Modules.TradeModule;
|
|
using YLErp.QdpModule;
|
|
|
|
namespace YLErp.Modules.FinancialModule
|
|
{
|
|
/// <summary>
|
|
/// 长江财务凭证服务
|
|
/// </summary>
|
|
public class CJFinancialVoucherService : YLBaseService
|
|
{
|
|
DateTime _valueDate;
|
|
|
|
private static List<string> ExcludedTrade = new List<string> { "商品期货", "场内期权", "远期" };
|
|
|
|
private static Dictionary<string, string> ErpDetailIds = new Dictionary<string, string>();
|
|
|
|
private static List<string> diedStatusList = new List<string>() { ConsTrade.已到期, ConsTrade.已执行, ConsTrade.已平仓 };
|
|
|
|
public CJFinancialVoucherService(OptUserInfo userInfo) : base(userInfo)
|
|
{
|
|
_valueDate = valuedateBLL.ValueDate;
|
|
using (var db = new ErpBaseContext())
|
|
{
|
|
var dictId = db.Dictionaries.FirstOrDefault(x => x.Name == "财务凭证明细段")?.Id;
|
|
if (dictId != null)
|
|
{
|
|
ErpDetailIds = db.DictionaryItems.Where(x => x.DictId == dictId).ToDictionary(x => x.Name, x => x.ShortName);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取客商编码
|
|
/// </summary>
|
|
/// <param name="namekey"></param>
|
|
/// <returns></returns>
|
|
private string GetErpDetailId(string comment)
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(comment) && ErpDetailIds.Any())
|
|
{
|
|
if (ErpDetailIds.ContainsKey(comment))
|
|
{
|
|
return ErpDetailIds[comment];
|
|
}
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 一、交易确认(期末持仓成本)
|
|
/// </summary>
|
|
/// <param name="req"></param>
|
|
/// <returns></returns>
|
|
public FinancialVoucher_CJDto GetTradeConfirmData(FinancialVoucher_CJReq req)
|
|
{
|
|
var result = new FinancialVoucher_CJDto();
|
|
var db = new YLContext();
|
|
#region 一、交易确认(期末持仓成本)
|
|
|
|
var tradeConfirmPeriod = req.EndDate.ToString("yyyy-MM");
|
|
var tradeConfirmAccountingDate = req.EndDate.ToString("yyyy/MM/dd");
|
|
var tradeConfirmAccountingDate2 = req.EndDate.ToString("yyMMdd");
|
|
var tradeConfirmDetailDate = req.EndDate.ToString("yyyyMMdd");
|
|
result.TradeConfirmPeriod = tradeConfirmPeriod;
|
|
result.TradeConfirmAccountingDate = tradeConfirmAccountingDate;
|
|
result.TradeConfirmAccountingDate2 = tradeConfirmAccountingDate2;
|
|
result.TradeConfirmDetailPeriod = tradeConfirmDetailDate;
|
|
|
|
#region 上期
|
|
var dayBefore = QdpCalendarHelper.GetNonHolidayDefore(req.StartDate.AddDays(-1));
|
|
var reqFin = new FinancialSummaryModelReq()
|
|
{
|
|
CurrentPeriodDateStart = req.PreStartDate,
|
|
CurrentPeriodDateEnd = dayBefore,
|
|
|
|
TradeTypeList = req.SummaryType != "场外期权" ? ConsTrade.NonOptionTradeTypes : ConsTrade.OptionTradeTypes,
|
|
UserAssets = req.UserAssets,
|
|
UserClients = req.UserClients
|
|
};
|
|
var priorPeriodList = tradeBLL.SearchOptionTrade(reqFin);
|
|
//权益
|
|
//上期卖出场外期权成本
|
|
//卖出
|
|
result.DebitOriginalAmt1 = Math.Abs((priorPeriodList.rows.Where(x => x.UnderlyingInstrumentType != "CommodityFutures" && x.TradeDirection == "卖出" && x.Status == false).Sum(x => x.TradePrice) ?? 0)).ToString("0.00");
|
|
//买入
|
|
result.CreditOriginalAmt1 = Math.Abs((priorPeriodList.rows.Where(x => x.UnderlyingInstrumentType != "CommodityFutures" && x.TradeDirection == "买入" && x.Status == false).Sum(x => x.TradePrice) ?? 0)).ToString("0.00");
|
|
//商品
|
|
//卖出
|
|
result.DebitOriginalAmt10 = Math.Abs((priorPeriodList.rows.Where(x => x.UnderlyingInstrumentType == "CommodityFutures" && x.TradeDirection == "卖出" && x.Status == false).Sum(x => x.TradePrice) ?? 0)).ToString("0.00");
|
|
//买入
|
|
result.CreditOriginalAmt5 = Math.Abs((priorPeriodList.rows.Where(x => x.UnderlyingInstrumentType == "CommodityFutures" && x.TradeDirection == "买入" && x.Status == false).Sum(x => x.TradePrice) ?? 0)).ToString("0.00");
|
|
|
|
#endregion
|
|
|
|
#region 本期
|
|
reqFin = new FinancialSummaryModelReq()
|
|
{
|
|
CurrentPeriodDateStart = req.StartDate,
|
|
CurrentPeriodDateEnd = req.EndDate,
|
|
SummaryType = req.SummaryType,
|
|
UserAssets = req.UserAssets,
|
|
UserClients = req.UserClients
|
|
};
|
|
var finalData = FinancialSummary_Option(reqFin);
|
|
//权益
|
|
//卖出
|
|
result.CreditOriginalAmt2 = Math.Abs((finalData.rows.Where(x => x.UnderlyingInstrumentType != "CommodityFutures" && x.TradeDirection == "卖出" && x.Status == false).Sum(x => x.TradePrice) ?? 0)).ToString("0.00");
|
|
//买入
|
|
result.DebitOriginalAmt2 = Math.Abs((finalData.rows.Where(x => x.UnderlyingInstrumentType != "CommodityFutures" && x.TradeDirection == "买入" && x.Status == false).Sum(x => x.TradePrice) ?? 0)).ToString("0.00");
|
|
//商品
|
|
//卖出
|
|
result.CreditOriginalAmt6 = Math.Abs((finalData.rows.Where(x => x.UnderlyingInstrumentType == "CommodityFutures" && x.TradeDirection == "卖出" && x.Status == false).Sum(x => x.TradePrice) ?? 0)).ToString("0.00");
|
|
//买入
|
|
result.DebitOriginalAmt11 = Math.Abs((finalData.rows.Where(x => x.UnderlyingInstrumentType == "CommodityFutures" && x.TradeDirection == "买入" && x.Status == false).Sum(x => x.TradePrice) ?? 0)).ToString("0.00");
|
|
#endregion
|
|
//本期-其他应付款
|
|
result.CreditOriginalAmt3 = (Math.Abs(double.Parse(result.DebitOriginalAmt1)) + Math.Abs(double.Parse(result.DebitOriginalAmt2)) - (Math.Abs(double.Parse(result.CreditOriginalAmt1)) + Math.Abs(double.Parse(result.CreditOriginalAmt2)))).ToString("0.00");
|
|
|
|
result.CreditOriginalAmt7 = (double.Parse(result.DebitOriginalAmt1) + double.Parse(result.DebitOriginalAmt2) + double.Parse(result.DebitOriginalAmt10) + double.Parse(result.DebitOriginalAmt11)
|
|
- double.Parse(result.CreditOriginalAmt1) - double.Parse(result.CreditOriginalAmt2) - double.Parse(result.CreditOriginalAmt5) - double.Parse(result.CreditOriginalAmt6)).ToString("0.00");
|
|
|
|
#endregion
|
|
|
|
#region 二、清算(每交易日平仓盈亏)
|
|
|
|
result.ClearPeriod = tradeConfirmPeriod;
|
|
result.ClearAccountingPeriod = tradeConfirmAccountingDate;
|
|
result.ClearAccountingPeriod2 = tradeConfirmAccountingDate2;
|
|
result.ClearDetailPeriod = tradeConfirmDetailDate;
|
|
|
|
////衍生工具_卖出看跌商品期权_公允价值变动
|
|
result.DebitOriginalAmt4 = (finalData.rows.Where(x => x.UnderlyingInstrumentType != "CommodityFutures" && x.TradeDirection == "卖出" && x.Status == true).Sum(x => x.ConfirmPnl) ?? 0).ToString("0.00");
|
|
////衍生工具_买入看跌商品期权_公允价值变动
|
|
result.DebitOriginalAmt6 = (finalData.rows.Where(x => x.UnderlyingInstrumentType != "CommodityFutures" && x.TradeDirection == "买入" && x.Status == true).Sum(x => x.ConfirmPnl) ?? 0).ToString("0.00");
|
|
|
|
////衍生工具_卖出看跌商品期权_公允价值变动
|
|
result.DebitOriginalAmt14 = (finalData.rows.Where(x => x.UnderlyingInstrumentType == "CommodityFutures" && x.TradeDirection == "卖出" && x.Status == true).Sum(x => x.ConfirmPnl) ?? 0).ToString("0.00");
|
|
////衍生工具_买入看跌商品期权_公允价值变动
|
|
result.DebitOriginalAmt15 = (finalData.rows.Where(x => x.UnderlyingInstrumentType == "CommodityFutures" && x.TradeDirection == "买入" && x.Status == true).Sum(x => x.ConfirmPnl) ?? 0).ToString("0.00");
|
|
//权益
|
|
result.DebitOriginalAmt16 = (double.Parse(result.DebitOriginalAmt4) + double.Parse(result.DebitOriginalAmt6)).ToString("0.00");
|
|
//商品
|
|
result.DebitOriginalAmt17 = (double.Parse(result.DebitOriginalAmt14) + double.Parse(result.DebitOriginalAmt15)).ToString("0.00");
|
|
//卖出
|
|
result.DebitOriginalAmt22 = (double.Parse(result.DebitOriginalAmt4) + double.Parse(result.DebitOriginalAmt14)).ToString("0.00");
|
|
//买入
|
|
result.DebitOriginalAmt23 = (double.Parse(result.DebitOriginalAmt6) + double.Parse(result.DebitOriginalAmt15)).ToString("0.00");
|
|
////其他应付款-其他
|
|
result.DebitOriginalAmt3 = (double.Parse(result.DebitOriginalAmt4) + double.Parse(result.DebitOriginalAmt6) + double.Parse(result.DebitOriginalAmt14) + double.Parse(result.DebitOriginalAmt15)).ToString("0.00");
|
|
|
|
|
|
#endregion
|
|
|
|
#region 三、每交易日持仓盈亏
|
|
result.DailyWinLossPeriod = tradeConfirmPeriod;
|
|
result.DailyWinLossAccountingPeriod = tradeConfirmAccountingDate;
|
|
result.DailyWinLossAccountingPeriod2 = tradeConfirmAccountingDate2;
|
|
result.DailyWinLossDetailPeriod = tradeConfirmDetailDate;
|
|
//衍生工具_卖出看跌商品期权_公允价值变动
|
|
result.DebitOriginalAmt8 = (finalData.rows.Where(x => x.UnderlyingInstrumentType != "CommodityFutures" && x.TradeDirection == "卖出").Sum(x => x.Pnl) ?? 0).ToString("0.00");
|
|
|
|
//衍生工具_买入看跌商品期权_公允价值变动
|
|
result.DebitOriginalAmt9 = (finalData.rows.Where(x => x.UnderlyingInstrumentType != "CommodityFutures" && x.TradeDirection == "买入").Sum(x => x.Pnl) ?? 0).ToString("0.00");
|
|
|
|
result.DebitOriginalAmt18 = (finalData.rows.Where(x => x.UnderlyingInstrumentType == "CommodityFutures" && x.TradeDirection == "卖出").Sum(x => x.Pnl) ?? 0).ToString("0.00");
|
|
result.DebitOriginalAmt19 = (finalData.rows.Where(x => x.UnderlyingInstrumentType == "CommodityFutures" && x.TradeDirection == "买入").Sum(x => x.Pnl) ?? 0).ToString("0.00");
|
|
|
|
result.DebitOriginalAmt20 = (double.Parse(result.DebitOriginalAmt8) + double.Parse(result.DebitOriginalAmt18)).ToString("0.00");
|
|
result.DebitOriginalAmt21 = (double.Parse(result.DebitOriginalAmt9) + double.Parse(result.DebitOriginalAmt19)).ToString("0.00");
|
|
|
|
result.CreditOriginalAmt4 = (double.Parse(result.DebitOriginalAmt20) + double.Parse(result.DebitOriginalAmt21)).ToString("0.00");
|
|
#endregion
|
|
|
|
#region 会计科目码
|
|
var nv = YieldChain.Helpers.UrlHelper.ParseQueryString(PS.Config.ErpElement.YongYouKeMuCode) ?? new System.Collections.Specialized.NameValueCollection();
|
|
if (nv.AllKeys.Any())
|
|
{
|
|
foreach (var key in nv.AllKeys)
|
|
{
|
|
result.AccountingSubjectCodeDic.Add(key, nv[key]);
|
|
}
|
|
}
|
|
#endregion
|
|
return result;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 出入金
|
|
/// </summary>
|
|
/// <param name="req"></param>
|
|
/// <returns></returns>
|
|
public List<FinancialVoucherCashInOut_CJDto> GetCashInOutTotal(FinancialVoucher_CJReq req)
|
|
{
|
|
var result = new List<FinancialVoucherCashInOut_CJDto>();
|
|
using (var db = new YLContext())
|
|
{
|
|
var states = new List<string> { "已确认", "已结算" };
|
|
var directions = new List<string> { "出金", "入金" };
|
|
var cashInCashOutQuery = from cico in db.ClientCashInCashOut
|
|
where directions.Contains(cico.Direction)
|
|
&& cico.ValidState != "InValid" && states.Contains(cico.State)
|
|
select cico;
|
|
var start = req.StartDate;
|
|
var end = req.EndDate;
|
|
|
|
if (req.StartDate != DateTime.MinValue && start != default)
|
|
{
|
|
cashInCashOutQuery = cashInCashOutQuery.Where(d => d.HappenDate >= start);
|
|
}
|
|
|
|
if (req.EndDate != DateTime.MinValue && end != default)
|
|
{
|
|
var tmpdate = end.AddDays(1);
|
|
cashInCashOutQuery = cashInCashOutQuery.Where(d => d.HappenDate < tmpdate);
|
|
}
|
|
|
|
|
|
var cashInCashOutList = cashInCashOutQuery.OrderByDescending(x => x.HappenDate).ToList();
|
|
var periodReq = req.EndDate.ToString("yyyy-MM");
|
|
var accountDateReq = req.EndDate.ToString("yyyy/MM/dd");
|
|
var accountDateReq2 = req.EndDate.ToString("yyMMdd");
|
|
var detailDateReq = req.EndDate.ToString("yyyyMMdd");
|
|
|
|
//////入金
|
|
//入金-借方;出金-贷方
|
|
|
|
var detailNo = 16;
|
|
var LineNo = 10;
|
|
var cashinlist = cashInCashOutList.Where(x => x.Direction == "入金").ToList();
|
|
var totalcashin = cashinlist.Sum(x => x.Money) ?? 0;
|
|
foreach (var cash in cashinlist)
|
|
{
|
|
var period = cash.HappenDate?.ToString("yyyy-MM");
|
|
//获取明细段 代码
|
|
var detailSegment = "0"; //从备注去匹配编码
|
|
if (!string.IsNullOrWhiteSpace(cash.Comments))
|
|
{
|
|
detailSegment = GetErpDetailId(cash.Comments?.Trim());
|
|
}
|
|
|
|
var cashindto = new FinancialVoucherCashInOut_CJDto()
|
|
{
|
|
Direction = cash.Direction,
|
|
LineNo = (LineNo).ToString(),
|
|
Period = period,
|
|
AccountingDate = accountDateReq,
|
|
AccountSegment = "100201",
|
|
DetailSegment = detailSegment,
|
|
DebitOriginalAmount = Math.Abs(cash.Money ?? 0).OtcFormatMoney(grouping: false),
|
|
JournalEntriesBName = $"880010tangcheng{accountDateReq2}出入金",
|
|
JournalEntriesName = $"880010tangcheng{accountDateReq2}出入金",
|
|
JournalEntriesSpec = "出入金",
|
|
ProjectSegment = "0",
|
|
JournalEntriesSummary = "出入金",
|
|
DetailedId = $"tangcheng{detailDateReq}{(detailNo++).ToString().PadLeft(3, '0')}"
|
|
};
|
|
result.Add(cashindto);
|
|
LineNo = LineNo + 10;
|
|
}
|
|
|
|
//////出金
|
|
var cashoutlist = cashInCashOutList.Where(x => x.Direction == "出金").ToList();
|
|
var totalcashout = cashoutlist.Sum(x => x.Money) ?? 00;
|
|
foreach (var cash in cashoutlist)
|
|
{
|
|
var period = cash.HappenDate?.ToString("yyyy-MM");
|
|
//获取明细段 代码
|
|
var detailSegment = "0"; //从备注去匹配编码
|
|
if (!string.IsNullOrWhiteSpace(cash.Comments))
|
|
{
|
|
detailSegment = GetErpDetailId(cash.Comments);
|
|
}
|
|
|
|
var cashoutdto2 = new FinancialVoucherCashInOut_CJDto()
|
|
{
|
|
Direction = cash.Direction,
|
|
LineNo = (LineNo).ToString(),
|
|
Period = period,
|
|
AccountingDate = accountDateReq,
|
|
ProjectSegment = "0",
|
|
AccountSegment = "100201",
|
|
DetailSegment = detailSegment,
|
|
CreditOriginalAmount = Math.Abs(cash.Money ?? 0).OtcFormatMoney(grouping: false),
|
|
JournalEntriesBName = $"880010tangcheng{accountDateReq2}出入金",
|
|
JournalEntriesName = $"880010tangcheng{accountDateReq2}出入金",
|
|
JournalEntriesSpec = "出入金",
|
|
JournalEntriesSummary = "出入金",
|
|
DetailedId = $"tangcheng{detailDateReq}{(detailNo++).ToString().PadLeft(3, '0')}"
|
|
};
|
|
result.Add(cashoutdto2);
|
|
LineNo = LineNo + 10;
|
|
}
|
|
|
|
//汇总
|
|
var cashoutdto = new FinancialVoucherCashInOut_CJDto()
|
|
{
|
|
LineNo = (LineNo).ToString(),
|
|
Period = periodReq,
|
|
AccountingDate = accountDateReq,
|
|
AccountSegment = "211698",//汇总
|
|
ProjectSegment = "207",
|
|
DetailSegment = "0",
|
|
CreditOriginalAmount = (totalcashin - totalcashout).OtcFormatMoney(grouping: false),
|
|
JournalEntriesBName = $"880010tangcheng{accountDateReq2}出入金",
|
|
JournalEntriesName = $"880010tangcheng{accountDateReq2}出入金",
|
|
JournalEntriesSpec = "出入金",
|
|
JournalEntriesSummary = "出入金",
|
|
DetailedId = $"tangcheng{detailDateReq}{(detailNo).ToString().PadLeft(3, '0')}"
|
|
};
|
|
result.Add(cashoutdto);
|
|
return result;
|
|
}
|
|
}
|
|
|
|
public SearchListResult<FinancialSummaryOptionModel> FinancialSummary_Option(FinancialSummaryModelReq req)
|
|
{
|
|
//默认值查询场外期权的交易
|
|
if (req.TradeTypeList == null || req.TradeTypeList.Count == 0)
|
|
{
|
|
switch (req.SummaryType)
|
|
{
|
|
case "远期/掉期":
|
|
req.TradeTypeList = new List<string> { "远期" };
|
|
break;
|
|
case "互换":
|
|
req.TradeTypeList = new List<string> { "收益互换" };
|
|
break;
|
|
case "场外期权":
|
|
default:
|
|
req.SummaryType = "场外期权";
|
|
req.TradeTypeList = ConsTrade.OptionTradeTypes;
|
|
break;
|
|
}
|
|
}
|
|
|
|
var contractBLL = new TradeDocumentService(UserInfo);
|
|
var modelList = new List<FinancialSummaryModelBase>();
|
|
var searchTradeList = tradeBLL.SearchOptionTrade(req);
|
|
var tradeIds = searchTradeList.rows.Select(O => O.TradeId).ToList();
|
|
var parentTradeIds = searchTradeList.rows.Select(x => x.ParentTradeId).ToHashSet();
|
|
var parentTrades = DbContext.trade.Where(x => parentTradeIds.Contains(x.id)).ToDictionary(n => n.id);
|
|
//var cashs = trade_cashBLL.GetTrade_Cashes(tradeIds);
|
|
var lastDate = QdpCalendarHelper.GetNonHolidayDefore(req.CurrentPeriodDateStart.AddDays(-1));
|
|
var currentDate = QdpCalendarHelper.GetNonHolidayDefore(req.CurrentPeriodDateEnd);
|
|
var positionReq = new EodTradePositionReq
|
|
{
|
|
ValueDateStart = lastDate,
|
|
ValueDateEnd = currentDate,
|
|
TraderIds = string.Join(",", tradeIds)
|
|
};
|
|
List<EodTradePosition> positions = null;
|
|
if (PS.Config.Company == CompanyEnum.光大光子)
|
|
{
|
|
positions = new EodTradePositionBLL().SearchList_extend(positionReq)?.rows.Select(O => (EodTradePosition)O).ToList();
|
|
}
|
|
else
|
|
{
|
|
positions = new EodTradePositionBLL().SearchList<eod_trade_position>(positionReq)?.rows.Select(O => (EodTradePosition)O).ToList();
|
|
}
|
|
var totleDeltaCashDict = new Dictionary<string, double>();
|
|
List<EodTradePosition> position = null;
|
|
Dictionary<int, EodTradeRisk> riskDict = null;
|
|
if (PS.Config.Company == CompanyEnum.光大光子 && req.SummaryType == "场外期权")
|
|
{
|
|
position = new RiskDailyReportService(UserInfo, currentDate).GetFutureList<eod_trade_position_extend>(currentDate).Select(O => (EodTradePosition)O).ToList();
|
|
using (var db = new YLContext())
|
|
{
|
|
if (PS.Config.Company == CompanyEnum.光大光子)
|
|
{
|
|
riskDict = (from riskDb in db.eod_trade_risk_extend where tradeIds.Contains(riskDb.TradeId) select riskDb).ToList().GroupBy(O => O.TradeId).ToDictionary(K => K.Key, V => (EodTradeRisk)V.OrderByDescending(O => O.ValueDate).First());
|
|
}
|
|
else
|
|
{
|
|
riskDict = (from riskDb in db.eod_trade_risk where tradeIds.Contains(riskDb.TradeId) select riskDb).ToList().GroupBy(O => O.TradeId).ToDictionary(K => K.Key, V => (EodTradeRisk)V.OrderByDescending(O => O.ValueDate).First());
|
|
}
|
|
}
|
|
foreach (var item in searchTradeList.rows)
|
|
{
|
|
if (!totleDeltaCashDict.ContainsKey(item.UnderlyingCode))
|
|
{ totleDeltaCashDict[item.UnderlyingCode] = 0; }
|
|
if (riskDict.ContainsKey(item.TradeId))
|
|
{
|
|
totleDeltaCashDict[item.UnderlyingCode] += Math.Abs(riskDict[item.TradeId].DeltaCash);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
position = new List<EodTradePosition>();
|
|
riskDict = new Dictionary<int, EodTradeRisk>();
|
|
}
|
|
var futureDict = position.GroupBy(O => O.UnderlyingCode).ToDictionary(K => K.Key, V => (double)V.ToList().Sum(O => O.PositionPnL));
|
|
var feeDict = position.GroupBy(O => O.UnderlyingCode).ToDictionary(K => K.Key, V => (double)V.ToList().Sum(O => O.Commission));
|
|
Dictionary<int, List<TagDto>> clientTagList = null;
|
|
if (searchTradeList != null && searchTradeList.rows != null && searchTradeList.rows.Any())
|
|
{
|
|
using (var tagService = new TagService(OptUser))
|
|
{
|
|
clientTagList = tagService.GetTagByClientIds(searchTradeList.rows.Select(p => p.ClientId).Distinct().ToList());
|
|
}
|
|
}
|
|
if (clientTagList == null)
|
|
{
|
|
clientTagList = new Dictionary<int, List<TagDto>>();
|
|
}
|
|
foreach (var item in searchTradeList.rows)
|
|
{
|
|
if (parentTrades.TryGetValue(item.ParentTradeId, out var parentTrade))
|
|
{
|
|
item.TradeNumber = parentTrade.TradeNumber;
|
|
}
|
|
|
|
double percent = 1;
|
|
if (riskDict.ContainsKey(item.TradeId) && totleDeltaCashDict.ContainsKey(item.UnderlyingCode))
|
|
{
|
|
var tradePercent = (item.Notional ?? 0) / item.OriginalNotional;
|
|
tradePercent = tradePercent == 0 ? 1 : tradePercent;
|
|
var totleDeltaCash = riskDict[item.TradeId].DeltaCash;
|
|
percent = Math.Abs(totleDeltaCash * tradePercent / totleDeltaCashDict[item.UnderlyingCode]);
|
|
}
|
|
double? lastPv = positions.FindAll(O => O.TradeId == item.TradeId && O.ValueDate == lastDate).Sum(O => O.Amount == 0 ? 0 : Convert.ToDouble(O.Pv) / O.Amount);
|
|
double? lastPnl = positions.FindAll(O => O.TradeId == item.TradeId && O.ValueDate == lastDate).Sum(O => O.Amount == 0 ? 0 : Convert.ToDouble(O.PositionPnL) / O.Amount);
|
|
double? pv = positions.FindAll(O => O.TradeId == item.TradeId && O.ValueDate == currentDate).Sum(O => O.Amount == 0 ? 0 : Convert.ToDouble(O.Pv) / O.Amount);
|
|
double? Pnl = positions.FindAll(O => O.TradeId == item.TradeId && O.ValueDate == currentDate).Sum(O => O.Amount == 0 ? 0 : Convert.ToDouble(O.PositionPnL) / O.Amount);
|
|
|
|
//model.ConfirmPnl = model.Status ? clearPrice + tradePrice : null;//我方清算盈亏;
|
|
item.LastPv = lastPv * item.Notional;//上期期末市值;
|
|
item.LastTotalPnl = lastPnl * item.Notional;//上期末累计浮动盈亏;
|
|
item.Pv = pv * item.Notional;//本期期末市值;
|
|
item.TotalPnl = Pnl * item.Notional;//本期末累计浮动盈亏;
|
|
if (item.TradeDate >= req.CurrentPeriodDateStart)
|
|
{ item.LastTotalPnl = 0; }
|
|
|
|
if (item.UnderlyingCode != null)
|
|
{
|
|
item.FuturePnl = futureDict.ContainsKey(item.UnderlyingCode) ? futureDict[item.UnderlyingCode] * percent : 0;//期货盈亏(结算价);
|
|
item.ServiceFee = feeDict.ContainsKey(item.UnderlyingCode) ? feeDict[item.UnderlyingCode] * percent : 0;//期货手续费;
|
|
item.CountRatio = DataCacheProvider.GetUnderlyingDataSource().GetData(item.UnderlyingCode).CountRatio;
|
|
}
|
|
else
|
|
{
|
|
item.FuturePnl = 0;//期货盈亏(结算价);
|
|
item.ServiceFee = 0;//期货手续费;
|
|
item.CountRatio = 1;
|
|
}
|
|
|
|
item.FinancialEntry = null;//财务入账;
|
|
var SpotPrice = DbContext.trade.Where(l => l.id == item.TradeId).FirstOrDefault()?.SpotPrice;
|
|
item.SurvivingNominalPrincipal = item.PositionAmount * SpotPrice;
|
|
|
|
//拼装标签值
|
|
if (clientTagList.ContainsKey(item.ClientId))
|
|
{
|
|
item.Tags = clientTagList[item.ClientId];
|
|
item.OutputTags = TagService.GetOutputTagsStr(item.Tags);
|
|
}
|
|
}
|
|
return searchTradeList;
|
|
}
|
|
}
|
|
|
|
public class FinancialVoucher_CJReq
|
|
{
|
|
public DateTime PreStartDate { get; set; }
|
|
|
|
public DateTime StartDate { get; set; }
|
|
|
|
public DateTime EndDate { get; set; }
|
|
public string SummaryType { get; set; }
|
|
|
|
public List<int> UserAssets { get; set; }
|
|
|
|
public List<int> UserClients { get; set; }
|
|
}
|
|
|
|
public class FinancialVoucher_CJDto
|
|
{
|
|
#region 期间
|
|
public string TradeConfirmPeriod { get; set; }
|
|
|
|
public string TradeConfirmDetailPeriod { get; set; }
|
|
|
|
public string ClearPeriod { get; set; }
|
|
|
|
public string ClearDetailPeriod { get; set; }
|
|
|
|
public string DailyWinLossPeriod { get; set; }
|
|
|
|
public string DailyWinLossDetailPeriod { get; set; }
|
|
#endregion
|
|
|
|
#region 记账日期
|
|
public string TradeConfirmAccountingDate { get; set; }
|
|
|
|
public string ClearAccountingPeriod { get; set; }
|
|
|
|
public string DailyWinLossAccountingPeriod { get; set; }
|
|
|
|
public string TradeConfirmAccountingDate2 { get; set; }
|
|
|
|
public string ClearAccountingPeriod2 { get; set; }
|
|
|
|
public string DailyWinLossAccountingPeriod2 { get; set; }
|
|
|
|
#endregion
|
|
|
|
#region 借方原币金额
|
|
/// <summary>
|
|
/// 上期-卖出-场外期权-权益-成本-未完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt1 { get; set; }
|
|
|
|
/// <summary>
|
|
/// 本期-买入-场外期权-权益-成本-未完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt2 { get; set; }
|
|
|
|
/// <summary>
|
|
/// 本期-清算盈亏之和
|
|
/// </summary>
|
|
public string DebitOriginalAmt3 { get; set; }
|
|
|
|
/// <summary>
|
|
/// 本期-卖出-场外期权-权益-清算盈亏-完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt4 { get; set; }
|
|
|
|
public string DebitOriginalAmt5 { get; set; }
|
|
/// <summary>
|
|
/// 本期-买入-场外期权-权益-清算盈亏-完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt6 { get; set; }
|
|
|
|
public string DebitOriginalAmt7 { get; set; }
|
|
|
|
/// <summary>
|
|
/// 本期-卖出-场外期权-权益-持仓盈亏
|
|
/// </summary>
|
|
public string DebitOriginalAmt8 { get; set; }
|
|
/// <summary>
|
|
/// 本期-买入-场外期权-权益-持仓盈亏
|
|
/// </summary>
|
|
public string DebitOriginalAmt9 { get; set; }
|
|
/// <summary>
|
|
/// 上期-卖出-场外期权-商品-成本-未完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt10 { get; set; }
|
|
/// <summary>
|
|
/// 本期-买入-场外期权-商品-成本-未完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt11 { get; set; }
|
|
public string DebitOriginalAmt12 { get; set; }
|
|
public string DebitOriginalAmt13 { get; set; }
|
|
/// <summary>
|
|
/// 本期-卖出-场外期权-商品-清算盈亏-完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt14 { get; set; }
|
|
/// <summary>
|
|
/// 本期-买入-场外期权-商品-清算盈亏-完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt15 { get; set; }
|
|
/// <summary>
|
|
/// 本期-(卖出买入之和)-场外期权-权益-清算盈亏-完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt16 { get; set; }
|
|
/// <summary>
|
|
/// 本期-(卖出买入之和)-场外期权-商品-清算盈亏-完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt17 { get; set; }
|
|
/// <summary>
|
|
/// 本期-卖出-场外期权-商品-持仓盈亏
|
|
/// </summary>
|
|
public string DebitOriginalAmt18 { get; set; }
|
|
/// <summary>
|
|
/// 本期-买入-场外期权-商品-持仓盈亏
|
|
/// </summary>
|
|
public string DebitOriginalAmt19 { get; set; }
|
|
/// <summary>
|
|
/// 本期-卖出-场外期权-(权益商品之和)-持仓盈亏
|
|
/// </summary>
|
|
public string DebitOriginalAmt20 { get; set; }
|
|
/// <summary>
|
|
/// 本期-买入-场外期权-(权益商品之和)-持仓盈亏
|
|
/// </summary>
|
|
public string DebitOriginalAmt21 { get; set; }
|
|
/// <summary>
|
|
/// 本期-卖出-场外期权-(权益商品之和)-清算盈亏-完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt22 { get; set; }
|
|
/// <summary>
|
|
/// 本期-买入-场外期权-(权益商品之和)-清算盈亏-完结
|
|
/// </summary>
|
|
public string DebitOriginalAmt23 { get; set; }
|
|
|
|
#endregion
|
|
|
|
#region 贷方原币金额
|
|
/// <summary>
|
|
/// 上期-买入-场外期权-权益-成本-未完结
|
|
/// </summary>
|
|
public string CreditOriginalAmt1 { get; set; }
|
|
/// <summary>
|
|
/// 本期-卖出-场外期权-权益-成本-未完结
|
|
/// </summary>
|
|
public string CreditOriginalAmt2 { get; set; }
|
|
public string CreditOriginalAmt3 { get; set; }
|
|
/// <summary>
|
|
/// 本期-持仓盈亏之和
|
|
/// </summary>
|
|
public string CreditOriginalAmt4 { get; set; }
|
|
/// <summary>
|
|
/// 上期-买入-场外期权-商品-成本-未完结
|
|
/// </summary>
|
|
public string CreditOriginalAmt5 { get; set; }
|
|
/// <summary>
|
|
/// 本期-卖出-场外期权-商品-成本-未完结
|
|
/// </summary>
|
|
public string CreditOriginalAmt6 { get; set; }
|
|
/// <summary>
|
|
/// 本期-成本-其他应付款
|
|
/// </summary>
|
|
public string CreditOriginalAmt7 { get; set; }
|
|
#endregion
|
|
|
|
#region 会计科目段
|
|
public Dictionary<string, string> AccountingSubjectCodeDic { get; set; } = new Dictionary<string, string>();
|
|
#endregion
|
|
|
|
#region 出入金
|
|
public List<FinancialVoucherCashInOut_CJDto> CashInOutInfoList { get; set; }
|
|
|
|
#endregion
|
|
}
|
|
|
|
public class FinancialVoucherCashInOut_CJDto
|
|
{
|
|
public string Direction { get; set; }
|
|
|
|
/// <summary>
|
|
/// 行号
|
|
/// </summary>
|
|
public string LineNo { get; set; }
|
|
|
|
/// <summary>
|
|
/// 期间(账期)
|
|
/// </summary>
|
|
public string Period { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
/// 记账日期
|
|
/// </summary>
|
|
public string AccountingDate { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
/// 会计科目段
|
|
/// </summary>
|
|
public string AccountSegment { get; set; }
|
|
|
|
/// <summary>
|
|
/// 明细段
|
|
/// </summary>
|
|
public string DetailSegment { get; set; }
|
|
|
|
/// <summary>
|
|
/// 项目段
|
|
/// </summary>
|
|
public string ProjectSegment { get; set; }
|
|
|
|
/// <summary>
|
|
/// 借方原币金额
|
|
/// </summary>
|
|
public string DebitOriginalAmount { get; set; }
|
|
|
|
/// <summary>
|
|
/// 贷方原币金额
|
|
/// </summary>
|
|
public string CreditOriginalAmount { get; set; }
|
|
|
|
/// <summary>
|
|
/// 日记账批名
|
|
/// </summary>
|
|
public string JournalEntriesBName { get; set; }
|
|
|
|
/// <summary>
|
|
/// 日记账名称
|
|
/// </summary>
|
|
public string JournalEntriesName { get; set; }
|
|
|
|
/// <summary>
|
|
/// 日记账说明
|
|
/// </summary>
|
|
public string JournalEntriesSpec { get; set; }
|
|
|
|
/// <summary>
|
|
/// 日记账行摘要
|
|
/// </summary>
|
|
public string JournalEntriesSummary { get; set; }
|
|
|
|
/// <summary>
|
|
/// 明细行标识
|
|
/// </summary>
|
|
public string DetailedId { get; set; }
|
|
|
|
}
|
|
|
|
}
|