import React from 'react'; import { Table, Button, message, notification, Icon, Checkbox, Pagination, Spin, Upload } from 'antd'; import { empty, extendInclude, getDataFieldValue, guid, initFilter, getCustomParams, addRuleAndGroups, setDataFieldValue, extendOrder, extend, renderExportCell, compare, getParseValue, } from '../../utils/common'; import ComponentBase from '../ComponentBase'; import styles from './index.css'; import EditModal from '../../components/Edit/EditModal'; import TableFooterByTotal from '../../components/Table/TableFooterByTotal'; import FormPage from '../../components/FormPage'; import ShowModal from '../../components/common/ShowModal'; import FormModal from '../../components/FormModal'; import { ConfirmButton, ExportToExcel, HttpPrint, PictureThumb, IFComponent } from '@woowalker/feui'; import DataLoading from '../../components/common/DataLoading'; import BDWordPreviewPage from '../../components/CustomPages/BD/BDWordPreviewPage'; import ColumnSetting from './TableColumnSetting'; import ColumnSort from '../../components/common/CustomFieldsManage'; import ImportModal from './ImportModal'; import TableResizableCell from '../../components/Table/TableResizableCell'; import { cloneDeep, get } from 'lodash'; import classNames from 'classnames'; import TableModal from '../../components/Table/TableModal'; import CombinationModal from '../../components/Combination/CombinationModal'; import { getDragableProps, DragDropCard } from '../../utils/withDragDropContext'; import update from 'immutability-helper'; import config from '../../config'; import storage from '../../utils/storage'; const { Column } = Table; class TableBaseComponent extends ComponentBase { constructor(props) { super(props); this.state = { data: {}, tableConfig: {}, loadParam: {}, searchColumnText: '', // 列搜索文本 showColumnSetting: null, // 显示表头的设置图标 showFilterDropdown: false, formLoading: false, localSearch: { // field: "", // value: "" }, }; this.defaultTableCode = 'table'; this.genDataSource = this.genDataSource.bind(this); } componentDidMount() { super.componentDidMount(); this.onLoadData(); } /* 加载数据 事件 */ onLoadData() { const tableConfigs = this.onGetTableConfig(); if (tableConfigs && tableConfigs.length) { let tableConfig = this.state.tableConfig; if (!tableConfig) { tableConfig = {}; } tableConfigs.forEach((t) => { if (t.tableCode === undefined) { t.tableCode = this.defaultTableCode; } if (t.originalColumns === undefined) { t.originalColumns = t.columns; } if (t.originalBtns === undefined) { t.originalBtns = t.btns; } if (t.originalRowBtns === undefined) { t.originalRowBtns = t.rowBtns; } if (t.originalRightBtns === undefined) { t.originalRightBtns = t.rightBtns; } if (!t.id) { t.id = guid(); } tableConfig[t.tableCode] = t; }); this.setState( { tableConfig, }, () => { this.onAfterLoadData(); } ); } else { this.onAfterLoadData(); } } /* 加载数据之后 */ onAfterLoadData() { this.onAfterGetTableConfig(); let tableConfig = this.state.tableConfig; if (tableConfig) { Object.keys(tableConfig).forEach((n) => { this.loadTableData({ tableCode: tableConfig[n].tableCode, isResetLoad: true, }); }); } } /* 获取表配置信息 { tableCode://配置信息 columns: btns: rowBtns: deleteApi: batchDeleteApi: rule: id: hasChildren classField footerSumType checkType checked, api, position, isShowRowNo,是否显示序号 } */ onGetTableConfig() {} /* 获取表配置信息 之后 */ onAfterGetTableConfig() {} /* 依搜索参数加载表数据 */ loadDataTableBySearch = (tableCode, data) => { const tableConfig = this.getTableConfig({ tableCode }); const customParams = getCustomParams(tableConfig.customParams); let { param, extendParam = {} } = data ? data : {}; extendParam['PageIndex'] = 1; extendParam['Start'] = 0; extendParam['IsAllLoad'] = !!customParams.IsAllLoad; const tempParamJson = this.getLoadParam({ tableCode }); if (param && extendParam) { this.setSearchParam({ tableCode, searchParam: param, onComplete: () => { if (!tempParamJson) { const loadParamJson = this.initLoadParam({ tableCode }); extendParam = { ...loadParamJson, ...extendParam, }; } this.setLoadParam({ tableCode, loadParam: extendParam, onComplete: () => { this.loadTableData({ tableCode }); }, }); }, }); } else if (param) { this.setSearchParam({ tableCode, searchParam: param, onComplete: () => { this.loadTableData({ tableCode }); }, }); } else if (extendParam) { if (!tempParamJson) { const loadParamJson = this.initLoadParam({ tableCode }); extendParam = { ...loadParamJson, ...extendParam, }; } this.setLoadParam({ tableCode, loadParam: extendParam, onComplete: () => { this.loadTableData({ tableCode }); }, }); } else { this.loadTableData({ tableCode }); } }; /* 初始化加载参数 */ initLoadParam = ({ tableCode, pageSize, pageIndex }) => { const tableConfig = this.getTableConfig({ tableCode }); let { sort, order, defaultPageSize } = tableConfig ? tableConfig : {}; if (!sort) { sort = 'CREATE_TIME'; order = 1; } const loadParamJson = initFilter(this.props.login.OrgId, '', sort, order); if (defaultPageSize) { loadParamJson.Limit = defaultPageSize; loadParamJson.Start = (loadParamJson.PageIndex - 1) * defaultPageSize; } if (pageSize) { loadParamJson.Limit = pageSize; loadParamJson.Start = (loadParamJson.PageIndex - 1) * pageSize; } if (pageIndex) { let pz = 10; if (pageSize >= 0) { pz = pageSize; } else if (defaultPageSize) { pz = defaultPageSize; } else { pz = 10; } loadParamJson.PageIndex = pageIndex; loadParamJson.Start = (pageIndex - 1) * pz; } const selectFields = (tableConfig.navColumns || []) .map((col) => { return col.FIELD_NAME && col.FIELD_NAME !== 'null' ? col.FIELD_NAME : false; }) .filter((field) => !!field); if (selectFields.length && !tableConfig.isNoSelectField) { if (selectFields.indexOf('ID') === -1) { selectFields.push('ID'); } if (selectFields.indexOf('ORG_ID') === -1) { selectFields.push('ORG_ID'); } loadParamJson.SelectField = selectFields; } if (tableConfig && tableConfig.rule) { addRuleAndGroups(loadParamJson, tableConfig.rule); } return loadParamJson; }; /* 加载表数据 */ loadTableData(params) { const { tableCode = this.defaultTableCode, isResetLoad, pageSize, onComplete, onLoadData } = params ? params : {}; const tempParamJson = this.getLoadParam({ tableCode }); if (isResetLoad || !tempParamJson) { const loadParamJson = this.initLoadParam({ tableCode, pageSize }); this.setLoadParam({ tableCode, loadParam: loadParamJson, onComplete: () => { const paramJson = this.getLoadParam({ tableCode }); const tempJson = paramJson ? JSON.parse(JSON.stringify(paramJson)) : {}; this.doLoadTableData({ ...tempJson }, tableCode, onComplete, onLoadData); }, }); } else { const paramJson = this.getLoadParam({ tableCode }); const tempJson = paramJson ? JSON.parse(JSON.stringify(paramJson)) : {}; this.doLoadTableData({ ...tempJson }, tableCode, onComplete, onLoadData); } } /* 重置加载表数据参数 */ onLoadTableDataParam(params) {} /* 加载数据之后 */ onAfterLoadTableData(params) {} getRequestHeaders = () => { // 请求参数 const addHeader = 'Bearer ' + storage('lacal').getItem('accessToken').val; const userId = storage('lacal').getItem('userid').val; const user = storage('lacal').getItem('loginUserVerify').val; const RootOrgId = storage('lacal').getItem('RootOrgId').val; const orgId = storage('lacal').getItem('webOrgId').val; const Tenant = storage('lacal').getItem('Tenant').val; const headers = { // 'Content-Type': type === 'post' ? 'application/json' : 'application/x-www-form-urlencoded', Authorization: addHeader, userid: userId, username: user ? user.username : '', RootOrgId, orgId, Tenant: Tenant, }; return headers; }; /** * 获取表格加载参数 * @param {*} loadParamJson * @param {*} tableCode */ getLoadTableDataParams = (loadParamJson, tableCode) => { if (tableCode === undefined) { tableCode = this.defaultTableCode; } const tableConfig = this.getTableConfig({ tableCode }); const { api, sorts, orgType, authOrgCodes, ignoreOrgRule } = tableConfig ? tableConfig : {}; if (api === null || api === undefined) return false; if (sorts && sorts.length) { sorts.forEach((t) => { extendOrder(loadParamJson, t.sort, t.order); }); } //去重添加添加导航属性 const navFields = []; if (tableConfig && tableConfig.includes && tableConfig.includes.length) { tableConfig.includes.forEach((t) => { navFields.push(t); }); } else if (tableConfig) { const cols = tableConfig.originalColumns && tableConfig.originalColumns.length ? tableConfig.originalColumns : tableConfig.columns; if (cols && cols.length) { const doGetInclude = (f) => { if (f && f.indexOf('.') > 0) { let pos = f.lastIndexOf('.'); let includeTable = f.substring(0, pos); navFields.push(includeTable); } }; cols.forEach((t) => { const field = t.field; if (field) { let opIndex = field.indexOf('+'); if (opIndex === -1) { opIndex = field.indexOf('-'); if (opIndex === -1) { opIndex = field.indexOf('*'); if (opIndex === -1) { opIndex = field.indexOf('/'); } } } if (opIndex !== -1) { const leftField = field.substring(0, opIndex); const rightField = field.substring(opIndex + 1); doGetInclude(leftField); doGetInclude(rightField); } else { doGetInclude(field); } } }); } } if (navFields.length) { const tmp = [...new Set(navFields)]; tmp.forEach((n, i) => { extendInclude(loadParamJson, n); }); } if (orgType) { loadParamJson.OrgType = orgType; } if (authOrgCodes) { loadParamJson.AuthOrgCodes = authOrgCodes; } //查询参数 const searchParam = this.getSearchParam({ tableCode }); if (searchParam) { if (searchParam) { addRuleAndGroups(loadParamJson, searchParam); } } // 菜单参数 const { currActivatedMenu } = this.props.app || {}; loadParamJson['MenuParameter'] = currActivatedMenu && currActivatedMenu.MENU_FORM_PARAMS ? currActivatedMenu.MENU_FORM_PARAMS : ''; // 是否忽略组织权限 if (ignoreOrgRule) { loadParamJson.IgnoreOrgRule = ignoreOrgRule; } const isError = this.onLoadTableDataParam({ tableCode, loadParam: loadParamJson, tableConfig }); if (isError) return false; return loadParamJson; }; /* 实际加载表数据 */ doLoadTableData = (loadParamJson, tableCode, onComplete, onLoadData) => { const payloadJson = this.getLoadTableDataParams(loadParamJson, tableCode); if (!payloadJson) return; if (tableCode === undefined) { tableCode = this.defaultTableCode; } const tableConfig = this.getTableConfig({ tableCode }); const { api } = tableConfig ? tableConfig : {}; this.props.dispatch({ type: 'listPage/getTableData', payload: loadParamJson, url: api, onComplete: (ret) => { if (ret && !ret.IsSuccessful) { message.error(ret.ErrorMessage); } if (ret && ret.Data && ret.Data.length && tableConfig.isShowRowNo) { ret.Data.forEach((n, i) => { n.ROW_NO = i + 1; }); } if (typeof onLoadData === 'function') { onLoadData(ret); } else { this.setTableData({ tableCode, data: ret, onComplete: () => { if (ret && typeof tableConfig.onAfterGetData === 'function') { tableConfig.onAfterGetData( ret.Data, tableConfig.pageTable ? tableConfig.pageTable.CODE : tableConfig.tableCode ); } if (ret) { this.onAfterLoadTableData({ tableCode, data: ret.Data }); } if (typeof onComplete === 'function') { onComplete(); } }, }); } // 设置默认选中 const { rowSelectedKeys } = this.props; if (Array.isArray(rowSelectedKeys) && rowSelectedKeys.length) { this.setTableSelectedRowKeys({ tableCode, selectedKeys: rowSelectedKeys }); } }, }); }; /* 获取配置 */ getTableConfig(params) { const { tableCode = this.defaultTableCode } = params || {}; let tableConfig = this.state.tableConfig; if (tableConfig === undefined) { tableConfig = {}; } return tableConfig[tableCode]; } /* 设置配置 */ setTableConfig({ tableConfig, onComplete }) { if (!tableConfig) return; let tableCode = tableConfig.tableCode; if (tableCode === undefined) { tableCode = this.defaultTableCode; tableConfig.tableCode = tableCode; } let tempTableConfig = this.state.tableConfig; if (tempTableConfig === undefined) { tempTableConfig = {}; } let oldConfig = tempTableConfig[tableCode]; if (oldConfig === undefined) { oldConfig = {}; } tableConfig = { ...oldConfig, ...tableConfig, }; if (tableConfig.originalColumns === undefined) { tableConfig.originalColumns = tableConfig.columns; } if (tableConfig.originalBtns === undefined) { tableConfig.originalBtns = tableConfig.btns; } if (tableConfig.originalRightBtns === undefined) { tableConfig.originalRightBtns = tableConfig.rightBtns; } if (tableConfig.originalRowBtns === undefined) { tableConfig.originalRowBtns = tableConfig.rowBtns; } if (!tableConfig.id) { tableConfig.id = guid(); } tempTableConfig = { ...tempTableConfig, [tableCode]: tableConfig, }; this.setState( { tableConfig: tempTableConfig, }, () => { if (typeof onComplete === 'function') { onComplete(); } } ); } /* 获取加载参数 */ getLoadParam(params) { const { tableCode = this.defaultTableCode } = params ? params : {}; let loadParam = this.state.loadParam; if (loadParam === undefined) { loadParam = {}; } return loadParam[tableCode]; } /* 设置加载参数 */ setLoadParam({ tableCode, loadParam, onComplete }) { if (tableCode === undefined) { tableCode = this.defaultTableCode; } let tempLoadParam = this.state.loadParam; if (tempLoadParam === undefined) { tempLoadParam = {}; } let oldParam = tempLoadParam[tableCode]; if (oldParam === undefined) { oldParam = {}; } loadParam = { ...oldParam, ...loadParam, }; tempLoadParam = { ...tempLoadParam, [tableCode]: loadParam, }; this.setState( { loadParam: tempLoadParam, }, () => { if (typeof onComplete === 'function') { onComplete(); } } ); } /* 获取查询参数 */ getSearchParam(params) { const { tableCode = this.defaultTableCode } = params ? params : {}; let searchParam = this.state.searchParam; if (searchParam === undefined) { searchParam = {}; } return searchParam[tableCode]; } /* 设置查询参数 */ setSearchParam({ tableCode, searchParam, onComplete }) { if (tableCode === undefined) { tableCode = this.defaultTableCode; } let tempSearchParam = this.state.searchParam; if (tempSearchParam === undefined) { tempSearchParam = {}; } let oldParam = tempSearchParam[tableCode]; if (oldParam === undefined) { oldParam = {}; } searchParam = { ...oldParam, ...searchParam, }; tempSearchParam = { ...tempSearchParam, [tableCode]: searchParam, }; this.setState( { searchParam: tempSearchParam, }, () => { if (typeof onComplete === 'function') { onComplete(); } } ); } /* 获取表数据 */ getTableData(params) { const { tableCode = this.defaultTableCode } = params ? params : {}; let data = this.state.data; if (data === undefined) { data = {}; } return data[tableCode]; } /* 设置表数据 */ setTableData({ tableCode, data, onComplete }) { if (tableCode === undefined) { tableCode = this.defaultTableCode; } let tempData = this.state.data; if (tempData === undefined) { tempData = {}; } tempData = { ...tempData, [tableCode]: data, }; this.setState( { data: tempData, }, () => { if (typeof onComplete === 'function') { onComplete(); } } ); } /* 获取选中 */ getTableSelectedRowKeys(params) { const { tableCode = this.defaultTableCode } = params ? params : {}; let selectedKeys = this.state.selectedKeys; if (selectedKeys === undefined) { selectedKeys = {}; } const cuKeys = selectedKeys[tableCode]; if (cuKeys) { return cuKeys; } return []; } /** * add by qxiong 2020.06.11 * @param {*} param0 * 设置所有页面选中 * 在此日期前,有关 selectedKeys 的使用 * 并没有发现复制一份旧的 selectedKeys, 然后使用 tableCode 保存新一份 selectedKeys 有什么作用 * 所以此处不继续沿用这种逻辑,而是直接该保存保存,不绕弯路 * const { selectedRowsAll = [] } = this.state * 上面这一行的 selectedRowsAll = [] 默认赋值,以及为什么会有很多 undefined 的判断,因为这个组件是被继承的,继承的组件中又重写了state * 所以就相当于直接在这个组件中定义 state,基本都取不到 */ setTableSelectedRowsAll = ({ selectedRowKeys, selectedRows = [] }) => { const { selectedRowsAll = [] } = this.state; selectedRowsAll.push(...selectedRows); const tempSelected = []; selectedRowKeys.forEach((key) => { const find = selectedRowsAll.find((row) => row.ID === key); find && tempSelected.push(find); }); this.state.selectedRowsAll = tempSelected; }; /* 设置选中 */ setTableSelectedRowKeys({ tableCode, selectedKeys, onComplete }) { if (tableCode === undefined) { tableCode = this.defaultTableCode; } let tempSelectedKeys = this.state.selectedKeys; if (tempSelectedKeys === undefined) { tempSelectedKeys = {}; } tempSelectedKeys = { ...tempSelectedKeys, [tableCode]: selectedKeys, }; let isSelected = this.state[tableCode + '_isSelected']; if (!selectedKeys || !selectedKeys.length) { isSelected = false; } this.setState( { selectedKeys: tempSelectedKeys, [tableCode + '_isSelected']: isSelected, }, () => { const tableConfig = this.getTableConfig({ tableCode }); if (tableConfig && typeof tableConfig.onSelectChange === 'function') { tableConfig.onSelectChange( this.getTableSelectedRowKeys({ tableCode }), tableConfig.pageTable ? tableConfig.pageTable.CODE : tableCode ); } if (typeof onComplete === 'function') { onComplete(); } } ); } /* 表改变事件 */ onTableChange = (tableCode, pagination, filters, sorter) => { const { current, pageSize } = pagination; const loadParam = this.getLoadParam({ tableCode }); let sort = {}; if (sorter && sorter.field) { sort['Sort'] = sorter.field; sort['Order'] = sorter.order === 'descend' ? '0' : '1'; } let newParams = { ...loadParam, OrgId: this.props.login.OrgId, PageIndex: current, Limit: pageSize, Start: (current - 1) * pageSize, }; const tempParam = { ...newParams, ...sort }; if (!loadParam.IsAllLoad) { const tempJson = JSON.parse(JSON.stringify(tempParam)); this.doLoadTableData({ ...tempJson }, tableCode); } this.setLoadParam({ tableCode, loadParam: tempParam, onComplete: () => { this.onAfterTableChange({ tableCode, pagination, filters, sorter, loadParam: tempParam }); }, }); }; /* 表改变之后 { tableCode, pagination, filters, sorter, loadParam } */ onAfterTableChange(params) {} /* 选中表行项改变时 */ onSelectTableChange = (tableCode, selectedRowKeys, selectedRows) => { // 选择表格行 this.setTableSelectedRowsAll({ selectedRowKeys, selectedRows }); this.setTableSelectedRowKeys({ tableCode, selectedKeys: selectedRowKeys }); this.setState({ [tableCode + '_isSelected']: selectedRowKeys && selectedRowKeys.length, }); }; /* 获取表选中记录 { tableCode:表编号 } */ getTableSelectedRecord(params) { const { tableCode = this.defaultTableCode } = params ? params : {}; const tableData = this.getTableData({ tableCode }); const selectKeys = this.getTableSelectedRowKeys({ tableCode }); const result = []; if (selectKeys && tableData && tableData.Data) { selectKeys.forEach((item) => { tableData.Data.forEach((t) => { if (item.toString().toUpperCase() == t.ID.toString().toUpperCase()) { result.push(t); } }); }); } return result; } /* 保存行记录 */ saveRowRecord({ record, onComplete, tableCode }) { if (tableCode === undefined) { tableCode = this.defaultTableCode; } const data = this.getTableData({ tableCode }); let list = data.Data; if (!list) { list = []; data.Data = []; } const index = list.findIndex((item) => record.ID === item.ID); const item = list[index]; if (item) { list.splice(index, 1, { ...item, ...record, }); } this.setTableData({ tableCode, data, onComplete, }); } /* {field,value,colConfig,record,thisRef,tableCode} */ onAfterRowControlChange(params) {} /* {field,value,colConfig,record,thisRef} */ onRowControlChange(params) { const { field, value, record, thisRef, tableCode = thisRef.defaultTableCode } = params ? params : {}; if (record) { setDataFieldValue(record, field, value); thisRef.saveRowRecord({ record, tableCode, onComplete: () => { thisRef.onAfterRowControlChange(params); }, }); } } /* {field,colConfig,record,thisRef,tableCode} */ onRowControlBlur(params) { const { thisRef } = params ? params : {}; thisRef.onAfterRowControlBlur(params); } /* {field,colConfig,record,thisRef,tableCode} */ onAfterRowControlBlur(params) {} /* {record,选中记录 data,当前数据行项 colConfig, 列配置信息 thisRef,当前组件 tableCode, } */ onRowDropDownFillData(params) {} /* {record,complete,colConfig,data,columns,thisRef} */ onBeforeRowDropDownSelect(params) {} /* {record,complete,colConfig,data,columns,thisRef} */ onAfterRowDropDownSelect(params) {} /* {record,complete,colConfig,data,columns,thisRef} */ onRowDropDownSelect(params) { const { record, complete, colConfig, data, columns, thisRef, tableCode = thisRef.defaultTableCode, } = params ? params : {}; if (thisRef.onBeforeRowDropDownSelect({ ...params })) return; const configData = colConfig.data; thisRef.fillDropDownSelectRecord({ record, data, saveField: configData.saveField, labelField: configData.labelField, navField: configData.navField, field: colConfig.field, idField: colConfig.idField, }); thisRef.onRowDropDownFillData({ ...params, record, data, colConfig }); thisRef.saveRowRecord({ record: data, tableCode, onComplete: () => { if (typeof complete === 'function') { complete(); } thisRef.onAfterRowDropDownSelect({ ...params }); const saveFields = configData.saveField ? configData.saveField.split(',') : []; if (saveFields && saveFields.length && columns && columns.length) { saveFields.forEach((n, i) => { columns.forEach((item) => { if (item.field == n) { thisRef.onAfterRowControlChange({ field: n, value: getDataFieldValue(data, n), colConfig: item, record: data, tableCode, }); } }); }); } }, }); } /* {record,colConfig,params,thisRef,tableCode} */ onRowDropDownFilter(params) {} /* {tableCode,record,isShow,isPermit,getHeadFieldValue} */ onRowEditFormData(params) { const { record, tableCode = this.defaultTableCode } = params ? params : {}; const data = this.getTableData({ tableCode }); return { record: record, onSave: (row) => { this.saveRowRecord({ ...params, record: row }); }, stateData: data ? [] : data.Data, }; } /* 重置行列配置信息 */ setRowColumnConfig({ col, record, params }) { col.value = getDataFieldValue(record, col.field); if (col.field && col.field.indexOf('Nav_SysParams') > -1) { col.value = this.getControlValue({ controlType: col.controlType, value: col.value, data: col.data, }); } col.showFormId = record && col.showIdField ? getDataFieldValue(record, col.showIdField) : null; col.onChange = (changeParam) => { this.onRowControlChange({ ...params, ...changeParam, record, colConfig: col }); }; col.onBlur = (blurParam) => { this.onRowControlBlur({ ...params, ...blurParam, record, colConfig: col }); }; if (col.controlType === 9) { //分页下拉 if (!col.data) { col.data = {}; } col.data.onSelect = (selectParam) => { this.onRowDropDownSelect({ ...params, ...selectParam, complete: selectParam.complete, record: selectParam.record, data: record, colConfig: col, }); }; col.data.onFilter = (filterParams) => { this.onRowDropDownFilter({ ...params, ...filterParams, record, colConfig: col }); }; } if (col.editFormCode) { if (!col.data) { col.data = {}; } col.data.editFormData = this.onRowEditFormData({ ...params, record }); } } /* 格式化行项列 */ onTableRowFormatColumn({ tableCode, tableConfig, colConfig, record, text }) { return text; } /** * 可控的排序设置 * */ setSortData = (orderType, sortType, tc) => { this.setLoadParam({ tableCode: tc, loadParam: { Order: orderType, Sort: sortType, }, onComplete: () => { this.loadTableData({ tableCode: tc }); }, }); }; /**搜索单列 */ setSearchInfo = (value, fields) => { this.setState({ localSearch: { fields, value, }, }); }; /**单元格 */ renderCell = ({ isShowCol, col, tableCode, tableConfig, record, text, columns }) => { if (isShowCol) { if (col.formatFuncName) { col.format = (params) => { const formatValue = this.onTableRowFormatColumn({ record: params.record, text: params.text, tableCode, tableConfig, colConfig: params.col, }); setDataFieldValue(record, (col.field ? col.field : col.formatFuncName) + '_formatValue', formatValue); return formatValue; }; } return this.getTableCellText({ col, record, text }); } this.setRowColumnConfig({ col, params: { columns, tableCode, tableConfig }, record }); return (
0 && col.width, wordWrap: 'break-word', wordBreak: 'break-all' }} > {this.getControl(col)}
); }; /* { format,enumName,isBool,isDate,isPercent,isTwoPoint,isLimitText,isTime,showFormCode,showIdField,showFormId,visible,label,ID,width data:{ enumName } } */ getColumnByColumnConfig(tableCode) { const { showColumnSetting, showFilterDropdown } = this.state; const tableConfig = this.getTableConfig({ tableCode }); if (!tableConfig) { return []; } const columns = tableConfig.columns; if (!columns) return []; const cols = []; const tmp = []; if (tableConfig.isShowRowNo) { tmp.push({ title: '序号', key: 'ROW_NO', dataIndex: 'ROW_NO', width: 60 }); } columns.forEach((col) => { if (col.visible || col.visible === undefined) { const isShowCol = col.controlType === null || col.controlType === undefined || col.controlType === 0 || col.controlType > 100; const uniqueKey = col.id ? col.id : col.field ? col.field : col.formatFuncName; const columnObj = { title:
{col.label}
, key: uniqueKey, dataIndex: col.field, filterDropdown: (args) => { return ( this.setSortData(type, col.field, tableCode)} setSearchInfo={(val) => this.setSearchInfo(val, col.field, tableCode)} tableConfig={tableConfig} onMouseLeave={() => this.setState({ showFilterDropdown: false, showColumnSetting: null })} stateTableConfig={this.state.tableConfig} setTableConfig={(value) => this.setState({ tableConfig: value })} colConfig={col} /> ); }, filterDropdownVisible: showFilterDropdown && showColumnSetting === uniqueKey, filterIcon: (filtered) => (showColumnSetting === uniqueKey ? :
), onFilterDropdownVisibleChange: (visible) => { this.setState({ showFilterDropdown: visible, }); }, render: (text, record) => { const convertText = this.renderCell({ isShowCol, col, tableCode, tableConfig, record, text, columns }); const cellTitle = typeof convertText === 'string' || typeof convertText === 'number' ? convertText : ''; return {convertText}; }, }; col.width && (columnObj.width = col.width); tmp.push(columnObj); } }); if (tmp && tmp.length) { tmp.forEach((n, i) => { cols.push(n); }); } return cols; } /* 获取渲染按钮 */ getRenderBtns(tableCode, tableConfig, record, btns, type) { console.log('1111111111'); const filterBtns = []; if (btns && btns.length) { btns.forEach((btn) => { const { BTN_CONDITION } = btn.btn || {}; if (BTN_CONDITION) { // 判断是 AND 还是 OR 逻辑 let isAndLogic = BTN_CONDITION.includes('&'); let separator = isAndLogic ? '&' : '|'; const conditionGroups = BTN_CONDITION.split(separator).map((item) => { const conds = item.split(','); return { field: conds[0], operate: conds[1], //value: conds[2] value: getParseValue(conds[2], this.props.login.user), }; }); // 根据逻辑类型判断是否满足条件 let isConditionMatch = false; if (isAndLogic) { // AND 逻辑:所有条件都必须满足 isConditionMatch = conditionGroups.every((cond) => { const { field, operate, value } = cond; let fileValue = get(record, field); switch (Number(operate)) { case 1: // 等于 return fileValue == value; case 2: // 不等于 return fileValue != value; default: return false; } }); } else { // OR 逻辑:任意一个条件满足即可 isConditionMatch = conditionGroups.some((cond) => { const { field, operate, value } = cond; let fileValue = get(record, field); switch (Number(operate)) { case 1: return fileValue == value; case 2: return fileValue != value; default: return false; } }); } if (isConditionMatch) { filterBtns.push(btn); } } else { filterBtns.push(btn); } }); } //排序 filterBtns.sort(compare); return filterBtns.map((t) => { return this.getRenderBtn({ tableCode, tableConfig, record, btnConfig: t, type }); }); } /* 获取表行项样式类名称 */ onTableRowClassName({ tableConfig, record }) { if (this.props.SetRowClass && typeof this.props.SetRowClass === 'function') { return this.props.SetRowClass(record); } else if (tableConfig && tableConfig.classField) { let className = null; let classAry = tableConfig.classField.split(','); classAry.forEach((n, i) => { let splitClass = n.split(':'); if (splitClass.length === 2) { let filed = splitClass[0]; let values = splitClass[1].split('|'); let r = record[filed]; if (r !== null && r !== undefined && values.length > 1) { let index = 0; let isGet = false; for (index = 0; index < values.length; index = index + 2) { if (values[index].toString() == r.toString()) { //如果数组中某个元素和你想要测试的元素对象element相等,则证明数组中包含这个元素,返回true isGet = true; break; } } if (isGet) { className = values[index + 1]; return className; } } } }); return className; } return null; } /* 渲染表行项子表 */ onRenderTableSubRow({ tableCode, tableConfig, record }) {} /* 展开表行项时 */ onTableExpandRow({ tableCode, tableConfig, record, expanded }) {} /* 渲染表页脚 */ onRenderTableFooter({ tableCode, tableConfig, data, columns, selectedRowKeys }) { return ( ); } /* 点击表行项 */ onTableClickRow({ tableCode, tableConfig, record }) {} /** * 按钮点击日志埋点 * @param {*} BtnCode * @param {*} BtnName */ btnOperateLog = (btnConfig) => { const { btnType: BtnCode, label: BtnName } = btnConfig || {}; if (BtnCode !== undefined && BtnName !== undefined) { this.props.dispatch({ type: 'app/operateLog', payload: { BtnCode, BtnName, FormCode: this.state.formData.CODE, FormName: this.state.formData.NAME, UserId: this.props.login.userId, OrgId: this.props.login.OrgId, }, }); } }; /* btn={ id:按钮ID btnType:按钮类型 code:按钮编号 label:显示名称 icon:按钮图标 css:按钮样式 formCode:表单编号 api:API isConfirm:是否需确认 checkSelected:检查选中 isAddLog:是否需添加日志 } type:0-行按钮 1-按钮 2-右侧按钮 */ getRenderBtn(params) { const { tableCode, tableConfig, record, btnConfig } = params ? params : {}; const { formData } = this.state || {}; const isRow = record; const isSelected = this.state[tableCode + '_isSelected']; const loadKey = tableCode + '_' + (record ? record.ID + btnConfig.id : btnConfig.id); const btnIsLoading = this.state[loadKey]; const btnLoading = (loading) => { this.setState({ [loadKey]: loading, }); }; const setformLoading = (loading) => { this.setState({ formLoading: loading, }); }; const close = (type) => { if (type === undefined || type === 0) { const tmpFunc = this.state['closeModelFunc' + (record ? record.ID + btnConfig.id : btnConfig.id)]; if (tmpFunc) { tmpFunc(); } } if (type === undefined || type === 1) { this.loadTableData({ tableCode }); } }; let btnParam = this.onTableBtnParam({ ...params, close, btnLoading, setformLoading }); if (!btnParam) { btnParam = {}; } let { disabled, onBtnDisabled, content, click, json, onClick } = btnParam ? btnParam : {}; let disabledClick = disabled ? (e) => e.stopPropagation() : null; let disabledStyle = disabled ? { color: '#c5c3c3', cursor: 'not-allowed' } : { cursor: 'pointer' }; if (btnConfig.btnType === 0) { //自定义弹窗 const closeFunc = (fun) => { const data = {}; data['closeModelFunc' + (record ? record.ID + btnConfig.id : btnConfig.id)] = fun; this.setState(data); }; const showData = { regClose: closeFunc, }; const getIds = () => { if (btnConfig.btn.BTN_FUN_TYPE == 1) { //行按鈕 if (record) { let d = false; if (typeof onBtnDisabled === 'function') { d = onBtnDisabled(record); } if (d) return; return record.ID; } } else { const selectRecords = this.getTableSelectedRecord({ tableCode }); const tempSelectRecordIds = []; selectRecords.forEach((t) => { let d = false; if (typeof onBtnDisabled === 'function') { d = onBtnDisabled(t); } if (d) return; tempSelectRecordIds.push(t.ID); }); if (tempSelectRecordIds.length) { return tempSelectRecordIds.join(','); } } }; if (!content && btnParam) { const that = this; const clickKey = btnConfig.code ? btnConfig.code : btnConfig.id; // let tempData = { id: record ? record.ID : '', ORG_ID_HV: record ? record.ORG_ID : '', //wyw 集团查看 明细 parentRecord: record, clickKey, close, getIds, getTableSelectedRowKeys: () => that.getTableSelectedRowKeys({ tableCode }), btnConfig, ...getCustomParams(btnConfig.customParams), onSave: () => { close(); this.loadTableData({ tableCode }); }, onCancel: () => { close(); }, onRegDestroyCacheDataFunc: (ret) => { if (!this.regDestroyCacheDataFunc) { this.regDestroyCacheDataFunc = {}; } this.regDestroyCacheDataFunc[clickKey + (record ? record.ID : '')] = ret; }, }; const regClick = async function () { let ids = ''; let isError = false; if (btnConfig.btn.BTN_FUN_TYPE == 0) { //按鈕 非行按鈕 ids = that.getTableSelectedRowKeys({ tableCode }); if (btnConfig.checkSelected && !ids) { message.error('请选择记录'); isError = true; } } if (!isError) { await that.props.dispatch({ type: 'custom/save', payload: { [clickKey + (record ? record.ID : '')]: true, }, }); } that.btnOperateLog(btnConfig); return { isReturn: isError, }; }; if (btnParam.data) { tempData = { ...tempData, ...btnParam.data, }; } btnParam.content = ; btnParam.click = () => { return regClick(); }; showData.close = () => { if (this.regDestroyCacheDataFunc && this.regDestroyCacheDataFunc[clickKey + (record ? record.ID : '')]) { this.regDestroyCacheDataFunc[clickKey + (record ? record.ID : '')](); } }; } if (btnParam) { extend(showData, btnParam); } let disabledClick = disabled || !getIds() ? (e) => e.stopPropagation() : null; let disabledStyle = disabled || !getIds() ? { color: 'c5c3c3', cursor: 'not-allowed' } : { cursor: 'pointer' }; return ( {isRow ? (
) : ( )}
); } else if (btnConfig.btnType === 2) { // 刷新 if (!isRow) { return ( ); } } else if ( btnConfig.btnType === 5 || btnConfig.btnType === 3 || btnConfig.btnType === 8 || btnConfig.btnType === 10 ) { //编辑 新增 查看 复制新增 const isShow = btnConfig.btnType === 8; const getIds = () => { if (record) { let d = false; if (typeof onBtnDisabled === 'function') { d = onBtnDisabled(record); } if (d) return; return record.ID; } const selectRecords = this.getTableSelectedRecord({ tableCode }); const tempSelectRecordIds = []; selectRecords.forEach((t) => { let d = false; if (typeof onBtnDisabled === 'function') { d = onBtnDisabled(t); } if (d) return; tempSelectRecordIds.push(t.ID); }); if (tempSelectRecordIds.length) { return tempSelectRecordIds.join(','); } }; const isBatchEdit = btnConfig.btnType === 5 && !isRow; const isEdit = !isBatchEdit; const extKey = record ? record.ID + btnConfig.id : btnConfig.id; const reloadKey = (isEdit ? '' : 'batchEdit_') + (btnConfig.formCode + '_' + extKey + '_reload'); const data = { isShow: isShow, record, isBatchEdit: btnConfig.btnType === 5 && !isRow, parentRecord: this.props.parentRecord, getIds, TreeSelected: this.props.data?.TreeSelected, TreeSelectId: this.props.data?.TreeSelectId, reloadKey, }; if (data.isBatchEdit && !disabled) { disabled = !isSelected; } if (record && !disabled) { disabled = !getIds(); } disabledClick = disabled ? (e) => e.stopPropagation() : null; disabledStyle = disabled ? { color: '#c5c3c3', cursor: 'not-allowed' } : { cursor: 'pointer' }; const id = btnConfig.btnType !== 10 && record ? record.ID : ''; const copySrcId = btnConfig.btnType === 10 && record ? record.ID : ''; return ( { this.loadTableData({ tableCode }); }} formCode={btnConfig.formCode} click={(visible) => { visible && this.btnOperateLog(btnConfig); if (typeof click === 'function') { click(visible); } }} > {isRow ? (
) : ( )}
); } else if (btnConfig.btnType === 4) { //删除 const getIds = () => { if (record) { let d = false; if (typeof onBtnDisabled === 'function') { d = onBtnDisabled(record); } if (d) return; return record.ID; } const selectRecords = this.getTableSelectedRecord({ tableCode }); const tempSelectRecordIds = []; selectRecords.forEach((t) => { let d = false; if (typeof onBtnDisabled === 'function') { d = onBtnDisabled(t); } if (d) return; tempSelectRecordIds.push(t.ID); }); if (tempSelectRecordIds.length) { return tempSelectRecordIds.join(','); } }; if (isRow) { return ( { this.btnOperateLog(btnConfig); this.onTableBtnDelete({ ...params, btnConfig, id: getIds(), btnLoading }); }} type={btnConfig.css ? btnConfig.css : 'danger'} icon={btnConfig.icon ? btnConfig.icon : 'delete'} title="删除" size="small" confirmTitle={'是否确定删除?'} disabled={disabled || !getIds()} loading={btnIsLoading} /> ); } else { return ( { this.btnOperateLog(btnConfig); this.onTableBtnBatchDelete({ ...params, btnConfig, ids: getIds(), btnLoading }); }} type={btnConfig.css ? btnConfig.css : 'danger'} icon={btnConfig.icon ? btnConfig.icon : 'delete'} title="删除" confirmTitle={'是否确定删除?'} disabled={disabled || !isSelected} loading={btnIsLoading} /> ); } } else if (btnConfig.btnType === 6) { //自定义按钮事件 const regClick = () => { let tempBtnParam = null; if (typeof click === 'function') { tempBtnParam = click(); } let { json, onBtnDisabled, onClick } = tempBtnParam ? tempBtnParam : {}; const getIds = () => { if (record) { let d = false; if (typeof onBtnDisabled === 'function') { d = onBtnDisabled(record); } if (d) return; return record.ID; } const selectRecords = this.getTableSelectedRecord({ tableCode }); const tempSelectRecordIds = []; selectRecords.forEach((t) => { let d = false; if (typeof onBtnDisabled === 'function') { d = onBtnDisabled(t); } if (d) return; tempSelectRecordIds.push(t.ID); }); if (tempSelectRecordIds.length) { return tempSelectRecordIds.join(','); } }; const ids = getIds(); if (!ids && (isRow || (!isRow && btnConfig.checkSelected))) { message.error('请选择记录或者记录无效'); return; } if (btnConfig.api) { const filter = initFilter(this.props.login.OrgId, ids); const temJson = json ? { ...filter, ...json } : filter; if (typeof onClick === 'function') { if (onClick(temJson, ids)) { return; } } btnLoading(true); this.props.dispatch({ type: 'app/getDataByPost', payload: temJson, url: btnConfig.api, onComplete: (ret) => { btnLoading(false); if (ret) { this.loadTableData({ tableCode }); message.success('执行成功'); //添加日志 if (btnConfig.isAddLog) { const formId = tableConfig.formId ? tableConfig.formId : tableConfig.formData ? tableConfig.formData.ID : this.props.formId; const formCode = tableConfig.formCode ? tableConfig.formCode : tableConfig.formData ? tableConfig.formData.CODE : this.props.formCode; const title = '用户【' + this.props.login.user.NAME + '】:执行按钮' + btnConfig.title; const data = 'ID:' + ids; const extData = 'Json:' + JSON.stringify(temJson); this.addOtherLog({ formCode, formId, title, data, extData }); } } }, }); } this.btnOperateLog(btnConfig); }; disabled = disabled ? disabled : (isRow && false) || (!isRow && !isSelected && btnConfig.checkSelected) ? true : false; return ( ); } else if (btnConfig.btnType === 7) { //自定义 const getIds = () => { if (record) { let d = false; if (typeof onBtnDisabled === 'function') { d = onBtnDisabled(record); } if (d) return; return record.ID; } const selectRecords = this.getTableSelectedRecord({ tableCode }); const tempSelectRecordIds = []; selectRecords.forEach((t) => { let d = false; if (typeof onBtnDisabled === 'function') { d = onBtnDisabled(t); } if (d) return; tempSelectRecordIds.push(t.ID); }); if (tempSelectRecordIds.length) { return tempSelectRecordIds.join(','); } }; if (content) { return content; } if (btnConfig.api) { const regClick = () => { const ids = getIds(); if (!ids && !isRow && btnConfig.checkSelected) { message.error('请选择记录'); return; } const filter = initFilter(this.props.login.OrgId, ids); const temJson = json ? { ...filter, ...json } : filter; if (typeof onClick === 'function') { if (onClick(temJson, ids)) { return; } } btnLoading(true); this.btnOperateLog(btnConfig); this.props.dispatch({ type: 'app/getDataByPost', payload: temJson, url: btnConfig.api, onComplete: (ret) => { btnLoading(false); if (ret) { this.loadTableData({ tableCode }); message.success('执行成功'); //添加日志 if (btnConfig.isAddLog) { const formId = tableConfig.formId ? tableConfig.formId : tableConfig.formData ? tableConfig.formData.ID : this.props.formId; const formCode = tableConfig.formCode ? tableConfig.formCode : tableConfig.formData ? tableConfig.formData.CODE : this.props.formCode; const title = '用户【' + this.props.login.user.NAME + '】:执行按钮' + btnConfig.title; const data = 'ID:' + ids; const extData = 'Json:' + JSON.stringify(temJson); this.addOtherLog({ formCode, formId, title, data, extData }); } } }, }); }; disabled = disabled ? disabled : (isRow && !getIds()) || (!isRow && !isSelected && btnConfig.checkSelected) ? true : false; return ( ); } const customParams = getCustomParams(btnConfig.customParams); if (customParams && customParams.print === 'true') { return ( this.btnOperateLog(btnConfig)}> ); } } else if (btnConfig.btnType === 9) { // 导出 let { tableCode = this.defaultTableCode, tableConfig } = params ? params : {}; tableConfig === undefined && (tableConfig = this.getTableConfig({ tableCode })); const tableColumns = this.getColumnByColumnConfig(tableCode); const tableDataSource = this.getTableData({ tableCode }); const tableSelectedKeys = this.getTableSelectedRowKeys({ tableCode }); const loadParamJson = this.getLoadTableDataParams(cloneDeep(this.initLoadParam({ tableCode })), tableCode); // 计算导出的 excel 需要在第一行插入的标题 const formCode = tableConfig.formCode ? tableConfig.formCode : tableConfig.formData ? tableConfig.formData.CODE : this.props.formCode; const searchModel = this.props.search || { fieldConfigs: {}, relatedFieldConfigs: {}, }; const relatedFieldConfigs = searchModel.relatedFieldConfigs[formCode] || {}; const relatedFormCode = relatedFieldConfigs.relatedTo; const relatedExtraRows = relatedFieldConfigs.extraRows; const fieldConfigs = searchModel.fieldConfigs[relatedFormCode || formCode] || []; const exportInserTitle = [tableConfig.exportTitle || formData.NAME]; if (relatedFormCode && Array.isArray(relatedExtraRows)) { exportInserTitle.push(...relatedExtraRows); } fieldConfigs.forEach((fc) => { const { isExportTitle, label, value, dataSource } = fc; const cellText = renderExportCell(value, dataSource, fc, this.props.app.enums || {}); if (isExportTitle && cellText) { exportInserTitle.push(`${label}:${cellText}`); } }); if (!isRow) { return ( ); } return null; } else if (btnConfig.btnType === 11) { // 导入 if (!isRow) { return ( { this.btnOperateLog(btnConfig); }} > ); } return null; } else if (btnConfig.btnType === 12) { // 列表弹窗 return ( { visible && this.btnOperateLog(btnConfig); if (typeof this.click === 'function') { this.click(visible); } }} > ); } else if (btnConfig.btnType === 14) { // 组合表单 return ( { visible && this.btnOperateLog(btnConfig); if (typeof this.click === 'function') { this.click(visible); } }} > ); } else if (btnConfig.btnType === 15) { // 自定义导入 const uploadProps = { name: 'file', showUploadList: false, action: config.serviceHost(btnConfig.api), data: { OrgId: this.props.login.OrgId }, headers: this.getRequestHeaders(), onChange: (info) => { const { name, status, response = {} } = info.file; const { IsSuccessful, ErrorMessage } = response; if (status === 'done') { if (IsSuccessful) { message.success(`${name} 导入并保存成功`); this.forceUpdate(); } else { message.error(`${name} 导入失败,${ErrorMessage}`); } } else if (status === 'error') { if (response.ErrorMessage) { message.error(`${name} 导入错误,${ErrorMessage}`); } else { message.error(`${name} 导入错误`); } } }, }; return ( ); } else if (btnConfig.btnType === 16) { // 带参数的自定义弹窗 return ( { visible && this.btnOperateLog(btnConfig); if (typeof this.click === 'function') { return this.click(visible); } }} > ); } else if (btnConfig.btnType === 17) { // 树弹窗 return ( { visible && this.btnOperateLog(btnConfig); if (typeof this.click === 'function') { return this.click(visible); } }} > ); } else if (btnConfig.btnType === 18) { // word打印模板 return ( , }} > ); } else if (btnConfig.btnType === 20) { // 复选框 return ( { tableConfig.dragable = evt.target.checked; this.forceUpdate(); }} > {btnConfig.label} ); } return isRow ? (
) : ( ); } /* 参数:{ tableCode,tableConfig,record,btnConfig, type:0-行按钮 1-按钮 2-右侧按钮 按钮类型: 0://自定义弹窗 close 关闭事件,selectRecords:选中行项函数 6://自定义点击事件 selectRecords:选中行项函数 7://自定义 selectRecords:选中行项函数 } 返回值:{ 按钮类型: 0://自定义弹窗 disabled 按钮是否失效,click:点击事件,onBtnDisabled:按钮失效事件,content:弹窗中显示的文本DOM 3,5,8,10:// 新增 编辑 查看 复制新增 disabled:按钮是否失效,click:点击事件 4:删除 disabled:按钮是否失效 6:自定义点击事件 disabled 按钮是否失效,click:点击事件,onBtnDisabled:按钮失效事件,json:点击调用参数 7:自定义 disabled 按钮是否失效,content:弹窗中显示的文本DOM,onBtnDisabled:按钮失效事件,json:点击调用参数 } */ onTableBtnParam(params) { // const { tableCode, tableConfig, record, btnConfig } = params ? params : {}; return {}; } /* 删除记录 */ onTableBtnDelete(params) { let { tableCode = this.defaultTableCode, tableConfig, id, btnConfig, btnLoading } = params ? params : {}; if (tableConfig === undefined) { tableConfig = this.getTableConfig({ tableCode }); } const delApiUrl = tableConfig ? tableConfig.deleteApi : {}; if (empty(delApiUrl)) { message.error('请配置删除API'); return; } if (empty(id)) { return; } if (btnLoading) { btnLoading(true); } this.props.dispatch({ type: 'app/deleteItem', payload: { id }, url: delApiUrl, onComplete: (ret) => { if (btnLoading) { btnLoading(false); } if (ret) { const deleteData = []; if (btnConfig.isAddLog) { const tableData = this.getTableData({ tableCode }); const selectKeys = id.split(','); // this.getTableSelectedRowKeys({ tableCode }); if (selectKeys && tableData && tableData.Data) { selectKeys.forEach((item) => { tableData.Data.forEach((t) => { if (item.toString().toUpperCase() === t.ID.toString().toUpperCase()) { deleteData.push(t); } }); }); } } message.success('删除成功'); this.loadTableData({ tableCode }); if (btnConfig.isAddLog) { const formId = tableConfig.formId ? tableConfig.formId : tableConfig.formData ? tableConfig.formData.ID : this.props.formId; const formCode = tableConfig.formCode ? tableConfig.formCode : tableConfig.formData ? tableConfig.formData.CODE : this.props.formCode; const extData = deleteData ? ('删除数据,详情:', JSON.stringify(deleteData)) : null; this.addDeleteLog({ formCode, ids: id, formId, extData }); } } }, }); } /* 批次删除记录 */ onTableBtnBatchDelete(params) { let { tableCode = this.defaultTableCode, tableConfig, ids, btnConfig, btnLoading } = params ? params : {}; if (tableConfig === undefined) { tableConfig = this.getTableConfig({ tableCode }); } const delApiUrl = tableConfig ? tableConfig.batchDeleteApi : {}; if (empty(delApiUrl)) { message.error('请配置删除API'); return; } if (!ids) return; if (btnLoading) { btnLoading(true); } this.props.dispatch({ type: 'app/deleteItemBatch', payload: { ids: ids, }, url: delApiUrl, onComplete: (ret) => { if (btnLoading) { btnLoading(false); } if (ret) { const deleteData = []; if (btnConfig.isAddLog) { const tableData = this.getTableData({ tableCode }); const selectKeys = ids.split(','); // this.getTableSelectedRowKeys({ tableCode }); if (selectKeys && tableData && tableData.Data) { selectKeys.forEach((item) => { tableData.Data.forEach((t) => { if (item.toString().toUpperCase() === t.ID.toString().toUpperCase()) { deleteData.push(t); } }); }); } } this.loadTableData({ tableCode }); message.success('删除成功'); this.setTableSelectedRowKeys({ tableCode, selectedKeys: [] }); if (btnConfig.isAddLog) { const formId = tableConfig.formId ? tableConfig.formId : tableConfig.formData ? tableConfig.formData.ID : this.props.formId; const formCode = tableConfig.formCode ? tableConfig.formCode : tableConfig.formData ? tableConfig.formData.CODE : this.props.formCode; const extData = deleteData ? ('删除数据,详情:', JSON.stringify(deleteData)) : null; this.addDeleteLog({ formCode, ids, formId: formId, extData }); } } }, }); } genDataSource(tableCode, tableData) { // 生产表格的dataSource const { localSearch = {} } = this.state; if (tableData.Data) { if (Object.keys(localSearch).length) { const tableConfig = this.getTableConfig({ tableCode }); return tableData.Data.filter((record) => { const col = tableConfig.columns.filter((t) => t.field === localSearch.fields)[0]; // '';//localSearch.fields let val = getDataFieldValue(record, col.field); const isShowCol = col.controlType === null || col.controlType === undefined || col.controlType === 0 || col.controlType > 100; if (isShowCol) { if (col.formatFuncName) { col.format = (params) => { const formatValue = this.onTableRowFormatColumn({ record, text: val, tableCode, tableConfig, colConfig: params.col, }); setDataFieldValue(record, (col.field ? col.field : col.formatFuncName) + '_formatValue', formatValue); val = formatValue; }; } val = this.getTableCellText({ col, record, text: val, isReturnString: true }); } //val = getDataFieldValue(record, col.field); if (col.field && col.field.indexOf('Nav_SysParams') > -1) { val = this.getControlValue({ controlType: col.controlType, value: col.value, data: col.data, }); } if (val) { // 值 if (typeof val === 'number') { val = val.toString(); } if (String(val) === 'null') { return false; } return val.indexOf(localSearch.value) >= 0; } return false; }); } else { return tableData.Data; } } else { return []; } } /** * 表格操作栏 */ tableOperateColumn(tableCode) { const tableConfig = this.getTableConfig({ tableCode }); const rowBtns = tableConfig.rowBtns; const OperateTitle = () => { return ( this.handleCustomFieldChange(tableConfig, field, value, t)} clearCustomConfig={() => this.clearCustomConfig(tableConfig)} saveCustomConfig={() => this.saveCustomConfig(tableConfig)} /> ); }; if (rowBtns && rowBtns.length) { let currRecord = {}; // let obj = { // render: (text, record, index) => { // currRecord = record // } // }; //let l = this.getRenderBtns(tableCode, tableConfig, currRecord, rowBtns, 0).filter(value => typeof value !== "undefined").length; //if (l === 0 || l == null) l = 1; let width = 32 * rowBtns.length; if (width < 80) { width = 80; } return ( } filterDropdown={} render={(text, record, index) => { // 此项宽度设置为 单个样式宽 * 按钮个数 - 左右边距 return (
{this.getRenderBtns(tableCode, tableConfig, record, rowBtns, 0)}
); }} /> ); } else { return ( } filterDropdown={} width={35} render={() =>
} /> ); } } // 伸缩表格列操作 handleResize = (tableCode, colu) => (e, { size }) => { if (this.state.tableConfig === undefined || !this.state.tableConfig[tableCode]) { message.error('表单配置错误!'); return; } let thisColumns = { ...this.state.tableConfig[tableCode] }; if (this.state.tableConfig === undefined) { this.state.tableConfig = {}; } thisColumns.columns.forEach((item) => { if (item.field === colu.dataIndex) { item.width = size.width; } }); this.setState({ tableConfig: { ...this.state.tableConfig, [this.state.tableConfig[tableCode]]: thisColumns, }, }); }; /** * 批量新增保存 */ handleBatchAddSave = (tableCode) => { const { selectedRowsAll = [] } = this.state; const { close } = this.props.data; close instanceof Function && close(undefined, cloneDeep(selectedRowsAll)); this.state.selectedRowsAll = undefined; this.onSelectTableChange(tableCode, [], []); }; moveRow = (dragIndex, hoverIndex, tableCode, tableConfig) => { const tableData = this.state.data[tableCode].Data; const dragRow = tableData[dragIndex]; const hoverRow = tableData[hoverIndex]; const pageTable = tableConfig.pageTable || {}; if (!pageTable.SORT) { message.error('未配置排序字段,操作取消'); return; } // 调用接口 this.props.dispatch({ type: 'listPage/listRowDragChange', payload: { Keyword: pageTable.DATA_TABLE, Parameter1: dragRow.ID, Parameter2: hoverRow.ID, Parameter3: pageTable.SORT, OrgId: this.props.login.OrgId, }, onComplete: (res) => { if (res) { // 更新数据 const updateData = update(tableData, { $splice: [ [dragIndex, 1], [hoverIndex, 0, dragRow], ], }); this.state.data[tableCode].Data = updateData; this.setState({ data: this.state.data }); } }, }); }; /* 渲染表 */ getRenderTable(tableCode) { if (tableCode === undefined) { tableCode = this.defaultTableCode; } let tableConfig = this.getTableConfig({ tableCode }); if (!tableConfig) return ; const tableHeight = tableConfig.pageTable ? tableConfig.pageTable.HEIGTH : 0; const tableWidth = tableConfig.pageTable ? tableConfig.pageTable.WIDTH : 0; const isFixed = tableConfig.checked || (tableConfig.rowBtns && tableConfig.rowBtns.length) || tableHeight; // 是否固定列 let newColumns = this.getColumnByColumnConfig(tableCode); // 表头字段 let loadParam = this.getLoadParam({ tableCode }); let tableData = this.getTableData({ tableCode }); const selectKeys = this.getTableSelectedRowKeys({ tableCode }); loadParam = loadParam || {}; tableData = tableData || {}; const tableDataSource = this.genDataSource(tableCode, tableData); tableDataSource.forEach((tds) => { !tds.hasOwnProperty('key') && (tds.key = tds.ID); }); const defaultExpandedRowKeys = tableDataSource && tableDataSource.length ? [tableDataSource[0].key] : []; const paginationConfig = loadParam?.IsAllLoad ? false : { pageSizeOptions: ['5', '10', '20', '100', '1000'], current: loadParam ? loadParam.PageIndex : 1, pageSize: loadParam ? loadParam.Limit : 10, total: tableData ? tableData.TotalCount : 0, showSizeChanger: true, showQuickJumper: true, size: 'small', position: tableConfig.position ? tableConfig.position : 'bottom', showTotal: () => `共 ${tableData ? tableData.TotalCount : 0} 条`, }; // 配置最多可选个数 const customRowSelection = tableConfig.maxCheckCount ? { hideDefaultSelections: true, columnTitle: ' ', getCheckboxProps: (record) => { return { disabled: selectKeys.length >= tableConfig.maxCheckCount && selectKeys.indexOf(record.ID) === -1, }; }, } : {}; const rowSelection = { // 如果需要支持拖曳排序,则不允许fixed,否则会报错 fixed: !tableConfig.hasChildren && !tableConfig.dragable, selectedRowKeys: selectKeys, columnWidth: 32, onChange: (selectedRowKeys, selectedRows) => { this.onSelectTableChange(tableCode, selectedRowKeys, selectedRows); }, type: tableConfig && tableConfig.checkType == 1 ? 'radio' : 'checkbox', hideDefaultSelections: false, ...customRowSelection, }; let hasFooter = () => { // 是否显示底部 let footerSumType = tableConfig.footerSumType; if (footerSumType === 1) { return true; } else if (footerSumType === 2) { return selectKeys && selectKeys.length > 0; } else { return false; } }; /** * 固定规则: * 固定列要设置宽度(操作列除外) * 留少数几列不设定宽度 */ let isScrollX = () => { if (isFixed) { const totalWidth = newColumns.reduce((a, b) => { if (b.width) { return a + b.width; } else { return a + 0; } }, 0); const scrollX = tableWidth > totalWidth + 200 ? tableWidth : totalWidth + 200; return { scroll: { x: scrollX, y: tableHeight } }; } else { return { scroll: { y: tableHeight } }; } }; const openNotification = (h) => { notification.destroy(); notification.open({ message: h.title, key: h.key, placement: 'bottomRight', }); }; let isLoading = this.props.loading ? this.props.loading.effects['listPage/getTableData'] : false; if (!isLoading) { isLoading = this.state.formLoading; } const isBatchAddList = this.props.data && this.props.data.btnTypeBatchAdd; const contentWidth = tableConfig.pageTable && tableConfig.pageTable.WIDTH ? tableConfig.pageTable.WIDTH : 'auto'; const TableHeadBtns = this.getRenderBtns(tableCode, tableConfig, null, tableConfig.btns, 1); const { components } = getDragableProps(); const dragableProps = tableConfig.dragable ? { components: { ...components, ...TableResizableCell, }, onRow: (rowRecord, index) => ({ index, moveRow: (dragIndex, hoverIndex) => this.moveRow(dragIndex, hoverIndex, tableCode, tableConfig), onClick: () => { this.onTableClickRow({ tableCode, tableConfig, rowRecord }); }, }), } : { components: TableResizableCell, onRow: (rowRecord, index) => ({ onClick: () => { this.onTableClickRow({ tableCode, tableConfig, rowRecord }); }, }), }; return ( {isBatchAddList ? (
) : TableHeadBtns && TableHeadBtns.length ? (
{TableHeadBtns}
) : null}
{ this.onTableChange(tableCode, pagination, filters, sorter); }} rowSelection={tableConfig.checked ? rowSelection : null} rowClassName={(record, index) => { const remoteClass = this.onTableRowClassName({ tableConfig, record }); const crossClass = index % 2 === 1 ? 'dark-row' : 'light-row'; if (remoteClass) { return classNames(styles[remoteClass]); } return classNames(styles[crossClass]); }} expandedRowRender={ tableConfig.hasChildren ? (record) => { return this.onRenderTableSubRow({ record, tableCode, tableConfig }); } : null } expandIcon={(props) => { if (!props.expandable) return null; if (props.expanded) { return props.onExpand(props.record, e)} />; } else { return props.onExpand(props.record, e)} />; } }} expandedRowKeys={this.state.expandedRowKeysChanged ? this.state.expandedRowKeys : defaultExpandedRowKeys} onExpand={(expanded, record) => { this.onTableExpandRow({ tableCode, tableConfig, record, expanded }); }} onExpandedRowsChange={(expandedRowKeys) => { this.setState({ expandedRowKeysChanged: true, expandedRowKeys, }); }} footer={ hasFooter() ? (data) => { return this.onRenderTableFooter({ tableCode, tableConfig, selectedRowKeys: selectKeys, data, columns: tableConfig.columns, }); } : null } bordered {...isScrollX()} {...dragableProps} > {newColumns && newColumns.map((h, index) => { return ( { return { onDoubleClick: (e) => { e.preventDefault(); e.stopPropagation(); if (h.title) { openNotification(h); } }, }; }} onHeaderCell={(column) => { return { onMouseEnter: () => { // 鼠标移入表头单元格 this.setState({ showColumnSetting: column.key, }); }, width: column.width, onResize: this.handleResize(tableCode, column), }; }} /> ); })} {!isBatchAddList ? this.tableOperateColumn(tableCode) : null}
); } handleTableCardSelect = (evt, item, tableCode) => { const selectKeys = cloneDeep(this.getTableSelectedRowKeys({ tableCode })); if (evt.target.checked) { this.onSelectTableChange(tableCode, [item.ID].concat(selectKeys), [item]); } else { const findIndex = selectKeys.findIndex((sel) => sel === item.ID); if (findIndex !== -1) { selectKeys.splice(findIndex, 1); this.onSelectTableChange(tableCode, selectKeys, []); } } }; /* * 渲染卡片式表格 */ getRenderTableCard(tableCode) { if (tableCode === undefined) tableCode = this.defaultTableCode; let tableConfig = this.getTableConfig({ tableCode }); if (!tableConfig) return null; let loadParam = this.getLoadParam({ tableCode }); let tableData = this.getTableData({ tableCode }); loadParam = loadParam || { PageIndex: 1, IsAllLoad: false, Limit: 10 }; tableData = tableData || { TotalCount: 0 }; const newColumns = this.getColumnByColumnConfig(tableCode); // 表头字段 const tableDataSource = this.genDataSource(tableCode, tableData); const selectKeys = this.getTableSelectedRowKeys({ tableCode }); const paginationConfig = { pageSizeOptions: ['5', '10', '20', '100', '100'], current: loadParam ? loadParam.PageIndex : 1, pageSize: loadParam ? (loadParam.IsAllLoad ? loadParam.ShowLimit : loadParam.Limit) : 10, total: tableData ? tableData.TotalCount : 0, showSizeChanger: true, showQuickJumper: true, size: 'small', position: tableConfig.position ? tableConfig.position : 'bottom', showTotal: () => `共 ${tableData ? tableData.TotalCount : 0} 条`, }; let isLoading = this.props.loading ? this.props.loading.effects['listPage/getTableData'] : false; if (!isLoading) { isLoading = this.state.formLoading; } const isBatchAddList = this.props.data && this.props.data.btnTypeBatchAdd; const TableHeadBtns = this.getRenderBtns(tableCode, tableConfig, null, tableConfig.btns, 1); const WrapComponent = tableConfig.dragable ? DragDropCard : React.Fragment; return (
{TableHeadBtns}
} >
{tableDataSource.map((ds, dsIndex) => { const actionBtns = this.getRenderBtns(tableCode, tableConfig, ds, tableConfig.rowBtns, 0); const thumbCode = get(ds, tableConfig.cardPicField); return ( this.moveRow(dragIndex, hoverIndex, tableCode, tableConfig)} >
this.handleTableCardSelect(evt, ds, tableCode)} className={styles.tableCardCheckbox} /> {newColumns.map((col) => { return (
{col.title} {col.render ? col.render(ds[col.dataIndex], ds) : ds[col.dataIndex]}
); })}
操作:
{actionBtns}
); })}
{ this.onTableChange(tableCode, { ...paginationConfig, current, pageSize }); }} onShowSizeChange={(current, pageSize) => { this.onTableChange(tableCode, { ...paginationConfig, current, pageSize }); }} {...paginationConfig} />
); } } export default TableBaseComponent;