QualityMng.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. //水质管理
  2. import ChartModule from '@/components/ManagementPage/chartModule';
  3. // import SearchModule from '@/components/ManagementPage/searchModule';
  4. import PageContent from '@/components/PageContent';
  5. import PageTitle from '@/components/PageTitle';
  6. import {
  7. queryChartListByCode,
  8. queryProcessSection,
  9. querySectionCode,
  10. } from '@/services/OperationManagement';
  11. import { queryConditionSnapshot } from '@/services/SmartOps';
  12. import { UnityAction } from '@/utils/utils';
  13. import { useParams, useRequest } from '@umijs/max';
  14. import { Empty, Select, Spin, Table } from 'antd';
  15. import dayjs from 'dayjs';
  16. import { useEffect, useMemo, useRef, useState } from 'react';
  17. import SubTitle from '../SmartOps/components/SubTitle';
  18. import { getValue } from './index';
  19. import styles from './index.less';
  20. function Quality() {
  21. return (
  22. <PageContent closeable={false}>
  23. <PageTitle onReturn={() => UnityAction.sendMsg('menuItem', '首页')}>
  24. 水质监测
  25. </PageTitle>
  26. <WaterQuality showTip />
  27. </PageContent>
  28. );
  29. }
  30. export default Quality;
  31. export const WaterQuality = ({ showTip = false }) => {
  32. const { projectId } = useParams();
  33. const [currentCode, setCode] = useState(null);
  34. const [processList, setProcessList] = useState([]);
  35. const timerRef = useRef({
  36. s_time: dayjs().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss'),
  37. e_time: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  38. });
  39. const { data: codeList, run: queryCodeList } = useRequest(querySectionCode, {
  40. manual: true,
  41. onSuccess(res) {
  42. if (res && res.length > 0) {
  43. setCode(res[0]);
  44. }
  45. },
  46. });
  47. // 获取工艺段列表
  48. useRequest(queryProcessSection, {
  49. defaultParams: [projectId],
  50. onSuccess(res) {
  51. setProcessList(res);
  52. queryCodeList(res[0].id, 2, projectId * 1);
  53. return res;
  54. },
  55. });
  56. const mainRes = useRequest(
  57. () => {
  58. return queryChartListByCode(
  59. {
  60. project_id: Number(projectId),
  61. start_time: timerRef.current.s_time,
  62. end_time: timerRef.current.e_time,
  63. },
  64. // codeList?.map((item) => item.metric_code),
  65. [currentCode.metric_code],
  66. );
  67. },
  68. {
  69. manual: true,
  70. },
  71. );
  72. const { data: snapshot } = useRequest(queryConditionSnapshot, {
  73. defaultParams: [{ project_id: projectId }],
  74. pollingInterval: 10 * 1000,
  75. });
  76. const status = useMemo(() => {
  77. switch (snapshot?.water_quality_status) {
  78. case 1:
  79. return '当前水质良好';
  80. case 2:
  81. return '当前水质较好';
  82. }
  83. }, [snapshot?.water_quality_status]);
  84. const column = useMemo(() => {
  85. if (!currentCode) return [];
  86. return [
  87. { title: '时间', dataIndex: 'time', width: '40%' },
  88. {
  89. title: currentCode.metric,
  90. dataIndex: currentCode.metric_code,
  91. },
  92. ];
  93. }, [currentCode]);
  94. //图表配置
  95. const chartProps = useMemo(() => {
  96. let xData = [],
  97. dataList = [];
  98. if (!mainRes.data || !currentCode) return;
  99. let yName = currentCode.metric;
  100. let data = [...mainRes.data].reverse();
  101. xData = data.map((item) => item.time);
  102. dataList.push({
  103. type: 0,
  104. name: currentCode.metric,
  105. data: data.map((item) => item[currentCode.metric_code]),
  106. });
  107. return {
  108. yName,
  109. xData,
  110. dataList,
  111. // typeList: codeList?.map((item) => item.metric),
  112. // currentType: currentCode.metric,
  113. };
  114. }, [mainRes.data, currentCode]);
  115. useEffect(() => {
  116. if (currentCode) {
  117. mainRes.run();
  118. }
  119. }, [currentCode]);
  120. const onChange = (name) => {
  121. const code = codeList.find((item) => item.metric == name);
  122. if (code) setCode(code);
  123. };
  124. const handleProcessChange = (val) => {
  125. queryCodeList(val, 2, projectId);
  126. };
  127. return (
  128. <div style={{ marginTop: '0.1rem', position: 'relative' }}>
  129. {showTip && <div className={styles.pageTip}>{status}</div>}
  130. <div className="card-box">
  131. <ul className={styles.pageTop}>
  132. <li>
  133. <div className={styles.pageTopValue}>
  134. {getValue(snapshot?.dtds)}
  135. </div>
  136. <div>外供水电导率(µs/cm)</div>
  137. </li>
  138. <li>
  139. <div className={styles.pageTopValue}>{getValue(snapshot?.dph)}</div>
  140. <div>外供水(PH)</div>
  141. </li>
  142. </ul>
  143. </div>
  144. <div className="card-box" style={{ padding: '0.2rem' }}>
  145. <div style={{ padding: '0.2rem 0' }}>
  146. <Select
  147. style={{ width: '2rem' }}
  148. defaultValue="全厂概览"
  149. options={processList?.map((item) => {
  150. return {
  151. value: item.id,
  152. label: item.name,
  153. };
  154. })}
  155. onChange={handleProcessChange}
  156. />
  157. </div>
  158. {codeList?.length > 0 && (
  159. <div className="tabs" style={{ marginBottom: '0.2rem' }}>
  160. {codeList?.map((item) => (
  161. <div
  162. key={item.metric_code}
  163. onClick={() => {
  164. setCode(item);
  165. }}
  166. className={`tabs-item ${item === currentCode ? 'active' : ''}`}
  167. >
  168. {item.metric}
  169. </div>
  170. ))}
  171. </div>
  172. )}
  173. <SubTitle title="数据曲线" />
  174. <Spin spinning={mainRes.loading}>
  175. <div style={{ height: '5rem', marginTop: '0.2rem' }}>
  176. {mainRes?.data ? (
  177. <ChartModule {...chartProps} onChange={onChange} />
  178. ) : (
  179. <Empty />
  180. )}
  181. </div>
  182. </Spin>
  183. <div style={{ marginTop: '0.3rem' }}>
  184. <SubTitle title="数据列表" />
  185. <Table
  186. columns={column}
  187. style={{ marginTop: '0.2rem' }}
  188. dataSource={mainRes?.data}
  189. pagination={false}
  190. />
  191. </div>
  192. </div>
  193. </div>
  194. );
  195. };