view.jsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. import React, { useEffect, useState } from "react";
  2. import styles from "./style.less";
  3. import { observer, observable } from "mobx-react";
  4. import { useHistory, useLocation } from "react-router-dom";
  5. import $store from "@store/";
  6. import { useRef } from "react";
  7. import { timeDiffer, dealDiffSheetType } from "@utils/util";
  8. import PropTypes from "prop-types";
  9. import { Tabs, List, Radio, Tooltip, Modal, Button, message, Form } from "antd";
  10. import {
  11. getAccountMsgPage,
  12. getMenuDesc,
  13. getReportInfo,
  14. setReadStatus,
  15. getAccountResourceVoByResourceId,
  16. getUnReadMessageNum,
  17. } from "../../apis/personal";
  18. import { switchPage, getUnionId } from "@apis/common.js";
  19. // newResourceMsg :报表上新
  20. // fineReportChange :报表内容更新
  21. // fineDataResourceChange :报表元数据更新
  22. // 权限通知:
  23. const messageType = [
  24. "newResourceMsg",
  25. "fineReportChange",
  26. "fineDataResourceChange",
  27. ];
  28. export default observer(function (props) {
  29. const history = useHistory();
  30. const [tabNum, settabNum] = useState(1);
  31. const [messageList, setMessageList] = useState([]); /**消息通知列表 */
  32. const [isShowDetail, setIsShowDetail] = useState(
  33. false
  34. ); /**控制 详情消息弹出 */
  35. const [msgDetail, setMsgDetail] = useState({}); /**消息通知 当条 点击详情 */
  36. const [reportName, setReportName] = useState(""); /**消息弹窗-相关报表名字 */
  37. const [hasPermission, setHasPermission] = useState(
  38. false
  39. ); /**消息弹窗-去看看权限 */
  40. //表单配置
  41. const formItemLayout = {
  42. labelCol: { span: 4 },
  43. wrapperCol: { span: 20 },
  44. };
  45. const options = [
  46. { label: "系统公告", value: 1 },
  47. { label: "权限通知", value: 2 },
  48. ];
  49. const subMenuList = [
  50. {
  51. defaultOpen: true,
  52. openType: "self",
  53. parentId: null,
  54. resourceCode: null,
  55. resourceId: "",
  56. resourceList: [],
  57. resourceType: "sys",
  58. sortNo: "2",
  59. status: true,
  60. sysResource: false,
  61. topParentId: "",
  62. resourceIcon: "RadarChartOutlined",
  63. resourceName: "个人信息",
  64. resourceUrl: "/home/center",
  65. },
  66. {
  67. defaultOpen: true,
  68. openType: "self",
  69. parentId: null,
  70. resourceCode: null,
  71. resourceId: "",
  72. resourceList: [],
  73. resourceType: "sys",
  74. sortNo: "2",
  75. status: true,
  76. sysResource: false,
  77. topParentId: "",
  78. resourceIcon: "DatabaseOutlined",
  79. resourceName: "消息通知",
  80. resourceUrl: "/home/message",
  81. },
  82. // {
  83. // defaultOpen: true,
  84. // openType: "self",
  85. // parentId: null,
  86. // resourceCode: null,
  87. // resourceId: "",
  88. // resourceList: [],
  89. // resourceType: "sys",
  90. // sortNo: "2",
  91. // status: true,
  92. // sysResource: false,
  93. // topParentId: "",
  94. // resourceIcon: "ApartmentOutlined",
  95. // resourceName: "权限申请记录",
  96. // resourceUrl: "/home/right",
  97. // },
  98. ];
  99. function calcValue(str) {
  100. if (str === "sysToken") {
  101. return `${sessionStorage.getItem("token")}$`;
  102. }
  103. }
  104. const chooseTab = (e) => {
  105. //console.log("e",e.target.value);
  106. settabNum(e.target.value);
  107. };
  108. useEffect(() => {
  109. getMessageList();
  110. }, []);
  111. /**获取 消息通知列表 */
  112. const getMessageList = () => {
  113. let accountId = sessionStorage.getItem("accountId");
  114. let config = {
  115. accountId,
  116. messageType: ["System_bulletin", "Permission_msg"],
  117. };
  118. getAccountMsgPage(config).then(({ data, resultCode }) => {
  119. if (+resultCode === 0) {
  120. data.records.map((item) => {
  121. item.messageDetailTitle = item.messageDetailTitle.replace(
  122. /\\n/g,
  123. " "
  124. );
  125. item.messageContent = item.messageContent.replace(/\\n/g, "\n");
  126. });
  127. setMessageList(data.records.slice(0, 3));
  128. }
  129. });
  130. };
  131. //处理 消息 详情
  132. const goHandleMessage = () => {
  133. if (!hasPermission) {
  134. message.warning("该报表无权限!");
  135. return;
  136. }
  137. const { messageDetailType, messageContentObjectId } = msgDetail || {};
  138. switch (messageDetailType) {
  139. case "fineDataResourceChange":
  140. //根据id 找到 该元数据
  141. getMenuDesc({ resourceId: messageContentObjectId }).then(
  142. ({ data, resultCode }) => {
  143. if (+resultCode === 0) {
  144. $store.app.setMetaData({
  145. data,
  146. visible: true,
  147. });
  148. }
  149. }
  150. );
  151. break;
  152. case "fineReportChange":
  153. getReportInfo({ resourceId: messageContentObjectId }).then(
  154. ({ data, resultCode }) => {
  155. if (+resultCode === 0) {
  156. switchPage({
  157. // pageId: relationship[key].pageId,
  158. modelName: data.resourceName,
  159. pageName: data.resourceName,
  160. pageUrl: data.resourceUrl,
  161. resourceId: data.resourceId,
  162. visitId: sessionStorage.getItem("unionId"),
  163. });
  164. let dataOpt = {
  165. id: data.resourceId,
  166. name: data.resourceName,
  167. openType: "self",
  168. path: data.resourceUrl,
  169. type: data.resourceType,
  170. };
  171. dealDiffSheetType(data).then((response) => {
  172. $store.app.setNavList({ ...dataOpt });
  173. $store.app.setCurNav(dataOpt.path);
  174. if (response.type === "sys") {
  175. history.push(response.link);
  176. } else {
  177. history.push(`/home/outer/${response.activeItem.resourceId}`);
  178. }
  179. });
  180. }
  181. }
  182. );
  183. break;
  184. }
  185. };
  186. //获取 未读消息的数量
  187. const getUnReadNum = () => {
  188. let accountId = sessionStorage.getItem("accountId");
  189. getUnReadMessageNum(accountId).then(({ data, resultCode }) => {
  190. if (+resultCode === 0) {
  191. $store.app.setNewsCount(+data);
  192. }
  193. });
  194. };
  195. //更改消息状态
  196. const changeReadStatus = (msgId) => {
  197. let accountId = sessionStorage.getItem("accountId");
  198. const config = {
  199. accountId,
  200. messageIds: [msgId],
  201. };
  202. setReadStatus({ ...config });
  203. };
  204. //获取 相关报表
  205. const getReportDetail = (id) => {
  206. if (!id) {
  207. return;
  208. }
  209. getAccountResourceVoByResourceId({ resourceId: id }).then(
  210. ({ data, resultCode }) => {
  211. if (+resultCode === 0) {
  212. setReportName(data.resourceName);
  213. setHasPermission(data.hasPermission);
  214. }
  215. }
  216. );
  217. };
  218. const {
  219. messageDetailType,
  220. messageContentObjectId,
  221. createTime,
  222. messageContent,
  223. } = msgDetail || {};
  224. return (
  225. <div className={styles.right_park}>
  226. {Array.isArray(messageList) && messageList.length > 0 ? (
  227. <div className="right_park_title">
  228. <div className="title_left">消息通知</div>
  229. <div
  230. className="go_more"
  231. onClick={() => {
  232. let dataOpt = {
  233. id: 122,
  234. name: "消息通知",
  235. openType: "self",
  236. path: "/home/message",
  237. type: "sys",
  238. };
  239. sessionStorage.setItem("curNav", "/home/message");
  240. sessionStorage.setItem("activedUrl", "/home/message");
  241. $store.sysMenu.setSubmenuList(subMenuList);
  242. $store.app.setActivedUrl("/home/message");
  243. let arr = $store.app.navList.slice(1);
  244. arr.push(dataOpt);
  245. $store.app.setNavList(arr, "set");
  246. $store.app.setCurNav("/home/message");
  247. history.push("/home/message");
  248. //埋点记录
  249. switchPage({
  250. // pageId: relationship[key].pageId,
  251. modelName: "消息通知",
  252. pageName: "消息通知",
  253. pageUrl: "/home/message",
  254. resourceId: "10000001",
  255. visitId: sessionStorage.getItem("unionId"),
  256. });
  257. }}
  258. >
  259. 更多 &gt;
  260. </div>
  261. {/* <div className="clear"></div> */}
  262. </div>
  263. ) : (
  264. <></>
  265. )}
  266. {/* tab 切换-系统公告 权限通知 */}
  267. {/* <Radio.Group
  268. options={options}
  269. onChange={chooseTab}
  270. value={tabNum}
  271. optionType="button"
  272. /> */}
  273. <div className="message_list">
  274. {Array.isArray(messageList) && messageList.length > 0 ? (
  275. messageList.map((item) => {
  276. return (
  277. <>
  278. <div className="message_item" key={item.messageId}>
  279. <Tooltip
  280. placement="top"
  281. title={
  282. item.messageDetailTitle.length > 20
  283. ? item.messageDetailTitle
  284. : ""
  285. }
  286. >
  287. <span
  288. className={
  289. item.messageReadStatus
  290. ? "message_desc"
  291. : "isBlod message_desc"
  292. }
  293. onClick={() => {
  294. setMsgDetail(item);
  295. setIsShowDetail(true);
  296. messageType.includes(item.messageDetailType)
  297. ? getReportDetail(item.messageContentObjectId)
  298. : "";
  299. //更改消息状态(点开 -》 已读)
  300. changeReadStatus(item.messageId);
  301. // getUnReadNum();
  302. }}
  303. >
  304. {item.messageDetailTitle}
  305. </span>
  306. </Tooltip>
  307. <span className="msg_time">
  308. {timeDiffer(item.createTime)}
  309. </span>
  310. </div>
  311. </>
  312. );
  313. })
  314. ) : (
  315. <>
  316. <div className="message_null">
  317. <img
  318. src={require("@assets/imgs/messgae_null.png").default}
  319. width={100}
  320. />
  321. <div className="noMsg_desc">暂无消息</div>
  322. </div>
  323. </>
  324. )}
  325. </div>
  326. {/* 点击消息详情 对话框 */}
  327. <Modal
  328. title="消息通知"
  329. visible={isShowDetail}
  330. onCancel={() => {
  331. setIsShowDetail(false);
  332. //关闭对话框-更新top实时小红点数量
  333. // getUnReadNum();
  334. getMessageList();
  335. }}
  336. footer={
  337. <Button
  338. type="primary"
  339. key="goHandle"
  340. onClick={goHandleMessage}
  341. disabled={
  342. messageDetailType === "newResourceMsg" ||
  343. messageDetailType === "permissionOverDueSoon"
  344. ? true
  345. : false
  346. }
  347. >
  348. {messageDetailType === "newResourceMsg"
  349. ? "申请权限"
  350. : messageDetailType === "permissionOverDueSoon"
  351. ? "续期"
  352. : "去看看"}
  353. </Button>
  354. }
  355. >
  356. <Form {...formItemLayout}>
  357. <Form.Item
  358. label="消息时间"
  359. style={{ fontWeight: 600, marginBottom: 8 }}
  360. >
  361. <span style={{ fontWeight: 400 }}>{createTime}</span>
  362. </Form.Item>
  363. {messageDetailType === "fineReportChange" && (
  364. <Form.Item
  365. label="相关报表"
  366. style={{ fontWeight: 600, marginBottom: 8 }}
  367. >
  368. <span style={{ fontWeight: 400 }}>{reportName}</span>
  369. </Form.Item>
  370. )}
  371. <Form.Item
  372. label="消息内容"
  373. style={{ fontWeight: 600, marginBottom: 8 }}
  374. >
  375. <div
  376. style={{
  377. fontWeight: 400,
  378. whiteSpace: "pre-wrap",
  379. paddingTop: 5,
  380. paddingBottom: 5,
  381. }}
  382. >
  383. {messageContent}
  384. </div>
  385. </Form.Item>
  386. </Form>
  387. </Modal>
  388. </div>
  389. );
  390. });