king
2020-10-23 407c0f1765c7d085218a91ad8842784977383d05
src/templates/zshare/verifycard/index.jsx
@@ -1,7 +1,7 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { fromJS } from 'immutable'
import { Form, Tabs, Row, Col, Radio, Button, Table, Popconfirm, Icon, notification, Modal, message, InputNumber, Tooltip, Typography } from 'antd'
import { Form, Tabs, Row, Col, Radio, Button, Table, Select, Popconfirm, Icon, notification, Modal, message, InputNumber, Tooltip, Typography } from 'antd'
import moment from 'moment'
import Api from '@/api'
@@ -21,7 +21,6 @@
class VerifyCard extends Component {
  static propTpyes = {
    floor: PropTypes.any,      // 是否为子表
    btnTab: PropTypes.any,     // 表单标签页(按钮)参数
    config: PropTypes.any,     // 表单标签页参数
    dict: PropTypes.object,    // 字典项
@@ -30,7 +29,8 @@
  }
  state = {
    initsql: '',          // sql验证时变量声明及赋值
    initsql: '',            // sql验证时变量声明及赋值
    notes: [],              // 短信模板
    verify: {},
    fields: [],
    usefulfields: '',
@@ -438,8 +438,8 @@
  }
  UNSAFE_componentWillMount() {
    const { columns, config, card } = this.props
    let _verify = this.props.card.verify || {}
    const { columns, config, card, btnTab } = this.props
    let _verify = card.verify || {}
    let _invalid = _verify.invalid
@@ -451,6 +451,9 @@
    }
    _verify.default = _verify.default || 'true'
    _verify.noteEnable = _verify.noteEnable || 'false' // 短信发送是否开启
    _verify.noteType = _verify.noteType || 'N'         // 短信发送模式:Y(实时)、N(定时)
    _verify.noteTemp = _verify.noteTemp || 'Y'         // 短信发送模板:Y(相同)、N(不同)
    _verify.invalid = _invalid
    _verify.uniques = _verify.uniques || []
    _verify.contrasts = _verify.contrasts || []
@@ -464,55 +467,123 @@
      verify: _verify
    })
    // 按钮-表单标签页
    if (this.props.card.btnType) {
    new Promise(resolve => {
      let _fields = []
      config.groups.forEach(group => {
        _fields.push(...group.sublist)
      })
      if (config.Template === 'FormTab') {
        config.groups.forEach(group => {
          _fields.push(...group.sublist)
        })
        resolve(_fields)
      } else if (card.modal) {
        if (card.modal.groups && card.modal.groups.length > 0) {
          card.modal.groups.forEach(group => {
            _fields.push(...group.sublist)
          })
        } else {
          _fields = card.modal.fields || []
        }
        resolve(_fields)
      } else if (card.OpenType === 'pop') {
        Api.getSystemConfig({
          func: 'sPC_Get_LongParam',
          MenuID: card.uuid
        }).then(res => {
          if (res.status) {
            let _LongParam = ''
            if (res.LongParam) {
              try {
                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
              } catch (e) {
                console.warn('Parse Failure')
                _LongParam = ''
              }
            }
            if (!_LongParam) {
              notification.warning({
                top: 92,
                message: '未获取到表单信息,部分验证将无法设置!',
                duration: 5
              })
            } else {
              if (_LongParam.groups.length > 0) {
                _LongParam.groups.forEach(group => {
                  _fields.push(...group.sublist)
                })
              } else {
                _fields = _LongParam.fields || []
              }
            }
          } else {
            notification.warning({
              top: 92,
              message: res.message,
              duration: 5
            })
          }
          resolve(_fields)
        })
      }
    }).then(_fields => {
      let _usefulfields = ['BID', 'ID', 'LoginUID', 'SessionUid', 'UserID', 'Appkey', 'UserName', 'FullName', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode']
      let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)']
      let _select = ['@UserName=\'\'', '@FullName=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'']
      let fieldArr = _usefulfields.map(_f => _f.toLowerCase())
      let hasBid = false
      _fields = _fields.filter(_f => _f.field)
      _fields.forEach(_f => {
        if (_f.field) {
          if (fieldArr.includes(_f.field.toLowerCase())) return
          fieldArr.push(_f.field.toLowerCase())
        if (fieldArr.includes(_f.field.toLowerCase())) return
          _usefulfields.push(_f.field)
        fieldArr.push(_f.field.toLowerCase())
          let _fieldlen = _f.fieldlength || 50
        _usefulfields.push(_f.field)
          if (['textarea', 'fileupload', 'multiselect'].includes(_f.type)) {
            _fieldlen = _f.fieldlength || 512
          } else if (_f.type === 'number') {
            _fieldlen = _f.decimal ? _f.decimal : 0
          }
        let _fieldlen = _f.fieldlength || 50
          if (_fieldlen > 2048) {
            _fieldlen = 'max'
          }
        if (_f.type === 'number') {
          _fieldlen = _f.decimal ? _f.decimal : 0
        }
          let _type = `nvarchar(${_fieldlen})`
        if (_fieldlen > 2048) {
          _fieldlen = 'max'
        }
          if (_f.type.match(/date/ig)) {
            _type = 'datetime'
            _select.push(`@${_f.field}='1900-01-01'`)
          } else if (_f.type === 'number') {
            _type = `decimal(18,${_fieldlen})`
            _select.push(`@${_f.field}=0`)
          } else {
            _select.push(`@${_f.field}=''`)
          }
        let _type = `nvarchar(${_fieldlen})`
          _declare.push(`@${_f.field} ${_type}`)
        if (_f.type.match(/date/ig)) {
          _type = 'datetime'
          _select.push(`@${_f.field}='1900-01-01'`)
        } else if (_f.type === 'number') {
          _type = `decimal(18,${_fieldlen})`
          _select.push(`@${_f.field}=0`)
        } else {
          _select.push(`@${_f.field}=''`)
        }
        _declare.push(`@${_f.field} ${_type}`)
        if (_f.field.toLowerCase() === 'bid') {
          hasBid = true
        }
      })
      if (columns && columns.length > 0 && this.props.btnTab.Ot !== 'notRequired' && this.props.btnTab.Ot !== 'requiredOnce') {
      if (!hasBid) { // 表单中增加BID
        _fields.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
      }
      let hasColumn = false
      if (columns && columns.length > 0) {
        if (btnTab) { // 表单标签
          if (btnTab.Ot !== 'notRequired' && btnTab.Ot !== 'requiredOnce') {
            hasColumn = true
          }
        } else if (card.Ot !== 'notRequired' && card.Ot !== 'requiredOnce') {
          hasColumn = true
        }
      }
      if (hasColumn) {
        columns.forEach(_f => {
          if (!_f.field || fieldArr.includes(_f.field.toLowerCase())) return
@@ -520,11 +591,18 @@
          _usefulfields.push(_f.field)
          let _fieldlen = _f.fieldlength || 50
          if (_f.datatype) { // 自定义字段
            if (/decimal/ig.test(_f.datatype)) {
              _select.push(`@${_f.field}=0`)
            } else {
              _select.push(`@${_f.field}=''`)
            }
          if (_f.type === 'picture' || _f.type === 'textarea') {
            _fieldlen = _f.fieldlength || 512
            _declare.push(`@${_f.field} ${_f.datatype}`)
            return
          }
          let _fieldlen = _f.fieldlength || 50
          if (_fieldlen > 2048) {
            _fieldlen = 'max'
@@ -548,16 +626,16 @@
        })
      }
      _usefulfields = _usefulfields.join(', ')
      let _sql = `Declare ${_declare.join(', ')}
        Select ${_select.join(', ')}
      `
      // 默认sql
      let _defaultsql = ''
      let _insertsql = ''
      let _updatesql = ''
      if (this.props.card.sqlType === 'insert' || this.props.card.sqlType === 'insertOrUpdate') {
      if (card.sqlType === 'insert' || card.sqlType === 'insertOrUpdate') {
        let keys = []
        let values = []
        _fields.forEach(item => {
@@ -590,10 +668,10 @@
  
        keys = keys.join(', ')
        values = values.join(', ')
        _insertsql = `insert into ${this.props.card.sql} (${keys}) select ${values};`
        _insertsql = `insert into ${card.sql} (${keys}) select ${values};`
      }
      
      if (this.props.card.sqlType === 'update' || this.props.card.sqlType === 'insertOrUpdate') {
      if (card.sqlType === 'update' || card.sqlType === 'audit' || card.sqlType === 'insertOrUpdate') {
        let _form = []
        let _arr = []
@@ -604,11 +682,20 @@
          _form.push(item.field + '=@' + item.field)
        })
        if (!_arr.includes('modifydate')) {
          _form.push('modifydate=getdate()')
        }
        if (!_arr.includes('modifyuserid')) {
          _form.push('modifyuserid=@userid@')
        if (this.props.card.sqlType === 'audit') {
          if (!_arr.includes('submitdate')) {
            _form.push('submitdate=getdate()')
          }
          if (!_arr.includes('submituserid')) {
            _form.push('submituserid=@userid@')
          }
        } else {
          if (!_arr.includes('modifydate')) {
            _form.push('modifydate=getdate()')
          }
          if (!_arr.includes('modifyuserid')) {
            _form.push('modifyuserid=@userid@')
          }
        }
        if (_verify.voucher && _verify.voucher.enabled) {
@@ -624,18 +711,16 @@
        }
        _form = _form.join(', ')
        _updatesql = `update ${this.props.card.sql} set ${_form} where ${config.setting.primaryKey}=@ID@;`
        _updatesql = `update ${card.sql} set ${_form} where ${config.setting.primaryKey}${card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
      }
      let _defaultsql = ''
      if (this.props.card.sqlType === 'insert') {
      if (card.sqlType === 'insert') {
        _defaultsql = _insertsql
      } else if (this.props.card.sqlType === 'update') {
      } else if (card.sqlType === 'update' || card.sqlType === 'audit') {
        _defaultsql = _updatesql
      } else if (this.props.card.sqlType === 'insertOrUpdate') {
      } else if (card.sqlType === 'insertOrUpdate') {
        _defaultsql += `select @tbid=''
          select @tbid='X' from ${this.props.card.sql} where ${config.setting.primaryKey}=@ID@
          select @tbid='X' from ${card.sql} where ${config.setting.primaryKey}=@ID@
          if @tbid=''
            begin
            ${_insertsql}
@@ -645,515 +730,117 @@
            ${_updatesql}
            end
        `
      }
      this.setState({
        fields: _fields,
        initsql: _sql,
        defaultsql: _defaultsql,
        usefulfields: _usefulfields
      }, () => {
        this.getsysScript()
      })
      return
    }
    // 通用按钮
    if (this.props.card.OpenType === 'pop') {
      Api.getSystemConfig({
        func: 'sPC_Get_LongParam',
        MenuID: this.props.card.uuid
      }).then(res => {
        if (res.status) {
          let _LongParam = ''
          if (res.LongParam) {
            try {
              _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
            } catch (e) {
              console.warn('Parse Failure')
              _LongParam = ''
            }
          }
          if (!_LongParam) {
            notification.warning({
              top: 92,
              message: '表单未添加或解析错误,请检查表单设置!',
              duration: 5
            })
            this.getsysScript()
            return
          }
          let _fields = []
          if (_LongParam.groups.length > 0) {
            _LongParam.groups.forEach(group => {
              _fields.push(...group.sublist)
            })
          } else {
            _fields = _LongParam.fields
          }
          let _usefulfields = ['BID', 'ID', 'LoginUID', 'SessionUid', 'UserID', 'Appkey', 'UserName', 'FullName', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode']
          let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)']
          let _select = ['@UserName=\'\'', '@FullName=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'']
          let hasBid = false
          let fieldArr = _usefulfields.map(_f => _f.toLowerCase())
          let _defaultfields = fromJS(_fields).toJS()
          _fields.forEach(_f => {
            if (_f.field) {
              if (fieldArr.includes(_f.field.toLowerCase())) return
              fieldArr.push(_f.field.toLowerCase())
              _usefulfields.push(_f.field)
              let _fieldlen = _f.fieldlength || 50
              if (['textarea', 'fileupload', 'multiselect'].includes(_f.type)) {
                _fieldlen = _f.fieldlength || 512
              } else if (_f.type === 'number') {
                _fieldlen = _f.decimal ? _f.decimal : 0
              }
              if (_fieldlen > 2048) {
                _fieldlen = 'max'
              }
              let _type = `nvarchar(${_fieldlen})`
              if (_f.type.match(/date/ig)) {
                _type = 'datetime'
                _select.push(`@${_f.field}='1900-01-01'`)
              } else if (_f.type === 'number') {
                _type = `decimal(18,${_fieldlen})`
                _select.push(`@${_f.field}=0`)
              } else {
                _select.push(`@${_f.field}=''`)
              }
              _declare.push(`@${_f.field} ${_type}`)
            }
            if (_f.field && _f.field.toLowerCase() === 'bid') {
              hasBid = true
            }
          })
          if (this.props.floor === 'subtable' && !hasBid) { // 子表表单中增加BID
            _fields.unshift({
              uuid: 'BID',
              field: 'BID',
              label: 'BID',
              type: 'text'
            })
          }
          if (columns && columns.length > 0 && this.props.card.Ot !== 'notRequired' && this.props.card.Ot !== 'requiredOnce') {
            columns.forEach(_f => {
              if (!_f.field || fieldArr.includes(_f.field.toLowerCase())) return
              fieldArr.push(_f.field.toLowerCase())
              _usefulfields.push(_f.field)
              let _fieldlen = _f.fieldlength || 50
              if (_f.type === 'picture' || _f.type === 'textarea') {
                _fieldlen = _f.fieldlength || 512
              }
              if (_fieldlen > 2048) {
                _fieldlen = 'max'
              }
              let _type = `nvarchar(${_fieldlen})`
              if (_f.type === 'number') {
                _type = `decimal(18,${_f.decimal ? _f.decimal : 0})`
              } else if (_f.type === 'picture' || _f.type === 'textarea') {
                _type = `nvarchar(${_fieldlen})`
              }
              if (_f.type === 'number') {
                _select.push(`@${_f.field}=0`)
              } else {
                _select.push(`@${_f.field}=''`)
              }
              _declare.push(`@${_f.field} ${_type}`)
            })
          }
          _usefulfields = _usefulfields.join(', ')
          let _sql = `Declare ${_declare.join(', ')}
            Select ${_select.join(', ')}
          `
          // 默认sql
          let _defaultsql = ''
          if (this.props.card.sqlType === 'insert') {
            let keys = []
            let values = []
            _defaultfields.forEach(item => {
              if (!item.field) return
              keys.push(item.field.toLowerCase())
              values.push('@' + item.field)
            })
            if (config.setting.primaryKey && !keys.includes(config.setting.primaryKey.toLowerCase())) {
              keys.push(config.setting.primaryKey.toLowerCase())
              values.push('@ID@')
            }
            if (!keys.includes('createuserid')) {
              keys.push('createuserid')
              values.push('@userid@')
            }
            if (!keys.includes('createuser')) {
              keys.push('createuser')
              values.push('@username')
            }
            if (!keys.includes('createstaff')) {
              keys.push('createstaff')
              values.push('@fullname')
            }
            if (!keys.includes('bid')) {
              keys.push('bid')
              values.push('@BID@')
            }
            keys = keys.join(', ')
            values = values.join(', ')
            _defaultsql = `insert into ${this.props.card.sql} (${keys}) select ${values};`
          } else if (this.props.card.sqlType === 'update' || this.props.card.sqlType === 'audit') {
            let _form = []
            let _arr = []
            _defaultfields.forEach(item => {
              if (!item.field) return
              _arr.push(item.field.toLowerCase())
              _form.push(item.field + '=@' + item.field)
            })
            if (this.props.card.sqlType === 'audit') {
              if (!_arr.includes('submitdate')) {
                _form.push('submitdate=getdate()')
              }
              if (!_arr.includes('submituserid')) {
                _form.push('submituserid=@userid@')
              }
            } else {
              if (!_arr.includes('modifydate')) {
                _form.push('modifydate=getdate()')
              }
              if (!_arr.includes('modifyuserid')) {
                _form.push('modifyuserid=@userid@')
              }
            }
            if (_verify.voucher && _verify.voucher.enabled) {
              if (!_arr.includes('bvoucher')) {
                _form.push('BVoucher=@BVoucher')
              }
              if (!_arr.includes('fibvoucherdate')) {
                _form.push('FIBVoucherDate=@FIBVoucherDate')
              }
              if (!_arr.includes('fiyear')) {
                _form.push('FiYear=@FiYear')
              }
            }
            _form = _form.join(', ')
            _defaultsql = `update ${this.props.card.sql} set ${_form} where ${config.setting.primaryKey}${this.props.card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
          }
          this.setState({
            fields: _fields,
            initsql: _sql,
            defaultsql: _defaultsql,
            usefulfields: _usefulfields
          }, () => {
            this.getsysScript()
          })
        } else {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 5
          })
          this.getsysScript()
        }
      })
    } else {
      let _usefulfields = ['BID', 'ID', 'LoginUID', 'SessionUid', 'UserID', 'Appkey', 'UserName', 'FullName', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode']
      let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)']
      let _select = ['@UserName=\'\'', '@FullName=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'']
      let fieldArr = _usefulfields.map(_f => _f.toLowerCase())
      if (columns && columns.length > 0 && this.props.card.Ot !== 'notRequired' && this.props.card.Ot !== 'requiredOnce') {
        columns.forEach(_f => {
          if (!_f.field || fieldArr.includes(_f.field.toLowerCase())) return
          fieldArr.push(_f.field.toLowerCase())
          _usefulfields.push(_f.field)
          let _fieldlen = _f.fieldlength || 50
          if (_f.type === 'picture' || _f.type === 'textarea') {
            _fieldlen = _f.fieldlength || 512
          }
          if (_fieldlen > 2048) {
            _fieldlen = 'max'
          }
          let _type = `nvarchar(${_fieldlen})`
          if (_f.type === 'number') {
            _type = `decimal(18,${_f.decimal ? _f.decimal : 0})`
          } else if (_f.type === 'picture' || _f.type === 'textarea') {
            _type = `nvarchar(${_fieldlen})`
          }
          if (_f.type === 'number') {
            _select.push(`@${_f.field}=0`)
          } else {
            _select.push(`@${_f.field}=''`)
          }
          _declare.push(`@${_f.field} ${_type}`)
        })
      }
      _usefulfields = _usefulfields.join(', ')
      let _sql = `Declare ${_declare.join(', ')}
        Select ${_select.join(', ')}
      `
      // 默认sql
      let _defaultsql = ''
      if (this.props.card.sqlType === 'LogicDelete') {
        _defaultsql = `update ${this.props.card.sql} set deleted=1,modifydate=getdate(),modifyuserid=@userid@ where ${config.setting.primaryKey}${this.props.card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
      } else if (this.props.card.sqlType === 'delete') {
      } else if (card.sqlType === 'LogicDelete') {
        _defaultsql = `update ${card.sql} set deleted=1,modifydate=getdate(),modifyuserid=@userid@ where ${config.setting.primaryKey}${card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
      } else if (card.sqlType === 'delete') {
        let _msg = ''
        if (columns && columns.length > 0 && this.props.card.Ot !== 'notRequired' && this.props.card.Ot !== 'requiredOnce') {
        if (columns && columns.length > 0 && card.Ot !== 'notRequired' && card.Ot !== 'requiredOnce') {
          let _index = 0
          columns.forEach(col => {
            if (col.field && col.Hide !== 'true' && _index < 4) {
              _msg += col.label + '=\'\','
              _index++
            }
            if (!col.field || col.Hide === 'true' || _index >= 4) return
            _msg += col.label + '=\'\','
            _index++
          })
        }
        _defaultsql += `insert into snote (remark,createuserid,CreateUser,CreateStaff) select left('删除表:${this.props.card.sql} 数据: ${_msg}${config.setting.primaryKey}='+@ID@,200),@userid@,@username,@fullname delete ${this.props.card.sql} where ${config.setting.primaryKey}${this.props.card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
        _defaultsql += `insert into snote (remark,createuserid,CreateUser,CreateStaff) select left('删除表:${card.sql} 数据: ${_msg}${config.setting.primaryKey}='+@ID@,200),@userid@,@username,@fullname delete ${card.sql} where ${config.setting.primaryKey}${card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
      }
      let _columns = []
      if (columns) {
        _columns = fromJS(columns).toJS()
        let hasbid = false
        _columns = _columns.filter(col => {
          if (col.field.toLowerCase() === 'bid') {
            hasbid = true
          }
          return !!col.field
        })
        if (!hasbid) {
          _columns.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
        }
      }
      this.setState({
        fields: _fields,
        columnsFields: _columns,
        initsql: _sql,
        defaultsql: _defaultsql,
        usefulfields: _usefulfields
      }, () => {
        this.getsysScript()
        usefulfields: _usefulfields.join(', ')
      })
    }
    if (this.props.card.Ot === 'requiredOnce') {
      let _columns = fromJS(config.columns).toJS()
      _columns = _columns.filter(col => col.field)
      if (this.props.floor === 'subtable' && _columns.filter(col => col.field.toLowerCase() === 'bid').length === 0) { // 子表表单中增加BID
        _columns.unshift({
          uuid: 'BID',
          field: 'BID',
          label: 'BID',
          type: 'text'
        })
      }
      this.setState({
        columnsFields: _columns
      })
    }
    })
  }
  componentDidMount() {
    // 获取生成单号一级菜单
    let defer1 = new Promise(resolve => {
      let _orderSql = `select distinct ModularCode as ID,ModularCode+ModularName+ModularNo as NameNO from sModular where deleted=0 and Appkey=case when Appkey='' then '' else @Appkey@ end order by ID asc`
      _orderSql = Utils.formatOptions(_orderSql)
      let orderParam = {
        func: 'sPC_Get_SelectedList',
        LText: _orderSql,
        obj_name: 'data',
        arr_field: 'ID,NameNO'
    let mutilForms = [
      {
        obj_name: 'modular',
        arr_field: 'ID,NameNO',
        LText: window.btoa(window.encodeURIComponent(`select distinct ModularCode as ID,ModularCode+ModularName+ModularNo as NameNO from sModular where deleted=0 and Appkey=case when Appkey='' then '' else @Appkey@ end order by ID asc`))
      },
      {
        obj_name: 'modularDetail',
        arr_field: 'ModularDetailCode,CodeName,BID,Type',
        LText: window.btoa(window.encodeURIComponent(`select distinct ModularDetailCode,ModularDetailCode+ModularDetailName as CodeName,ModularCode as BID,Type from sModularDetail where Deleted=0 and Appkey=case when Appkey='' then '' else @Appkey@ end order by ModularDetailCode`))
      },
      {
        obj_name: 'voucher',
        arr_field: 'ID,NameNO,TypeCharOne',
        LText: window.btoa(window.encodeURIComponent('select distinct ModularCode as ID,ModularCode+ModularName+ModularNo as NameNO,TypeCharOne from sModular where deleted=0  and Appkey=case when Appkey=\'\' then \'\' else @Appkey@ end  order by ModularCode'))
      },
      {
        obj_name: 'voucherDetail',
        arr_field: 'ModularDetailCode,CodeName,BID,VoucherTypeTwo,IDefine1',
        LText: window.btoa(window.encodeURIComponent('select distinct ModularDetailCode,ModularDetailCode+ModularDetailName as CodeName,ModularCode as BID, VoucherTypeTwo, IDefine1 from sModularDetail where Deleted=0 and VoucherTypeTwo!=\'\' and Appkey=case when Appkey=\'\' then \'\' else @Appkey@ end  order by ModularDetailCode'))
      },
      {
        obj_name: 'noteCodes',
        arr_field: 'templatecode,describe',
        LText: window.btoa(window.encodeURIComponent(`select templatecode,'['+SignName+']'+describe as describe from (select * from bd_msn_sms_temp where  deleted=0 and TypeDesc='QX' and status=20 ) t inner join (select openid from susers where uid=@userid@) u on t.openid =t.openid`))
      },
      {
        obj_name: 'scripts',
        arr_field: 'funcname,longparam',
        LText: window.btoa(window.encodeURIComponent(`Select distinct func+Remark as funcname,longparam, s.Sort from s_custom_script s inner join (select OpenID from sapp where ID=@Appkey@) p on s.openid = case when s.appkey='' then s.openid else p.OpenID end order by s.Sort`))
      }
    ]
      orderParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      orderParam.secretkey = Utils.encrypt(orderParam.LText, orderParam.timestamp)
      orderParam.open_key = Utils.encryptOpenKey(orderParam.secretkey, orderParam.timestamp) // 云端数据验证
      Api.getSystemConfig(orderParam).then(res => {
        if (res.status) {
          resolve(res)
        } else {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 5
          })
        }
      })
    })
    mutilForms = mutilForms.map(item => `select '${item.obj_name}' as obj_name,'${item.arr_field}' as arr_field,'${item.LText}' as LText`)
    // 获取生成单号二级菜单
    let defer2 = new Promise(resolve => {
      let _orderDetailSql = `select distinct ModularDetailCode,ModularDetailCode+ModularDetailName as CodeName,ModularCode as BID,Type from sModularDetail where Deleted=0 and Appkey=case when Appkey='' then '' else @Appkey@ end order by ModularDetailCode`
      _orderDetailSql = Utils.formatOptions(_orderDetailSql)
      let orderDetailParam = {
        func: 'sPC_Get_SelectedList',
        LText: _orderDetailSql,
        obj_name: 'data',
        arr_field: 'ModularDetailCode,CodeName,BID,Type'
      }
      orderDetailParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      orderDetailParam.secretkey = Utils.encrypt(orderDetailParam.LText, orderDetailParam.timestamp)
      orderDetailParam.open_key = Utils.encryptOpenKey(orderDetailParam.secretkey, orderDetailParam.timestamp) // 云端数据验证
      Api.getSystemConfig(orderDetailParam).then(res => {
        if (res.status) {
          resolve(res)
        } else {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 5
          })
        }
      })
    })
    Promise.all([defer1, defer2]).then(result => {
      this.setState({
        orderModular: result[0].data,
        orderModularDetail: result[1].data
      })
    })
    // 获取凭证二级菜单
    let defer3 = new Promise(resolve => {
      let _voucherSql = 'select distinct ModularCode as ID,ModularCode+ModularName+ModularNo as NameNO,TypeCharOne from sModular where deleted=0  and Appkey=case when Appkey=\'\' then \'\' else @Appkey@ end  order by ModularCode'
      _voucherSql = Utils.formatOptions(_voucherSql)
      let voucherParam = {
        func: 'sPC_Get_SelectedList',
        LText: _voucherSql,
        obj_name: 'data',
        arr_field: 'ID,NameNO,TypeCharOne'
      }
      voucherParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      voucherParam.secretkey = Utils.encrypt(voucherParam.LText, voucherParam.timestamp)
      voucherParam.open_key = Utils.encryptOpenKey(voucherParam.secretkey, voucherParam.timestamp) // 云端数据验证
      Api.getSystemConfig(voucherParam).then(res => {
        if (res.status) {
          resolve(res)
        } else {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 5
          })
        }
      })
    })
    // 获取凭证三级菜单
    let defer4 = new Promise(resolve => {
      let _voucherDetailSql = 'select distinct ModularDetailCode,ModularDetailCode+ModularDetailName as CodeName,ModularCode as BID, VoucherTypeTwo, IDefine1 from sModularDetail where Deleted=0 and VoucherTypeTwo!=\'\' and Appkey=case when Appkey=\'\' then \'\' else @Appkey@ end  order by ModularDetailCode'
      _voucherDetailSql = Utils.formatOptions(_voucherDetailSql)
      let voucherDetailParam = {
        func: 'sPC_Get_SelectedList',
        LText: _voucherDetailSql,
        obj_name: 'data',
        arr_field: 'ModularDetailCode,CodeName,BID,VoucherTypeTwo,IDefine1'
      }
      voucherDetailParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      voucherDetailParam.secretkey = Utils.encrypt(voucherDetailParam.LText, voucherDetailParam.timestamp)
      voucherDetailParam.open_key = Utils.encryptOpenKey(voucherDetailParam.secretkey, voucherDetailParam.timestamp) // 云端数据验证
      Api.getSystemConfig(voucherDetailParam).then(res => {
        if (res.status) {
          resolve(res)
        } else {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 5
          })
        }
      })
    })
    Promise.all([defer3, defer4]).then(result => {
      this.setState({
        voucher: result[0].data,
        voucherDetail: result[1].data
      })
    })
  }
  getsysScript = () => {
    const { defaultsql } = this.state
    let _scriptSql = `Select distinct func+Remark as funcname,longparam, s.Sort from  s_custom_script s inner join (select OpenID from sapp where ID=@Appkey@) p on s.openid = case when s.appkey='' then s.openid else p.OpenID end order by s.Sort`
    _scriptSql = Utils.formatOptions(_scriptSql)
    let _sParam = {
    let mutilparam = {
      func: 'sPC_Get_SelectedList',
      LText: _scriptSql,
      obj_name: 'data',
      arr_field: 'funcname,longparam'
      LText: mutilForms.join(' union all '),
      obj_name: '',
      arr_field: '',
      table_type: 'Y'
    }
    _sParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
    _sParam.secretkey = Utils.encrypt(_sParam.LText, _sParam.timestamp)
    _sParam.open_key = Utils.encryptOpenKey(_sParam.secretkey, _sParam.timestamp) // 云端数据验证
    Api.getSystemConfig(_sParam).then(res => {
    mutilparam.LText = Utils.formatOptions(mutilparam.LText)
    mutilparam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
    mutilparam.secretkey = Utils.encrypt(mutilparam.LText, mutilparam.timestamp)
    mutilparam.open_key = Utils.encryptOpenKey(mutilparam.secretkey, mutilparam.timestamp)
    Api.getCloudCacheConfig(mutilparam).then(res => {
      if (res.status) {
        let _scripts = []
        if (defaultsql) {
          _scripts.push({
            name: '默认sql',
            value: defaultsql
          })
        }
        res.data.forEach(item => {
          let _item = {
            name: item.funcname,
            value: Utils.UnformatOptions(item.longparam)
          }
          _scripts.push(_item)
        })
        this.setState({
          systemScripts: _scripts
          orderModular: res.modular,
          orderModularDetail: res.modularDetail,
          voucher: res.voucher,
          voucherDetail: res.voucherDetail,
          notes: res.noteCodes.map(item => {
            return {
              name: item.describe,
              value: item.templatecode
            }
          }),
          systemScripts: res.scripts.map(item => {
            return {
              name: item.funcname,
              value: Utils.UnformatOptions(item.longparam)
            }
          })
        })
      } else {
        notification.warning({
@@ -1166,7 +853,7 @@
  }
  uniqueChange = (values) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    let verify = fromJS(this.state.verify).toJS()
    if (values.uuid) {
      verify.uniques = verify.uniques.map(item => {
@@ -1181,13 +868,11 @@
      verify.uniques.push(values)
    }
    this.setState({
      verify: verify
    })
    this.setState({ verify })
  }
  contrastChange = (values) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    let verify = fromJS(this.state.verify).toJS()
    if (values.uuid) {
      verify.contrasts = verify.contrasts.map(item => {
@@ -1202,13 +887,11 @@
      verify.contrasts.push(values)
    }
    this.setState({
      verify: verify
    })
    this.setState({ verify })
  }
  customChange = (values) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    let verify = fromJS(this.state.verify).toJS()
    if (values.uuid) {
      verify.customverifys = verify.customverifys.map(item => {
@@ -1223,13 +906,11 @@
      verify.customverifys.push(values)
    }
    this.setState({
      verify: verify
    })
    this.setState({ verify })
  }
  scriptsChange = (values) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    let verify = fromJS(this.state.verify).toJS()
    if (values.uuid) {
      verify.scripts = verify.scripts.map(item => {
@@ -1244,13 +925,11 @@
      verify.scripts.push(values)
    }
    this.setState({
      verify: verify
    })
    this.setState({ verify })
  }
  orderChange = (values) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    let verify = fromJS(this.state.verify).toJS()
    if (values.uuid) {
      verify.billcodes = verify.billcodes.map(item => {
@@ -1265,8 +944,14 @@
      verify.billcodes.push(values)
    }
    this.setState({ verify })
  }
  onNoteCodeChange = (val) => {
    const { verify } = this.state
    this.setState({
      verify: verify
      verify: {...verify, noteCode: val}
    })
  }
@@ -1294,7 +979,7 @@
      verify.contrasts = verify.contrasts.filter(item => item.uuid !== record.uuid)
    }
    this.setState({ verify: verify })
    this.setState({ verify })
  }
  handleEdit = (record, type) => {
@@ -1327,7 +1012,7 @@
  }
  handleStatus = (record, type) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    let verify = fromJS(this.state.verify).toJS()
    record.status = record.status === 'false' ? 'true' : 'false'
    if (type === 'customverify') {
@@ -1372,13 +1057,11 @@
      })
    }
    this.setState({
      verify: verify
    })
    this.setState({ verify })
  }
  handleUpDown = (record, type, direction) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    let verify = fromJS(this.state.verify).toJS()
    let index = 0
    if (type === 'customverify') {
@@ -1468,9 +1151,7 @@
      }
    }
    this.setState({
      verify: verify
    })
    this.setState({ verify })
  }
  voucherChange = (voucher) => {
@@ -1526,11 +1207,12 @@
  }
  handleConfirm = () => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    const { card } = this.props
    let verify = fromJS(this.state.verify).toJS()
    
    // 表单提交时检查输入值是否正确
    return new Promise((resolve, reject) => {
      if (verify.default === 'false' && verify.scripts.length === 0) {
      if (card.sqlType !== 'custom' && verify.default === 'false' && verify.scripts.length === 0) {
        notification.warning({
          top: 92,
          message: '不执行默认sql时,必须设置自定义脚本!',
@@ -1558,6 +1240,12 @@
        _loading = true
      }
      if (verify.noteEnable === 'true' && !verify.noteCode) { // 开启短信时,需要模板编码
        verify.noteEnable = 'false'
      } else if (verify.noteEnable !== 'true' && verify.noteCode) {
        verify.noteCode = ''
      }
      if (_loading) {
        confirm({
          content: `存在未保存项,确定提交吗?`,
@@ -1583,7 +1271,7 @@
  render() {
    const { card } = this.props
    const { verify, fields, uniqueColumns, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail } = this.state
    const { verify, fields, uniqueColumns, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail, notes } = this.state
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
@@ -1630,6 +1318,51 @@
                    </Radio.Group>
                  </Form.Item>
                </Col>
                <Col span={8}>
                  <Form.Item label={
                    <Tooltip placement="bottomLeft" title={'选择发送短信时,需完善短信设置。'}>
                      <Icon type="question-circle" style={{color: '#c49f47', marginRight: '5px'}} />
                      发送短信
                    </Tooltip>
                  }>
                    <Radio.Group value={verify.noteEnable} onChange={(e) => {this.onOptionChange(e, 'noteEnable')}}>
                      <Radio value="true">开启</Radio>
                      <Radio value="false">不开启</Radio>
                    </Radio.Group>
                  </Form.Item>
                </Col>
                {verify.noteEnable === 'true' ? <Col span={8}>
                  <Form.Item label="短信模板">
                    <Select value={verify.noteCode} onSelect={this.onNoteCodeChange}>
                      {notes.map(option =>
                        <Select.Option key={option.value} value={option.value}>
                          {option.name}
                        </Select.Option>
                      )}
                    </Select>
                  </Form.Item>
                </Col> : null}
                {verify.noteEnable === 'true' ? <Col span={8}>
                  <Form.Item label={
                    <Tooltip placement="bottomLeft" title={'实时发送最多同时发送5个用户,定时发送最多同时发送100个用户。'}>
                      <Icon type="question-circle" style={{color: '#c49f47', marginRight: '5px'}} />
                      发送方式
                    </Tooltip>
                  }>
                    <Radio.Group value={verify.noteType} onChange={(e) => {this.onOptionChange(e, 'noteType')}}>
                      <Radio value="Y">实时</Radio>
                      <Radio value="N">定时</Radio>
                    </Radio.Group>
                  </Form.Item>
                </Col> : null}
                {verify.noteEnable === 'true' ? <Col span={8}>
                  <Form.Item label="短信内容">
                    <Radio.Group value={verify.noteTemp} onChange={(e) => {this.onOptionChange(e, 'noteTemp')}}>
                      <Radio value="Y">相同</Radio>
                      <Radio value="N">不同</Radio>
                    </Radio.Group>
                  </Form.Item>
                </Col> : null}
              </Row>
            </Form>
          </TabPane>
@@ -1752,6 +1485,7 @@
              dict={this.props.dict}
              btn={this.props.card}
              customScripts={verify.scripts}
              defaultsql={this.state.defaultsql}
              systemScripts={this.state.systemScripts}
              scriptsChange={this.scriptsChange}
              wrappedComponentRef={(inst) => this.scriptsForm = inst}