From a9ac16fecc0cf9bc66dfaefe4e9b35fa3c722812 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期二, 10 十一月 2020 16:58:43 +0800 Subject: [PATCH] 2020-11-10 --- src/tabviews/custom/components/share/tabtransfer/index.jsx | 271 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 259 insertions(+), 12 deletions(-) diff --git a/src/tabviews/custom/components/share/tabtransfer/index.jsx b/src/tabviews/custom/components/share/tabtransfer/index.jsx index 3832ad2..56ab3e9 100644 --- a/src/tabviews/custom/components/share/tabtransfer/index.jsx +++ b/src/tabviews/custom/components/share/tabtransfer/index.jsx @@ -1,16 +1,26 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' -// import { fromJS } from 'immutable' -import { Row, Col, Empty } from 'antd' +import { connect } from 'react-redux' +import { is, fromJS } from 'immutable' +import { Row, Col, Empty, notification } from 'antd' +import moment from 'moment' -import asyncSpinComponent from '@/utils/asyncSpinComponent' +import Api from '@/api' +import options from '@/store/options.js' +import asyncComponent from '@/utils/asyncComponent' +import Utils from '@/utils/utils.js' import './index.scss' // 閫氱敤缁勪欢 -const AntvBarAndLine = asyncSpinComponent(() => import('@/tabviews/custom/components/chart/antv-bar-line')) -const AntvTabs = asyncSpinComponent(() => import('@/tabviews/custom/components/tabs/antv-tabs')) +const AntvBarAndLine = asyncComponent(() => import('@/tabviews/custom/components/chart/antv-bar-line')) +const MainSearch = asyncComponent(() => import('@/tabviews/custom/components/search/main-search')) +const AntvPie = asyncComponent(() => import('@/tabviews/custom/components/chart/antv-pie')) +const AntvTabs = asyncComponent(() => import('@/tabviews/custom/components/tabs/antv-tabs')) +const DataCard = asyncComponent(() => import('@/tabviews/custom/components/card/data-card')) +const TableCard = asyncComponent(() => import('@/tabviews/custom/components/card/table-card')) +const PropCard = asyncComponent(() => import('@/tabviews/custom/components/card/prop-card')) -class MainSearch extends Component { +class TabTransfer extends Component { static propTpyes = { BID: PropTypes.any, // 鐖剁骇Id config: PropTypes.object, // 缁勪欢閰嶇疆淇℃伅 @@ -19,28 +29,252 @@ dataManager: PropTypes.any, // 鏁版嵁鏉冮檺 } - state = {} + 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 + component.search = component.search.map(item => { + item.oriInitval = item.initval + + if (!item.blacklist || item.blacklist.length === 0) return item + + let _black = item.blacklist.filter(v => { + return this.props.permRoles.indexOf(v) !== -1 + }) + + if (_black.length > 0) { + item.Hide = 'true' + } + + return item + }) + + _mainSearch = Utils.initMainSearch(component.search) + } + }) + + if (!self) { + _mainSearch = fromJS(mainSearch).toJS() + } + + let params = [] + config.components.forEach(item => { + if (item.type === 'tabs') return + + if (!item.setting || item.setting.interType !== 'system') return + if (!item.format || (item.subtype === 'propcard' && item.wrap.datatype === 'static')) return + + if (item.dataName && (!item.pageable || (item.pageable && !item.setting.laypage)) && item.setting.onload === 'true' && item.setting.sync === 'true') { + let param = this.getDefaultParam(item, _mainSearch) + params.push(param) + } else { + item.setting.sync = 'false' + } + }) + + this.setState({mainSearch: _mainSearch, self}) + this.loadmaindata(params) + } + + UNSAFE_componentWillReceiveProps(nextProps) { + const { self } = this.state + + if (!self && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) { + this.setState({mainSearch: fromJS(nextProps.mainSearch).toJS()}) + } + } + + /** + * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼ sPC_Get_TableData 鐨勫弬鏁� + */ + getDefaultParam = (component, mainSearch) => { + const { columns, search, setting, dataName, format } = component + + let searchlist = [] + if (search && search.length > 0) { + searchlist = Utils.initMainSearch(search) + } + + if (setting.useMSearch === 'true') { + let keys = searchlist.map(item => item.key) + mainSearch.forEach(item => { + if (!keys.includes(item.key)) { + searchlist.push(item) + } + }) + } + + let arr_field = columns.map(col => col.field) + let _dataresource = setting.dataresource + let _customScript = setting.customScript + + if (setting.queryType === 'statistics' || _customScript) { + let allSearch = Utils.getAllSearchOptions(searchlist) + let regoptions = allSearch.map(item => { + return { + reg: new RegExp('@' + item.key + '@', 'ig'), + value: `'${item.value}'` + } + }) + + regoptions.forEach(item => { + if (_dataresource && setting.queryType === 'statistics') { + _dataresource = _dataresource.replace(item.reg, item.value) + } + if (_customScript) { + _customScript = _customScript.replace(item.reg, item.value) + } + }) + } + + let _search = '' + if (setting.queryType !== 'statistics' && _dataresource) { + _search = Utils.joinMainSearchkey(searchlist) + _search = _search ? 'where ' + _search : '' + } + + if (setting.order && _dataresource) { + _dataresource = `select top 1000 ${arr_field.join(',')} from (select ${arr_field.join(',')} ,ROW_NUMBER() over(order by ${setting.order}) as rows from ${_dataresource} ${_search}) tmptable order by tmptable.rows ` + } else if (_dataresource) { + _dataresource = `select top 1000 ${arr_field.join(',')} from ${_dataresource} ${_search} ` + } + + // 娴嬭瘯绯荤粺鎵撳嵃鏌ヨ璇彞 + if ((options.sysType === 'local' && !window.GLOB.systemType) || window.debugger === true) { + _customScript && console.log(`${_dataresource ? '' : '/*涓嶆墽琛岄粯璁ql*/\n'}${_customScript}`) + _dataresource && console.log(_dataresource) + } + + return { + name: dataName, + columns: columns, + par_tablename: '', + type: format === 'array' ? format : '', + primaryKey: setting.primaryKey || '', + foreign_key: '', + sql: _dataresource, + script: _customScript + } + } + + /** + * @description 涓昏〃鏁版嵁鍔犺浇 + */ + loadmaindata = (params) => { + if (!params || params.length === 0) return + let LText_field = [] + let LText = params.map((item, index) => { + let _sql = item.sql + let _script = item.script + + if (index === 0) { + _script = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000) select @ErrorCode='',@retmsg ='' + ${_script} + ` + } + + item.columns.forEach(cell => { + LText_field.push(`Select '${item.name}' as tablename,'${cell.field}' as fieldname,'${cell.datatype}' as field_type`) + }) + return `Select '${item.name}' as tablename,'${window.btoa(window.encodeURIComponent(_sql))}' as LText,'${window.btoa(window.encodeURIComponent(_script))}' as Lcustomize,'${item.type}' as table_type,'${item.primaryKey}' as primary_key,'${item.par_tablename}' as par_tablename,'${item.foreign_key}' as foreign_key,'${index}' as Sort` + }) + + let param = { + func: 'sPC_Get_structured_data', + LText: LText.join(' union all '), + LText_field: LText_field.join(' union all ') + } + + param.LText = Utils.formatOptions(param.LText) + param.LText_field = Utils.formatOptions(param.LText_field) + param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + param.secretkey = Utils.encrypt(param.LText, param.timestamp) + + Api.getLocalConfig(param).then(result => { + if (result.status) { + delete result.status + delete result.message + delete result.ErrMesg + delete result.ErrCode + + this.setState({ + data: result + }) + } else { + this.setState({ + data: '' + }) + notification.error({ + top: 92, + message: result.message, + duration: 10 + }) + } + }) + } + + resetSearch = (search) => { + this.setState({mainSearch: search}) } getComponents = () => { - const { menuType, dataManager, BID, mainSearch, config } = this.props + const { menuType, dataManager, BID, config } = this.props + const { mainSearch, data } = this.state if (!config || !config.components || config.components.length === 0) return (<Empty description={false} />) return config.components.map(item => { if (item.type === 'bar' || item.type === 'line') { return ( - <Col span={item.setting.span} key={item.uuid}> - <AntvBarAndLine config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> + <Col span={item.width} key={item.uuid}> + <AntvBarAndLine data={data} config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> + </Col> + ) + } else if (item.type === 'pie') { + return ( + <Col span={item.width} key={item.uuid}> + <AntvPie data={data} config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> + </Col> + ) + } else if (item.type === 'search') { + return ( + <Col span={item.width} key={item.uuid}> + <MainSearch config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} refreshdata={this.resetSearch} /> </Col> ) } else if (item.type === 'tabs') { return ( - <Col span={item.setting.span} key={item.uuid}> + <Col span={item.width} key={item.uuid}> <AntvTabs config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> + </Col> + ) + } else if (item.type === 'card' && item.subtype === 'datacard') { + return ( + <Col span={item.width} key={item.uuid}> + <DataCard config={item} data={data} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> + </Col> + ) + } else if (item.type === 'card' && item.subtype === 'propcard') { + return ( + <Col span={item.width} key={item.uuid}> + <PropCard config={item} data={data} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> + </Col> + ) + } else if (item.type === 'table' && item.subtype === 'tablecard') { + return ( + <Col span={item.width} key={item.uuid}> + <TableCard config={item} data={data} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> </Col> ) } else { @@ -56,4 +290,17 @@ } } -export default MainSearch \ No newline at end of file +const mapStateToProps = (state) => { + return { + menuType: state.editLevel, + permAction: state.permAction, + permRoles: state.permRoles, + dataManager: state.dataManager + } +} + +const mapDispatchToProps = () => { + return {} +} + +export default connect(mapStateToProps, mapDispatchToProps)(TabTransfer) \ No newline at end of file -- Gitblit v1.8.0