@if (PS.Config.Company == CompanyEnum.广发商贸)
diff --git a/YLErpWeb/wwwroot/Scripts/app/client/clientMarginTemplateEdit.js b/YLErpWeb/wwwroot/Scripts/app/client/clientMarginTemplateEdit.js
index 39826f00..ae0bf1b1 100644
--- a/YLErpWeb/wwwroot/Scripts/app/client/clientMarginTemplateEdit.js
+++ b/YLErpWeb/wwwroot/Scripts/app/client/clientMarginTemplateEdit.js
@@ -5,6 +5,21 @@ const inputFormatPercent = Object.freeze({ precision: 2, append: '%' });
const inputFormatPercentNegative = Object.freeze({ precision: 2, append: '%', negative: true });
const inputFormatNegative = Object.freeze({ precision: 2, negative: true });
+//区间追保结构(RuleType=15)只读回显用常量,与 marginTemplateV2Edit.js 保持一致
+const RangeMarginRuleType = 15;
+//允许配期限档(SpanConfig.BondTerm)的资产类型掩码,本期仅利率债
+const TermTierEnabledUnderlyingMask = 16;
+//利率债区块固定展开的4个期限档([BondTerm值, 展示文案])
+const SpanBondTerms = [['<5y', '≤5y'], ['5y-10y', '(5y-10y]'], ['10y-30y', '(10y-30y]'], ['>30y', '>30y']];
+//标的资产类型标志位 -> 名称(与 marginTemplateV2Edit 的录入区块标题一致)
+const UnderlyingTypeNames = [
+ [16, "利率债"], [32, "信用债"], [64, "其它债券"], [128, "股票"], [256, "股指"], [512, "股指期货"],
+ [1024, "商品期货"], [2048, "商品现货"], [4096, "新三板挂牌股票"], [8192, "香港股票"], [16384, "香港股指"],
+ [32768, "基金及基金专户"], [65536, "黄金期货"], [131072, "国债期货"], [262144, "其他期货"], [524288, "黄金现货"],
+ [1048576, "其他现货"], [2097152, "境外期货"], [4194304, "境外现货"], [8388608, "境外股票"], [16777216, "境外股指"],
+ [33554432, "汇率"], [67108864, "Shibor"], [134217728, "银行间回购定盘"], [268435456, "利率收益率"], [536870912, "债券指数"]
+];
+
const vue = new Vue({
el: '#marginTemplateV2Form',
data: {
@@ -20,7 +35,87 @@ const vue = new Vue({
created: function () {
this.clientMarginTemplate.ValueDate = new moment(this.clientMarginTemplate.ValueDate).format("YYYY-MM-DD");
},
+ computed: {
+ //区间追保结构只读参数组:连续利率债行归一个区块、按固定4档对位(缺档不补造、同档重复/异常档独立成段保留展示);
+ //其余行(含ETF子类行)每行独立成块——分组口径与 marginTemplateV2Edit.rebuildSpanBlocks 一致,但只回显不新增行
+ ruleRangeBlocks() {
+ if (this.marginTemplate.RuleType != RangeMarginRuleType) return [];
+ var details = this.marginTemplate.Details || [];
+ var that = this;
+ var blocks = [];
+ var i = 0;
+ while (i < details.length) {
+ if ((details[i].UnderlyingType || 0) === TermTierEnabledUnderlyingMask) {
+ var j = i;
+ while (j < details.length && (details[j].UnderlyingType || 0) === TermTierEnabledUnderlyingMask) j++;
+ var byTerm = {};
+ var extras = [];
+ for (var k = i; k < j; k++) {
+ var bt = (details[k].SpanConfig && details[k].SpanConfig.BondTerm) || '';
+ var canonical = SpanBondTerms.some(function (t) { return t[0] === bt; });
+ if (canonical && !byTerm[bt]) byTerm[bt] = details[k]; else extras.push(details[k]);
+ }
+ var sections = SpanBondTerms.map(function (t) {
+ return { key: 't' + t[0], termLabel: t[1], detail: byTerm[t[0]] || null };
+ });
+ extras.forEach(function (r, xi) {
+ sections.push({ key: 'x' + xi, termLabel: that.bondTermLabel(r), detail: r });
+ });
+ blocks.push({ key: 'i' + i, no: blocks.length + 1, ut: TermTierEnabledUnderlyingMask, isTBond: true, etfKind: '', sections: sections });
+ i = j;
+ } else {
+ var d = details[i];
+ blocks.push({
+ key: 'i' + i, no: blocks.length + 1, ut: d.UnderlyingType || 0, isTBond: false,
+ etfKind: (d.SpanConfig && d.SpanConfig.EtfKind) || '',
+ sections: [{ key: 'single', termLabel: '', detail: d }]
+ });
+ i++;
+ }
+ }
+ return blocks;
+ }
+ },
methods: {
+ //资产类型标志位掩码 -> 名称(0=全部),与 marginTemplateV2Edit.underlyingTypeNames 一致
+ underlyingTypeNames(mask) {
+ mask = parseInt(mask) || 0;
+ if (mask === 0) return "全部";
+ var names = [];
+ for (var i = 0; i < UnderlyingTypeNames.length; i++) {
+ if ((mask & UnderlyingTypeNames[i][0]) > 0) names.push(UnderlyingTypeNames[i][1]);
+ }
+ return names.length > 0 ? names.join("、") : "全部";
+ },
+ //期限档 BondTerm -> 展示文案(空=全部)
+ bondTermLabel(detail) {
+ var v = (detail.SpanConfig && detail.SpanConfig.BondTerm) || '';
+ var map = { '': '全部', '<5y': '≤5y', '5y-10y': '(5y-10y]', '10y-30y': '(10y-30y]', '>30y': '>30y' };
+ return map[v] !== undefined ? map[v] : v;
+ },
+ //区间计价口径文案:按 detail 资产类型切换,与取数侧对齐(债券类=中债估值净价/期初全价×券面总额,其余=收盘价口径),
+ //直接沿用 marginTemplateV2Edit.spanText 的判定
+ spanText(detail) {
+ var ut = (detail && detail.UnderlyingType) || 0;
+ var bondMask = 16 | 32 | 64;
+ var isBond = ut !== 0 && (ut & ~bondMask) === 0;
+ if (!isBond) {
+ return {
+ priceInit: '参考标的期初净价',
+ priceCur: '参考标的当前收盘价',
+ priceCurShort1: '参考标的当前收盘价',
+ priceCurShort: '参考标的当前收盘价',
+ amountBase: '参考标的期初价格 × 参考标的名义份额'
+ };
+ }
+ return {
+ priceInit: '期初净价',
+ priceCur: '当前净价',
+ priceCurShort1: '当前净价',
+ priceCurShort: '当前净价',
+ amountBase: '期初全价 × 券面总额'
+ };
+ },
//changeClient(yldata) {
// let client = yldata || { id: 0 };
// this.clientMarginTemplate.ClientId = client.id;