提交 1edf9e12 authored 作者: 钟是志's avatar 钟是志

8350 活动申报-报名时间和活动时间没有限制关系

上级 76d6c137
......@@ -9,8 +9,7 @@ import { message } from 'antd';
import React, { Fragment } from 'react';
import * as service from '../publicApiService';
import * as destructionFunc from '../destruction';
import { Link, hashHistory } from 'dva/router';
import { getDefaultValues } from '../destruction';
import { Link } from 'dva/router';
import { getApplyPage } from '../publicApiService';
import { getHuanGeToken } from '@/utils/authority';
......@@ -20,12 +19,11 @@ import pageSetting from './pageSetting';
import ButtonDiy from '@/baseComponent/ButtonDiy';
import Shell from '@/baseComponent/Shell';
import config from '@/config/config';
// import test from './2333';
export default class AffairPage extends React.Component {
constructor(props) {
super(props);
// const idObj = service.getId();
const idObj = service.getId();
if (!idObj) {
message.error('没有配置数据id,无法使用该功能');
}
......@@ -145,7 +143,7 @@ export default class AffairPage extends React.Component {
this.ListComponent.getPage();
});
}
if(event.data.indexOf('iframeHeight') > -1){
if (event.data.indexOf('iframeHeight') > -1) {
let height = Number(event.data.split('-')[1]);
document.getElementById('applyIframeId').height = height;
}
......
......@@ -11,11 +11,10 @@ import ButtonDiy from '@/baseComponent/ButtonDiy';
import ModalDiy from '@/baseComponent/ModalDiy';
import React, { Component, Fragment } from 'react';
import { deepCopy, } from '@/baseComponent/utils';
import { mustHaveValue } from '../../config/index';
import { mustHaveValue, transLateTimeTOUnix } from '../../config/index';
import { message } from 'antd';
import PropTypes from 'prop-types';
import { startProcess } from '../publicApiService';
import { transLateTimeTOUnix } from '@/pages/App/FormInsertDiy/config';
import FormArray from '../component/FormArray';
export default class ModalForm extends Component {
......
import ButtonDiy from '@/baseComponent/ButtonDiy';
import React, { Component, Fragment } from 'react';
/*
import ExportInfo from '@/components/App/ExportInfo';
import ImportUtil from '@/components/App/ImportUtil';
import ModalDelete from './ModalDelete';
import ModalConfirm from './ModalConfirm';
*/
import ModalBatch from './ModalBatch';
import ModalForm from './ModalForm';
......@@ -24,31 +18,6 @@ export default class ButtonListDom extends Component {
getPage={getPage}
selectRows={selectRows}
/>;
/* case 'ModalDelete': // 删除按钮
return <ModalDelete {...item}
key={item.type}
getPage={getPage}
selectRows={selectRows}
/>;
case 'ImportUtil': // 导入
return <ImportUtil {...item.props}
key={item.type}
callback={() => getPage()}
/>;
case 'ExportInfo': // 导出
return <ExportInfo {...item.props}
key={item.type}
/>;
case 'ModalConfirm': // 一般按钮 点击后弹出是否确定的 Modal Info
return <ModalConfirm key={item.type}
{...item}
getPage={getPage}
listData={listData}
formValues={formValues}
search={search}
selectRows={selectRows}/>;
*/
case 'ModalBatch': // 一般按钮 点击后弹出 填写一些类似 审核理由 意见之类的信息
return <ModalBatch key={item.type}
{...item}
......
......@@ -43,10 +43,15 @@ const getOtherToken = () => {
};
const getId = () => { // 获取流程引擎 事务workId 和表dataBaseId
return {
dataBaseId: '1243131275393368064',
workId: '1243131275393368064',
};
let path = window.location.href;
path = path.split('/');
// let idObj = config[path.pop()];
let idObj;
console.log(path.pop());
/// let idObj = config[path.pop()];
debugger;
if (typeof idObj === 'undefined') {
console.error('没有找到对应的流程引擎id');
return false;
......
import React, { Fragment } from 'react';
import {
Button,
Card, Col,
Form, message, Row,
} from 'antd';
import { connect } from 'dva';
import PageHeaderWrapper from '@/components/PageHeaderWrapper';
import moment from 'moment';
import router from 'umi/router';
import { text, number, date, getFormArrayConfig } from '../config/index';
import FormArray from '../AffairPage/component/FormArray';
import ButtonDiy from '@/baseComponent/ButtonDiy';
import Shell from '../Shell';
@connect(({ formList, loading }) => ({
formList,
}))
@Form.create()
class Edit extends React.Component {
state = {
modalVisible: false,
formData: {},
formItem: [],
isAdd: false,
objId: this.props.id,
recordId: this.props.recordId,
recordKey: this.props.recordKey,
};
columns = [];
//渲染值
componentDidMount() {
const { dispatch } = this.props;
const { objId, recordKey, recordId } = this.state;
dispatch({
type: 'formList/getHead',
payload: { dataObjId: objId },
callback: (dates) => {
if (dates) {
this.setState({
formItem: dates,
});
}
},
});
//渲染表单字段
if (recordId != null) {
dispatch({
type: 'formList/getDetail',
payload: {
dataObjId: objId,
key: recordKey,
value: recordId,
},
callback: (res) => {
if (res) {
this.setState({
formData: res,
});
}
},
});
this.setState({
isAdd: false,
})
}else{
this.setState({
isAdd: true,
})
}
}
onSubmit = () => {
//router.goBack();
const { isAdd, objId, formData } = this.state;
let payload = {
params: {...formData},
objId,
isAdd,
};
this.props.dispatch({
type: 'formList/add',
payload,
callback: () => {
message.success('操作成功');
this.props.returnThis();
},
});
};
goBack = () => {
this.props.returnThis();
};
changeFormData = (value, key) => {
let oldValue = this.state.formData;
oldValue[key] = value;
this.setState({
formData: oldValue,
});
};
render() {
let { formItem, formData } = this.state;
let formConfig = getFormArrayConfig(formItem);
return (
<Shell>
<Row>
<FormArray
config={formConfig}
nameSpan={{ big: 10, small: 12 }}
fileSpan={{ big: 4, small: 3 }}
value={formData}
changeValue={this.changeFormData}
/>
<Col span={24}
style={{ textAlign: 'center', paddingTop: '200px', paddingBottom: '50px' }}>
<ButtonDiy
className={'primaryBlue'}
handleClick={this.onSubmit}
name={'保存'}
/>
<ButtonDiy
className={'defaultRed'}
handleClick={this.goBack}
name={'返回'}
/>
</Col>
</Row>
</Shell>
);
}
}
export default Edit;
// import React, { Fragment } from 'react';
// import {
// Button,
// Card, Col,
// Form, message, Row,
// } from 'antd';
// import { connect } from 'dva';
// import PageHeaderWrapper from '@/components/PageHeaderWrapper';
// import moment from 'moment';
// import router from 'umi/router';
// import { text, number, date, getFormArrayConfig } from '../config/index';
// import FormArray from '../AffairPage/component/FormArray';
// import ButtonDiy from '@/baseComponent/ButtonDiy';
// import Shell from '../Shell';
//
//
// @connect(({ formList, loading }) => ({
// formList,
// }))
// @Form.create()
// class Edit extends React.Component {
//
// state = {
// modalVisible: false,
// formData: {},
// formItem: [],
// isAdd: false,
// objId: this.props.id,
// recordId: this.props.recordId,
// recordKey: this.props.recordKey,
// };
// columns = [];
//
// //渲染值
// componentDidMount() {
// const { dispatch } = this.props;
// const { objId, recordKey, recordId } = this.state;
// dispatch({
// type: 'formList/getHead',
// payload: { dataObjId: objId },
// callback: (dates) => {
// if (dates) {
// this.setState({
// formItem: dates,
// });
// }
// },
// });
// //渲染表单字段
// if (recordId != null) {
// dispatch({
// type: 'formList/getDetail',
// payload: {
// dataObjId: objId,
// key: recordKey,
// value: recordId,
// },
// callback: (res) => {
// if (res) {
// this.setState({
// formData: res,
// });
// }
// },
// });
// this.setState({
// isAdd: false,
// })
// }else{
// this.setState({
// isAdd: true,
// })
// }
// }
//
// onSubmit = () => {
// //router.goBack();
// const { isAdd, objId, formData } = this.state;
// let payload = {
// params: {...formData},
// objId,
// isAdd,
// };
// this.props.dispatch({
// type: 'formList/add',
// payload,
// callback: () => {
// message.success('操作成功');
// this.props.returnThis();
// },
// });
// };
//
// goBack = () => {
// this.props.returnThis();
// };
//
// changeFormData = (value, key) => {
// let oldValue = this.state.formData;
// oldValue[key] = value;
// this.setState({
// formData: oldValue,
// });
// };
//
// render() {
// let { formItem, formData } = this.state;
// let formConfig = getFormArrayConfig(formItem);
// return (
// <Shell>
// <Row>
// <FormArray
// config={formConfig}
// nameSpan={{ big: 10, small: 12 }}
// fileSpan={{ big: 4, small: 3 }}
// value={formData}
// changeValue={this.changeFormData}
// />
// <Col span={24}
// style={{ textAlign: 'center', paddingTop: '200px', paddingBottom: '50px' }}>
//
// <ButtonDiy
// className={'primaryBlue'}
// handleClick={this.onSubmit}
// name={'保存'}
// />
// <ButtonDiy
// className={'defaultRed'}
// handleClick={this.goBack}
// name={'返回'}
// />
// </Col>
// </Row>
// </Shell>
// );
// }
// }
//
// export default Edit;
import fetch from 'dva/fetch';
import React from 'react';
import ReactDOM from 'react-dom';
import { Select, Button, Modal, Input, Transfer, Row, Col, Form, message, notification } from 'antd';
import { connect } from 'dva';
import { getToken } from '@/utils/authority';
import config from '@/config/config';
import QueryItem from './QueryItem';
import OrderItem from './OrderItem';
import FormdataWrapper from '@/utils/object-to-formdata-custom';
const Option = Select.Option;
let keyX = 1;
function swapArray(arr, index1, index2) {
arr[index1] = arr.splice(index2, 1, arr[index1])[0];
return arr;
}
const FormItem = Form.Item;
@connect(({ DataObj, loading }) => ({
DataObj,
loading: loading.models.DataObj,
}))
@Form.create()
export default class Index extends React.Component {
constructor(props) {
super(props);
this.state = {
visiable: false,
queryVisiable: false,
groupVisiable: false,
sortVisiable: false,
currentQueryKey: null,
currentGroupKey: null,
orderVisiable: false,
currentOrderKey: null,
querys: [],
orders: [],
groups: [],
gs: [],
os: [],
qs: [],
mockData: [],
targetKeys: [],
sourceSelectedKeys: [],
targetSelectedKeys: [],
infos: {},
confirmLoading: false,
};
}
onSelectChange = (sourceSelectedKeys, targetSelectedKeys) => {
this.setState({ sourceSelectedKeys, targetSelectedKeys });
};
deleteQuery = (i) => {
const querys = this.state.querys;
querys.splice(i, 1);
this.setState({ querys });
};
deleteOrder = (i) => {
const orders = this.state.orders;
orders.splice(i, 1);
this.setState({ orders });
};
deleteGroup = (i) => {
const groups = this.state.groups;
groups.splice(i, 1);
this.setState({ groups });
};
open = () => {
const { dispatch } = this.props;
dispatch({
type: 'DataObj/getExportInfo',
payload: {
objId: this.props.objId,
},
callback: (infos) => {
const mockData = [];
const qs = [];
const gs = [];
const os = [];
for (var key in infos) {
const x = infos[key];
mockData.push({
key: x.field,
title: x.name,
chosen: false,
});
if (x.canQuery) {
qs.push(x);
}
if (x.canGroup) {
gs.push(x);
}
if (x.canOrder) {
os.push(x);
}
}
this.setState({
mockData, infos, visiable: true, qs, gs, os,
});
},
});
};
onCancle = () => {
this.setState({ visiable: false });
};
handleChange = (targetKeys, direction, moveKeys) => {
this.setState({ targetKeys });
};
up = () => {
keyX = keyX + 1;
var { targetKeys, targetSelectedKeys } = this.state;
for (var i = 0; i < targetKeys.length; i++) {
if (targetKeys[i] === targetSelectedKeys[0]) {
if (i === 0) return;
targetKeys = swapArray(targetKeys, i, i - 1);
break;
}
}
this.setState({ targetKeys });
};
down = () => {
keyX = keyX + 1;
var { targetKeys, targetSelectedKeys } = this.state;
for (var i = 0; i < targetKeys.length; i++) {
if (targetKeys[i] === targetSelectedKeys[0]) {
if (i === targetKeys.length - 1) return;
targetKeys = swapArray(targetKeys, i, i + 1);
break;
}
}
this.setState({ targetKeys });
};
bottom = () => {
keyX = keyX + 1;
const { targetKeys, targetSelectedKeys } = this.state;
var x = [];
for (var i = 0; i < targetKeys.length; i++) {
if (!targetSelectedKeys.includes(targetKeys[i])) {
x.push(targetKeys[i]);
}
}
x = [...x, ...targetSelectedKeys];
this.setState({ targetKeys: x });
};
top = () => {
keyX = keyX + 1;
const { targetKeys, targetSelectedKeys } = this.state;
const x = [...targetSelectedKeys];
for (var i = 0; i < targetKeys.length; i++) {
if (!targetSelectedKeys.includes(targetKeys[i])) {
x.push(targetKeys[i]);
}
}
this.setState({ targetKeys: x });
};
renderItem = (item) => {
if (this.state.targetKeys.includes(item.key)) {
const customLabel = (
<span className="custom-item" key={item.key}>
{item.title}
</span>
);
return {
label: customLabel, // for displayed item
value: item.title, // for title and filter matching
};
} else {
const customLabel = (
<span className="custom-item" key={item.key}>
{item.title}
</span>
);
return {
label: customLabel, // for displayed item
value: item.title, // for title and filter matching
};
}
};
addOrder = () => {
this.setState({ orderVisiable: true });
};
okOrder = () => {
const orders = this.state.orders;
orders.push(this.state.infos[this.state.currentOrderKey]);
this.setState({ orders, orderVisiable: false, currentOrderKey: null });
};
okGroup = () => {
const groups = this.state.groups;
groups.push(this.state.infos[this.state.currentGroupKey]);
this.setState({ groups, groupVisiable: false, currentGroupKey: null });
};
addGroup = () => {
this.setState({ groupVisiable: true });
};
addQuery = () => {
this.setState({ queryVisiable: true });
};
okQuery = () => {
const querys = this.state.querys;
querys.push(this.state.infos[this.state.currentQueryKey]);
this.setState({ querys, queryVisiable: false, currentQueryKey: null });
};
export = () => {
this.props.form.validateFields((err, fieldsValue) => {
if (err) return;
//form.resetFields();
var qqs;
if (this.props.mustQuerys != null) {
qqs = [...this.props.mustQuerys];
} else {
qqs = [];
}
const oos = [];
const ggs = [];
for (let key in fieldsValue) {
var x = key.indexOf('__');
let kk = key.substr(x + 2);
if (key.indexOf('q__') > -1) {
qqs.push({
notes: this.state.infos[kk].notes,
hql: this.state.infos[kk].hql,
c: this.state.infos[kk].type,
x: fieldsValue[key].stringX,
v: fieldsValue[key].string,
});
} else if (key.indexOf('o__') > -1) {
oos.push({ hql: this.state.infos[kk].hql, x: fieldsValue[key].stringX });
} else if (key.indexOf('g__') > -1) {
ggs.push({ hql: this.state.infos[kk].hql });
}
}
if (this.props.voClass && ggs.length === 0) {
message.error('请至少选择一个聚合条件');
return;
}
if (this.state.targetKeys.length === 0) {
message.error('请至少选择一个导出字段');
return;
}
const names = [];
for (let i = 0; i < this.state.targetKeys.length; i++) {
names.push(this.state.infos[this.state.targetKeys[i]].name);
}
let divElement = document.getElementById('downloadDiv');
console.log(config.sqlFormsServer);
let downloadUrl = config.sqlFormsServer + '/DataObjApi/exportFormData?';
const token = getToken() != null && getToken() != 'null' ? getToken() : '0000';
downloadUrl = `${downloadUrl}token=${token}`;
let param = {
fields: this.state.targetKeys,
names: names,
beanName: this.props.beanName,
querys: JSON.stringify(qqs),
orders: JSON.stringify(oos),
groups: JSON.stringify(ggs),
voClass: this.props.voClass,
objId:this.props.objId,
modelClass: this.props.modelClass,
preHandleClass: this.props.preHandleClass,
hqlHandleClass: this.props.hqlHandleClass,
};
param = {...param, ...this.props.params || {}}
this.downloadFile(downloadUrl, param);
});
};
downloadFile(url, params) {
this.setState({ confirmLoading: true });
fetch(url, {
method: 'POST',
body: FormdataWrapper(params),
}).then(res => {
if (res.status != '200') {
return res.json();
} else {
return res.blob();
}
}).then(data => {
if (data instanceof Blob) {
let a = document.createElement('a');
let url = window.URL.createObjectURL(data);
let filename = (this.props.fileName ? this.props.fileName : '导出文件') + '.xlsx';
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
a = null;
} else {
notification.error({
message: `文件导出错误`,
description: data.errMsg,
});
}
}).catch(err => {
notification.error({
message: `网络请求超时`,
});
}).finally(() => {
this.setState({ confirmLoading: false });
});
}
cancelGroup = () => {
this.setState({ currentGroupKey: null, groupVisiable: false });
};
cancelQuery = () => {
this.setState({ currentQueryKey: null, queryVisiable: false });
};
cancelOrder = () => {
this.setState({ currentOrderKey: null, orderVisiable: false });
};
selectOrder = (e) => {
this.setState({ currentOrderKey: e });
};
selectQuery = (e) => {
this.setState({ currentQueryKey: e });
};
selectGroup = (e) => {
this.setState({ currentGroupKey: e });
};
render() {
const { form } = this.props;
const {
visiable, targetKeys, sourceSelectedKeys, queryVisiable, querys, orders, groups, confirmLoading,
targetSelectedKeys, mockData, qs, os, gs, currentQueryKey, currentOrderKey, orderVisiable, currentGroupKey, groupVisiable,
} = this.state;
return (
<span>
<Button shape='round' onClick={this.open}>自定义导出</Button>
<div id='downloadDiv' style={{ display: 'none' }}></div>
<Modal
width={670}
maskClosable={false}
destroyOnClose
title="自定义查询、排序、导出"
style={{ textAlign: 'center' }}
visible={visiable}
onOk={this.export}
onCancel={this.onCancle}
confirmLoading={confirmLoading}
>
<div style={{ overflowY: 'auto', maxHeight: '500px', height: '500px' }}>
<div style={{ textAlign: 'left' }}>
<Button type="primary">新增查询条件</Button>
<Select style={{ width: 200, paddingRight: '10px' }}
value={currentQueryKey}
onChange={this.selectQuery}>
{qs.map((r) => {
return <Option key={r.field}
value={r.field}>
{r.name}
</Option>;
},
)}
</Select>
{currentQueryKey ?
<span style={{ paddingLeft: '0' }}>
<Button type="primary" onClick={this.okQuery}>确定</Button>
</span>
: ''}
<div style={{ height: '12px' }}>
</div>
{querys.map((r, i) =>
<FormItem key={r.name + i}
labelCol={{ span: 4 }}
wrapperCol={{ span: 20 }}
colon={false}
label={r.name}>
{form.getFieldDecorator(i + 'q__' + r.field, {
initialValue: { stringX: '=' },
rules: [{
validator: (rule, value, callback) => {
var errors = [];
if (value == null) {
errors.push(new Error('请输入查询值!', rule.field));
} else {
if (value.stringX != 'IS NOT NULL' && value.stringX != 'IS NULL' && value.string == null) {
errors.push(new Error('请输入查询值!', rule.field));
}
}
callback(errors);
},
}],
})(
<QueryItem obj={r}
key={r.name + i}
deleteQuery={this.deleteQuery.bind(this, i)}/>)}
</FormItem>)
}
</div>
<div style={{ textAlign: 'left', paddingTop: '15px' }}>
<Button type="primary">新增排序条件</Button>
<Select style={{ width: 200, paddingRight: '10px' }}
value={currentOrderKey}
onChange={this.selectOrder}>
{os.map((r) => {
for (let j = 0; j < orders.length; j++) {
if (orders[j].field === r.field) return;
}
return <Option key={r.field} value={r.field}>{r.name}</Option>;
},
)}
</Select>
{currentOrderKey ?
<span style={{ paddingLeft: '0' }}>
<Button type="primary" onClick={this.okOrder}>确定</Button>
</span>
: ''}
<div style={{ height: '12px' }}>
</div>
{orders.map((r, i) =>
<FormItem key={r.name + i}
labelCol={{ span: 4 }}
wrapperCol={{ span: 20 }}
colon={false}
label={'按' + r.name}>
{form.getFieldDecorator(i + 'o__' + r.field, {
initialValue: { stringX: 'desc' },
})(
<OrderItem deleteOrder={this.deleteOrder.bind(this, i)}/>)}
</FormItem>)}
</div>
{this.props.voClass ?
<div style={{ textAlign: 'left', paddingTop: '15px' }}>
<span style={{ paddingRight: '10px' }}>聚合条件:</span>
{!groupVisiable ?
<Button type="primary" onClick={this.addGroup}>新增</Button>
:
<span>
<Select style={{ width: 100 }}
value={currentGroupKey}
onChange={this.selectGroup}>
{gs.map((r) => {
for (var j = 0; j < groups.length; j++) {
if (groups[j].field == r.field) return;
}
return <Option key={r.field}
value={r.field}>
{r.name}
</Option>;
},
)}
</Select>
{currentGroupKey ?
<Button type="primary" onClick={this.okGroup}>确定</Button>
: ''}
<Button type="primary" onClick={this.cancelGroup}>取消</Button>
</span>}
{groups.map((r, i) =>
<FormItem key={i + r.name}
labelCol={{ span: 5 }}
wrapperCol={{ span: 15 }}
label={'按' + r.name + '聚合'}>
{form.getFieldDecorator(i + 'g__' + r.field)(
<Input style={{ display: 'none' }}
value=""/>)}
<Button type="danger" onClick={this.deleteGroup.bind(this, i)}>删除</Button>
</FormItem>)}
</div> : ''}
<Row>
<Col span={24}
style={{ textAlign: 'left', paddingTop: '15px' }}>
<span style={{ paddingRight: '10px' }}>导出项:</span>
{/*<Select>*/}
{/*{*/}
{/*}*/}
{/*</Select>*/}
</Col>
<Col span={18}>
<Transfer key={keyX}
style={{ textAlign: 'left' }}
dataSource={mockData}
listStyle={{
width: 200,
height: 300,
}}
onSelectChange={this.onSelectChange}
selectedKeys={[...sourceSelectedKeys, ...targetSelectedKeys]}
rowKey={record => record.key}
targetKeys={targetKeys}
onChange={this.handleChange}
render={this.renderItem}
/>
</Col>
<Col span={2}>
<div style={{ marginTop: 100 }}>
<Button size="small"
disabled={targetSelectedKeys.length === 0}
onClick={this.top}>
批量置顶
</Button>
<Button size="small"
style={{ marginTop: 10 }}
disabled={targetSelectedKeys.length !== 1}
onClick={this.up}>
单项上移
</Button>
<Button size="small"
style={{ marginTop: 10 }}
disabled={targetSelectedKeys.length !== 1}
onClick={this.down}>
单项下移
</Button>
<Button size="small"
style={{ marginTop: 10 }}
disabled={targetSelectedKeys.length === 0}
onClick={this.bottom}>
批量置底
</Button>
</div>
</Col>
</Row>
</div>
</Modal>
</span>
);
}
}
// import fetch from 'dva/fetch';
// import React from 'react';
// import ReactDOM from 'react-dom';
// import { Select, Button, Modal, Input, Transfer, Row, Col, Form, message, notification } from 'antd';
// import { connect } from 'dva';
// import { getToken } from '@/utils/authority';
// import config from '@/config/config';
// import QueryItem from './QueryItem';
// import OrderItem from './OrderItem';
//
// import FormdataWrapper from '@/utils/object-to-formdata-custom';
//
// const Option = Select.Option;
// let keyX = 1;
// function swapArray(arr, index1, index2) {
// arr[index1] = arr.splice(index2, 1, arr[index1])[0];
// return arr;
// }
// const FormItem = Form.Item;
//
// @connect(({ DataObj, loading }) => ({
// DataObj,
// loading: loading.models.DataObj,
// }))
// @Form.create()
// export default class Index extends React.Component {
// constructor(props) {
// super(props);
// this.state = {
// visiable: false,
//
// queryVisiable: false,
// groupVisiable: false,
// sortVisiable: false,
// currentQueryKey: null,
// currentGroupKey: null,
// orderVisiable: false,
// currentOrderKey: null,
// querys: [],
// orders: [],
// groups: [],
// gs: [],
// os: [],
// qs: [],
// mockData: [],
// targetKeys: [],
// sourceSelectedKeys: [],
// targetSelectedKeys: [],
// infos: {},
// confirmLoading: false,
// };
// }
//
// onSelectChange = (sourceSelectedKeys, targetSelectedKeys) => {
// this.setState({ sourceSelectedKeys, targetSelectedKeys });
// };
// deleteQuery = (i) => {
// const querys = this.state.querys;
// querys.splice(i, 1);
// this.setState({ querys });
// };
// deleteOrder = (i) => {
// const orders = this.state.orders;
// orders.splice(i, 1);
// this.setState({ orders });
// };
// deleteGroup = (i) => {
// const groups = this.state.groups;
// groups.splice(i, 1);
// this.setState({ groups });
// };
// open = () => {
// const { dispatch } = this.props;
// dispatch({
// type: 'DataObj/getExportInfo',
// payload: {
// objId: this.props.objId,
// },
// callback: (infos) => {
//
// const mockData = [];
// const qs = [];
// const gs = [];
// const os = [];
// for (var key in infos) {
// const x = infos[key];
// mockData.push({
// key: x.field,
// title: x.name,
// chosen: false,
// });
// if (x.canQuery) {
// qs.push(x);
// }
// if (x.canGroup) {
// gs.push(x);
// }
// if (x.canOrder) {
// os.push(x);
// }
// }
//
// this.setState({
// mockData, infos, visiable: true, qs, gs, os,
// });
//
// },
// });
// };
// onCancle = () => {
// this.setState({ visiable: false });
// };
// handleChange = (targetKeys, direction, moveKeys) => {
//
// this.setState({ targetKeys });
// };
//
// up = () => {
// keyX = keyX + 1;
// var { targetKeys, targetSelectedKeys } = this.state;
// for (var i = 0; i < targetKeys.length; i++) {
// if (targetKeys[i] === targetSelectedKeys[0]) {
// if (i === 0) return;
// targetKeys = swapArray(targetKeys, i, i - 1);
//
// break;
// }
// }
//
// this.setState({ targetKeys });
// };
// down = () => {
// keyX = keyX + 1;
// var { targetKeys, targetSelectedKeys } = this.state;
// for (var i = 0; i < targetKeys.length; i++) {
// if (targetKeys[i] === targetSelectedKeys[0]) {
// if (i === targetKeys.length - 1) return;
// targetKeys = swapArray(targetKeys, i, i + 1);
//
// break;
// }
// }
//
// this.setState({ targetKeys });
// };
// bottom = () => {
// keyX = keyX + 1;
// const { targetKeys, targetSelectedKeys } = this.state;
// var x = [];
// for (var i = 0; i < targetKeys.length; i++) {
// if (!targetSelectedKeys.includes(targetKeys[i])) {
// x.push(targetKeys[i]);
// }
// }
// x = [...x, ...targetSelectedKeys];
// this.setState({ targetKeys: x });
// };
// top = () => {
// keyX = keyX + 1;
// const { targetKeys, targetSelectedKeys } = this.state;
// const x = [...targetSelectedKeys];
// for (var i = 0; i < targetKeys.length; i++) {
// if (!targetSelectedKeys.includes(targetKeys[i])) {
// x.push(targetKeys[i]);
// }
// }
//
//
// this.setState({ targetKeys: x });
// };
// renderItem = (item) => {
// if (this.state.targetKeys.includes(item.key)) {
// const customLabel = (
// <span className="custom-item" key={item.key}>
// {item.title}
//
// </span>
// );
// return {
// label: customLabel, // for displayed item
// value: item.title, // for title and filter matching
// };
//
// } else {
// const customLabel = (
// <span className="custom-item" key={item.key}>
// {item.title}
// </span>
// );
// return {
// label: customLabel, // for displayed item
// value: item.title, // for title and filter matching
// };
// }
// };
// addOrder = () => {
//
// this.setState({ orderVisiable: true });
//
// };
// okOrder = () => {
// const orders = this.state.orders;
// orders.push(this.state.infos[this.state.currentOrderKey]);
// this.setState({ orders, orderVisiable: false, currentOrderKey: null });
//
// };
// okGroup = () => {
// const groups = this.state.groups;
// groups.push(this.state.infos[this.state.currentGroupKey]);
// this.setState({ groups, groupVisiable: false, currentGroupKey: null });
// };
// addGroup = () => {
// this.setState({ groupVisiable: true });
// };
//
// addQuery = () => {
// this.setState({ queryVisiable: true });
// };
// okQuery = () => {
// const querys = this.state.querys;
// querys.push(this.state.infos[this.state.currentQueryKey]);
// this.setState({ querys, queryVisiable: false, currentQueryKey: null });
//
// };
// export = () => {
// this.props.form.validateFields((err, fieldsValue) => {
// if (err) return;
// //form.resetFields();
// var qqs;
// if (this.props.mustQuerys != null) {
// qqs = [...this.props.mustQuerys];
// } else {
// qqs = [];
// }
//
// const oos = [];
// const ggs = [];
// for (let key in fieldsValue) {
// var x = key.indexOf('__');
// let kk = key.substr(x + 2);
// if (key.indexOf('q__') > -1) {
// qqs.push({
// notes: this.state.infos[kk].notes,
// hql: this.state.infos[kk].hql,
// c: this.state.infos[kk].type,
// x: fieldsValue[key].stringX,
// v: fieldsValue[key].string,
// });
//
// } else if (key.indexOf('o__') > -1) {
// oos.push({ hql: this.state.infos[kk].hql, x: fieldsValue[key].stringX });
// } else if (key.indexOf('g__') > -1) {
// ggs.push({ hql: this.state.infos[kk].hql });
// }
// }
//
// if (this.props.voClass && ggs.length === 0) {
// message.error('请至少选择一个聚合条件');
// return;
// }
// if (this.state.targetKeys.length === 0) {
// message.error('请至少选择一个导出字段');
// return;
// }
// const names = [];
// for (let i = 0; i < this.state.targetKeys.length; i++) {
// names.push(this.state.infos[this.state.targetKeys[i]].name);
// }
// let divElement = document.getElementById('downloadDiv');
// console.log(config.sqlFormsServer);
// let downloadUrl = config.sqlFormsServer + '/DataObjApi/exportFormData?';
// const token = getToken() != null && getToken() != 'null' ? getToken() : '0000';
// downloadUrl = `${downloadUrl}token=${token}`;
// let param = {
// fields: this.state.targetKeys,
// names: names,
// beanName: this.props.beanName,
// querys: JSON.stringify(qqs),
// orders: JSON.stringify(oos),
// groups: JSON.stringify(ggs),
// voClass: this.props.voClass,
// objId:this.props.objId,
// modelClass: this.props.modelClass,
// preHandleClass: this.props.preHandleClass,
// hqlHandleClass: this.props.hqlHandleClass,
//
// };
// param = {...param, ...this.props.params || {}}
// this.downloadFile(downloadUrl, param);
// });
//
// };
//
// downloadFile(url, params) {
// this.setState({ confirmLoading: true });
//
// fetch(url, {
// method: 'POST',
// body: FormdataWrapper(params),
// }).then(res => {
// if (res.status != '200') {
// return res.json();
// } else {
// return res.blob();
// }
// }).then(data => {
// if (data instanceof Blob) {
// let a = document.createElement('a');
// let url = window.URL.createObjectURL(data);
// let filename = (this.props.fileName ? this.props.fileName : '导出文件') + '.xlsx';
// a.href = url;
// a.download = filename;
// a.click();
// window.URL.revokeObjectURL(url);
// a = null;
// } else {
// notification.error({
// message: `文件导出错误`,
// description: data.errMsg,
// });
// }
//
// }).catch(err => {
// notification.error({
// message: `网络请求超时`,
// });
// }).finally(() => {
// this.setState({ confirmLoading: false });
// });
// }
//
// cancelGroup = () => {
// this.setState({ currentGroupKey: null, groupVisiable: false });
// };
// cancelQuery = () => {
// this.setState({ currentQueryKey: null, queryVisiable: false });
// };
// cancelOrder = () => {
// this.setState({ currentOrderKey: null, orderVisiable: false });
// };
// selectOrder = (e) => {
//
// this.setState({ currentOrderKey: e });
// };
// selectQuery = (e) => {
//
// this.setState({ currentQueryKey: e });
// };
// selectGroup = (e) => {
//
// this.setState({ currentGroupKey: e });
// };
//
// render() {
// const { form } = this.props;
// const {
// visiable, targetKeys, sourceSelectedKeys, queryVisiable, querys, orders, groups, confirmLoading,
// targetSelectedKeys, mockData, qs, os, gs, currentQueryKey, currentOrderKey, orderVisiable, currentGroupKey, groupVisiable,
// } = this.state;
// return (
// <span>
// <Button shape='round' onClick={this.open}>自定义导出</Button>
// <div id='downloadDiv' style={{ display: 'none' }}></div>
// <Modal
// width={670}
// maskClosable={false}
// destroyOnClose
// title="自定义查询、排序、导出"
// style={{ textAlign: 'center' }}
// visible={visiable}
//
// onOk={this.export}
// onCancel={this.onCancle}
// confirmLoading={confirmLoading}
// >
// <div style={{ overflowY: 'auto', maxHeight: '500px', height: '500px' }}>
// <div style={{ textAlign: 'left' }}>
// <Button type="primary">新增查询条件</Button>
//
//
// <Select style={{ width: 200, paddingRight: '10px' }}
// value={currentQueryKey}
// onChange={this.selectQuery}>
// {qs.map((r) => {
// return <Option key={r.field}
// value={r.field}>
// {r.name}
// </Option>;
// },
// )}
//
// </Select>
// {currentQueryKey ?
// <span style={{ paddingLeft: '0' }}>
// <Button type="primary" onClick={this.okQuery}>确定</Button>
// </span>
// : ''}
// <div style={{ height: '12px' }}>
//
// </div>
// {querys.map((r, i) =>
// <FormItem key={r.name + i}
// labelCol={{ span: 4 }}
// wrapperCol={{ span: 20 }}
// colon={false}
// label={r.name}>
// {form.getFieldDecorator(i + 'q__' + r.field, {
// initialValue: { stringX: '=' },
// rules: [{
// validator: (rule, value, callback) => {
// var errors = [];
// if (value == null) {
// errors.push(new Error('请输入查询值!', rule.field));
//
// } else {
// if (value.stringX != 'IS NOT NULL' && value.stringX != 'IS NULL' && value.string == null) {
// errors.push(new Error('请输入查询值!', rule.field));
// }
// }
// callback(errors);
//
// },
// }],
// })(
// <QueryItem obj={r}
// key={r.name + i}
// deleteQuery={this.deleteQuery.bind(this, i)}/>)}
// </FormItem>)
// }
// </div>
// <div style={{ textAlign: 'left', paddingTop: '15px' }}>
// <Button type="primary">新增排序条件</Button>
// <Select style={{ width: 200, paddingRight: '10px' }}
// value={currentOrderKey}
// onChange={this.selectOrder}>
// {os.map((r) => {
// for (let j = 0; j < orders.length; j++) {
// if (orders[j].field === r.field) return;
//
// }
// return <Option key={r.field} value={r.field}>{r.name}</Option>;
// },
// )}
//
// </Select>
// {currentOrderKey ?
// <span style={{ paddingLeft: '0' }}>
// <Button type="primary" onClick={this.okOrder}>确定</Button>
//
// </span>
// : ''}
// <div style={{ height: '12px' }}>
//
// </div>
// {orders.map((r, i) =>
// <FormItem key={r.name + i}
// labelCol={{ span: 4 }}
// wrapperCol={{ span: 20 }}
// colon={false}
// label={'按' + r.name}>
// {form.getFieldDecorator(i + 'o__' + r.field, {
// initialValue: { stringX: 'desc' },
// })(
// <OrderItem deleteOrder={this.deleteOrder.bind(this, i)}/>)}
// </FormItem>)}
// </div>
// {this.props.voClass ?
// <div style={{ textAlign: 'left', paddingTop: '15px' }}>
// <span style={{ paddingRight: '10px' }}>聚合条件:</span>
// {!groupVisiable ?
// <Button type="primary" onClick={this.addGroup}>新增</Button>
//
// :
// <span>
// <Select style={{ width: 100 }}
// value={currentGroupKey}
// onChange={this.selectGroup}>
// {gs.map((r) => {
// for (var j = 0; j < groups.length; j++) {
// if (groups[j].field == r.field) return;
//
// }
// return <Option key={r.field}
// value={r.field}>
// {r.name}
// </Option>;
// },
// )}
// </Select>
// {currentGroupKey ?
// <Button type="primary" onClick={this.okGroup}>确定</Button>
//
//
// : ''}
// <Button type="primary" onClick={this.cancelGroup}>取消</Button>
//
// </span>}
// {groups.map((r, i) =>
// <FormItem key={i + r.name}
// labelCol={{ span: 5 }}
// wrapperCol={{ span: 15 }}
// label={'按' + r.name + '聚合'}>
// {form.getFieldDecorator(i + 'g__' + r.field)(
// <Input style={{ display: 'none' }}
// value=""/>)}
// <Button type="danger" onClick={this.deleteGroup.bind(this, i)}>删除</Button>
//
//
// </FormItem>)}
// </div> : ''}
// <Row>
// <Col span={24}
// style={{ textAlign: 'left', paddingTop: '15px' }}>
// <span style={{ paddingRight: '10px' }}>导出项:</span>
// {/*<Select>*/}
// {/*{*/}
//
// {/*}*/}
// {/*</Select>*/}
// </Col>
// <Col span={18}>
// <Transfer key={keyX}
// style={{ textAlign: 'left' }}
// dataSource={mockData}
// listStyle={{
// width: 200,
// height: 300,
// }}
// onSelectChange={this.onSelectChange}
// selectedKeys={[...sourceSelectedKeys, ...targetSelectedKeys]}
// rowKey={record => record.key}
// targetKeys={targetKeys}
// onChange={this.handleChange}
// render={this.renderItem}
// />
// </Col>
// <Col span={2}>
// <div style={{ marginTop: 100 }}>
// <Button size="small"
// disabled={targetSelectedKeys.length === 0}
// onClick={this.top}>
// 批量置顶
// </Button>
// <Button size="small"
// style={{ marginTop: 10 }}
// disabled={targetSelectedKeys.length !== 1}
// onClick={this.up}>
// 单项上移
// </Button>
// <Button size="small"
// style={{ marginTop: 10 }}
// disabled={targetSelectedKeys.length !== 1}
// onClick={this.down}>
// 单项下移
// </Button>
// <Button size="small"
// style={{ marginTop: 10 }}
// disabled={targetSelectedKeys.length === 0}
// onClick={this.bottom}>
// 批量置底
// </Button>
// </div>
// </Col>
//
// </Row>
// </div>
// </Modal>
// </span>
// );
// }
// }
import React, { Fragment } from 'react';
import {
Button,
Modal,
Steps,
Upload,
Icon,
message,
Tabs,
Table,
} from 'antd';
import styles from './ImportUtil.less';
import ButtonDiy from '@/baseComponent/ButtonDiy';
import { exportExcel } from 'xlsx-oc'
import config from '@/config/config';
import { connect } from 'dva';
const Step = Steps.Step;
const TabPane = Tabs.TabPane;
@connect(({ DataObj, loading }) => ({
DataObj,
loading: loading.models.DataObj,
}))
export default class ImportUtil extends React.PureComponent {
constructor(props) {
super(props);
const exportTemplateUrl= encodeURI(`${config.sqlFormsServer}/DataObjApi/importTemplateDownload?objId=${this.props.objId}&name=${props.fileName}`);
this.state = {
ch:false,
currentKey:"1",
visible: false,
current: 0,
isShow: true,
filekey: '',
sucData: [],
errData: [],
column: [],
exportTemplateUrl,
isNextDisabled:false,
};
}
showModal = () => {
this.setState({
visible: true,
});
};
handleOk = (e) => {
this.setState({
visible: false,
});
};
handleCancel = (e) => {
this.setState({
visible: false,
});
};
next() {
const current = this.state.current + 1;
if (current === 2) {
this.setState({
current: current,
isShow: false,
});
if (this.state.errData.lenth > 0) {
message.error('请检查数据');
return;
} else {
this.import();
}
}
if (current === 3) {
this.setState({
current: current,
isShow: true,
});
if (this.props.callback) {
this.props.callback();
}
}
}
prev() {
const current = this.state.current - 1;
this.setState({ current });
}
import() {
const { dispatch ,importParams } = this.props;
dispatch({
type: 'DataObj/importExecute',
payload: {
...(importParams||{}),
cacheKey:this.state.filekey,
objId: this.props.objId,
},
callback: (res) => {
this.next();
message.success('导入成功');
this.setState({
current: 3,
isShow: true,
visible: false,
});
if(this.props.callback){
this.props.callback();
}
}
})
}
getCachKey = (filePath) => {
const { dispatch ,importParams } = this.props;
dispatch({
type: 'DataObj/importAnalyse',
payload: {
...(importParams||{}),
isLocal:false,
filePath,
objId: this.props.objId,
},
callback: (res) => {
this.setState({
filekey: res.cacheKey,
});
this.queryFile(res.cacheKey);
}
})
};
queryFile = (cacheKey) => {
const { dispatch ,importParams } = this.props;
dispatch({
type: 'DataObj/importDataQuery',
payload: {
...(importParams||{}),
cacheKey,
objId: this.props.objId,
},
callback: (res) => {
this.setState({
current: 1,
isShow: false,
sucData: res.pass,
errData: res.noPass,
column: res.column
});
if(res.noPass&&res.noPass.length==0){
if (res.pass.length==0) {
message.error('当前没有验证成功的数据,无法导入。');
this.setState({
currentKey:"1",
ch:!this.state.ch,
isNextDisabled: true
});
} else {
message.success('所有数据验证通过,请确认后点击下一步。');
this.setState({
currentKey:"2",
ch:!this.state.ch,
isNextDisabled: false
});
}
}else{
message.error('当前存在未验证通过的数据,请按错误提示检测更正导入文件');
this.setState({
currentKey:"1",
ch:!this.state.ch,
isNextDisabled: true
});
}
}
})
};
changePane=(activeKey)=>{
this.setState({currentKey:activeKey})
}
exportError=(column,dataSource)=>{
var _headers = []
for(var i=0;i<column.length;i++){
_headers.push({k:column[i].dataIndex,v:column[i].title})
}
for(var j=0;j<dataSource.length;j++){
dataSource[j].index=j+1
}
exportExcel(_headers, dataSource);
}
render() {
const props = {
name: 'file',
action: config.uploadUrl,
headers: {
authorization: 'authorization-text',
},
accept:'.xlsx',
showUploadList: false,
onChange: (info) => {
if (info.file.status !== 'uploading') {
}
if (info.file.status === 'done') {
message.success(`${info.file.name} 上传成功`);
let x = info.file.response;
this.getCachKey(x);
} else if (info.file.status === 'error') {
message.error(`${info.file.name} file upload failed.`);
}
},
};
const steps = [{
title: '上传Excel',
}, {
title: '验证数据',
}, {
title: '数据导入',
},
{
title: '导入完成',
}];
const { current } = this.state;
const {name, loading} = this.props
const column1=this.state.column?[{title:"序号",dataIndex:"index",fixed:"left",width:50, render:(v,r,i)=>i+1},...this.state.column]:[]
var column2=this.state.column?[...this.state.column]:[]
if(column1.length>1) column1[1].render=(val)=><span style={{color:"red"}}>{val}</span>
column2.splice(0,1)
column2=[{title:"序号",fixed:"left",width:50, render:(v,r,i)=>i+1},...column2]
return (
<span>
<ButtonDiy name={name||'批量导入'}
type='default'
className='defaultBlue'
handleClick={this.showModal}/>
<Modal
visible={this.state.visible}
onOk={this.handleOk}
maskClosable={false}
destroyOnClose
onCancel={this.handleCancel}
title={null}
footer={null}
width={"80%"}
>
<div className={styles.nomal}>
<p className={styles.import}>
EXCEL导入向导
</p>
<div style={{ margin: 'auto 23px' }}>
<Steps current={current}>
{steps.map(item =>
<Step key={item.title}
title={item.title}/>)}
</Steps>
<div className="steps-content">
{steps[this.state.current].content}
</div>
<div className={styles.button}>
{
(this.state.current < steps.length - 1 && this.state.current !== 0)
&&
<ButtonDiy name={this.state.current==3?"确认导入":"下一步"} type="primary" disabled={this.state.current!=3 && this.state.isNextDisabled} className='primaryBlue' handleClick={() => this.next()}/>
}
{
this.state.current > 0
&&
<ButtonDiy style={{ marginLeft: 8 }} name="上一步" className='defaultBlue' handleClick={() => this.prev()}/>
}
</div>
</div>
<div className={styles.tip}>
<p className={styles.tipContent}>
<span>欢迎使用EXCEL导入向导,首先请您上传需要导入的EXCEL文件。</span>
<span>点击“选择文件”选择您要导入的EXCEL文件,点击“开始上传”将其上传到服务器上,点击“清空队列”清空当前上传文件队列。</span>
</p>
</div>
{
this.state.isShow ?
<div className={styles.buttonDown}>
<Upload {...props}>
<Button>
<Icon type="upload"/>点击上传
</Button>
</Upload>
<Button href={this.state.exportTemplateUrl }
target="_blank"
type="danger">
下载模板
</Button>
</div> :
<Upload {...props}>
<Button>
<Icon type="upload"/>
重新上传
</Button>
</Upload>
}
{
this.state.isShow ? <div className={styles.attentionItem}>
<p>导入事项</p>
<p>1. 导入操作一次只能上传 1 EXCEL文件。</p>
<p>2. 导入文件最大文件大小上传 1 GB</p>
<p>3. 只能上传EXCEL文件(XLS, XLSX) 默认支持EXCEL 2003EXCEL 2007</p>
<p>4. 请将EXCEL文件的所有单元格格式设置为“文本”格式</p>
</div> :
<div className={styles.error} style={{marginTop:20}}>
<Tabs activeKey={this.state.currentKey} key={this.state.ch} onChange={this.changePane} type="card">
{this.state.errData&&this.state.errData.length==0?"":<TabPane tab={<span style={{color:"red"}}>验证错误列表</span>} key="1">
<Button style={{marginTop:5,marginBottom:5}} type="danger" onClick={this.exportError.bind(this,column1,this.state.errData)}>导出错误信息</Button>
<Table columns={column1} size="small"
style={{overflow: 'auto'}}
dataSource={this.state.errData}
bordered={true}/></TabPane>}
<TabPane tab={<span style={{color:"green"}}>验证成功列表</span>} key="2">
<Button style={{marginTop:5,marginBottom:5}} type="primary" onClick={this.exportError.bind(this,column2,this.state.sucData)}>导出正确信息</Button>
<Table columns={column2} size="small"
style={{overflow: 'auto'}}
dataSource={this.state.sucData}
bordered={true}/></TabPane>
</Tabs>
</div>
}
</div>
</Modal>
</span>
);
}
}
// import React, { Fragment } from 'react';
// import {
// Button,
// Modal,
// Steps,
// Upload,
// Icon,
// message,
// Tabs,
// Table,
// } from 'antd';
// import styles from './ImportUtil.less';
// import ButtonDiy from '@/baseComponent/ButtonDiy';
// import { exportExcel } from 'xlsx-oc'
// import config from '@/config/config';
// import { connect } from 'dva';
// const Step = Steps.Step;
//
//
// const TabPane = Tabs.TabPane;
//
//
// @connect(({ DataObj, loading }) => ({
// DataObj,
// loading: loading.models.DataObj,
// }))
// export default class ImportUtil extends React.PureComponent {
// constructor(props) {
// super(props);
//
// const exportTemplateUrl= encodeURI(`${config.sqlFormsServer}/DataObjApi/importTemplateDownload?objId=${this.props.objId}&name=${props.fileName}`);
//
// this.state = {
// ch:false,
// currentKey:"1",
// visible: false,
// current: 0,
// isShow: true,
// filekey: '',
// sucData: [],
// errData: [],
// column: [],
//
// exportTemplateUrl,
//
// isNextDisabled:false,
// };
// }
//
// showModal = () => {
//
// this.setState({
// visible: true,
// });
// };
// handleOk = (e) => {
// this.setState({
// visible: false,
// });
// };
// handleCancel = (e) => {
// this.setState({
// visible: false,
// });
// };
//
// next() {
// const current = this.state.current + 1;
// if (current === 2) {
// this.setState({
// current: current,
// isShow: false,
// });
// if (this.state.errData.lenth > 0) {
// message.error('请检查数据');
// return;
// } else {
// this.import();
// }
// }
// if (current === 3) {
// this.setState({
// current: current,
// isShow: true,
// });
// if (this.props.callback) {
// this.props.callback();
// }
// }
//
// }
//
// prev() {
// const current = this.state.current - 1;
// this.setState({ current });
// }
//
// import() {
// const { dispatch ,importParams } = this.props;
// dispatch({
// type: 'DataObj/importExecute',
// payload: {
// ...(importParams||{}),
// cacheKey:this.state.filekey,
//
// objId: this.props.objId,
// },
// callback: (res) => {
//
// this.next();
// message.success('导入成功');
//
// this.setState({
// current: 3,
// isShow: true,
// visible: false,
//
// });
// if(this.props.callback){
// this.props.callback();
// }
// }
// })
//
//
// }
//
// getCachKey = (filePath) => {
// const { dispatch ,importParams } = this.props;
// dispatch({
// type: 'DataObj/importAnalyse',
// payload: {
// ...(importParams||{}),
// isLocal:false,
// filePath,
// objId: this.props.objId,
// },
// callback: (res) => {
// this.setState({
// filekey: res.cacheKey,
//
// });
// this.queryFile(res.cacheKey);
//
// }
// })
//
//
// };
// queryFile = (cacheKey) => {
// const { dispatch ,importParams } = this.props;
// dispatch({
// type: 'DataObj/importDataQuery',
// payload: {
// ...(importParams||{}),
// cacheKey,
// objId: this.props.objId,
// },
// callback: (res) => {
// this.setState({
// current: 1,
// isShow: false,
//
// sucData: res.pass,
// errData: res.noPass,
// column: res.column
// });
// if(res.noPass&&res.noPass.length==0){
//
//
// if (res.pass.length==0) {
// message.error('当前没有验证成功的数据,无法导入。');
// this.setState({
// currentKey:"1",
// ch:!this.state.ch,
// isNextDisabled: true
// });
// } else {
// message.success('所有数据验证通过,请确认后点击下一步。');
// this.setState({
// currentKey:"2",
// ch:!this.state.ch,
// isNextDisabled: false
// });
// }
// }else{
// message.error('当前存在未验证通过的数据,请按错误提示检测更正导入文件');
// this.setState({
// currentKey:"1",
// ch:!this.state.ch,
// isNextDisabled: true
// });
// }
//
// }
// })
// };
// changePane=(activeKey)=>{
// this.setState({currentKey:activeKey})
// }
// exportError=(column,dataSource)=>{
//
//
// var _headers = []
// for(var i=0;i<column.length;i++){
// _headers.push({k:column[i].dataIndex,v:column[i].title})
// }
// for(var j=0;j<dataSource.length;j++){
// dataSource[j].index=j+1
// }
// exportExcel(_headers, dataSource);
//
//
// }
// render() {
//
// const props = {
// name: 'file',
// action: config.uploadUrl,
//
// headers: {
// authorization: 'authorization-text',
// },
// accept:'.xlsx',
// showUploadList: false,
// onChange: (info) => {
// if (info.file.status !== 'uploading') {
//
// }
// if (info.file.status === 'done') {
// message.success(`${info.file.name} 上传成功`);
// let x = info.file.response;
//
//
//
// this.getCachKey(x);
//
// } else if (info.file.status === 'error') {
// message.error(`${info.file.name} file upload failed.`);
// }
// },
// };
// const steps = [{
// title: '上传Excel',
// }, {
// title: '验证数据',
// }, {
// title: '数据导入',
// },
// {
// title: '导入完成',
// }];
//
// const { current } = this.state;
// const {name, loading} = this.props
// const column1=this.state.column?[{title:"序号",dataIndex:"index",fixed:"left",width:50, render:(v,r,i)=>i+1},...this.state.column]:[]
// var column2=this.state.column?[...this.state.column]:[]
// if(column1.length>1) column1[1].render=(val)=><span style={{color:"red"}}>{val}</span>
//
// column2.splice(0,1)
// column2=[{title:"序号",fixed:"left",width:50, render:(v,r,i)=>i+1},...column2]
//
// return (
// <span>
// <ButtonDiy name={name||'批量导入'}
// type='default'
// className='defaultBlue'
// handleClick={this.showModal}/>
// <Modal
// visible={this.state.visible}
// onOk={this.handleOk}
// maskClosable={false}
// destroyOnClose
// onCancel={this.handleCancel}
// title={null}
// footer={null}
// width={"80%"}
// >
//
// <div className={styles.nomal}>
// <p className={styles.import}>
// EXCEL导入向导
// </p>
// <div style={{ margin: 'auto 23px' }}>
// <Steps current={current}>
// {steps.map(item =>
// <Step key={item.title}
// title={item.title}/>)}
// </Steps>
// <div className="steps-content">
// {steps[this.state.current].content}
// </div>
// <div className={styles.button}>
// {
// (this.state.current < steps.length - 1 && this.state.current !== 0)
// &&
// <ButtonDiy name={this.state.current==3?"确认导入":"下一步"} type="primary" disabled={this.state.current!=3 && this.state.isNextDisabled} className='primaryBlue' handleClick={() => this.next()}/>
//
// }
//
// {
// this.state.current > 0
// &&
// <ButtonDiy style={{ marginLeft: 8 }} name="上一步" className='defaultBlue' handleClick={() => this.prev()}/>
//
// }
// </div>
// </div>
//
// <div className={styles.tip}>
// <p className={styles.tipContent}>
// <span>欢迎使用EXCEL导入向导,首先请您上传需要导入的EXCEL文件。</span>
// <span>点击“选择文件”选择您要导入的EXCEL文件,点击“开始上传”将其上传到服务器上,点击“清空队列”清空当前上传文件队列。</span>
// </p>
//
// </div>
// {
// this.state.isShow ?
// <div className={styles.buttonDown}>
// <Upload {...props}>
// <Button>
// <Icon type="upload"/>点击上传
// </Button>
// </Upload>
// <Button href={this.state.exportTemplateUrl }
// target="_blank"
// type="danger">
// 下载模板
// </Button>
// </div> :
// <Upload {...props}>
// <Button>
// <Icon type="upload"/>
// 重新上传
// </Button>
// </Upload>
// }
//
// {
// this.state.isShow ? <div className={styles.attentionItem}>
// <p>导入事项</p>
// <p>1. 导入操作一次只能上传 1 个EXCEL文件。</p>
// <p>2. 导入文件最大文件大小上传 1 GB。</p>
// <p>3. 只能上传EXCEL文件(XLS, XLSX) 默认支持EXCEL 2003和EXCEL 2007。</p>
// <p>4. 请将EXCEL文件的所有单元格格式设置为“文本”格式</p>
// </div> :
// <div className={styles.error} style={{marginTop:20}}>
//
// <Tabs activeKey={this.state.currentKey} key={this.state.ch} onChange={this.changePane} type="card">
// {this.state.errData&&this.state.errData.length==0?"":<TabPane tab={<span style={{color:"red"}}>验证错误列表</span>} key="1">
// <Button style={{marginTop:5,marginBottom:5}} type="danger" onClick={this.exportError.bind(this,column1,this.state.errData)}>导出错误信息</Button>
//
// <Table columns={column1} size="small"
// style={{overflow: 'auto'}}
// dataSource={this.state.errData}
// bordered={true}/></TabPane>}
// <TabPane tab={<span style={{color:"green"}}>验证成功列表</span>} key="2">
//
// <Button style={{marginTop:5,marginBottom:5}} type="primary" onClick={this.exportError.bind(this,column2,this.state.sucData)}>导出正确信息</Button>
//
// <Table columns={column2} size="small"
// style={{overflow: 'auto'}}
// dataSource={this.state.sucData}
// bordered={true}/></TabPane>
//
// </Tabs>
//
//
// </div>
// }
// </div>
//
// </Modal>
// </span>
// );
// }
// }
.nomal{
background: #fff;
padding: 10px;
}
.title{
display: flex;
margin-bottom: 20px;
}
.info{
text-align: center;
font-weight: bold;
font-size: 18px;
}
.detail{
text-align: center;
margin:30px auto;
}
.detail img{
margin: auto 10px;
}
.button{
display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */
display: -moz-box; /* 老版本语法: Firefox (buggy) */
display: -ms-flexbox; /* 混合版本语法: IE 10 */
display: -webkit-flex; /* 新版本语法: Chrome 21+ */
display: -moz-flex;
display: flex;
-moz-box-pack: center; /*Firefox*/
-webkit-box-pack: center; /*Safari,Opera,Chrome*/
box-pack: center;
-moz-justify-content: center;
-webkit-justify-content: center;
justify-content: center;
}
.operation{
display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */
display: -moz-box; /* 老版本语法: Firefox (buggy) */
display: -ms-flexbox; /* 混合版本语法: IE 10 */
display: -webkit-flex; /* 新版本语法: Chrome 21+ */
display: -moz-flex;
display: flex;
-moz-box-pack: center; /*Firefox*/
-webkit-box-pack: center; /*Safari,Opera,Chrome*/
box-pack: center;
-moz-justify-content: center;
-webkit-justify-content: center;
justify-content: center;
}
.button Button{
margin: auto 10px;
}
.titleInfo p span{
font-weight: bold;
}
.import{
color: #6ca3c9;
font-size: 16px;
}
.button{
// background: #eff3f8;
text-align: center;
padding:20px;
margin-top: 20px;
}
.tip{
margin:20px auto;
padding:10px;
border-top: 1px solid #ccc;
}
.tip span{
display: block;
margin:10px;
font-size: 16px;
}
.tip::after{
content: '';
position: absolute;
width: 5px;
height: 57px;
background: #e5eaf1;
margin-top: -141px;
margin-left: -13px;
}
.select button{
color: #fff;
padding:10px;
background: #abbac3;
border: none;
margin: 10px;
}
.attentionItem{
background: #f4f5f4;
padding: 10px;
box-shadow: 1px 1px 1px #ccc;
}
.attentionItem p:nth-child(1){
font-size: 16px;
margin-left: 0;
}
.attentionItem p{
font-size: 14px;
margin-left: 45px;
}
.submitButtons{
margin-left: 34px;
}
.contentTable{
display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */
display: -moz-box; /* 老版本语法: Firefox (buggy) */
display: -ms-flexbox; /* 混合版本语法: IE 10 */
display: -webkit-flex; /* 新版本语法: Chrome 21+ */
display: -moz-flex;
display: flex;
-moz-box-pack: justify; /*Firefox*/
-webkit-box-pack:justify; /*Safari,Opera,Chrome*/
box-pack: justify;
-moz-justify-content: space-between;
-webkit-justify-content: space-between;
justify-content: space-between;
margin-top: 20px;
}
.left{
width: 50%;
}
.right{
width: 50%;
border-left: 1px solid #317ecc;
}
.error p{
color: #fff;
background: #317ecc;
// margin: 10px auto;
text-align: left;
font-size: 18px;
}
.download{
background: #f5f5f5;
padding: 5px;
margin-top: -16px;
}
.download img{
margin-top: -2px;
margin-right: 5px;
}
.download button{
border: none;
background: #f5f5f5
}
.download button:nth-child(1){
border-right: 1px solid #ccc;
}
.download button:nth-child(2){
border-right: 1px solid #ccc;
}
.buttonDown{
display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */
display: -moz-box; /* 老版本语法: Firefox (buggy) */
display: -ms-flexbox; /* 混合版本语法: IE 10 */
display: -webkit-flex; /* 新版本语法: Chrome 21+ */
display: -moz-flex;
display: flex;
-moz-box-pack: start; /*Firefox*/
-webkit-box-pack: start; /*Safari,Opera,Chrome*/
box-pack: start;
-moz-justify-content: flex-start;
-webkit-justify-content: flex-start;
justify-content: flex-start;
margin-bottom: 20px;
}
.buttonDown>button{
margin-left: 10px;
background: #abbac3;
border: none;
color: #fff;
padding: 5px 12px;
border-radius: 5px;
}
\ No newline at end of file
//.nomal{
// background: #fff;
// padding: 10px;
//}
//.title{
// display: flex;
// margin-bottom: 20px;
//}
//.info{
// text-align: center;
// font-weight: bold;
// font-size: 18px;
//}
//.detail{
// text-align: center;
// margin:30px auto;
//}
//.detail img{
// margin: auto 10px;
//}
//.button{
// display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */
// display: -moz-box; /* 老版本语法: Firefox (buggy) */
// display: -ms-flexbox; /* 混合版本语法: IE 10 */
// display: -webkit-flex; /* 新版本语法: Chrome 21+ */
// display: -moz-flex;
// display: flex;
// -moz-box-pack: center; /*Firefox*/
// -webkit-box-pack: center; /*Safari,Opera,Chrome*/
// box-pack: center;
// -moz-justify-content: center;
// -webkit-justify-content: center;
// justify-content: center;
//}
//.operation{
// display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */
// display: -moz-box; /* 老版本语法: Firefox (buggy) */
// display: -ms-flexbox; /* 混合版本语法: IE 10 */
// display: -webkit-flex; /* 新版本语法: Chrome 21+ */
// display: -moz-flex;
// display: flex;
// -moz-box-pack: center; /*Firefox*/
// -webkit-box-pack: center; /*Safari,Opera,Chrome*/
// box-pack: center;
// -moz-justify-content: center;
// -webkit-justify-content: center;
// justify-content: center;
//}
//.button Button{
// margin: auto 10px;
//
//}
//.titleInfo p span{
// font-weight: bold;
//}
//.import{
// color: #6ca3c9;
// font-size: 16px;
//}
//.button{
// // background: #eff3f8;
// text-align: center;
// padding:20px;
// margin-top: 20px;
//}
//.tip{
// margin:20px auto;
// padding:10px;
// border-top: 1px solid #ccc;
//}
//.tip span{
// display: block;
// margin:10px;
// font-size: 16px;
//}
//.tip::after{
// content: '';
// position: absolute;
// width: 5px;
// height: 57px;
// background: #e5eaf1;
// margin-top: -141px;
// margin-left: -13px;
//}
//.select button{
// color: #fff;
// padding:10px;
// background: #abbac3;
// border: none;
// margin: 10px;
//}
//.attentionItem{
// background: #f4f5f4;
// padding: 10px;
// box-shadow: 1px 1px 1px #ccc;
//}
//.attentionItem p:nth-child(1){
// font-size: 16px;
// margin-left: 0;
//}
//.attentionItem p{
// font-size: 14px;
// margin-left: 45px;
//}
//.submitButtons{
// margin-left: 34px;
//}
//.contentTable{
// display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */
// display: -moz-box; /* 老版本语法: Firefox (buggy) */
// display: -ms-flexbox; /* 混合版本语法: IE 10 */
// display: -webkit-flex; /* 新版本语法: Chrome 21+ */
// display: -moz-flex;
// display: flex;
// -moz-box-pack: justify; /*Firefox*/
// -webkit-box-pack:justify; /*Safari,Opera,Chrome*/
// box-pack: justify;
// -moz-justify-content: space-between;
// -webkit-justify-content: space-between;
// justify-content: space-between;
// margin-top: 20px;
//}
//.left{
// width: 50%;
//}
//.right{
// width: 50%;
// border-left: 1px solid #317ecc;
//}
//.error p{
// color: #fff;
// background: #317ecc;
// // margin: 10px auto;
// text-align: left;
// font-size: 18px;
//}
//.download{
// background: #f5f5f5;
// padding: 5px;
// margin-top: -16px;
//}
//.download img{
// margin-top: -2px;
// margin-right: 5px;
//}
//.download button{
// border: none;
// background: #f5f5f5
//}
//.download button:nth-child(1){
// border-right: 1px solid #ccc;
//}
//.download button:nth-child(2){
// border-right: 1px solid #ccc;
//}
//.buttonDown{
// display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */
// display: -moz-box; /* 老版本语法: Firefox (buggy) */
// display: -ms-flexbox; /* 混合版本语法: IE 10 */
// display: -webkit-flex; /* 新版本语法: Chrome 21+ */
// display: -moz-flex;
// display: flex;
// -moz-box-pack: start; /*Firefox*/
// -webkit-box-pack: start; /*Safari,Opera,Chrome*/
// box-pack: start;
// -moz-justify-content: flex-start;
// -webkit-justify-content: flex-start;
// justify-content: flex-start;
// margin-bottom: 20px;
//}
//.buttonDown>button{
// margin-left: 10px;
// background: #abbac3;
// border: none;
// color: #fff;
// padding: 5px 12px;
// border-radius: 5px;
//}
......@@ -2,13 +2,13 @@ import React, { Fragment } from 'react';
import { Divider, message, Modal, Popconfirm } from 'antd';
import moment from 'moment';
import router from 'umi/router';
import ExportInfo from '../Export/index';
// import ExportInfo from '../Export/index';
import { text, number, date, getFormArrayConfig } from '../config/index';
import ButtonDiy from '@/baseComponent/ButtonDiy';
import Shell from '../Shell';
import FormArray from '../AffairPage/component/FormArray';
import Edit from '../Edit/index';
import ImportUtil from '../ImportUtil/ImportUtil';
// import ImportUtil from '../ImportUtil/ImportUtil';
import SearchDom from '@/highOrderComponent/SearchDom';
import StandardTable from '@/components/StandardTable';
import { getHead, fetchData, deleteItem, add } from './services';
......@@ -344,8 +344,8 @@ class FormList extends React.Component {
<Shell>
<div style={{ paddingLeft: '10px', marginTop: '20px' }}>
<ButtonDiy icon="plus" className="primaryBlue" handleClick={this.add} name="新建" />
{hasImport && <ImportUtil objId={objId} />}
{hasExport && <ExportInfo objId={objId} />}
{/* {hasImport && <ImportUtil objId={objId} />}
{hasExport && <ExportInfo objId={objId} />}*/}
<ButtonDiy handleClick={this.batchDelete} name="批量删除" />
</div>
<StandardTable
......
import { apiRequest } from '../request';
const api="/DataObjApi";
export default {
namespace: 'DataObj',
state: {
list: [],
data:{
list: [],
pagination: {},
},
code:{
list: [],
pagination: {},
}
},
effects: {
*getExportInfo({ payload, callback }, { call, put }) {
const response = yield call(apiRequest,api+"/getExportInfo" ,payload);
if(!response){yield put({type: 'nom'});return }
yield put({
type: 'nom',
payload: response,
});
if (callback) callback(response);
},
*changeCatalogue({ payload, callback }, { call, put }) {
const response = yield call(apiRequest,api+"/changeCatalogue" ,payload);
if(!response){yield put({type: 'nom'});return }
yield put({
type: 'nom',
payload: response,
});
if (callback) callback(response);
},
*find({ payload, callback }, { call, put }) {
const response = yield call(apiRequest,api+"/find" ,payload);
if(!response){yield put({type: 'nom'});return }
yield put({
type: 'nom',
payload: response,
});
if (callback) callback(response);
},
*add({ payload, callback }, { call, put }) {
const response = yield call(apiRequest,api+"/add" ,payload);
if(!response){yield put({type: 'nom'});return }
yield put({
type: 'nom',
payload: response,
});
if (callback) callback(response);
},*fetch({ payload, callback }, { call, put }) {
const response = yield call(apiRequest,api+"/getPage" ,payload);
if(!response){yield put({type: 'nom'});return }
yield put({
type: 'page',
payload: {...response,isMain:payload.isMain},
});
},*remove({ payload, callback }, { call, put }) {
const response = yield call(apiRequest,api+"/remove" ,payload);
if(!response){yield put({type: 'nom'});return }
yield put({
type: 'nom',
payload: response,
});
if(callback){
callback()
}
},*open({ payload, callback }, { call, put }) {
const response = yield call(apiRequest,api+"/open" ,payload);
if(!response){yield put({type: 'nom'});return }
yield put({
type: 'nom',
payload: response,
});
if(callback){
callback()
}
},
*createTabel({payload,callback},{call,put}){
const response = yield call(apiRequest,api+"/createTable",payload);
if(!response){yield put({type: 'nom'});return }
yield put({
type: 'nom',
payload: response,
});
if(callback){
callback()
}
}
},
reducers: {
list(state, action) {
return {
...state,
list: action.payload,
};
},
page(state, { payload }) {
if(payload.isMain){
return {
...state,
data:{
list: payload.rows,
pagination: {
current:payload.pageNo,
pageSize:payload.pageSize,
total:payload.total,
},
}
};
}else{
return {
...state,
code:{
list: payload.rows,
pagination: {
current:payload.pageNo,
pageSize:payload.pageSize,
total:payload.total,
},
}
};
}
},
nom(state, action) {
return {...state };
},
},
};
import { uaaRequest } from '../../one_stop_public/utils/request';
const api = '/DataObjApi';
export default {
namespace: 'formList',
state: {
list: [],
data: {
list: [],
pagination: {},
},
},
effects: {
* clear({ payload, callback }, { call, put }) {
yield put({
type: 'clearAll',
payload: {},
});
},
* getHead({ payload, callback }, { call, put }) {
console.log('getHead',);
const response = yield call(uaaRequest, '/DataColumnApi/getHeaderList', payload);
console.log(' header response', response);
if (!response) {
yield put({ type: 'nom' });
return;
}
if (callback) callback(response);
},
* fetch({ payload, callback }, { call, put }) {
const response = yield call(uaaRequest, '/DataObjApi/getFormDataPage', payload);
if (!response) {
yield put({ type: 'nom' });
return;
}
/* yield put({
type: 'page',
payload: {
...response,
},
});*/
if (callback) callback(response);
},
* add({ payload, callback }, { call, put }) {
const response = yield call(apiRequest, api + '/addFormData',
{
data: JSON.stringify(payload.params),
isAdd: payload.isAdd,
objId: payload.objId,
});
if (!response) {
yield put({ type: 'nom' });
return;
}
if (callback) callback(response);
},
* delete({ payload, callback }, { call, put }) {
const response = yield call(apiRequest, api + '/deleteFormData', payload);
if (!response) {
yield put({ type: 'nom' });
return;
}
if (callback) callback(response);
},
* getDetail({ payload, callback }, { call, put }) {
const response = yield call(apiRequest, api + '/getFormData', payload);
if (!response) {
yield put({ type: 'nom' });
return;
}
if (callback) callback(response);
},
},
reducers: {
clearAll(state, action) {
return {
...state,
data: {
list: [],
pagination: {},
},
};
},
list(state, action) {
return {
...state,
list: action.payload,
};
},
page(state, { payload }) {
return {
...state,
data: {
list: payload.rows,
pagination: {
current: payload.pageNo,
pageSize: payload.pageSize,
total: Number(payload.total),
},
},
};
},
nom(state, action) {
return { ...state };
},
},
};
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论