import fetch from 'dva/fetch';
import { notification } from 'antd';
import { routerRedux } from 'dva/router';
import axios from 'axios';
import store from 'store';
import querystring from 'querystring';
import store1 from '../index';
import { gup } from './utils';
// import qs from 'qs';
import $loading from './loading';
import { getHostByPath } from './config';
import $modal from '../utils/modal';
// import { data } from '../routes/Command/GIS/SearchListTab/Attendance/TypeData';
// const CancelToken = axios.CancelToken;
notification.config({
placement: 'topLeft',
top: 100,
bottom: 50,
duration: 3
});
// const pending = [];
// const removePending = config => {
// for (const p in pending) {
// if (pending[p].u === config.url + '&' + config.method) {
// //当当前请求在数组中存在时执行函数体
// pending[p].f(); //执行取消操作
// pending.splice(p, 1); //把这条记录从数组中移除
// }
// }
// };
const instance = axios.create({
timeout: 60000,
headers: {
Authorization: 'Basic c2Fhc3dlYjp3ZWI=',
Accept: 'application/json',
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
}
});
//驻勤考点的token
const access_token = gup('access_token', window.location.href);
if (access_token) {
const saas = store.get('saas') || {};
store.set('saas', { ...saas, access_token });
}
const userV5Token = gup('userV5Token', window.location.href);//获取v5 5.0带过来标识符,1代表v5的token
//v5的token
let v5_access_token = gup('v5_access_token', window.location.href);
if (v5_access_token) {
const saas = store.get('saas') || {};
store.set('saas', { ...saas, v5_access_token });
}
let timeid;
/* instance.defaults.headers.post["Content-Type"] =
"application/x-www-form-urlencoded;charset=UTF-8"; */
function checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response;
}
notification.error({
message: `请求错误 ${response.status}: ${response.url}`,
description: response.statusText
});
const error1 = new Error(response.statusText);
error1.response = response;
throw error1;
}
/**
* 需要登录
* Requests a URL, returning a promise.
*
* @param {string} url The URL we want to request
* @param {object} [options] The options we want to pass to "fetch"
* @return {object} An object containing either "data" or "err"
*/
// notip 为true的时候不自动提示返回内容
// noAccessToken 为true的时候不传access_token
export function request(path, options, testUrl, notip, loading = true, noAccessToken = false) {
let url = path;
if (url.indexOf('http') == -1) {
url = (testUrl || getHostByPath()) + path;
}
const defaultOptions = {
credentials: 'include'
};
const newOptions = {
...defaultOptions,
...options
};
if (newOptions.method === 'POST' || newOptions.method === 'PUT') {
newOptions.headers = {
...newOptions.headers
};
newOptions.body = JSON.stringify({ ...newOptions.body, v: 'v1.0' });
}
if (options && options.data) {
delete newOptions.body;
if (store.get('saas') === undefined) {
const { dispatch } = store1;
dispatch(routerRedux.push('/user/logOn'));
// notification.error({
// message: "请登录"
// });
return Promise.reject('未登录');
}
const method = options.method.toLowerCase();
loading && $loading.open();
let requestData = {};
if (Object.prototype.toString.call(options.data).slice(8, -1) == 'FormData') {
// options.data.append('api', url);
// options.data.append('v', 'v1.0');
requestData = options.data;
} else {
requestData = querystring.stringify({
...options.data
// , api: url, v: 'v1.0'
});
}
let headers = options.headers || {};
if (!noAccessToken) {
headers = {
...headers,
access_token: store.get('saas')['access_token'],
userV5Token: userV5Token ? 1 : 0,//1待办v5用户,0待办sass用户
}
}
return instance({
url,
method,
headers,
params: method === 'get' ? {
...options.data
// , api: url, v: 'v1.0'
} : {},
// data:
// method === 'post'
// ? requestData
// : {}
data: requestData
})
.then(response => {
loading && $loading.close();
const { status, data } = response;
// 返回时间获取到服务器时间,用于时间插件天的管理控制
data.date = response.headers.date;
if (data.retType === '1') {
store.remove();
//防止重复提示
clearTimeout(timeid);
timeid = window.setTimeout(() => {
if (!notip) {
notification.error({
message: data.msg
});
}
}, 500);
const { dispatch } = store1;
store.clearAll();
dispatch(routerRedux.push('/user/logOn'));
return Promise.reject(data);
}
if (status !== 200 || data.retType !== '0') {
if (!notip) {
notification.error({
message: data.msg
});
}
return Promise.reject(data);
}
if (method === 'post' && data.msg) {
if (!notip) {
notification.success({
message: data.msg
});
}
}
let newData1;
try {
newData1 = JSON.parse(JSON.stringify(data).replace(/null/g, '""'));
} catch (err) {
newData1 = data;
}
return newData1;
})
.catch(err => {
loading && $loading.close();
if (err.toString().indexOf('Network') !== -1) {
notification.error({
message: '网络出错了'
});
const { dispatch } = store1;
// dispatch(routerRedux.push('/user/logOn'));
}
return Promise.reject(err);
});
} else {
return fetch(url, {
...newOptions
// , api: url, v: 'v1.0'
})
.then(checkStatus)
.then(response => {
loading && $loading.close();
return response.json()
})
.catch(error => {
loading && $loading.close();
if (error.code) {
notification.error({
message: error.name,
description: error.message
});
}
if ('stack' in error && 'message' in error) {
notification.error({
message: `请求错误: ${url}`,
description: error.message
});
}
return error;
});
}
}
/* 不需要登录 */
export function noLoginRequest(path, options, testUrl) {
const url = testUrl || getHostByPath() + path;
// const url = getHostByPath(path) + path;
const defaultOptions = {
credentials: 'include'
};
const newOptions = {
...defaultOptions,
...options
};
if (newOptions.method === 'POST' || newOptions.method === 'PUT') {
newOptions.headers = {
...newOptions.headers
};
newOptions.body = JSON.stringify({ ...newOptions.body, v: 'v1.0' });
// newOptions.body = {...newOptions.body, v: "v1.0"};
}
const method = options.method.toLowerCase();
return axios({
url,
method,
params: method === 'get' ? {
...options.data
// , api: url, v: 'v1.0'
} : {},
data:
method === 'post'
? querystring.stringify({
...options.data
// , api: url, v: 'v1.0'
})
: {}
})
.then(response => {
const { status, data } = response;
// 返回时间获取到服务器时间,用于时间插件的管理控制
data.date = response.headers.date;
if (data.retType === '1') {
notification.error({
message: data.msg
});
const { dispatch } = store1;
dispatch(routerRedux.push('/user/logOn'));
return Promise.reject(data);
}
if (status !== 200 || data.retType !== '0') {
notification.error({
message: data.msg
});
return Promise.reject(data);
}
if (method === 'post' && data.msg) {
notification.success({
message: data.msg
});
}
let newData1;
try {
newData1 = JSON.parse(JSON.stringify(data).replace(/null/g, '""'));
} catch (err) {
newData1 = data;
}
return newData1;
})
.catch(err => {
console.log(err, 'err');
if (err.toString().indexOf('Network') !== -1) {
// notification.error({
// message: "网络出错了"
// });
const { dispatch } = store1;
dispatch({ type: 'global/netError' });
}
return Promise.reject(err);
});
}
/* 登录请求
注意:本应该是post请求提交的参数确要用get提交参数后期要后端整改
---------------------------------------------------*/
export function loginRequest(path, options, testUrl) {
const url = testUrl || getHostByPath() + path;
// const url = getHostByPath(path) + path;
return instance
.post(url, {
...options.data,
// api: url,
// v: 'v1.0',
grant_type: 'password'
})
.then(response => {
const { status, data } = response;
if (status === 200 && data.retType === '0') {
store.set('saas', {
access_token: data.data.access_token,
sessionId: encodeURIComponent(data.data.sessionId), //嵌入百课堂和百保盾页面,直接使用接口数据,iframe不用拼接
thirdSessionId: data.data.thirdSessionId, //薪酬管理页面
});
} else {
notification.error({
message: data.msg
});
}
return data;
})
.catch(err => {
if (err.toString().indexOf('Network') !== -1) {
notification.error({
message: '网络出错了'
});
}
return { status: 600, data: { retType: '-1' } };
});
}
/**
* v5的公共服务的测试环境
*/
export function v5comRequest(path, options, notip, loading = true) {
let url = path;
if (url.indexOf('http') == -1) {
url = getHostByPath('v5common') + path;
}
const defaultOptions = {
credentials: 'include'
};
const newOptions = {
...defaultOptions,
...options
};
if (newOptions.method === 'POST' || newOptions.method === 'PUT') {
newOptions.headers = {
...newOptions.headers
};
}
if (options && options.data) {
const method = options.method.toLowerCase();
loading && $loading.open();
let requestData = {};
if (Object.prototype.toString.call(options.data).slice(8, -1) == 'FormData') {
requestData = options.data;
} else {
requestData = querystring.stringify({
...options.data
});
}
let headers = options.headers || {};
return instance({
url,
method,
headers,
params: method === 'get' ? {
...options.data
} : {},
data: requestData
})
.then(response => {
loading && $loading.close();
const { status, data } = response;
// 返回时间获取到服务器时间,用于时间插件天的管理控制
if (data.retType === '1') {
store.remove();
//防止重复提示
clearTimeout(timeid);
timeid = window.setTimeout(() => {
if (!notip) {
notification.error({
message: data.msg
});
}
}, 500);
store.clearAll();
return Promise.reject(data);
}
if (status !== 200 || data.retType !== '0') {
if (!notip) {
notification.error({
message: data.msg
});
}
return Promise.reject(data);
}
if (method === 'post' && data.msg) {
if (!notip) {
notification.success({
message: data.msg
});
}
}
let newData1;
try {
newData1 = JSON.parse(JSON.stringify(data).replace(/null/g, '""'));
} catch (err) {
newData1 = data;
}
return newData1;
})
.catch(err => {
loading && $loading.close();
if (err.toString().indexOf('Network') !== -1) {
notification.error({
message: '网络出错了'
});
}
return Promise.reject(err);
});
} else {
return fetch(url, {
...newOptions
})
.then(checkStatus)
.then(response => {
loading && $loading.close();
return response.json()
})
.catch(error => {
loading && $loading.close();
if (error.code) {
notification.error({
message: error.name,
description: error.message
});
}
if ('stack' in error && 'message' in error) {
notification.error({
message: `请求错误: ${url}`,
description: error.message
});
}
return error;
});
}
}
/**
* v5的数据接口
*/
export function v5baseRequest(path, options, notip, loading = true) {
let url = path;
if (url.indexOf('http') == -1) {
url = getHostByPath('v5base') + path;
}
if (options.urlData) {
for (var i in options.urlData) {
if (url.indexOf("?") > -1) {
url += "&" + i + '=' + options.urlData[i]
} else {
url += "?" + i + '=' + options.urlData[i]
}
}
}
const defaultOptions = {
credentials: 'include'
};
const newOptions = {
...defaultOptions,
...options
};
if (newOptions.method === 'POST' || newOptions.method === 'PUT') {
newOptions.headers = {
...newOptions.headers
};
// newOptions.body = JSON.stringify({ ...newOptions.body, v: 'v1.0' });
}
// const prefix = window.location.hostname.split('.')[0];
//本地自己调试的
// if(prefix=='localhost'){
// v5_access_token='eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhdXRoMCIsImV4cCI6MTYyMzMwNTAxOCwidXNlcm5hbWUiOiJfXzVuaHhDdVVlRXd2bmtBaG1EUlUifQ.hv0NcXKXyDUyMFlww77rmXggLICGqWJdBVTrHaSlGzg'
// }
if (!v5_access_token) {
//链接中没有给token
notification.error({
message: '请检查参数'
});
}
// if (options && options.data) {
// delete newOptions.body;
// if (store.get('saas') === undefined) {
// const { dispatch } = store1;
// dispatch(routerRedux.push('/user/logOn'));
// // notification.error({
// // message: "请登录"
// // });
// return Promise.reject('未登录');
// }
const method = options.method.toLowerCase();
loading && $loading.open();
return instance({
url,
data: options.data || {},
method: method,
headers: {
accessToken: v5_access_token,
...options.headers,
'Content-Type': 'application/json;charset=UTF-8'
},
})
.then(response => {
loading && $loading.close();
const { status, data } = response;
let result
let newData
if(Array.isArray(data)){
return Promise.resolve(data)
}
if(data.type==0){
return Promise.resolve({data:data.data})
}
if (data.data) {
if (data.data.data) {
let resData = data.data.data
result = resData.map((item) => {
let detail = {};
let { items } = item;
for (let key in resData[0].items) {
if (items[key].name) {
detail[items[key].name] = items[key].value;
} else if (items[key].columnName) {
detail[items[key].columnName] = items[key].value;
}
}
return {
id: item.id,
formId: item.formId,
...detail,
};
})
newData = {
data: {
data: result,
pageNumber: data.data.page,//当前第几页
pageSize: data.data.page_lines,//每页大小
total: data.data.row_count,//总条数
// totalPage:data.data.row_count/data.data.page_lines///总页数
}
}
} else if (data.data.datas) {
result = data.data.datas
newData = {
data: {
data: result,
}
}
} else if (data.data) {
if (!data.data.msg) {
result = data.data
newData = data
} else {
notification.error({
message: data.data.msg
});
Promise.reject(data.data.msg)
}
}
return Promise.resolve(newData)
} else {
return Promise.reject()
}
})
.catch(err => {
console.log(err)
loading && $loading.close();
if (err) {
if (err.response && err.response.status === 401) {
$modal(
因您长时间未操作,请重新登录企业后台重新进入,
'',
[],
);
}
if (err.toString().indexOf('Network') !== -1) {
notification.error({
message: '网络出错了'
});
// const { dispatch } = store1;
// dispatch(routerRedux.push('/user/logOn'));
}
}
return Promise.reject(err);
});
}
/**
* v5后台的数据接口
*/
export function v5adminRequest(path, options, notip, loading = true) {
let url = path;
if (url.indexOf('http') == -1) {
url = getHostByPath('v5base') + path;
}
if (options.urlData) {
for (var i in options.urlData) {
if (url.indexOf("?") > -1) {
url += "&" + i + '=' + options.urlData[i]
} else {
url += "?" + i + '=' + options.urlData[i]
}
}
}
const defaultOptions = {
credentials: 'include'
};
const newOptions = {
...defaultOptions,
...options
};
if (newOptions.method === 'POST' || newOptions.method === 'PUT') {
newOptions.headers = {
...newOptions.headers
};
}
const method = options.method.toLowerCase();
loading && $loading.open();
let time = new Date().getTime()
return instance({
url,
data: options.data || {},
method: method,
headers: {
"x-g-app-token": "02C524E758DDC1C4F041F0A5953AB7803ACF01A6BEA5B4E50A2239979AA3FB409FFF0353A0E9CDA37DA4DEE3E1CBD066960EC8EE91B577A16D6B6D67A16CF300",
"x-g-app-time": time,
'Content-Type': 'application/json;charset=UTF-8'
},
})
.then(response => {
loading && $loading.close();
const { status, data } = response;
let result
let newData
if (data.data) {
if (data.data.data) {
let resData = data.data.data
result = resData.map((item) => {
let detail = {};
let { items } = item;
for (let key in resData[0].items) {
if (items[key].name) {
detail[items[key].name] = items[key].value;
} else if (items[key].columnName) {
detail[items[key].columnName] = items[key].value;
}
}
return {
id: item.id,
formId: item.formId,
...detail,
};
})
newData = {
data: {
data: result,
pageNumber: data.data.page,//当前第几页
pageSize: data.data.page_lines,//每页大小
total: data.data.row_count,//总条数
// totalPage:data.data.row_count/data.data.page_lines///总页数
}
}
} else if (data.data.datas) {
result = data.data.datas
newData = {
data: {
data: result,
}
}
} else if (data.data) {
if (!data.data.msg) {
result = data.data
newData = data
} else {
notification.error({
message: data.data.msg
});
Promise.reject(data.data.msg)
}
}
return Promise.resolve(newData)
} else {
return Promise.reject()
}
})
.catch(err => {
console.log(err)
loading && $loading.close();
if (err) {
if (err.response && err.response.status === 401) {
$modal(
因您长时间未操作,请重新登录企业后台重新进入,
'',
[],
);
}
if (err.toString().indexOf('Network') !== -1) {
notification.error({
message: '网络出错了'
});
// const { dispatch } = store1;
// dispatch(routerRedux.push('/user/logOn'));
}
}
return Promise.reject(err);
});
}
//文件导出下载
export function saasDownloadBlob(url, params = {}) {
url = url.replace(/^\//, '');
let queryStr = '';
Object.keys(params).forEach(key => {
queryStr += `${key}=${params[key]}&`;
});
queryStr = queryStr.slice(0, -1);
return axios({
method: 'get',
url:
`${getHostByPath()}/${url}?${queryStr}`, //后台请求地址
responseType: 'blob',
headers: {
access_token: store.get('saas')['access_token']
}
});
}