下面是對 opensingleComDialog
方法的詳細解析,并給出優化建議和優化后的代碼。
方法解析
作用
opensingleComDialog(index)
方法用于在輸入框失去焦點時(@blur
事件)自動根據輸入內容進行唯一性查詢,如果查到唯一結果則自動填充相關字段,減少用戶手動選擇的步驟。
主要邏輯
-
防止重復彈窗
首先判斷當前是否有任意一個彈窗(comDialog、comDialog1…comDialog10)已經打開,若有則直接返回,避免重復彈窗。 -
根據 index 區分不同字段的唯一性查詢
- 0:保險公司代碼/名稱
- 1:保險機構代碼/名稱
- 2:佰盈機構代碼/名稱
- 3~8:新增/修改彈窗下的公司、機構、佰盈機構
- 9~10:險種代碼/名稱
- 11~12:險種代碼/名稱(特殊處理)
-
唯一性查詢
每個 case 都會調用不同的接口(如commissionConfigdblqueryCom1
、commissionConfigdblqueryCom2
等),傳入當前輸入的內容,clickType
設為 1,表示唯一性校驗。
如果接口返回的數據只有一條,則自動填充對應的字段。
存在的問題
- 大量重復代碼
每個 case 結構類似,只有參數和回填字段不同,代碼冗余嚴重。 - 維護性差
新增字段或調整字段時需要多處修改,容易出錯。 - 部分 case 邏輯可以合并
比如公司、機構、佰盈機構的唯一性校驗邏輯基本一致。
優化思路
- 抽取通用唯一性校驗方法
將唯一性校驗的接口調用和回填邏輯抽成一個通用方法。 - 用配置對象映射 index 與參數、回填字段的關系
通過配置對象減少 case 分支。 - 減少冗余,提升可維護性
只需維護配置對象即可。
優化后代碼
methods: {// ... 其他方法 .../*** 通用唯一性校驗* @param {Function} apiFunc 接口方法* @param {Object} params 查詢參數* @param {Array} fields 需要回填的字段,格式:[[目標對象, 字段名, 返回字段名], ...]*/async uniqueQuery(apiFunc, params, fields) {try {const res = await apiFunc(params);if (res.data.code !== '000000' && !IsEmpty(res.data.code)) {this.openToast('warning', res.data.msg);} else {const data = res.data.data.data || res.data.data;if (data && data.length === 1) {fields.forEach(([target, field, resField]) => {this[target][field] = data[0][resField];});}}} catch (e) {console.log(e);}},opensingleComDialog(index) {if (this.comDialog || this.comDialog1 || this.comDialog2 || this.comDialog3 ||this.comDialog4 || this.comDialog5 || this.comDialog6 || this.comDialog7 ||this.comDialog8 || this.comDialog9 || this.comDialog10) {return;}// 配置映射const config = {0: {api: this.commissionConfigdblqueryCom1,params: {companycode: this.queryInfo.companycode,insurerName: this.queryInfo.insurerName,clickType: '1'},fields: [['queryInfo', 'companycode', 'companycode'],['queryInfo', 'insurerName', 'insurername']]},1: {api: this.commissionConfigdblqueryCom2,params: {companycode: this.queryInfo.companycode,orgCode: this.queryInfo.orgCode,orgName: this.queryInfo.orgName,clickType: '1'},fields: [['queryInfo', 'orgCode', 'orgcode'],['queryInfo', 'orgName', 'orgname']]},2: {api: this.commissionConfigdblqueryCom4,params: {comCodeOrName: this.queryInfo.comcode || this.queryInfo.comname || '',clickType: '1'},fields: [['queryInfo', 'comcode', 'comcode'],['queryInfo', 'comname', 'comCName']]},3: {api: this.commissionConfigdblqueryCom1,params: {companycode: this.queryInfoAdddialog.companycode,insurerName: this.queryInfoAdddialog.companyname,clickType: '1'},fields: [['queryInfoAdddialog', 'companycode', 'companycode'],['queryInfoAdddialog', 'companyname', 'insurername']]},4: {api: this.commissionConfigdblqueryCom2,params: {companycode: this.queryInfoAdddialog.companycode,orgCode: this.queryInfoAdddialog.orgCode,orgName: this.queryInfoAdddialog.orgName,clickType: '1'},fields: [['queryInfoAdddialog', 'orgCode', 'orgcode'],['queryInfoAdddialog', 'orgName', 'orgname']]},5: {api: this.commissionConfigdblqueryCom3,params: {comCodeOrName: this.queryInfoAdddialog.comcode || this.queryInfoAdddialog.comname || '',clickType: '1'},fields: [['queryInfoAdddialog', 'comcode', 'comcode'],['queryInfoAdddialog', 'comname', 'comCName']]},6: {api: this.commissionConfigdblqueryCom1,params: {companycode: this.queryInfoXiugaiDialog.companycode,insurerName: this.queryInfoXiugaiDialog.insurerName,clickType: '1'},fields: [['queryInfoXiugaiDialog', 'companycode', 'companycode'],['queryInfoXiugaiDialog', 'insurerName', 'insurername']]},7: {api: this.commissionConfigdblqueryCom2,params: {companycode: this.queryInfoXiugaiDialog.companycode,orgCode: this.queryInfoXiugaiDialog.orgCode,orgName: this.queryInfoXiugaiDialog.orgName,clickType: '1'},fields: [['queryInfoXiugaiDialog', 'orgCode', 'orgcode'],['queryInfoXiugaiDialog', 'orgName', 'orgname']]},8: {api: this.commissionConfigdblqueryCom3,params: {comCodeOrName: this.queryInfoXiugaiDialog.comcode || this.queryInfoXiugaiDialog.comname || '',clickType: '1'},fields: [['queryInfoXiugaiDialog', 'comcode', 'comcode'],['queryInfoXiugaiDialog', 'comCName', 'comCName']]},9: {api: this.commissionConfigdblqueryXianzhong,params: {companycode: this.queryInfoAdddialog.companycode,riskcode: this.queryInfoAdddialog.riskcode,riskname: this.queryInfoAdddialog.riskname,clickType: '1'},fields: [['queryInfoAdddialog', 'riskcode', 'riskcode'],['queryInfoAdddialog', 'riskname', 'riskname'],['queryInfoAdddialog', 'period', 'paymentperiod']]},10: {api: this.commissionConfigdblqueryXianzhong,params: {companycode: this.queryInfoXiugaiDialog.companycode,riskcode: this.queryInfoXiugaiDialog.riskcode,riskname: this.queryInfoXiugaiDialog.riskname,clickType: '1'},fields: [['queryInfoXiugaiDialog', 'riskcode', 'riskcode'],['queryInfoXiugaiDialog', 'riskname', 'riskname']]},11: {api: (params) => api('/salaryCommission/getSalary_riskCode', 'post', params),params: {riskCode: this.queryInfo.riskcode,riskName: this.queryInfo.riskname,clickType: '1'},fields: [['queryInfo', 'riskcode', 'riskcode'],['queryInfo', 'riskname', 'riskname']]},12: {api: (params) => api('/salaryCommission/getSalary_riskCode', 'post', params),params: {riskCode: this.queryInfoXiugaiDialog.riskcode,riskName: this.queryInfoXiugaiDialog.riskname,clickType: '1'},fields: [['queryInfoXiugaiDialog', 'riskcode', 'riskcode'],['queryInfoXiugaiDialog', 'riskname', 'riskname']]}};if (config[index]) {this.uniqueQuery(config[index].api, config[index].params, config[index].fields);}}
}
優化說明
- 只需維護
config
配置對象即可,新增唯一性校驗場景時只需添加配置項。 - 通過
uniqueQuery
方法統一處理接口調用和字段回填,減少重復代碼。 - 結構清晰,易于維護和擴展。
如需進一步精簡或有特殊業務邏輯,可繼續細化配置對象或抽象參數。
如需直接替換原方法,可將 opensingleComDialog
及 uniqueQuery
方法復制到 methods
中即可。
如有特殊接口返回結構差異,可在 uniqueQuery
方法中做兼容處理。
如需進一步優化或有其他相關問題,歡迎繼續提問!