QualityMng.js 6.1 KB

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