king
2024-02-08 7067c6095571c19bbeeb04fa130afff54559aa82
src/tabviews/zshare/mutilform/index.jsx
@@ -6,7 +6,6 @@
import moment from 'moment'
import Api from '@/api'
import options from '@/store/options.js'
import { formRule } from '@/utils/option.js'
import Utils from '@/utils/utils.js'
import asyncComponent from '@/utils/asyncComponent'
@@ -19,6 +18,7 @@
const MKCheckCard = asyncComponent(() => import('./mkCheckCard'))
const MKSwitch = asyncComponent(() => import('./mkSwitch'))
const MKCheck = asyncComponent(() => import('./mkCheck'))
const MKCheckbox = asyncComponent(() => import('./mkCheckbox'))
const MKRadio = asyncComponent(() => import('./mkRadio'))
const MKDatePicker = asyncComponent(() => import('./mkDatePicker'))
@@ -27,25 +27,35 @@
const MKColor = asyncComponent(() => import('./mkColor'))
const MkFormula = asyncComponent(() => import('./mkFormula'))
const MkCascader = asyncComponent(() => import('./mkCascader'))
const MkVercode = asyncComponent(() => import('./mkVercode'))
const MKPopSelect = asyncComponent(() => import('./mkPopSelect'))
const MKEditor = asyncComponent(() => import('@/components/editor'))
class MainSearch extends Component {
class MutilFormComponent extends Component {
  static propTpyes = {
    action: PropTypes.object,    // 按钮信息、表单列表
    data: PropTypes.any,         // 表格数据
    BID: PropTypes.any,          // 主表ID
    BData: PropTypes.any,        // 主表数据
    unload: PropTypes.any,       // 下拉菜单不加载数据
    inputSubmit: PropTypes.func  // input回车提交
  }
  state = {
    formlist: [],    // 表单项
    ID: '',
    send_type: '',
    timestamp: '',
    n_id: '',
    focusId: '',
    reFocusId: ''
  }
  record = {}
  submitId = ''
  componentDidMount () {
    const { action } = this.props
    const { action, unload } = this.props
    let data = {}
    let BData = {}
@@ -70,7 +80,18 @@
    }
    formlist = formlist.filter(item => {
      if (item.type === 'hint') {
        if (item.field && data[item.field.toLowerCase()]) {
          item.message = data[item.field.toLowerCase()]
        }
        delete item.field
      }
      if (item.supField) { // 多层表单控制
        if (['hint', 'split', 'formula'].includes(item.type)) {
          item.field = item.uuid
          fieldMap.set(item.field, item)
        }
        let supvals = []
        if (item.supvalue) {
          item.supvalue.split(',').forEach(val => {
@@ -82,6 +103,7 @@
        } else {
          supvals.push('')
        }
        supvals = Array.from(new Set(supvals))
        controlFields[item.supField] = controlFields[item.supField] || []
        controlFields[item.supField].push({field: item.field, values: supvals})
      }
@@ -98,25 +120,27 @@
        delete item.style.marginRight
      }
      if (item.type === 'split' || item.type === 'formula') return true
      if (item.type === 'hint') {
        if (item.field && data[item.field.toLowerCase()]) {
          item.message = data[item.field.toLowerCase()]
      if (item.type === 'split' && item.splitctrl) {
        if (data.hasOwnProperty(item.splitctrl.toLowerCase()) && data[item.splitctrl.toLowerCase()] === '') {
          return false
        }
        delete item.field
        return true
      } else if (item.type === 'date') { // 时间搜索
      }
      if (['hint', 'split', 'formula'].includes(item.type)) return true
      if (item.type === 'date') {
        item.precision = item.precision || 'day'
      } else if (item.type === 'datetime') {
        item.type = 'date'
        item.precision = 'second'
      }
      if (!item.field || !['text', 'number', 'switch', 'rate', 'select', 'link', 'cascader', 'linkMain', 'funcvar', 'date', 'datemonth', 'radio', 'checkbox', 'checkcard', 'fileupload', 'textarea', 'multiselect', 'brafteditor', 'color'].includes(item.type)) return false
      if (!item.field || !['text', 'number', 'switch', 'check', 'rate', 'select', 'popSelect', 'link', 'cascader', 'linkMain', 'funcvar', 'date', 'datemonth', 'radio', 'checkbox', 'checkcard', 'fileupload', 'textarea', 'multiselect', 'brafteditor', 'color', 'vercode'].includes(item.type)) return false
      if (/^\s+$/.test(item.label)) {
        item.style = item.style || {}
        item.style.color = 'transparent'
        item.style.opacity = 0
        item.style.width = 1
        item.style.display = 'inline-block'
      }
      // 数据自动填充
@@ -133,6 +157,9 @@
        readin = false
        item.readin = false
        item.hidden = true
      } else if (item.type === 'linkMain') {
        readin = false
        item.readin = false
      } else if (item.type === 'number') {
        item.decimal = item.decimal || 0
        item.fieldlength = item.decimal
@@ -156,6 +183,23 @@
          })
        }
        item.oriOptions = fromJS(item.options).toJS()
        if (item.empty === 'hidden' && item.oriOptions.length === 0) {
          item.hidden = true
        }
        if (item.type === 'checkcard' && item.readonly && item.unchecked === 'hidden') {
          let selectKeys = item.initval
          if (item.multiple === 'true') {
            selectKeys = selectKeys ? selectKeys.split(',') : []
            item.options = item.options.filter(item => selectKeys.includes(item.$value))
          } else {
            item.options = item.options.filter(item => selectKeys === item.$value)
          }
          item.oriOptions = fromJS(item.options).toJS()
          if (item.options.length === 0) {
            item.hidden = true
          }
        }
      }
      let newval = '$empty'
@@ -163,27 +207,49 @@
      if (readin && data.hasOwnProperty(key)) {
        newval = data[key]
      }
      if (item.type === 'linkMain') {
        newval = BData[key] || '$empty'
      } else if (item.type === 'date') { // 时间搜索
        let format = 'YYYY-MM-DD'
      if (item.type === 'linkMain' && BData.hasOwnProperty(key)) {
        newval = BData[key]
      } else if (item.type === 'date') { // 时间表单,提交值为天或秒
        let _format = 'YYYY-MM-DD HH:mm:ss'
        if (item.precision === 'day') {
          _format = 'YYYY-MM-DD'
        } else if (item.precision === 'hour') {
          format = 'YYYY-MM-DD HH'
        } else if (item.precision === 'minute') {
          format = 'YYYY-MM-DD HH:mm'
        } else if (item.precision === 'second') {
          format = 'YYYY-MM-DD HH:mm:ss'
        }
        if (newval !== '$empty') {
          newval = moment(newval, format).format(_format)
          newval = moment(newval, 'YYYY-MM-DD HH:mm:ss').format(_format)
          newval = newval === 'Invalid date' ? '$empty' : newval
        }
        if (newval === '$empty' && item.initval) {
          newval = moment().subtract(item.initval, 'days').format(_format)
        }
        if (item.minDate) {
          if (item.minDate === 'custom') {
            if (/^\d{4}-\d{2}-\d{2}$/.test(item.minDateField)) {
              item.minDate = moment(item.minDateField).format('YYYY-MM-DD')
            } else {
              let val = data[item.minDateField.toLowerCase()]
              item.minDate = val ? moment(val).format('YYYY-MM-DD') : ''
            }
            item.minDate = item.minDate === 'Invalid date' ? '' : item.minDate
          } else {
            item.minDate = moment().add(item.minDate, 'days').format('YYYY-MM-DD')
          }
        }
        if (item.maxDate) {
          if (item.maxDate === 'custom') {
            if (/^\d{4}-\d{2}-\d{2}$/.test(item.maxDateField)) {
              item.maxDate = moment(item.maxDateField).format('YYYY-MM-DD')
            } else {
              let val = data[item.maxDateField.toLowerCase()]
              item.maxDate = val ? moment(val).format('YYYY-MM-DD') : ''
            }
            item.maxDate = item.maxDate === 'Invalid date' ? '' : item.maxDate
          } else {
            item.maxDate = moment().add(item.maxDate, 'days').format('YYYY-MM-DD')
          }
        }
      } else if (item.type === 'datemonth') {
        if (newval !== '$empty') {
@@ -193,25 +259,19 @@
        if (newval === '$empty' && item.initval) {
          newval = moment().subtract(item.initval, 'month').format('YYYY-MM')
        }
      // } else if (item.type === 'datetime') {
      //   if (newval !== '$empty') {
      //     newval = moment(newval, 'YYYY-MM-DD HH:mm:ss').format('YYYY-MM-DD HH:mm:ss')
      //     newval = newval === 'Invalid date' ? '$empty' : newval
      //   }
      //   if (newval === '$empty' && item.initval) {
      //     if (item.initval === '0') {
      //       newval = moment().format('YYYY-MM-DD HH:mm:ss')
      //     } else {
      //       newval = moment().subtract(item.initval, 'days').format('YYYY-MM-DD') + ' 00:00:00'
      //     }
      //   }
      } else if (item.type === 'switch') { // 开关只接收固定值
      } else if (item.type === 'switch' || item.type === 'check') { // 开关勾选框只接收固定值
        if (newval !== '$empty' && (newval === item.closeVal || newval === item.openVal)) {
        } else if (item.initval === true) {
          newval = item.openVal
        } else {
          newval = item.closeVal
        }
      } else if (item.type === 'popSelect') {
        if (newval && newval !== '$empty') {
          item.showValue = data[item.showField.toLowerCase()] || ''
        } else {
          item.showValue = ''
        }
      }
@@ -221,7 +281,11 @@
        item.initval = ''
      }
      if (['select', 'link', 'radio', 'checkbox', 'checkcard', 'multiselect', 'cascader'].includes(item.type) && item.resourceType === '1') {
      if (item.type === 'number') {
        if (isNaN(item.initval) || item.initval === '') {
          item.initval = 0
        }
      } else if (['select', 'link', 'radio', 'checkbox', 'checkcard', 'multiselect', 'cascader'].includes(item.type) && item.resourceType === '1') {
        deForms.push(item)
      } else if (item.type === 'rate') {
        item.rateCount = item.rateCount || 5
@@ -243,28 +307,31 @@
        }
      }
      item.rules = []
      if (item.type === 'text') {
        if (typeof(item.initval) === 'number') {
          item.initval = item.initval + ''
        item.initval = item.initval + ''
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
          })
        }
        let _rules = [{
          pattern: /^[^']*$/ig,
          message: '不可使用英文状态的单引号!'
        }, {
        item.rules.push({
          validator: (rule, value, callback) => {
            if (/--/ig.test(value)) {
              callback('不可使用 -- !')
            if (/'/.test(value)) {
              callback('不可使用英文状态的单引号!')
            // } else if (/--/.test(value)) {
            //   callback('不可使用 -- !')
            } else {
              callback()
            }
          }
        }, {
          required: item.required === 'true',
          message: item.label + '不可为空!'
        }]
        })
        if (!item.lenControl || item.lenControl === 'limit') {
          _rules.push({
          item.rules.push({
            max: item.fieldlength,
            message: formRule.input.formMessage.replace('@max', item.fieldlength)
          })
@@ -272,100 +339,144 @@
        if (item.regular) {
          if (item.regular === 'number') {
            _rules.push({
              pattern: /^[0-9.-]*$/,
              message: formRule.input.numbermsg
            let reg = /^[0-9.-]*$/
            if (item.regularExtra) {
              reg = new RegExp('^[0-9.-' + item.regularExtra.replace(/\.|-/g, '') + ']*$')
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || formRule.input.numbermsg
            })
          } else if (item.regular === 'letter') {
            _rules.push({
              pattern: /^[a-zA-Z]*$/,
              message: formRule.input.lettermsg
            let reg = /^[a-zA-Z]*$/
            if (item.regularExtra) {
              reg = new RegExp('^[a-zA-Z' + item.regularExtra + ']*$')
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || formRule.input.lettermsg
            })
          } else if (item.regular === 'letter_number') {
            _rules.push({
              pattern: /^[a-zA-Z0-9]*$/,
              message: '请输入数字或字母'
            let reg = /^[a-zA-Z0-9]*$/
            if (item.regularExtra) {
              reg = new RegExp('^[a-zA-Z0-9' + item.regularExtra + ']*$')
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || '请输入数字或字母'
            })
          } else if (item.regular === 'letter&number') {
            _rules.push({
              pattern: /^[a-zA-Z0-9@_.]*$/,
              message: '请输入数字、字母以及@_.'
            let reg = /^[a-zA-Z0-9@_.]*$/
            if (item.regularExtra) {
              reg = new RegExp('^[a-zA-Z0-9@_.' + item.regularExtra.replace(/\.|_|@/g, '') + ']*$')
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || '请输入数字、字母以及@_.'
            })
          } else if (item.regular === 'phone') {
            _rules.push({
            item.rules.push({
              pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
              message: '请正确输入手机号'
              message: item.regularText || '请正确输入手机号'
            })
          } else if (item.regular === 'email') {
            _rules.push({
              pattern: /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/,
              message: '请正确输入邮箱地址'
            })
          } else if (item.regular === 'funcname') {
            _rules.push({
              pattern: /^[\u4E00-\u9FA50-9a-zA-Z_]*$/,
              message: formRule.input.funcname
            item.rules.push({
              pattern: /^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/,
              message: item.regularText || '请正确输入邮箱地址'
            })
          }
        }
        item.rules = _rules
      } else if (item.type === 'number') {
        item.rules = [{
          required: true,
          message: item.label + '不可为空!'
        }, {
          validator: (rule, value, callback) => this.handleConfirmPassword(rule, value, callback, item)
        }]
      } else if (item.type === 'textarea') {
        let _rules = [
          {
            required: item.required === 'true',
            message: item.label + '不可为空!'
          },
          {
            max: item.fieldlength,
            message: formRule.input.formMessage.replace('@max', item.fieldlength)
          },
          {
            pattern: /^[^']*$/ig,
            message: '不可使用英文状态的单引号!'
          }, {
        if (typeof(item.min) === 'number' || typeof(item.max) === 'number') {
          item.rules.push({
            validator: (rule, value, callback) => {
              if (/--/ig.test(value)) {
                callback('不可使用 -- !')
              if (isNaN(value)) {
                callback()
              } else if (typeof(item.min) === 'number' && value < item.min) {
                if (item.min < 1e-6) {
                  if (item.min === 1e-6) {
                    callback(item.label + '最小值为 0.000001')
                  } else if (item.min === 1e-7) {
                    callback(item.label + '最小值为 0.0000001')
                  } else if (item.min === 1e-8) {
                    callback(item.label + '最小值为 0.00000001')
                  } else if (item.min === 1e-9) {
                    callback(item.label + '最小值为 0.000000001')
                  } else if (item.min === 1e-10) {
                    callback(item.label + '最小值为 0.0000000001')
                  } else if (item.min === 1e-11) {
                    callback(item.label + '最小值为 0.00000000001')
                  } else {
                    callback(item.label + '最小值为 ' + item.min)
                  }
                } else {
                  callback(item.label + '最小值为 ' + item.min)
                }
              } else if (typeof(item.max) === 'number' && value > item.max) {
                callback(item.label + '最大值为 ' + item.max)
              } else {
                callback()
              }
            }
          })
        }
      } else if (item.type === 'textarea') {
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
          })
        }
        item.rules.push({
          validator: (rule, value, callback) => {
            if (/'/.test(value)) {
              callback('不可使用英文状态的单引号!')
            // } else if (/--/.test(value)) {
            //   callback('不可使用 -- !')
            } else {
              callback()
            }
          }
        ]
        item.rules = _rules
        }, {
          max: item.fieldlength,
          message: formRule.input.formMessage.replace('@max', item.fieldlength)
        })
      } else if (item.type === 'brafteditor') {
        item.rules = [
          {
            required: item.required === 'true',
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
          },
          {
            max: item.fieldlength,
            message: formRule.input.formMessage.replace('@max', item.fieldlength)
          }
        ]
      } else if (item.type === 'linkMain') {
        item.rules = [
          {
            required: item.required === 'true',
          })
        }
        item.rules.push({
          max: item.fieldlength,
          message: formRule.input.formMessage.replace('@max', item.fieldlength)
        })
      } else if (item.type === 'linkMain' || item.type === 'vercode') {
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
          }
        ]
          })
        }
      } else {
        item.rules = [
          {
            required: item.required === 'true',
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: '请选择' + item.label + '!'
          }
        ]
          })
        }
      }
      if (item.rules.length === 0) {
        item.rules = null
      }
      fieldMap.set(item.field, item)
@@ -384,10 +495,28 @@
        let cell = fieldMap.get(item.field)
        if (cell.hidden) return
        let _hidden = false
        if (supItem.hidden || !item.values.includes(supItem.initval)) {
        if (supItem.hidden) {
          _hidden = true
        } else {
          let box = [...item.values]
          if (supItem.type === 'multiselect' || (supItem.type === 'checkcard' && supItem.multiple === 'true')) {
            box.push(...supItem.initval.split(','))
          } else {
            box.push(supItem.initval)
          }
          if (box.length === Array.from(new Set(box)).length) {
            _hidden = true
          }
        }
        if (_hidden) {
          cell.hidden = true
          if (cell.empty === 'hidden') {
            cell.$hidden = true
          }
          fieldMap.set(item.field, cell)
        }
@@ -410,30 +539,75 @@
      let item = fieldMap.get(cell.field)
      // 下级表单控制-字段写入
      if ((['select', 'radio', 'link'].includes(item.type) || (item.type === 'checkcard' && item.multiple !== 'true') || (item.type === 'cascader' && item.resourceType !== '2')) && item.linkSubField) {
        item.subFields = []
        item.linkSubField.forEach(m => {
          let n = fieldMap.get(m)
          if (n && ['text', 'number', 'textarea'].includes(n.type)) {
            item.subFields.push({
              uuid: n.uuid,
              field: m
            })
          }
        })
        if (item.subFields.length === 0) {
          item.subFields = null
        } else if (item.oriOptions.length > 0) {
          item.oriOptions = item.oriOptions.map(cell => {
            item.subFields.forEach(m => {
              cell[m.field] = cell[m.field] === undefined ? '' : cell[m.field]
            })
            return cell
      if (item.linkSubField && item.linkSubField.length > 0) {
        if ((['select', 'radio', 'link'].includes(item.type) || (item.type === 'checkcard' && item.multiple !== 'true') || (item.type === 'cascader' && item.resourceType !== '2'))) {
          item.subFields = []
          item.linkSubField.forEach(m => {
            let n = fieldMap.get(m)
            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
              item.subFields.push({
                uuid: n.uuid,
                field: m
              })
            }
          })
          item.options = fromJS(item.oriOptions).toJS()
          if (item.oriOptions.length > 0) {
            item.oriOptions = item.oriOptions.map(cell => {
              item.subFields.forEach(m => {
                cell[m.field] = cell[m.field] === undefined ? '' : cell[m.field]
              })
              return cell
            })
            item.options = fromJS(item.oriOptions).toJS()
          }
        } else if (item.type === 'switch') {
          item.options = []
          item.subFields = []
          item.linkSubField.forEach(m => {
            let n = fieldMap.get(m)
            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
              item.subFields.push({
                uuid: n.uuid,
                field: m
              })
            }
          })
          reFieldsVal = reFieldsVal || {}
          let val = item.initval === item.openVal ? item.openText : item.closeText
          item.subFields.forEach(n => {
            reFieldsVal[n.field] = val || ''
          })
        } else if (item.type === 'fileupload') {
          item.options = []
          item.subFields = []
          item.linkSubField.forEach(m => {
            let n = fieldMap.get(m)
            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
              item.subFields.push({
                uuid: n.uuid,
                field: m
              })
            }
          })
        } else if (item.type === 'popSelect') {
          item.options = []
          item.subFields = []
          item.linkSubField.forEach(m => {
            let n = fieldMap.get(m)
            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
              item.subFields.push({
                uuid: n.uuid,
                field: m
              })
            }
          })
        }
        item.linkSubField = null
      }
@@ -450,28 +624,32 @@
        item.options = item.oriOptions.filter(option => option.ParentID === item.supInitVal || option.value === '')
      }
      if (['select', 'link', 'radio'].includes(item.type) && item.resourceType === '0') { // 选中第一项
        if (typeof(item.initval) === 'string' && item.initval.indexOf('$first') > -1) {
          item.initval = item.options[0] ? item.options[0].value : ''
      if (['select', 'link', 'radio'].includes(item.type)) { // 选中第一项
        if (/^\s*\$first\s*$/.test(item.initval)) {
          item.$first = true
          item.initval = ''
        }
        if (item.resourceType === '0') { // 选中第一项
          if (item.$first) {
            item.initval = item.options[0] ? item.options[0].value : ''
          }
        }
      }
      if (typeof(item.initval) === 'string' && item.initval.indexOf('$first') > -1) {
        record[item.field] = ''
      } else {
        record[item.field] = item.initval
      }
      record[item.field] = item.initval
      item.orgval = item.initval
      if (linkFields[item.field]) {
        item.linkFields = linkFields[item.field]
      }
      
      if (item.enter === 'tab' || item.enter === 'sub') {
        if (fieldMap.has(item.tabField)) {
        item.tabUuid = ''
        if (item.tabField && fieldMap.has(item.tabField)) {
          item.tabUuid = fieldMap.get(item.tabField).uuid
        } else if (item.enter === 'tab') {
          item.enter = 'false'
        } else if (item.enter === 'sub') {
        } else if (item.enter === 'sub' && ['text', 'number'].includes(item.type)) {
          item.tabUuid = item.uuid
        }
      }
@@ -507,22 +685,124 @@
    }
    this.record = record
    let ID = this.props.data ? this.props.data.$$uuid || '' : ''
    let focusItem = null
    this.setState({ formlist }, () => {
      if (action.setting && action.setting.focus && fieldMap.has(action.setting.focus)) {
        setTimeout(() => {
          MKEmitter.emit('mkFC', 'focus', fieldMap.get(action.setting.focus).uuid)
        }, 500)
    if (action.setting.focus && fieldMap.has(action.setting.focus)) {
      focusItem = fieldMap.get(action.setting.focus)
    }
    let reFocusItem = null
    if (action.setting.refocus && fieldMap.has(action.setting.refocus)) {
      reFocusItem = fieldMap.get(action.setting.refocus)
    }
    this.setState({
      formlist,
      ID,
      focusId: focusItem ? focusItem.uuid : '',
      reFocusId: reFocusItem ? reFocusItem.uuid : ''
    }, () => {
      if (unload) return
      if (focusItem) {
        if (focusItem.type === 'text' || focusItem.type === 'number') {
          setTimeout(() => {
            MKEmitter.emit('mkFC', 'focus', focusItem.uuid)
          }, 20)
        } else {
          setTimeout(() => {
            MKEmitter.emit('mkFC', 'focus', focusItem.uuid)
          }, 500)
        }
      }
      if (deForms.length > 0) {
        if (!window.GLOB.mkHS && options.sysType === 'local' && window.GLOB.systemType !== 'production') {
          this.improveSimpleActionForm(deForms)
        if (action.$cache && action.setting.cache !== 'false') {
          Api.getLCacheConfig(action.uuid, action.$time, this.props.BID, ID).then(res => {
            if (!res.valid) {
              this.getFormData(deForms)
            } else {
              this.resetFormList(res.data, true)
            }
          })
        } else {
          this.improveActionForm(deForms)
          this.getFormData(deForms)
        }
      }
    })
    if (action.subButton && action.subButton.resetForms) {
      MKEmitter.addListener('resetForms', this.resetForms)
    }
  }
  componentWillUnmount () {
    this.setState = () => {
      return
    }
    MKEmitter.removeListener('resetForms', this.resetForms)
  }
  resetForms = (id, data) => {
    const { action } = this.props
    const { focusId, reFocusId } = this.state
    if (id !== action.uuid) return
    let formlist = fromJS(this.state.formlist).toJS()
    let resetForms = action.subButton.resetForms || []
    formlist = formlist.map(item => {
      if (item.type !== 'text' && item.type !== 'number') return item
      if (resetForms.includes(item.field)) {
        let key = item.field.toLowerCase()
        if (typeof(data[key]) !== 'undefined') {
          item.initval = data[key]
          this.record[item.field] = data[key]
        } else {
          item.initval = item.orgval
          this.record[item.field] = item.orgval
        }
      }
      return item
    })
    let _list = fromJS(formlist).toJS().map(item => {
      if (item.type !== 'text' && item.type !== 'number') return item
      if (resetForms.includes(item.field) && !item.hidden) {
        item.hidden = true
      }
      return item
    })
    this.setState({
      formlist: _list
    }, () => {
      this.setState({
        formlist
      })
    })
    if (reFocusId || focusId || this.submitId) {
      setTimeout(() => {
        MKEmitter.emit('mkFC', 'focus', this.submitId || reFocusId || focusId)
      }, 20)
    }
  }
  getFormData = (deForms) => {
    if (deForms.length === 1) {
      this.improveSimpleActionForm(deForms)
    } else if (!window.GLOB.mkHS && window.GLOB.sysType === 'local' && window.GLOB.systemType !== 'production') {
      this.improveSimpleActionForm(deForms)
    } else {
      this.improveActionForm(deForms)
    }
  }
  /**
@@ -534,20 +814,43 @@
    let deffers = []
    let mainItems = []  // 云端或单点数据
    let localItems = [] // 本地数据
    let cache = action.setting.cache !== 'false'
    let cache = action.setting.cache !== 'false' && !action.$cache
    let skip = false
    let _sql = `Declare @mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20)  select @mk_departmentcode='${sessionStorage.getItem('departmentcode') || ''}',@mk_organization='${sessionStorage.getItem('organization') || ''}',@mk_user_type='${sessionStorage.getItem('mk_user_type') || ''}'\n`
    let _sso = _sql
    deForms.forEach(item => {
      if (item.database === 'sso') {
        mainItems.push(`select '${item.field}' as obj_name,'${item.arr_field}' as arr_field,'${item.base_sql}' as LText`)
        let sql = _sso + item.base_sql
        _sso = ''
        sql = sql.replace(/@ID@/ig, `'${this.state.ID || ''}'`)
        sql = sql.replace(/@BID@/ig, `'${BID}'`)
        if (window.GLOB.debugger === true) {
          console.info(sql)
        }
        sql = sql.replace(/%/ig, ' mpercent ')
        mainItems.push(`select '${item.field}' as obj_name,'${item.arr_field}' as arr_field,'${window.btoa(window.encodeURIComponent(sql))}' as LText`)
      } else {
        localItems.push(`select '${item.field}' as obj_name,'${item.arr_field}' as arr_field,'${item.base_sql}' as LText`)
        let sql = _sql + item.base_sql
        _sql = ''
        sql = sql.replace(/@ID@/ig, `'${this.state.ID || ''}'`)
        sql = sql.replace(/@BID@/ig, `'${BID}'`)
        if (window.GLOB.debugger === true) {
          console.info(sql)
        }
        sql = sql.replace(/%/ig, ' mpercent ')
        localItems.push(`select '${item.field}' as obj_name,'${item.arr_field}' as arr_field,'${window.btoa(window.encodeURIComponent(sql))}' as LText`)
      }
    })
    if (!window.GLOB.mkHS && options.sysType !== 'local') {
      localItems = [...localItems, ...mainItems]
      mainItems = []
    }
    // 本地请求
    let param = {
@@ -555,14 +858,17 @@
      LText: localItems.join(' union all '),
      obj_name: '',
      arr_field: '',
      table_type: 'Y',
      BID: BID || ''
      table_type: 'Y'
    }
    if (param.LText) {
      param.LText = Utils.formatOptions(param.LText)
      if (window.GLOB.execType === 'x') {
        param.exec_type = 'x'
      }
      param.LText = Utils.formatOptions(param.LText, param.exec_type)
      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
      param.secretkey = Utils.encrypt(window.GLOB.execType === 'x' ? '' : param.LText, param.timestamp)
      if (window.GLOB.mkHS) { // 云端数据验证
        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
@@ -577,6 +883,7 @@
                message: res.message,
                duration: 5
              })
              skip = true
            }
            resolve(res)
          })
@@ -590,24 +897,23 @@
      LText: mainItems.join(' union all '),
      obj_name: '',
      arr_field: '',
      table_type: 'Y',
      BID: BID || ''
      table_type: 'Y'
    }
    if (mainparam.LText) {
      mainparam.LText = Utils.formatOptions(mainparam.LText)
      mainparam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      mainparam.secretkey = Utils.encrypt(mainparam.LText, mainparam.timestamp)
      if (window.GLOB.execType === 'x') {
        mainparam.exec_type = 'x'
      }
      mainparam.LText = Utils.formatOptions(mainparam.LText, mainparam.exec_type)
      mainparam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      mainparam.secretkey = Utils.encrypt(window.GLOB.execType === 'x' ? '' : mainparam.LText, mainparam.timestamp)
      if (window.GLOB.mainSystemApi) {
        mainparam.rduri = window.GLOB.mainSystemApi
      }
      if (window.GLOB.mkHS) { // 云端数据验证
        mainparam.open_key = Utils.encryptOpenKey(mainparam.secretkey, mainparam.timestamp)
        if (options.cloudServiceApi) {
          mainparam.rduri = options.cloudServiceApi
          mainparam.userid = sessionStorage.getItem('CloudUserID') || ''
          mainparam.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
        }
      } else if (window.GLOB.mainSystemApi) {
        mainparam.rduri = window.GLOB.mainSystemApi
      }
      deffers.push(
@@ -619,6 +925,7 @@
                message: res.message,
                duration: 5
              })
              skip = true
            }
            resolve(res)
          })
@@ -634,7 +941,7 @@
      delete result.message
      delete result.status
      this.resetFormList(result)
      this.resetFormList(result, skip)
    })
  }
@@ -642,22 +949,40 @@
   * @description 测试系统获取下拉表单选项信息
   */
  improveSimpleActionForm = (deForms) => {
    let cache = this.props.action.setting.cache !== 'false'
    const { action } = this.props
    let cache = this.props.action.setting.cache !== 'false' && !action.$cache
    let _sql = `Declare @mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20)  select @mk_departmentcode='${sessionStorage.getItem('departmentcode') || ''}',@mk_organization='${sessionStorage.getItem('organization') || ''}',@mk_user_type='${sessionStorage.getItem('mk_user_type') || ''}'\n`
    let skip = false
    let deffers = deForms.map((form, index) => {
      let param = {
        func: 'sPC_Get_SelectedList',
        LText: form.data_sql,
        LText: _sql + form.base_sql,
        obj_name: form.field,
        arr_field: form.arr_field,
        BID: this.props.BID || ''
        arr_field: form.arr_field
      }
      param.LText = param.LText.replace(/@ID@/ig, `'${this.state.ID || ''}'`)
      param.LText = param.LText.replace(/@BID@/ig, `'${this.props.BID || ''}'`)
      if (window.GLOB.debugger) {
        console.info(param.LText)
      }
      if (window.GLOB.execType === 'x') {
        param.exec_type = 'x'
      }
  
      param.LText = Utils.formatOptions(param.LText, param.exec_type)
      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
      param.secretkey = Utils.encrypt(window.GLOB.execType === 'x' ? '' : param.LText, param.timestamp)
      if (form.database === 'sso' && window.GLOB.mainSystemApi) {
        param.rduri = window.GLOB.mainSystemApi
      }
      if (window.GLOB.mkHS) { // 云端数据验证
        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
      }
  
      return (
@@ -670,6 +995,7 @@
                  message: res.message,
                  duration: 5
                })
                skip = true
              }
              resolve(res)
            })
@@ -680,6 +1006,7 @@
    Promise.all(deffers).then(response => {
      let result = {}
      response.forEach(res => {
        result = {...result, ...res}
      })
@@ -689,16 +1016,23 @@
      delete result.message
      delete result.status
      this.resetFormList(result)
      this.resetFormList(result, skip)
    })
  }
  resetFormList = (result) => {
  resetFormList = (result, skip) => {
    const { BID, action } = this.props
    if (action.$cache && action.setting.cache !== 'false' && !skip) {
      Api.writeCacheConfig(action.uuid, fromJS(result).toJS(), BID, this.state.ID)
    }
    let reFieldsVal = null
    let _formlist = fromJS(this.state.formlist).toJS().map(item => {
      if (['select', 'link', 'radio', 'checkbox', 'checkcard', 'multiselect', 'cascader'].includes(item.type) && result[item.field] && result[item.field].length > 0) {
        let options = []
        let map = new Map()
        let all = false
        result[item.field].forEach(cell => {
          let _cell = { key: Utils.getuuid() , ParentID: ''}
@@ -709,12 +1043,26 @@
          if (item.type !== 'checkcard') {
            _cell.value = cell[item.valueField]
            _cell.label = cell[item.valueText] + ''
            if (!_cell.label || map.has(_cell.ParentID + _cell.value)) return
            if (map.has(_cell.ParentID + _cell.value)) return
            if (!_cell.label) {
              if (!all) {
                _cell.label = '全部'
                all = true
              } else {
                return
              }
            }
            
            map.set(_cell.ParentID + _cell.value, 0)
          } else {
            _cell.$value = cell[item.cardValField]
            _cell = {..._cell, ...cell}
            if (item.urlField) {
              _cell.$url = cell[item.urlField] || ''
            } else if (item.colorField) {
              _cell.$color = cell[item.colorField] || ''
            }
            if (map.has(_cell.ParentID + _cell.$value)) return
            
@@ -744,7 +1092,7 @@
          item.options = item.oriOptions
        }
        if (['select', 'link', 'radio'].includes(item.type) && typeof(item.initval) === 'string' && item.initval.indexOf('$first') > -1) { // 选中第一项
        if (['select', 'link', 'radio'].includes(item.type) && item.$first) { // 选中第一项
          item.initval = item.options[0] ? item.options[0].value : ''
          this.record[item.field] = item.initval
        }
@@ -762,6 +1110,25 @@
            item.subFields.forEach(n => {
              reFieldsVal[n.field] = option[n.field]
            })
          }
        }
        if (item.empty === 'hidden' && item.oriOptions.length > 0 && !item.$hidden) {
          item.hidden = false
        }
        if (item.type === 'checkcard' && item.readonly && item.unchecked === 'hidden') {
          let selectKeys = item.initval
          if (item.multiple === 'true') {
            selectKeys = selectKeys ? selectKeys.split(',') : []
            item.options = item.options.filter(item => selectKeys.includes(item.$value))
          } else {
            item.options = item.options.filter(item => selectKeys === item.$value)
          }
          item.oriOptions = fromJS(item.options).toJS()
          if (item.options.length === 0) {
            item.hidden = true
          } else {
            item.hidden = false
          }
        }
      }
@@ -789,22 +1156,6 @@
    })
  }
  handleConfirmPassword = (rule, value, callback, item) => {
    let val = parseFloat(value)
    if (!isNaN(val)) {
      if (typeof(item.min) === 'number' && val < item.min) {
        callback(item.label + '最小值为 ' + item.min)
      } else if (typeof(item.max) === 'number' && val > item.max) {
        callback(item.label + '最大值为 ' + item.max)
      } else {
        callback()
      }
    } else {
      callback()
    }
  }
  recordChange = (values, item) => {
    this.record = {...this.record, ...values}
@@ -821,7 +1172,27 @@
      current.controlFields.forEach(cell => {
        let m = map.get(cell.field)
        m.hidden = current.hidden || !cell.values.includes(val)
        m.hidden = false
        if (current.hidden) {
          m.hidden = true
        } else {
          let box = [...cell.values]
          if (current.type === 'multiselect' || (current.type === 'checkcard' && current.multiple === 'true')) {
            box.push(...val.split(','))
          } else {
            box.push(val)
          }
          if (box.length === Array.from(new Set(box)).length) {
            m.hidden = true
          }
        }
        if (m.empty === 'hidden' && m.oriOptions.length === 0) {
          m.hidden = true
        }
        if (m.hidden) {
          m.initval = this.record[m.field]
@@ -891,6 +1262,8 @@
          content = (<MKNumberInput config={item} onChange={(val, defer) => !defer && this.recordChange({[item.field]: val})} onSubmit={this.props.inputSubmit} />)
        } else if (item.type === 'select' || item.type === 'link' || item.type === 'multiselect') {
          content = (<MKSelect config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)} onSubmit={this.props.inputSubmit} />)
        } else if (item.type === 'popSelect') {
          content = (<MKPopSelect config={item} BID={this.props.BID} ID={this.state.ID} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)} onSubmit={this.props.inputSubmit} />)
        } else if (item.type === 'cascader') {
          content = (<MkCascader config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)}/>)
        } else if (item.type === 'color') {
@@ -899,7 +1272,9 @@
          className = 'checkcard'
          content = (<MKCheckCard config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)}/>)
        } else if (item.type === 'switch') {
          content = (<MKSwitch config={item} onChange={(val) => this.recordChange({[item.field]: val}, item)}/>)
          content = (<MKSwitch config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)} onSubmit={this.props.inputSubmit}/>)
        } else if (item.type === 'check') {
          content = (<MKCheck config={item} onChange={(val) => this.recordChange({[item.field]: val}, item)} onSubmit={this.props.inputSubmit}/>)
        } else if (item.type === 'checkbox') {
          content = (<MKCheckbox config={item} onChange={(val) => this.recordChange({[item.field]: val})}/>)
        } else if (item.type === 'radio') {
@@ -909,11 +1284,13 @@
        } else if (item.type === 'fileupload') {
          className = item.readonly ? 'readonly' : ''
          className += item.fileType === 'picture-card' ? ' file-upload' : ''
          content = (<MKFileUpload config={item} onChange={(val) => this.recordChange({[item.field]: val})} />)
          content = (<MKFileUpload config={item} data={this.record} onChange={(val, other = {}) => this.recordChange({[item.field]: val, ...other})} />)
        } else if (item.type === 'textarea') {
          content = (<MKTextArea config={item} onChange={(val, defer) => !defer && this.recordChange({[item.field]: val})}/>)
        } else if (item.type === 'rate') {
          content = (<Rate count={item.rateCount} disabled={item.readonly} onChange={(val) => this.recordChange({[item.field]: val})} character={item.character ? <MkIcon type={item.character}/> : <StarFilled />} allowHalf={item.allowHalf}/>)
          content = (<Rate count={item.rateCount} disabled={item.readonly} style={{color: item.color || '#fadb14'}} onChange={(val) => this.recordChange({[item.field]: val})} character={item.character ? <MkIcon type={item.character}/> : <StarFilled />} allowHalf={item.allowHalf}/>)
        } else if (item.type === 'vercode') {
          content = (<MkVercode config={item} record={this.record} onSend={(send_type, timestamp, n_id) => this.setState({send_type, timestamp, n_id})} onChange={(val) => this.recordChange({[item.field]: val})} onSubmit={this.props.inputSubmit}/>)
        } else if (item.type === 'brafteditor') {
          content = (<MKEditor config={item} onChange={(val) => this.recordChange({[item.field]: val})}/>)
          label = item.hidelabel !== 'true' ? label : ''
@@ -944,8 +1321,8 @@
    return fields
  }
  handleConfirm = () => {
    const { formlist } = this.state
  handleConfirm = (formId) => {
    const { formlist, send_type, timestamp, n_id } = this.state
    // 表单提交时检查输入值是否正确
    return new Promise((resolve, reject) => {
@@ -954,7 +1331,7 @@
          reject(err)
          return
        }
        let search = []
        let forms = []
        let record = {...this.record, ...values}
        formlist.forEach(item => {
@@ -962,49 +1339,89 @@
    
          let _item = {
            type: item.type,
            readonly: item.readonly,
            readin: item.readin,
            writein: item.writein,
            fieldlen: item.fieldlength,
            key: item.field
            key: item.field,
            isconst: item.constant === 'true'
          }
    
          _item.value = record[item.field] !== undefined ? record[item.field] : ''
    
          if (item.type === 'funcvar') {
            _item.value = ''
          } else if (_item.value && (item.type === 'text' || item.type === 'textarea' || item.type === 'linkMain') && typeof(_item.value) === 'string') {
            _item.value = _item.value.replace(/\t*|\v*/g, '')       // 去除制表符
            if (item.interception === 'true') {           // 去除首尾空格
              _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
            }
            if (item.type === 'text') { // 特殊字段替换
              _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey)
              _item.value = _item.value.replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || ''))
              _item.value = _item.value.replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
            }
          } else if (item.type.indexOf('date') > -1) {
            if (item.declareType === 'nvarchar(50)') {
              _item.type = 'text'
            }
          } else if (item.declare === 'decimal' && ['select', 'link', 'radio', 'checkcard'].includes(item.type)) {
          } else if (item.declare === 'decimal') {
            _item.type = 'number'
            _item.fieldlen = item.decimal || 0
          }
          if (item.type === 'text' && item.lenControl && item.lenControl !== 'limit') {
            if (item.lenControl === 'left') {
              _item.value = _item.value.substr(0, item.fieldlength)
            } else {
              _item.value = _item.value.slice(-item.fieldlength)
          } else if (['text', 'textarea', 'linkMain'].includes(item.type)) {
            _item.value = _item.value + ''
            _item.value = _item.value.replace(/\t+|\v+/g, '')       // 去除制表符
            if (item.interception !== 'false') {                    // 去除首尾空格
              if (item.interception === 'func') {
                try {
                  // eslint-disable-next-line
                  let func = new Function('value', 'data', item.func)
                  _item.value = func(_item.value, record)
                  _item.value = _item.value !== undefined ? _item.value : ''
                } catch (e) {
                  console.warn(e)
                  _item.value = ''
                }
              } else {
                _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
              }
            }
            if (item.type === 'text' && /@appkey@|@SessionUid@|@bid@/ig.test(_item.value)) { // 特殊字段替换
              _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey).replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || '')).replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
            }
            if (item.type === 'text' && item.lenControl && item.lenControl !== 'limit') {
              if (item.lenControl === 'left') {
                _item.value = _item.value.substr(0, item.fieldlength)
              } else {
                _item.value = _item.value.slice(-item.fieldlength)
              }
            }
          } else if (item.type === 'datemonth') {
            _item.type = 'text'
          } else  if (item.type === 'date') {
            _item.type = item.declareType === 'nvarchar(50)' ? 'text' : 'date'
          } else if (item.type === 'vercode') {
            _item.type = 'text'
            forms.push({
              type: 'text',
              readin: false,
              writein: false,
              fieldlen: 50,
              key: 'mk_timestamp',
              value: timestamp || ''
            })
            forms.push({
              type: 'text',
              readin: false,
              writein: false,
              fieldlen: 50,
              key: 'mk_send_type',
              value: send_type || ''
            })
            forms.push({
              type: 'text',
              readin: false,
              writein: false,
              fieldlen: 50,
              key: 'mk_n_id',
              value: n_id || ''
            })
          }
    
          search.push(_item)
          forms.push(_item)
        })
        resolve(search)
        this.submitId = formId || ''
        resolve(forms)
      })
    })
  }
@@ -1029,4 +1446,4 @@
  }
}
export default Form.create()(MainSearch)
export default Form.create()(MutilFormComponent)