Analysis.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. const itemIndex = data?.findIndex((item) => item.type == tab);
  101. const item = data[itemIndex]?.data?.find(
  102. (item) => item.DeviceCode == e,
  103. );
  104. if (item) {
  105. const dom = document.querySelector(`tr[data-row-key="${item.index}"]`);
  106. if (dom) {
  107. let v = document.getElementsByClassName('ant-table-body')[itemIndex];
  108. v.scrollTop = dom.offsetTop;
  109. }
  110. }
  111. };
  112. const data = useMemo(() => {
  113. return Status.map((item, idx) => {
  114. const data = list?.filter((cur) => cur.grade_alarm == item.type);
  115. return { ...item, data };
  116. });
  117. }, [list]);
  118. const handleBtnClick = (plcs, title) => {
  119. if (!plcs) return;
  120. const msg = JSON.stringify(plcs); //[{ dataitemid: 'Raw_Water_Tank_Level', deviceid: '1436022785' }]
  121. // router.push(`/unity/smart-ops/chart-page/46?type=2&data=${msg}`);
  122. UnityAction.sendMsg(
  123. 'ProcessAnalysisAbout',
  124. JSON.stringify({
  125. title,
  126. data: msg,
  127. }),
  128. );
  129. };
  130. const onTabChange = (tab) => {
  131. setTab(tab);
  132. setSelectedRowKeys(null);
  133. UnityAction.sendMsg('ProcessAnalysisType', tab);
  134. };
  135. // const rowSelection = {
  136. // type: 'radio',
  137. // selectedRowKeys,
  138. // onChange: (selectedRowKeys, selectedRows) => {
  139. // setSelectedRowKeys(selectedRowKeys);
  140. // UnityAction.sendMsg('SynDev', selectedRows[0].DeviceCode);
  141. // },
  142. // };
  143. const onSelectRow = (record, index) => {
  144. // const selectedList = [...selectedRowKeys];
  145. // if (selectedList[0] === index) return;
  146. // selectedList[0] = index;
  147. setSelectedRowKeys(index);
  148. UnityAction.sendMsg('SynDev', record.DeviceCode);
  149. };
  150. const setRowClassName = (record, index) => {
  151. if (!selectedRowKeys && selectedRowKeys !== 0) return;
  152. if (selectedRowKeys == index || selectedRowKeys == record.DeviceCode) {
  153. return styles.tableSelect;
  154. }
  155. };
  156. return (
  157. <Spin spinning={loading}>
  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. </Spin>
  185. );
  186. };
  187. export default connect(({ smartOps, loading }) => ({
  188. loading: loading.effects['smartOps/queryList'],
  189. list: smartOps.list.list,
  190. processList: smartOps.processList,
  191. }))(Analysis);