king
2023-08-10 ac1d52c46ff9019fcc93cf3d5e7ab17cf850824e
src/utils/utils.js
@@ -59,17 +59,22 @@
  }
  /**
   * @description 数据源名称,用于统一查询
   * @return {String}  name
   * @description 获取图表高度
   */
  static getdataName () {
    let name = []
    let _options = 'abcdefghigklmnopqrstuvwxyz'
    for (let i = 0; i < 6; i++) {
      name.push(_options.substr(Math.floor(Math.random() * 26), 1))
  static getHeight (val) {
    if (typeof(val) === 'string') {
      if (val.indexOf('px') > -1) {
        val = parseFloat(val)
      } else if (val.indexOf('vw') > -1) {
        val = parseFloat(val)
        val = document.body.clientWidth * val / 100
      } else if (val.indexOf('vh') > -1) {
        val = parseFloat(val)
        val = document.body.clientHeight * val / 100
      }
    }
    name.splice(3, 0, new Date().getTime())
    return name.join('')
    return parseInt(val || 400) - 30
  }
  /**
@@ -137,19 +142,19 @@
  static verifySql (sql, type) {
    if (!sql) return ''
    let chars = [
      {key: 'create', reg: /(^|\s)create\s/ig},
      {key: 'insert', reg: /(^|\s)insert\s/ig},
      {key: 'delete', reg: /(^|\s)delete\s/ig},
      {key: 'update', reg: /(^|\s)update\s/ig},
      {key: 'set', reg: /(^|\s)set\s/ig},
      {key: 'drop', reg: /(^|\s)drop\s/ig},
      {key: 'alter', reg: /(^|\s)alter\s/ig},
      {key: 'truncate', reg: /(^|\s)truncate\s/ig},
      {key: 'if', reg: /(^|\s)if\s/ig},
      {key: 'exec', reg: /(^|\s)exec(\s|\()/ig},
      {key: 'OBJECT', reg: /(^|\s)object(\s|\()/ig},
      {key: 'sys.', reg: /(^|\s)sys\./ig},
      {key: 'kill', reg: /(^|\s)kill\s/ig}
      {key: 'create', reg: /(^|\s|\(|\))create\s/ig},
      {key: 'insert', reg: /(^|\s|\(|\))insert\s/ig},
      {key: 'delete', reg: /(^|\s|\(|\))delete\s/ig},
      {key: 'update', reg: /(^|\s|\(|\))update\s/ig},
      {key: 'set', reg: /(^|\s|\(|\))set\s/ig},
      {key: 'drop', reg: /(^|\s|\(|\))drop\s/ig},
      {key: 'alter', reg: /(^|\s|\(|\))alter\s/ig},
      {key: 'truncate', reg: /(^|\s|\(|\))truncate\s/ig},
      {key: 'if', reg: /(^|\s|\(|\))if\s/ig},
      {key: 'exec', reg: /(^|\s|\(|\))exec(\s|\()/ig},
      {key: 'OBJECT', reg: /(^|\s|\(|\))object(\s|\()/ig},
      {key: 'sys.', reg: /(^|\s|\(|\))sys\./ig},
      {key: 'kill', reg: /(^|\s|\(|\))kill\s/ig}
    ]
    
    if (type === 'customscript') {
@@ -158,7 +163,7 @@
    let error = ''
    
    sql = sql.replace(/sys\.fn_sqlvarbasetostr\(HashBytes\('MD5'/ig, '') // 跳过MD5加密
    sql = sql.replace(/sys\.fn_/ig, '') // 跳过sys.fn_验证
    chars.forEach(char => {
      if (!error && char.reg.test(sql)) {
@@ -200,6 +205,29 @@
    return value
  }
  // /**
  //  * @description sql解密
  //  * @return {String}   value
  //  */
  // static unFormatOptions (value) {
  //   if (!value) return ''
  //   value = window.atob(value)
  //   value = value.replace('minKe', '')
  //   value = window.decodeURIComponent(window.atob(value))
  //   value = value.replace(/ mpercent /ig, '%')
  //   // 替换关键字
  //   formatKeys.forEach(item => {
  //     let reg = new RegExp('(\\s)?' + item.value.replace(/\s/g, '') + '(\\s)?', 'ig')
  //     value = value.replace(reg, ' ' + item.key + ' ')
  //   })
  //   value = value.replace(/ \n /ig, '\n')
  //   return value
  // }
  /**
   * @description sPC_TableData_InUpDe sql加密
@@ -258,12 +286,17 @@
   * @description 初始化搜索条件初始值
   * @param {Array}   searches     搜索条件
   */
  static initSearchVal (searches) {
    if (!searches) return []
  static initSearchVal (config) {
    if (!config.search) {
      config.search = []
      return
    }
    let roleId = sessionStorage.getItem('role_id') || ''
    let required = false
    let keys = []
    return searches.map(item => {
    config.search = config.search.map(item => {
      item.hidden = item.Hide === 'true'
      item.required = !item.hidden && item.required === 'true'
      item.advanced = item.advanced === 'true'
@@ -302,6 +335,8 @@
          item.initval = [moment().startOf('week').format(format), moment().endOf('week').format(format)].join(',')
        } else if (item.initval === 'month') {
          item.initval = [moment().startOf('month').format(format), moment().endOf('month').format(format)].join(',')
        } else if (item.initval === 'lastMonth') {
          item.initval = [moment().subtract(1, 'months').startOf('month').format(format), moment().subtract(1, 'months').endOf('month').format(format)].join(',')
        } else if (item.initval) {
          try {
            let _initval = JSON.parse(item.initval)
@@ -379,8 +414,28 @@
        }
      }
      if (item.required) {
        required = true
      }
      if (item.type === 'text' || item.type === 'select') {
        if (/,/.test(item.field)) {
          item.field.split(',').forEach(field => {
            keys.push(field.toLowerCase())
          })
        } else {
          keys.push(item.field.toLowerCase())
        }
      } else if (item.type === 'group') {
        keys.push(item.field.toLowerCase())
        keys.push(item.datefield.toLowerCase())
      }
      return item
    })
    config.$s_keys = keys
    config.$s_req = required
  }
  /**
@@ -764,6 +819,10 @@
      arrfield.push(item.cardValField)
      if (item.urlField) {
        arrfield.push(item.urlField)
      } else if (item.colorField) {
        arrfield.push(item.colorField)
      } else if (item.parentField) {
        arrfield.push(item.parentField)
      }
    }
@@ -771,6 +830,8 @@
      arrfield.push(item.linkField)
    }
    if (['select', 'radio', 'link', 'checkcard'].includes(item.type) && item.linkSubField && item.linkSubField.length > 0) {
      arrfield.push(...item.linkSubField)
    } else if (item.type === 'text' && item.editType === 'select' && item.linkSubField && item.linkSubField.length > 0) { // 可编辑表
      arrfield.push(...item.linkSubField)
    }
    if (item.disableField) {
@@ -789,18 +850,15 @@
    arrfield = arrfield.join(',')
    if (item.orderBy) {
      // sql = `select ${item.type === 'checkcard' ? 'top 20' : ''} ${arrfield} from (select distinct ${arrfield},${item.orderBy} as orderfield from ${_datasource} ) a order by orderfield ${item.orderType}`
      sql = `select distinct ${arrfield},${item.orderBy} as orderfield from ${_datasource} order by orderfield ${item.orderType}`
    } else {
      // sql = `select ${item.type === 'checkcard' ? 'top 20' : ''} ${arrfield} from (select distinct ${arrfield} from ${_datasource}) a`
      sql = `select distinct ${arrfield} from ${_datasource}`
    }
    if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
      sql = sql.replace(/\$@/ig, '/*')
      sql = sql.replace(/@\$/ig, '*/')
      sql = sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
    } else {
      sql = sql.replace(/@\$|\$@/ig, '')
      sql = sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
    }
    // 外联数据库替换
@@ -810,10 +868,6 @@
    sql = sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
    sql = sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
    if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
      console.info(sql)
    }
    return {
      sql: sql,
@@ -826,10 +880,9 @@
 * @description 获取excel导入参数
 * @return {Object} item   按钮信息
 * @return {Array}  data   excel数据
 * @return {Object} dict   字典项
 * @return {String} BID    上级Id
 */
export function getExcelInSql (item, data, dict, BID) {
export function getExcelInSql (item, data, BID, primaryId) {
  let btn = item.verify
  let keys = ['delete', 'drop', 'insert', 'truncate', 'update']
  let userName = sessionStorage.getItem('User_Name') || ''
@@ -844,11 +897,6 @@
  let district = sessionStorage.getItem('district') || ''
  let address = sessionStorage.getItem('address') || ''
  let _sheet = item.sheet
  if (sessionStorage.getItem('isEditState') === 'true') {
    userName = sessionStorage.getItem('CloudUserName') || ''
    fullName = sessionStorage.getItem('CloudFullName') || ''
  }
  if (window.GLOB.externalDatabase !== null) {
    _sheet = _sheet.replace(/@db@/ig, window.GLOB.externalDatabase)
@@ -882,20 +930,30 @@
    btn.scripts.forEach(script => {
      if (script.status === 'false') return
      let _sql = script.sql
      _sql = _sql.replace(/@ID@/ig, `'${primaryId || ''}'`)
      _sql = _sql.replace(/@BID@/ig, `'${BID}'`)
      _sql = _sql.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
      _sql = _sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
      _sql = _sql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
      _sql = _sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
      _sql = _sql.replace(/@typename@/ig, `'admin'`)
      if (script.position === 'init') {
        _initCustomScript += `
      /* 自定义脚本 */
      ${script.sql}
      ${_sql}
      `
      } else if (script.position === 'front') {
        _prevCustomScript += `
      /* 自定义脚本 */
      ${script.sql}
      ${_sql}
      `
      } else {
        _backCustomScript += `
      /* 自定义脚本 */
      ${script.sql}
      ${_sql}
      `
      }
    })
@@ -916,64 +974,43 @@
      let val = item[col.Column] !== undefined ? item[col.Column] : ''
      let _colindex = cols[cindex] || (cindex + 1)
      let _position = (_topline + lindex + 1) + dict['main.excel.line'] + ' ' + _colindex + dict['main.excel.column']  + ' '
      let _position = (_topline + lindex + 1) + '行 ' + _colindex + '列 '
      if (/^Nvarchar/ig.test(col.type)) {
        if (typeof(val) === 'number') {
          val = val.toString()
        val = val + ''
        if (/'/.test(val)) {
          val = val.replace(/'/ig, '"')
        }
        val = val.replace(/(^\s*$)|\t*|\v*|'*/ig, '')
        val = val.replace(/(^\s+$)|\t+|\v+/ig, '')
        if (!val && col.required === 'true') {            // 必填校验
          errors.push(_position + dict['main.excel.content.emptyerror'])
          errors.push(_position + '内容不可为空')
        } else if (col.limit && val.length > col.limit) { // 长度校验
          errors.push(_position + dict['main.excel.content.maxlimit'])
          errors.push(_position + '内容超长')
        } else {                                          // 关键字校验
          keys.forEach(key => {
            let _patten = new RegExp('(^' + key + '\\s+)|(\\s+' + key + '\\s+)', 'ig')
            if (_patten.test(val)) {
              errors.push(_position + dict['main.excel.includekey'] + key)
              errors.push(_position + '含有关键字' + key)
            }
          })
        }
      } else if (/^int/ig.test(col.type)) {
      } else if (/^Decimal/ig.test(col.type) || /^int/ig.test(col.type)) {
        if (!val && val !== 0) {
          errors.push(_position + dict['main.excel.content.emptyerror'])
        } else {
          let _val = val + ''
          if (!/^(([^0][0-9]+|0)$)|^(([1-9]+)$)/.test(_val)) {               // 检验是否为整数
            errors.push(_position + dict['main.excel.content.interror'])
          } else if ((col.min || col.min === 0) && val < col.min) {          // 最小值检验
            errors.push(_position + dict['main.excel.content.limitmin'])
          } else if ((col.max || col.max === 0) && val > col.max) {          // 最大值检验
            errors.push(_position + dict['main.excel.content.limitmax'])
          }
        }
      } else if (/^Decimal/ig.test(col.type)) {
        if (!val && val !== 0) {
          errors.push(_position + dict['main.excel.content.emptyerror'])
        } else {
          let _val = val + ''
          let _vals = _val.split('.')
          if (!/^(([^0][0-9]+|0)\.([0-9]+)$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9]+)$)|^(([1-9]+)$)/.test(_val)) {                           // 检验是否为浮点数
            errors.push(_position + dict['main.excel.content.floaterror'])
          } else if (_vals[0].length > 18) {                          // 检验整数位
            errors.push(_position + dict['main.excel.content.floatIntover'])
          } else if (_vals[1] && _vals[1].length > col.limit) {       // 最小值检验
            errors.push(_position + dict['main.excel.content.floatPointover'])
          } else if ((col.min || col.min === 0) && val < col.min) {   // 最小值检验
            errors.push(_position + dict['main.excel.content.limitmin'])
          } else if ((col.max || col.max === 0) && val > col.max) {   // 最大值检验
            errors.push(_position + dict['main.excel.content.limitmax'])
          }
          errors.push(_position + '内容不可为空')
        } else if (isNaN(val)) {                                  // 检验是否为数值
          errors.push(_position + '内容应为数值')
        } else if ((col.min || col.min === 0) && val < col.min) { // 最小值检验
          errors.push(_position + '小于最小值')
        } else if ((col.max || col.max === 0) && val > col.max) { // 最大值检验
          errors.push(_position + '大于最大值')
        }
      } else if (col.type === 'date') {
        if (typeof(val) === 'number') {
          if (val > 2958465 || val <= 0) {                 // 时间过大或小于等于0
            errors.push(_position + dict['main.excel.content.date.over'])
            errors.push(_position + '时间为负值或太大')
          } else {                                         // 时间格式化
            if (val < 60) {                                // 1900-2-29,excel中存在,实际不存在
              val++
@@ -981,14 +1018,14 @@
            val = moment('19000101', 'YYYYMMDD').add(Math.floor(val - 2), 'days').format('YYYY-MM-DD')
          }
        } else if (typeof(val) === 'string') {
          val = val.replace(/(^\s*$)|\t*|\v*/ig, '')
          val = val.replace(/(^\s+$)|\t+|\v+/ig, '')
          if (!val && col.required === 'true') {           // 时间必填校验
            errors.push(_position + dict['main.excel.content.emptyerror'])
            errors.push(_position + '内容不可为空')
          } else if (val && !/^[1-9][0-9]{3}/.test(val)) { // 时间正则校验
            errors.push(_position + dict['main.excel.content.date.formatError'])
            errors.push(_position + '时间格式错误')
          }
        } else {                                           // 时间格式错误
          errors.push(_position + dict['main.excel.content.date.formatError'])
          errors.push(_position + '时间格式错误')
        }
      }
@@ -1027,14 +1064,14 @@
    let _uniquesql = ''
    if (btn.uniques && btn.uniques.length > 0) {
      btn.uniques.forEach(unique => {
        if (unique.status === 'false') return
        if (unique.status === 'false' || !unique.verifyType) return
        let _fields = unique.field.split(',')
        let _fields_ = _fields.map(_field => `a.${_field}=b.${_field}`)
        let _afields = _fields.map(_field => `a.${_field}`)
        _fields_ = _fields_.join(' and ')
        if (unique.verifyType !== 'physical') {
        if (unique.verifyType === 'logic' || unique.verifyType === 'logic_temp') {
          _fields_ += ' and b.deleted=0'
        }
@@ -1049,14 +1086,14 @@
        goto aaa
      end
      
      Set @tbid=''
      ${unique.verifyType.indexOf('temp') === -1 ? `Set @tbid=''
      Select top 1 @tbid=${_afields.join('+\' \'+')} from  @${sheet} a Inner join ${sheet} b on ${_fields_}
      
      If @tbid!=''
      Begin
        select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 与已有数据重复'
        goto aaa
      end
      end` : ''}
      `
      })
    }
@@ -1166,11 +1203,6 @@
  let _sheet = btn.sheet
  let BID = data[0].$$BID || ''
  if (sessionStorage.getItem('isEditState') === 'true') {
    userName = sessionStorage.getItem('CloudUserName') || ''
    fullName = sessionStorage.getItem('CloudFullName') || ''
  }
  if (window.GLOB.externalDatabase !== null) {
    _sheet = _sheet.replace(/@db@/ig, window.GLOB.externalDatabase)
  }
@@ -1248,14 +1280,14 @@
    let _uniquesql = ''
    if (btn.uniques && btn.uniques.length > 0) {
      btn.uniques.forEach(unique => {
        if (unique.status === 'false') return
        if (unique.status === 'false' || !unique.verifyType) return
        let _fields = unique.field.split(',')
        let _fields_ = _fields.map(_field => `a.${_field}=b.${_field}`)
        let _afields = _fields.map(_field => `a.${_field}`)
        _fields_ = _fields_.join(' and ')
        if (unique.verifyType !== 'physical') {
        if (unique.verifyType === 'logic' || unique.verifyType === 'logic_temp') {
          _fields_ += ' and b.deleted=0'
        }
@@ -1270,14 +1302,14 @@
        goto aaa
      end
      
      Set @tbid=''
      ${unique.verifyType.indexOf('temp') === -1 ? `Set @tbid=''
      Select top 1 @tbid=${_afields.join('+\' \'+')} from  @${sheet} a Inner join ${sheet} b on ${_fields_}
      
      If @tbid!=''
      Begin
        select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 与已有数据重复'
        goto aaa
      end
      end` : ''}
      `
      })
    }
@@ -1369,17 +1401,16 @@
 * @return {Object}  param     请求参数
 * @return {Array}   data      列表行数据
 * @return {Array}   columns   显示列
 * @return {Object}  tab       标签信息
 * @return {Boolean} retmsg    是否需要数据返回
 */
export function getSysDefaultSql (btn, setting, formdata, param, data, columns, tab, retmsg = false, moduleParams, getOptions) {
export function getSysDefaultSql (btn, setting, formdata, param, data, columns, retmsg = false, moduleParams, getOptions) {
  let primaryId = param.ID
  let BID = param.BID
  let BID = param.BID || ''
  let verify = btn.verify || {}
  let datavars = {}                 // 声明的变量,表单及显示列
  let _actionType = null
  let _callbacksql = ''
  let foreignKey = tab && tab.foreignKey ? tab.foreignKey.toLowerCase() : ''
  let foreignKey = setting.foreignKey ? setting.foreignKey.toLowerCase() : ''
  if (verify.default !== 'false') { // 判断是否使用默认sql
    _actionType = btn.sqlType
@@ -1411,7 +1442,7 @@
  })
  // 需要声明的变量集
  let _vars = ['tbid', 'errorcode', 'retmsg', 'billcode', 'bvoucher', 'fibvoucherdate', 'fiyear', 'username', 'fullname', 'modulardetailcode', 'roleid', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'bid']
  let _vars = ['tbid', 'errorcode', 'retmsg', 'billcode', 'bvoucher', 'fibvoucherdate', 'fiyear', 'username', 'fullname', 'modulardetailcode', 'roleid', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'mk_deleted', 'bid']
  // 主键字段
  let primaryKey = setting.primaryKey || 'id'
@@ -1431,20 +1462,24 @@
    if (!_initvars.includes(_key)) {
      _initvars.push(_key)
      let val = form.value
      if (form.type === 'number' || form.type === 'rate') {
        let val = form.value
        if (typeof(val) !== 'number') {
          val = parseFloat(val)
          if (isNaN(val)) {
            val = 0
          }
        if (isNaN(val)) {
          val = 0
        }
        _initFormfields.push(`@${_key}=${val}`)
      } else if (['date', 'datemonth', 'datetime'].includes(form.type)) {
        _initFormfields.push(`@${_key}='${form.value || '1949-10-01'}'`)
      } else if (['date', 'datemonth'].includes(form.type)) {
        _initFormfields.push(`@${_key}='${val || '1949-10-01'}'`)
      } else {
        _initFormfields.push(`@${_key}='${form.value}'`)
        if (/'/.test(val)) {
          val = val.replace(/'/ig, '"')
        }
        if (form.isconst) {
          _initFormfields.push(`@${_key}=N'${val}'`)
        } else {
          _initFormfields.push(`@${_key}='${val}'`)
        }
      }
    }
    
@@ -1469,15 +1504,16 @@
    }
  })
  let _data = {}
  if (data) {
    Object.keys(data).forEach(key => {
      data[key.toLowerCase()] = data[key]
      _data[key.toLowerCase()] = data[key]
    })
  }
  // 添加数据中字段,表单值优先(按钮不选行或多行拼接时跳过)
  if (data && btn.Ot !== 'notRequired' && btn.Ot !== 'requiredOnce') {
    datavars = {...data, ...datavars}
  if (data && btn.Ot !== 'notRequired' && columns && columns.length > 0) {
    datavars = {..._data, ...datavars}
    const setField = (col) => {
      if (!col.field) return
@@ -1488,6 +1524,10 @@
        if (col.datatype && /^date/ig.test(col.datatype) && !_val) {
          _val = '1949-10-01'
        }
        if (/'/.test(_val)) {
          _val = _val.replace(/'/ig, '"')
        }
        _initvars.push(_key)
@@ -1518,17 +1558,15 @@
      }
    }
    if (columns && columns.length > 0) {
      columns.forEach(col => {
        if (col.type === 'colspan' || col.type === 'old_colspan') {
          col.subcols.forEach(cell => {
            setField(cell)
          })
        } else {
          setField(col)
        }
      })
    }
    columns.forEach(col => {
      if (col.type === 'colspan' || col.type === 'old_colspan') {
        col.subcols.forEach(cell => {
          setField(cell)
        })
      } else {
        setField(col)
      }
    })
  }
  // 变量声明
@@ -1537,7 +1575,7 @@
    _declarefields = ',' + _declarefields
  }
  _sql = `/* 系统生成 */
      Declare @tbid nvarchar(50),@ErrorCode nvarchar(50),@retmsg nvarchar(4000),@BillCode nvarchar(50),@BVoucher nvarchar(50),@FIBVoucherDate nvarchar(50), @FiYear nvarchar(50),@ModularDetailCode nvarchar(50), @UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100),@bid nvarchar(50)${_declarefields}
      Declare @tbid nvarchar(50),@ErrorCode nvarchar(50),@retmsg nvarchar(4000),@BillCode nvarchar(50),@BVoucher nvarchar(50),@FIBVoucherDate nvarchar(50), @FiYear nvarchar(50),@ModularDetailCode nvarchar(50), @UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100),@mk_deleted int,@bid nvarchar(50)${_declarefields}
    `
  let userName = sessionStorage.getItem('User_Name') || ''
@@ -1552,15 +1590,10 @@
  let district = sessionStorage.getItem('district') || ''
  let address = sessionStorage.getItem('address') || ''
  if (sessionStorage.getItem('isEditState') === 'true') {
    userName = sessionStorage.getItem('CloudUserName') || ''
    fullName = sessionStorage.getItem('CloudFullName') || ''
  }
  // 初始化凭证及用户信息字段
  _sql += `
      /* 凭证及用户信息初始化赋值 */
      select @BVoucher='',@FIBVoucherDate='',@FiYear='',@ErrorCode='',@retmsg='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}', @BillCode='', @ModularDetailCode=''
      select @BVoucher='',@FIBVoucherDate='',@FiYear='',@ErrorCode='',@retmsg='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}', @mk_deleted=1, @bid='${BID}', @BillCode='', @ModularDetailCode=''
      `
  // 表单变量赋值
@@ -1674,7 +1707,7 @@
      /* 失效验证 */
      select @tbid='', @ErrorCode='',@retmsg=''
      select @tbid='X' from ${datasource} right join (select ID from  dbo.SplitComma(@ID@)) sp
      on tb.id =sp.id where tb.id is null
      on tb.${primaryKey} =sp.id where tb.${primaryKey} is null
      If @tbid!=''
      Begin
@@ -1748,8 +1781,8 @@
        let _val = ''
        if (_linkKey === 'bid' && BID) { // 替换bid
          _val = BID
        } else if (data && data.hasOwnProperty(_linkKey)) {
          _val = data[_linkKey]
        } else if (_data.hasOwnProperty(_linkKey)) {
          _val = _data[_linkKey]
        }
        _ModularDetailCode = `'${item.TypeCharOne + _val}'`
      } else {
@@ -1878,7 +1911,7 @@
    _sql += `
      /* 创建凭证 */
      exec s_BVoucher_Create
        @Bill ='${data[_voucher.linkField.toLowerCase()]}',
        @Bill ='${_data[_voucher.linkField.toLowerCase()]}',
        @BVoucherType ='${_voucher.BVoucherType}',
        @VoucherTypeOne ='${_voucher.VoucherTypeOne}',
        @VoucherTypeTwo ='${_voucher.VoucherTypeTwo}',
@@ -1935,6 +1968,11 @@
    } else if (foreignKey && !keys.includes(foreignKey)) {
      keys.push(foreignKey)
      values.push('@BID@')
    }
    if (!keys.includes('typename')) {
      keys.push('typename')
      values.push('@typename@')
    }
    keys = keys.join(',')
@@ -1994,6 +2032,9 @@
        _form.push('FiYear=@FiYear')
      }
    }
    if (!_arr.includes('typename')) {
      _form.push('typename=@typename@')
    }
    _form = _form.join(',')
    let _ID = '=@ID@'
@@ -2025,17 +2066,16 @@
    _sql += `
      /* 默认sql */
      update ${btn.sql} set deleted=1,modifydate=getdate(),modifyuser=@username,modifyuserid=@userid@ where ${primaryKey}${_ID};`
      update ${btn.sql} set deleted=@mk_deleted,modifydate=getdate(),modifyuser=@username,modifystaff=@fullname,modifyuserid=@userid@ where ${primaryKey}${_ID};`
  
  } else if (_actionType === 'delete') {      // 物理删除
    let _msg = ''
    if (data && columns && columns.length > 0) {
    if (data && columns && columns.length > 0 && btn.Ot !== 'notRequired') {
      let _index = 0
      columns.forEach(col => {
        if (col.Hide !== 'true' && col.type !== 'colspan' && col.type !== 'old_colspan' && _index < 4) {
          _msg += col.label + '=' + data[col.field] + ','
          _index++
        }
        if (!col.field || col.Hide === 'true' || _index >= 4) return
        _msg += col.label + '=' + data[col.field] + ','
        _index++
      })
    }
@@ -2046,7 +2086,7 @@
    _sql += `
      /* 默认sql */
      insert into snote (remark,createuserid,CreateUser,CreateStaff) select left('删除表:${btn.sql} 数据: ${_msg}${primaryKey}='+@ID@,200),@userid@,@username,@fullname
      insert into snote (remark,createuserid,CreateUser,CreateStaff,typename) select left('删除表:${btn.sql} 数据: ${_msg}${primaryKey}='+@ID@,200),@userid@,@username,@fullname,@typename@
      delete ${btn.sql} where ${primaryKey}${_ID};`
  } else if (_actionType === 'insertOrUpdate') {
    _sql += `
@@ -2078,7 +2118,7 @@
      end = /@breakpoint_end_[0-9a-z_]+\$\*\//ig
    }
    
    _sql = _sql.replace(start, '').replace(end, '')
    _sql = _sql.replace(start, '').replace(end, '').replace(/\$breakpoint_proc@/ig, window.GLOB.breakpoint)
    _sql += `
      z_debug_end: select @ErrorCode='E',@retmsg='debug_end' goto aaa`
  }
@@ -2096,11 +2136,18 @@
  }
  _sql = _sql.replace(/@ID@/ig, `'${primaryId || ''}'`)
  _sql = _sql.replace(/@BID@/ig, `'${BID || ''}'`)
  _sql = _sql.replace(/@BID@/ig, `'${BID}'`)
  _sql = _sql.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
  _sql = _sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
  _sql = _sql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
  _sql = _sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
  _sql = _sql.replace(/@typename@/ig, `'admin'`)
  if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
    _sql = _sql.replace(/@datam@/ig, '\'Y\'')
  } else {
    _sql = _sql.replace(/@datam@/ig, '\'\'')
  }
  if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
    // _sql = _sql.replace(/\n\s{8}/ig, '\n')
@@ -2109,11 +2156,18 @@
  if (retmsg) {
    _callbacksql = _callbacksql.replace(/@ID@/ig, `'${primaryId || ''}'`)
    _callbacksql = _callbacksql.replace(/@BID@/ig, `'${BID || ''}'`)
    _callbacksql = _callbacksql.replace(/@BID@/ig, `'${BID}'`)
    _callbacksql = _callbacksql.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
    _callbacksql = _callbacksql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
    _callbacksql = _callbacksql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
    _callbacksql = _callbacksql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
    _callbacksql = _callbacksql.replace(/@typename@/ig, `'admin'`)
    if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
      _callbacksql = _callbacksql.replace(/@datam@/ig, '\'Y\'')
    } else {
      _callbacksql = _callbacksql.replace(/@datam@/ig, '\'\'')
    }
    
    return {
      sql: _sql,
@@ -2131,6 +2185,7 @@
  let icon = null
  let innerStyle = null
  let position = null
  let signType = ''
  style = JSON.parse(JSON.stringify(style))
  marks.some(mark => {
@@ -2140,6 +2195,7 @@
    if (mark.field[1] === 'static') {
      contrastVal = mark.contrastValue
      originVal = originVal + ''
    } else {
      contrastVal = record[mark.field[2]]
    }
@@ -2167,8 +2223,9 @@
    if (type === 'font') {
      style.color = mark.color
      innerStyle = {color: mark.color}
      signType = ' sign-font'
    } else if (type === 'background') {
      style.background = mark.color
      style.backgroundColor = mark.color
      if (mark.fontColor) {
        style.color = mark.fontColor
        innerStyle = {color: mark.fontColor}
@@ -2198,7 +2255,8 @@
    style,
    icon,
    innerStyle,
    position
    position,
    signType
  }
}
@@ -2207,36 +2265,21 @@
 */
export function setGLOBFuncs () {
  window.GLOB.funcs = []
  if (!window.GLOB.WebSql && !window.GLOB.IndexDB) {
  if (!window.GLOB.IndexDB) {
    return
  }
  if (window.GLOB.WebSql) {
    window.GLOB.WebSql.transaction(tx => {
      tx.executeSql("SELECT * FROM FUNCS", [], (tx, results) => {
        let rows = results.rows
        if (!rows || rows.length === 0) return
        for (let i = 0; i < rows.length; i++) {
          window.GLOB.funcs.push({
            func_code: rows[i].func_code,
            key_sql: window.decodeURIComponent(window.atob(rows[i].key_sql))
          })
        }
  let objectStore = window.GLOB.IndexDB.transaction('funcs').objectStore('funcs')
  objectStore.openCursor().onsuccess = (event) => {
    let cursor = event.target.result
    if (cursor) {
      window.GLOB.funcs.push({
        func_code: cursor.value.func_code,
        key_sql: window.decodeURIComponent(window.atob(cursor.value.key_sql))
      })
    })
  } else {
    let objectStore = window.GLOB.IndexDB.transaction('funcs').objectStore('funcs')
    objectStore.openCursor().onsuccess = (event) => {
      let cursor = event.target.result
      if (cursor) {
        window.GLOB.funcs.push({
          func_code: cursor.value.func_code,
          key_sql: window.decodeURIComponent(window.atob(cursor.value.key_sql))
        })
        cursor.continue()
      }
      cursor.continue()
    }
  }
}
@@ -2257,7 +2300,7 @@
   * @description 创建页面存储过程
   * @return {String}
   */
  static getTableFunc (param, menu, config) {
  static getTableFunc (func = 'func', menu, config) {
    let form = ''
    let formParam = ''
    let _vars = ['bid', 'pageindex', 'pagesize', 'ordercol', 'ordertype', 'exceltype', 'septmenuno', 'lang', 'debug', 'loginuid', 'sessionuid', 'userid', 'errorcode', 'retmsg']
@@ -2312,7 +2355,7 @@
      `
    }
    let Ltext = `create proc ${param.innerFunc}
    let Ltext = `create proc ${func}
    ( /*${menu.MenuName}*/
    @appkey nvarchar(50)='',
    @BID nvarchar(50)='',${formParam}
@@ -2327,6 +2370,7 @@
    @LoginUID nvarchar(50)='',
    @SessionUid nvarchar(50)='',
    @UserID nvarchar(50),
    @dataM nvarchar(50),
    @ErrorCode nvarchar(50) out,
    @retmsg nvarchar(4000) out
    )
@@ -2548,9 +2592,9 @@
        @ErrorSeverity=ERROR_SEVERITY(),
        @ErrorState=ERROR_STATE();
        
      RAISERROR(@ErrorMessage, /*-- Message text.*/
        @ErrorSeverity, /*-- Severity.*/
        @ErrorState  /*-- State.*/
      RAISERROR(@ErrorMessage, /* Message text.*/
        @ErrorSeverity, /* Severity.*/
        @ErrorState  /* State.*/
      );
    END CATCH
    
@@ -2689,9 +2733,9 @@
        @ErrorSeverity=ERROR_SEVERITY(),
        @ErrorState=ERROR_STATE();
        
      RAISERROR(@ErrorMessage, /*-- Message text.*/
        @ErrorSeverity, /*-- Severity.*/
        @ErrorState  /*-- State.*/
      RAISERROR(@ErrorMessage, /* Message text.*/
        @ErrorSeverity, /* Severity.*/
        @ErrorState  /* State.*/
      );
    END CATCH