Files
zszq-trs/YLErpDAL/Model/FinancialSummaryModel.cs
T
2024-05-09 14:06:26 +08:00

654 lines
20 KiB
C#

using BaseOUDAL;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text.RegularExpressions;
using YLErp.Commons;
using YLErp.Models.Tag;
namespace YLErp.Model
{
/// <summary>
/// 财务汇总
/// </summary>
public abstract class FinancialSummaryModelBase
{
/// <summary>
/// 交易份额
/// <para>未完结:本期末持仓数量</para>
/// <para>已完结:本次交易数量</para>
/// </summary>
public double? Notional { get; set; }
/// <summary>
/// 成交日
/// </summary>
public DateTime? TradeDate { get; set; }
/// <summary>
/// 清算日期
/// </summary>
public DateTime? ClearDate { get; set; }
/// <summary>
/// 买卖方向-交易所
/// </summary>
public string TradeDirection { get; set; }
/// <summary>
/// 标的代码
/// </summary>
public string UnderlyingCode { get; set; }
/// <summary>
/// 名义本金(期初价格)
/// </summary>
public double? StockEqvNotional { get; set; }
/// <summary>
/// 名义本金(执行价格)
/// </summary>
public double? StockEqvNotional2 { get; set; }
/// <summary>
/// 名义本金(期初价格:合成标的时取最大价格)
/// </summary>
public double? StockEqvNotional3 { get; set; }
/// <summary>
/// 交易总额
/// </summary>
public double? TradePrice { get; set; }
/// <summary>
/// 清算金额
/// </summary>
public double? ClearPrice { get; set; }
/// <summary>
/// 手续费
/// </summary>
public double? ServiceFee { get; set; }
/// <summary>
/// 存续名义本金
/// </summary>
public double? SurvivingNominalPrincipal { get; internal set; }
}
/// <summary>
/// 财务汇总-场外期权
/// <para>含远期和掉期</para>
/// </summary>
public class FinancialSummaryOptionModel : FinancialSummaryModelBase
{
/// <summary>
/// 上期期末日期
/// </summary>
public DateTime PreLastDate { get; set; }
/// <summary>
/// 客户Id
/// </summary>
public int ClientId { get; set; }
/// <summary>
/// 对应的交易编号
/// </summary>
public int TradeId { get; set; }
public double? NewTotalPnl { get; set; }
/// <summary>
/// 主交易编号
/// </summary>
public int ParentTradeId { get; set; }
/// <summary>
/// 对应的开仓时资金记录编号
/// </summary>
public int TradeOpenCashId { get; set; }
/// <summary>
/// 对应的资金记录编号
/// </summary>
public int TradeCloseCashId { get; set; }
/// <summary>
/// 合约乘数
/// </summary>
public double ContractSize { get; set; }
/// <summary>
/// 成交手数
/// </summary>
public double OriginalLots { get; set; }
/// <summary>
/// 交易手数
/// </summary>
public double Lots { get; set; }
/// <summary>
/// 持仓手数
/// </summary>
public double PositionLots { get; set; }
/// <summary>
/// 成交份额
/// </summary>
public double OriginalNotional { get; set; }
/// <summary>
/// 成交数量
/// </summary>
public double OriginalAmount { get; set; }
/// <summary>
/// 持仓数量
/// </summary>
public double PositionAmount { get; set; }
/// <summary>
/// 看涨看跌
/// </summary>
public string OptionType { get; set; }
/// <summary>
/// 客户名称-全称
/// </summary>
public string ClientFullName { get; set; }
/// <summary>
/// 交易编号
/// </summary>
public string TradeNumber { get; set; }
/// <summary>
/// 确认书编号
/// </summary>
public string ContractCode { get; set; }
/// <summary>
/// 结算确认书编号
/// </summary>
public string SettlementCode { get; set; }
/// <summary>
/// 状态
/// <para>True:完结</para>
/// <para>False:未完结</para>
/// </summary>
public bool Status { get; set; }
public string StatusStr { get; set; }
/// <summary>
/// 客户名称-简称
/// </summary>
public string ClientShortName { get; set; }
/// <summary>
/// 到期日
/// </summary>
public DateTime? ExerciseDate { get; set; }
/// <summary>
/// 行权方式
/// </summary>
public string ExerciseMode { get; set; }
/// <summary>
/// 收益总额
/// <para>
/// 已完结:交易总额 + 清算金额
/// 未完结:Null
/// </para>
/// </summary>
public double? ConfirmPnl { get { return Status ? TradePrice.FormatValue(2) + ClearPrice.FormatValue(2) : null; } }
public double? ConfirmTotlePnl { get; set; }
/// <summary>
/// 上期期末市值
/// </summary>
public double? LastPv { get; set; }
private double? _lastTotalPnl = null;
/// <summary>
/// 上期期末累计浮动盈亏
/// <para>上期期末市值=0:0</para>
/// <para>上期期末市值!=0:
/// 卖出:交易价格-上期期末市值
/// 非卖出:交易价格+上期期末市值
///
/// 3.10版本财务汇总页面场外期权和远期交易中该字段算法改为Eod_Trade_Position表里的AccruedTotalPnl字段
/// </para>
/// </summary>
public double? LastTotalPnl
{
get
{
if ((_lastTotalPnl == null && !PS.Config.Is广发商贸) || (PS.Config.Is广发商贸 && TradeDate <= PreLastDate))
{ _lastTotalPnl = TradePrice.FormatValue(2) + LastPv.FormatValue(2); }
return _lastTotalPnl;
}
set => _lastTotalPnl = value;
}
/// <summary>
/// 本期期末市值
/// </summary>
public double? Pv { get; set; }
public int CountRatio { get; set; }
public double? _totalPnl = null;
/// <summary>
/// 本期期末累计浮动盈亏
/// <para>本期期末市值=0:0</para>
/// <para>本期期末市值!=0:
/// 卖出:交易价格-本期期末市值
/// 非卖出:交易价格+本期期末市值
///
/// 3.10版本财务汇总页面场外期权和远期交易中该字段算法改为Eod_Trade_Position表里的AccruedTotalPnl字段
/// </para>
/// </summary>
public double? TotalPnl
{
get
{
if (_totalPnl == null)
{
_totalPnl = TradePrice.FormatValue(2) + Pv.FormatValue(2);
}
return Status ? 0 : _totalPnl;
}
set => _ = value;
}
/// <summary>
/// 本期浮动盈亏
/// <para>
/// 未完结:本期期末累计浮动盈亏 - 上期期末累计浮动盈亏
/// 已完结-光子:本期期末累计浮动盈亏 - 上期期末累计浮动盈亏
/// 已完结:交易总额 + 清算金额 - 上期期末累计浮动盈亏
/// </para>
/// </summary>
public double? Pnl
{
get
{
if (!Status || PS.Config.Is光大光子)//光子已完结和未完结计算逻辑一致;
{
return TotalPnl.FormatValue(2) - LastTotalPnl.FormatValue(2);
}
else
{
return ConfirmPnl.FormatValue(2) - LastTotalPnl.FormatValue(2);
}
}
set => _ = value;
}
public double? GF_Pnl { get; set; }
/// <summary>
/// 期货盈亏
/// </summary>
public double? FuturePnl { get; set; }
/// <summary>
/// 费后总盈亏
/// <para>
/// 已完结:收益总额 + 期货盈亏 - 手续费
/// 未完结:本期期末累计浮动盈亏 + 期货盈亏 - 手续费
/// </para>
/// </summary>
public double? TotalPnlAfterExpense {
get { return Status ? ConfirmPnl.FormatValue(2) + FuturePnl.FormatValue(2) - ServiceFee.FormatValue(2) : TotalPnl.FormatValue(2) + FuturePnl.FormatValue(2) - ServiceFee.FormatValue(2); }
set => _ = value;
}
/// <summary>
/// 可用资金(财务)
/// </summary>
public double AvailableCash { get; set; }
/// <summary>
/// 期末结存(财务)
/// </summary>
public double EndBalance { get; set; }
/// <summary>
/// 交易确认书状态
/// </summary>
public string TradeConfirmFileStatus { get; set; }
/// <summary>
/// 清算确认书状态
/// </summary>
public string ClearConfirmFileStatus { get; set; }
/// <summary>
/// 财务入账
/// </summary>
public double? FinancialEntry { get; set; }
/// <summary>
/// 交易确认日期-财务
/// </summary>
public DateTime? TradeConfirmDate { get; set; }
/// <summary>
/// 了结确认日期
/// </summary>
public DateTime? ClearConfirmDate { get; set; }
/// <summary>
/// 结构类型
/// </summary>
public string StructureType { get; set; }
/// <summary>
/// 交易数量
/// </summary>
public double TradeAmount { get; set; }
public string UnderlyingInstrumentType{ get; set; }
public string TradeType { get; set; }
public string VarietyCode { get; set; }
/// <summary>
/// 客户标签
/// </summary>
[NotMapped]
public List<TagDto> Tags { get; set; }
/// <summary>
/// 客户标签
/// </summary>
[NotMapped]
public string OutputTags { get; set; }
/// <summary>
/// 簿记账户
/// </summary>
[NotMapped]
public string AssetBookName { get; set; }
/// <summary>
/// 簿记账户id
/// </summary>
[NotMapped]
public int AssetId { get; set; }
public double DailyPnL { get; internal set; }
public string ExchangeCode { get; internal set; }
}
/// <summary>
/// 财务汇总-场内期权
/// </summary>
public class FinancialSummaryExchangeModel : FinancialSummaryModelBase
{
/// <summary>
/// 交易所代码
/// </summary>
public string ExchangeOptionCode { get; set; }
/// <summary>
/// 期权类型
/// </summary>
public string OptionType { get; set; }
/// <summary>
/// 行权价
/// </summary>
public double? Strike { get; set; }
/// <summary>
/// 权利金单价
/// </summary>
public double? TradeSinglePrice
{
get
{
double? result = null;
if (TradePrice != null && TradeUnit != null)
{
result = Math.Abs((TradePrice.FormatValue(2) / TradeUnit.FormatValue(2) / Notional.FormatValue(2)) ?? 0);
}
return result;
}
}
/// <summary>
/// 吨/手
/// </summary>
public double? TradeUnit { get; set; }
/// <summary>
/// 名义本金
/// </summary>
public new double? StockEqvNotional { get { return Strike.FormatValue(2) * Notional.FormatValue(2) * TradeUnit.FormatValue(2); } }
/// <summary>
/// 上期末日期
/// </summary>
public DateTime PreLastDate { get; set; }
/// <summary>
/// 上期期末报价
/// </summary>
public double? PrePotionLastPrice { get; set; }
/// <summary>
/// 上期浮动盈亏
/// </summary>
public double? PrePotionLastPnl
{
get
{
if (TradeDate > PreLastDate || !PrePotionLastPrice.HasValue)
{ return null; }
return (PrePotionLastPrice.FormatValue(2) - TradeSinglePrice.FormatValue(4)) * Notional.FormatValue(2) * TradeUnit.FormatValue(2);
}
}
/// <summary>
/// 本期末日期
/// </summary>
public DateTime PreDate { get; set; }
/// <summary>
/// 本期期末报价
/// </summary>
public double? PrePotionEndPrice { get; set; }
/// <summary>
/// 本期浮动盈亏
/// </summary>
public double? PrePotionEndPnl
{
get
{
if (TradeDate > PreDate || !PrePotionEndPrice.HasValue)
{ return null; }
double? price = TradeDate <= PreLastDate ? PrePotionLastPrice : TradeSinglePrice;
return (PrePotionEndPrice.FormatValue(2) - price.FormatValue(4)) * Notional.FormatValue(2) * TradeUnit.FormatValue(2);
}
}
/// <summary>
/// 平仓买卖方向
/// </summary>
public string UnwindTradeDirection { get; set; }
/// <summary>
/// 平仓权利金单价
/// </summary>
public double? UnwindTradeSinglePrice { get { return ClearPrice.FormatValue(2) / UnwindNotional.FormatValue(2) / TradeUnit.FormatValue(2); } }
/// <summary>
/// 平仓成交量
/// </summary>
public double? UnwindNotional { get; set; }
/// <summary>
/// 平仓手续费
/// </summary>
public double? UnwindServiceFee { get; set; }
/// <summary>
/// 平仓对应初始权利金
/// </summary>
public double? UnwindOriginalTradePrice { get { return UnwindNotional.FormatValue(2) * TradeSinglePrice.FormatValue(4) * TradeUnit.FormatValue(2); } }
/// <summary>
/// 平仓本期浮动盈亏
/// </summary>
public double? UnwindEndPnl
{
get
{
double? price = TradeDate <= PreDate ? PrePotionEndPrice : TradeSinglePrice;
return (UnwindTradeSinglePrice.FormatValue(2) - price.FormatValue(4)) * UnwindNotional.FormatValue(2) * TradeUnit.FormatValue(2);
}
}
/// <summary>
/// 平仓盈亏
/// </summary>
public double? UnwindPnl { get { return ClearPrice.FormatValue(2) - UnwindOriginalTradePrice.FormatValue(2); } }
/// <summary>
/// 期末持仓期末结算价
/// </summary>
public double? PositionEndSettlementPrice { get; set; }
/// <summary>
/// 持仓数(手)
/// </summary>
public double? PositionNotional { get; set; }
/// <summary>
/// 持仓期末市值
/// </summary>
public double? PositionEndPv { get { return PositionEndSettlementPrice.FormatValue(2) * PositionNotional.FormatValue(2) * TradeUnit.FormatValue(2); } }
/// <summary>
/// 持仓对应初始权利金
/// </summary>
public double? PositionOriginalTradePrice { get { return PositionNotional.FormatValue(2) * TradeUnit.FormatValue(2) * TradeSinglePrice.FormatValue(4); } }
/// <summary>
/// 持仓公允价值变动
/// </summary>
public double? PositionPvOffset
{
get
{
double? price = TradeDate <= PreDate ? PrePotionEndPrice : TradeSinglePrice;
return (PositionEndSettlementPrice.FormatValue(2) - price.FormatValue(4)) * PositionNotional.FormatValue(2) * TradeUnit.FormatValue(2);
}
}
/// <summary>
/// 持仓名义本金
/// </summary>
public double? PositionStockEqvNotional { get { return Strike.FormatValue(2) * PositionNotional.FormatValue(2) * TradeUnit.FormatValue(2); } }
/// <summary>
/// 簿记账户
/// </summary>
public string AssetBookName { get; set; }
}
public class FinancialSummaryModelReq : BaseSearchReq
{
/// <summary>
/// 本期范围-开始
/// </summary>
public DateTime CurrentPeriodDateStart { get; set; }
/// <summary>
/// 本期范围-结束
/// </summary>
public DateTime CurrentPeriodDateEnd { get; set; }
public string SummaryType { get; set; }
public string ClientIds { get; set; }
/// <summary>
/// 客户Id
/// </summary>
public List<int> ClientIdList
{
get
{
if (ClientIds == null || !Regex.IsMatch(ClientIds, @"^(\d+,?)+$"))
{ return new List<int>(); }
List<int> list = Array.ConvertAll(ClientIds.Split(','), O => int.Parse(O)).ToList();
return list;
}
}
/// <summary>
/// 交易日期
/// </summary>
public string TradeNumber { get; set; }
/// <summary>
/// 确认书编号
/// </summary>
public string ContractCode { get; set; }
/// <summary>
/// 交易日期-开始
/// </summary>
public DateTime TradeDateStart { get; set; }
/// <summary>
/// 交易日期-结束
/// </summary>
public DateTime TradeDateEnd { get; set; }
/// <summary>
/// 到期日-开始
/// </summary>
public DateTime ExerciseDateStart { get; set; }
/// <summary>
/// 到期日-结束
/// </summary>
public DateTime ExerciseDateEnd { get; set; }
/// <summary>
/// 清算日期-开始
/// </summary>
public DateTime ClearDateStart { get; set; }
/// <summary>
/// 清算日期-结束
/// </summary>
public DateTime ClearDateEnd { get; set; }
/// <summary>
/// 交易确认日期-开始
/// </summary>
public DateTime TradeConfirmDateStart { get; set; }
/// <summary>
/// 交易确认日期-结束
/// </summary>
public DateTime TradeConfirmDateEnd { get; set; }
/// <summary>
/// 了结确认日期-开始
/// </summary>
public DateTime ClearConfirmDateStart { get; set; }
/// <summary>
/// 了结确认日期-结束
/// </summary>
public DateTime ClearConfirmDateEnd { get; set; }
/// <summary>
/// 期权类型
/// </summary>
public List<string> TradeTypeList { get; set; }
/// <summary>
/// 上期日期1
/// </summary>
public DateTime PreLastPartDate { get; set; }
/// <summary>
/// 上期日期2
/// </summary>
public DateTime LastPartDate { get; set; }
/// <summary>
/// 交易状态
/// </summary>
public string TradeStatus { get; set; }
/// <summary>
/// 开仓数据
/// <para>查询开仓数据时,一个交易编号只显示一条数据;</para>
/// </summary>
public bool IsOpen { get; set; }
public List<int> UserAssets { get; set; }
/// <summary>
/// 簿记账户组筛选
/// </summary>
public List<int> AssetIdGroupList { get; set; }
/// <summary>
/// 簿记账户信息
/// </summary>
public List<int> BookIds { get; set; }
public List<int> UserClients { get; set; }
public List<int> CurUserTradeIds { get; set; }
/// <summary>
/// 标签值
/// </summary>
public List<int> TagIds { get; set; }
/// <summary>
/// 客户标签值
/// </summary>
public List<int> ClientTagIds { get; set; }
/// <summary>
/// 品种代码
/// </summary>
public string VarietyCode { get; set; }
/// <summary>
/// 品种名称
/// </summary>
public string VarietyName { get; set; }
}
}