提交 1727a6a9 authored 作者: 钟是志's avatar 钟是志

11794 后勤编外人员库,000013 批量导入报错 数据库 监听器 报错在前端不显示导入什么报错了

上级 15f2e239
import React, { Fragment } from 'react';
import {
Button,
Modal,
Steps,
Upload,
Icon,
message,
Spin,
Tabs,
Table,
} from 'antd';
import { Button, Modal, Steps, Upload, Icon, message, Spin, Tabs, Table } from 'antd';
import styles from './ImportUtil.less';
import ButtonDiy from './ButtonDiy/ButtonDiy';
......@@ -19,7 +9,7 @@ import { connect } from 'dva';
const Step = Steps.Step;
const TabPane = Tabs.TabPane;
const exportExcel = (CLIENT_TYPE == 'mobile') ? null : require('xlsx-oc').exportExcel;
const exportExcel = CLIENT_TYPE == 'mobile' ? null : require('xlsx-oc').exportExcel;
@connect(({ DataObj, loading }) => ({
DataObj,
......@@ -29,7 +19,9 @@ export default class ImportUtil extends React.PureComponent {
constructor(props) {
super(props);
const exportTemplateUrl = encodeURI(`${config.httpServer}/DataObjApi/importTemplateDownload?objId=${this.props.objId}&name=${props.fileName}`);
const exportTemplateUrl = encodeURI(
`${config.httpServer}/DataObjApi/importTemplateDownload?objId=${this.props.objId}&name=${props.fileName}`,
);
this.state = {
ch: false,
......@@ -49,17 +41,16 @@ export default class ImportUtil extends React.PureComponent {
}
showModal = () => {
this.setState({
visible: true,
});
};
handleOk = (e) => {
handleOk = e => {
this.setState({
visible: false,
});
};
handleCancel = (e) => {
handleCancel = e => {
this.setState({
visible: false,
});
......@@ -88,7 +79,6 @@ export default class ImportUtil extends React.PureComponent {
this.props.callback();
}
}
}
prev() {
......@@ -106,8 +96,7 @@ export default class ImportUtil extends React.PureComponent {
objId: this.props.objId,
},
callback: (res) => {
callback: res => {
this.next();
message.success('导入成功');
......@@ -115,18 +104,15 @@ export default class ImportUtil extends React.PureComponent {
current: 3,
isShow: true,
visible: false,
});
if (this.props.callback) {
this.props.callback();
}
},
});
}
getCachKey = (filePath) => {
getCachKey = filePath => {
const { dispatch, importParams } = this.props;
dispatch({
type: 'DataObj/importAnalyse',
......@@ -136,19 +122,15 @@ export default class ImportUtil extends React.PureComponent {
filePath,
objId: this.props.objId,
},
callback: (res) => {
callback: res => {
this.setState({
filekey: res.cacheKey,
});
this.queryFile(res.cacheKey);
},
});
};
queryFile = (cacheKey) => {
queryFile = cacheKey => {
const { dispatch, importParams } = this.props;
dispatch({
type: 'DataObj/importDataQuery',
......@@ -157,7 +139,7 @@ export default class ImportUtil extends React.PureComponent {
cacheKey,
objId: this.props.objId,
},
callback: (res) => {
callback: res => {
this.setState({
current: 1,
isShow: false,
......@@ -167,8 +149,6 @@ export default class ImportUtil extends React.PureComponent {
column: res.column,
});
if (res.noPass && res.noPass.length == 0) {
if (res.pass.length == 0) {
message.error('当前没有验证成功的数据,无法导入。');
this.setState({
......@@ -192,15 +172,13 @@ export default class ImportUtil extends React.PureComponent {
isNextDisabled: true,
});
}
},
});
};
changePane = (activeKey) => {
changePane = activeKey => {
this.setState({ currentKey: activeKey });
};
exportError = (column, dataSource) => {
if (exportExcel == null) {
message.info('当前终端暂不支持此功能');
return;
......@@ -213,12 +191,9 @@ export default class ImportUtil extends React.PureComponent {
dataSource[j].index = j + 1;
}
exportExcel(_headers, dataSource);
};
render() {
const props = {
name: 'file',
action: config.uploadUrl,
......@@ -228,54 +203,61 @@ export default class ImportUtil extends React.PureComponent {
},
accept: '.xlsx',
showUploadList: false,
onChange: (info) => {
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.`);
message.error(`${info.file.name} 上传失败`);
}
},
};
const steps = [{
const steps = [
{
title: '上传Excel',
}, {
},
{
title: '验证数据',
}, {
},
{
title: '数据导入',
},
{
title: '导入完成',
}];
},
];
const { current } = this.state;
const { name, loading } = this.props;
const column1 = this.state.column ? [{
const column1 = this.state.column
? [
{
title: '序号',
dataIndex: 'index',
fixed: 'left',
width: 50,
render: (v, r, i) => i + 1,
}, ...this.state.column] : [];
},
...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>;
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}/>
<ButtonDiy
name={name || '批量导入'} // 应用里面的批量导入
type="default"
className="defaultBlue"
handleClick={this.showModal}
/>
<Modal
visible={this.state.visible}
onOk={this.handleOk}
......@@ -286,108 +268,124 @@ export default class ImportUtil extends React.PureComponent {
footer={null}
width={'80%'}
>
<div className={styles.nomal}>
<p className={styles.import}>
EXCEL导入向导
</p>
<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.map(item => (
<Step key={item.title} title={item.title} />
))}
</Steps>
<div className="steps-content">
{steps[this.state.current].content}
</div>
<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 ? '确认导入' : '下一步'}
{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()}/>
}
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>
<span>
点击“选择文件”选择您要导入的EXCEL文件,点击“开始上传”将其上传到服务器上,点击“清空队列”清空当前上传文件队列。
</span>
</p>
</div>
{
this.state.isShow ?
{this.state.isShow ? (
<div className={styles.buttonDown}>
<Upload {...props}>
<Button>
<Icon type="upload"/>点击上传
<Icon type="upload" />
点击上传
</Button>
</Upload>
<Button href={this.state.exportTemplateUrl}
target="_blank"
type="danger">
<Button href={this.state.exportTemplateUrl} target="_blank" type="danger">
下载模板
</Button>
</div> :
</div>
) : (
<Upload {...props}>
<Button>
<Icon type="upload"/>
<Icon type="upload" />
重新上传
</Button>
</Upload>
}
)}
{
this.state.isShow ? <div className={styles.attentionItem}>
{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>
) : (
<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 ? '' :
<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>
<Button
style={{ marginTop: 5, marginBottom: 5 }}
type="danger"
onClick={this.exportError.bind(this, column1, this.state.errData)}
>
导出错误信息
</Button>
<Table columns={column1} size="small"
<Table
columns={column1}
size="small"
style={{ overflow: 'auto' }}
dataSource={this.state.errData}
bordered={true}/></TabPane>}
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>
<Button style={{ marginTop: 5, marginBottom: 5 }} type="primary"
onClick={this.exportError.bind(this, column2, this.state.sucData)}>导出正确信息</Button>
<Table columns={column2} size="small"
<Table
columns={column2}
size="small"
style={{ overflow: 'auto' }}
dataSource={this.state.sucData}
bordered={true}/></TabPane>
bordered={true}
/>
</TabPane>
</Tabs>
</div>
}
)}
</div>
</Modal>
</span>
);
......
import { apiRequest } from '../utils/request';
import {apiRequest} from '../utils/request';
const api = '/DataObjApi';
import {Base16Encode} from "../Base16/index"
......@@ -18,10 +19,10 @@ export default {
},
effects: {
*importAnalyse({ payload, callback }, { call, put }) {
* importAnalyse({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/importAnalyse', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
......@@ -31,10 +32,10 @@ export default {
});
if (callback) callback(response);
},
*importDataQuery({ payload, callback }, { call, put }) {
* importDataQuery({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/importDataQuery', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
......@@ -44,10 +45,13 @@ export default {
});
if (callback) callback(response);
},
*importExecute({ payload, callback }, { call, put }) {
const response = yield call(apiRequest, api + '/importExecute', payload);
* importExecute({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/importExecute', {
...payload,
customErrMsg: '导入的文件中可能存在字段不一致、字段类型不匹配、唯一性字段冲突,请检查或联系系统管理员', // 自定义errMsg
});
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
......@@ -57,18 +61,18 @@ export default {
});
if (callback) callback(response);
},
*getAll({ payload, callback }, { call, put }) {
const response = yield call(apiRequest, api+'/getAll', payload);
* getAll({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/getAll', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
if (callback) callback(response);
},
*getStatistics({ payload, callback }, { call, put }) {
* getStatistics({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/getStatistics', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
......@@ -78,10 +82,10 @@ export default {
});
if (callback) callback(response);
},
*getExportInfo({ payload, callback }, { call, put }) {
* getExportInfo({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/getExportInfo', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
......@@ -91,10 +95,10 @@ export default {
});
if (callback) callback(response);
},
*changeCatalogue({ payload, callback }, { call, put }) {
* changeCatalogue({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/changeCatalogue', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
......@@ -104,10 +108,10 @@ export default {
});
if (callback) callback(response);
},
*findByCode({ payload, callback }, { call, put }) {
* findByCode({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/findByCode', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
......@@ -117,10 +121,10 @@ export default {
});
if (callback) callback(response);
},
*findByName({ payload, callback }, { call, put }) {
* findByName({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/findByName', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
yield put({
......@@ -129,10 +133,10 @@ export default {
});
if (callback) callback(response);
},
*find({ payload, callback }, { call, put }) {
* find({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/find', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
......@@ -142,14 +146,14 @@ export default {
});
if (callback) callback(response);
},
*add({ payload, callback }, { call, put }) {
* add({payload, callback}, {call, put}) {
if(payload.sqlScript){
payload.sqlScript=Base16Encode(payload.sqlScript)
if (payload.sqlScript) {
payload.sqlScript = Base16Encode(payload.sqlScript)
}
const response = yield call(apiRequest, api + '/add', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
......@@ -159,21 +163,21 @@ export default {
});
if (callback) callback(response);
},
*fetch({ payload, callback }, { call, put }) {
* fetch({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/getPage', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
yield put({
type: 'page',
payload: { ...response, isMain: payload.isMain },
payload: {...response, isMain: payload.isMain},
});
},
*getTableList({ payload, callback }, { call, put }) {
* getTableList({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/getTableList', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
yield put({
......@@ -182,10 +186,10 @@ export default {
});
if (callback) callback(response);
},
*createTableByName({ payload, callback }, { call, put }) {
* createTableByName({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/createTableByName', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
yield put({
......@@ -194,10 +198,10 @@ export default {
});
if (callback) callback(response);
},
*remove({ payload, callback }, { call, put }) {
* remove({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/remove', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
yield put({
......@@ -208,10 +212,10 @@ export default {
callback();
}
},
*open({ payload, callback }, { call, put }) {
* open({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/open', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
yield put({
......@@ -222,10 +226,10 @@ export default {
callback();
}
},
*createTabel({ payload, callback }, { call, put }) {
* createTabel({payload, callback}, {call, put}) {
const response = yield call(apiRequest, api + '/createTable', payload);
if (!response) {
yield put({ type: 'nom' });
yield put({type: 'nom'});
return;
}
yield put({
......@@ -245,7 +249,7 @@ export default {
list: action.payload,
};
},
page(state, { payload }) {
page(state, {payload}) {
if (payload.isMain) {
return {
...state,
......@@ -273,7 +277,7 @@ export default {
}
},
nom(state, action) {
return { ...state };
return {...state};
},
},
};
......@@ -5,10 +5,16 @@
import { extend } from 'umi-request';
import { notification } from 'antd';
import { getToken } from './token';
import { queryApiActionPath, queryOauthActionPath, queryPermActionPath, queryDynamicActionPath } from './queryConfig';
import {
queryApiActionPath,
queryOauthActionPath,
queryPermActionPath,
queryDynamicActionPath,
} from './queryConfig';
import { openToast } from '../location/Notification';
import { showToast } from '../location/Toast';
import { offline } from '../location/Toast';
const codeMessage = {
200: '服务器成功返回请求的数据。',
201: '新建或修改数据成功。',
......@@ -33,7 +39,17 @@ const codeMessage = {
*
* return URL参数字符串
*/
const objectToQuery = function (param, key, encode) {
const qqCw = ({ title = '请求错误', msg = '', customErrMsg = '' }) => {
// 请求错误 增加自定义错误提示信息
notification.error({
message: title,
description: customErrMsg || msg,
});
return undefined;
};
const objectToQuery = function(param, key, encode) {
if (param == null) return '';
var paramStr = '';
var t = typeof param;
......@@ -56,9 +72,8 @@ const errorHandler = error => {
if (response && response.status) {
const errorText = codeMessage[response.status] || response.statusText;
notification.error({
message: `请求错误`,
description: errorText,
qqCw({
msg: errorText,
});
if (response.status === 401) {
// @HACK
......@@ -84,6 +99,9 @@ const errorHandler = error => {
/**
* 配置request请求时的默认参数
*/
const umiRequest = extend({
errorHandler, // 默认错误处理
credentials: 'omit', // 默认请求是否带上cookie
......@@ -161,16 +179,16 @@ export const request = (url, data, options = {}) => {
if (!response) return;
if (response.errCode || response.errMsg) {
notification.error({
message: `请求错误`,
description: response.errMsg,
qqCw({
msg: response.errMsg,
customErrMsg: pp.customErrMsg,
});
return;
}
if (response.errcode) {
notification.error({
message: `请求错误`,
description: response.errmsg,
qqCw({
msg: response.errmsg,
customErrMsg: pp.customErrMsg,
});
return;
}
......@@ -178,7 +196,11 @@ export const request = (url, data, options = {}) => {
return response;
});
} else {
const pp = { ...data, token: getToken(), version_: version };
const pp = {
...data,
token: getToken(),
version_: version,
};
for (let i in pp) {
if (pp[i] == null) {
......@@ -235,17 +257,17 @@ export const request = (url, data, options = {}) => {
if (!response) return;
if (response.errCode || response.errMsg) {
notification.error({
message: `请求错误`,
description: response.errMsg,
});
qqCw({
msg: response.errMsg,
customErrMsg: pp.customErrMsg,
})
return;
}
if (response.errcode) {
notification.error({
message: `请求错误`,
description: response.errmsg,
});
qqCw({
msg: response.errmsg,
customErrMsg: pp.customErrMsg,
})
return;
}
canReportError = true;
......@@ -272,7 +294,10 @@ const createServerRequest = (config = {}) => {
return setRequestConfig(config);
};
export const dynamicRequest = createServerRequest({ method: 'POST', prefix: queryDynamicActionPath() });
export const dynamicRequest = createServerRequest({
method: 'POST',
prefix: queryDynamicActionPath(),
});
export const uaaRequest = createServerRequest({ method: 'POST', prefix: queryOauthActionPath() });
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论