index.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. import { getPendingList } from '@/services/message';
  2. import { getComparisonData } from '@/services/OperationManagement';
  3. import { queryConditionSnapshot } from '@/services/SmartOps';
  4. import { getToken, UnityAction } from '@/utils/utils';
  5. import { LoadingOutlined } from '@ant-design/icons';
  6. import { connect, useParams, useRequest } from '@umijs/max';
  7. import dayjs from 'dayjs';
  8. import { useEffect } from 'react';
  9. import { getScadaPage } from '../../services/OperationManagement';
  10. import styles from './index.less';
  11. const HomePage = (props) => {
  12. const { projectId } = useParams();
  13. const { data } = useRequest(queryConditionSnapshot, {
  14. defaultParams: [{ project_id: projectId }],
  15. });
  16. // useEffect(() => {
  17. // localStorage.width = document.documentElement.getBoundingClientRect().width;
  18. // window.refreshpx();
  19. // }, []);
  20. return (
  21. <div className={styles.content}>
  22. <LeftContent data={data} />
  23. <CenterContent />
  24. <RightContent data={data} />
  25. </div>
  26. );
  27. };
  28. const LeftContent = (props) => {
  29. const { data } = props;
  30. return (
  31. <div className={styles.left}>
  32. <SmartWork data={data} />
  33. <WaterAmt data={data} />
  34. <WaterQuality data={data} />
  35. {/* <Backlog /> */}
  36. </div>
  37. );
  38. };
  39. const CenterContent = () => {
  40. return (
  41. <div className={styles.centerBox}>
  42. <Backlog />
  43. <Scada />
  44. </div>
  45. );
  46. };
  47. const RightContent = (props) => {
  48. const { data } = props;
  49. return (
  50. <div className={styles.right}>
  51. <SelfInspection />
  52. <Electric data={data} />
  53. <Medicine />
  54. {/* <Scada /> */}
  55. </div>
  56. );
  57. };
  58. // 水厂工况
  59. const SmartWork = (props) => {
  60. const { data } = props;
  61. return (
  62. <Box
  63. small={true}
  64. title="水厂工况"
  65. onClick={() => UnityAction.sendMsg('menuItem', '工况管理')}
  66. >
  67. <div className={styles.scoreBox}>
  68. <div className={styles.circle}>
  69. <div className={styles.score}>{data?.score}</div>
  70. <div className={styles.grade}>{data?.grade}</div>
  71. </div>
  72. <div className={styles.scoreTitle}>
  73. 当前运行{data?.grade},可继续优化
  74. </div>
  75. </div>
  76. <div className={styles.time}>
  77. {dayjs(data?.clac_time).format('YYYY-MM-DD HH:mm')}
  78. </div>
  79. </Box>
  80. );
  81. };
  82. // 水量监测
  83. const WaterAmt = (props) => {
  84. const { data } = props;
  85. const { projectId } = useParams();
  86. return (
  87. <Box
  88. title="水量监测"
  89. onClick={() => UnityAction.sendMsg('menuItem', '水量监测')}
  90. >
  91. <ul>
  92. <li>
  93. <div className={styles.value}>{data?.fwa}</div>
  94. <div className={styles.btn1}>进水量</div>
  95. </li>
  96. <li>
  97. <div className={styles.value}>{data?.dwa}</div>
  98. <div className={styles.btn2}>产水量</div>
  99. </li>
  100. </ul>
  101. </Box>
  102. );
  103. };
  104. // 水质监测
  105. const WaterQuality = (props) => {
  106. const { data } = props;
  107. const { projectId } = useParams();
  108. return (
  109. <Box
  110. title="水质监测"
  111. onClick={() => UnityAction.sendMsg('menuItem', '水质监测')}
  112. >
  113. <ul>
  114. <li>
  115. <div className={styles.value}>{data?.dsan || 0}</div>
  116. <div className={styles.btn1}>出水余氯</div>
  117. </li>
  118. <li>
  119. <div className={styles.value}>{data?.dtur || 0}</div>
  120. <div className={styles.btn2}>出水浊度</div>
  121. </li>
  122. </ul>
  123. </Box>
  124. );
  125. };
  126. // 系统自检
  127. const SelfInspection = connect(({ eqSelfInspection, loading }) => ({
  128. autoReport: eqSelfInspection.autoReport,
  129. loading: loading.models['eqSelfInspection'],
  130. }))((props) => {
  131. const { autoReport, dispatch, loading } = props;
  132. const { projectId } = useParams();
  133. const renderStatus = () => {
  134. if (loading) return <LoadingOutlined />;
  135. if (autoReport.Status > 0) {
  136. return (
  137. <span className={styles.text} style={{ color: '#FE5850' }}>
  138. 异常
  139. </span>
  140. );
  141. }
  142. return (
  143. <span className={styles.text} style={{ color: '' }}>
  144. 正常
  145. </span>
  146. );
  147. };
  148. useEffect(() => {
  149. dispatch({
  150. type: 'eqSelfInspection/getAutoPatrol',
  151. payload: {
  152. projectId,
  153. },
  154. });
  155. }, []);
  156. return (
  157. <Box
  158. small={true}
  159. title="系统自检"
  160. onClick={() => UnityAction.sendMsg('menuItem', '系统自检')}
  161. >
  162. <div className={styles.selfCon}>
  163. <div className={styles.circle}>{renderStatus()}</div>
  164. <div className={styles.texting}>自检中</div>
  165. </div>
  166. <div className={styles.time}>
  167. {dayjs(autoReport.CreatedTime).format('YYYY-MM-DD HH:mm')}
  168. </div>
  169. {/* <div className={styles.insTag}>自检中</div> */}
  170. {/* <div className={styles.insStatus}>{renderStatus()}</div>
  171. <div className={styles.time} style={{ marginBottom: 30 }}>
  172. {dayjs(autoReport.CreatedTime).format('YYYY-MM-DD HH:mm')}
  173. </div> */}
  174. </Box>
  175. );
  176. });
  177. // 能耗监测
  178. const Electric = (props) => {
  179. const { data } = props;
  180. const { projectId } = useParams();
  181. return (
  182. <Box
  183. title="能耗监测"
  184. onClick={() => UnityAction.sendMsg('menuItem', '能耗监测')}
  185. >
  186. <ul>
  187. <li>
  188. <div className={styles.value}>{data?.elec}</div>
  189. <div className={styles.btn1}>用电量</div>
  190. </li>
  191. </ul>
  192. </Box>
  193. );
  194. };
  195. // 药耗监测
  196. const Medicine = () => {
  197. const { projectId } = useParams();
  198. const time = dayjs().format('YYYY-MM');
  199. const { data } = useRequest(getComparisonData, {
  200. defaultParams: [
  201. {
  202. project_id: projectId,
  203. start: time,
  204. end: time,
  205. type: 1,
  206. flag: 1,
  207. },
  208. ],
  209. formatResult(res) {
  210. return res[0];
  211. },
  212. });
  213. return (
  214. <Box
  215. title="药耗监测"
  216. onClick={() => UnityAction.sendMsg('menuItem', '药耗监测')}
  217. >
  218. <ul>
  219. <li>
  220. <div className={styles.value}>{data?.value?.toFixed(2) || '-'}元</div>
  221. <div className={styles.btn1}>当月吨水药成本</div>
  222. </li>
  223. </ul>
  224. </Box>
  225. );
  226. };
  227. // 工艺监控
  228. const Scada = () => {
  229. const { projectId } = useParams();
  230. const { data } = useRequest(getScadaPage, {
  231. defaultParams: [{ project_id: projectId }],
  232. formatResult: (res) => {
  233. let domain = location.host.includes('pad.greentech.com.cn')
  234. ? 'https://metawant.greentech.com.cn/'
  235. : 'http://47.96.12.136:8788/';
  236. const token = getToken();
  237. const pageList = res?.filter((item) => item.hide);
  238. const urls = pageList.map(
  239. (item) =>
  240. `${domain}smart-water/scada/index.html#/3dview/${projectId}/${item.id}?JWT-TOKEN=${token}&hideTitle=true`,
  241. );
  242. return urls.splice(0, 1);
  243. },
  244. });
  245. return (
  246. <Box
  247. title="工艺监控"
  248. onClick={() => UnityAction.sendMsg('menuItem', '工艺监控')}
  249. >
  250. <div className={styles.scada} style={{ width: '540px', height: '270px' }}>
  251. {data?.map((url) => (
  252. <iframe style={{ width: '540px', height: '270px' }} src={url} />
  253. ))}
  254. <div className={styles.mask}></div>
  255. </div>
  256. </Box>
  257. );
  258. };
  259. // 待办事项
  260. const Backlog = (props) => {
  261. const { projectId } = useParams();
  262. const { data, loading } = useRequest(getPendingList, {
  263. defaultParams: [{ project_id: projectId }],
  264. });
  265. const handleClick = (item) => {
  266. if (item.type === 0) {
  267. // task
  268. UnityAction.sendMsg('OpenTaskModal', `mandate_id=${item.origin_id}`);
  269. } else {
  270. // order
  271. UnityAction.sendMsg(
  272. 'OpenWorkOrderModal',
  273. `order_id=${item.origin_id}&order_type=${item.origin_type}`,
  274. );
  275. }
  276. };
  277. return (
  278. <Box
  279. title={
  280. <div style={{ display: 'flex' }}>
  281. 待办事项
  282. {/* <div className={styles.count}>{data?.length || 0}</div> */}
  283. </div>
  284. }
  285. onClick={() => UnityAction.sendMsg('menuItem', '待办事项')}
  286. >
  287. <div className={styles.backlog}>
  288. <div>
  289. {data?.map((item) => (
  290. <div
  291. className={styles.item}
  292. onClick={(e) => {
  293. e.stopPropagation();
  294. handleClick(item);
  295. }}
  296. >
  297. <div className={styles.createTime}>{item.time}</div>
  298. <div className={styles.titleCon}>
  299. <div className={styles.point} />
  300. <div className={styles.titleText}>{item.title}</div>
  301. </div>
  302. <div className={styles.bottomCon}>{item.content}</div>
  303. </div>
  304. ))}
  305. </div>
  306. </div>
  307. </Box>
  308. );
  309. };
  310. const Box = ({ title, children, onClick, small }) => {
  311. return (
  312. <div
  313. className={`${styles.box} ${small ? '' : styles.boxH}`}
  314. onClick={onClick}
  315. >
  316. <div className={styles.titleContent}>
  317. <div className={styles.line} />
  318. <div className={styles.boxTitle}>{title}</div>
  319. </div>
  320. {/* <span className={styles.boxTitle}>
  321. <div className={styles.line}></div>
  322. {title}
  323. </span> */}
  324. {children}
  325. </div>
  326. );
  327. };
  328. export default HomePage;