From 4d6b9f8a2d7b316633e43b489eae9ada949c07b5 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期二, 10 九月 2024 10:18:08 +0800
Subject: [PATCH] Merge branch 'master' into positec

---
 src/tabviews/zshare/actionList/normalbutton/index.jsx |  649 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 612 insertions(+), 37 deletions(-)

diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index 47e76c9..7eb4679 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/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,463 @@
     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,
+      data: [{
+        id: ex.id,
+        exps: exps,
+        menuname: btn.logLabel || '',
+        md5_id: md5_id
+      }]
+    }
+  }
+
   getInnerParam = (data, formdata, retmsg) => {
     const { setting, btn, columns } = this.props
     let _params = []
@@ -743,7 +1191,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 +1210,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 +1236,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 +1266,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 +1520,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 => {
@@ -1173,7 +1629,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 +1652,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 +1690,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 +1708,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 +1919,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 +1984,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 +2136,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 +2417,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 +2582,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) {

--
Gitblit v1.8.0