Merge remote-tracking branch 'dest/glms/feature/1.4.2' into test

This commit is contained in:
lisong
2026-08-27 15:20:46 +08:00
86 changed files with 2863 additions and 599 deletions
@@ -24,5 +24,25 @@ namespace YLErp.DBModels
{
return fundTag == Credit ? Credit : Cash;
}
/// <summary>
/// 腿是否按授信分配(§2.3 情形1 回退口径):腿上显式选择优先(Credit=授信、Cash=现金);
/// 腿未选(默认)时取交易级资金来源(trade.margin_fund_source,必填默认现金)——授信→按授信分配
/// (额度不足拆单),现金→现金。交易级空值按现金(存量防御,SaveTrade 已归一)。
/// 标签定稿(ApplyMarginFundTags)与簿记资金校验(RealtimePnlCalc.TradeCanBeConfirm
/// 共用本口径,保证校验与定稿一致。
/// </summary>
public static bool PreferCredit(string legFundTag, string tradeFundSource)
{
if (legFundTag == Credit)
{
return true;
}
if (legFundTag == Cash)
{
return false;
}
return string.IsNullOrEmpty(legFundTag) && tradeFundSource == Credit;
}
}
}
+82
View File
@@ -220,4 +220,86 @@ namespace YLErp.DBModels
/// </summary>
public decimal MarginInterestLoss { get; set; }
}
/// <summary>
/// EQD-7084 新“框架合约”Tab 的新增字段及拆分后的估值口径。
/// 该模型不映射数据库,仅由新查询接口计算返回。
/// </summary>
public class EodSwapRiskNewFields
{
/// <summary>
/// 浮动收益端标的类型,仅供前端按债券/非债券选择期初价格精度使用,
/// 不参与任何收益或估值计算。
/// </summary>
public string UnderlyingInstrumentType { get; set; }
/// <summary>浮动收益端多空方向。</summary>
public string UnderlyingDirection { get; set; }
/// <summary>浮动收益端标的代码。</summary>
public string UnderlyingCode { get; set; }
/// <summary>期初标的价格;债券按百分价格展示。</summary>
public decimal? InitialPrice { get; set; }
/// <summary>名义数量,取合约名义本金。</summary>
public decimal NotionalQuantity { get; set; }
/// <summary>合约起始日。</summary>
public DateTime? ContractStartDate { get; set; }
/// <summary>合约到期日。</summary>
public DateTime? ContractMaturityDate { get; set; }
/// <summary>利息端基准:FR007 或固定利率。</summary>
public string InterestBenchmark { get; set; }
/// <summary>普通利息腿当前交易日适用利率合计。</summary>
public decimal InterestRatePrice { get; set; }
/// <summary>
/// 开平仓费用。日终腿已按我方收益方向归一:我方支付为负、我方收取为正;
/// 新 Tab 单独展示该金额,但估值中仍须计入一次。
/// </summary>
public decimal OpeningClosingFee { get; set; }
/// <summary>
/// 不含开平仓费用的浮动端待实现收益,来源为日终浮动腿的 PosiMtmPnL;
/// 不可再由旧口径的 PosiProfitSum 反推,避免把费用重新混入本列。
/// </summary>
public decimal FloatingUnrealizedPnl { get; set; }
/// <summary>
/// 排除初始/维持保证金腿后的普通利息端待实现收益。保证金利息保留在其独立两列,
/// 且只通过 MarginInterestAmount 参与估值,以满足“利息端仅展示利息端盈亏”的新口径。
/// </summary>
public decimal OrdinaryInterestPnl { get; set; }
/// <summary>
/// 保证金利息净额,仅供两种合约估值维持旧总额;前端不直接绑定该字段,
/// 以防它再次落入“合约利息端待实现收益”。
/// </summary>
public decimal MarginInterestAmount { get; set; }
/// <summary>收取对手方保证金利息。</summary>
public decimal MarginInterestGain { get; set; }
/// <summary>支付对手方保证金利息。</summary>
public decimal MarginInterestLoss { get; set; }
/// <summary>到期轧差口径估值;仅 DividendPayDate=0 时有值,且包含期间付息/分红。</summary>
public decimal? MaturityNettingValuation { get; set; }
/// <summary>期间支付派息口径估值;仅 DividendPayDate 非 0 时有值,不重复计入期间付息/分红。</summary>
public decimal? PeriodPaymentValuation { get; set; }
}
/// <summary>
/// EQD-7084 新“框架合约”Tab 响应。继承旧响应以保持原有列字段完全一致,
/// 新接口只额外序列化新增字段。
/// </summary>
public class EodSwapRiskNewResponse : EodSwapResponse
{
public EodSwapRiskNewFields NewFields { get; set; }
}
}
@@ -0,0 +1,50 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace YLErp.DBModels
{
public enum PushStateEnum
{
= 0,
= 1,
= 2
}
/// <summary>
/// 外发推送失败状态。只记录定位信息,不保存报文。
/// </summary>
[Table("push_status")]
public class PushStatus
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long id { get; set; }
[Column("value_date")]
public DateTime ValueDate { get; set; }
[Column("push_type")]
public int PushType { get; set; }
[Column("record_id")]
public long RecordId { get; set; }
[Column("state")]
public PushStateEnum State { get; set; }
[Column("retry_count")]
public int RetryCount { get; set; }
[Column("last_error")]
public string LastError { get; set; }
[Column("push_time")]
public DateTime? PushTime { get; set; }
[Column("create_time")]
public DateTime CreateTime { get; set; }
[Column("update_time")]
public DateTime? UpdateTime { get; set; }
}
}
@@ -404,13 +404,12 @@ namespace YLErp.DBModels
/// 期末标的结算收益率(EQD-6953 平仓)。普通债券类收益互换平仓时由债券计算器按
/// 期末标的交割全价反算(估值日=平仓日 ValueDate),允许手工覆盖。
/// 命名遵循《互换价格字段命名规范决策文档》时点维度:平仓/了结用 Exit(勿用 End/Close/Final)。
/// [NotMapped]:不落 swap_flow_event 表列;仅随 UnwindData 序列化进 swap_event.EventData JSON
/// 由平仓待复核回显(GetSwapEvent)与结算确认书 Excel(TradeSettleBillGenerator) 消费。
/// 直接保存到 swap_flow_event.ExitYtm,提前终止详情页和结算确认书均读取该次平仓浮动腿记录。
/// ⚠️ 存储口径为【展示态百分数】(如 6.3721 表示 6.3721%),与同页期末交割全价(展示态)一致,
/// 区别于录入页 trade.InitYtm 的存储态小数(0.063721)——两者载体不同、互不干扰,勿"顺手统一"。
/// 精度:确认书导出固定 4 位小数不去零(ToString("0.0000"));本字段保留 4 位(四舍五入)。
/// </summary>
[NotMapped]
[Column("ExitYtm", TypeName = "decimal(18,4)")]
public decimal? ExitYtm { get; set; }
}
@@ -677,6 +677,17 @@ namespace YLErp.DBModels
[TradeAuditExclude]
public string MarginTemplateName { get; set; }
/// <summary>
/// 保证金资金来源(收益互换,必填,默认现金):预付金腿未选资金标签(默认)时的定稿依据(§2.3 情形1)。
/// 值与 swap_position.fund_tag 同词表:Credit=优先授信(额度不足自动拆单)、Cash=现金。
/// 录入页必选(新交易默认 Cash),SaveTrade 对空值归一为 Cash(兜住 DMA 等绕过页面的链路);
/// 历史来源:旧版 trade.MarginTemplateName 曾以字典文本(授信保证金/现金保证金)承载该语义,模板V2迁移后由本列承接。
/// </summary>
[DisplayName("资金来源")]
[TradeAuditExclude]
[Column("margin_fund_source")]
public string MarginFundSource { get; set; }
/// <summary>
/// 预付金算法
/// </summary>