fix(EQD-7049): 期权定价首腿预载默认标的失败不再弹"标的信息缺失"

- 现象(国联民生反馈):新建定价页第一次新增单腿即弹"标的信息缺失",
  接口返回 {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 项回归全过
This commit is contained in:
hjhan
2026-08-27 15:21:20 +08:00
parent e085734297
commit a7babb95a4
2 changed files with 30 additions and 6 deletions
@@ -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) {
@@ -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) {