king
2024-10-07 a26f13ee999e84fc49cc3545e6e5d3daf9c6c41f
src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -307,16 +307,16 @@
      }
    }
    if (window.GLOB.systemType === 'production') {
      let _change = {
        prompt: '提示框',
        exec: '直接执行',
        pop: '弹窗(表单)',
        formSubmit: '表单',
        form: '表单',
      }
      MKEmitter.emit('queryTrigger', {menuId: btn.uuid, name: _change[btn.OpenType]})
    }
    // if (window.GLOB.systemType === 'production') {
    //   let _change = {
    //     prompt: '提示框',
    //     exec: '直接执行',
    //     pop: '弹窗(表单)',
    //     formSubmit: '表单',
    //     form: '表单',
    //   }
    //   MKEmitter.emit('queryTrigger', {menuId: btn.uuid, name: _change[btn.OpenType]})
    // }
  }
  preTrigger = (callback) => {
@@ -458,8 +458,8 @@
      
      let primaryId = ''
      if ((btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') && setting.primaryKey) {
        let ids = data.map(d => { return d[setting.primaryKey] || ''})
      if (btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
        let ids = data.map(d => d.$$uuid)
        ids = ids.filter(Boolean)
        primaryId = ids.join(',')
      }
@@ -492,16 +492,7 @@
        param.LText = Utils.formatOptions(param.LText, param.exec_type)
      } else if (btn.OpenType === 'pop' || btn.OpenType === 'formSubmit' || btn.OpenType === 'form') { // 表单
        if (btn.sqlType === 'insert') { // 系统函数添加时,生成uuid
          primaryId = ''
          if (formdata && setting.primaryKey) { // 表单中存在主键字段,主键值以表单中的值为准
            let _form = formdata.filter(_form => _form.key === setting.primaryKey)[0]
            if (_form) {
              primaryId = _form.value
            }
          }
          param.ID = primaryId || Utils.getguid()
          param.ID = Utils.getguid()
          if (retmsg) {
            const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, retmsg) // 数据源
@@ -717,6 +708,464 @@
    return _params
  }
  getBackSystemParam = (data, formdata) => {
    const { btn } = this.props
    let ex = window.GLOB.CacheData.get('sql_' + btn.uuid)
    let _params = []
    if (btn.Ot === 'notRequired' || btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
      let primaryId = ''
      let cell = null
      if (btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
        primaryId = data.map(d => d.$$uuid).filter(Boolean).join(',')
        cell = data[0]
      }
      if (btn.OpenType === 'pop' || btn.OpenType === 'formSubmit' || btn.OpenType === 'form') { // 表单
        if (btn.sqlType === 'insert') { // 系统函数添加时,生成uuid
          primaryId = Utils.getguid()
        }
      }
      let exp = this.getExps(ex, formdata, cell, primaryId, btn.$process)
      if (ex.reps.includes('mk_check_begin')) {
        exp.$unCheckParam = fromJS(exp).toJS()
        exp.data[0].exps.push({
          key: 'mk_check_begin',
          value: ''
        }, {
          key: 'mk_check_end',
          value: ''
        })
        exp.$unCheckParam.data[0].exps.push({
          key: 'mk_check_begin',
          value: 'Y'
        }, {
          key: 'mk_check_end',
          value: 'Y'
        })
      } else if (btn.procMode === 'system' && btn.callbackType === 'script') {
        let _backex = window.GLOB.CacheData.get('sql_back_' + btn.uuid)
        exp.$backParam = this.getExps(_backex, formdata, cell, primaryId)
      }
      _params.push(exp)
    } else if (btn.Ot === 'required') {
      _params = data.map((cell, index) => {
        let primaryId = cell.$$uuid || ''
        if (btn.OpenType === 'pop') { // 表单
          if (index !== 0) {
            let _cell = {}
            Object.keys(cell).forEach(key => {
              _cell[key.toLowerCase()] = cell[key]
            })
            formdata = formdata.map(_data => {
              if (_data.readin && _cell.hasOwnProperty(_data.key.toLowerCase())) {
                _data.value = _cell[_data.key.toLowerCase()]
              }
              return _data
            })
          }
          if (btn.sqlType === 'insert') { // 系统函数添加时,生成uuid
            primaryId = Utils.getguid()
          }
        }
        let exp = this.getExps(ex, formdata, cell, primaryId, btn.$process)
        if (ex.reps.includes('mk_check_begin')) {
          exp.$unCheckParam = fromJS(exp).toJS()
          exp.data[0].exps.push({
            key: 'mk_check_begin',
            value: ''
          }, {
            key: 'mk_check_end',
            value: ''
          })
          exp.$unCheckParam.data[0].exps.push({
            key: 'mk_check_begin',
            value: 'Y'
          }, {
            key: 'mk_check_end',
            value: 'Y'
          })
        } else if (btn.procMode === 'system' && btn.callbackType === 'script') {
          let _backex = window.GLOB.CacheData.get('sql_back_' + btn.uuid)
          exp.$backParam = this.getExps(_backex, formdata, cell, primaryId)
        }
        return exp
      })
    }
    return _params
  }
  getExps = (ex, formdata, cell, id, process) => {
    const { columns, BID, btn } = this.props
    let exps = []
    let values = {
      time_id: Utils.getguid(),
      roleid: sessionStorage.getItem('role_id') || '',
      mk_departmentcode: sessionStorage.getItem('departmentcode') || '',
      mk_organization: sessionStorage.getItem('organization') || '',
      mk_user_type: sessionStorage.getItem('mk_user_type') || '',
      mk_nation: sessionStorage.getItem('nation') || '',
      mk_province: sessionStorage.getItem('province') || '',
      mk_city: sessionStorage.getItem('city') || '',
      mk_district: sessionStorage.getItem('district') || '',
      mk_address: sessionStorage.getItem('address') || '',
      id: id || '',
      bid: BID || '',
      typename: 'admin',
      datam: sessionStorage.getItem('dataM') === 'true' ? 'Y' : '',
      datam_begin: sessionStorage.getItem('dataM') === 'true' ? 'Y' : '',
      datam_end: sessionStorage.getItem('dataM') === 'true' ? 'Y' : '',
      // mk_check_begin: '',
      // mk_check_end: ''
    }
    if (window.GLOB.externalDatabase !== null) {
      values.db = window.GLOB.externalDatabase
    }
    let formkeys = []
    formdata && formdata.forEach(form => {
      // if (!ex.reps.includes(form.key)) return
      formkeys.push(form.key)
      let val = form.value
      if (form.type === 'number' || form.type === 'rate') {
        if (isNaN(val)) {
          val = 0
        }
      } else if (['date', 'datemonth'].includes(form.type)) {
        val = val || '1949-10-01'
      }
      exps.push({
        key: 'mk_' + form.key + '_mk',
        value: val
      })
    })
    if (cell && columns && columns.length > 0) {
      let datavars = {}
      Object.keys(cell).forEach(key => {
        datavars[key.toLowerCase()] = cell[key]
      })
      columns.forEach(col => {
        if (!ex.reps.includes(col.field) || formkeys.includes(col.field)) return
        if (!col.datatype) return
        let _key = col.field.toLowerCase()
        let _val = datavars.hasOwnProperty(_key) ? datavars[_key] : ''
        if (/^date/ig.test(col.datatype) && !_val) {
          _val = '1949-10-01'
        }
        exps.push({
          key: 'mk_' + col.field + '_mk',
          value: _val
        })
      })
    }
    ex.reps.forEach(n => {
      let key = n.toLowerCase()
      if (values.hasOwnProperty(key)) {
        exps.push({
          key: n,
          value: values[key]
        })
      }
    })
    if (process && btn.verify.workFlow === 'true') {
      let flow = window.GLOB.UserCacheMap.get(btn.$flowId)
      let node = null
      let line = null
      let target = null
      let status = 0
      let statusName = ''
      let detailId = ''
      let sign = ''
      let error = ''
      let userid = sessionStorage.getItem('UserID') || ''
      let checkIds = []
      let checkUsers = []
      let noticeIds = []
      let work_grade = sessionStorage.getItem('work_grade') || 0
      let departmentcode = sessionStorage.getItem('departmentcode') || ''
      let _data = cell || {}
      let msg = ''
      if (btn.verify.flowType === 'start') {
        target = flow ? flow.cells.filter(cell => cell.mknode === 'start')[0] : ''
        if (target) {
          detailId = target.id
          status = target.mkdata.status
          statusName = target.mkdata.statusName
        } else {
          error = '工作流无开始节点'
        }
      } else if (_data.works_flow_param) {
        try {
          node = JSON.parse(window.decodeURIComponent(window.atob(_data.works_flow_param)))
        } catch (e) {
          node = null
        }
        if (node) {
          let lines = flow ? flow.cells.filter(cell => cell.shape === 'edge' && cell.source.cell === node.id) : []
          if (btn.verify.flowType === 'reject') {
            line = lines.filter(cell => cell.mkdata.flowType === 'reject' || cell.mknode === 'startEdge')[0]
          } else {
            lines = lines.filter(cell => cell.mkdata.flowType !== 'reject' && cell.mknode !== 'startEdge')
            if (lines.length === 0) {
              error = '无可执行的流程分支'
            } else {
              let branchKey = btn.verify.flowBranch ? btn.verify.flowBranch.toLowerCase() : ''
              formdata && formdata.forEach(form => {
                let _key = form.key.toLowerCase()
                _data[_key] = form.value
              })
              if (!branchKey) {
                lines.forEach(line => {
                  if (line.mkdata.execCondition === 'open') {
                    error = '按钮未设置流程控制字段。'
                  }
                })
                if (!error) {
                  lines = lines.filter(cell => {
                    if (cell.mkdata.seniorCondition === 'open' && !line) {
                      cell.mkdata.seniorbers && cell.mkdata.seniorbers.forEach(per => {
                        if (per.worker_id === userid) {
                          line = cell
                        }
                      })
                      return false
                    }
                    return true
                  })
                  if (!line) {
                    line = lines[0]
                  }
                }
              } else if (!_data.hasOwnProperty(branchKey)) {
                error = '信息中无流程控制字段。'
              } else {
                let _def_lines = []
                let _equ_lines = []
                let _unequ_lines = []
                let _or_lines = []
                let branchVal = _data[branchKey]
                if (branchVal && typeof(branchVal) === 'string' && !isNaN(branchVal)) {
                  branchVal = +branchVal
                }
                lines.forEach(item => {
                  if (item.mkdata.execCondition !== 'open') {
                    _def_lines.push(item)
                  } else {
                    if (item.mkdata.match === '=') {
                      if (item.mkdata.matchVal === branchVal + '') {
                        _equ_lines.push(item)
                      }
                    } else if (item.mkdata.match === '!=') {
                      if (item.mkdata.matchVal !== branchVal + '') {
                        _unequ_lines.push(item)
                      }
                    } else {
                      if (item.mkdata.match === '<') {
                        if (item.mkdata.matchVal < branchVal) {
                          _or_lines.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
                        }
                      } else if (item.mkdata.match === '>') {
                        if (item.mkdata.matchVal > branchVal) {
                          _or_lines.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
                        }
                      } else if (item.mkdata.match === '<=') {
                        if (item.mkdata.matchVal <= branchVal) {
                          _or_lines.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
                        }
                      } else if (item.mkdata.match === '>=') {
                        if (item.mkdata.matchVal >= branchVal) {
                          _or_lines.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
                        }
                      }
                    }
                  }
                })
                _or_lines.sort((a, b) => a.dist - b.dist)
                let _lines = [..._equ_lines, ..._or_lines, ..._unequ_lines, ..._def_lines]
                _lines = _lines.filter(cell => {
                  if (cell.mkdata.seniorCondition === 'open' && !line) {
                    cell.mkdata.seniorbers && cell.mkdata.seniorbers.forEach(per => {
                      if (per.worker_id === userid) {
                        line = cell
                      }
                    })
                    return false
                  }
                  return true
                })
                if (!line) {
                  line = _lines[0]
                }
              }
            }
          }
        } else {
          error = '行信息中工作流参数无法解析'
        }
        if (line) {
          detailId = line.id
          status = line.mkdata.status
          statusName = line.mkdata.statusName
          sign = line.mkdata.seniorSign || ''
          target = flow.cells.filter(cell => cell.id === line.target.cell)[0]
          line.mkdata.members && line.mkdata.members.forEach(item => {
            if (line.mkdata.approver === 'departmentManager') {
              if (item.job_type === 'manage' && departmentcode === item.parentIds[1]) {
                checkIds.push(item.worker_id)
                checkUsers.push(item)
              }
            } else if (line.mkdata.approver === 'directManager') {
              if (departmentcode === item.parentIds[1] && item.work_grade > work_grade) {
                checkIds.push(item.worker_id)
                checkUsers.push(item)
              }
            } else {
              checkIds.push(item.worker_id)
              checkUsers.push(item)
            }
          })
          line.mkdata.copys && line.mkdata.copys.forEach(item => {
            noticeIds.push(item.worker_id)
          })
          if (!target) {
            error = '未查询到工作流目标节点'
          } else if (checkIds.length === 0 && !['startEdge', 'endEdge', 'throughEdge'].includes(line.mknode)) {
            error = '未获取到下一步审批人'
          } else if (line.approvalMethod === 'countersign' && (!node.checkIds || !node.checkIds.includes(userid))) {
            error = '当前用户不在审批人列表中'
          }
        } else if (!error) {
          error = '工作流中无对应流程'
        }
      } else {
        error = '行信息中无工作流参数'
      }
      if (error) {
        status = 0
        statusName = '异常'
      } else if (target) {
        let label = target.attrs && target.attrs.text && target.attrs.text.text ? target.attrs.text.text : ''
        msg = {...target.mkdata, label: label, id: target.id, checkIds: [], checkUsers: []}
        msg = window.btoa(window.encodeURIComponent(JSON.stringify(msg)))
      }
      if (btn.verify.flowType === 'start') {
        exps.push(
          { key: 'works_flow_error', value: error },
          { key: 'works_flow_code', value: flow ? flow.flow_code : '' },
          { key: 'works_flow_name', value: flow ? flow.flow_name : '' },
          { key: 'works_flow_param', value: msg },
          { key: 'works_flow_detail_id', value: detailId },
          { key: 'status', value: status },
          { key: 'statusname', value: statusName },
          { key: 'work_group', value: sessionStorage.getItem('work_group') || '' },
          { key: 'work_grade', value: sessionStorage.getItem('work_grade') || 0 },
          // { key: 'start_type', value: '开始' },
        )
      } else {
        let works_flow_countersign = ''
        let works_flow_sign_values = ''
        let works_flow_sign_field = ''
        let works_flow_sign_label = ''
        let works_begin_branch = ''
        if (line.approvalMethod === 'countersign' && node.checkIds.length > 1) {
          works_flow_countersign = 'Y'
          let mark = line.mark || '已审核'
          let fields = ['statuscharone', 'statuschartwo', 'statuscharthree', 'statuscharfour', 'statuscharfive']
          node.checkUsers.forEach((user, index) => {
            if (user.worker_id === userid) {
              works_flow_sign_field = fields[index]
              works_flow_sign_label = `${user.parentNames[2] || ''}${user.workername || ''}${mark}`
            } else {
              works_flow_sign_values += `${user.parentNames[2] || ''}${user.workername || ''}${mark}`
            }
          })
        } else {
          works_begin_branch = line.mknode === 'startEdge' ? 'Y' : ''
        }
        exps.push(
          { key: 'works_flow_error', value: error },
          { key: 'works_flow_countersign', value: works_flow_countersign },
          { key: 'works_flow_sign_values', value: works_flow_sign_values },
          { key: 'works_begin_branch', value: works_begin_branch },
          { key: 'works_flow_sign_field', value: works_flow_sign_field },
          { key: 'works_flow_sign_label', value: works_flow_sign_label },
          { key: 'works_flow_code', value: flow ? flow.flow_code : '' },
          { key: 'works_flow_name', value: flow ? flow.flow_name : '' },
          { key: 'works_flow_param', value: msg },
          { key: 'works_flow_detail_id', value: detailId },
          { key: 'status', value: status },
          { key: 'statusname', value: statusName },
          { key: 'work_group', value: sessionStorage.getItem('work_group') || '' },
          { key: 'work_grade', value: sessionStorage.getItem('work_grade') || 0 },
          // { key: 'check_type', value: btn.verify.flowType === 'reject' ? '驳回' : '审核' },
          // { key: 'notice_type', value: '抄送' },
          { key: 'check_userids', value: checkIds.join(',') },
          { key: 'notice_userids', value: noticeIds.join(',') },
          { key: 'works_flow_sign', value: sign },
        )
      }
    }
    let md5_id = ''
    if (window.GLOB.probation) {
      md5_id = md5(ex.id + JSON.stringify(exps) + Math.floor(new Date().getTime() / 600000))
      md5_id = moment().format('YYYYMMDDHHmmss') + md5_id.slice(-18)
    }
    return {
      $backend: true,
      $type: 's_TableData_InUpDe',
      data: [{
        id: ex.id,
        menuname: btn.logLabel || '',
        exps: exps,
        md5_id: md5_id
      }]
    }
  }
  getInnerParam = (data, formdata, retmsg) => {
    const { setting, btn, columns } = this.props
    let _params = []
@@ -743,7 +1192,7 @@
      let primaryId = ''
      if ((btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') && setting.primaryKey) {
        let ids = data.map(d => { return d[setting.primaryKey] || ''})
        let ids = data.map(d => d.$$uuid)
        ids = ids.filter(Boolean)
        primaryId = ids.join(',')
@@ -762,7 +1211,10 @@
        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
      }
      if (retmsg) {
      if (btn.callbackType === 'script' && window.backend && window.GLOB.CacheData.has('sql_back_' + btn.uuid)) {
        let _backex = window.GLOB.CacheData.get('sql_back_' + btn.uuid)
        param.$backParam = this.getExps(_backex, formdata, data[0], primaryId)
      } else if (retmsg) {
        param.$callbacksql = this.getSysDeclareSql(btn, formdata, data[0], columns, this.props.BID)
      }
@@ -785,7 +1237,7 @@
          param.dataM = sessionStorage.getItem('dataM') === 'true' ? 'Y' : ''
        }
        let primaryId = setting.primaryKey ? cell[setting.primaryKey] || '' : ''
        let primaryId = cell.$$uuid || ''
        if (btn.OpenType === 'pop') { // 表单
          if (index !== 0) {
@@ -815,7 +1267,10 @@
          param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
        }
        if (retmsg) {
        if (btn.callbackType === 'script' && window.backend && window.GLOB.CacheData.has('sql_back_' + btn.uuid)) {
          let _backex = window.GLOB.CacheData.get('sql_back_' + btn.uuid)
          param.$backParam = this.getExps(_backex, formdata, cell, primaryId)
        } else if (retmsg) {
          param.$callbacksql = this.getSysDeclareSql(btn, formdata, cell, columns, this.props.BID)
        }
@@ -1066,7 +1521,9 @@
    if (btn.intertype === 'system' || btn.intertype === 'inner') { // 系统接口
      let params = []
      if (btn.intertype === 'system') {
      if (btn.intertype === 'system' && window.backend && window.GLOB.CacheData.has('sql_' + btn.uuid)) {
        params = this.getBackSystemParam(data, formdata)
      } else if (btn.intertype === 'system') {
        params = this.getSystemParam(data, formdata)
        if (btn.returnValue === 'true') {
          params = params.map(item => {
@@ -1126,6 +1583,14 @@
          _resolve()
        })
      } else if (params.length <= 20 && btn.execType !== 'single') {
        if (window.backend && params[0].$backend && (!btn.verify || (btn.verify.printEnable !== 'true' && !btn.output))) {
          params = [{
            $backend: true,
            $type: 's_TableData_InUpDe',
            data: params.map(item => item.data[0])
          }]
        }
        let deffers = params.map((param, i) => {
          return new Promise(resolve => {
            setTimeout(() => {
@@ -1173,7 +1638,9 @@
      /** *********************调用外部接口************************* */
      let _params = [] // 请求参数数组
      if (btn.procMode === 'system') {
      if (btn.procMode === 'system' && window.backend && window.GLOB.CacheData.has('sql_' + btn.uuid)) {
        _params = this.getBackSystemParam(data, formdata)
      } else if (btn.procMode === 'system') {
        _params = this.getSystemParam(data, formdata, true)
        _params = _params.map(item => {
          item.script_type = 'Y'
@@ -1194,7 +1661,9 @@
    } else if (btn.intertype === 'custom') { // 系统接口
      let params = []
      if (btn.procMode === 'system') {
      if (btn.procMode === 'system' && window.backend && window.GLOB.CacheData.has('sql_' + btn.uuid)) {
        params = this.getBackSystemParam(data, formdata)
      } else if (btn.procMode === 'system') {
        params = this.getSystemParam(data, formdata, true)
        params = params.map(item => {
          item.script_type = 'Y'
@@ -1230,13 +1699,15 @@
      BID: param.BID || '',
      ID: param.ID || '',
      callbacksql: param.$callbacksql || '',
      mk_api_key: ''
      mk_api_key: '',
      backParam: param.$backParam || ''
    }
    if (!record.ID && btn.Ot !== 'notRequired' && param[setting.primaryKey]) {
      record.ID = param[setting.primaryKey]
    }
    delete param.$backParam
    delete param.$callbacksql
    if (param.$pice) {
@@ -1246,7 +1717,7 @@
      this.customOuterRequest(params, param, record, _resolve)
      return
    } else if (!param.func) {
    } else if (!param.func && !param.$backend) {
      this.customOuterRequest(params, param, record, _resolve)
      return
    }
@@ -1457,6 +1928,8 @@
        _resolve()
      }
      return
    } else if (btn.callbackType === 'script' && record.backParam) {
      param = this.getCallBackendParam(result, record)
    } else if (btn.callbackType === 'script' || btn.callbackType === 'default') {
      param = this.getCallBackSql(result, record)
    } else if (btn.callbackType === 'func') {
@@ -1520,6 +1993,108 @@
    })
  }
  getCallBackendParam = (result, record) => {
    const { btn } = this.props
    let lines = []
    let tables = []
    let param = fromJS(record.backParam).toJS()
    btn.verify.cbScripts.forEach(script => {
      if (script.status === 'false') return
      if (/\s#[a-z0-9_]+(\s|\()/ig.test(script.sql)) {
        tables.push(...script.sql.match(/\s#[a-z0-9_]+(\s|\()/ig))
      }
    })
    tables = tables.map(tb => tb.replace(/\s|\(/g, ''))
    if (result.$ErrCode) {
      delete result.$ErrCode
      delete result.$ErrMesg
    }
    let getDefaultSql = (obj, tb, bid, level) => {
      let vals = {}
      let subObjs = []
      let id = Utils.getuuid()
      delete obj.$$key
      Object.keys(obj).forEach(key => {
        let val = obj[key]
        if (val === null || val === undefined) return
        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) return
              Object.keys(item).forEach(k => {
                if (item[k] === null) {
                  item[k] = ''
                }
              })
              item.$$key = tb + '_' + key
              subObjs.push(item)
            })
          } else if (Object.keys(val).length > 0) {
            val.$$key = tb + '_' + key
            subObjs.push(val)
          }
        } else {
          if (typeof(val) === 'string') {
            val = val.replace(/'/ig, '"')
          } else {
            val = val + ''
          }
          vals[key] = val
        }
      })
      vals.mk_level = level
      vals.mk_id = id
      vals.mk_bid = bid
      let isnew = true
      lines.forEach(line => {
        if (line.tb === tb) {
          line.values.push(vals)
          isnew = false
        }
      })
      if (isnew) {
        lines.push({
          tb: tb,
          type: tables.includes('#' + tb) ? '01' : '02',
          values: [vals]
        })
      }
      subObjs.forEach(item => {
        getDefaultSql(item, item.$$key, id, level + 1)
      })
    }
    getDefaultSql(result, btn.cbTable, '', 1)
    param.data[0].exps.push({
      key: 'mk_outer_params',  // 回调脚本的数据替换
      value: lines
    })
    let md5_id = ''
    if (window.GLOB.probation) {
      md5_id = md5('back_' + btn.uuid + JSON.stringify(param.data[0].exps) + Math.floor(new Date().getTime() / 600000))
      md5_id = moment().format('YYYYMMDDHHmmss') + md5_id.slice(-18)
    }
    param.data[0].md5_id = md5_id
    param.data[0].menuname = btn.logLabel + '(回调)'
    return param
  }
  getCallBackSql = (result, record) => {
    const { btn } = this.props
    let lines = []
@@ -1570,10 +2145,15 @@
          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)
              }
              if (Object.keys(item).length === 0) return
              Object.keys(item).forEach(k => {
                if (item[k] === null) {
                  item[k] = ''
                }
              })
              item.$$key = tb + '_' + key
              subObjs.push(item)
            })
          } else if (Object.keys(val).length > 0) {
            val.$$key = tb + '_' + key
@@ -1846,16 +2426,18 @@
    let record = {
      BID: param.BID || '',
      ID: param.ID || '',
      callbacksql: param.$callbacksql || ''
      callbacksql: param.$callbacksql || '',
      backParam: param.$backParam || ''
    }
    if (!record.ID && btn.Ot !== 'notRequired' && param[setting.primaryKey]) {
      record.ID = param[setting.primaryKey]
    }
    delete param.$backParam
    delete param.$callbacksql
    if (!param.func) {
    if (!param.func && !param.$backend) {
      this.outerOuterRequest(params, param, record, _resolve)
      return
    }
@@ -2009,6 +2591,8 @@
        _resolve()
      }
      return
    } else if (btn.callbackType === 'script' && record.backParam) {
      param = this.getCallBackendParam(result, record)
    } else if (btn.callbackType === 'script' || btn.callbackType === 'default') {
      param = this.getCallBackSql(result, record)
    } else if (btn.callbackType === 'func' || btn.callbackFunc) {
@@ -2134,6 +2718,7 @@
              _resolve()
            } else {
              if (params.length === 0) {
                this.clearBackCache()
                this.execSuccess(res)
                _resolve()
              } else {
@@ -2155,6 +2740,7 @@
              _resolve()
            } else {
              if (params.length === 0) {
                this.clearBackCache()
                this.execSuccess(res)
                _resolve()
              } else {
@@ -2171,6 +2757,7 @@
          _resolve()
        } else {
          if (params.length === 0) {
            this.clearBackCache()
            this.execSuccess(re)
            _resolve()
          } else {
@@ -2179,6 +2766,34 @@
        }
      })
    }
  }
  clearBackCache = () => {
    if (!window.GLOB.backend) return
    Api.cacheInterface({userid: sessionStorage.getItem('UserID') || '', LoginUID: sessionStorage.getItem('LoginUID') || ''}).then(res => {
      if (!res.status) {
        notification.warning({
          top: 92,
          message: res.message || '缓存清空失败!',
          duration: 5
        })
      } else if (window.GLOB.localSystemApi) {
        Api.cacheInterface({
          userid: sessionStorage.getItem('LocalUserID') || sessionStorage.getItem('UserID') || '',
          LoginUID: sessionStorage.getItem('LocalLoginUID') || sessionStorage.getItem('LoginUID') || '',
          rduri: window.GLOB.localSystemApi.replace('dostars', 'excache')
        }).then(result => {
          if (!result.status) {
            notification.warning({
              top: 92,
              message: result.message || '缓存清空失败!',
              duration: 5
            })
          }
        })
      }
    })
  }
  /**
@@ -2253,9 +2868,9 @@
        res.ErrCode = '-1'
      }
    }
    if (/@close_tab@|@close_popup@|@goback@|@no_target_menu@/i.test(res.message)) {
      sign = res.message.match(/@close_tab@|@close_popup@|@goback@|@no_target_menu@/i)[0].toLowerCase()
      res.message = res.message.replace(/@close_tab@|@close_popup@|@goback@|@no_target_menu@/i, '')
    if (/@close_tab@|@close_popup@|@goback@|@no_target_menu@|@open_target_menu@/i.test(res.message)) {
      sign = res.message.match(/@close_tab@|@close_popup@|@goback@|@no_target_menu@|@open_target_menu@/i)[0].toLowerCase()
      res.message = res.message.replace(/@close_tab@|@close_popup@|@goback@|@no_target_menu@|@open_target_menu@/i, '')
    }
    let id = ''
@@ -2990,9 +3605,9 @@
      if (!res.message) {
        res.ErrCode = '-1'
      }
    } else if (/@close_tab@|@close_popup@|@goback@/i.test(res.message)) {
      sign = res.message.match(/@close_tab@|@close_popup@|@goback@/i)[0].toLowerCase()
      res.message = res.message.replace(/@close_tab@|@close_popup@|@goback@/i, '')
    } else if (/@close_tab@|@close_popup@|@goback@|@open_target_menu@/i.test(res.message)) {
      sign = res.message.match(/@close_tab@|@close_popup@|@goback@|@open_target_menu@/i)[0].toLowerCase()
      res.message = res.message.replace(/@close_tab@|@close_popup@|@goback@|@open_target_menu@/i, '')
    }
    if (res.ErrCode === 'E') {
@@ -3123,6 +3738,35 @@
      MKEmitter.emit('refreshDebugTable')
    }
    if (sign === '@open_target_menu@' && btn.openmenu && Array.isArray(btn.openmenu) && btn.openmenu.length > 0) {
      let id = ''
      if (this.state.selines && this.state.selines.length > 0 && btn.Ot !== 'notRequired') {
        if (btn.Ot === 'requiredOnce') {
          id = this.state.selines.map(d => d.$$uuid).filter(Boolean).join(',')
        } else {
          id = this.state.selines[0].$$uuid
        }
      }
      let menuId = btn.openmenu.slice(-1)[0]
      let menu = null
      if (window.GLOB.mkThdMenus.has(menuId)) {
        menu = {...window.GLOB.mkThdMenus.get(menuId), param: { $BID: id || '' }}
      } else if (btn.MenuID) {
        menu = {
          MenuID: btn.MenuID,
          MenuName: btn.MenuName,
          type: btn.tabType,
          param: { $BID: id || '' }
        }
      }
      if (menu) {
        MKEmitter.emit('modifyTabs', menu, true)
      }
    }
    if (btn.execError === 'popclose' && btn.$tabId) { // 标签关闭刷新
      MKEmitter.emit('refreshPopButton', btn.$tabId)
    }