ChartPage.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. import ChartModule from '@/components/ManagementPage/chartModule';
  2. import PageContent from '@/components/PageContent';
  3. import { getDeviceRealDataByTime } from '@/services/SmartOps';
  4. import { useParams, useSearchParams } from '@umijs/max';
  5. import { Button, DatePicker, Empty, Form, Spin } from 'antd';
  6. import dayjs from 'dayjs';
  7. import { useEffect, useState } from 'react';
  8. import styles from './index.less';
  9. const { RangePicker } = DatePicker;
  10. const tabs = [
  11. {
  12. label: '近一天',
  13. value: 24,
  14. timeRange: [dayjs().subtract(1, 'day'), dayjs()],
  15. },
  16. {
  17. label: '近一周',
  18. value: 24 * 7,
  19. timeRange: [dayjs().subtract(7, 'day'), dayjs()],
  20. },
  21. {
  22. label: '近一个月',
  23. value: 24 * 30,
  24. timeRange: [dayjs().subtract(1, 'month'), dayjs()],
  25. },
  26. ];
  27. const ChartPage = (props) => {
  28. const {
  29. // location: {
  30. // query: { type = 2, data },
  31. // },
  32. } = props;
  33. const { projectId } = useParams();
  34. const [searchParams, setSearchParams] = useSearchParams();
  35. const type = searchParams.get('type') || 2;
  36. const data = searchParams.get('data');
  37. const deviceCode = searchParams.get('device_code');
  38. const [loading, setLoading] = useState(false);
  39. const [options, setOptions] = useState({});
  40. const [timeActive, setTimeActive] = useState(0);
  41. const [timeRange, setTimeRange] = useState([
  42. dayjs().subtract(1, 'day'),
  43. dayjs(),
  44. ]);
  45. const defaultSearch = {
  46. deviceid: '',
  47. dataitemid: '',
  48. project_id: projectId,
  49. stime: dayjs().subtract(1, 'day').valueOf(),
  50. etime: dayjs().valueOf(),
  51. size: 10,
  52. interval: 'minute',
  53. aggregator: 'realtime',
  54. };
  55. const changeTime = async (timeType, date) => {
  56. const values = { ...defaultSearch };
  57. let diffDay;
  58. // values.timeType = timeType;
  59. if (date) {
  60. const [startDate, endDate] = date;
  61. values.etime = endDate * 1;
  62. values.stime = startDate * 1;
  63. diffDay = endDate.diff(startDate, 'days');
  64. } else {
  65. let currentDate = dayjs();
  66. values.etime = currentDate * 1;
  67. values.stime = currentDate.subtract(timeType, 'hour') * 1;
  68. diffDay = (timeType / 24).toFixed(0);
  69. }
  70. if (diffDay >= 15 && diffDay < 30) {
  71. // 15-30天 时间间隔不能为分钟
  72. values.interval = 'h';
  73. values.size = 1;
  74. } else if (diffDay >= 30) {
  75. // 超过30天 时间间隔只能为天
  76. values.interval = 'day';
  77. values.size = 1;
  78. }
  79. setLoading(true);
  80. const list = JSON.parse(data);
  81. const paramsList = list?.map((item) => {
  82. return { ...values, ...item }; // deviceid: item.deviceid, dataitemid: item.dataitemid
  83. });
  84. getData(paramsList);
  85. };
  86. const handleTabChange = (tab) => {
  87. const params = { ...defaultSearch };
  88. switch (tab) {
  89. case 1: //日
  90. break;
  91. case 2: //月
  92. params.size = 1;
  93. params.interval = 'h';
  94. params.stime = dayjs().subtract(1, 'month').valueOf();
  95. params.etime = dayjs().valueOf();
  96. break;
  97. case 3: //年
  98. params.size = 1;
  99. params.interval = 'day';
  100. params.stime = dayjs().subtract(1, 'year').valueOf();
  101. params.etime = dayjs().valueOf();
  102. break;
  103. }
  104. const list = JSON.parse(data);
  105. const paramsList = list?.map((item) => {
  106. return {
  107. ...params,
  108. deviceid: item.deviceid,
  109. dataitemid: item.dataitemid,
  110. };
  111. });
  112. getData(paramsList);
  113. };
  114. useEffect(() => {
  115. handleTabChange(1);
  116. }, []);
  117. const getData = async (list) => {
  118. if (!list) return;
  119. const data = await Promise.all(
  120. list?.map((item) => {
  121. return getDeviceRealDataByTime(item).then((res) => res.data);
  122. }),
  123. );
  124. setLoading(false);
  125. const options = {
  126. yName: '',
  127. xData: data.length > 0 && data[0]?.map((item) => item.htime_at),
  128. dataList: data?.map((item) => {
  129. return {
  130. type: 0,
  131. name: item?.[0]?.name,
  132. data: item?.map((item) => item.val * 1),
  133. };
  134. }),
  135. };
  136. // console.log(options);
  137. if (
  138. options.dataList?.every((item) => !item.data || item.data.length == 0)
  139. ) {
  140. setOptions(null);
  141. } else {
  142. setOptions(options);
  143. }
  144. };
  145. return (
  146. <PageContent closeable={false}>
  147. <div
  148. style={{
  149. display: 'flex',
  150. alignItems: 'center',
  151. justifyContent: 'space-between',
  152. }}
  153. >
  154. <div className={styles.form}>
  155. <Form.Item style={{ marginBottom: 0 }}>
  156. <RangePicker
  157. value={timeRange}
  158. showTime={false}
  159. inputReadOnly
  160. disabledDate={(current) =>
  161. current && current > dayjs().endOf('day')
  162. }
  163. onChange={(date) => {
  164. setTimeRange(date);
  165. setTimeActive(null);
  166. changeTime(-1, date);
  167. }}
  168. allowClear={false}
  169. />
  170. </Form.Item>
  171. <div>
  172. {tabs.map((item, index) => (
  173. <Button
  174. key={item.type}
  175. type="primary"
  176. className={
  177. timeActive == index ? styles.btnSelect : styles.btnDate
  178. }
  179. onClick={() => {
  180. setTimeActive(index);
  181. changeTime(item.value);
  182. setTimeRange(item.timeRange);
  183. }}
  184. >
  185. {item.label}
  186. </Button>
  187. ))}
  188. </div>
  189. </div>
  190. </div>
  191. <Spin spinning={loading}>
  192. <div style={{ height: 'calc(100vh - 1rem)' }}>
  193. {options ? (
  194. <ChartModule chartType="line" {...options} />
  195. ) : (
  196. <Empty style={{ marginTop: '0.4rem' }} />
  197. )}
  198. </div>
  199. </Spin>
  200. </PageContent>
  201. );
  202. };
  203. export default ChartPage;