king
2023-08-08 dc258e4600bea2fba1e25054d163a2f4b1326a85
src/tabviews/custom/components/share/tabtransfer/index.jsx
@@ -1,7 +1,7 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Row, Col, Empty, notification } from 'antd'
import { fromJS } from 'immutable'
import { Row, Col, Empty, notification, Modal } from 'antd'
import Api from '@/api'
import asyncComponent from '@/utils/asyncComponent'
@@ -9,7 +9,7 @@
  getStructuredParams,
  getStructDefaultParam
} from '@/utils/utils-datamanage.js'
import Utils from '@/utils/utils.js'
import MKEmitter from '@/utils/events.js'
import './index.scss'
// 通用组件
@@ -22,6 +22,7 @@
const AntvScatter = asyncComponent(() => import('@/tabviews/custom/components/chart/antv-scatter'))
const TableCard = asyncComponent(() => import('@/tabviews/custom/components/card/table-card'))
const NormalTable = asyncComponent(() => import('@/tabviews/custom/components/table/normal-table'))
const DoubleDataCard = asyncComponent(() => import('@/tabviews/custom/components/card/double-data-card'))
const EditTable = asyncComponent(() => import('@/tabviews/custom/components/table/edit-table'))
const PropCard = asyncComponent(() => import('@/tabviews/custom/components/card/prop-card'))
const NormalGroup = asyncComponent(() => import('@/tabviews/custom/components/group/normal-group'))
@@ -37,159 +38,207 @@
const TimeLine = asyncComponent(() => import('@/tabviews/custom/components/timeline/normal-timeline'))
const CustomChart = asyncComponent(() => import('@/tabviews/custom/components/chart/custom-chart'))
const MkBaseTable = asyncComponent(() => import('@/tabviews/custom/components/table/base-table'))
const AntvG6 = asyncComponent(() => import('@/tabviews/custom/components/chart/antv-G6'))
const AntvX6 = asyncComponent(() => import('@/tabviews/custom/components/chart/antv-X6'))
const Calendar = asyncComponent(() => import('@/tabviews/custom/components/calendar'))
class TabTransfer extends Component {
  static propTpyes = {
    config: PropTypes.object,        // 组件配置信息
    mainSearch: PropTypes.any,       // 全局搜索条件
  }
  state = {
    mainSearch: [],
    self: false,
    data: null
  }
  UNSAFE_componentWillMount () {
    const { config, mainSearch } = this.props
    // 获取主搜索条件
    let _mainSearch = []
    let self = false
    config.components.forEach(component => {
      if (component.type === 'search') {
        self = true
        _mainSearch = Utils.initMainSearch(component.search)
      }
    })
    if (!self) {
      _mainSearch = fromJS(mainSearch).toJS()
    }
    let _config = fromJS(this.props.config).toJS()
    let params = []
    let delay = 20
    config.components.forEach(item => {
      if (item.type === 'tabs' || item.type === 'group') return
    if (_config.type !== 'group') {
      _config.components = this.formatSetting(_config.components, params)
    } else {
      let delay = 110
      _config.components.forEach(item => {
        if (!item.setting || item.setting.interType !== 'system') return
        if (!item.format) return
        item.setting.delay = delay
        delay += 20
      })
    }
      if (!item.setting || item.setting.interType !== 'system') return
      if (!item.format) return
    this.setState({
      config: _config
    }, () => {
      if (params.length > 0) {
        this.loadmaindata(params)
      }
    })
  }
      if ((!item.pageable || (item.pageable && !item.setting.laypage)) && item.setting.onload === 'true' && item.setting.sync === 'true') {
        let searchlist = []
        if (item.search && item.search.length > 0) {
          searchlist = Utils.initMainSearch(item.search)
        }
  formatSetting = (components, params) => {
    let delay = 110
    return components.map(item => {
      if (item.type === 'tabs') return item
      if (item.type === 'group') {
        item.components = this.formatSetting(item.components, params)
        return item
      }
      if (!item.setting || item.setting.interType !== 'system') return item
      if (!item.format) return item
      if (item.setting.sync === 'true') {
        let searchlist = item.$searches || []
        if (item.setting.useMSearch) {
          let keys = searchlist.map(item => item.key)
          _mainSearch.forEach(item => {
            if (!keys.includes(item.key)) {
              searchlist.push(item)
            }
          let mainSearch = window.GLOB.SearchBox.get(item.$searchId)
          let keys = item.$s_keys || []
          mainSearch.forEach(item => {
            if (keys.includes(item.key.toLowerCase())) return
            searchlist.push(item)
          })
        }
        if (searchlist.filter(cell => cell.required && cell.value === '').length > 0) {
        if (item.$s_req && searchlist.filter(item => item.required && item.value === '').length > 0) {
          item.setting.sync = 'false'
          item.setting.onload = 'false'
        } else {
          params.push(getStructDefaultParam(item, searchlist, params.length === 0))
        }
      } else {
        item.setting.sync = 'false'
        item.setting.delay = delay
        delay += 20
      }
      item.setting.delay = delay
      delay += 20
      return item
    })
    this.setState({mainSearch: _mainSearch, self})
    if (params.length > 0) {
      this.loadmaindata(params)
    }
  }
  UNSAFE_componentWillReceiveProps(nextProps) {
    const { self } = this.state
    if (!self && nextProps.mainSearch && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) {
      this.setState({mainSearch: null}, () => {
        this.setState({mainSearch: fromJS(nextProps.mainSearch).toJS()})
      })
    }
  }
  /**
   * @description 主表数据加载
   */ 
  loadmaindata = (params) => {
    const { config } = this.state
    let BID = ''
    let BData = window.GLOB.CacheData.get(this.props.config.$pageId)
    let BData = window.GLOB.CacheData.get(config.$pageId)
    if (BData) {
      BID = BData.$BID || ''
    }
    let param = getStructuredParams(params, this.props.config, BID)
    let param = getStructuredParams(params, config, BID)
    if (config.$cache && config.$time) {
      Api.getLCacheConfig(params[0].uuid, config.$time).then(res => {
        if (!res.valid) {
          this.getMainData(param, params, config.uuid)
        }
      })
    } else {
      this.getMainData(param, params, config.uuid)
    }
  }
  getMainData = (param, params, tabId) => {
    Api.genericInterface(param).then(result => {
      if (result.status) {
        delete result.status
        delete result.message
        delete result.ErrMesg
        delete result.ErrCode
        if (result.message) {
          if (result.ErrCode === 'Y') {
            Modal.success({
              title: result.message
            })
          } else if (result.ErrCode === 'S') {
            notification.success({
              top: 92,
              message: result.message,
              duration: 2
            })
          }
        }
        this.setState({
          data: result
        params.forEach((item) => {
          let _data = result[item.name] || ''
          if (_data && !Array.isArray(_data)) {
            _data = [_data]
          }
          window.GLOB.SyncData.set(item.name, _data)
        })
        MKEmitter.emit('transferSyncData', tabId)
      } else {
        this.setState({
          data: ''
        })
        notification.error({
          top: 92,
          message: result.message,
          duration: 10
        })
        MKEmitter.emit('transferSyncData', tabId)
        if (!result.message) return
        if (result.ErrCode === 'N') {
          Modal.error({
            title: result.message,
          })
        } else if (result.ErrCode !== '-2') {
          notification.error({
            top: 92,
            message: result.message,
            duration: 10
          })
        }
      }
    })
  }
  resetSearch = (search) => {
    this.setState({mainSearch: null}, () => {
      this.setState({mainSearch: search})
    })
  }
  getComponents = (components) => {
    return components.map(item => {
      let style = null
  getComponents = () => {
    const { config } = this.props
    const { mainSearch, data } = this.state
      if (item.style && item.style.clear === 'left') {
        style = {clear: 'left'}
      } else if (item.style && item.style.clear === 'right') {
        style = {float: 'right'}
      }
    if (!config || !config.components || config.components.length === 0) return (<Empty description={false} />)
    return config.components.map(item => {
      if (item.type === 'bar' || item.type === 'line') {
      if (item.type === 'card' && item.subtype === 'datacard') {
        return (
          <Col span={item.width} key={item.uuid}>
            <AntvBarAndLine data={data} config={item} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <DataCard config={item}/>
          </Col>
        )
      } else if (item.type === 'card' && item.subtype === 'propcard') {
        return (
          <Col span={item.width} style={style} key={item.uuid}>
            <PropCard config={item}/>
          </Col>
        )
      } else if (item.type === 'table' && item.subtype === 'normaltable') {
        return (
          <Col span={item.width} style={style} key={item.uuid}>
            <NormalTable config={item}/>
          </Col>
        )
      } else if (item.type === 'card' && item.subtype === 'dualdatacard') {
        return (
          <Col span={item.width} style={style} key={item.uuid}>
            <DoubleDataCard config={item}/>
          </Col>
        )
      } else if (item.type === 'bar' || item.type === 'line') {
        return (
          <Col span={item.width} style={style} key={item.uuid}>
            <AntvBarAndLine config={item}/>
          </Col>
        )
      } else if (item.type === 'pie') {
        return (
          <Col span={item.width} key={item.uuid}>
            <AntvPie data={data} config={item} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <AntvPie config={item}/>
          </Col>
        )
      } else if (item.type === 'dashboard') {
        return (
          <Col span={item.width} key={item.uuid}>
            <AntvDashboard config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <AntvDashboard config={item}/>
          </Col>
        )
      } else if (item.type === 'scatter') {
        return (
          <Col span={item.width} key={item.uuid}>
            <AntvScatter config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <AntvScatter config={item}/>
          </Col>
        )
      } else if (item.type === 'search') {
@@ -199,122 +248,122 @@
          BID = BData.$BID || ''
        }
        return (
          <Col span={item.width} key={item.uuid}>
            <MainSearch config={item} BID={BID} refreshdata={this.resetSearch} />
          <Col span={item.width} style={style} key={item.uuid}>
            <MainSearch config={item} BID={BID}/>
          </Col>
        )
      } else if (item.type === 'tabs') {
        return (
          <Col span={item.width} key={item.uuid}>
            <AntvTabs config={item} mainSearch={mainSearch}/>
          </Col>
        )
      } else if (item.type === 'card' && item.subtype === 'datacard') {
        return (
          <Col span={item.width} key={item.uuid}>
            <DataCard config={item} data={data} mainSearch={mainSearch}/>
          </Col>
        )
      } else if (item.type === 'card' && item.subtype === 'propcard') {
        return (
          <Col span={item.width} key={item.uuid}>
            <PropCard config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <AntvTabs config={item}/>
          </Col>
        )
      } else if (item.type === 'carousel' && item.subtype === 'datacard') {
        return (
          <Col span={item.width} key={item.uuid}>
            <CarouselDataCard config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <CarouselDataCard config={item}/>
          </Col>
        )
      } else if (item.type === 'carousel' && item.subtype === 'propcard') {
        return (
          <Col span={item.width} key={item.uuid}>
            <CarouselPropCard config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <CarouselPropCard config={item}/>
          </Col>
        )
      } else if (item.type === 'card' && item.subtype === 'tablecard') {
        return (
          <Col span={item.width} key={item.uuid}>
            <TableCard config={item} data={data} mainSearch={mainSearch}/>
          </Col>
        )
      } else if (item.type === 'table' && item.subtype === 'normaltable') {
        return (
          <Col span={item.width} key={item.uuid}>
            <NormalTable config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <TableCard config={item}/>
          </Col>
        )
      } else if (item.type === 'table' && item.subtype === 'basetable') {
        return (
          <Col span={item.width} key={item.uuid}>
            <MkBaseTable config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <MkBaseTable config={item}/>
          </Col>
        )
      } else if (item.type === 'table' && item.subtype === 'editable') {
        return (
          <Col span={item.width} key={item.uuid}>
            <EditTable config={item} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <EditTable config={item}/>
          </Col>
        )
      } else if (item.type === 'group' && item.subtype === 'normalgroup') {
        return (
          <Col span={item.width} key={item.uuid}>
            <NormalGroup config={item} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <NormalGroup config={item}/>
          </Col>
        )
      } else if (item.type === 'form' && item.subtype === 'simpleform') {
        return (
          <Col span={item.width} key={item.uuid}>
            <SimpleForm config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <SimpleForm config={item}/>
          </Col>
        )
      } else if (item.type === 'form' && item.subtype === 'stepform') {
        return (
          <Col span={item.width} key={item.uuid}>
            <StepForm config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <StepForm config={item}/>
          </Col>
        )
      } else if (item.type === 'form' && item.subtype === 'tabform') {
        return (
          <Col span={item.width} key={item.uuid}>
            <TabForm config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <TabForm config={item}/>
          </Col>
        )
      } else if (item.type === 'tree') {
        return (
          <Col span={item.width} key={item.uuid}>
            <NormalTree config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <NormalTree config={item}/>
          </Col>
        )
      } else if (item.type === 'calendar') {
        return (
          <Col span={item.width} style={style} key={item.uuid}>
            <Calendar config={item}/>
          </Col>
        )
      } else if (item.type === 'editor') {
        return (
          <Col span={item.width} key={item.uuid}>
            <BraftEditor config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <BraftEditor config={item}/>
          </Col>
        )
      } else if (item.type === 'code') {
        return (
          <Col span={item.width} key={item.uuid}>
            <SandBox config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <SandBox config={item}/>
          </Col>
        )
      } else if (item.type === 'balcony') {
        return (
          <Col span={item.width} key={item.uuid}>
            <Balcony config={item} data={data}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <Balcony config={item}/>
          </Col>
        )
      } else if (item.type === 'timeline') {
        return (
          <Col span={item.width} key={item.uuid}>
            <TimeLine config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <TimeLine config={item}/>
          </Col>
        )
      } else if (item.type === 'chart') {
        return (
          <Col span={item.width} key={item.uuid}>
            <CustomChart config={item} data={data} mainSearch={mainSearch}/>
          <Col span={item.width} style={style} key={item.uuid}>
            <CustomChart config={item}/>
          </Col>
        )
      } else if (item.type === 'antvG6') {
        return (
          <Col span={item.width} style={style} key={item.uuid}>
            <AntvG6 config={item}/>
          </Col>
        )
      } else if (item.type === 'antvX6') {
        return (
          <Col span={item.width} style={style} key={item.uuid}>
            <AntvX6 config={item}/>
          </Col>
        )
      } else {
@@ -324,8 +373,18 @@
  }
  render() {
    const { config } = this.state
    if (!config || !config.components || config.components.length === 0) return (<Empty description={false} />)
    if (config.type === 'group') {
      return (
        <Row className="component-wrap">{this.getComponents(config.components)}</Row>
      )
    }
    return (
      <Row className="component-wrap" gutter={8}>{this.getComponents()}</Row>
      <Row className="component-wrap" id={'anchor' + config.uuid} gutter={8}>{this.getComponents(config.components)}</Row>
    )
  }
}