CostAnalysis.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import ChartModule from '@/components/ManagementPage/chartModule';
  2. import {
  3. queryEnergyChartList,
  4. queryProcessSection,
  5. } from '@/services/OperationManagement';
  6. import { useParams, useRequest } from '@umijs/max';
  7. import { Button, DatePicker, Table } from 'antd';
  8. import dayjs from 'dayjs';
  9. import SubTitle from '../../components/SubTitle';
  10. import styles from './CostAnalysis.less';
  11. const { RangePicker } = DatePicker;
  12. const CostAnalysis = () => {
  13. const { projectId } = useParams();
  14. const defaultTime = {
  15. s_time: dayjs().subtract(7, 'day').format('YYYY-MM-DD 00:00:00'),
  16. e_time: dayjs().format('YYYY-MM-DD 23:59:59'),
  17. };
  18. const columns = [
  19. {
  20. title: '时间',
  21. dataIndex: 'data_time',
  22. },
  23. {
  24. title: '能耗(kWh)',
  25. dataIndex: 'electric',
  26. },
  27. {
  28. title: '药耗(kg)',
  29. dataIndex: 'medicine',
  30. },
  31. {
  32. title: '进水水量(t)',
  33. dataIndex: 'waterIn',
  34. },
  35. {
  36. title: '出水水量(t)',
  37. dataIndex: 'waterOut',
  38. },
  39. ];
  40. const { data, loading, run } = useRequest(
  41. (date) =>
  42. queryEnergyChartList({
  43. project_id: Number(projectId),
  44. start_time: date.s_time,
  45. end_time: date.e_time,
  46. order: 1,
  47. }),
  48. {
  49. defaultParams: [{ ...defaultTime }],
  50. formatResult: (data) => {
  51. const tempData = data.data;
  52. const arr = Object.values(tempData).find((arr) => arr);
  53. return {
  54. chartData: {
  55. yName: ['药耗(kg)', '能耗(kWh)', '水量(t)'],
  56. xData: arr?.map((item) => item.data_time),
  57. dataList: [
  58. {
  59. type: 0,
  60. name: '能耗',
  61. yIndex: 1,
  62. data: tempData.electric?.map((item) => item.value),
  63. },
  64. {
  65. type: 0,
  66. name: '药耗',
  67. data: tempData.medicine?.map((item) => item.value),
  68. },
  69. {
  70. type: 0,
  71. name: '进水水量',
  72. yIndex: 2,
  73. data: tempData.waterIn?.map((item) => item.value),
  74. },
  75. {
  76. type: 2,
  77. name: '出水水量',
  78. yIndex: 2,
  79. data: tempData.waterOut?.map((item) => item.value),
  80. },
  81. ],
  82. },
  83. tableData: tempData?.electric?.map((item, idx) => {
  84. return {
  85. key: `analy_table_${idx}`,
  86. // value: item.value?.toFixed(2) | '-',
  87. data_time: item.data_time,
  88. electric: formatElcData(tempData?.electric, item?.data_time),
  89. medicine:
  90. tempData.medicine
  91. ?.find((cur) => cur.data_time === item.data_time)
  92. ?.value?.toFixed(2) || '-',
  93. waterIn:
  94. tempData.waterIn
  95. ?.find((cur) => cur.data_time === item.data_time)
  96. ?.value?.toFixed(2) || '-',
  97. waterOut:
  98. tempData.waterOut
  99. ?.find((cur) => cur.data_time === item.data_time)
  100. ?.value?.toFixed(2) || '-',
  101. };
  102. }),
  103. };
  104. },
  105. },
  106. );
  107. const ProcessSectionRequest = useRequest(queryProcessSection, {
  108. manual: true,
  109. onSuccess: (data) => {
  110. if (data.length > 0) {
  111. let section;
  112. section = data[0];
  113. setTitle(section.name);
  114. }
  115. },
  116. });
  117. const formatElcData = (data, data_time) => {
  118. const value = data?.find((cur) => cur.data_time == data_time)?.value;
  119. return value === 0 ? '-' : value.toFixed(2);
  120. };
  121. const handleTimeRangeChange = (range) => {
  122. if (range?.length === 2) {
  123. run({
  124. s_time: dayjs(range[0]).format('YYYY-MM-DD 00:00:00'),
  125. e_time: dayjs(range[1]).format('YYYY-MM-DD HH:mm:ss'),
  126. });
  127. } else {
  128. run(defaultTime);
  129. }
  130. };
  131. const handleTimeBTNClick = (unit) => {
  132. run({
  133. s_time: dayjs().subtract(1, unit).format('YYYY-MM-DD 00:00:00'),
  134. e_time: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  135. });
  136. };
  137. return (
  138. <div className="card-box" style={{ padding: '0.2rem' }}>
  139. <div>
  140. <SubTitle title={'数据曲线'} fontSize="0.26rem" />
  141. <div className={styles.timeBtn}>
  142. <RangePicker inputReadOnly onChange={handleTimeRangeChange} />
  143. <Button
  144. type="primary"
  145. shape="round"
  146. onClick={() => {
  147. handleTimeBTNClick('day');
  148. }}
  149. >
  150. 近一天
  151. </Button>
  152. <Button
  153. type="primary"
  154. shape="round"
  155. onClick={() => {
  156. handleTimeBTNClick('week');
  157. }}
  158. >
  159. 近一周
  160. </Button>
  161. <Button
  162. type="primary"
  163. shape="round"
  164. onClick={() => {
  165. handleTimeBTNClick('month');
  166. }}
  167. >
  168. 近一个月
  169. </Button>
  170. </div>
  171. <div
  172. style={{
  173. height: '3.5rem',
  174. marginBottom: '0.1rem',
  175. padding: '0.2rem 0',
  176. }}
  177. >
  178. {data?.chartData && (
  179. <ChartModule {...data.chartData} legend={{ right: '30%' }} />
  180. )}
  181. </div>
  182. </div>
  183. <div style={{ marginTop: '0.2rem' }}>
  184. <SubTitle title={'数据列表'} fontSize="0.26rem" />
  185. <Table
  186. loading={loading}
  187. columns={columns}
  188. dataSource={data?.tableData?.sort((a, b) =>
  189. b?.data_time?.localeCompare(a?.data_time),
  190. )}
  191. />
  192. </div>
  193. </div>
  194. );
  195. };
  196. export default CostAnalysis;