| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { is, fromJS } from 'immutable' |
| | | import { notification, Collapse, Modal } from 'antd' |
| | | import { Collapse, notification } from 'antd' |
| | | import moment from 'moment' |
| | | |
| | | import Api from '@/api' |
| | | import UtilsDM from '@/utils/utils-datamanage.js' |
| | |
| | | } |
| | | |
| | | loaded = false |
| | | supModules = [] |
| | | |
| | | /** |
| | | * @description 初始化处理 |
| | |
| | | |
| | | let setting = {..._config.setting, ..._config.wrap} |
| | | |
| | | if (setting.selected !== 'always' && setting.selected !== 'init' && setting.selected !== 'sign') { |
| | | if (!['always', 'init', 'sign', 'local'].includes(setting.selected)) { |
| | | setting.selected = 'false' |
| | | } else { |
| | | setting.orisel = true |
| | | } |
| | | |
| | | if (_config.setting.sync === 'true') { |
| | |
| | | |
| | | window.GLOB.SyncData.delete(_config.dataName) |
| | | } |
| | | } else if (_config.setting.supModule && !BID && _config.wrap.supKey !== 'false') { |
| | | _config.setting.onload = 'false' |
| | | } |
| | | |
| | | if (_config.wrap.collapse === 'true') { |
| | |
| | | _config.colsCtrls = null |
| | | } |
| | | |
| | | if (setting.$tree && _config.cols[0]) { |
| | | _config.cols[0].$tree = true |
| | | } |
| | | |
| | | let columns = _config.cols |
| | | if (_config.hasExtend) { |
| | | columns = this.getCols(_config.cols, BData, _config.setting.extendTime) |
| | | } |
| | | |
| | | this.setState({ |
| | | pageSize: setting.pageSize || 10, |
| | | BID: BID || '', |
| | |
| | | config: _config, |
| | | setting: setting, |
| | | actions: _config.action, |
| | | columns: _config.cols, |
| | | columns: columns, |
| | | search: _config.$searches, |
| | | allSearch |
| | | }) |
| | |
| | | this.setState({ |
| | | pageIndex: 1 |
| | | }, () => { |
| | | this.loadmaindata(true, 'true', '', 'timer') |
| | | this.loadData(true, 'true', '', 'timer') |
| | | }) |
| | | }) |
| | | } |
| | |
| | | Api.getLCacheConfig(config.uuid, config.$time, BID).then(res => { |
| | | if (!res.valid && config.setting.onload === 'true') { |
| | | setTimeout(() => { |
| | | this.loadmaindata(false, 'true', '', 'init') |
| | | this.loadData(false, 'true', '', 'init') |
| | | }, config.setting.delay || 0) |
| | | } |
| | | |
| | |
| | | |
| | | if (config.setting.onload === 'true') { |
| | | setTimeout(() => { |
| | | this.loadmaindata(false, 'true', '', 'init') |
| | | this.loadData(false, 'true', '', 'init') |
| | | }, config.setting.delay || 0) |
| | | } |
| | | } |
| | | } else if (config.setting.onload === 'true') { |
| | | setTimeout(() => { |
| | | this.loadmaindata() |
| | | this.loadData() |
| | | }, config.setting.delay || 0) |
| | | } |
| | | } |
| | |
| | | MKEmitter.removeListener('transferSyncData', this.transferSyncData) |
| | | } |
| | | |
| | | getCols = (cols, BData, time) => { |
| | | let _cols = [] |
| | | let weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'] |
| | | |
| | | let excols = (col) => { |
| | | let _s = [] |
| | | let _marks = col.marks || [] |
| | | let names = [] |
| | | let fields = [] |
| | | |
| | | for (let i = 0; i < col.quota; i++) { |
| | | fields.push(col.field + (i === 0 ? '' : i)) |
| | | |
| | | if (col.colUnit === 'day') { |
| | | let hasweek = col.dayFormat.indexOf('week') > -1 |
| | | let format = col.dayFormat.replace(/\sweek/, '') |
| | | let day = moment().add(col.shift + i, 'days').format(format) |
| | | |
| | | if (hasweek) { |
| | | let _w = moment().add(col.shift + i, 'days').weekday() |
| | | day = day + ' ' + weeks[_w] |
| | | } |
| | | |
| | | names.push(day) |
| | | } else { |
| | | let format = col.hourFormat |
| | | if (format === 'H point') { |
| | | format = 'H点' |
| | | } |
| | | |
| | | let hour = moment(time).add(col.shift + i, 'hours').format(format) |
| | | |
| | | if (format === 'h:00') { |
| | | if (hour === '12:00') { |
| | | hour = hour + ' pm' |
| | | } else if (hour === moment(time).add(col.shift + i, 'hours').format('H:00')) { |
| | | hour = hour + ' am' |
| | | } else { |
| | | hour = hour + ' pm' |
| | | } |
| | | } |
| | | names.push(hour) |
| | | } |
| | | } |
| | | |
| | | if (col.supField) { |
| | | names = [] |
| | | let val = '' |
| | | if (BData) { |
| | | let field = col.supField.toLowerCase() |
| | | Object.keys(BData).forEach(key => { |
| | | if (key.toLowerCase() === field) { |
| | | val = BData[key] + '' |
| | | } |
| | | }) |
| | | } |
| | | |
| | | if (val) { |
| | | names = val.split(',') |
| | | |
| | | if (names.length > fields.length) { |
| | | names.length = fields.length |
| | | } else if (fields.length > names.length) { |
| | | fields.length = names.length |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (names.length === 0) return _s |
| | | |
| | | _s = fields.map((f, i) => { |
| | | return { |
| | | type: 'text', |
| | | Align: col.Align, |
| | | Width: col.Width, |
| | | field: f, |
| | | label: names[i], |
| | | uuid: col.uuid + i, |
| | | marks: _marks.filter(mark => mark.field[0] === f || !fields.includes(mark.field[0])) |
| | | } |
| | | }) |
| | | |
| | | return _s |
| | | } |
| | | |
| | | cols.forEach(col => { |
| | | if (col.type === 'extend') { |
| | | let exs = excols(col) |
| | | _cols.push(...exs) |
| | | } else if (col.type === 'colspan') { |
| | | let subs = [] |
| | | col.subcols.forEach(subcol => { |
| | | if (subcol.type === 'extend') { |
| | | let exs = excols(subcol) |
| | | subs.push(...exs) |
| | | } else { |
| | | subs.push(col) |
| | | } |
| | | }) |
| | | |
| | | if (subs.length) { |
| | | _cols.push({...col, subcols: subs}) |
| | | } |
| | | } else { |
| | | _cols.push(col) |
| | | } |
| | | }) |
| | | |
| | | return _cols |
| | | } |
| | | |
| | | resetCols = (BData) => { |
| | | const { config } = this.state |
| | | |
| | | let columns = this.getCols(config.cols, BData, config.setting.extendTime) |
| | | |
| | | this.setState({ |
| | | columns: columns, |
| | | data: [], |
| | | selectedData: [], |
| | | total: 0 |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * @description 主表数据加载 |
| | | * @param { Boolean } reset 表格是否重置 |
| | | * @param { String } repage 表格是否重置页码 |
| | | */ |
| | | async loadmaindata (reset, repage, id, type) { |
| | | async loadData (reset, repage, id, type) { |
| | | const { setting, config, search, orderBy, BID, pageIndex, pageSize, BData } = this.state |
| | | |
| | | if (setting.supModule && !BID && setting.supKey !== 'false') { // BID 不存在时,不做查询 |
| | |
| | | reset && MKEmitter.emit('resetTable', config.uuid, 'true') // 列表重置 |
| | | if (setting.$hasSyncModule) { |
| | | MKEmitter.emit('syncBalconyData', config.uuid, [], false) |
| | | } |
| | | if (config.$hasTopModule) { |
| | | window.GLOB.CacheData.set(config.uuid + 'tb', { $$empty: true, $$uuid: '' }) |
| | | MKEmitter.emit('mkPublicData', config.uuid + 'tb', { $$empty: true, $$uuid: '' }) |
| | | } |
| | | |
| | | this.loaded = true |
| | |
| | | Api.writeCacheConfig(config.uuid, result.data || [], BID) |
| | | } |
| | | |
| | | if (repage === 'false' && result.data && result.data.length === 0 && result.total > 0 && pageIndex > 1) { |
| | | let _pageIndex = Math.ceil(result.total / pageSize) |
| | | |
| | | if (_pageIndex < pageIndex) { |
| | | MKEmitter.emit('resetTable', config.uuid, 'repage', _pageIndex) |
| | | this.setState({ |
| | | pageIndex: _pageIndex, |
| | | data: [], |
| | | selectedData: [], |
| | | total: result.total |
| | | }, () => { |
| | | this.loadmaindata() |
| | | }) |
| | | return |
| | | } |
| | | } |
| | | |
| | | if ((setting.selected !== 'false' || (setting.orisel && id)) && result.data && result.data.length > 0) { |
| | | setTimeout(() => { |
| | | MKEmitter.emit('mkCheckTopLine', config.uuid, id, setting.selected) |
| | | }, 200) |
| | | if (setting.selected === 'init') { |
| | | this.setState({setting: {...setting, selected: 'false'}}) |
| | | } |
| | | } else { |
| | | MKEmitter.emit('resetSelectLine', config.uuid, '', '') // 广播数据切换 |
| | | if (setting.$hasSyncModule) { |
| | | MKEmitter.emit('syncBalconyData', config.uuid, [], false) |
| | | } |
| | | if (result.data.length === 0 && pageIndex > 1) { |
| | | this.reloadIndex() |
| | | return |
| | | } |
| | | |
| | | reset && MKEmitter.emit('resetTable', config.uuid, repage) // 列表重置 |
| | |
| | | return item |
| | | }) |
| | | |
| | | if (setting.$tree && data.length) { |
| | | data = this.getTree(data) |
| | | } |
| | | |
| | | let total = result.total || 0 |
| | | if (config.setting.custompage && data.length) { |
| | | total = data[data.length - 1].mk_total || 0 |
| | |
| | | allSearch.push(...searches) |
| | | } |
| | | |
| | | if (data.length && (id || setting.selected !== 'false')) { |
| | | let keys = null |
| | | if (setting.selected === 'local') { |
| | | keys = this.state.selectedData.map(cell => cell.$$uuid) |
| | | } |
| | | setTimeout(() => { |
| | | MKEmitter.emit('mkCheckTopLine', config.uuid, id, setting.selected, keys) |
| | | }, 200) |
| | | } else { |
| | | MKEmitter.emit('resetSelectLine', config.uuid, '', '') // 广播数据切换 |
| | | if (setting.$hasSyncModule) { |
| | | MKEmitter.emit('syncBalconyData', config.uuid, [], false) |
| | | } |
| | | } |
| | | |
| | | this.setState({ |
| | | data: data, |
| | | selectedData: [], |
| | |
| | | loading: false |
| | | }) |
| | | |
| | | if (setting.selected === 'init') { |
| | | this.setState({setting: {...setting, selected: 'false'}}) |
| | | } |
| | | |
| | | if (config.$hasTopModule) { |
| | | window.GLOB.CacheData.set(config.uuid + 'tb', data[0] || { $$empty: true, $$uuid: '' }) |
| | | MKEmitter.emit('mkPublicData', config.uuid + 'tb', data[0] || { $$empty: true, $$uuid: '' }) |
| | | } |
| | | |
| | | if (config.timer && config.clearField && result.data && result.data[0]) { |
| | | let vals = (config.clearValue || '').split(',') |
| | | if (vals.includes(result.data[0][config.clearField])) { |
| | |
| | | } |
| | | } |
| | | |
| | | 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 |
| | | }) |
| | | } |
| | | } |
| | | UtilsDM.querySuccess(result) |
| | | } else { |
| | | this.setState({ |
| | | loading: false |
| | | }) |
| | | this.timer && this.timer.stop() |
| | | |
| | | if (!result.message) return |
| | | if (result.ErrCode === 'N') { |
| | | Modal.error({ |
| | | title: result.message, |
| | | UtilsDM.queryFail(result) |
| | | } |
| | | } |
| | | |
| | | getTree = (data) => { |
| | | const { setting } = this.state |
| | | |
| | | let options = [] |
| | | let pnodes = [] |
| | | let _data = [] |
| | | |
| | | data.forEach(item => { |
| | | let pval = item[setting.parentField] + '' |
| | | let val = item[setting.valueField] + '' |
| | | |
| | | if (pval === setting.mark) { |
| | | pnodes.push({ |
| | | ...item, |
| | | $mk_floor: 1, |
| | | $key: val, |
| | | $pid: '' |
| | | }) |
| | | } else if (result.ErrCode !== '-2') { |
| | | notification.error({ |
| | | top: 92, |
| | | message: result.message, |
| | | duration: 10 |
| | | } else if (pval) { |
| | | options.push({ |
| | | ...item, |
| | | $mk_floor: 0, |
| | | $key: val, |
| | | $pid: pval |
| | | }) |
| | | } |
| | | }) |
| | | |
| | | let get_tree = (parents) => { |
| | | parents.forEach(parent => { |
| | | parent.children = [] |
| | | |
| | | options = options.filter(option => { |
| | | if (option.$pid === parent.$key) { |
| | | option.$mk_floor = parent.$mk_floor + 1 |
| | | option.$pkeys = parent.$pkeys ? [...parent.$pkeys, parent.$key] : [parent.$key] |
| | | |
| | | parent.children.push(option) |
| | | return false |
| | | } |
| | | return true |
| | | }) |
| | | |
| | | if (parent.children.length === 0) { |
| | | parent.children = null |
| | | } else { |
| | | parent.$open = true |
| | | parent.children = get_tree(parent.children) |
| | | } |
| | | }) |
| | | return parents |
| | | } |
| | | |
| | | let tree = get_tree(pnodes) |
| | | |
| | | let get_data = (parents) => { |
| | | parents.forEach(parent => { |
| | | let children = parent.children |
| | | |
| | | delete parent.children |
| | | |
| | | _data.push(parent) |
| | | |
| | | if (children) { |
| | | get_data(children) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | get_data(tree) |
| | | |
| | | if (options.length) { |
| | | _data.push(...options) |
| | | } |
| | | |
| | | _data = _data.map((item, index) => { |
| | | item.key = index |
| | | |
| | | return item |
| | | }) |
| | | |
| | | return _data |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | async loadLinedata (id, position) { |
| | | const { setting, config, search, orderBy, BID, pageIndex, pageSize, BData } = this.state |
| | | |
| | | if (config.forbidLine) { |
| | | this.reloadtable() |
| | | return |
| | | } |
| | | |
| | | let searches = fromJS(search).toJS() |
| | | if (config.setting.useMSearch) { // 主表搜索条件 |
| | |
| | | let result = await Api.genericInterface(param) |
| | | if (result.status) { |
| | | if (position === 'line_grid' && (!result.data || !result.data[0])) { |
| | | this.loadmaindata(true, 'false') |
| | | this.reloadIndex() |
| | | return |
| | | } |
| | | |
| | |
| | | _data.$$uuid = _data[setting.primaryKey] || '' |
| | | _data.$$BID = BID || '' |
| | | _data.$$BData = BData || '' |
| | | |
| | | if (setting.controlField) { |
| | | if (setting.controlVal.includes(_data[setting.controlField] + '')) { |
| | | _data.$disabled = true |
| | | } |
| | | } |
| | | |
| | | if (config.absFields) { |
| | | config.absFields.forEach(f => { |
| | |
| | | this.setState({ |
| | | loading: false |
| | | }) |
| | | notification.error({ |
| | | top: 92, |
| | | message: result.message, |
| | | duration: 10 |
| | | }) |
| | | |
| | | UtilsDM.queryFail(result) |
| | | } |
| | | } |
| | | |
| | |
| | | * 含有初始不加载的页面,修改设置 |
| | | */ |
| | | refreshbysearch = (searches) => { |
| | | const { setting, BID } = this.state |
| | | |
| | | if (setting.supModule && !BID && setting.supKey !== 'false') { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: setting.supModTip || window.GLOB.dict['sup_key_req'] || '需要上级主键值!', |
| | | duration: 5 |
| | | }) |
| | | this.setState({ |
| | | search: searches |
| | | }) |
| | | return |
| | | } |
| | | |
| | | this.setState({ |
| | | pageIndex: 1, |
| | | search: searches |
| | | }, () => { |
| | | this.loadmaindata(true, 'true') |
| | | this.loadData(true, 'true') |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * @description 表格条件改变时重置数据(分页或排序) |
| | | */ |
| | | refreshbytable = (pagination, filters, sorter) => { |
| | | refreshbytable = (pagination, sorter) => { |
| | | if (sorter.order) { |
| | | let _chg = { |
| | | ascend: 'asc', |
| | |
| | | this.setState({ |
| | | pageIndex: pagination.current, |
| | | pageSize: pagination.pageSize, |
| | | orderBy: (sorter.field && sorter.order) ? `${sorter.field} ${sorter.order}` : '' |
| | | orderBy: (sorter.field && sorter.order) ? `${sorter.field} ${sorter.order}` : (pagination.fixed ? this.state.orderBy : '') |
| | | }, () => { |
| | | this.loadmaindata() |
| | | this.loadData() |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * @description 表格刷新 |
| | | */ |
| | | reloadtable = (btn, id) => { |
| | | if (!btn || btn.resetPageIndex !== 'false') { |
| | | this.setState({ |
| | | pageIndex: 1 |
| | | }, () => { |
| | | this.loadmaindata(true, 'true', id) |
| | | }) |
| | | } else { |
| | | this.loadmaindata(true, 'false', id) |
| | | } |
| | | reloadIndex = () => { |
| | | this.setState({ |
| | | pageIndex: 1 |
| | | }, () => { |
| | | this.loadData(true, 'true') |
| | | }) |
| | | } |
| | | |
| | | /** |
| | |
| | | if (config.uuid !== menuId) return |
| | | |
| | | if (!id) { |
| | | this.reloadtable() |
| | | this.reloadIndex() |
| | | } else if (config.forbidLine) { |
| | | this.loadData(true, 'false', id) |
| | | } else { |
| | | this.loadLinedata(id) |
| | | } |
| | | } |
| | | |
| | | resetParentParam = (MenuID, id, data) => { |
| | | const { setting } = this.state |
| | | const { config, setting } = this.state |
| | | |
| | | if (!setting.supModule || setting.supModule !== MenuID) return |
| | | if (config.supNodes) { |
| | | if (!config.supNodes.includes(MenuID)) return |
| | | this.supModules = this.supModules.filter(item => item.key !== MenuID) |
| | | let bid = '' |
| | | let _data = null |
| | | |
| | | if (id !== this.state.BID || id !== '') { |
| | | this.setState({ |
| | | pageIndex: 1, |
| | | BID: id, |
| | | BData: data |
| | | }, () => { |
| | | if (!setting.checkBid) { |
| | | this.loadmaindata(true, 'true') |
| | | if (id) { |
| | | this.supModules.push({key: MenuID, value: id, data}) |
| | | } |
| | | if (this.supModules.length > 0) { |
| | | bid = this.supModules[this.supModules.length - 1].value |
| | | _data = this.supModules[this.supModules.length - 1].data |
| | | } |
| | | |
| | | if (bid !== this.state.BID || bid !== '') { |
| | | this.setState({ BID: bid, BData: _data, pageIndex: 1 }, () => { |
| | | this.loadData(true, 'true') |
| | | }) |
| | | } |
| | | } else { |
| | | if (!setting.supModule || setting.supModule !== MenuID) return |
| | | |
| | | if (id !== this.state.BID || id !== '') { |
| | | if (config.parCtrl) { |
| | | this.resetCols(data) |
| | | } |
| | | }) |
| | | this.setState({ |
| | | pageIndex: 1, |
| | | BID: id, |
| | | BData: data |
| | | }, () => { |
| | | if (!setting.checkBid) { |
| | | this.loadData(true, 'true') |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description 按钮执行完成后页面刷新 |
| | | * @param {*} menuId // 菜单Id |
| | | * @param {*} position // 刷新位置 |
| | | * @param {*} btn // 执行的按钮 |
| | | */ |
| | | refreshByButtonResult = (menuId, position, btn, id, lines) => { |
| | | const { config, BID } = this.state |
| | | |
| | | if (config.uuid !== menuId) return |
| | | |
| | | if (position === 'line' || position === 'line_grid') { |
| | | if (lines && lines.length === 1) { |
| | | this.loadLinedata(lines[0].$$uuid, position) |
| | | let _id = config.wrap.selected === 'always' ? (id || '') : '' |
| | | if (config.supNodes) { |
| | | if (['mainline', 'maingrid', 'popclose'].includes(position)) { |
| | | let supNode = this.supModules[this.supModules.length - 1] |
| | | config.supNodes.forEach((item, i) => { |
| | | setTimeout(() => { |
| | | if (supNode && supNode.key === item) { |
| | | MKEmitter.emit('reloadData', item, supNode.value) |
| | | } else { |
| | | MKEmitter.emit('reloadData', item) |
| | | } |
| | | }, i * 10) |
| | | }) |
| | | } else { |
| | | this.reloadtable(btn, id) |
| | | if (position === 'line' || position === 'line_grid') { |
| | | if (lines && lines.length === 1) { |
| | | if (config.forbidLine) { |
| | | this.loadData(true, 'false', lines[0].$$uuid) |
| | | } else { |
| | | this.loadLinedata(lines[0].$$uuid, position) |
| | | } |
| | | } else { |
| | | this.loadData(true, 'false', _id) |
| | | } |
| | | } else if (btn.resetPageIndex !== 'false') { |
| | | this.reloadIndex() |
| | | } else { |
| | | this.loadData(true, 'false', _id) |
| | | } |
| | | } |
| | | } else if ((position === 'mainline' || position === 'popclose') && config.setting.supModule && BID) { // 刷新源组件时,附带刷新上级行与当前组件 |
| | | MKEmitter.emit('reloadData', config.setting.supModule, BID) |
| | | } else { |
| | | this.reloadtable(btn, id) |
| | | if (position === 'line' || position === 'line_grid') { |
| | | if (lines && lines.length === 1) { |
| | | if (config.forbidLine) { |
| | | this.loadData(true, 'false', lines[0].$$uuid) |
| | | } else { |
| | | this.loadLinedata(lines[0].$$uuid, position) |
| | | } |
| | | } else { |
| | | this.loadData(true, 'false', _id) |
| | | } |
| | | } else if (['mainline', 'maingrid', 'popclose'].includes(position) && config.setting.supModule) { |
| | | MKEmitter.emit('reloadData', config.setting.supModule, position === 'maingrid' ? '' : BID) |
| | | } else if (btn.resetPageIndex !== 'false') { |
| | | this.reloadIndex() |
| | | } else { |
| | | this.loadData(true, 'false', _id) |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | if (config.$searchId !== searchId) return |
| | | |
| | | this.setState({pageIndex: 1}, () => { |
| | | this.reloadtable() |
| | | }) |
| | | this.reloadIndex() |
| | | } |
| | | |
| | | render() { |
| | |
| | | data={this.state.data} |
| | | fields={config.columns} |
| | | total={this.state.total} |
| | | parCtrl={config.parCtrl} |
| | | colsCtrls={config.colsCtrls} |
| | | lineMarks={config.lineMarks} |
| | | loading={this.state.loading} |