king
2024-05-23 9a11e62adeb8d435b52a361eb62d5b59e1deef2a
src/templates/zshare/verifycard/index.jsx
@@ -2,14 +2,13 @@
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Form, Tabs, Row, Col, Button, Popconfirm, notification, Modal, message, InputNumber, Typography } from 'antd'
import { CheckCircleOutlined, StopOutlined, EditOutlined, SwapOutlined, DeleteOutlined, ExclamationOutlined, BorderOutlined } from '@ant-design/icons'
import { CheckCircleOutlined, StopOutlined, EditOutlined, SwapOutlined, DeleteOutlined, ExclamationOutlined, ConsoleSqlOutlined } from '@ant-design/icons'
import Toast from 'antd-mobile/es/components/toast'
import Dialog from 'antd-mobile/es/components/dialog'
import moment from 'moment'
import Api from '@/api'
import Utils from '@/utils/utils.js'
import options from '@/store/options.js'
import BaseForm from './baseform'
import UniqueForm from './uniqueform'
import ContrastForm from './contrastform'
@@ -19,21 +18,19 @@
import BillcodeForm from './billcodeform'
import VoucherForm from './voucherform'
import asyncComponent from '@/utils/asyncComponent'
import { updateForm } from '@/utils/utils-update.js'
// import { updateForm } from '@/utils/utils-update.js'
import MKEmitter from '@/utils/events.js'
import MinView from '@/assets/img/minview.png'
import './index.scss'
const { TabPane } = Tabs
const { confirm } = Modal
const { Paragraph } = Typography
const EditTable = asyncComponent(() => import('@/templates/zshare/editTable'))
const FullScripts = asyncComponent(() => import('./fullScripts'))
class VerifyCard extends Component {
  static propTpyes = {
    btnTab: PropTypes.any,     // 表单标签页(按钮)参数
    config: PropTypes.any,     // 表单标签页参数
    dict: PropTypes.object,    // 字典项
    card: PropTypes.object,    // 按钮信息
    columns: PropTypes.array
  }
@@ -44,12 +41,11 @@
    activeKey: 'base',
    appType: sessionStorage.getItem('appType'),
    notes: [],              // 短信模板
    setting: null,
    visible: false,
    scriptId: '',
    emailCodes: [],         // 邮箱模板
    verify: {},
    fields: [],
    usefulfields: '',
    formfields: '',
    colfields: '',
    defaultsql: '',         // 默认Sql
    orderModular: [],
    orderModularDetail: [],
@@ -90,7 +86,7 @@
        title: '验证类型',
        dataIndex: 'verifyType',
        width: '14%',
        render: (text, record) => record.verifyType === 'logic' ? '逻辑验证' : '物理验证',
        render: (text) => text === 'logic' ? '逻辑验证' : '物理验证',
        inputType: 'select',
        editable: true,
        options: [
@@ -118,6 +114,34 @@
              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
            </div>
          )
      },
      {
        dataIndex: 'sqlRender',
        render: (record) => {
          let _fieldValue = []
          let _value = []
          let _labels = record.fieldlabel.split(',')
          record.field.split(',').forEach((_field, index) => {
            let _key = _field.toLowerCase()
            _fieldValue.push(`${_key}=${_key === 'bid' ? '@BID@' : `''`}`)
            _value.push(`${_labels[index] || ''}:xxx`)
          })
          let _verifyType = ''
          if (record.verifyType === 'logic') {
            _verifyType = ' and deleted=0'
          }
          let sql = `select @tbid='', @ErrorCode='',@retmsg=''
          select @tbid='X' from ${this.props.card.sql} where ${_fieldValue.join(' and ')}${_verifyType}
          If @tbid!=''
          Begin
            select @ErrorCode='${record.errorCode}',@retmsg='${_value.join(', ')} 已存在'
            goto aaa
          end`
          return sql.split(/\n\s{10}/ig).map(n => n.replace(/^\s{2}/ig, '&nbsp;&nbsp;'))
        }
      }
    ],
    onceUniqueColumns: [
@@ -155,6 +179,27 @@
            </div>
          )
      },
      {
        dataIndex: 'sqlRender',
        render: (record) => {
          let primaryKey = 'id'
          if (this.props.config && this.props.config.setting && this.props.config.setting.primaryKey) {
            primaryKey = this.props.config.setting.primaryKey
          }
          let sql = `Set @tbid=''
          Select top 1 @tbid='X' from (select distinct ${record.field},1 as n from (数据源) tb inner join (select ID from  dbo.SplitComma(@ID@)) sp on tb.${primaryKey}=sp.ID ) a having sum(n)>1
          If @tbid!=''
          Begin
            Set @ErrorCode='E' Set @retmsg='${record.fieldlabel} 值不唯一'
            goto aaa
          end`
          return sql.split(/\n\s{10}/ig).map(n => n.replace(/^\s{2}/ig, '&nbsp;&nbsp;'))
        }
      }
    ],
    contrastColumns: [
      {
@@ -167,7 +212,7 @@
      {
        title: '运算符',
        dataIndex: 'operator',
        width: '14%',
        width: '13%',
        editable: true,
        inputType: 'select',
        options: [
@@ -191,14 +236,14 @@
      {
        title: '提示信息',
        dataIndex: 'errmsg',
        width: '14%',
        width: '13%',
        inputType: 'input',
        editable: true
      },
      {
        title: '报错编码',
        dataIndex: 'errorCode',
        width: '14%',
        width: '13%',
        editable: true,
        inputType: 'select',
        options: [
@@ -228,6 +273,18 @@
              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
            </div>
          )
      },
      {
        dataIndex: 'sqlRender',
        render: (record) => {
          let sql = `If ${record.frontfield} ${record.operator} ${record.backfield}
          Begin
            select @ErrorCode='${record.errorCode}',@retmsg='${record.errmsg}'
            goto aaa
          end`
          return sql.split(/\n\s{10}/ig).map(n => n.replace(/^\s{2}/ig, '&nbsp;&nbsp;'))
        }
      }
    ],
    customColumns: [
@@ -288,11 +345,11 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<div style={{textAlign: 'center'}}>
            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'customverify')} style={{color: '#1890ff'}}><EditOutlined /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'customverify')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
            <span className="operation-btn" title="编辑" onClick={() => this.handleEdit(record, 'customverify')} style={{color: '#1890ff'}}><EditOutlined /></span>
            <span className="operation-btn" title="状态切换" onClick={() => this.handleStatus(record, 'customverify')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
            <Popconfirm
              overlayClassName="popover-confirm"
              title={this.props.dict['model.query.delete']}
              title="确定删除吗?"
              onConfirm={() => this.handleDelete(record, 'customverify')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
@@ -357,11 +414,11 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<div style={{textAlign: 'center'}}>
            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'scripts')} style={{color: '#1890ff'}}><EditOutlined /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'scripts')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
            <span className="operation-btn" title="编辑" onClick={() => this.handleEdit(record, 'scripts')} style={{color: '#1890ff'}}><EditOutlined /></span>
            <span className="operation-btn" title="状态切换" onClick={() => this.handleStatus(record, 'scripts')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
            <Popconfirm
              overlayClassName="popover-confirm"
              title={this.props.dict['model.query.delete']}
              title="确定删除吗?"
              onConfirm={() => this.handleDelete(record, 'scripts')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
@@ -424,11 +481,11 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<div style={{textAlign: 'center'}}>
            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'cbscripts')} style={{color: '#1890ff'}}><EditOutlined /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'cbscripts')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
            <span className="operation-btn" title="编辑" onClick={() => this.handleEdit(record, 'cbscripts')} style={{color: '#1890ff'}}><EditOutlined /></span>
            <span className="operation-btn" title="状态切换" onClick={() => this.handleStatus(record, 'cbscripts')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
            <Popconfirm
              overlayClassName="popover-confirm"
              title={this.props.dict['model.query.delete']}
              title="确定删除吗?"
              onConfirm={() => this.handleDelete(record, 'cbscripts')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
@@ -438,7 +495,7 @@
    ],
    orderColumns: [
      {
        title: this.props.dict['header.form.funcvar'],
        title: '函数变量',
        dataIndex: 'fieldName',
        width: '12%',
        render: (text, record) => (`${record.fieldName || ''}(${record.field})`)
@@ -525,38 +582,61 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<div style={{textAlign: 'center'}}>
            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'ordercode')} style={{color: '#1890ff'}}><EditOutlined /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'ordercode')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
            <span className="operation-btn" title="编辑" onClick={() => this.handleEdit(record, 'ordercode')} style={{color: '#1890ff'}}><EditOutlined /></span>
            <span className="operation-btn" title="状态切换" onClick={() => this.handleStatus(record, 'ordercode')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
            <Popconfirm
              overlayClassName="popover-confirm"
              title={this.props.dict['model.query.delete']}
              title="确定删除吗?"
              onConfirm={() => this.handleDelete(record, 'ordercode')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
            </Popconfirm>
            <span className="operation-btn" title="SQL" onClick={() => this.orderSql(record)} style={{color: '#1890ff'}}><ConsoleSqlOutlined /></span>
          </div>)
      }
    ]
  }
  UNSAFE_componentWillMount() {
    const { columns, config, card, btnTab } = this.props
    const { columns, config, card } = this.props
    const { appType } = this.state
    let _verify = fromJS(card.verify || {}).toJS()
    let _invalid = _verify.invalid
    let _invalid = _verify.invalid || 'true'
    if (!_invalid) { // 选择行时,失效验证默认开启
      _invalid = card.Ot !== 'notRequired' ? 'true' : 'false'
    _verify.limitInvalid = false
    if (config.wrap && config.wrap.datatype === 'public') {
      _verify.limitInvalid = true
      _verify.limitText = '公共数据源,不可使用失效验证'
      _invalid = 'false'
    } else if (config.wrap && config.wrap.datatype === 'static') {
      _verify.limitInvalid = true
      _verify.limitText = '静态数据源,不可使用失效验证'
      _invalid = 'false'
    } else if (config.setting && config.setting.maxScript && config.setting.maxScript >= 300) {
      _verify.limitInvalid = true
      _verify.limitText = '数据源中自定义脚本过于复杂,不能使用失效验证!'
      _invalid = 'false'
    } else if (card.sqlType === 'insert') {
      _verify.limitInvalid = true
      _verify.limitText = '按钮操作类型为《添加》时,不能使用失效验证!'
      _invalid = 'false'
    } else if (card.Ot === 'notRequired') {
      _verify.limitInvalid = true
      _verify.limitText = '按钮《不选择行》时,不能使用失效验证!'
      _invalid = 'false'
    }
    if (card.sqlType === 'custom') { // 自定义验证时,不使用默认sql
      _verify.default = 'false'
    }
    _verify.default = _verify.default || 'true'
    _verify.wxNote = _verify.wxNote || 'false'         // 公众号消息推送是否开启
    _verify.noteEnable = _verify.noteEnable || 'false' // 短信发送是否开启
    _verify.noteType = _verify.noteType || 'N'         // 短信发送模式:Y(实时)、N(定时)
    _verify.noteTemp = _verify.noteTemp || 'Y'         // 短信发送模板:Y(相同)、N(不同)
    _verify.wxNote = _verify.wxNote || 'false'           // 公众号消息推送是否开启
    _verify.noteEnable = _verify.noteEnable || 'false'   // 短信发送是否开启
    _verify.emailEnable = _verify.emailEnable || 'false' // 邮件发送是否开启
    _verify.printEnable = _verify.printEnable || 'false' // 单据打印是否开启
    _verify.preHandle = _verify.preHandle || 'false'     // 按钮预处理是否开启
    _verify.invalid = _invalid
    _verify.uniques = _verify.uniques || []
    _verify.contrasts = _verify.contrasts || []
@@ -568,6 +648,22 @@
    _verify.voucher = _verify.voucher || {enabled: false}
    _verify.scripts = _verify.scripts || []
    _verify.cbScripts = _verify.cbScripts || []
    if (window.GLOB.process && card.intertype !== 'inner') {
      _verify.workFlow = _verify.workFlow || 'false'
      _verify.flowType = _verify.flowType || (card.sqlType === 'insert' ? 'start' : 'approval')
      _verify.flowSql = _verify.flowSql || 'true'
    } else {
      delete _verify.workFlow
      delete _verify.flowRemark
      delete _verify.flowType
      delete _verify.flowSql
    }
    if (appType === 'mob') {
      _verify.printEnable = 'false'
      _verify.printTempId = ''
    }
    if (window.GLOB.funcs && window.GLOB.funcs.length > 0) {
      window.GLOB.funcs.forEach(m => {
@@ -604,363 +700,356 @@
    this.setState({
      activeKey: activeKey,
      verifyInter: verifyInter,
      setting: config.setting || {},
      verify: _verify,
      oriVerify: fromJS(_verify).toJS()
    })
    if (config.Template !== 'FormTab' && card.intertype === 'inner') {
      return
    if (card.intertype === 'inner') return
    let _fields = []
    if (card.OpenType === 'form') {
      _fields.push({
        field: card.field,
        label: card.label,
        type: 'text'
      })
    } else if (card.modal && (card.OpenType === 'pop' || !card.OpenType)) {
      _fields = card.modal.fields || []
    }
    new Promise(resolve => {
      let _fields = []
      if (card.OpenType === 'form') {
        _fields.push({
          field: card.field,
          label: card.label,
          type: 'text'
        })
        resolve(_fields)
      } else if (config.Template === 'FormTab') {
        config.groups.forEach(group => {
          _fields.push(...group.sublist)
        })
        resolve(_fields)
      } else if (card.modal) {
        _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) {
              message.warning('未获取到表单信息,部分验证将无法设置!')
            } else {
              _LongParam = updateForm(_LongParam)
              _fields = _LongParam.fields || []
            }
          } else {
            notification.warning({
              top: 92,
              message: res.message,
              duration: 5
            })
          }
          resolve(_fields)
        })
      } else {
        resolve(_fields)
    let sysfields = ['UserName', 'FullName', 'RoleID', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode', 'tbid', 'mk_deleted', 'bid']
    let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@RoleID nvarchar(512)', '@mk_departmentcode nvarchar(512)', '@mk_organization nvarchar(512)', '@mk_user_type nvarchar(20)', '@mk_nation nvarchar(50)', '@mk_province nvarchar(50)', '@mk_city nvarchar(50)', '@mk_district nvarchar(50)', '@mk_address nvarchar(100)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)', '@bid nvarchar(50)', '@tbid nvarchar(50)', '@mk_deleted int']
    let _select = ['@UserName=\'\'', '@FullName=\'\'', '@RoleID=\'\'', '@mk_departmentcode=\'\'', '@mk_organization=\'\'', '@mk_user_type=\'\'', '@mk_nation=\'\'', '@mk_province=\'\'', '@mk_city=\'\'', '@mk_district=\'\'', '@mk_address=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'', '@bid=\'\'', '@mk_deleted=1']
    let fieldArr = sysfields.map(_f => _f.toLowerCase())
    let hasBid = false
    let verIndex = _fields.findIndex(item => item.type === 'vercode')
    if (verIndex > -1) {
      _fields = fromJS(_fields).toJS()
      _fields.splice(verIndex, 0, {
        type: 'text',
        fieldlength: 50,
        writein: 'false',
        field: 'mk_timestamp'
      }, {
        type: 'text',
        fieldlength: 50,
        writein: 'false',
        field: 'mk_send_type'
      }, {
        type: 'text',
        fieldlength: 50,
        writein: 'false',
        field: 'mk_n_id'
      })
    }
    let formfields = []
    _fields = _fields.filter(_f => _f.field)
    _fields.forEach(_f => {
      if (_f.field.toLowerCase() === 'bid') {
        hasBid = true
      }
    }).then(_fields => {
      let _usefulfields = ['UserName', 'FullName', 'RoleID', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode']
      let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@RoleID nvarchar(512)', '@mk_departmentcode nvarchar(50)', '@mk_organization nvarchar(50)', '@mk_user_type nvarchar(20)', '@mk_nation nvarchar(50)', '@mk_province nvarchar(50)', '@mk_city nvarchar(50)', '@mk_district nvarchar(50)', '@mk_address nvarchar(100)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)', '@bid nvarchar(50)']
      let _select = ['@UserName=\'\'', '@FullName=\'\'', '@RoleID=\'\'', '@mk_departmentcode=\'\'', '@mk_organization=\'\'', '@mk_user_type=\'\'', '@mk_nation=\'\'', '@mk_province=\'\'', '@mk_city=\'\'', '@mk_district=\'\'', '@mk_address=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'', '@bid=\'\'']
      let fieldArr = _usefulfields.map(_f => _f.toLowerCase())
      let hasBid = false
      _usefulfields = []
      fieldArr.push('bid')
      if (fieldArr.includes(_f.field.toLowerCase())) return
      _fields = _fields.filter(_f => _f.field)
      _fields.forEach(_f => {
        if (_f.field.toLowerCase() === 'bid') {
          hasBid = true
      fieldArr.push(_f.field.toLowerCase())
      formfields.push(_f.field)
      let _fieldlen = _f.fieldlength || 50
      if (_f.type === 'number') {
        _fieldlen = _f.decimal ? _f.decimal : 0
      }
      if (_fieldlen > 4000) {
        _fieldlen = 'max'
      }
      let _type = `nvarchar(${_fieldlen})`
      if (_f.type.match(/date/ig)) {
        _type = 'datetime'
        _select.push(`@${_f.field}='1949-10-01'`)
      } else if (_f.type === 'number') {
        _type = `decimal(18,${_fieldlen})`
        _select.push(`@${_f.field}=1`)
      } else if (_f.declare === 'decimal') {
        _type = `decimal(18,${_f.decimal || 0})`
        _select.push(`@${_f.field}=1`)
      } else if (_f.type === 'rate') {
        _type = `decimal(18,2)`
        _select.push(`@${_f.field}=1`)
      } else {
        _select.push(`@${_f.field}=''`)
      }
      _declare.push(`@${_f.field} ${_type}`)
    })
    let uniqueFields = fromJS(_fields).toJS()
    if (!hasBid) { // 唯一性验证添加BID
      uniqueFields.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
      _fields.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
    }
    let unionFields = fromJS(_fields).toJS()
    let formArr = _fields.map(_f => _f.field.toLowerCase())
    let colfields = []
    if (card.Ot !== 'notRequired' && columns) {
      columns.forEach(_f => {
        if (!_f.field) return
        let key = _f.field.toLowerCase()
        if (!formArr.includes(key)) {
          formArr.push(key)
          unionFields.push(_f)
        }
        if (fieldArr.includes(_f.field.toLowerCase())) return
        if (fieldArr.includes(key)) return
        fieldArr.push(_f.field.toLowerCase())
        fieldArr.push(key)
        colfields.push(_f.field)
        _usefulfields.push(_f.field)
        if (_f.datatype) { // 自定义字段
          if (/decimal|int/ig.test(_f.datatype)) {
            _select.push(`@${_f.field}=1`)
          } else {
            _select.push(`@${_f.field}=''`)
          }
          _declare.push(`@${_f.field} ${_f.datatype}`)
          return
        }
        let _fieldlen = _f.fieldlength || 50
        if (_f.type === 'number') {
          _fieldlen = _f.decimal ? _f.decimal : 0
        }
        if (_fieldlen > 2048) {
        if (_fieldlen > 4000) {
          _fieldlen = 'max'
        }
        let _type = `nvarchar(${_fieldlen})`
        if (_f.type.match(/date/ig)) {
          _type = 'datetime'
          _select.push(`@${_f.field}='1949-10-01'`)
        } else if (_f.type === 'number') {
          _type = `decimal(18,${_fieldlen})`
          _select.push(`@${_f.field}=0`)
        } else if (_f.type === 'rate') {
          _type = `decimal(18,2)`
          _select.push(`@${_f.field}=0`)
        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}=1`)
        } else {
          _select.push(`@${_f.field}=''`)
        }
        _declare.push(`@${_f.field} ${_type}`)
      })
    }
      let uniqueFields = fromJS(_fields).toJS()
    let _sql = `Declare ${_declare.join(', ')}
      Select ${_select.join(', ')}
    `
      if (!hasBid) { // 唯一性验证添加BID
        uniqueFields.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
        _fields.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
      }
    // 默认sql
    let _defaultsql = ''
    let _insertsql = ''
    let _updatesql = ''
    let _primaryKey = config.setting.primaryKey || 'id'
      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 (this.props.side === 'sub') {
      _primaryKey = config.setting.subKey || 'id'
    }
      let unionFields = fromJS(_fields).toJS()
      let formArr = _fields.map(_f => _f.field.toLowerCase())
    if (card.sqlType === 'insert' || card.sqlType === 'insertOrUpdate') {
      let keys = []
      let values = []
      if (hasColumn) {
        columns.forEach(_f => {
          if (_f.field && !formArr.includes(_f.field.toLowerCase())) {
            formArr.push(_f.field.toLowerCase())
            unionFields.push(_f)
          }
          if (!_f.field || fieldArr.includes(_f.field.toLowerCase())) return
      _fields.forEach(item => {
        if (!item.field || item.writein === 'false') return
          fieldArr.push(_f.field.toLowerCase())
          _usefulfields.push(_f.field)
        keys.push(item.field.toLowerCase())
          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}`)
        })
      }
      let _sql = `Declare ${_declare.join(', ')}
        Select ${_select.join(', ')}
      `
      // 默认sql
      let _defaultsql = ''
      let _insertsql = ''
      let _updatesql = ''
      let _primaryKey = config.setting.primaryKey || 'id'
      if (card.sqlType === 'insert' || card.sqlType === 'insertOrUpdate') {
        let keys = []
        let values = []
        _fields.forEach(item => {
          if (!item.field || item.writein === 'false') return
          keys.push(item.field.toLowerCase())
          if (item.field.toLowerCase() === 'bid' && item.uuid === 'BID') {
            values.push('@BID@')
          } else {
            values.push('@' + item.field)
          }
        })
        if (!keys.includes(_primaryKey.toLowerCase())) {
          keys.push(_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')
        if (item.field.toLowerCase() === 'bid' && item.uuid === '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 || item.writein === 'false') return
          _arr.push(item.field.toLowerCase())
          if (item.field.toLowerCase() === 'bid' && item.uuid === 'BID') {
            _form.push(item.field + '=@BID@')
          } else {
            _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@')
          }
          if (!_arr.includes('submituser')) {
            _form.push('submituser=@username')
          }
        } else {
          if (!_arr.includes('modifydate')) {
            _form.push('modifydate=getdate()')
          }
          if (!_arr.includes('modifyuser')) {
            _form.push('modifyuser=@username')
          }
          if (!_arr.includes('modifyuserid')) {
            _form.push('modifyuserid=@userid@')
          }
          values.push('@' + item.field)
        }
        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 ${_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 ${_primaryKey}=@ID@
          if @tbid=''
            begin
            ${_insertsql}
            end
          else
            begin
            ${_updatesql}
            end
        `
      } else if (card.sqlType === 'LogicDelete' || card.sqlType === 'custom') {
        let _voucher = ''
        if (_verify.voucher && _verify.voucher.enabled) {
          _voucher = ',BVoucher=@BVoucher,FIBVoucherDate=@FIBVoucherDate,FiYear=@FiYear'
        }
        _defaultsql = `update ${card.sql} set deleted=1,modifydate=getdate(),modifyuser=@username,modifyuserid=@userid@${_voucher} where ${_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}${_primaryKey}='+@ID@,200),@userid@,@username,@fullname delete ${card.sql} where ${_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 && 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.join(', '),
        uniqueColumns: this.state.uniqueColumns.map(col => {
          if (col.dataIndex === 'field') {
            col.options = uniqueFields
          }
          return col
        }),
        onceUniqueColumns: this.state.onceUniqueColumns.map(col => {
          if (col.dataIndex === 'field') {
            col.options = _columns
          }
          return col
        }),
        unionFields,
        uniqueFields
      })
      if (!keys.includes(_primaryKey.toLowerCase())) {
        keys.push(_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@')
      }
      if (!keys.includes('typename')) {
        keys.push('typename')
        values.push('@typename@')
      }
      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 || item.writein === 'false' || item.uuid === 'BID') return
        _arr.push(item.field.toLowerCase())
        if (item.field.toLowerCase() === 'bid') {
          _form.push(item.field + '=@BID@')
        } else {
          _form.push(item.field + '=@' + item.field)
        }
      })
      if (this.props.card.sqlType === 'audit') {
        if (!_arr.includes('submitdate')) {
          _form.push('submitdate=getdate()')
        }
        if (!_arr.includes('submituser')) {
          _form.push('submituser=@username')
        }
        if (!_arr.includes('submitstaff')) {
          _form.push('submitstaff=@fullname')
        }
        if (!_arr.includes('submituserid')) {
          _form.push('submituserid=@userid@')
        }
        if (!_arr.includes('typename')) {
          _form.push(`typename=@typename@`)
        }
      } else {
        if (!_arr.includes('modifydate')) {
          _form.push('modifydate=getdate()')
        }
        if (!_arr.includes('modifyuser')) {
          _form.push('modifyuser=@username')
        }
        if (!_arr.includes('modifystaff')) {
          _form.push('modifystaff=@fullname')
        }
        if (!_arr.includes('modifyuserid')) {
          _form.push('modifyuserid=@userid@')
        }
        if (!_arr.includes('typename')) {
          _form.push(`typename=@typename@`)
        }
      }
      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 ${_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 ${_primaryKey}=@ID@
        if @tbid=''
          begin
          ${_insertsql}
          end
        else
          begin
          ${_updatesql}
          end
      `
    } else if (card.sqlType === 'LogicDelete' || card.sqlType === 'custom') {
      let _voucher = ''
      if (_verify.voucher && _verify.voucher.enabled) {
        _voucher = ',BVoucher=@BVoucher,FIBVoucherDate=@FIBVoucherDate,FiYear=@FiYear'
      }
      _defaultsql = `update ${card.sql} set deleted=@mk_deleted,modifydate=getdate(),modifyuser=@username,modifystaff=@fullname,modifyuserid=@userid@${_voucher} where ${_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') {
        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,typename) select left('删除表:${card.sql} 数据: ${_msg}${_primaryKey}='+@ID@,200),@userid@,@username,@fullname,@typename@ delete ${card.sql} where ${_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 && 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,
      formfields: formfields.join(', '),
      colfields: colfields.join(', '),
      uniqueColumns: this.state.uniqueColumns.map(col => {
        if (col.dataIndex === 'field') {
          col.options = uniqueFields
        }
        return col
      }),
      onceUniqueColumns: this.state.onceUniqueColumns.map(col => {
        if (col.dataIndex === 'field') {
          col.options = _columns
        }
        return col
      }),
      unionFields,
      uniqueFields
    })
  }
@@ -995,7 +1084,12 @@
      {
        obj_name: 'noteCodes',
        arr_field: 'templatecode,describe,id',
        LText: window.btoa(window.encodeURIComponent(`select t.id,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`))
        LText: window.btoa(window.encodeURIComponent(`select t.id,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 =u.openid`))
      },
      {
        obj_name: 'emailCodes',
        arr_field: 'msn_email_temp_no,remark,id',
        LText: window.btoa(window.encodeURIComponent(`select t.id,t.msn_email_temp_no,t.remark from (select * from bd_msn_email_temp where deleted=0) t inner join (select openid from susers where uid=@userid@) u on t.openid=u.openid`))
      },
      {
        obj_name: 'scripts',
@@ -1011,16 +1105,17 @@
      LText: mutilForms.join(' union all '),
      obj_name: '',
      arr_field: '',
      table_type: 'Y'
      table_type: 'Y',
      exec_type: 'x'
    }
    mutilparam.LText = Utils.formatOptions(mutilparam.LText)
    mutilparam.LText = Utils.formatOptions(mutilparam.LText, 'x')
    mutilparam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
    mutilparam.secretkey = Utils.encrypt(mutilparam.LText, mutilparam.timestamp)
    mutilparam.secretkey = Utils.encrypt('', mutilparam.timestamp)
    mutilparam.open_key = Utils.encryptOpenKey(mutilparam.secretkey, mutilparam.timestamp)
    if (options.cloudServiceApi) { // 云端请求
      mutilparam.rduri = options.cloudServiceApi
    if (window.GLOB.cloudServiceApi) { // 云端请求
      mutilparam.rduri = window.GLOB.cloudServiceApi
      mutilparam.userid = sessionStorage.getItem('CloudUserID') || ''
      mutilparam.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
    }
@@ -1039,6 +1134,13 @@
              id: item.id
            }
          }),
          emailCodes: res.emailCodes.map(item => {
            return {
              name: item.remark,
              value: item.msn_email_temp_no,
              id: item.id
            }
          }),
          systemScripts: res.scripts.map(item => {
            return {
              name: item.funcname,
@@ -1053,6 +1155,45 @@
          duration: 5
        })
      }
    })
  }
  orderSql = (record) => {
    let _ModularDetailCode = ''
    let _lpline = ''
    if (record.TypeCharOne === 'Lp') {
      if (record.linkField.toLowerCase() === 'bid') {
        _lpline = `set @ModularDetailCode= 'Lp'+ right('${record.mark || this.props.card.uuid}'+@BID@,48)`
      } else {
        _lpline = `set @ModularDetailCode= 'Lp'+ right('${record.mark || this.props.card.uuid}'+@${record.linkField.toLowerCase()},48)`
      }
      _ModularDetailCode = '@ModularDetailCode'
    } else if (record.TypeCharOne === 'BN') {
      _ModularDetailCode = `'${record.TypeCharOne}'`
    } else {
      _ModularDetailCode = `'${record.ModularDetailCode}'`
    }
    let sql = `select @BillCode='', @${record.field}='', @ModularDetailCode=''
    ${_lpline}
    exec s_get_BillCode
      @ModularDetailCode=${_ModularDetailCode},
      @Type=${record.Type},
      @TypeCharOne='${record.TypeCharOne}',
      @TypeCharTwo ='${record.TypeCharTwo}',
      @BillCode =@BillCode output,
      @ErrorCode =@ErrorCode output,
      @retmsg=@retmsg output
    if @ErrorCode!=''
      goto aaa
    set @${record.field}=@BillCode`
    Modal.info({
      title: '',
      width: 500,
      className: 'sql-example',
      icon: null,
      content: sql.split(/\n\s{4}/ig).map((n, index) => <div key={index} dangerouslySetInnerHTML={{ __html: n.replace(/\s/ig, '&nbsp;') }} style={{whiteSpace: 'nowrap'}}></div>)
    })
  }
@@ -1105,6 +1246,8 @@
  }
  scriptsChange = (values) => {
    const { columns, card } = this.props
    let verify = fromJS(this.state.verify).toJS()
    if (values.uuid) {
@@ -1118,6 +1261,35 @@
    } else {
      values.uuid = Utils.getuuid()
      verify.scripts.push(values)
    }
    if (/@bvoucher(\s|\))/ig.test(values.sql) && !/s_BVoucher_Create/ig.test(values.sql)) {
      if (verify.voucher && verify.voucher.enabled) {
      } else if (card.Ot !== 'notRequired' && columns) {
        let hasvoucher = false
        columns.forEach(_f => {
          if (!_f.field) return
          if (_f.field.toLowerCase() === 'bvoucher') {
            hasvoucher = true
          }
        })
        if (!hasvoucher) {
          notification.warning({
            top: 92,
            message: '未启用创建凭证,且字段集中不存在凭证字段(bvoucher)。',
            duration: 5
          })
        }
      } else {
        notification.warning({
          top: 92,
          message: '未启用创建凭证,且字段集中不存在凭证字段(bvoucher)。',
          duration: 5
        })
      }
    }
    MKEmitter.emit('editLineId', values.uuid)
@@ -1140,6 +1312,8 @@
      values.uuid = Utils.getuuid()
      verify.cbScripts.push(values)
    }
    MKEmitter.emit('editLineId', values.uuid)
    this.setState({ verify })
  }
@@ -1180,17 +1354,22 @@
  }
  handleEdit = (record, type) => {
    let node = null
    if (type === 'customverify') {
      this.customForm.edit(record)
      node = document.getElementById('mk-custom-script')
    } else if (type === 'ordercode') {
      this.orderForm.edit(record)
    } else if (type === 'scripts') {
      this.scriptsForm.edit(record)
      node = document.getElementById('mk-normal-script')
    } else if (type === 'cbscripts') {
      this.cbscriptsForm.edit(record)
      node = document.getElementById('mk-callback-script')
    }
    let node = document.getElementById('verify-card-box-tab').parentNode
    // let node = document.getElementById('verify-card-box-tab').parentNode
    if (node && node.scrollTop) {
      let inter = Math.ceil(node.scrollTop / 10)
@@ -1366,7 +1545,7 @@
  handleConfirm = () => {
    const { card } = this.props
    const { setting, activeKey } = this.state
    const { activeKey } = this.state
    let verify = fromJS(this.state.verify).toJS()
    if (activeKey === 'base') {
@@ -1384,17 +1563,10 @@
    
    // 表单提交时检查输入值是否正确
    return new Promise((resolve, reject) => {
      if ((card.sqlType === 'custom' || verify.default === 'false') && verify.scripts.length === 0) {
      if ((card.sqlType === 'custom' || verify.default === 'false') && !(verify.workFlow === 'true' && verify.flowSql === 'true') && verify.scripts.length === 0) {
        notification.warning({
          top: 92,
          message: '不执行默认sql时,必须设置自定义脚本!',
          duration: 5
        })
        return
      } else if (verify.invalid === 'true' && setting.maxScript && setting.maxScript >= 300) {
        notification.warning({
          top: 92,
          message: '数据源中自定义脚本过于复杂,不能使用失效验证!',
          duration: 5
        })
        return
@@ -1427,6 +1599,9 @@
          })
        })
      }
      delete verify.limitInvalid
      delete verify.limitText
      if (msg) {
        confirm({
@@ -1490,8 +1665,8 @@
  }
  render() {
    const { card } = this.props
    const { activeKey, verifyInter, verify, fields, visible, uniqueFields, uniqueColumns, unionFields, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, cbScriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail, notes, appType } = this.state
    const { card, columns } = this.props
    const { activeKey, verifyInter, verify, fields, uniqueFields, uniqueColumns, unionFields, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, cbScriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail, notes, emailCodes, appType, formfields, colfields } = this.state
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
@@ -1504,15 +1679,16 @@
    }
    return (
      <div id="verify-card-box-tab">
        <Tabs activeKey={activeKey} className="verify-card-box" onChange={this.changeTab}>
      <div>
        {card.label ? <div className="mk-com-name">{card.label} - 验证信息</div> : null}
        <Tabs activeKey={activeKey} className="mk-verify-tabs" onChange={this.changeTab}>
          {verifyInter === 'system' || card.intertype === 'inner' ? <TabPane tab={
            <span>
              基础验证
              {verify.default === 'false' ? <span className="count-tip"><ExclamationOutlined style={{color: 'orange'}}/></span> : null}
            </span>
          } key="base">
            <BaseForm card={card} unionFields={unionFields} verify={verify} notes={notes} onChange={(verify) => this.setState({verify})} wrappedComponentRef={(inst) => this.baseForm = inst}/>
            <BaseForm card={card} appType={appType} fields={fields} columns={columns} unionFields={unionFields} verify={verify} notes={notes} emailCodes={emailCodes} onChange={(verify) => this.setState({verify})} wrappedComponentRef={(inst) => this.baseForm = inst}/>
          </TabPane> : null}
          {verifyInter === 'system' ? <TabPane tab={
            <span>
@@ -1520,20 +1696,20 @@
              {verify.contrasts.length ? <span className="count-tip">{verify.contrasts.length}</span> : null}
            </span>
          } key="contrasts">
            <ContrastForm dict={this.props.dict} contrastChange={this.contrastChange}/>
            <EditTable actions={['edit', 'move', 'copy', 'del', 'status']} type="contrastverify" data={verify.contrasts} columns={contrastColumns} onChange={(contrasts) => this.setState({verify: {...verify, contrasts}})}/>
            <ContrastForm contrastChange={this.contrastChange}/>
            <EditTable actions={['edit', 'move', 'copy', 'del', 'status', 'sql']} type="contrastverify" data={verify.contrasts} columns={contrastColumns} onChange={(contrasts) => this.setState({verify: {...verify, contrasts}})}/>
          </TabPane> : null}
          {verifyInter === 'system' ? <TabPane tab={
            <span>
              自定义验证
              {verify.customverifys.length ? <span className="count-tip">{verify.customverifys.length}</span> : null}
            </span>
          } key="customverifys">
          } key="customverifys" id="mk-custom-script">
            <CustomForm
              dict={this.props.dict}
              btn={this.props.card}
              initsql={this.state.initsql}
              usefulfields={this.state.usefulfields}
              formfields={formfields}
              colfields={colfields}
              customChange={this.customChange}
              wrappedComponentRef={(inst) => this.customForm = inst}
            />
@@ -1549,8 +1725,7 @@
              fields={fields}
              btn={this.props.card}
              billcodes={verify.billcodes}
              columns={this.props.columns}
              dict={this.props.dict}
              columns={columns}
              modular={orderModular}
              modularDetail={orderModularDetail}
              orderChange={this.orderChange}
@@ -1567,10 +1742,9 @@
            <UniqueForm
              btn={card}
              fields={card.Ot !== 'requiredOnce' ? uniqueFields : columnsFields}
              dict={this.props.dict}
              uniqueChange={this.uniqueChange}
            />
            <EditTable actions={['edit', 'move', 'del', 'status']} data={verify.uniques} columns={card.Ot !== 'requiredOnce' ? uniqueColumns : onceUniqueColumns} onChange={this.changeUniques}/>
            <EditTable actions={['edit', 'move', 'del', 'status', 'sql']} data={verify.uniques} columns={card.Ot !== 'requiredOnce' ? uniqueColumns : onceUniqueColumns} onChange={this.changeUniques}/>
          </TabPane> : null}
          {verifyInter === 'system' ? <TabPane tab={
            <span>
@@ -1579,9 +1753,8 @@
            </span>
          } key="voucher">
            <VoucherForm
              dict={this.props.dict}
              voucher={voucher}
              columns={this.props.columns}
              columns={columns}
              voucherobj={verify.voucher}
              voucherDetail={voucherDetail}
              voucherChange={this.voucherChange}
@@ -1593,25 +1766,44 @@
              自定义脚本
              {verify.scripts.length ? <span className="count-tip">{verify.scripts.length}</span> : null}
            </span>
          } key="scripts">
            <BorderOutlined className="full-scripts" onClick={() => {
              if (this.scriptsForm && (this.scriptsForm.state.editItem || (this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))))) {
                notification.warning({
                  top: 92,
                  message: '请保存自定义脚本!',
                  duration: 5
                })
                return
              }
              this.setState({visible: true, scriptId: ''})
            }}/>
          } key="scripts" id="mk-normal-script">
            <FullScripts
              scripts={verify.scripts}
              getScriptsFullForm={() => this.scriptsFullForm}
              getScriptsForm={() => this.scriptsForm}
              handleStatus={this.handleStatus}
              handleDelete={this.handleDelete}
            >
              <CustomScript
                type="fullscreen"
                btn={this.props.card}
                initsql={this.state.initsql}
                workFlow={verify.workFlow}
                flowRemark={verify.flowRemark}
                flowType={verify.flowType}
                flowSql={verify.flowSql}
                customScripts={verify.scripts}
                useDefaultSql={verify.default !== 'false'}
                defaultsql={this.state.defaultsql}
                formfields={formfields}
                colfields={colfields}
                systemScripts={this.state.systemScripts}
                scriptsChange={this.scriptsChange}
                wrappedComponentRef={(inst) => this.scriptsFullForm = inst}
              />
            </FullScripts>
            <CustomScript
              btn={this.props.card}
              dict={this.props.dict}
              initsql={this.state.initsql}
              workFlow={verify.workFlow}
              flowRemark={verify.flowRemark}
              flowType={verify.flowType}
              flowSql={verify.flowSql}
              customScripts={verify.scripts}
              useDefaultSql={verify.default !== 'false'}
              defaultsql={this.state.defaultsql}
              usefulfields={this.state.usefulfields}
              formfields={formfields}
              colfields={colfields}
              systemScripts={this.state.systemScripts}
              scriptsChange={this.scriptsChange}
              wrappedComponentRef={(inst) => this.scriptsForm = inst}
@@ -1623,13 +1815,32 @@
              回调脚本
              {verify.cbScripts.length ? <span className="count-tip">{verify.cbScripts.length}</span> : null}
            </span>
          } key="cbScripts">
          } key="cbScripts" id="mk-callback-script">
            <FullScripts
              scripts={verify.cbScripts}
              getScriptsFullForm={() => this.cbscriptsFullForm}
              getScriptsForm={() => this.cbscriptsForm}
              handleStatus={(item) => this.handleStatus(item, 'cbscripts')}
              handleDelete={(item) => this.handleDelete(item, 'cbscripts')}
            >
              <CallBackCustomScript
                type="fullscreen"
                btn={this.props.card}
                initsql={this.state.initsql}
                customScripts={verify.cbScripts}
                formfields={formfields}
                colfields={colfields}
                systemScripts={this.state.systemScripts}
                scriptsChange={this.cbScriptsChange}
                wrappedComponentRef={(inst) => this.cbscriptsFullForm = inst}
              />
            </FullScripts>
            <CallBackCustomScript
              btn={this.props.card}
              dict={this.props.dict}
              initsql={this.state.initsql}
              customScripts={verify.cbScripts}
              usefulfields={this.state.usefulfields}
              formfields={formfields}
              colfields={colfields}
              systemScripts={this.state.systemScripts}
              scriptsChange={this.cbScriptsChange}
              wrappedComponentRef={(inst) => this.cbscriptsForm = inst}
@@ -1640,7 +1851,7 @@
            <Form {...formItemLayout}>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                  <Form.Item label="提示编码">
                    <span className="errorval"> S </span>
                    <Button onClick={() => {this.showError('S')}} type="primary" size="small">
                      查看
@@ -1648,14 +1859,14 @@
                  </Form.Item>
                </Col>
                <Col span={8}>
                  <Form.Item label={'停留时间'}>
                  <Form.Item label="停留时间">
                    <InputNumber defaultValue={verify.stime || 2} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'stime')}} />
                  </Form.Item>
                </Col>
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                  <Form.Item label="提示编码">
                    <span className="errorval"> Y </span>
                    <Button onClick={() => {this.showError('Y')}} type="primary" size="small">
                      查看
@@ -1665,7 +1876,15 @@
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                  <Form.Item label="提示编码">
                    <span className="errorval"> -1 </span>
                    执行成功无提示。
                  </Form.Item>
                </Col>
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label="提示编码">
                    <span className="errorval"> N </span>
                    <Button onClick={() => {this.showError('N')}} type="primary" size="small">
                      查看
@@ -1673,14 +1892,14 @@
                  </Form.Item>
                </Col>
                <Col span={8}>
                  <Form.Item label={'停留时间'}>
                  <Form.Item label="停留时间">
                    <InputNumber defaultValue={verify.ntime || (appType === 'mob' ? 3 : 10)} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ntime')}} />
                  </Form.Item>
                </Col>
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                  <Form.Item label="提示编码">
                    <span className="errorval"> F </span>
                    <Button onClick={() => {this.showError('F')}} type="primary" size="small">
                      查看
@@ -1688,14 +1907,14 @@
                  </Form.Item>
                </Col>
                <Col span={8}>
                  <Form.Item label={'停留时间'}>
                  <Form.Item label="停留时间">
                    <InputNumber defaultValue={verify.ftime || (appType === 'mob' ? 3 : 10)} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ftime')}} />
                  </Form.Item>
                </Col>
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                  <Form.Item label="提示编码">
                    <span className="errorval"> E </span>
                    <Button onClick={() => {this.showError('E')}} type="primary" size="small">
                      查看
@@ -1705,7 +1924,7 @@
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                  <Form.Item label="提示编码">
                    <span className="errorval"> NM </span>
                    <Button onClick={() => {this.showError('NM')}} type="primary" size="small">
                      查看
@@ -1715,85 +1934,15 @@
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                    <span className="errorval"> -1 </span>
                    不提示
                  <Form.Item label="提示编码">
                    <span className="errorval"> -2 </span>
                    执行失败无提示
                  </Form.Item>
                </Col>
              </Row>
            </Form>
          </TabPane>
        </Tabs>
        <Modal
          wrapClassName="model-custom-scripts-modal"
          title="自定义脚本"
          visible={visible}
          width={'95vw'}
          maskClosable={false}
          destroyOnClose
        >
          <img className="unfull-scripts" src={MinView} onClick={() => this.setState({visible: false, scriptId: ''})} alt=""/>
          <div className="script-table-wrap">
            {verify.scripts.map(item => {
              let title = item.sql.match(/^\s*\/\*.+\*\//)
              title = title && title[0] ? title[0] : ''
              let _text = title ? item.sql.replace(title, '') : item.sql
              let position = null
              if (item.position === 'init') {
                position = <span style={{color: 'orange'}}>初始化</span>
              } else if (item.position === 'front') {
                position = <span style={{color: '#26C281'}}>sql前</span>
              } else {
                position = <span style={{color: '#1890ff'}}>sql后</span>
              }
              return (
                <div className={'script-item ' + (this.state.scriptId === item.uuid ? 'active' : '') } key={item.uuid}>
                  <div style={{cursor: 'pointer'}} onClick={() => {
                    this.scriptsFullForm.edit(item)
                    this.setState({scriptId: item.uuid})
                  }}>
                    {title ? <div style={{color: '#a50', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis'}}>{title}</div> : null}
                    <Paragraph copyable={{ text: item.sql }} ellipsis={{ rows: 4 }}>{_text}</Paragraph>
                    <div>{position}{item.status === 'false' ?
                      <span style={{color: '#ff4d4f', marginLeft: '20px'}}>
                        禁用
                        <StopOutlined style={{marginLeft: '5px'}} />
                      </span> :
                      <span style={{color: '#26C281', marginLeft: '20px'}}>
                        启用
                        <CheckCircleOutlined style={{marginLeft: '5px'}}/>
                      </span>}
                    </div>
                  </div>
                  <div style={{textAlign: 'right'}}>
                    <span className="operation-btn" onClick={() => this.handleStatus(item, 'scripts')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
                    <Popconfirm
                      overlayClassName="popover-confirm"
                      title={this.props.dict['model.query.delete']}
                      onConfirm={() => this.handleDelete(item, 'scripts')
                    }>
                      <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
                    </Popconfirm>
                  </div>
                </div>
              )
            })}
          </div>
          <CustomScript
            type="fullscreen"
            btn={this.props.card}
            dict={this.props.dict}
            initsql={this.state.initsql}
            customScripts={verify.scripts}
            defaultsql={this.state.defaultsql}
            usefulfields={this.state.usefulfields}
            systemScripts={this.state.systemScripts}
            scriptsChange={this.scriptsChange}
            wrappedComponentRef={(inst) => this.scriptsFullForm = inst}
          />
        </Modal>
      </div>
    )
  }