From a7babb95a44a0bbb6a7967db2edf8cea422a153f Mon Sep 17 00:00:00 2001 From: hjhan Date: Thu, 27 Aug 2026 15:21:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(EQD-7049):=20=E6=9C=9F=E6=9D=83=E5=AE=9A?= =?UTF-8?q?=E4=BB=B7=E9=A6=96=E8=85=BF=E9=A2=84=E8=BD=BD=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=A0=87=E7=9A=84=E5=A4=B1=E8=B4=A5=E4=B8=8D=E5=86=8D=E5=BC=B9?= =?UTF-8?q?"=E6=A0=87=E7=9A=84=E4=BF=A1=E6=81=AF=E7=BC=BA=E5=A4=B1"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 现象(国联民生反馈):新建定价页第一次新增单腿即弹"标的信息缺失", 接口返回 {success:false,obj:null,msg:"标的信息缺失"} - 根因:首腿 initFlag='first' 挂载后自动预载默认类型标的(Stock/CommodityFutures, 由 OtcConfig.StockFirst 决定),固收环境下该类型无"已上线且未到期"标的时 后端 FirstOrDefault 落空返回 JsonError;1c19d2f7 的"三者皆空跳过"守卫 挡不住这条带默认类型的请求 - 修复:首腿预载改走 preloadDefaultUnderlying,以 silent 调 updateUnderlying—— main.post 传 {alertFn:$.noop, suppressError:true} 静默失败(仅 console.warn), 标的留空待用户自选;用户主动切换类型/选标的的查询路径完全不变 - 注:changeInstrumentType 被 v-on:input 绑定(首参为选中值),不能加位置参数, 故预载单独成方法 - 同步修改东莞定制版 structure_dz.js - 验证:mock 后端返回 success:false,断言静默选项传递/用户路径不变/旧守卫保留/ 首腿接线,两文件 12 项全过;下拉套件 20 项回归全过 --- .../wwwroot/Scripts/app/pricing/structure.js | 18 +++++++++++++++--- .../Scripts/app/pricing/structure_dz.js | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/YLErpWeb/wwwroot/Scripts/app/pricing/structure.js b/YLErpWeb/wwwroot/Scripts/app/pricing/structure.js index 39fed9ba..ccea95ae 100644 --- a/YLErpWeb/wwwroot/Scripts/app/pricing/structure.js +++ b/YLErpWeb/wwwroot/Scripts/app/pricing/structure.js @@ -1416,7 +1416,7 @@ const vueTrade = function () { switch (this.viewState.initFlag) { case 'first': this.viewState.initFlag = ''; - this.changeInstrumentType(); + this.preloadDefaultUnderlying(); break; case 'import1': case 'import2': @@ -1446,6 +1446,15 @@ const vueTrade = function () { tradeUtils.resetRisky(this.trade); } }, + // EQD-7049:首腿自动预载默认类型标的。固收等环境下默认类型(Stock/CommodityFutures)可能没有 + // 已上线标的,后端必返回"标的信息缺失"——属可容忍场景,静默失败不弹窗,留待用户自选; + // 用户主动切换类型仍走 changeInstrumentType,查询失败正常提示 + preloadDefaultUnderlying() { + if (new Date().getTime() < this.updateKey.underlying + 300) return; + let instType = this.trade.UnderlyingInstrumentType; + this.viewState.variety = tradeHelper.getEmptyVariety(instType); + this.updateUnderlying({ InstrumentType: instType }, false, true); + }, //变更标的类型 changeInstrumentType() { if (new Date().getTime() < this.updateKey.underlying + 300) return; @@ -1484,7 +1493,7 @@ const vueTrade = function () { } }, //更新标的 - updateUnderlying(reqData, fromSelect) { + updateUnderlying(reqData, fromSelect, silent) { let self = this; // EQD-7049:新建空白页未选标的/品种/类型时,跳过必然失败的后端默认标的查询,避免报“标的信息缺失” var hasQueryKey = !!(reqData.UnderlyingCode || reqData.InstrumentType || reqData.VarietyId > 0); @@ -1494,7 +1503,10 @@ const vueTrade = function () { } var instTypeChanged = !!reqData.InstrumentType; !fromSelect && (self.viewState.underlying = tradeHelper.getEmptyUnderlying()); - main.post("/pricing/AjaxGetUnderlying", reqData).done(function (resp) { + // silent:自动预载场景失败不弹窗(alertFn 置空+抑制网络错误提示),用户主动查询仍正常提示 + var req = main.post("/pricing/AjaxGetUnderlying", reqData, silent ? { alertFn: $.noop, suppressError: true } : undefined); + silent && req.fail(function (resp) { console.warn('预载默认标的失败(已忽略):', resp && resp.msg); }); + req.done(function (resp) { let trade = self.trade; let um = resp.obj.underlying; if (!fromSelect) { diff --git a/YLErpWeb/wwwroot/Scripts/app/pricing/structure_dz.js b/YLErpWeb/wwwroot/Scripts/app/pricing/structure_dz.js index d0712e3c..6fdc2192 100644 --- a/YLErpWeb/wwwroot/Scripts/app/pricing/structure_dz.js +++ b/YLErpWeb/wwwroot/Scripts/app/pricing/structure_dz.js @@ -1025,7 +1025,7 @@ const vueTrade = function () { switch (this.viewState.initFlag) { case 'first': this.viewState.initFlag = ''; - this.changeInstrumentType(); + this.preloadDefaultUnderlying(); break; case 'import1': case 'import2': @@ -1059,6 +1059,15 @@ const vueTrade = function () { tradeUtils.resetCashFlow(this.trade); } }, + // EQD-7049:首腿自动预载默认类型标的。固收等环境下默认类型(Stock/CommodityFutures)可能没有 + // 已上线标的,后端必返回"标的信息缺失"——属可容忍场景,静默失败不弹窗,留待用户自选; + // 用户主动切换类型仍走 changeInstrumentType,查询失败正常提示 + preloadDefaultUnderlying() { + if (new Date().getTime() < this.updateKey.underlying + 300) return; + let instType = this.trade.UnderlyingInstrumentType; + this.viewState.variety = tradeHelper.getEmptyVariety(instType); + this.updateUnderlying({ InstrumentType: instType }, false, true); + }, //变更标的类型 changeInstrumentType() { if (new Date().getTime() < this.updateKey.underlying + 300) return; @@ -1099,7 +1108,7 @@ const vueTrade = function () { } }, //更新标的 - updateUnderlying(reqData, fromSelect) { + updateUnderlying(reqData, fromSelect, silent) { let self = this; // EQD-7049:新建空白页未选标的/品种/类型时,跳过必然失败的后端默认标的查询,避免报“标的信息缺失” var hasQueryKey = !!(reqData.UnderlyingCode || reqData.InstrumentType || reqData.VarietyId > 0); @@ -1109,7 +1118,10 @@ const vueTrade = function () { } var instTypeChanged = !!reqData.InstrumentType; !fromSelect && (self.viewState.underlying = tradeHelper.getEmptyUnderlying()); - main.post("/pricing/AjaxGetUnderlying", reqData).done(function (resp) { + // silent:自动预载场景失败不弹窗(alertFn 置空+抑制网络错误提示),用户主动查询仍正常提示 + var req = main.post("/pricing/AjaxGetUnderlying", reqData, silent ? { alertFn: $.noop, suppressError: true } : undefined); + silent && req.fail(function (resp) { console.warn('预载默认标的失败(已忽略):', resp && resp.msg); }); + req.done(function (resp) { let trade = self.trade; let um = resp.obj.underlying; if (!fromSelect) {