三处重复的 StartsWith/EndsWith 字符串解析(GetInterests / InitInterestDate / SwapEodPositionService EOD平仓后结息)收口为 TradeExtendJson 计算属性: - [JsonIgnore] 保证 ExtendJson 序列化字节不变; - InitInterestDate 原写法在 InterestCalcMode 为显式 null 时会 NRE, 收口后与其他两处 null-安全语义对齐(缺省=算头算尾,实际不可达,属性缺省 11)。 EQD-6968 三判定之一的"算不算尾"至此单点可查。 验证:内存套件 102/102 全绿(GLMS20260817Fr007 23 + Cache 7 + CloseInterest/ InterestScenario/TailSnapshot/EntrySemantics 72)
117 lines
3.6 KiB
C#
117 lines
3.6 KiB
C#
using Newtonsoft.Json;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.ComponentModel.DataAnnotations;
|
||
using System.ComponentModel.DataAnnotations.Schema;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using YLErp.Helpers;
|
||
|
||
namespace YLErp.DBModels
|
||
{
|
||
/// <summary>
|
||
/// 框架合约交易要素簿记表
|
||
/// </summary>
|
||
[Table("trade_extend")]
|
||
public class trade_extend
|
||
{
|
||
/// <summary>
|
||
/// 交易id 主键
|
||
/// </summary>
|
||
[Key,DatabaseGenerated(DatabaseGeneratedOption.None)]
|
||
[DisplayName("交易id")]
|
||
[DataChange]
|
||
public int TradeId { get; set; }
|
||
/// <summary>
|
||
/// 交易扩展元素JSON
|
||
/// </summary>
|
||
[DisplayName("交易扩展元素JSON")]
|
||
[DataChange]
|
||
public string ExtendJson { get; set; }
|
||
/// <summary>
|
||
/// 用于公司定制的扩展JSON
|
||
/// </summary>
|
||
[DisplayName("用于公司定制的扩展JSON")]
|
||
[DataChange]
|
||
public string CompanyJson { get; set; }
|
||
|
||
/// <summary>
|
||
/// 交易要素扩展对象
|
||
/// </summary>
|
||
[NotMapped]
|
||
public TradeExtendJson ExtendObj
|
||
{
|
||
get
|
||
{
|
||
if (string.IsNullOrEmpty(ExtendJson))
|
||
{
|
||
return new TradeExtendJson();
|
||
}
|
||
|
||
return JsonConvert.DeserializeObject<TradeExtendJson>(ExtendJson);
|
||
}
|
||
}
|
||
|
||
public trade_extend Clone()
|
||
{
|
||
return (trade_extend)MemberwiseClone();
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 交易要素扩展Json
|
||
/// </summary>
|
||
public class TradeExtendJson
|
||
{
|
||
/// <summary>
|
||
/// 流水簿记模式 0:否,1:先进先出,2:加权平均
|
||
/// </summary>
|
||
public int FlowBookMode { get; set; }
|
||
/// <summary>
|
||
/// 浮动收益年化
|
||
/// </summary>
|
||
public bool FloatingPnlAnnualized { get; set; }
|
||
/// <summary>
|
||
/// 是否收取开仓费
|
||
/// </summary>
|
||
public bool NeedOpenFee { get; set; }
|
||
/// <summary>
|
||
/// 收费类型 0:按手数收费,1:按份数收费
|
||
/// </summary>
|
||
public int OpenFeeType { get; set; }
|
||
/// <summary>
|
||
/// 年化天数
|
||
/// </summary>
|
||
public int AnnualDays { get; set; } = 365;
|
||
/// <summary>
|
||
/// 计息方式 00:不算头不算尾,01:不算头算尾,10:算头不算尾,11:算头算尾,缺省值:11
|
||
/// </summary>
|
||
public string InterestCalcMode { get; set; } = "11";
|
||
|
||
/// <summary>算头:InterestCalcMode 首位为 1;null/缺省视为算头。收口原 GetInterests/InitInterestDate/EOD三处 StartsWith 解析。</summary>
|
||
[JsonIgnore]
|
||
public bool CalcFirst => InterestCalcMode?.StartsWith("1") ?? true;
|
||
|
||
/// <summary>算尾:InterestCalcMode 末位为 1;null/缺省视为算尾(EQD-6968 取价依赖判定的核心开关之一)。</summary>
|
||
[JsonIgnore]
|
||
public bool CalcLast => InterestCalcMode?.EndsWith("1") ?? true;
|
||
|
||
/// <summary>
|
||
///多空组合浮动端 收取方向 1:收取,2:支付
|
||
/// </summary>
|
||
public int Direction { get; set; }
|
||
|
||
/// <summary>
|
||
/// 结算规则 0 T+0 1 T+1
|
||
/// </summary>
|
||
public int SettlementRules { get; set; } = 0;
|
||
|
||
/// <summary>
|
||
/// 派息金额支付日 0到期结算日 1派息日+0 2派息日+1 3派息日+2
|
||
/// </summary>
|
||
public int DividendPayDate { get; set; } = 1;
|
||
|
||
}
|
||
}
|