index.js 8.0 KB

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