king
2024-06-21 eaf119a885719fdc172037510fd2f263ec3d5471
src/tabviews/zshare/mutilform/index.jsx
@@ -6,7 +6,6 @@
import moment from 'moment'
import Api from '@/api'
import { formRule } from '@/utils/option.js'
import Utils from '@/utils/utils.js'
import asyncComponent from '@/utils/asyncComponent'
import MKEmitter from '@/utils/events.js'
@@ -47,7 +46,9 @@
    send_type: '',
    timestamp: '',
    n_id: '',
    focusId: ''
    focusId: '',
    reFocusId: '',
    dict: window.GLOB.dict
  }
  record = {}
@@ -55,6 +56,7 @@
  componentDidMount () {
    const { action, unload } = this.props
    const { dict } = this.state
    let data = {}
    let BData = {}
@@ -79,7 +81,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 => {
@@ -114,14 +127,8 @@
        }
      }
      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()]
        }
        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'
@@ -142,6 +149,7 @@
      item.readin = item.readin !== 'false' && item.readin !== 'top'
      item.readonly = check || item.readonly === 'true'
      item.writein = item.writein !== 'false'
      item.defHidden = item.hidden === 'true'
      item.hidden = item.hidden === 'true'
      item.fieldlength = item.fieldlength || 50
@@ -261,6 +269,12 @@
        } else {
          newval = item.closeVal
        }
      } else if (item.type === 'popSelect') {
        if (newval && newval !== '$empty') {
          item.showValue = data[item.showField.toLowerCase()] || ''
        } else {
          item.showValue = ''
        }
      }
      if (newval !== '$empty') {
@@ -302,16 +316,16 @@
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
            message: item.label + (dict['not_empty'] || '不可为空!')
          })
        }
        item.rules.push({
          validator: (rule, value, callback) => {
            if (/'/.test(value)) {
              callback('不可使用英文状态的单引号!')
            } else if (/--/.test(value)) {
              callback('不可使用 -- !')
              callback(dict['single_quot'] || '不可使用英文状态的单引号!')
            // } else if (/--/.test(value)) {
            //   callback('不可使用 -- !')
            } else {
              callback()
            }
@@ -321,7 +335,7 @@
        if (!item.lenControl || item.lenControl === 'limit') {
          item.rules.push({
            max: item.fieldlength,
            message: formRule.input.formMessage.replace('@max', item.fieldlength)
            message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength)
          })
        }
@@ -333,7 +347,7 @@
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || formRule.input.numbermsg
              message: item.regularText || dict['enter_num'] || '请输入数字!'
            })
          } else if (item.regular === 'letter') {
            let reg = /^[a-zA-Z]*$/
@@ -342,7 +356,7 @@
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || formRule.input.lettermsg
              message: item.regularText || dict['enter_letter'] || '请输入字母!'
            })
          } else if (item.regular === 'letter_number') {
            let reg = /^[a-zA-Z0-9]*$/
@@ -351,7 +365,7 @@
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || '请输入数字或字母'
              message: item.regularText || dict['enter_num_letter'] || '请输入数字或字母'
            })
          } else if (item.regular === 'letter&number') {
            let reg = /^[a-zA-Z0-9@_.]*$/
@@ -360,33 +374,35 @@
            }
            item.rules.push({
              pattern: reg,
              message: item.regularText || '请输入数字、字母以及@_.'
              message: item.regularText || dict['enter_num_letter_char'] || '请输入数字、字母以及@_.'
            })
          } else if (item.regular === 'phone') {
            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: item.regularText || '请正确输入手机号'
              message: item.regularText || dict['phone_error'] || '请正确输入手机号'
            })
          } else if (item.regular === 'email') {
            item.rules.push({
              pattern: /^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/,
              message: item.regularText || '请正确输入邮箱地址'
              message: item.regularText || dict['email_error'] || '请正确输入邮箱地址'
            })
          }
        }
      } else if (item.type === 'number') {
        item.rules = [{
          required: true,
          message: item.label + '不可为空!'
          message: item.label + (dict['not_empty'] || '不可为空!')
        }]
        if (typeof(item.min) === 'number' || typeof(item.max) === 'number') {
        if (typeof(item.min) === 'number' || typeof(item.max) === 'number' || item.notZero === 'true') {
          item.rules.push({
            validator: (rule, value, callback) => {
              if (isNaN(value)) {
                callback()
              } else if (item.notZero === 'true' && value === 0) {
                callback(item.label + (dict['not_zero'] || '不可为0'))
              } else if (typeof(item.min) === 'number' && value < item.min) {
                if (item.min < 1e-6) {
                if (item.min > 0 && item.min < 1e-6) {
                  if (item.min === 1e-6) {
                    callback(item.label + '最小值为 0.000001')
                  } else if (item.min === 1e-7) {
@@ -400,13 +416,13 @@
                  } else if (item.min === 1e-11) {
                    callback(item.label + '最小值为 0.00000000001')
                  } else {
                    callback(item.label + '最小值为 ' + item.min)
                    callback(item.label + (dict['less_limit'] || '最小值为 ') + item.min)
                  }
                } else {
                  callback(item.label + '最小值为 ' + item.min)
                  callback(item.label + (dict['less_limit'] || '最小值为 ') + item.min)
                }
              } else if (typeof(item.max) === 'number' && value > item.max) {
                callback(item.label + '最大值为 ' + item.max)
                callback(item.label + (dict['max_limit'] || '最大值为 ') + item.max)
              } else {
                callback()
              }
@@ -417,48 +433,54 @@
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
            message: item.label + (dict['not_empty'] || '不可为空!')
          })
        }
        item.rules.push({
          validator: (rule, value, callback) => {
            if (/'/.test(value)) {
              callback('不可使用英文状态的单引号!')
            } else if (/--/.test(value)) {
              callback('不可使用 -- !')
              callback(dict['single_quot'] || '不可使用英文状态的单引号!')
            // } else if (/--/.test(value)) {
            //   callback('不可使用 -- !')
            } else {
              callback()
            }
          }
        }, {
          max: item.fieldlength,
          message: formRule.input.formMessage.replace('@max', item.fieldlength)
          message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength)
        })
      } else if (item.type === 'brafteditor') {
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
            message: item.label + (dict['not_empty'] || '不可为空!')
          })
        }
        item.rules.push({
          max: item.fieldlength,
          message: formRule.input.formMessage.replace('@max', item.fieldlength)
          message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength)
        })
      } else if (item.type === 'linkMain' || item.type === 'vercode') {
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: item.label + '不可为空!'
            message: item.label + (dict['not_empty'] || '不可为空!')
          })
        }
      } else {
        if (item.required === 'true') {
          item.rules.push({
            required: true,
            message: '请选择' + item.label + '!'
            message: (dict['select_tip'] || '请选择') + item.label + '!'
          })
        }
        if (['cascader', 'checkbox', 'checkcard', 'fileupload', 'multiselect'].includes(item.type) && item.fieldlength) {
          item.rules.push({
            max: item.fieldlength,
            message: (dict['max_char'] || '最多@max个字符').replace('@max', item.fieldlength)
          })
        }
      }
@@ -485,7 +507,7 @@
        let _hidden = false
        if (supItem.hidden) {
        if (supItem.hidden && !supItem.defHidden) {
          _hidden = true
        } else {
          let box = [...item.values]
@@ -523,7 +545,7 @@
        cell.labelCol = {style: {width: cell.labelwidth + '%'}}
        cell.wrapperCol = {style: {width: (100 - cell.labelwidth) + '%'}}
      }
      if (!cell.field || !fieldMap.has(cell.field)) return cell
      if (!cell.field || !fieldMap.has(cell.field) || ['hint', 'split', 'formula'].includes(cell.type)) return cell
      let item = fieldMap.get(cell.field)
      // 下级表单控制-字段写入
@@ -532,7 +554,7 @@
          item.subFields = []
          item.linkSubField.forEach(m => {
            let n = fieldMap.get(m)
            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
            if (n && ['text', 'number', 'textarea', 'select'].includes(n.type)) {
              item.subFields.push({
                uuid: n.uuid,
                field: m
@@ -555,7 +577,7 @@
          item.subFields = []
          item.linkSubField.forEach(m => {
            let n = fieldMap.get(m)
            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
            if (n && ['text', 'number', 'textarea', 'select'].includes(n.type)) {
              item.subFields.push({
                uuid: n.uuid,
                field: m
@@ -575,7 +597,7 @@
          item.subFields = []
          item.linkSubField.forEach(m => {
            let n = fieldMap.get(m)
            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
            if (n && ['text', 'number', 'textarea', 'select'].includes(n.type)) {
              item.subFields.push({
                uuid: n.uuid,
                field: m
@@ -587,7 +609,7 @@
          item.subFields = []
          item.linkSubField.forEach(m => {
            let n = fieldMap.get(m)
            if (n && ['text', 'number', 'textarea'].includes(n.type)) {
            if (n && ['text', 'number', 'textarea', 'select'].includes(n.type)) {
              item.subFields.push({
                uuid: n.uuid,
                field: m
@@ -604,7 +626,11 @@
        item.supInitVal = ''
        if (fieldMap.has(item.linkField)) {
          item.supInitVal = fieldMap.get(item.linkField).initval || ''
          let supitem = fieldMap.get(item.linkField)
          item.supInitVal = supitem.initval || ''
          if (supitem.$first) {
            item.$resetSup = true
          }
        } else if (data.hasOwnProperty(item.linkField.toLowerCase())) {
          item.supInitVal = data[item.linkField.toLowerCase()]
        }
@@ -680,14 +706,24 @@
      focusItem = fieldMap.get(action.setting.focus)
    }
    this.setState({ formlist, ID, focusId: focusItem ? focusItem.uuid : '' }, () => {
    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)
          }, 50)
          }, 20)
        } else {
          setTimeout(() => {
            MKEmitter.emit('mkFC', 'focus', focusItem.uuid)
@@ -713,6 +749,7 @@
    if (action.subButton && action.subButton.resetForms) {
      MKEmitter.addListener('resetForms', this.resetForms)
    }
    MKEmitter.addListener('resetFocus', this.resetFocus)
  }
  componentWillUnmount () {
@@ -720,11 +757,32 @@
      return
    }
    MKEmitter.removeListener('resetForms', this.resetForms)
    MKEmitter.removeListener('resetFocus', this.resetFocus)
  }
  resetForms = (id) => {
  resetFocus = (id, field) => {
    const { action } = this.props
    const { focusId } = this.state
    if (id !== action.uuid) return
    let focusId = ''
    this.state.formlist.forEach(item => {
      if (item.field === field) {
        focusId = item.uuid
      }
    })
    if (!focusId) return
    setTimeout(() => {
      MKEmitter.emit('mkFC', 'focus', focusId)
    }, 20)
  }
  resetForms = (id, data) => {
    const { action } = this.props
    const { focusId, reFocusId } = this.state
    if (id !== action.uuid) return
@@ -735,8 +793,14 @@
      if (item.type !== 'text' && item.type !== 'number') return item
      if (resetForms.includes(item.field)) {
        item.initval = item.orgval
        this.record[item.field] = item.orgval
        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
@@ -760,10 +824,10 @@
      })
    })
    if (focusId || this.submitId) {
    if (reFocusId || focusId || this.submitId) {
      setTimeout(() => {
        MKEmitter.emit('mkFC', 'focus', this.submitId || focusId)
      }, 50)
        MKEmitter.emit('mkFC', 'focus', this.submitId || reFocusId || focusId)
      }, 20)
    }
  }
@@ -834,9 +898,13 @@
    }
    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)
@@ -869,9 +937,13 @@
    }
    if (mainparam.LText) {
      mainparam.LText = Utils.formatOptions(mainparam.LText)
      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(mainparam.LText, mainparam.timestamp)
      mainparam.secretkey = Utils.encrypt(window.GLOB.execType === 'x' ? '' : mainparam.LText, mainparam.timestamp)
      if (window.GLOB.mainSystemApi) {
        mainparam.rduri = window.GLOB.mainSystemApi
@@ -933,10 +1005,14 @@
      if (window.GLOB.debugger) {
        console.info(param.LText)
      }
      if (window.GLOB.execType === 'x') {
        param.exec_type = 'x'
      }
  
      param.LText = Utils.formatOptions(param.LText)
      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
@@ -1046,7 +1122,11 @@
        // if (item.type === 'link') {
        if (item.linkField) {
          item.options = item.oriOptions.filter(option => option.ParentID === item.supInitVal || option.value === '')
          let supInitVal = item.supInitVal
          if (item.$resetSup) {
            supInitVal = this.record[item.linkField]
          }
          item.options = item.oriOptions.filter(option => option.ParentID === supInitVal || option.value === '')
        // } else if (['select', 'radio', 'checkbox', 'checkcard', 'multiselect'].includes(item.type)) {
        } else {
          item.options = item.oriOptions
@@ -1188,11 +1268,17 @@
      if (item.hidden) return
      if (item.type === 'split') {
        fields.push(
          <Col span={24} key={index}>
            <p className="mk-form-split-line" style={item.style}>{item.label}</p>
          </Col>
        )
        if (item.opacity === 'false') {
          fields.push(
            <div key={index}></div>
          )
        } else {
          fields.push(
            <Col span={24} key={index}>
              <p className="mk-form-split-line" style={item.style}>{item.label}</p>
            </Col>
          )
        }
      } else if (item.type === 'hint') {
        fields.push(
          <Col span={item.span || 24} key={index}>
@@ -1232,19 +1318,19 @@
          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, other) => this.recordChange({[item.field]: val, ...other}, 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)}/>)
          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') {
          content = (<MKRadio config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)}/>)
        } else if (item.type === 'date' || item.type === 'datemonth') {
          content = (<MKDatePicker config={item} onChange={(val) => this.recordChange({[item.field]: val})} />)
          content = (<MKDatePicker config={item} onChange={(val) => this.recordChange({[item.field]: val})} onSubmit={this.props.inputSubmit}/>)
        } else if (item.type === 'fileupload') {
          className = item.readonly ? 'readonly' : ''
          className += item.fileType === 'picture-card' ? ' file-upload' : ''
          content = (<MKFileUpload config={item} onChange={(val, other = {}) => this.recordChange({[item.field]: val, ...other})} />)
          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') {
@@ -1295,7 +1381,7 @@
        let record = {...this.record, ...values}
        formlist.forEach(item => {
          if (!item.field) return
          if (!item.field || ['hint', 'split', 'formula'].includes(item.type)) return
    
          let _item = {
            type: item.type,
@@ -1328,6 +1414,20 @@
                  console.warn(e)
                  _item.value = ''
                }
              } else if (item.interception === 'charTure') {
                let str = _item.value.replace(/(^\s*|\s*$)/g, '')
                let result = ''
                for (let i = 0 ; i < str.length; i++) {
                  let code = str.charCodeAt(i)
                  if (code >= 65281 && code <= 65373) {
                    result += String.fromCharCode(str.charCodeAt(i) - 65248)
                  } else if (code === 12288) {
                    result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32)
                  } else {
                    result += str.charAt(i)
                  }
                }
                _item.value = result
              } else {
                _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
              }