king
2020-07-14 f36141f3075edf9d41928d64f759ad6bd1b1ac60
src/tabviews/zshare/topSearch/index.jsx
@@ -1,8 +1,10 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { fromJS } from 'immutable'
import { Form, Row, Col, Input, Button, Select, DatePicker, notification } from 'antd'
import moment from 'moment'
import Api from '@/api'
import DateGroup from '@/tabviews/zshare/dategroup'
import Utils from '@/utils/utils.js'
import './index.scss'
@@ -11,8 +13,11 @@
class MainSearch extends Component {
  static propTpyes = {
    BID: PropTypes.any,          // 父级Id,用于查询下拉选择项
    dataManager: PropTypes.any,  // 数据权限
    menuType: PropTypes.any,     // 菜单权限,是否为HS
    searchlist: PropTypes.array, // 搜索条件列表
    dict: PropTypes.object // 字典项
    dict: PropTypes.object       // 字典项
  }
  state = {
@@ -26,7 +31,7 @@
  }
  UNSAFE_componentWillMount () {
    let searchlist = JSON.parse(JSON.stringify(this.props.searchlist))
    let searchlist = fromJS(this.props.searchlist).toJS()
    let match = {}
    let label = {}
    let style = {}
@@ -46,7 +51,14 @@
      required[item.field] = item.required === 'true'
      if (item.type === 'select' || item.type === 'link') {
        item.oriOptions = JSON.parse(JSON.stringify(item.options))
        if (item.setAll === 'true') {
          item.options.unshift({
            key: Utils.getuuid(),
            Value: '',
            Text: this.props.dict['main.all']
          })
        }
        item.oriOptions = fromJS(item.options).toJS()
      }
      _list.push(item)
@@ -66,8 +78,8 @@
        } else {
          item.options = item.oriOptions.filter(option => option.parentId === supItem.initval)
        }
      } else if (item.type === 'group') {
        _groups.push(JSON.parse(JSON.stringify(item)))
      } else if (item.type === 'group' && item.Hide !== 'true') {
        _groups.push(fromJS(item).toJS())
      }
      return item
@@ -80,45 +92,138 @@
      required: required,
      searchlist: _list,
      groups: _groups
    }, () => {
      this.improveSearch()
    })
  }
  UNSAFE_componentWillReceiveProps(nextProps) {
    let searchlist = JSON.parse(JSON.stringify(nextProps.searchlist))
    let _list = []
    let fieldMap = new Map()
  improveSearch = () => {
    let searchlist = fromJS(this.props.searchlist).toJS()
    let deffers = []
    searchlist.forEach(item => {
      if (fieldMap.has(item.field)) {
        item.field = item.field + '@tail@'
      }
      fieldMap.set(item.field, true)
      if (item.type !== 'multiselect' && item.type !== 'select' && item.type !== 'link') return
      if (item.type === 'select' || item.type === 'link') {
        item.oriOptions = JSON.parse(JSON.stringify(item.options))
      if (item.setAll === 'true') {
        item.options.unshift({
          key: Utils.getuuid(),
          Value: '',
          Text: this.props.dict['main.all']
        })
      }
      _list.push(item)
    })
      if (item.resourceType === '1' && item.dataSource) {
        let _option = Utils.getSelectQueryOptions(item)
        let _sql = Utils.formatOptions(_option.sql)
        let isSSO = item.database === 'sso'
    _list = _list.map(item => {
      if (item.type === 'link') {
        let supItem = _list.filter(form => form.field === item.linkField)[0]
        if (supItem) {
          item.options = item.oriOptions.filter(option => option.parentId === supItem.initval)
        let param = {
          func: 'sPC_Get_SelectedList',
          LText: _sql,
          obj_name: 'data',
          arr_field: _option.field
        }
      }
      return item
        if (this.props.BID) {
          param.BID = this.props.BID
        }
        if (this.props.dataManager) { // 数据权限
          param.LText = param.LText.replace(/\$@/ig, '/*')
          param.LText = param.LText.replace(/@\$/ig, '*/')
        } else {
          param.LText = param.LText.replace(/@\$|\$@/ig, '')
        }
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
        if (this.props.menuType === 'HS') { // 云端数据验证
          param.open_key = Utils.encrypt(param.secretkey, param.timestamp, true)
        }
        let defer = new Promise(resolve => {
          Api.getSystemCacheConfig(param, isSSO).then(res => {
            res.search = item
            resolve(res)
          })
        })
        deffers.push(defer)
      } else if (item.resourceType === '1' && !item.dataSource) {
        notification.warning({
          top: 92,
          message: item.label + ': ' + this.props.dict['main.datasource.settingerror'],
          duration: 5
        })
      }
    })
    this.setState({
      searchlist: _list
    if (deffers.length === 0) {
      return
    }
    Promise.all(deffers).then(result => {
      result.forEach(res => {
        if (res.status) {
          searchlist = searchlist.map(item => {
            if (item.uuid === res.search.uuid) {
              res.data.forEach(cell => {
                let _item = {
                  key: Utils.getuuid(),
                  Value: cell[res.search.valueField],
                  Text: cell[res.search.valueText]
                }
                if (res.search.type === 'link') {
                  _item.parentId = cell[res.search.linkField]
                }
                item.options.push(_item)
              })
            }
            return item
          })
        } else {
          notification.warning({
            top: 92,
            message: res.search.label + ':' + res.message,
            duration: 5
          })
        }
      })
      let _list = []
      let fieldMap = new Map()
      searchlist.forEach(item => {
        if (fieldMap.has(item.field)) {
          item.field = item.field + '@tail@'
        }
        fieldMap.set(item.field, true)
        if (item.type === 'select' || item.type === 'link') {
          item.oriOptions = fromJS(item.options).toJS()
        }
        _list.push(item)
      })
      _list = _list.map(item => {
        if (item.type === 'link') {
          let supItem = _list.filter(form => form.field === item.linkField)[0]
          if (supItem) {
            item.options = item.oriOptions.filter(option => option.parentId === supItem.initval)
          }
        }
        return item
      })
      this.setState({searchlist: _list})
    })
  }
  resetform = (formlist, supfields, index) => {
  resetform = (formlist, supfields, index, fieldsvalue) => {
    index++
    let subfields = []
@@ -127,7 +232,10 @@
        if (item.type === 'link' && item.linkField === supfield.field) {
          item.options = item.oriOptions.filter(option => option.parentId === supfield.initval)
          item.initval = item.options[0] ? item.options[0].Value : ''
          item.hiden = true
          if (this.props.form.getFieldValue(item.field) !== undefined) {
            fieldsvalue[item.field] = item.initval
          }
  
          subfields.push(item)
        }
@@ -138,19 +246,23 @@
    if (subfields.length === 0 || index > 6) {
      return formlist
    } else {
      return this.resetform(formlist, subfields, index)
      return this.resetform(formlist, subfields, index, fieldsvalue)
    }
  }
  selectChange = (_field, value) => {
    let formlist = JSON.parse(JSON.stringify(this.state.searchlist))
    let formlist = fromJS(this.state.searchlist).toJS()
    let subfields = []
    let fieldsvalue = {}
    formlist = formlist.map(item => {
      if (item.type === 'link' && item.linkField === _field.field) {
        item.options = item.oriOptions.filter(option => option.parentId === value)
        item.initval = item.options[0] ? item.options[0].Value : ''
        item.hiden = true
        if (this.props.form.getFieldValue(item.field) !== undefined) {
          fieldsvalue[item.field] = item.initval
        }
        subfields.push(item)
      }
@@ -162,19 +274,16 @@
      return
    }
    formlist = this.resetform(formlist, subfields, 0)
    formlist = this.resetform(formlist, subfields, 0, fieldsvalue)
    if (Object.keys(fieldsvalue).length > 0) {
      this.props.form.setFieldsValue(fieldsvalue)
    }
    this.setState({
      searchlist: formlist
    }, () => {
      this.setState({
        searchlist: formlist.map(item => {
          item.hiden = false
          return item
        })
      }, () => {
        this.searchChange()
      })
      this.searchChange()
    })
  }
@@ -183,7 +292,7 @@
    const fields = []
    this.state.searchlist.forEach((item, index) => {
      if (item.hidden) return
      if (item.Hide === 'true') return
      
      if (item.type === 'text') { // 文本搜索
        fields.push(
@@ -373,10 +482,46 @@
    return fields
  }
  addHideFieldValue = (values) => {
    const { searchlist } = this.state
    let hideValue = {}
    searchlist.forEach(item => {
      if (item.Hide === 'true') {
        let value = ''
        if (item.type === 'multiselect') { // 下拉多选
          value = item.initval ? item.initval.split(',').filter(Boolean) : []
        } else if (item.type === 'date') { // 时间搜索
          value = item.initval ? moment().subtract(item.initval, 'days') : ''
        } else if (item.type === 'datemonth') {
          value = item.initval ? moment().subtract(item.initval, 'month') : ''
        } else if (item.type === 'dateweek') {
          value = item.initval ? moment().subtract(item.initval * 7, 'days') : ''
        } else if (item.type === 'daterange') {
          if (item.initval) {
            try {
              let _initval = JSON.parse(item.initval)
              value = [moment().subtract(_initval[0], 'days'), moment().subtract(_initval[1], 'days')]
            } catch {
              value = ''
            }
          }
        } else {
          value = item.initval
        }
        hideValue[item.field] = value
      }
    })
    return {...hideValue, ...values}
  }
  handleSearch = (e) => {
    // 回车或点击搜索
    e.preventDefault()
    this.props.form.validateFields((err, values) => {
      values = this.addHideFieldValue(values)
      let searches = this.getFieldsValues(values)
      this.props.refreshdata(searches)
    })
@@ -385,6 +530,7 @@
  searchChange = () => {
    this.setState({}, () => {
      this.props.form.validateFields((err, values) => {
        values = this.addHideFieldValue(values)
        let searches = this.getFieldsValues(values)
        this.props.refreshdata(searches)
      })
@@ -402,12 +548,21 @@
        this.refs[item.uuid].reset()
      })
    }
    this.props.form.resetFields()
    this.props.form.validateFields((err, values) => {
      // 异步获取更新后的时间组
      this.setState({}, () => {
        let searches = this.getFieldsValues(values)
        this.props.refreshdata(searches)
    let searchlist = this.state.searchlist.map(item => {
      item.initval = item.oriInitval
      return item
    })
    this.setState({searchlist}, () => {
      this.props.form.resetFields()
      this.props.form.validateFields((err, values) => {
        // 异步获取更新后的时间组
        this.setState({}, () => {
          values = this.addHideFieldValue(values)
          let searches = this.getFieldsValues(values)
          this.props.refreshdata(searches)
        })
      })
    })
  }