From 5849fe8dd015b076c303f89233d59561a69571fa Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期一, 25 一月 2021 19:38:26 +0800
Subject: [PATCH] 2021-01-25

---
 src/tabviews/subtable/index.jsx |  321 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 299 insertions(+), 22 deletions(-)

diff --git a/src/tabviews/subtable/index.jsx b/src/tabviews/subtable/index.jsx
index b709835..555c951 100644
--- a/src/tabviews/subtable/index.jsx
+++ b/src/tabviews/subtable/index.jsx
@@ -8,6 +8,7 @@
 import zhCN from '@/locales/zh-CN/main.js'
 import enUS from '@/locales/en-US/main.js'
 import Utils from '@/utils/utils.js'
+import options from '@/store/options.js'
 import UtilsDM from '@/utils/utils-datamanage.js'
 import UtilsUpdate from '@/utils/utils-update.js'
 import { modifyTabview } from '@/store/action'
@@ -61,6 +62,8 @@
     statFields: [],       // 鍚堣瀛楁
     statFValue: [],       // 鍚堣鍊�
     absFields: [],        // 缁濆鍊煎瓧娈�
+    loadCustomApi: true,  // 鍔犺浇澶栭儴璧勬簮
+    hasReqFields: false
   }
 
   /**
@@ -73,7 +76,7 @@
         pageIndex: 1
       }, () => {
         if (this.state.setting) {
-          this.loadmaindata(nextProps.BID, 'refresh')
+          this.loadmaindata()
         }
       })
     } else if (!this.props.Tab.supMenu && nextProps.mainSearch && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) {
@@ -261,9 +264,13 @@
       }
 
       let valid = true // 鎼滅储鏉′欢蹇呭~楠岃瘉
+      let hasReqFields = false
       config.search.forEach(field => {
         if (field.required === 'true' && !field.initval) {
           valid = false
+        }
+        if (field.required === 'true') {
+          hasReqFields = true
         }
       })
 
@@ -316,7 +323,8 @@
         actions: _actions,
         columns: _columns,
         arr_field: _arrField.join(','),
-        search: Utils.initMainSearch(config.search) // 鎼滅储鏉′欢鍒濆鍖栵紙鍚湁鏃堕棿鏍煎紡锛岄渶瑕佽浆鍖栵級
+        search: Utils.initMainSearch(config.search), // 鎼滅储鏉′欢鍒濆鍖栵紙鍚湁鏃堕棿鏍煎紡锛岄渶瑕佽浆鍖栵級
+        hasReqFields
       }, () => {
         if (config.setting.onload !== 'false' && (!Tab.supMenu || BID || Tab.isTreeNode) && valid) { // 鍒濆鍖栧彲鍔犺浇
           this.loadmaindata()
@@ -336,15 +344,286 @@
       })
     }
   }
+  
+  loadData = () => {
+    const { mainSearch, BID } = this.props
+    const { setting, search, loadCustomApi } = this.state
+
+    let searches = fromJS(search).toJS()
+    if (mainSearch && mainSearch.length > 0) { // 涓昏〃鎼滅储鏉′欢
+      searches = [...mainSearch, ...searches]
+    }
+
+    let requireFields = searches.filter(item => item.required && (!item.value || item.value.length === 0))
+    let prex = this.props.Tab && this.props.Tab.label ? this.props.Tab.label + '-' : ''
+
+    if (requireFields.length > 0) {
+      let labels = requireFields.map(item => item.label)
+      labels = Array.from(new Set(labels))
+
+      notification.warning({
+        top: 92,
+        message: prex + this.state.dict['form.required.input'] + labels.join('銆�') + ' !',
+        duration: 3
+      })
+      return
+    } else if (this.props.Tab.supMenu && !BID) { // 涓昏〃ID涓嶅瓨鍦ㄦ椂锛屼笉鏌ヨ瀛愯〃
+      this.setState({
+        data: [],
+        selectedData: [],
+        statFValue: [],
+        total: 0
+      })
+      return
+    } else if (window.GLOB.systemType === 'production' && setting.interType === 'custom' && !setting.proInterface) {
+      notification.warning({
+        top: 92,
+        message: '鏈缃寮忕郴缁熷湴鍧�!',
+        duration: 3
+      })
+      return
+    }
+
+    if (setting.interType === 'custom' && loadCustomApi) {
+      if (setting.execTime === 'once') {
+        this.setState({loadCustomApi: false})
+      }
+
+      this.loadOutResource()
+      if (setting.execType === 'async') {
+        this.loadmaindata()
+      }
+    } else {
+      this.loadmaindata()
+    }
+  }
+
+  loadOutResource = () => {
+    const { setting, search, BID } = this.state
+
+    let param = UtilsDM.getPrevQueryParams(setting, search, BID, this.props.menuType)
+
+    if (setting.execType === 'sync') {
+      this.setState({
+        loading: true
+      })
+    }
+
+    Api.genericInterface(param).then(res => {
+      if (res.status) {
+        if (res.mk_ex_invoke === 'false') {
+          this.loadmaindata()
+        } else {
+          this.customOuterRequest(res)
+        }
+      } else {
+        this.setState({
+          loading: false
+        })
+        notification.error({
+          top: 92,
+          message: res.message,
+          duration: 10
+        })
+      }
+    }, () => {
+      this.setState({
+        loading: false
+      })
+    })
+  }
+
+  customOuterRequest = (result) => {
+    const { setting } = this.state
+    let url = ''
+
+    if (window.GLOB.systemType === 'production') {
+      url = setting.proInterface
+    } else {
+      url = setting.interface
+    }
+
+    let mkey = result.mk_api_key || ''
+
+    delete result.mk_ex_invoke
+    delete result.status
+    delete result.message
+    delete result.ErrCode
+    delete result.ErrMesg
+    delete result.mk_api_key
+
+    let param = {}
+
+    Object.keys(result).forEach(key => {
+      key = key.replace(/^mk_/ig, '')
+      param[key] = result[key]
+    })
+
+    Api.directRequest(url, setting.method, param).then(res => {
+      if (typeof(res) !== 'object' || Array.isArray(res)) {
+        let error = '鏈煡鐨勮繑鍥炵粨鏋滐紒'
+
+        if (typeof(res) === 'string') {
+          error = res
+        }
+
+        let _result = {
+          mk_api_key: mkey,
+          $ErrCode: 'E',
+          $ErrMesg: error
+        }
+
+        this.customCallbackRequest(_result)
+      } else {
+        res.mk_api_key = mkey
+        this.customCallbackRequest(res)
+      }
+    }, () => {
+      this.setState({
+        loading: false
+      })
+    })
+  }
+
+  customCallbackRequest = (result) => {
+    const { setting } = this.state
+    let lines = []
+    let pre = setting.callbackType === 'script' ? '@' : ''
+
+    let errSql = ''
+    if (result.$ErrCode === 'E') {
+      errSql = `
+        set @ErrorCode='E'
+        set @retmsg='${result.$ErrMesg}'
+      `
+      delete result.$ErrCode
+      delete result.$ErrMesg
+    }
+
+    let getDefaultSql = (obj, tb, bid, level) => {
+      let keys = []
+      let vals = []
+      let subObjs = []
+      let id = Utils.getuuid()
+
+      delete obj.$$key
+
+      Object.keys(obj).forEach(key => {
+        let val = obj[key]
+        if (typeof(val) === 'object') {
+          if (Array.isArray(val)) {
+            val.forEach(item => {
+              if (typeof(item) !== 'object' || Array.isArray(item)) return
+              if (Object.keys(item).length > 0) {
+                item.$$key = tb + '_' + key
+                subObjs.push(item)
+              }
+            })
+          } else if (Object.keys(val).length > 0) {
+            val.$$key = tb + '_' + key
+            subObjs.push(val)
+          }
+        } else if (val !== null && val !== undefined) {
+          keys.push(key)
+          vals.push(`'${val}'`)
+        }
+      })
+
+      lines.push({
+        table: tb,
+        insert: `Insert into ${pre}${tb} (${keys.join(',')},mk_level,mk_id,mk_bid)`,
+        select: `Select ${vals.join(',')},'${level}','${id}','${bid}'`
+      })
+
+      subObjs.forEach(item => {
+        getDefaultSql(item, item.$$key, id, level + 1)
+      })
+    }
+    
+    getDefaultSql(result, setting.cbTable, '', 1)
+
+    let lineMap = new Map()
+    lines.forEach(line => {
+      if (lineMap.has(line.table)) {
+        let _line = lineMap.get(line.table)
+        _line.selects.push(line.select)
+        lineMap.set(line.table, _line)
+      } else {
+        lineMap.set(line.table, {
+          table: line.table,
+          insert: line.insert,
+          selects: [line.select]
+        })
+      }
+    })
+
+    let param = {}
+
+    if (setting.callbackType === 'script') { // 浣跨敤鑷畾涔夎剼鏈�
+      let sql = [...lineMap.values()].map(item => (`
+        ${item.insert}
+        ${item.selects.join(` union all
+        `)}
+      `))
+      sql = sql.join('')
+      
+      param = UtilsDM.getCallBackQueryParams(setting, sql, errSql)
+
+      if (this.state.BID) {
+        param.BID = this.state.BID
+      }
+
+      if (this.props.menuType === 'HS') { // 鍑芥暟 sPC_TableData_InUpDe 浜戠楠岃瘉
+        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
+      }
+    } else {
+      param.func = 's_ex_result_back'
+      param.s_ex_result = [...lineMap.values()].map((item, index) => ({
+        MenuID: this.state.config.MenuID,
+        MenuName: this.state.config.MenuName,
+        TableName: item.table,
+        LongText: window.btoa(window.encodeURIComponent(`${item.insert}  ${item.selects.join(` union all `)}`)),
+        Sort: index + 1
+      }))
+
+      if ((window.GLOB.systemType !== 'production' && options.sysType !== 'cloud') || window.debugger === true) {
+        let sql = [...lineMap.values()].map(item => (`
+          ${item.insert}
+          ${item.selects.join(` union all
+          `)}
+        `))
+        sql = sql.join('')
+        console.info(sql.replace(/\n\s{10}/ig, '\n'))
+      }
+    }
+
+    Api.genericInterface(param).then(res => {
+      if (res.status) {
+        this.loadmaindata()
+      } else {
+        this.setState({
+          loading: false
+        })
+        notification.error({
+          top: 92,
+          message: res.message,
+          duration: 10
+        })
+      }
+    }, () => {
+      this.setState({
+        loading: false
+      })
+    })
+  }
 
   /**
    * @description 瀛愯〃鏁版嵁鍔犺浇
    */
-  async loadmaindata (bid, type) {
-    const { mainSearch } = this.props
+  async loadmaindata () {
+    const { mainSearch, BID } = this.props
     const { setting, arr_field, search, orderBy, pageIndex, pageSize, absFields } = this.state
 
-    let _BID = this.props.BID
     let searches = fromJS(search).toJS()
     if (mainSearch && mainSearch.length > 0) { // 涓昏〃鎼滅储鏉′欢
       searches = [...mainSearch, ...searches]
@@ -365,26 +644,22 @@
       return
     }
 
-    if (type === 'refresh') {
-      if (!bid) { // 涓昏〃ID涓嶅瓨鍦ㄦ椂锛屼笉鏌ヨ瀛愯〃
-        this.setState({
-          data: [],
-          statFValue: [],
-          total: 0
-        })
-        return
-      } else {
-        _BID = bid
-      }
+    if (this.props.Tab.supMenu && !BID) { // 涓昏〃ID涓嶅瓨鍦ㄦ椂锛屼笉鏌ヨ瀛愯〃
+      this.setState({
+        data: [],
+        selectedData: [],
+        statFValue: [],
+        total: 0
+      })
+      return
     }
 
     this.setState({
-      selectedData: [],
       loading: true
     })
 
     let _orderBy = orderBy || setting.order
-    let param = UtilsDM.getQueryDataParams(setting, arr_field, searches, _orderBy, pageIndex, pageSize, _BID, this.props.menuType)
+    let param = UtilsDM.getQueryDataParams(setting, arr_field, searches, _orderBy, pageIndex, pageSize, BID, this.props.menuType)
 
     this.handleTableId()
 
@@ -394,7 +669,7 @@
 
     let result = await Api.genericInterface(param)
 
-    this.getStatFieldsValue(_BID, searches)
+    this.getStatFieldsValue(searches)
 
     if (result.status) {
       this.setState({
@@ -409,7 +684,7 @@
           }
           item.key = index
           item.$$uuid = item[setting.primaryKey] || ''
-          item.$$BID = _BID || ''
+          item.$$BID = BID || ''
 
           return item
         }),
@@ -418,6 +693,7 @@
         loading: false
       })
     } else {
+      let prex = this.props.Tab && this.props.Tab.label ? this.props.Tab.label + '-' : ''
       this.setState({
         loading: false
       })
@@ -504,13 +780,14 @@
   /**
    * @description 鑾峰彇鍚堣瀛楁鍊�
    */
-  getStatFieldsValue = (bid, searches) => {
+  getStatFieldsValue = (searches) => {
+    const { BID } = this.props
     const { setting, orderBy, statFields } = this.state
 
     if (statFields.length === 0 || !(setting.interType === 'system' || (setting.interType === 'custom' && setting.requestMode === 'system')) || !setting.dataresource) return
 
     let _orderBy = orderBy || setting.order
-    let param = UtilsDM.getStatQueryDataParams(setting, statFields, searches, _orderBy, bid, this.props.menuType)
+    let param = UtilsDM.getStatQueryDataParams(setting, statFields, searches, _orderBy, BID, this.props.menuType)
 
     if (param.func === 'sPC_Get_TableData') {
       param.menuname = this.props.Tab.label || ''

--
Gitblit v1.8.0