BugFix 预付金取错了资产类型规则
This commit is contained in:
@@ -129,19 +129,39 @@ namespace YLErp.Modules.MarginModule
|
||||
var latestValueDate = detailQuery.Max(x => x.ValueDate);
|
||||
var details = detailQuery.Where(x => x.ValueDate == latestValueDate).ToList();
|
||||
|
||||
//4.利率债/分档ETF 期限档匹配:精确档 → "全部"(BondTerm 为空)兜底
|
||||
//4.资产类型先行(2026-08-27 顺序裁定:先品种后期限):按资产类型分档的模板先按标的品种缩小行集——
|
||||
//品种行 → 通配行(None/All)→ 均无则不缩小(回落到与旧序一致的期限匹配,模板未配该品种的既有兜底不变)。
|
||||
//期限档仅利率债允许配置(ConsMarginTerm),品种匹配必须在期限之前:期限精确匹配对任何标的恒有 term
|
||||
//(GetApplicableMarginTerm 兜底 <5y),非利率债标的会被利率债期限档行截胡、本品种行(BondTerm 空)永远不参与
|
||||
//(2026-08-27 交易2567 实证:信用债标的按 "<5y" 命中利率债行多收追保)
|
||||
var candidates = details;
|
||||
if (template.UnderlyingSeperateType == (int)UnderlyingSeperateTypeEnum.CustomInstrumentType
|
||||
&& Enum.TryParse<UnderlyingTypeEnum>(underlyingInstrumentType, out var instrumentFlag))
|
||||
{
|
||||
var byInstrument = details.Where(x => (x.UnderlyingType & instrumentFlag) > 0).ToList();
|
||||
if (!byInstrument.Any())
|
||||
{
|
||||
byInstrument = details.Where(x => x.UnderlyingType == UnderlyingTypeEnum.None || x.UnderlyingType == UnderlyingTypeEnum.All).ToList();
|
||||
}
|
||||
if (byInstrument.Any())
|
||||
{
|
||||
candidates = byInstrument;
|
||||
}
|
||||
}
|
||||
|
||||
//5.期限档匹配(利率债四档):精确档 → "全部"(BondTerm 为空)兜底
|
||||
var term = UnderlyingHelper.GetApplicableMarginTerm(underlyingCode, valueDate);
|
||||
var matched = details.Where(x => x.SpanConfig != null && x.SpanConfig.BondTerm == term).ToList();
|
||||
var matched = candidates.Where(x => x.SpanConfig != null && x.SpanConfig.BondTerm == term).ToList();
|
||||
if (!matched.Any())
|
||||
{
|
||||
matched = details.Where(x => x.SpanConfig == null || string.IsNullOrEmpty(x.SpanConfig.BondTerm)).ToList();
|
||||
matched = candidates.Where(x => x.SpanConfig == null || string.IsNullOrEmpty(x.SpanConfig.BondTerm)).ToList();
|
||||
}
|
||||
if (!matched.Any())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
//5.ETF 子类行优先(子类区分度高于期限):标的有 EtfSubType(基金类)时优先取 EtfKind=子类 的行——
|
||||
//6.ETF 子类行优先(子类区分度高于期限):标的有 EtfSubType(基金类)时优先取 EtfKind=子类 的行——
|
||||
//期限档匹配未命中子类行时再单独尝试"子类 + BondTerm 空"(子类不分档通配);无子类行维持原 matched(基金通配兜底)
|
||||
var underlyingCategory = GetUnderlyingCategory(underlyingCode, underlyingInstrumentType);
|
||||
if (underlyingCategory != null)
|
||||
@@ -149,24 +169,6 @@ namespace YLErp.Modules.MarginModule
|
||||
matched = PreferCategoryRows(matched, details, underlyingCategory);
|
||||
}
|
||||
|
||||
if (template.UnderlyingSeperateType == (int)UnderlyingSeperateTypeEnum.CustomInstrumentType
|
||||
&& Enum.TryParse<UnderlyingTypeEnum>(underlyingInstrumentType, out var instrumentFlag))
|
||||
{
|
||||
var byInstrument = matched.Where(x => (x.UnderlyingType & instrumentFlag) > 0).ToList();
|
||||
if (byInstrument.Any())
|
||||
{
|
||||
matched = byInstrument;
|
||||
}
|
||||
else
|
||||
{
|
||||
var wildcard = matched.Where(x => x.UnderlyingType == UnderlyingTypeEnum.None || x.UnderlyingType == UnderlyingTypeEnum.All).ToList();
|
||||
if (wildcard.Any())
|
||||
{
|
||||
matched = wildcard;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var detail = matched.First();
|
||||
return new MarginRateResult
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user