index.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. /*
  2. * @Author: your name
  3. * @Date: 2021-11-10 09:33:30
  4. * @LastEditTime: 2025-05-20 10:53:28
  5. * @LastEditors: code4eat awesomedema@gmail.com
  6. * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  7. * @FilePath: /KC-MiddlePlatform/src/pages/index.tsx
  8. */
  9. import { useModel, history, Location, Helmet } from 'umi';
  10. import './index.less';
  11. import { Skeleton, Drawer, Tooltip } from 'antd';
  12. import { useState, useEffect } from 'react';
  13. import { FastEntry, FastEntryTabType } from './components/FastEntry';
  14. import { RecentlyVisitedItemsType } from './components/RecentlyVisited';
  15. import { todoItem, TodoList } from './components/TodoList';
  16. import { getSysParamsByCode, getUserIndexData, UserInfo } from '@/service';
  17. import { KcimCenterSysId } from '@/constant';
  18. import { createFromIconfontCN } from '@ant-design/icons';
  19. import '../../../public/zhongtaiB.js';
  20. const IconFont = createFromIconfontCN({
  21. scriptUrl: '',
  22. });
  23. export interface IndexPageType {
  24. location: Location;
  25. }
  26. const IndexPage: React.FC<IndexPageType> = ({ location }) => {
  27. const {
  28. systemLists, //当前医院可选子系统列表
  29. setInitialState,
  30. userData,
  31. customerType,
  32. } = useModel('@@initialState', (model) => {
  33. return {
  34. systemLists: model.initialState?.systemLists,
  35. setInitialState: model.setInitialState,
  36. userData: model.initialState?.userData,
  37. customerType: model.initialState?.customerType,
  38. };
  39. });
  40. const [userInfo, set_userInfo] = useState<UserInfo>();
  41. const [fastEntry, set_fastEntry] = useState<FastEntryTabType[]>([]);
  42. const [recentlyVisitedList, set_recentlyVisitedList] = useState<RecentlyVisitedItemsType[]>([]);
  43. const [todoList, set_todoList] = useState<todoItem[]>([]);
  44. const [msgRecord, set_msgRecord] = useState([]);
  45. const [specialPageUrl, setspecialPageUrl] = useState<string | undefined>(undefined);
  46. const [leftImgUrl, set_leftImgUrl] = useState<string | undefined>(undefined);
  47. const [leftBgImgUrl, set_leftBgImgUrl] = useState<string | undefined>(undefined);
  48. const [iframeLoading, set_iframeLoading] = useState(false);
  49. const [allParams, set_allParams] = useState<any[]>([]);
  50. const [title, set_title] = useState<string | undefined>(undefined);
  51. const [welcomTitle, set_welcomTitle] = useState('欢迎进入医管平台');
  52. const [drawerOpen, set_drawerOpen] = useState(false);
  53. const onLoadhandle = () => {
  54. set_iframeLoading(false);
  55. };
  56. const getIndexPageDataFunc = async () => {
  57. const resp = await getUserIndexData();
  58. if (resp) {
  59. set_userInfo(resp.userInfo);
  60. set_leftImgUrl(resp.indexUrl ? resp.indexUrl.split('|')[0] : undefined);
  61. set_leftBgImgUrl(resp.indexUrl ? resp.indexUrl.split('|')[1] : undefined);
  62. localStorage.setItem('userInfo', JSON.stringify(resp.userInfo));
  63. setInitialState((s: any) => ({ ...s, userInfo: resp.userInfo }));
  64. const fastEntryList = resp.fastEntrance.map((item: any) => ({
  65. id: item.id,
  66. name: item.name,
  67. path: item.path,
  68. menuId: item.menuId,
  69. systemId: item.systemId,
  70. type: item.type,
  71. contentType: item.contentType,
  72. url: item.url,
  73. }));
  74. set_fastEntry(fastEntryList);
  75. set_todoList(
  76. resp.todoList.map((t: any) => ({
  77. id: t.id,
  78. status: 1,
  79. content: t.content,
  80. createDate: t.createDate,
  81. taskLevel: t.taskLevel,
  82. recordTitle: t.recordTitle,
  83. })),
  84. );
  85. set_msgRecord(
  86. resp.messageRecords.map((t: any) => ({
  87. title: t.recordTitle,
  88. date: t.createDate,
  89. resolveTime: t.resolveTime,
  90. isProcess: t.isProcess,
  91. content: t.content,
  92. })),
  93. );
  94. }
  95. };
  96. const todoListClickHandle = async (id: number) => {
  97. set_drawerOpen(true);
  98. // const resp = await todoListAct([id]);
  99. // if (resp) {
  100. // getIndexPageDataFunc();
  101. // }
  102. };
  103. const setIframeUrl = async (allParams: any[]) => {
  104. const needItem = allParams.filter((a: any) => a.code == '1644270043527254016');
  105. const userData = localStorage.getItem('userData');
  106. let token = '';
  107. if (userData) {
  108. const { youshuToken } = JSON.parse(userData);
  109. token = youshuToken;
  110. }
  111. if (needItem.length > 0) {
  112. setspecialPageUrl(`http://eastern1.kcim-bi.163yun.com/dash/integration/56?rid=${needItem[0].value}&token=${token}`);
  113. }
  114. };
  115. const getAllParamsHanle = async () => {
  116. const resp = await getSysParamsByCode(KcimCenterSysId);
  117. if (resp) {
  118. set_allParams(resp);
  119. }
  120. };
  121. const onClose = () => {
  122. set_drawerOpen(false);
  123. };
  124. const fastEntryOnChangeHandle = () => {
  125. getIndexPageDataFunc();
  126. };
  127. useEffect(() => {
  128. if (allParams) {
  129. setIframeUrl(allParams);
  130. allParams.forEach((item) => {
  131. if (item.code == '1739124039835848704') {
  132. set_title(item.value);
  133. }
  134. if (item.code == '1739123252502073344') {
  135. set_welcomTitle(item.value);
  136. }
  137. });
  138. }
  139. }, [allParams]);
  140. useEffect(() => {
  141. getIndexPageDataFunc();
  142. const t = localStorage.getItem('visitedTabs');
  143. if (t) {
  144. const visitedPaths = JSON.parse(t);
  145. set_recentlyVisitedList(visitedPaths);
  146. }
  147. getAllParamsHanle();
  148. // const url = `${spacialPage[0].url}&token=${youshuToken}`;
  149. }, []);
  150. return (
  151. <div className="indexPage">
  152. {/* <iframe width={1000} height={800} src="http://localhost:8088/superset/dashboard/5b12b583-8204-08e9-392c-422209c29787/?native_filters_key=q3H6TKjSa58" ></iframe> */}
  153. <Drawer
  154. className="MsgProcessDrawer"
  155. title={null}
  156. onClose={onClose}
  157. open={drawerOpen}
  158. mask={false}
  159. headerStyle={{ display: 'none' }}
  160. bodyStyle={{ background: '#F5F7FA' }}
  161. width={600}
  162. style={{
  163. position: 'absolute', // 确保 Drawer 可以被定位
  164. top: 48,
  165. bottom: 0, // 距离底部 10%
  166. height: 'calc(100vh - 50px)', // 设置 Drawer 的高度
  167. }}
  168. >
  169. <div className="drawerHeader">
  170. <div className="title">
  171. <span onClick={() => set_drawerOpen(false)}>
  172. <img src={require('../../../public/images/cancel_black.png')} alt="" />
  173. </span>
  174. 待办事项
  175. </div>
  176. </div>
  177. <div className="msgInfo">
  178. <div className="left">
  179. <img src={require('../../../public/images/todojindo.png')} alt="" />
  180. <div className="detail">
  181. <div className="msgtitle">任立群发起了请假申请</div>
  182. <div className="date">2023-12-26 11:24</div>
  183. </div>
  184. </div>
  185. <div className="right">后勤管理 / 报事报修</div>
  186. </div>
  187. <div className="content">
  188. <div style={{ padding: 8 }}>
  189. <Skeleton active paragraph={{ rows: 12 }} />
  190. </div>
  191. </div>
  192. </Drawer>
  193. <Helmet>
  194. <title>{welcomTitle}</title>
  195. </Helmet>
  196. <div className="pageContainer">
  197. <div className="left">
  198. <div style={{ padding: 8 }}>
  199. <div className="leftTitle">{title ? title.split('|')[0] : '默认标题'}</div>
  200. <div className="leftTitleSub">{title ? title.split('|')[1] : '默认标题'}</div>
  201. </div>
  202. <div className="leftContent">
  203. {specialPageUrl && (
  204. <div className="iframe" style={{ width: '100%' }}>
  205. <Skeleton loading={iframeLoading} paragraph={{ rows: 50 }} active />
  206. <iframe onLoad={() => onLoadhandle()} style={{ width: '100%', height: 'calc(100vh - 180px)', border: 'none' }} src={specialPageUrl}></iframe>
  207. </div>
  208. )}
  209. {!specialPageUrl && (
  210. <div className="imgWrap" style={{ width: '100%', background: `url(${leftBgImgUrl})` }}>
  211. <img src={leftImgUrl} alt="" />
  212. </div>
  213. )}
  214. </div>
  215. </div>
  216. <div className="right">
  217. <div className="cardOne">
  218. <img className="welcomBg" src={'/images/welcom_bg.png'} alt="" />
  219. <div className="inner">
  220. <span className="userId">{userInfo?.account}</span>
  221. <div className="cardOneTitle">{`欢迎回来,${userInfo?.name}`}</div>
  222. <div className="content">
  223. <div className="row">
  224. <div className="label">
  225. <img src={require('../../../public/images/icon-keshi.png')} alt="" />
  226. <span>{customerType == '2' ? '组织' : '科室'}</span>
  227. <Tooltip title={userInfo?.departmentName}>
  228. <span className="departmentName">
  229. {userInfo?.departmentName ? userInfo?.departmentName : '-'}
  230. </span>
  231. </Tooltip>
  232. </div>
  233. <div className="label">
  234. <img src={require('../../../public/images/icon-zhicheng.png')} alt="" />
  235. <span>{customerType == '2' ? '职务' : '职称'}</span>
  236. <Tooltip title={customerType == '2' ? userInfo?.jobTitle : userInfo?.title}>
  237. <span className="departmentName">
  238. {customerType == '2' ? (userInfo?.jobTitle ?? '-') : (userInfo?.title ?? '-')}
  239. </span>
  240. </Tooltip>
  241. </div>
  242. </div>
  243. <div className="row">
  244. <div className="label">
  245. <img src={require('../../../public/images/icon-leibie.png')} alt="" />
  246. <span>类别</span>
  247. <Tooltip title={userInfo?.userCate}>
  248. <span className="departmentName">
  249. {userInfo?.userCate ? userInfo?.userCate : '-'}
  250. </span>
  251. </Tooltip>
  252. </div>
  253. <div className="label">
  254. <img src={require('../../../public/images/icon-gangwei.png')} alt="" />
  255. <span>岗位</span>
  256. <Tooltip title={userInfo?.position}>
  257. <span className="departmentName">
  258. {userInfo?.position ? userInfo?.position : '-'}
  259. </span>
  260. </Tooltip>
  261. </div>
  262. </div>
  263. </div>
  264. </div>
  265. </div>
  266. <div className="cardTwo">
  267. <FastEntry data={fastEntry} onChange={() => fastEntryOnChangeHandle()} />
  268. </div>
  269. <div className="cardThree">
  270. <TodoList todoList={todoList} todoListClickHandle={todoListClickHandle} />
  271. </div>
  272. </div>
  273. </div>
  274. </div>
  275. );
  276. };
  277. export default IndexPage;