ChartPage.js 5.6 KB

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