Analysis.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import TabsContent from '@/components/TabsContent';
  2. import { UnityAction } from '@/utils/utils';
  3. import { connect } from '@umijs/max';
  4. import { Button, Spin, Table, Tabs } from 'antd';
  5. import { useEffect, useMemo, useState } from 'react';
  6. import ThresholdBar from './components/ThresholdBar';
  7. import styles from './index.less';
  8. const { TabPane } = Tabs;
  9. const Analysis = (props) => {
  10. const Status = [
  11. { name: '异常', type: '1', data: [] },
  12. { name: '警告', type: '2', data: [] },
  13. { name: '提醒', type: '3', data: [] },
  14. ];
  15. const { list = [], processList, loading } = props;
  16. const [selectedRowKeys, setSelectedRowKeys] = useState();
  17. const [tab, setTab] = useState('1');
  18. const columns = [
  19. {
  20. title: '设备名称',
  21. width: '20%',
  22. render: (record) => (
  23. <div>
  24. {record.DeviceName}({record.DeviceCode})
  25. </div>
  26. ),
  27. },
  28. {
  29. title: '工艺单元',
  30. width: '14%',
  31. dataIndex: 'ProcessSectionId',
  32. render: (id) => {
  33. return processList.find((item) => item.id == id)?.name;
  34. },
  35. },
  36. {
  37. title: '阈值范围',
  38. width: '14%',
  39. render: (record) => {
  40. // let thresholds = [-3,4,6,1];
  41. let thresholds = record.fault_range.split(',');
  42. return (
  43. <div>
  44. {record.fault_range && (
  45. <ThresholdBar
  46. current={record.fault_result}
  47. thresholds={thresholds}
  48. />
  49. )}
  50. {record.plcs && (
  51. <Button
  52. type="primary"
  53. className={styles.anaBtn}
  54. onClick={() =>
  55. handleBtnClick(
  56. record.plcs,
  57. record.DeviceName || record.DeviceCode,
  58. )
  59. }
  60. >
  61. 相关性分析
  62. </Button>
  63. )}
  64. </div>
  65. );
  66. },
  67. },
  68. {
  69. title: '可能原因',
  70. width: '20%',
  71. dataIndex: 'Reason',
  72. },
  73. {
  74. title: '解决方案',
  75. render: (record) => {
  76. if (record.FixPlan instanceof Array) {
  77. return (
  78. <div>
  79. {record.FixPlan.map((item) => (
  80. <div>
  81. {item.content}
  82. <br />
  83. </div>
  84. ))}
  85. </div>
  86. );
  87. } else {
  88. return record.FixPlan;
  89. }
  90. },
  91. },
  92. ];
  93. useEffect(() => {
  94. UnityAction.on('SynDev', selectedItem);
  95. return () => UnityAction.off('SynDev', selectedItem);
  96. }, [data, tab]);
  97. const selectedItem = (e) => {
  98. setSelectedRowKeys(e);
  99. console.log(data);
  100. // alert(e)
  101. const itemIndex = data?.findIndex((item) => item.type == tab);
  102. const item = data[itemIndex]?.data?.find((item) => item.DeviceCode == e);
  103. if (item) {
  104. const dom = document.querySelector(`tr[data-row-key="${item.index}"]`);
  105. if (dom) {
  106. let v = document.getElementsByClassName('ant-table-body')[itemIndex];
  107. v.scrollTop = dom.offsetTop;
  108. }
  109. }
  110. };
  111. const data = useMemo(() => {
  112. return Status.map((item, idx) => {
  113. const data = list?.filter((cur) => cur.grade_alarm == item.type);
  114. return { ...item, data };
  115. });
  116. }, [list]);
  117. const handleBtnClick = (plcs, title) => {
  118. if (!plcs) return;
  119. const msg = JSON.stringify(plcs); //[{ dataitemid: 'Raw_Water_Tank_Level', deviceid: '1436022785' }]
  120. // router.push(`/unity/smart-ops/chart-page/46?type=2&data=${msg}`);
  121. UnityAction.sendMsg(
  122. 'ProcessAnalysisAbout',
  123. JSON.stringify({
  124. title,
  125. data: msg,
  126. }),
  127. );
  128. };
  129. const onTabChange = (tab) => {
  130. setTab(tab);
  131. setSelectedRowKeys(null);
  132. UnityAction.sendMsg('ProcessAnalysisType', tab);
  133. };
  134. // const rowSelection = {
  135. // type: 'radio',
  136. // selectedRowKeys,
  137. // onChange: (selectedRowKeys, selectedRows) => {
  138. // setSelectedRowKeys(selectedRowKeys);
  139. // UnityAction.sendMsg('SynDev', selectedRows[0].DeviceCode);
  140. // },
  141. // };
  142. const onSelectRow = (record, index) => {
  143. // const selectedList = [...selectedRowKeys];
  144. // if (selectedList[0] === index) return;
  145. // selectedList[0] = index;
  146. setSelectedRowKeys(index);
  147. UnityAction.sendMsg('SynDev', record.DeviceCode);
  148. };
  149. const setRowClassName = (record, index) => {
  150. if (!selectedRowKeys && selectedRowKeys !== 0) return;
  151. if (selectedRowKeys == index || selectedRowKeys == record.DeviceCode) {
  152. return styles.tableSelect;
  153. }
  154. };
  155. return (
  156. <Spin spinning={loading}>
  157. <div style={{ height: 'calc(100vh - 5.6rem)', overflow: 'auto' }}>
  158. <TabsContent
  159. small={true}
  160. center={false}
  161. defaultActiveKey="1"
  162. items={data?.map((item) => {
  163. return {
  164. label: `${item.name}(${item.data?.length || 0})`,
  165. key: item.type,
  166. children: (
  167. <Table
  168. dataSource={item.data}
  169. columns={columns}
  170. rowKey={'index'}
  171. // rowSelection={rowSelection}
  172. rowClassName={setRowClassName}
  173. onRow={(record, index) => ({
  174. onClick: () => onSelectRow(record, index),
  175. })}
  176. pagination={false}
  177. scroll={{ y: document.body.clientHeight - 730 }}
  178. />
  179. ),
  180. };
  181. })}
  182. onChange={onTabChange}
  183. />
  184. </div>
  185. </Spin>
  186. );
  187. };
  188. export default connect(({ smartOps, loading }) => ({
  189. loading: loading.effects['smartOps/queryList'],
  190. list: smartOps.list.list,
  191. processList: smartOps.processList,
  192. }))(Analysis);