king
2020-06-09 f448bd7b318f7696c97b392a263bc364700bc8a0
src/tabviews/zshare/mutilform/index.jsx
@@ -21,15 +21,15 @@
  }
  state = {
    cols: 2,
    datatype: null,
    readtype: null,
    readin: null,
    fieldlen: null,
    formlist: [],
    cols: 2,         // 显示为多少列
    datatype: null,  // 数据类型
    readtype: null,  // 是否只读
    readin: null,    // 行数据是否写入
    fieldlen: null,  // 字段长度
    formlist: [],    // 表单项
    encrypts: [],    // 加密字段
    intercepts: [],  // 截取字段
    record: {}
    record: {}       // 记录下拉表单关联字段,用于数据写入
  }
  UNSAFE_componentWillMount () {
@@ -81,19 +81,24 @@
    formlist = formlist.map(item => {
      if (item.type === 'title') return item
      // 加密字段
      if (item.type === 'textarea' && item.encryption === 'true') {
        encrypts.push(item.field)
      }
      // 字符截取字段
      if (item.interception === 'true') {
        intercepts.push(item.field)
      }
      // 数据写入
      let _readin = item.readin !== 'false'
      if (item.type === 'linkMain' || item.type === 'funcvar') {
        _readin = false
      }
      item.initVal = typeof(item.initval) === 'object' ? JSON.parse(JSON.stringify(item.initval)) : item.initval // 用于受控值的表单,隐藏时传默认值
      // 用于受控值的表单,隐藏时传默认值(未使用?)
      item.initVal = typeof(item.initval) === 'object' ? JSON.parse(JSON.stringify(item.initval)) : item.initval
      let _fieldlen = item.fieldlength || 50
      if (item.type === 'textarea' || item.type === 'fileupload' || item.type === 'multiselect') {
@@ -120,22 +125,65 @@
          item.options = [...item.options, ...this.props.configMap[item.uuid]]
        }
        // 保存初始列表,用于关联菜单控制
        item.oriOptions = JSON.parse(JSON.stringify(item.options))
        // 下级表单控制-字段写入
        if (item.linkSubField && item.linkSubField.length > 0) {
          let _fields = _inputfields.map(_item => _item.field)
          item.linkSubField = item.linkSubField.filter(_item => _fields.includes(_item))
        }
      }
      let newval = '$$initval$$'
      let newval = ''
      if (item.type === 'linkMain' && BData && BData.hasOwnProperty(item.field)) {
        newval = BData[item.field]
      } else if (item.type !== 'linkMain' && _readin && !/^date/.test(item.type) && this.props.data && this.props.data.hasOwnProperty(item.field)) {
        newval = this.props.data[item.field]
      } else if (item.type === 'date') { // 时间搜索
        if (_readin && this.props.data && this.props.data.hasOwnProperty(item.field)) {
          newval = this.props.data[item.field]
        }
        if (newval) {
          newval = moment(newval, 'YYYY-MM-DD')
          newval = newval.format('YYYY-MM-DD') === 'Invalid date' ? '' : newval
        }
        if (!newval && item.initval) {
          newval = moment().subtract(item.initval, 'days')
        } else if (!newval) {
          newval = null
        }
      } else if (item.type === 'datemonth') {
        if (_readin && this.props.data && this.props.data.hasOwnProperty(item.field)) {
          newval = this.props.data[item.field]
        }
        if (newval) {
          newval = moment(newval, 'YYYY-MM')
          newval = newval.format('YYYY-MM') === 'Invalid date' ? '' : newval
        }
        if (!newval && item.initval) {
          newval = moment().subtract(item.initval, 'month')
        } else if (!newval) {
          newval = null
        }
      } else if (item.type === 'datetime') {
        if (_readin && this.props.data && this.props.data.hasOwnProperty(item.field)) {
          newval = this.props.data[item.field]
        }
        if (newval) {
          newval = moment(newval, 'YYYY-MM-DD HH:mm:ss')
          newval = newval.format('YYYY-MM-DD HH:mm:ss') === 'Invalid date' ? '' : newval
        }
        if (!newval && item.initval) {
          newval = moment().subtract(item.initval, 'days')
        } else if (!newval) {
          newval = null
        }
      }
      if (encrypts.includes(item.field) && newval !== '$$initval$$') {
      // 加密字段,解密处理
      if (item.type === 'textarea' && item.encryption === 'true' && newval !== '') {
        try {
          newval = window.decodeURIComponent(window.atob(newval))
        } catch (e) {
@@ -143,10 +191,10 @@
        }
      }
      if (newval !== '$$initval$$') {
        item.initval = newval
      }
      // 读取表格数据或设有时间的初始值
      item.initval = newval !== '' ? newval : item.initval
      // 下拉表单,存在上级菜单时,生成显示值列表,优先以数字判断
      if (item.supvalue) {
        let supvals = []
        item.supvalue.split(',').forEach(val => {
@@ -317,9 +365,6 @@
    const fields = []
    formlist.forEach((item, index) => {
      // if ((!item.field && item.type !== 'title') || item.hidden === 'true') return
      // if (item.supField && !item.supvalue.includes(this.props.form.getFieldValue(item.supField))) return
      if (item.type === 'title') {
        fields.push(
          <Col span={24} key={index}>
@@ -459,17 +504,11 @@
          </Col>
        )
      } else if (item.type === 'date') { // 时间搜索
        let _initval = this.props.data ? this.props.data[item.field] : ''
        if (_initval && this.state.readin[item.field]) {
          _initval = moment(_initval, 'YYYY-MM-DD')
        } else {
          _initval = item.initval ? moment().subtract(item.initval, 'days') : null
        }
        fields.push(
          <Col span={24 / cols} key={index}>
            <Form.Item label={item.label}>
              {getFieldDecorator(item.field, {
                initialValue: _initval,
                initialValue: item.initval,
                rules: [
                  {
                    required: item.required === 'true',
@@ -483,17 +522,11 @@
          </Col>
        )
      } else if (item.type === 'datemonth') {
        let _initval = this.props.data ? this.props.data[item.field] : ''
        if (_initval && this.state.readin[item.field]) {
          _initval = moment(_initval, 'YYYY-MM')
        } else {
          _initval = item.initval ? moment().subtract(item.initval, 'month') : null
        }
        fields.push(
          <Col span={24 / cols} key={index}>
            <Form.Item label={item.label}>
              {getFieldDecorator(item.field, {
                initialValue: _initval,
                initialValue: item.initval,
                rules: [
                  {
                    required: item.required === 'true',
@@ -507,17 +540,11 @@
          </Col>
        )
      } else if (item.type === 'datetime') {
        let _initval = this.props.data ? this.props.data[item.field] : ''
        if (_initval && this.state.readin[item.field]) {
          _initval = moment(_initval, 'YYYY-MM-DD HH:mm:ss')
        } else {
          _initval = item.initval ? moment().subtract(item.initval, 'days') : null
        }
        fields.push(
          <Col span={24 / cols} key={index}>
            <Form.Item label={item.label}>
              {getFieldDecorator(item.field, {
                initialValue: _initval,
                initialValue: item.initval,
                rules: [
                  {
                    required: item.required === 'true',
@@ -525,7 +552,6 @@
                  }
                ]
              })(
                // <DatePicker showTime getCalendarContainer={() => document.getElementById('form-box')} />
                <DatePicker showTime disabled={item.readonly === 'true'} />
              )}
            </Form.Item>
@@ -620,9 +646,14 @@
  }
  handleConfirm = () => {
    const { record, encrypts, intercepts } = this.state
    const { record, intercepts } = this.state
    let _encrypts = JSON.parse(JSON.stringify(this.state.encrypts))
    let _format = {
      date: 'YYYY-MM-DD',
      datemonth: 'YYYY-MM',
      datetime: 'YYYY-MM-DD HH:mm:ss'
    }
    let _encrypts = JSON.parse(JSON.stringify(encrypts))
    // 表单提交时检查输入值是否正确
    return new Promise((resolve, reject) => {
      this.props.form.validateFieldsAndScroll((err, values) => {
@@ -632,56 +663,63 @@
          this.state.formlist.forEach(item => {
            if (!item.field) return
            let _item = null
            if (item.type === 'funcvar') {
              search.push({
              _item = {
                type: 'funcvar',
                readonly: 'true',
                readin: false,
                fieldlen: this.state.fieldlen[item.field],
                key: item.field,
                value: ''
              })
              }
            } else if (item.hidden === 'true') {
              let _val = item.initval
              if (record.hasOwnProperty(item.field)) {
                _val = record[item.field]
                _encrypts = _encrypts.filter(_field => _field !== item.field)
                _encrypts = _encrypts.filter(_field => _field !== item.field) // 隐藏字段,不参与加密处理
              }
              
              search.push({
              _item = {
                type: this.state.datatype[item.field],
                readonly: this.state.readtype[item.field],
                readin: this.state.readin[item.field],
                fieldlen: this.state.fieldlen[item.field],
                key: item.field,
                value: _val
              })
              }
            } else if (item.supField && !item.supvalue.includes(this.props.form.getFieldValue(item.supField))) {
              search.push({
              _item = {
                type: this.state.datatype[item.field],
                readonly: this.state.readtype[item.field],
                readin: this.state.readin[item.field],
                fieldlen: this.state.fieldlen[item.field],
                key: item.field,
                value: item.initval
              })
            }
            }
            if (!_item) return
            if (item.type === 'date' || item.type === 'datemonth' || item.type === 'datetime') {
              if (_item.value && _item.value.format) {
                _item.value = _item.value.format(_format[item.type])
              } else if (!_item.value) {
                _item.value = ''
              }
            }
            search.push(_item)
          })
          Object.keys(values).forEach(key => {
            let _value = ''
            if (this.state.datatype[key] === 'datetime') {
              if (values[key]) {
                _value = moment(values[key]).format('YYYY-MM-DD HH:mm:ss')
              }
              _value = values[key] ? moment(values[key]).format('YYYY-MM-DD HH:mm:ss') : ''
            } else if (this.state.datatype[key] === 'datemonth') {
              if (values[key]) {
                _value = moment(values[key]).format('YYYY-MM')
              }
              _value = values[key] ? moment(values[key]).format('YYYY-MM') : ''
            } else if (this.state.datatype[key] === 'date') {
              if (values[key]) {
                _value = moment(values[key]).format('YYYY-MM-DD')
              }
              _value = values[key] ? moment(values[key]).format('YYYY-MM-DD') : ''
            } else if (this.state.datatype[key] === 'number') {
              _value = values[key]
@@ -723,6 +761,7 @@
            })
          })
          // 含有加密字段时,对表单值进行加密
          if (_encrypts && _encrypts.length > 0) {
            search = search.map(item => {
              let _value = item.value
@@ -769,6 +808,7 @@
    let rowIndex = 0
    let colIndex = 0
    // 表单分行,避免排列不整齐
    formlist.forEach(item => {
      if ((!item.field && item.type !== 'title') || item.hidden === 'true' || item.type === 'funcvar') return
@@ -796,7 +836,6 @@
    return (
      <Form {...formItemLayout} className="ant-advanced-search-form main-form-field" id="main-form-box">
        {/* <Row gutter={24}>{this.getFields(formlist)}</Row> */}
        {_formlist.map((formrow, index) => <Row key={index} gutter={24}>{this.getFields(formrow)}</Row>)}
      </Form>
    )