import axios from 'axios' import { Notification, Loading } from 'element-ui' import commonUtility from './commonUtility' import _ from 'lodash' import hswebapp2frame from 'hswebapp2frame' let fullLoading function showLoading() { fullLoading = Loading.service({ lock: true, text: '加载中...', spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0)' }) setTimeout(_ => { fullLoading.close() }, 10000) } function closeLoading() { fullLoading && fullLoading.close() } let loading_request_count = 0 function show_full_screen_loading() { if (loading_request_count === 0) { showLoading() } loading_request_count++ } function hide_full_screen_loading() { if (loading_request_count <= 0) return loading_request_count-- if (loading_request_count === 0) { closeLoading() } } // 增加一个response拦截器 axios.interceptors.response.use( function(response) { hide_full_screen_loading() if (response.data) { const { error_detail, error_title } = response.data if (error_title || error_detail) { Notification.error({ title: '错误信息!', dangerouslyUseHTMLString: true, duration: 100000, message: `<div> <textarea style="border:0;border-radius:5px;background-color:rgba(241,241,241,.98);width: 300px;height: 400px;padding: 10px;resize: none;position: relative;right: 36px;"> ${error_title} ${error_detail} </textarea> </div>` // error_detail || error_title, }) } else { // 此处做优化 只有不出错的时候才返回response return response } } else { // 此处做优化 只有不出错的时候才返回response return response } }, function(error) { hide_full_screen_loading() if (self === top) { dyncInnerErrorDel(error) } else { response_error_del(error) } return Promise.reject(error) } ) function dyncInnerErrorDel(error) { if (error.message === 'Network Error') { Notification.error({ title: '错误信息!', message: '网络连接错误!请检查您的网络是否正常!', type: 'warning' }) } if (error.response && typeof error.response.data === 'string') { Notification.error({ title: '错误信息!', dangerouslyUseHTMLString: true, type: 'warning', duration: 100000, message: `<div> <textarea style="border:0;border-radius:5px;background-color:rgba(241,241,241,.98);width: 300px;height: 400px;padding: 10px;resize: none;position: relative;right: 36px;"> ${error.response.data} </textarea> </div>` }) } if (error.response && typeof error.response.data === 'object') { const { error_detail, error_title } = error.response.data Notification.error({ title: '错误信息!', dangerouslyUseHTMLString: true, duration: 100000, message: `<div> <textarea style="border:0;border-radius:5px;background-color:rgba(241,241,241,.98);width: 300px;height: 400px;padding: 10px;resize: none;position: relative;right: 36px;"> ${error_title} ${error_detail} </textarea> </div>` }) } } function response_error_del(error) { const { response, code } = error const { status, statusText, data } = response || {} let error_title = '错误信息' let error_detail = '' if (!response && !code) { // 没网的情况 error_title = '网络连接失败,请检查网络!' error_detail = '尝试关闭网站重新登陆!' } else if (code === 'ECONNABORTED') { error_title = '请求超时ECONNABORTED' error_detail = 'Uncaught (in promise) Error: timeout of 60000ms exceeded' } else if (status === 504) { error_title = '请求超时504' error_detail = data } else if (status === 404) { error_title = '404资源请求路径找不到' error_detail = response.request.responseURL } else if (status === 401 && statusText === 'UNAUTHORIZED') { if (self !== top) parent.postMessage('login', '*') sessionStorage.removeItem('header') error_detail = 'UNAUTHORIZED-未授权401' error_title = '身份验证失败,请重新登录!' } else { if (data.message) { error_title = data.message } else if (data instanceof Blob) { // 这条判断是解决 下载文件返回流的情况 要把流转成json const reader = new FileReader() reader.readAsText(data) const dealFileReader = async function() { const result = await new Promise(function(resolve, reject) { reader.onload = e => { resolve(JSON.parse(e.target.result)) } }) error_title = result.error_title ? result.error_title : '服务器异常' error_detail = result.error_detail hswebapp2frame.initError({ error_title, error_detail }) } dealFileReader() return } else if (Object.keys(data).length === 4) { error_title = data.error_title ? data.error_title : '服务器异常' error_detail = data.error_detail } else { error_title = '服务器内部错误' error_detail = data } } hswebapp2frame.initError({ error_title, error_detail }) // 发错误消息给ifram } axios.interceptors.request.use( config => { if (config.url.indexOf('no_loading') !== -1) { } else { if (config.url.startsWith('http:') || config.url.startsWith('https:')) { // 俺啥都不干 } else { config.url = config.url.replace('//', '/') } show_full_screen_loading() } if (config.url.includes('?&')) { config.url = config.url.replace('?&', '?') } return config }, err => { hide_full_screen_loading() return Promise.reject(err) } ) let fi_data = {} const tempList = [undefined, 'undefined'] // 需要在登录时将db_name、app_code、isMock参数存到session里 // 需要在代理配置mainAPI const module_url = `mainAPI/web_query/query/` const module_url2 = `mainAPI/web_query/query_value/` const module_url3 = `mainAPI/web_query/` const module_Gql_query = 'GQLAPI/sql_gql/' const module_Gql_query_save = 'GQLAPI/sql_gql/save/' const module_toolAPI = 'toolAPI/api/' const module_tool = 'toolAPI/' const module_query_page = 'mainAPI/web_chart_config/query_page/' const emptyList = [undefined, 'undefined', null, 'null', ''] const commonUtilAPI = 'commonUtilAPI/' const bill_audit_bills = `${commonUtilAPI}audit_bills/` const bill_un_audit_bills = `${commonUtilAPI}un_audit_bills/` const bill_close_bills = `${commonUtilAPI}close_bills/` const bill_un_close_bills = `${commonUtilAPI}un_close_bills/` const bill_send_bills = `${commonUtilAPI}send_bills/` const bill_un_send_bills = `${commonUtilAPI}un_send_bills/` function getPageParms() { const { db_name, is_mock, db_code } = commonUtility.parseUrlQueryString() const { appCode, pagename } = commonUtility.parseUrlQueryBIDyncAppcodePageName() const isMock = emptyList.includes(is_mock) ? 1 : is_mock const dbName = db_name || '' const obj = _.cloneDeep({ dbName, appCode, page: pagename, isMock, db_code }) return obj } const API = { runAsync(url, routerParms = {}, on_off = false) { let str = '' var p = new Promise(function(resolve, reject) { if (!on_off) { const { page, isMock, dbName, db_code } = getPageParms() const sPag = routerParms.page || page const postData = { exec_sql: `EXEC dbo.sptmcQueryData @sPage='${sPag}',@sPosition='${routerParms.position}',@sData='${routerParms.other ? JSON.stringify(routerParms.other) : '0x'}',@bMockData=${isMock}`, db_name: dbName || '', db_code } axios.post(module_url, postData).then(res => { const r_d = res.data[0] ? res.data[0].result : '' if (r_d !== '' && r_d !== undefined) { fi_data = JSON.parse(r_d) resolve(fi_data) } else { for (const key in routerParms) { if (key === 'position' || key === 'path') { str += routerParms[key] + '/' } } if (!url.endsWith('/')) { url = url + '/' } axios.get(url + str).then(res => { if (res.data.errcode === 404) { fi_data = JSON.parse(JSON.stringify(res.data.data)) resolve(fi_data) } else { fi_data = JSON.parse(JSON.stringify(res.data)) resolve(fi_data) } }) } }) } else { for (const key in routerParms) { str += routerParms[key] + '/' } if (url.substr(url.length - 1, 1) !== '/') { url = url + '/' } axios.get(url + str).then(res => { fi_data = JSON.parse(JSON.stringify(res.data)) resolve(fi_data) }) } }) return p }, getData(data) { // routerParms: page路由 position位置 other参数 const { appCode, page, isMock, dbName: db_Name, db_code } = getPageParms() const { sAppCode: sAppCode_, sPage: sPage_, sControl: sControl_, isMock: is_mock, dbName, elInfo: elInfo_, other } = data const db_name = dbName || db_Name || '' const elInfo = elInfo_ || {} const sPage = sPage_ || elInfo.page || page || '' const sAppCode = sAppCode_ || appCode const sControl = sControl_ || elInfo.position const isMock_ = typeof is_mock !== 'undefined' ? is_mock : (isMock || 1) var p = new Promise(function(resolve, reject) { const postData = { exec_sql: `EXEC dbo.spappCommonQuery_Data @sAppCode='${sAppCode}',@sPage='${sPage}',@sControl='${sControl}',@sParam='${other ? JSON.stringify(other) : '0x'}',@bMockData=${isMock_}`, db_name: db_name, db_code } axios.post(module_url, postData).then(res => { if (!res) return if (isMock) { const r_d = res.data[0] ? res.data[0].json_data : '' if (r_d !== '' && r_d !== undefined) { fi_data = JSON.parse(r_d) resolve(fi_data) } else { resolve([]) } } else { fi_data = JSON.parse(res.data) resolve(fi_data) } }) }) return p }, getConfig(data) { const { appCode, page, dbName: db_Name, db_code } = getPageParms() const { sAppCode: sAppCode_, sPage: sPage_, sControl: sControl_, dbName, elInfo: elInfo_, other } = data const elInfo = elInfo_ || {} const db_name = dbName || db_Name || '' const sPage = sPage_ || elInfo.page || page || '' const sAppCode = sAppCode_ || appCode const sControl = sControl_ || elInfo.position const otherParm = other ? JSON.stringify(other) : '0x' var p = new Promise(function(resolve, reject) { const postData = { exec_sql: `EXEC dbo.spappCommonQuery_Config @sAppCode='${sAppCode}',@sPage='${sPage}',@sControl='${sControl}',@sParam='${otherParm}'`, db_name: db_name, db_code } axios.post(module_url2, postData).then(res => { if (!res) return const r_d = res.data resolve(r_d) }) }) return p }, runSave(data) { // routerParms: page路由 position位置 other参数, sConfig 配置json sData 数据json const { sAppCode: sAppCode_, sPage: sPage_, sControl: sControl_, sConfig, sData, sQuerySql, is_mock, dbName, elInfo } = data const control_type = (elInfo && elInfo.el) || '' const { appCode, page, isMock, dbName: db_Name, db_code } = getPageParms() var p = new Promise(function(resolve, reject) { const db_name = dbName || db_Name || '' const sPage = sPage_ || (elInfo && elInfo.page) || page || '' const sAppCode = sAppCode_ || appCode var sIsMock if (parseInt(is_mock) === 0 || parseInt(is_mock) === 1) { sIsMock = is_mock } else { sIsMock = isMock } const sSQl = sQuerySql || '' const sControl = sControl_ || elInfo.position const globalParams = commonUtility.parseGlobalParams() const user_id = globalParams.user_id || 1 const postData = { exec_sql: `EXEC dbo.spappWebChartConfig_Save @sAppCode='${sAppCode}',@sPage='${sPage}',@sControl='${sControl}',@sControlType='${control_type}',@sConfig=:sConfig,@sData=:sData,@sQuerySql='${sSQl}',@bMockData='${sIsMock}',@iUserId=${user_id}`, db_name: db_name, db_code, param: { sConfig: JSON.stringify(sConfig), sData: JSON.stringify(sData) } } axios.post(module_url3, postData).then(res => { if (!res) return if (isMock) { const r_d = res.data[0] ? res.data[0].json_data : '' if (r_d !== '' && r_d !== undefined) { fi_data = JSON.parse(r_d) resolve(fi_data) } else { resolve([]) } } else { fi_data = JSON.parse(res.data) resolve(fi_data) } }) }) return p }, getSql(data) { const { sAppCode: sAppCode_, sPage: sPage_, sControl: sControl_, dbName } = data const { appCode, page, dbName: db_Name, db_code } = getPageParms() const globalParams = commonUtility.parseGlobalParams() const user_id = globalParams.user_id || 1 var p = new Promise(function(resolve, reject) { const db_name = dbName || db_Name || '' const sAppCode = sAppCode_ || appCode const sPage = sPage_ || page || '' const sControl = sControl_ const postData = { exec_sql: `EXEC dbo.spappWebChartConfig_Query @sAppCode='${sAppCode}',@sPage='${sPage}',@sControl='${sControl}',@iUserId='${user_id}'`, db_name: db_name, db_code } axios.post(module_url, postData).then(res => { resolve(res.data) }) }) return p }, download(name, data) { var urlObject = window.URL || window.webkitURL || window var downloadData = new Blob([data]) var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a') save_link.href = urlObject.createObjectURL(downloadData) save_link.download = name this.fake_click(save_link) }, fake_click(obj) { var ev = document.createEvent('MouseEvents') ev.initMouseEvent( 'click', true, false, window, 0, 0, 0, 0, 0 , false, false, false, false, 0, null ) obj.dispatchEvent(ev) }, downSql(data) { const { sAppCode: sAppCode_, sPage: sPage_, dbName } = data const { appCode, page, dbName: db_Name, db_code } = getPageParms() const db_name = dbName || db_Name || '' const sAppCode = sAppCode_ || appCode const sPage = sPage_ || page || '' const postData = { exec_sql: `EXEC dbo.spappWebChartConfig_SaveAs @sAppCode='${sAppCode}',@sPage='${sPage}'`, db_name: db_name, db_code } axios.post(module_url2, postData).then(res => { if (!res) return const r_d = res.data this.download(`spappWebChartConfig_Upgrade_${sAppCode}_${sPage}.sql`, r_d) }) }, execSql(data) { var postData = {} const { dbName: db_Name, db_code } = getPageParms() if (typeof data === 'object') { const { sQuerySql, dbName } = data const db_name = dbName || db_Name || '' postData = { exec_sql: sQuerySql, db_name, db_code } } else { postData = { exec_sql: data, db_Name, db_code } } var p = new Promise(function(resolve, reject) { axios.post(module_url, postData).then(res => { resolve(res.data) }) }) return p }, getPageLog(data) { const { sAppCode: sAppCode_, sPage: sPage_, dbName, sControl } = data const { appCode, page, dbName: db_Name, db_code } = getPageParms() const db_name = dbName || db_Name || '' const sAppCode = sAppCode_ || appCode const sPage = sPage_ || page || '' var p = new Promise(function(resolve, reject) { const postData = { exec_sql: `EXEC dbo.spappWebChartConfig_QueryLog @sAppCode='${sAppCode}',@sPageName='${sPage}',@sControlName='${sControl}'`, db_name: db_name, db_code } axios.post(module_url, postData).then(res => { if (!res) { resolve([]) return } if (res && !res.data) { resolve([]) return } resolve(res.data) }) }) return p }, revertPageLog(data) { const { sAppCode: sAppCode_, sPage: sPage_, dbName, sControl, version: version_ } = data const { appCode, page, dbName: db_Name, db_code } = getPageParms() const db_name = dbName || db_Name || '' const sAppCode = sAppCode_ || appCode const sPage = sPage_ || page || '' const version = version_ || '' var p = new Promise(function(resolve, reject) { const postData = { exec_sql: `EXEC dbo.spappWebChartConfig_Revert @sAppCode='${sAppCode}',@sPageName='${sPage}',@sControlName='${sControl}',@iVersion='${version}'`, db_name: db_name, db_code } axios.post(module_url3, postData).then(res => { resolve(res.data) }) }) return p }, getPageInfo(data) { const queryString = commonUtility.parseUrlQueryString() const { sAppCode: sAppCode_, sPage: sPage_, dbName, control_name, param, return_type } = data const { appCode, page, dbName: db_Name, db_code } = getPageParms() const db_name = dbName || db_Name || '' const sAppCode = sAppCode_ || appCode const sPage = sPage_ || page || '' const globalParams = commonUtility.parseGlobalParams() const user_id = globalParams.user_id || 1 const type = typeof param let _parm = {} if (type === 'string') { _parm = JSON.parse(param) } if (type === 'object') { _parm = _.cloneDeep(param) } const param_ = _.cloneDeep(_parm || {}) param_.menuParam = queryString param_.globalParam = globalParams || {} const datas = { db_name: db_name, app_code: sAppCode, page: sPage, param: JSON.stringify(param_), // param: param || '{}', control_name, return_type: return_type || 3, db_code } if (user_id) { datas.user_id = user_id } var p = new Promise(function(resolve, reject) { axios.post(`${module_query_page}`, datas).then(res => { if (!res) { resolve([]) return } if (res && !res.data) { resolve([]) return } resolve(res.data) }) }) return p }, getGqlData(data, url = module_Gql_query) { const { dbName: db_Name } = getPageParms() let url_ = url if (!url_.includes('?')) { url_ += '?' } if (!url_.includes('db_name')) { if (url_.endsWith('&')) { url_ = `${url_}db_name=${db_Name}` } else { url_ = `${url_}&db_name=${db_Name}` } } return axios.post(url_, data) }, saveGqlData(data, url = module_Gql_query_save) { const { dbName: db_Name } = getPageParms() let url_ = url if (!url.includes('?')) { url += '?' } if (!url.includes('db_name')) { url_ = `${url_}?db_name=${db_Name}` } const data_ = { 'data': { 'pbWebDyncCode': data } } return axios.post(url_, data_) }, parseUrlParams(queryParms = {}) { const urlQueryParams = commonUtility.parseUrlQueryString() let queryParms_str = '' if (queryParms && typeof queryParms === 'object') { Object.assign(urlQueryParams, queryParms) } Object.keys(urlQueryParams).forEach(key => { if (!tempList.includes(urlQueryParams[key])) { queryParms_str += `&${key}=${encodeURIComponent(urlQueryParams[key])}` } }) queryParms_str = queryParms_str.substr(1) return queryParms_str }, // 通过主键id 来查询值 queryByParimaryKey(parms) { const { tableName, id, appCode: appCode_, queryParms, group, dyncQueryParms } = parms const menuParams = getPageParms() const appCode__ = appCode_ || menuParams.appCode const queryObj = Object.assign({}, queryParms, dyncQueryParms || {}) const queryParms_str = this.parseUrlParams(queryObj) let url_ = `${module_toolAPI}${appCode__}/${tableName}/${id}/` if (group) { url_ = `${url_}${group}/` } url_ = `${url_}?` + queryParms_str return axios.get(url_) }, // 保存 save(data) { const { tableName, appCode: appCode_, bodyData, group, parms } = data const { appCode } = getPageParms() const queryParms_str = this.parseUrlParams(parms) const appCode__ = appCode_ || appCode let url = `${module_toolAPI}${appCode__}/${tableName}/` if (group) { // 非标准保存 url = `${url}${group}/` } url = url + '?' + queryParms_str return axios.post(url, bodyData) }, put(data) { const { tableName, appCode: appCode_, bodyData, group, parms } = data const { appCode } = getPageParms() const queryParms_str = this.parseUrlParams(parms) const appCode__ = appCode_ || appCode let url = `${module_toolAPI}${appCode__}/${tableName}/` if (group) { // 非标准保存 url = `${url}${group}/` } url = url + '?' + queryParms_str return axios.put(url, bodyData) }, // 查询列表 queryList(parms) { const { tableName, appCode: appCode_, queryParms, group, bodyData } = parms const { appCode } = getPageParms() const appCode__ = appCode_ || appCode const queryParms_str = this.parseUrlParams(queryParms) let url_ = `${module_toolAPI}${appCode__}/${tableName}/` if (group) { url_ = `${url_}${group}/` } url_ = `${url_}?` + queryParms_str + `&fuzzy=1` if (bodyData) { return axios.put(url_, bodyData) } else { return axios.get(url_) } }, // 批量删除 deleteList(parms) { const { tableName, appCode: appCode_, bodyData } = parms const { appCode } = getPageParms() const queryParms_str = this.parseUrlParams() const appCode__ = appCode_ || appCode const url_ = `${module_toolAPI}${appCode__}/${tableName}/` + '?' + queryParms_str return axios.delete(url_, { data: bodyData }) }, importExcel(formData, data) { const { table_name, queryParms } = data const { appCode, dbName } = getPageParms() let strParms = '' if (queryParms) { const itemParms_ = _.cloneDeep(queryParms) const menuGlobalParams = commonUtility.parseUrlQueryString() commonUtility.recursiveDyncParam(itemParms_, menuGlobalParams) for (const key in itemParms_) { strParms += `&${key}=${itemParms_[key]}` } } const url = `${module_toolAPI}${appCode}/${table_name}/import_excel/?db_name=${dbName}${strParms}` return axios.post(url, formData) }, getNewId(number) { const number_ = number || 100 return axios.get(module_tool + `common/new_id/${number_}/`) }, importDataIframe(data, parms) { const { dbName, appCode } = getPageParms() const { table_name, import_name, queryParms } = parms let strParms = '' if (queryParms) { const itemParms_ = _.cloneDeep(queryParms) const menuGlobalParams = commonUtility.parseUrlQueryString() commonUtility.recursiveDyncParam(itemParms_, menuGlobalParams) for (const key in itemParms_) { strParms += `&${key}=${itemParms_[key]}` } } const url_ = `${module_toolAPI}${appCode}/${table_name}/${import_name}/?db_name=${dbName}${strParms}` return axios.post(url_, data) }, // 单据流控制 billHandleCommon(obj) { const { data, type } = obj let url = '' switch (type) { case 'billAudit': url = `${bill_audit_bills}` break case 'billUnAudit': url = `${bill_un_audit_bills}` break case 'billSend': url = `${bill_send_bills}` break case 'billUnSend': url = `${bill_un_send_bills}` break case 'billClose': url = `${bill_close_bills}` break case 'billUnClose': url = `${bill_un_close_bills}` break } return axios.post(url, data) }, queryBillpbWebDyncCode(parms) { const { appCode: appCode_, queryParms, tableName } = parms const { appCode, page } = getPageParms() const appCode__ = appCode_ || appCode const queryParms_str = this.parseUrlParams(queryParms)// QueryBI let url_ = `${module_toolAPI}queryBi/${tableName}/` url_ = `${url_}?` + queryParms_str + '&' + `app_code=${appCode__}&page_name=${page}&usable=1` return axios.get(url_) }, // action打印 printTask(data) { const url = `${module_tool}common/print_task/` return axios.post(url, data) }, // 默认单据类型打印 TypePrintTask(data) { const url = `${module_tool}common/print_task_by_bill_type/` return axios.post(url, data) }, get(url) { return axios.get(url) }, // 上传附件 uploadFile(formData) { const { appCode } = getPageParms() return axios.post(`fileresourceAPI/file/${appCode}/`, formData) } } export default API