import { useState } from 'react';
import { PageLoading } from '@ant-design/pro-layout';
import { notification, Modal } from 'antd';
import { RequestConfig, history } from 'umi';
import type { RequestOptionsInit } from 'umi-request';
import { getHospSubSystemList, UserDataType } from '@/service/login';
import { BasicLayoutProps } from '@ant-design/pro-layout';
import { logoutHandle } from './global';
import { Platforms } from './constant';
import { SpacicalPageParamsType } from './typings';
const loginPath = '/login';
let hospSign: string = ''; //医院标识
if (history && history.location.query) {
hospSign = history.location.query.hospSign as string;
if (!hospSign) {
const localHospSign = localStorage.getItem('hospSign');
hospSign = localHospSign ? localHospSign : '';
}
}
/** 获取用户信息比较慢的时候会展示一个 loading */
export const initialStateConfig = {
loading: ,
};
type InitialStateType = {
userData?: UserDataType;
systemLists?: TopBar.Tab[]; //当前医院可选子系统列表
openedSysLists?: TopBar.Tab[]; //当前已打开的系统列表
currentSelectedSys?: TopBar.Tab; //当前选中的tab
logout?: () => Promise;
childAppIsShowMenu?: boolean;
spacicalPageParamsType?: SpacicalPageParamsType[];
getHospSubSystemListFunc?: () => Promise;
};
export async function getInitialState(): Promise {
const fetchUserInfo = async () => {
try {
const userData = localStorage.getItem('userData');
if (userData) {
return JSON.parse(userData);
}
throw Error;
} catch (error) {
history.push(`${loginPath}?hospSign=${hospSign}`);
}
return undefined;
};
const getAppIcon = (name: string) => {
return Platforms.filter((i) => i.name == name).length > 0 ? Platforms.filter((i) => i.name == name)[0].logo : '';
};
//获取当前账号所有子应用列表
const getHospSubSystemListFunc = async () => {
const data = await getHospSubSystemList();
if (data) {
const _data = data.map((t) => ({
...t,
icon: getAppIcon(t.name),
path: t.path,
}));
return _data;
}
return [];
};
const logout = logoutHandle;
const userData = await fetchUserInfo();
let systemLists: userRelationInfo.OwnAppsItem[] = [];
if (userData) {
systemLists = await getHospSubSystemListFunc();
}
const localInitData = localStorage.getItem('initialState');
return {
currentSelectedSys: undefined,
openedSysLists: [],
...JSON.parse(localInitData ? localInitData : '{}'), //覆盖,恢复tab状态
userData,
logout,
spacicalPageParamsType: [],
getHospSubSystemListFunc,
systemLists: systemLists,
};
}
const requestInterceptorsHandle = (url: string, options: RequestOptionsInit) => {
const userData = localStorage.getItem('userData');
let authHeader = { token: '' };
if (userData) {
const { token } = JSON.parse(userData);
authHeader.token = token;
}
return {
url: `/gateway${url}`,
options: { ...options, interceptors: true, headers: authHeader, timeout: 100000000, },
};
};
const responseInterceptorsHandle = async (response: Response, options: RequestOptionsInit) => {
const _response: {
message: any;
data?: any;
status: number;
success?: boolean;
msg?: string;
} = await response.clone().json();
if (_response.status == 200) {
if (_response.data) {
return _response.data;
}
notification.success({
message: `操作成功!`,
});
return {
status: _response.status,
success: true,
};
} else {
notification.error({
message: `${_response.msg?_response.msg:_response.message}`,
});
return false
}
};
interface ErrorInfoStructure {
success: boolean; // if request is success
data?: any; // response data
status?: number;
errorCode: number;
errorMessage: string;
showType?: number;
traceId?: string;
host?: string;
}
interface ResponseErr extends Error {
data?: any; // 这里是后端返回的原始数据
info: ErrorInfoStructure;
}
const errorHandlerFunc = (error: ResponseErr) => {
try {
const { info } = error;
const { errorCode, errorMessage } = info;
if (errorCode == 499) {
//token过期
Modal.confirm({
title: '抱歉,你的登录已过期,请重新登录!',
// closable:false,
maskClosable: false,
// cancelButtonProps:
onOk: () => {
logoutHandle();
return Promise.resolve(true);
},
});
return;
}
if (errorMessage.length > 20) {
notification.error({
message: ` ${errorCode}:出现错误!`,
description: errorMessage,
});
} else if(false){
}else{
notification.error({
message: ` ${errorCode}:${errorMessage}`,
});
}
} catch (err) {
console.log({ errorHandlerFunc: err });
notification.error({
message: '遇到未知错误,查看控制台!',
});
}
};
export const request: RequestConfig = {
timeout: 10000,
errorConfig: {
adaptor: (resData) => {
if (!resData.success && resData.status != 200) {
return {
...resData,
};
} else {
return {
success: true,
status: 200,
};
}
},
},
errorHandler: (err: any) => errorHandlerFunc(err),
middlewares: [
async function middlewareA(ctx, next) {
await next();
},
async function middlewareB(ctx, next) {
await next();
},
],
requestInterceptors: [requestInterceptorsHandle],
responseInterceptors: [responseInterceptorsHandle],
};
// 从接口中获取子应用配置,export 出的 qiankun 变量是一个 promise
export const qiankun = fetch('/config').then(() => ({
// 注册子应用信息
apps: [
// {
// name: 'microApp', // 唯一 id
// entry: '//localhost:8808', // 开发
// },
// {
// name: 'app1', // 唯一 id
// entry: '//120.27.235.181:8804', //测试
// },
// {
// name: 'reviewMana', // 唯一 id
// entry: '//120.27.235.181:8807',
// //entry: '//localhost:8804', //本地调试
// },
{
name: 'budgetManaSystem', // 唯一 id
//entry: '//localhost:8001',
//entry: '//120.27.235.181:5000/perform/', //开发
entry: '//47.96.149.190:5000/perform/', //演示
},
{
name: 'PFMBackC', // 唯一 id
entry: '//120.27.235.181:5000/pfmManager/index.html'
//entry: '//112.124.59.133:5000/perform/', // 开发
},
],
// 完整生命周期钩子请看 https://qiankun.umijs.org/zh/api/#registermicroapps-apps-lifecycles
lifeCycles: {
afterMount: (props: any) => { },
},
// 支持更多的其他配置,详细看这里 https://qiankun.umijs.org/zh/api/#start-opts
}));
//向子应用透传
export function useQiankunStateForSlave() {
const [masterState, setMasterState] = useState({});
return {
masterState,
setMasterState,
};
}
// //@/pages/platform/setting/reports/index
export function patchRoutes({ routes }: { routes: any }) {
const treeLoop = (treeData: any) => {
if (treeData.path == '/platform') {
if (treeData.routes) {
const paths = [...new Array(100).keys()].map((a, index) => ({
path: `${treeData.path == '/' ? '' : treeData.path}/reports/${index}`,
exact: true,
component: require('@/pages/platform/setting/reports/index.tsx').default,
}));
const lanhuPagePaths = [...new Array(100).keys()].map((a, index) => ({
path: `${treeData.path == '/' ? '' : treeData.path}/static/${index}`,
exact: true,
component:require('@/pages/platform/setting/static/index.tsx').default,
}));
//console.log({paths});
paths.forEach((a: any) => {
treeData.routes.push(a);
});
lanhuPagePaths.forEach((a: any) => {
treeData.routes.push(a);
});
}
}
if (treeData.routes && treeData.routes.length > 0) {
treeData.routes.forEach((a: any) => {
treeLoop(a);
})
}
}
treeLoop(routes[0]);
}
export const layout = ({ initialState: { userData } }: { initialState: InitialStateType }): BasicLayoutProps => {
return {
headerRender: false,
rightContentRender: () => <>right>,
footerRender: () => null,
onPageChange: () => {
//如果没有登录,重定向到 login
if (!userData && location.pathname !== '/login') {
// history.push('/login');
}
},
menuHeaderRender: undefined,
// ...initialState?.settings,
};
};