From cc20b3cfe18b36c7b0f75937f88679eb031ecc6f Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期一, 14 八月 2023 13:41:20 +0800 Subject: [PATCH] 2023-08-14 --- src/tabviews/custom/components/chart/custom-chart/index.jsx | 299 ++++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 202 insertions(+), 97 deletions(-) diff --git a/src/tabviews/custom/components/chart/custom-chart/index.jsx b/src/tabviews/custom/components/chart/custom-chart/index.jsx index 2680e59..de60a68 100644 --- a/src/tabviews/custom/components/chart/custom-chart/index.jsx +++ b/src/tabviews/custom/components/chart/custom-chart/index.jsx @@ -4,7 +4,7 @@ import { Chart } from '@antv/g2' import DataSet from '@antv/data-set' import * as echarts from 'echarts' -import { Spin, Empty, notification } from 'antd' +import { Spin, Empty, notification, Modal } from 'antd' import Api from '@/api' import Utils from '@/utils/utils.js' @@ -16,9 +16,7 @@ class CustomChart extends Component { static propTpyes = { - data: PropTypes.array, // 缁熶竴鏌ヨ鏁版嵁 - config: PropTypes.object, // 缁勪欢閰嶇疆淇℃伅 - mainSearch: PropTypes.any, // 澶栧眰鎼滅储鏉′欢 + config: PropTypes.object } state = { @@ -26,18 +24,17 @@ config: null, // 鍥捐〃閰嶇疆淇℃伅 empty: true, // 鍥捐〃鏁版嵁涓虹┖ loading: false, // 鏁版嵁鍔犺浇鐘舵�� - sync: false, // 鏄惁缁熶竴璇锋眰鏁版嵁 plot: null, // 鍥捐〃璁剧疆 - data: null, // 鏁版嵁 search: null, // 鎼滅储鏉′欢 } - UNSAFE_componentWillMount () { - const { config, data, initdata } = this.props - let _config = fromJS(config).toJS() - let _data = null - let _sync = config.setting.sync === 'true' + data = [] + loaded = false + UNSAFE_componentWillMount () { + const { config } = this.props + + let _config = fromJS(config).toJS() let BID = '' let BData = '' @@ -50,56 +47,35 @@ BID = BData.$BID || '' } - if (config.setting.sync === 'true' && data) { - _data = data[config.dataName] || [] - _sync = false - } else if (config.setting.sync === 'true' && initdata) { - _data = initdata || [] - _sync = false - } + _config.plot.height = Utils.getHeight(_config.plot.height) + _config.style.height = 'auto' - _config.style.height = config.plot.height || 400 + if (_config.setting.sync === 'true') { + _config.setting.onload = 'false' + + if (window.GLOB.SyncData.has(_config.dataName)) { + this.data = window.GLOB.SyncData.get(_config.dataName) || [] + + if (_config.$cache) { + Api.writeCacheConfig(_config.uuid, fromJS(this.data).toJS()) + } + + _config.setting.sync = 'false' + + this.loaded = true + + window.GLOB.SyncData.delete(_config.dataName) + } + } this.setState({ config: _config, - data: _data, - empty: !_data || _data.length === 0, + empty: this.data.length === 0, BID: BID || '', arr_field: _config.columns.map(col => col.field).join(','), plot: _config.plot, - sync: _sync, - search: Utils.initMainSearch(config.search) - }, () => { - if (config.setting.sync !== 'true' && config.setting.onload === 'true') { - setTimeout(() => { - this.loadData() - }, _config.setting.delay || 0) - } else if (config.setting.sync === 'true' && _data) { - this.handleData() - } + search: _config.$searches }) - } - - /** - * @description 鍥捐〃鏁版嵁鏇存柊锛屽埛鏂板唴瀹� - */ - UNSAFE_componentWillReceiveProps (nextProps) { - const { sync, config } = this.state - - if (sync && !is(fromJS(this.props.data), fromJS(nextProps.data))) { - let _data = [] - if (nextProps.data && nextProps.data[config.dataName]) { - _data = nextProps.data[config.dataName] || [] - } - - this.setState({sync: false, data: _data, empty: _data.length === 0}, () => { - this.handleData() - }) - } else if (config.setting.syncRefresh && nextProps.mainSearch && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) { - this.setState({}, () => { - this.loadData() - }) - } } shouldComponentUpdate (nextProps, nextState) { @@ -114,12 +90,22 @@ MKEmitter.addListener('queryModuleParam', this.queryModuleParam) MKEmitter.addListener('refreshByButtonResult', this.refreshByButtonResult) + if (config.setting.useMSearch) { + MKEmitter.addListener('searchRefresh', this.searchRefresh) + } + + if (config.setting.sync === 'true') { + MKEmitter.addListener('transferSyncData', this.transferSyncData) + } + if (config.timer) { this.timer = new TimerTask() this.timer.init(config.uuid, config.timer, config.timerRepeats, () => { - this.loadData(true) + this.loadData('timer') }) } + + this.initExec() } /** @@ -130,11 +116,100 @@ return } MKEmitter.removeListener('reloadData', this.reloadData) + MKEmitter.removeListener('searchRefresh', this.searchRefresh) MKEmitter.removeListener('resetSelectLine', this.resetParentParam) MKEmitter.removeListener('queryModuleParam', this.queryModuleParam) + MKEmitter.removeListener('transferSyncData', this.transferSyncData) MKEmitter.removeListener('refreshByButtonResult', this.refreshByButtonResult) this.timer && this.timer.stop() + } + + initExec = () => { + const { config } = this.state + + if (config.$cache) { + if (config.$time) { + if (!this.loaded) { + Api.getLCacheConfig(config.uuid, config.$time).then(res => { + if (!res.valid && config.setting.onload === 'true') { + setTimeout(() => { + this.loadData('init') + }, config.setting.delay || 0) + } + + if (!res.data || this.loaded) return + + this.data = res.data + this.handleData() + + this.setState({empty: res.data.length === 0}) + }) + } else { + this.handleData() + } + } else { + if (!this.loaded) { + Api.getLCacheConfig(config.uuid, 0).then(res => { + if (!res.data || this.loaded) return + + this.data = res.data + this.handleData() + + this.setState({empty: res.data.length === 0}) + }) + } + + if (config.setting.onload === 'true') { + setTimeout(() => { + this.loadData('init') + }, config.setting.delay || 0) + } else if (this.loaded) { + this.handleData() + } + } + } else if (config.setting.onload === 'true') { + setTimeout(() => { + this.loadData() + }, config.setting.delay || 0) + } else if (this.loaded) { + this.handleData() + } + } + + transferSyncData = (syncId) => { + const { config } = this.state + + if (config.$syncId !== syncId) return + + let _data = window.GLOB.SyncData.get(config.dataName) || [] + + if (config.$cache) { + Api.writeCacheConfig(config.uuid, fromJS(_data).toJS()) + } + + if (!is(fromJS(this.data), fromJS(_data))) { + this.data = _data + this.handleData() + } + + this.setState({empty: _data.length === 0}) + + this.loaded = true + + window.GLOB.SyncData.delete(config.dataName) + + MKEmitter.removeListener('transferSyncData', this.transferSyncData) + } + + searchRefresh = (searchId) => { + const { config } = this.state + + if (config.$searchId !== searchId) return + + this.setState({}, () => { + this.loadData() + }) } /** @@ -152,10 +227,6 @@ MKEmitter.emit('reloadData', config.setting.supModule, BID) } else { this.loadData() - } - - if (position === 'popclose') { // 鎵ц鍚姩寮圭獥鐨勬寜閽墍閫夋嫨鐨勫埛鏂伴」 - btn.$tabId && MKEmitter.emit('refreshPopButton', btn.$tabId) } } @@ -182,18 +253,18 @@ * @description 瀵煎嚭Excel鏃讹紝鑾峰彇椤甸潰鎼滅储鎺掑簭绛夊弬鏁� */ queryModuleParam = (menuId, callback) => { - const { mainSearch } = this.props const { arr_field, config, search } = this.state if (config.uuid !== menuId) return let searches = search ? fromJS(search).toJS() : [] - if (config.setting.useMSearch && mainSearch && mainSearch.length > 0) { // 涓昏〃鎼滅储鏉′欢 - let keys = searches.map(item => item.key.toLowerCase()) + if (config.setting.useMSearch) { // 涓昏〃鎼滅储鏉′欢 + let mainSearch = window.GLOB.SearchBox.get(config.$searchId) || [] + let keys = config.$s_keys || [] mainSearch.forEach(item => { - if (!keys.includes(item.key.toLowerCase())) { - searches.push(item) - } + if (keys.includes(item.key.toLowerCase())) return + + searches.push(item) }) } @@ -208,35 +279,39 @@ /** * @description 鏁版嵁鍔犺浇 */ - async loadData (hastimer) { - const { mainSearch } = this.props + async loadData (type) { const { config, arr_field, BID, search } = this.state if (config.setting.supModule && !BID) { // BID 涓嶅瓨鍦ㄦ椂锛屼笉鍋氭煡璇� this.setState({ - data: [] - }, () => { - this.handleData() + empty: true }) + + if (!is(fromJS(this.data), fromJS([]))) { + this.data = [] + this.handleData() + } + + this.loaded = true return } let searches = search ? fromJS(search).toJS() : [] - if (config.setting.useMSearch && mainSearch && mainSearch.length > 0) { // 涓昏〃鎼滅储鏉′欢 - let keys = searches.map(item => item.key) + if (config.setting.useMSearch) { // 涓昏〃鎼滅储鏉′欢 + let mainSearch = window.GLOB.SearchBox.get(config.$searchId) || [] + let keys = config.$s_keys || [] mainSearch.forEach(item => { - if (!keys.includes(item.key)) { - searches.push(item) - } + if (keys.includes(item.key.toLowerCase())) return + + searches.push(item) }) } - let requireFields = searches.filter(item => item.required && item.value === '') - if (requireFields.length > 0) { + if (config.$s_req && searches.filter(item => item.required && item.value === '').length > 0) { return } - if (!hastimer) { + if (type !== 'timer') { this.setState({ loading: true }) @@ -247,30 +322,58 @@ let result = await Api.genericInterface(param) if (result.status) { - let reset = true - - if (hastimer && is(fromJS(result.data), fromJS(this.state.data))) { - reset = false + if (config.$cache && type === 'init') { + Api.writeCacheConfig(config.uuid, result.data || []) } + this.loaded = true this.setState({ - data: result.data, loading: false, - empty: result.data.length === 0 - }, () => { - if (!reset) return - this.handleData() + empty: !result.data || result.data.length === 0 }) + + if (!is(fromJS(this.data), fromJS(result.data || []))) { + this.data = result.data || [] + this.handleData() + } + + if (config.timer && config.clearField && result.data && result.data[0]) { + let vals = (config.clearValue || '').split(',') + if (vals.includes(result.data[0][config.clearField])) { + this.timer && this.timer.stop() + } + } + 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 + }) + } + } } else { this.setState({ loading: false }) this.timer && this.timer.stop() - notification.error({ - top: 92, - message: result.message, - duration: 10 - }) + + 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 + }) + } } } @@ -286,14 +389,14 @@ setTimeout(() => { this.viewrender() - }, 150) + }, 100) } /** * @description 鍥捐〃娓叉煋鍒嗙粍 */ viewrender = () => { - const { config, data } = this.state + const { config } = this.state if (!config.plot.script) return @@ -301,7 +404,7 @@ try { // eslint-disable-next-line let func = new Function('Chart', 'DataSet', 'wrap', 'data', 'config', config.plot.script) - func(Chart, DataSet, this.wrap, data, config) + func(Chart, DataSet, this.wrap, this.data, config) } catch (e) { console.warn(e) @@ -315,7 +418,7 @@ try { // eslint-disable-next-line let func = new Function('echarts', 'DataSet', 'wrap', 'data', 'config', config.plot.script) - func(echarts, DataSet, this.wrap, data, config) + func(echarts, DataSet, this.wrap, this.data, config) } catch (e) { console.warn(e) @@ -346,8 +449,10 @@ <Spin /> </div> : null } - <NormalHeader config={config} BID={BID} refresh={this.refreshSearch} /> - <div className={'canvas' + (empty ? ' empty' : '')} ref={ref => this.wrap = ref}></div> + <NormalHeader config={config} BID={BID} refresh={this.refreshSearch}/> + <div className="canvas-wrap" style={{height: (config.plot.height + 30) + 'px'}}> + <div className={'canvas' + (empty ? ' empty' : '')} style={{height: config.plot.height + 'px'}} ref={ref => this.wrap = ref}></div> + </div> {empty ? <Empty description={false}/> : null} </div> ) -- Gitblit v1.8.0