king
2021-07-28 137fb8ea6af2789b3238b22bac31d80bced41dfe
src/tabviews/custom/components/table/normal-table/index.jsx
@@ -2,7 +2,7 @@
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import { is, fromJS } from 'immutable'
import { notification } from 'antd'
import { notification, Collapse } from 'antd'
import Api from '@/api'
import Utils from '@/utils/utils.js'
@@ -18,6 +18,8 @@
const MainAction = asyncComponent(() => import('@/tabviews/zshare/actionList'))
const MainTable = asyncComponent(() => import('@/tabviews/custom/components/share/normalTable'))
const NormalHeader = asyncComponent(() => import('@/tabviews/custom/components/share/normalheader'))
const { Panel } = Collapse
class NormalTable extends Component {
  static propTpyes = {
@@ -46,7 +48,6 @@
    pageSize: 10,         // 每页数据条数
    orderBy: '',          // 排序
    search: '',           // 搜索条件数组,使用时需分场景处理
    statFields: [],       // 合计字段
    statFValue: []        // 合计值
  }
@@ -74,6 +75,7 @@
        item.key = index
        item.$$uuid = item[_config.setting.primaryKey] || ''
        item.$$BID = BID || ''
        item.$Index = index + 1 + ''
        return item
      })
    }
@@ -95,13 +97,25 @@
      }
    })
    let setting = {..._config.setting, ..._config.wrap, style: {}}
    if (setting.color) {
      setting.style.color = setting.color
    }
    if (setting.fontSize) {
      setting.style.fontSize = setting.fontSize
    }
    if (_config.wrap.collapse === 'true') {
      _config.wrap.title = _config.wrap.title || ' '
    }
    this.setState({
      BID: BID || '',
      title: _config.wrap.title,
      sync: _sync,
      data: _data,
      config: _config,
      setting: {..._config.setting, ..._config.wrap},
      setting: setting,
      searchlist: _config.search,
      actions: _config.action,
      columns: _config.cols,
@@ -110,6 +124,8 @@
    }, () => {
      if (_config.setting.sync !== 'true' && _config.setting.onload === 'true') {
        this.loadmaindata()
        this.getStatFieldsValue()
      } else if (_config.setting.onload === 'true') {
        this.getStatFieldsValue()
      }
    })
@@ -123,7 +139,6 @@
  async loadmaindata (reset, repage) {
    const { mainSearch } = this.props
    const { setting, config, arr_field, search, orderBy, BID, pageIndex, pageSize } = this.state
    let requireFields = search.filter(item => item.required && (!item.value || item.value.length === 0))
    if (setting.supModule && !BID) { // BID 不存在时,不做查询
      this.setState({
@@ -135,26 +150,20 @@
      reset && MKEmitter.emit('resetTable', config.uuid, repage) // 列表重置
      return
    }
    if (requireFields.length > 0) {
      let labels = requireFields.map(item => item.label)
      labels = Array.from(new Set(labels))
      notification.warning({
        top: 92,
        message: this.state.dict['form.required.input'] + labels.join('、') + ' !',
        duration: 3
      })
      return
    }
    let searches = fromJS(search).toJS()
    if (mainSearch && mainSearch.length > 0) { // 主表搜索条件
    if (config.setting.useMSearch && mainSearch && mainSearch.length > 0) { // 主表搜索条件
      let keys = searches.map(item => item.key.toLowerCase())
      mainSearch.forEach(item => {
        if (!keys.includes(item.key.toLowerCase())) {
          searches.push(item)
        }
      })
    }
    let requireFields = searches.filter(item => item.required && item.value === '')
    if (requireFields.length > 0) {
      return
    }
    this.setState({
@@ -173,11 +182,17 @@
      MKEmitter.emit('resetSelectLine', config.uuid, '', '') // 广播数据切换
      reset && MKEmitter.emit('resetTable', config.uuid, repage) // 列表重置
      let start = 1
      if (setting.laypage) {
        start = pageSize * (pageIndex - 1) + 1
      }
      this.setState({
        data: result.data.map((item, index) => {
          item.key = index
          item.$$uuid = item[setting.primaryKey] || ''
          item.$$BID = BID || ''
          item.$Index = start + index + ''
          return item
        }),
        selectedData: [],
@@ -204,7 +219,7 @@
    const { setting, config, arr_field, search, orderBy, BID, pageIndex, pageSize } = this.state
    let searches = fromJS(search).toJS()
    if (mainSearch && mainSearch.length > 0) { // 主表搜索条件
    if (config.setting.useMSearch && mainSearch && mainSearch.length > 0) { // 主表搜索条件
      let keys = searches.map(item => item.key.toLowerCase())
      mainSearch.forEach(item => {
        if (!keys.includes(item.key.toLowerCase())) {
@@ -236,6 +251,7 @@
          data = data.map(item => {
            if (item.$$uuid === _data.$$uuid) {
              _data.key = item.key
              _data.$Index = item.$Index
              return _data
            } else {
              return item
@@ -274,7 +290,7 @@
   */
  getStatFieldsValue = () => {
    const { mainSearch } = this.props
    const { setting, config, search, BID, orderBy, statFields } = this.state
    const { setting, config, search, BID, orderBy } = this.state
    if (setting.supModule && !BID) { // BID 不存在时,不做查询
      this.setState({
@@ -283,15 +299,10 @@
      return
    }
    if (statFields.length === 0 || setting.interType !== 'system' || !setting.dataresource) return
    let requireFields = search.filter(item => item.required && (!item.value || item.value.length === 0))
    if (requireFields.length > 0) {
      return
    }
    if (config.statFields.length === 0 || setting.interType !== 'system' || !setting.dataresource) return
    let searches = fromJS(search).toJS()
    if (mainSearch && mainSearch.length > 0) { // 主表搜索条件
    if (config.setting.useMSearch && mainSearch && mainSearch.length > 0) { // 主表搜索条件
      let keys = searches.map(item => item.key.toLowerCase())
      mainSearch.forEach(item => {
        if (!keys.includes(item.key.toLowerCase())) {
@@ -299,9 +310,13 @@
        }
      })
    }
    let requireFields = searches.filter(item => item.required && item.value === '')
    if (requireFields.length > 0) {
      return
    }
    let _orderBy = orderBy || setting.order
    let param = UtilsDM.getStatQueryDataParams(setting, statFields, searches, _orderBy, BID, this.props.menuType)
    let param = UtilsDM.getStatQueryDataParams(setting, config.statFields, searches, _orderBy, BID, this.props.menuType)
    if (param.func === 'sPC_Get_TableData') {
      param.menuname = config.name || ''
@@ -313,7 +328,7 @@
        let values = []
        if (_data) {
          statFields.forEach(item => {
          config.statFields.forEach(item => {
            if (_data[item.field] || _data[item.field] === 0) {
              let val = +_data[item.field]
              if (isNaN(val)) {
@@ -408,14 +423,14 @@
  /**
   * @description 导出Excel时,获取页面搜索排序等参数
   */
  getexceloutparam = (menuId, btnId) => {
  queryModuleParam = (menuId, btnId) => {
    const { mainSearch } = this.props
    const { arr_field, config, orderBy, search, setting} = this.state
    if (config.uuid !== menuId) return
    let searches = search ? fromJS(search).toJS() : []
    if (mainSearch && mainSearch.length > 0) { // 主表搜索条件
    if (config.setting.useMSearch && mainSearch && mainSearch.length > 0) { // 主表搜索条件
      let keys = searches.map(item => item.key.toLowerCase())
      mainSearch.forEach(item => {
        if (!keys.includes(item.key.toLowerCase())) {
@@ -424,7 +439,7 @@
      })
    }
    MKEmitter.emit('execExcelout', config.uuid, btnId, {
    MKEmitter.emit('returnModuleParam', config.uuid, btnId, {
      arr_field: arr_field,
      orderBy: orderBy || setting.order,
      search: searches,
@@ -486,6 +501,14 @@
    }
  }
  getSyncData = (syncModule, btnId) => {
    const { config, selectedData } = this.state
    if (config.uuid !== syncModule) return
    MKEmitter.emit('triggerBtnId', btnId, (selectedData || []))
  }
  UNSAFE_componentWillReceiveProps(nextProps) {
    const { sync, config, BID } = this.state
@@ -498,16 +521,15 @@
        item.key = index
        item.$$uuid = item[config.setting.primaryKey] || ''
        item.$$BID = BID || ''
        item.$Index = index + 1 + ''
        return item
      })
      this.setState({sync: false, data: _data})
    } else if (nextProps.mainSearch && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) {
      if (config.setting.syncRefresh === 'true') {
        this.setState({}, () => {
          this.reloadtable()
        })
      }
    } else if (config.setting.syncRefresh && nextProps.mainSearch && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) {
      this.setState({pageIndex: 1}, () => {
        this.reloadtable()
      })
    }
  }
@@ -517,8 +539,9 @@
  componentDidMount () {
    MKEmitter.addListener('reloadData', this.reloadData)
    MKEmitter.addListener('getSyncData', this.getSyncData)
    MKEmitter.addListener('resetSelectLine', this.resetParentParam)
    MKEmitter.addListener('getexceloutparam', this.getexceloutparam)
    MKEmitter.addListener('queryModuleParam', this.queryModuleParam)
    MKEmitter.addListener('refreshByButtonResult', this.refreshByButtonResult)
  }
@@ -530,8 +553,9 @@
      return
    }
    MKEmitter.removeListener('reloadData', this.reloadData)
    MKEmitter.removeListener('getSyncData', this.getSyncData)
    MKEmitter.removeListener('resetSelectLine', this.resetParentParam)
    MKEmitter.removeListener('getexceloutparam', this.getexceloutparam)
    MKEmitter.removeListener('queryModuleParam', this.queryModuleParam)
    MKEmitter.removeListener('refreshByButtonResult', this.refreshByButtonResult)
  }
@@ -540,33 +564,64 @@
    return (
      <div className="custom-normal-table" style={config.style}>
        <NormalHeader config={config}/>
        {searchlist && searchlist.length ?
          <MainSearch BID={BID} searchlist={searchlist} menuType={this.props.menuType} refreshdata={this.refreshbysearch}/> : null
        }
        <MainAction
          BID={BID}
          setting={setting}
          actions={actions}
          BData={this.state.BData}
          columns={config.columns}
          selectedData={selectedData}
        />
        <div className={'main-table-box ' + (!actions || actions.length === 0 ? 'no-action' : '')}>
          <MainTable
        {config.wrap.collapse === 'true' ? <Collapse bordered={false} defaultActiveKey="1" expandIconPosition="right">
          <Panel forceRender={true} header={<NormalHeader config={config}/>} key="1">
            {searchlist && searchlist.length ?
              <MainSearch BID={BID} setting={config.wrap} searchlist={searchlist} menuType={this.props.menuType} refreshdata={this.refreshbysearch}/> : null
            }
            <MainAction
              BID={BID}
              setting={setting}
              actions={actions}
              BData={this.state.BData}
              columns={config.columns}
              selectedData={selectedData}
            />
            <div className={'main-table-box ' + (!actions || actions.length === 0 ? 'no-action' : '')}>
              <MainTable
                setting={setting}
                columns={columns}
                MenuID={config.uuid}
                data={this.state.data}
                fields={config.columns}
                total={this.state.total}
                lineMarks={config.lineMarks}
                loading={this.state.loading}
                refreshdata={this.refreshbytable}
                statFValue={this.state.statFValue}
                chgSelectData={(selects) => this.setState({selectedData: selects})}
              />
            </div>
          </Panel>
        </Collapse> : <>
          <NormalHeader config={config}/>
          {searchlist && searchlist.length ?
            <MainSearch BID={BID} setting={config.wrap} searchlist={searchlist} menuType={this.props.menuType} refreshdata={this.refreshbysearch}/> : null
          }
          <MainAction
            BID={BID}
            setting={setting}
            columns={columns}
            MenuID={config.uuid}
            data={this.state.data}
            fields={config.columns}
            total={this.state.total}
            lineMarks={config.lineMarks}
            loading={this.state.loading}
            refreshdata={this.refreshbytable}
            statFValue={this.state.statFValue}
            chgSelectData={(selects) => this.setState({selectedData: selects})}
            actions={actions}
            BData={this.state.BData}
            columns={config.columns}
            selectedData={selectedData}
          />
        </div>
          <div className={'main-table-box ' + (!actions || actions.length === 0 ? 'no-action' : '')}>
            <MainTable
              setting={setting}
              columns={columns}
              MenuID={config.uuid}
              data={this.state.data}
              fields={config.columns}
              total={this.state.total}
              lineMarks={config.lineMarks}
              loading={this.state.loading}
              refreshdata={this.refreshbytable}
              statFValue={this.state.statFValue}
              chgSelectData={(selects) => this.setState({selectedData: selects})}
            />
          </div>
        </>}
      </div>
    )
  }