LiquidLevelCom.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. import TabsContent from '@/components/TabsContent';
  2. import ThresholdDetail from '@/components/ThresholdDetail';
  3. import { Popover, Table } from 'antd';
  4. import dayjs from 'dayjs';
  5. import { useEffect, useMemo, useState } from 'react';
  6. import styles from '../PatrolReportDetail.less';
  7. import Empty from './Empty';
  8. export default function LiquidLevelCom(props) {
  9. const {
  10. sendMessageToUnity,
  11. select,
  12. allData,
  13. type,
  14. statusCheck,
  15. changeStatus,
  16. } = props;
  17. const [activeKey, setActiveKey] = useState('1');
  18. const handleTabsChange = (activeKey) => {
  19. setActiveKey(activeKey);
  20. };
  21. const { errorTableData, normalData } = useMemo(() => {
  22. let data = { errorTableData: [], normalData: [] };
  23. allData?.forEach((item) => {
  24. if (item.status == 1 && statusCheck.includes(1)) {
  25. data.errorTableData.push(item);
  26. } else if (item.status == 0 && statusCheck.includes(0)) {
  27. data.normalData.push(item);
  28. }
  29. });
  30. return data;
  31. }, [statusCheck, allData]);
  32. const items = useMemo(() => {
  33. let items = [];
  34. let showAllTabs = statusCheck.length == 3;
  35. if (showAllTabs || errorTableData.length > 0) {
  36. items.push({
  37. key: '1',
  38. label: `异常(${errorTableData.length || 0})`,
  39. children: <div></div>,
  40. });
  41. }
  42. if (showAllTabs || normalData.length > 0) {
  43. items.push({
  44. key: '0',
  45. label: `历史记录(${normalData.length || 0})`,
  46. children: <div></div>,
  47. });
  48. }
  49. return items;
  50. }, [statusCheck, allData]);
  51. useEffect(() => {
  52. if (items.length == 0) {
  53. changeStatus(0);
  54. } else {
  55. setActiveKey(items[0].key);
  56. changeStatus(1);
  57. }
  58. }, [items]);
  59. const content = (
  60. <div className={styles.popoverContent}>
  61. <p>固定液位1为H1,固定液位2为H2,实际液位为H实</p>
  62. <p>液位差值:液位标准值(H1)与液位实际值(H2)的差值</p>
  63. <p>液位差比值:H1标准值与实际值的差值与H2的标准值与实际值的差值的比值</p>
  64. </div>
  65. );
  66. if (items.length == 0) return null;
  67. return (
  68. <div className={styles.detailCard}>
  69. <div className={styles.tableTop}>
  70. <div className={styles.tipTitle}>
  71. 液位校验
  72. <Popover content={content}>
  73. <i></i>
  74. </Popover>
  75. </div>
  76. <TabsContent
  77. active={activeKey}
  78. onChange={handleTabsChange}
  79. small
  80. items={items}
  81. ></TabsContent>
  82. </div>
  83. {activeKey === '1' && (
  84. <LiquidTable
  85. onClickItem={sendMessageToUnity}
  86. select={select}
  87. items={errorTableData}
  88. key={type}
  89. type={type}
  90. />
  91. )}
  92. {activeKey === '0' && (
  93. <LiquidTable
  94. onClickItem={sendMessageToUnity}
  95. select={select}
  96. items={normalData}
  97. key={type}
  98. type={type}
  99. />
  100. )}
  101. </div>
  102. );
  103. }
  104. function LiquidTable(props) {
  105. const { items } = props;
  106. const columns = [
  107. {
  108. title: '设备名称',
  109. width: '12%',
  110. dataIndex: 'device_name',
  111. },
  112. {
  113. title: '时间',
  114. dataIndex: 'record_time',
  115. render: (text) => {
  116. if (text) {
  117. return dayjs(text).format('YYYY.MM.DD HH:mm');
  118. }
  119. return '-';
  120. },
  121. },
  122. {
  123. title: '类型',
  124. key: 'template_item_name',
  125. dataIndex: 'template_item_name',
  126. },
  127. {
  128. title: '液位数',
  129. dataIndex: 'origin_value',
  130. },
  131. {
  132. title: '差值/比值',
  133. dataIndex: 'value',
  134. },
  135. {
  136. title: '设定值范围',
  137. width: '18%',
  138. render: (record) => (
  139. <ThresholdDetail
  140. current={record.value || 0}
  141. data={{
  142. JsonNumThreshold: record?.json_num_threshold,
  143. Type: record.type || 2,
  144. }}
  145. />
  146. ),
  147. },
  148. {
  149. title: '状态',
  150. dataIndex: 'status',
  151. width: '1.25rem',
  152. render: (status) => {
  153. switch (status) {
  154. case -1:
  155. case 0:
  156. return (
  157. <div>
  158. <i
  159. className={styles.iconStatus}
  160. style={{ background: '#12CEB3' }}
  161. ></i>
  162. 正常
  163. </div>
  164. );
  165. case 1:
  166. return (
  167. <div>
  168. <i
  169. className={styles.iconStatus}
  170. style={{ background: '#FFE26D' }}
  171. ></i>
  172. 异常
  173. </div>
  174. );
  175. case 2:
  176. return (
  177. <div>
  178. <i
  179. className={styles.iconStatus}
  180. style={{ background: '#FFE26D' }}
  181. ></i>
  182. 警告
  183. </div>
  184. );
  185. }
  186. },
  187. },
  188. ];
  189. return (
  190. <Table
  191. columns={columns}
  192. dataSource={items}
  193. rowKey="device_code"
  194. locale={{
  195. emptyText: <Empty />,
  196. }}
  197. pagination={false}
  198. />
  199. );
  200. }