king
2020-10-23 407c0f1765c7d085218a91ad8842784977383d05
src/templates/zshare/verifycard/index.jsx
@@ -1,6 +1,7 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Tabs, Row, Col, Radio, Button, Table, Popconfirm, Icon, notification, Modal, message, InputNumber, Tooltip } from 'antd'
import { fromJS } from 'immutable'
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'
@@ -15,25 +16,31 @@
import './index.scss'
const { TabPane } = Tabs
const { confirm } = Modal
const { Paragraph } = Typography
class VerifyCard extends Component {
  static propTpyes = {
    floor: PropTypes.any,      // 是否为子表
    btnTab: PropTypes.any,     // 表单标签页(按钮)参数
    config: PropTypes.any,     // 表单标签页参数
    dict: PropTypes.object,    // 字典项
    card: PropTypes.object,
    card: PropTypes.object,    // 按钮信息
    columns: PropTypes.array
  }
  state = {
    initsql: '',            // sql验证时变量声明及赋值
    notes: [],              // 短信模板
    verify: {},
    fields: [],
    usefulfields: '',
    defaultsql: '',         // 默认Sql
    orderModular: [],
    orderModularDetail: [],
    voucher: [],
    voucherDetail: [],
    systemScripts: [],
    columnsFields: [],
    uniqueColumns: [
      {
        title: '字段名',
@@ -58,13 +65,13 @@
        render: (text, record) => record.status === 'false' ?
          (
            <div>
              {this.props.dict['header.form.status.forbidden']}
              {this.props.dict['model.status.forbidden']}
              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
            </div>
          ) :
          (
            <div>
              {this.props.dict['header.form.status.open']}
              {this.props.dict['model.status.open']}
              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
            </div>
          )
@@ -76,14 +83,58 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<div>
            <span className="operation-btn" title={this.props.dict['header.edit']} onClick={() => this.handleEdit(record, 'unique')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'unique')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'unique', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'unique', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'unique')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
            <Popconfirm
              title={this.props.dict['header.form.query.delete']}
              okText={this.props.dict['header.confirm']}
              cancelText={this.props.dict['header.cancel']}
              overlayClassName="popover-confirm"
              title={this.props.dict['model.query.delete']}
              onConfirm={() => this.handleDelete(record, 'unique')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
            </Popconfirm>
          </div>)
      }
    ],
    onceUniqueColumns: [
      {
        title: '字段名',
        dataIndex: 'field',
        width: '45%'
      },
      {
        title: '状态',
        dataIndex: 'status',
        width: '30%',
        render: (text, record) => record.status === 'false' ?
          (
            <div>
              {this.props.dict['model.status.forbidden']}
              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
            </div>
          ) :
          (
            <div>
              {this.props.dict['model.status.open']}
              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
            </div>
          )
      },
      {
        title: '操作',
        align: 'center',
        width: '25%',
        dataIndex: 'operation',
        render: (text, record) =>
          (<div>
            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'unique')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'unique', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'unique', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'unique')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
            <Popconfirm
              overlayClassName="popover-confirm"
              title={this.props.dict['model.query.delete']}
              onConfirm={() => this.handleDelete(record, 'unique')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
@@ -124,13 +175,13 @@
        render: (text, record) => record.status === 'false' ?
          (
            <div>
              {this.props.dict['header.form.status.forbidden']}
              {this.props.dict['model.status.forbidden']}
              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
            </div>
          ) :
          (
            <div>
              {this.props.dict['header.form.status.open']}
              {this.props.dict['model.status.open']}
              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
            </div>
          )
@@ -142,14 +193,13 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<div>
            <span className="operation-btn" title={this.props.dict['header.edit']} onClick={() => this.handleEdit(record, 'contrast')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'contrast')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'contrast', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'contrast', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'contrast')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
            <Popconfirm
              title={this.props.dict['header.form.query.delete']}
              okText={this.props.dict['header.confirm']}
              cancelText={this.props.dict['header.cancel']}
              overlayClassName="popover-confirm"
              title={this.props.dict['model.query.delete']}
              onConfirm={() => this.handleDelete(record, 'contrast')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
@@ -161,7 +211,10 @@
      {
        title: 'SQL',
        dataIndex: 'sql',
        width: '45%'
        width: '45%',
        render: (text) => (
          <Paragraph copyable ellipsis={{ rows: 5, expandable: true }}>{text}</Paragraph>
        )
      },
      {
        title: '结果处理',
@@ -185,13 +238,13 @@
        render: (text, record) => record.status === 'false' ?
          (
            <div>
              {this.props.dict['header.form.status.forbidden']}
              {this.props.dict['model.status.forbidden']}
              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
            </div>
          ) :
          (
            <div>
              {this.props.dict['header.form.status.open']}
              {this.props.dict['model.status.open']}
              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
            </div>
          )
@@ -203,14 +256,13 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<div>
            <span className="operation-btn" title={this.props.dict['header.edit']} onClick={() => this.handleEdit(record, 'customverify')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'customverify')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'customverify', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'customverify', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'customverify')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
            <Popconfirm
              title={this.props.dict['header.form.query.delete']}
              okText={this.props.dict['header.confirm']}
              cancelText={this.props.dict['header.cancel']}
              overlayClassName="popover-confirm"
              title={this.props.dict['model.query.delete']}
              onConfirm={() => this.handleDelete(record, 'customverify')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
@@ -222,7 +274,24 @@
      {
        title: 'SQL',
        dataIndex: 'sql',
        width: '70%'
        width: '60%',
        render: (text) => (
          <Paragraph copyable ellipsis={{ rows: 5, expandable: true }}>{text}</Paragraph>
        )
      },
      {
        title: '执行位置',
        dataIndex: 'position',
        width: '10%',
        render: (text, record) => {
          if (record.position === 'init') {
            return '初始化'
          } else if (record.position === 'front') {
            return 'sql前'
          } else {
            return 'sql后'
          }
        }
      },
      {
        title: '状态',
@@ -231,13 +300,13 @@
        render: (text, record) => record.status === 'false' ?
          (
            <div>
              {this.props.dict['header.form.status.forbidden']}
              {this.props.dict['model.status.forbidden']}
              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
            </div>
          ) :
          (
            <div>
              {this.props.dict['header.form.status.open']}
              {this.props.dict['model.status.open']}
              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
            </div>
          )
@@ -249,14 +318,13 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<div>
            <span className="operation-btn" title={this.props.dict['header.edit']} onClick={() => this.handleEdit(record, 'scripts')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'scripts')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'scripts', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'scripts', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'scripts')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
            <Popconfirm
              title={this.props.dict['header.form.query.delete']}
              okText={this.props.dict['header.confirm']}
              cancelText={this.props.dict['header.cancel']}
              overlayClassName="popover-confirm"
              title={this.props.dict['model.query.delete']}
              onConfirm={() => this.handleDelete(record, 'scripts')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
@@ -268,13 +336,13 @@
      {
        title: this.props.dict['header.form.funcvar'],
        dataIndex: 'fieldName',
        width: '13%',
        width: '12%',
        render: (text, record) => (`${record.fieldName || ''}(${record.field})`)
      },
      {
        title: '类型',
        dataIndex: 'billType',
        width: '8%',
        width: '6%',
      },
      {
        title: '凭证类型',
@@ -289,13 +357,13 @@
      {
        title: '关联字段',
        dataIndex: 'linkFieldName',
        width: '12%',
        width: '10%',
        render: (text, record) => (record.linkField ? `${record.linkFieldName || ''}(${record.linkField})` : '')
      },
      {
        title: '位数',
        dataIndex: 'Type',
        width: '8%'
        width: '6%'
      },
      {
        title: '示例',
@@ -324,19 +392,24 @@
        }
      },
      {
        title: '标识',
        dataIndex: 'mark',
        width: '8%'
      },
      {
        title: '状态',
        dataIndex: 'status',
        width: '9%',
        width: '8%',
        render: (text, record) => record.status === 'false' ?
          (
            <div>
              {this.props.dict['header.form.status.forbidden']}
              {this.props.dict['model.status.forbidden']}
              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
            </div>
          ) :
          (
            <div>
              {this.props.dict['header.form.status.open']}
              {this.props.dict['model.status.open']}
              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
            </div>
          )
@@ -348,14 +421,13 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<div>
            <span className="operation-btn" title={this.props.dict['header.edit']} onClick={() => this.handleEdit(record, 'ordercode')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'ordercode')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'ordercode', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'ordercode', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'ordercode')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
            <Popconfirm
              title={this.props.dict['header.form.query.delete']}
              okText={this.props.dict['header.confirm']}
              cancelText={this.props.dict['header.cancel']}
              overlayClassName="popover-confirm"
              title={this.props.dict['model.query.delete']}
              onConfirm={() => this.handleDelete(record, 'ordercode')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
@@ -366,16 +438,22 @@
  }
  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
    if (!_invalid) { // 选择行时,失效验证默认开启
      _invalid = card.Ot !== 'notRequired' ? 'true' : 'false'
    }
    if (card.sqlType === 'custom') { // 自定义验证时,不使用默认sql
      _verify.default = 'false'
    }
    _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 || []
@@ -389,260 +467,393 @@
      verify: _verify
    })
    if (this.props.card.btnType) { // 按钮-表单标签页
    new Promise(resolve => {
      let _fields = []
      config.groups.forEach(group => {
        _fields.push(...group.sublist)
      })
      let _usefulfields = ['BID', 'ID', 'LoginUID', 'SessionUid', 'UserID', 'Appkey']
      _fields.forEach(_f => {
        if (_f.field) {
          _usefulfields.push(_f.field)
        }
      })
      if (columns && columns.length > 0 && this.props.btnTab.Ot !== 'notRequired') {
        columns.forEach(_f => {
          if (_f.field) {
            _usefulfields.push(_f.field)
          }
      if (config.Template === 'FormTab') {
        config.groups.forEach(group => {
          _fields.push(...group.sublist)
        })
      }
      _usefulfields = Array.from(new Set(_usefulfields))
      _usefulfields = _usefulfields.join(', ')
      this.setState({
        fields: _fields,
        usefulfields: _usefulfields
      })
      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) 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']
          let hasBid = false
          _fields.forEach(_f => {
            if (_f.field) {
              _usefulfields.push(_f.field)
            }
            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') {
            columns.forEach(_f => {
              if (_f.field) {
                _usefulfields.push(_f.field)
              }
            })
          }
          _usefulfields = Array.from(new Set(_usefulfields))
          _usefulfields = _usefulfields.join(', ')
          this.setState({
            fields: _fields,
            usefulfields: _usefulfields
        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 {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 10
          })
          _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 (fieldArr.includes(_f.field.toLowerCase())) return
        fieldArr.push(_f.field.toLowerCase())
        _usefulfields.push(_f.field)
        let _fieldlen = _f.fieldlength || 50
        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.toLowerCase() === 'bid') {
          hasBid = true
        }
      })
    } else {
      let _usefulfields = ['BID', 'ID', 'LoginUID', 'SessionUid', 'UserID', 'Appkey', 'UserName', 'FullName']
      if (columns && columns.length > 0 && this.props.card.Ot !== 'notRequired') {
        columns.forEach(_f => {
          if (_f.field) {
            _usefulfields.push(_f.field)
      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
          fieldArr.push(_f.field.toLowerCase())
          _usefulfields.push(_f.field)
          if (_f.datatype) { // 自定义字段
            if (/decimal/ig.test(_f.datatype)) {
              _select.push(`@${_f.field}=0`)
            } else {
              _select.push(`@${_f.field}=''`)
            }
            _declare.push(`@${_f.field} ${_f.datatype}`)
            return
          }
          let _fieldlen = _f.fieldlength || 50
          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 = Array.from(new Set(_usefulfields))
      _usefulfields = _usefulfields.join(', ')
      let _sql = `Declare ${_declare.join(', ')}
        Select ${_select.join(', ')}
      `
      // 默认sql
      let _defaultsql = ''
      let _insertsql = ''
      let _updatesql = ''
      if (card.sqlType === 'insert' || card.sqlType === 'insertOrUpdate') {
        let keys = []
        let values = []
        _fields.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(', ')
        _insertsql = `insert into ${card.sql} (${keys}) select ${values};`
      }
      if (card.sqlType === 'update' || card.sqlType === 'audit' || card.sqlType === 'insertOrUpdate') {
        let _form = []
        let _arr = []
        _fields.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(', ')
        _updatesql = `update ${card.sql} set ${_form} where ${config.setting.primaryKey}${card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
      }
      if (card.sqlType === 'insert') {
        _defaultsql = _insertsql
      } else if (card.sqlType === 'update' || card.sqlType === 'audit') {
        _defaultsql = _updatesql
      } else if (card.sqlType === 'insertOrUpdate') {
        _defaultsql += `select @tbid=''
          select @tbid='X' from ${card.sql} where ${config.setting.primaryKey}=@ID@
          if @tbid=''
            begin
            ${_insertsql}
            end
          else
            begin
            ${_updatesql}
            end
        `
      } 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 && card.Ot !== 'notRequired' && card.Ot !== 'requiredOnce') {
          let _index = 0
          columns.forEach(col => {
            if (!col.field || col.Hide === 'true' || _index >= 4) return
            _msg += col.label + '=\'\','
            _index++
          })
        }
        _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({
        usefulfields: _usefulfields
        fields: _fields,
        columnsFields: _columns,
        initsql: _sql,
        defaultsql: _defaultsql,
        usefulfields: _usefulfields.join(', ')
      })
    }
    })
  }
  componentDidMount() {
    // 获取生成单号一级菜单
    let defer1 = new Promise(resolve => {
      let _orderSql = 'select ID,ModularCode+ModularName+ModularNo as NameNO from sModular where deleted=0 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') + '.000'
      orderParam.secretkey = Utils.encrypt(orderParam.LText, orderParam.timestamp)
      Api.getSystemConfig(orderParam).then(res => {
        if (res.status) {
          resolve(res)
        } else {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 10
    mutilForms = mutilForms.map(item => `select '${item.obj_name}' as obj_name,'${item.arr_field}' as arr_field,'${item.LText}' as LText`)
    let mutilparam = {
      func: 'sPC_Get_SelectedList',
      LText: mutilForms.join(' union all '),
      obj_name: '',
      arr_field: '',
      table_type: 'Y'
    }
    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) {
        this.setState({
          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)
            }
          })
        }
      })
    })
    // 获取生成单号二级菜单
    let defer2 = new Promise(resolve => {
      let _orderDetailSql = 'select ModularDetailCode,ModularDetailCode+ModularDetailName as CodeName,BID,Type from sModularDetail where Deleted=0'
      _orderDetailSql = Utils.formatOptions(_orderDetailSql)
      let orderDetailParam = {
        func: 'sPC_Get_SelectedList',
        LText: _orderDetailSql,
        obj_name: 'data',
        arr_field: 'ModularDetailCode,CodeName,BID,Type'
        })
      } else {
        notification.warning({
          top: 92,
          message: res.message,
          duration: 5
        })
      }
      orderDetailParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
      orderDetailParam.secretkey = Utils.encrypt(orderDetailParam.LText, orderDetailParam.timestamp)
      Api.getSystemConfig(orderDetailParam).then(res => {
        if (res.status) {
          resolve(res)
        } else {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 10
          })
        }
      })
    })
    Promise.all([defer1, defer2]).then(result => {
      this.setState({
        orderModular: result[0].data,
        orderModularDetail: result[1].data
      })
    })
    // 获取凭证二级菜单
    let defer3 = new Promise(resolve => {
      let _voucherSql = 'select ID,ModularCode+ModularName+ModularNo as NameNO,TypeCharOne from sModular where deleted=0'
      _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') + '.000'
      voucherParam.secretkey = Utils.encrypt(voucherParam.LText, voucherParam.timestamp)
      Api.getSystemConfig(voucherParam).then(res => {
        if (res.status) {
          resolve(res)
        } else {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 10
          })
        }
      })
    })
    // 获取凭证三级菜单
    let defer4 = new Promise(resolve => {
      let _voucherDetailSql = 'select ModularDetailCode,ModularDetailCode+ModularDetailName as CodeName,BID, VoucherTypeTwo, IDefine1 from sModularDetail where Deleted=0 and VoucherTypeTwo!=\'\''
      _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') + '.000'
      voucherDetailParam.secretkey = Utils.encrypt(voucherDetailParam.LText, voucherDetailParam.timestamp)
      Api.getSystemConfig(voucherDetailParam).then(res => {
        if (res.status) {
          resolve(res)
        } else {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 10
          })
        }
      })
    })
    Promise.all([defer3, defer4]).then(result => {
      this.setState({
        voucher: result[0].data,
        voucherDetail: result[1].data
      })
    })
  }
  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 => {
@@ -657,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 => {
@@ -678,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 => {
@@ -699,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 => {
@@ -720,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 => {
@@ -741,8 +944,14 @@
      verify.billcodes.push(values)
    }
    this.setState({ verify })
  }
  onNoteCodeChange = (val) => {
    const { verify } = this.state
    this.setState({
      verify: verify
      verify: {...verify, noteCode: val}
    })
  }
@@ -770,7 +979,7 @@
      verify.contrasts = verify.contrasts.filter(item => item.uuid !== record.uuid)
    }
    this.setState({ verify: verify })
    this.setState({ verify })
  }
  handleEdit = (record, type) => {
@@ -803,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') {
@@ -848,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') {
@@ -944,9 +1151,7 @@
      }
    }
    this.setState({
      verify: verify
    })
    this.setState({ verify })
  }
  voucherChange = (voucher) => {
@@ -976,13 +1181,13 @@
        className: 'notification-custom-error',
        top: 92,
        message: '执行失败!',
        duration: 15
        duration: 10
      })
    } else if (errorType === 'N') {
      notification.error({
        top: 92,
        message: '执行失败!',
        duration: 15
        duration: 10
      })
    } else if (errorType === 'E') {
      Modal.error({
@@ -1001,6 +1206,60 @@
    })
  }
  handleConfirm = () => {
    const { card } = this.props
    let verify = fromJS(this.state.verify).toJS()
    // 表单提交时检查输入值是否正确
    return new Promise((resolve, reject) => {
      if (card.sqlType !== 'custom' && verify.default === 'false' && verify.scripts.length === 0) {
        notification.warning({
          top: 92,
          message: '不执行默认sql时,必须设置自定义脚本!',
          duration: 5
        })
        return
      }
      let _loading = false
      if (this.customForm && this.customForm.state.editItem) {
        _loading = true
      } else if (this.uniqueForm && this.uniqueForm.state.editItem) {
        _loading = true
      } else if (this.orderForm && this.orderForm.state.editItem) {
        _loading = true
      } else if (this.scriptsForm && this.scriptsForm.state.editItem) {
        _loading = true
      } else if (this.contrastForm && this.contrastForm.state.editItem) {
        _loading = true
      }
      if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql')) {
        _loading = true
      } else if (this.customForm && this.customForm.props.form.getFieldValue('sql')) {
        _loading = true
      }
      if (verify.noteEnable === 'true' && !verify.noteCode) { // 开启短信时,需要模板编码
        verify.noteEnable = 'false'
      } else if (verify.noteEnable !== 'true' && verify.noteCode) {
        verify.noteCode = ''
      }
      if (_loading) {
        confirm({
          content: `存在未保存项,确定提交吗?`,
          onOk() {
            resolve(verify)
          },
          onCancel() {}
        })
      } else {
        resolve(verify)
      }
    })
  }
  /**
   * @description 组件销毁,清除state更新
   */
@@ -1011,7 +1270,8 @@
  }
  render() {
    const { verify, fields, uniqueColumns, contrastColumns, customColumns, orderColumns, scriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail } = this.state
    const { card } = this.props
    const { verify, fields, uniqueColumns, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail, notes } = this.state
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
@@ -1023,18 +1283,13 @@
      }
    }
    let display = false
    if (this.props.card.intertype === 'inner' && !this.props.card.innerFunc) {
      display = true
    }
    return (
      <div id="verify-card-box-tab">
        {display ? <Tabs defaultActiveKey="1" className="verify-card-box">
        {card.intertype === 'system' ? <Tabs defaultActiveKey="1" className="verify-card-box">
          <TabPane tab="基础验证" key="1">
            <Form {...formItemLayout}>
              <Row gutter={24}>
                <Col span={8}>
                {this.props.card.sqlType !== 'custom' ? <Col span={8}>
                  <Form.Item label={
                    <Tooltip placement="bottomLeft" title={'默认sql执行顺序为自定义脚本之前'}>
                      <Icon type="question-circle" style={{color: '#c49f47', marginRight: '5px'}} />
@@ -1046,7 +1301,7 @@
                      <Radio value="false">不执行</Radio>
                    </Radio.Group>
                  </Form.Item>
                </Col>
                </Col> : null}
                <Col span={8}>
                  <Form.Item label={'账期验证'}>
                    <Radio.Group value={verify.accountdate} onChange={(e) => {this.onOptionChange(e, 'accountdate')}}>
@@ -1063,10 +1318,60 @@
                    </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>
          <TabPane tab="比较验证" key="2x">
          <TabPane tab={
            <span>
              比较验证
              {verify.contrasts.length ? <span className="count-tip">{verify.contrasts.length}</span> : null}
            </span>
          } key="2x">
            <ContrastForm
              dict={this.props.dict}
              contrastChange={this.contrastChange}
@@ -1081,25 +1386,16 @@
              pagination={false}
            />
          </TabPane>
          <TabPane tab="唯一性验证" key="2">
            <UniqueForm
              fields={fields}
              dict={this.props.dict}
              uniqueChange={this.uniqueChange}
              wrappedComponentRef={(inst) => this.uniqueForm = inst}
            />
            <Table
              bordered
              rowKey="uuid"
              className="custom-table"
              dataSource={verify.uniques}
              columns={uniqueColumns}
              pagination={false}
            />
          </TabPane>
          <TabPane tab="自定义验证" key="3">
          <TabPane tab={
            <span>
              自定义验证
              {verify.customverifys.length ? <span className="count-tip">{verify.customverifys.length}</span> : null}
            </span>
          } key="3">
            <CustomForm
              dict={this.props.dict}
              btn={this.props.card}
              initsql={this.state.initsql}
              usefulfields={this.state.usefulfields}
              customChange={this.customChange}
              wrappedComponentRef={(inst) => this.customForm = inst}
@@ -1113,7 +1409,12 @@
              pagination={false}
            />
          </TabPane>
          <TabPane tab="单号生成" key="4">
          <TabPane tab={
            <span>
              单号生成
              {verify.billcodes.length ? <span className="count-tip">{verify.billcodes.length}</span> : null}
            </span>
          } key="4">
            <BillcodeForm
              fields={fields}
              btn={this.props.card}
@@ -1134,7 +1435,34 @@
              pagination={false}
            />
          </TabPane>
          <TabPane tab="创建凭证" key="5">
          <TabPane tab={
            <span>
              {card.Ot !== 'requiredOnce' ? '唯一性验证' : '同类数据验证'}
              {verify.uniques.length ? <span className="count-tip">{verify.uniques.length}</span> : null}
            </span>
          } key="2">
            <UniqueForm
              btn={card}
              fields={card.Ot !== 'requiredOnce' ? fields : columnsFields}
              dict={this.props.dict}
              uniqueChange={this.uniqueChange}
              wrappedComponentRef={(inst) => this.uniqueForm = inst}
            />
            <Table
              bordered
              rowKey="uuid"
              className="custom-table"
              dataSource={verify.uniques}
              columns={card.Ot !== 'requiredOnce' ? uniqueColumns : onceUniqueColumns}
              pagination={false}
            />
          </TabPane>
          <TabPane tab={
            <span>
              创建凭证
              {verify.voucher && verify.voucher.enabled ? <span className="count-tip">1</span> : null}
            </span>
          } key="5">
            <VoucherForm
              dict={this.props.dict}
              voucher={voucher}
@@ -1145,10 +1473,20 @@
              wrappedComponentRef={(inst) => this.voucherForm = inst}
            />
          </TabPane>
          <TabPane tab="自定义脚本" key="6">
          <TabPane tab={
            <span>
              自定义脚本
              {verify.scripts.length ? <span className="count-tip">{verify.scripts.length}</span> : null}
            </span>
          } key="6">
            <CustomScript
              usefulfields={this.state.usefulfields}
              initsql={this.state.initsql}
              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}
            />
@@ -1199,7 +1537,7 @@
                </Col>
                <Col span={8}>
                  <Form.Item label={'停留时间'}>
                    <InputNumber defaultValue={verify.ntime || 15} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ntime')}} />
                    <InputNumber defaultValue={verify.ntime || 10} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ntime')}} />
                  </Form.Item>
                </Col>
              </Row>
@@ -1214,7 +1552,7 @@
                </Col>
                <Col span={8}>
                  <Form.Item label={'停留时间'}>
                    <InputNumber defaultValue={verify.ftime || 15} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ftime')}} />
                    <InputNumber defaultValue={verify.ftime || 10} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ftime')}} />
                  </Form.Item>
                </Col>
              </Row>
@@ -1249,7 +1587,7 @@
            </Form>
          </TabPane>
        </Tabs> : null}
        {!display ? <Tabs defaultActiveKey="7" className="verify-card-box">
        {card.intertype !== 'system' ? <Tabs defaultActiveKey="7" className="verify-card-box">
          <TabPane tab="信息提示" key="7">
            <Form {...formItemLayout}>
              <Row gutter={24}>
@@ -1288,7 +1626,7 @@
                </Col>
                <Col span={8}>
                  <Form.Item label={'停留时间'}>
                    <InputNumber defaultValue={verify.ntime || 15} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ntime')}} />
                    <InputNumber defaultValue={verify.ntime || 10} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ntime')}} />
                  </Form.Item>
                </Col>
              </Row>
@@ -1303,7 +1641,7 @@
                </Col>
                <Col span={8}>
                  <Form.Item label={'停留时间'}>
                    <InputNumber defaultValue={verify.ftime || 15} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ftime')}} />
                    <InputNumber defaultValue={verify.ftime || 10} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ftime')}} />
                  </Form.Item>
                </Col>
              </Row>