Detail.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. import ModuleTitle from '@/components/ManagementPage/moduleTitle';
  2. import { getDumuDetail } from '@/services/eqSelfInspection';
  3. import { connect, useModel, useParams, useRequest } from '@umijs/max';
  4. import { Affix, Checkbox, Col, Row, Spin, Table } from 'antd';
  5. import { useEffect, useMemo, useState } from 'react';
  6. import styles from './PatrolReportDetail.less';
  7. import DosingFlowCom from './Table/DosingFlowCom';
  8. import Empty from './Table/Empty';
  9. import LiquidLevelCom from './Table/LiquidLevelCom';
  10. import MandateBtn from './Table/MandateBtn';
  11. import PressureGaugeCom from './Table/PressureGaugeCom';
  12. import ReportCom from './Table/ReportCom';
  13. import ReportDumCom from './Table/ReportDumCom';
  14. import WaterInCom from './Table/WaterInCom';
  15. import WaterQualityCom from './Table/WaterQualityCom';
  16. function Detail(props) {
  17. const { data, userList, projectId, dispatch, loading = false } = props;
  18. const { routeId } = useParams();
  19. const { queryMandate } = useModel('useMandate');
  20. const [select, setSelect] = useState();
  21. const [statusCheck, setStatusCheck] = useState([0, 1, 2]);
  22. const sendMessageToUnity = (select, data) => {
  23. setSelect(select);
  24. if (window.HightlightEquipment) {
  25. window.HightlightEquipment(data);
  26. }
  27. };
  28. const result = useMemo(() => {
  29. var resultArr = [];
  30. var tempResult = data?.PatrolResult;
  31. var tempArr = tempResult?.split(';');
  32. const getTextColor = (status) => {
  33. switch (status) {
  34. case '警告':
  35. return {
  36. color: '#FFE26D',
  37. className: styles.warn,
  38. };
  39. case '异常':
  40. return {
  41. color: '#FE5850',
  42. className: styles.error,
  43. };
  44. default:
  45. return {
  46. color: '#12CEB3',
  47. className: '',
  48. };
  49. }
  50. };
  51. if (tempArr?.length > 0) {
  52. tempArr?.forEach((item, index) => {
  53. var tempItem = item;
  54. var itemSplit = tempItem.split(':');
  55. if (itemSplit?.length > 1) {
  56. var label = '';
  57. var value = itemSplit[1];
  58. if (index === 0) label = '设备自检';
  59. else if (index === 1) label = '工艺自检';
  60. else {
  61. label = '安全自检';
  62. value =
  63. data?.secureStatus === 0
  64. ? itemSplit[1] !== '异常'
  65. ? '正常'
  66. : '异常'
  67. : '异常';
  68. }
  69. resultArr.push({
  70. ...getTextColor(value),
  71. label,
  72. value,
  73. });
  74. }
  75. });
  76. }
  77. return resultArr;
  78. }, [data]);
  79. useEffect(() => {
  80. queryMandate({
  81. project_id: projectId,
  82. id: routeId,
  83. });
  84. dispatch({
  85. type: 'eqSelfInspection/fetchUserList',
  86. payload: {
  87. projectId,
  88. },
  89. });
  90. }, []);
  91. return (
  92. <Spin spinning={loading}>
  93. <Affix>
  94. <div className={styles.card}>
  95. <Row>
  96. <Col span={24} className={styles.cardText}>
  97. 自检时间:{data?.CreatedTime}
  98. </Col>
  99. </Row>
  100. <Row>
  101. <Col span={10} className={styles.cardText}>
  102. 自检路线:{data?.RouteInfo?.Name}
  103. </Col>
  104. <Col span={8} className={styles.cardText}>
  105. 工艺段:{data?.RouteInfo?.GroupID}
  106. </Col>
  107. </Row>
  108. <Row>
  109. {result.map((item, index) => (
  110. <Col span={index == 0 ? 10 : 7} className={styles.cardText}>
  111. {index == 0 && '自检结果:'}
  112. {item.label}-
  113. <span style={{ color: item.color }}>{item.value}</span>
  114. </Col>
  115. ))}
  116. </Row>
  117. </div>
  118. </Affix>
  119. <Checkbox.Group
  120. onChange={(check) => {
  121. // 未勾选则认为全部显示
  122. if (check.length == 0) {
  123. setStatusCheck([1, 2, 3]);
  124. } else {
  125. setStatusCheck(check);
  126. }
  127. }}
  128. style={{
  129. width: '70%',
  130. margin: '0 auto',
  131. display: 'flex',
  132. justifyContent: 'center',
  133. marginBottom: '0.3rem',
  134. }}
  135. >
  136. <Checkbox value={1}>异常数据</Checkbox>
  137. <Checkbox value={2} style={{ margin: '0 0.5rem' }}>
  138. 警告数据
  139. </Checkbox>
  140. <Checkbox value={0}>正常数据</Checkbox>
  141. </Checkbox.Group>
  142. {/* 设备自检报告 */}
  143. <DeviceReport
  144. sendMessageToUnity={sendMessageToUnity}
  145. select={select}
  146. data={data}
  147. userList={userList}
  148. statusCheck={statusCheck}
  149. />
  150. {/* 工艺自检报告 */}
  151. <AalysisTable
  152. onClickItem={sendMessageToUnity}
  153. select={select}
  154. data={data}
  155. statusCheck={statusCheck}
  156. />
  157. {/* 安全自检报告 */}
  158. <SecureReport
  159. sendMessageToUnity={sendMessageToUnity}
  160. select={select}
  161. data={data}
  162. userList={userList}
  163. statusCheck={statusCheck}
  164. />
  165. </Spin>
  166. );
  167. }
  168. function DeviceReport(props) {
  169. const { data } = props;
  170. // 子集是否显示
  171. const [subStatus, setSubStatus] = useState([1, 1, 1, 1, 1, 1]);
  172. const subProps = { ...props, setSubStatus };
  173. // 子集全部隐藏的情况下,父级也隐藏
  174. const show = useMemo(() => {
  175. let total = subStatus.reduce((item, total) => (total += item), 0);
  176. return total > 0;
  177. }, [subStatus]);
  178. const changeStatus = (type, status) => {
  179. setSubStatus((subStatus) => {
  180. let newSubStatus = [...subStatus];
  181. newSubStatus[type] = status;
  182. return newSubStatus;
  183. });
  184. };
  185. // if (!show) return null;
  186. return (
  187. <div style={{ display: show ? 'block' : 'none' }}>
  188. <ModuleTitle title="设备自检报告" />
  189. {/* 设备自检报告 */}
  190. <ReportCom
  191. {...subProps}
  192. allData={data?.extendWarningAllData}
  193. key="extend"
  194. type={'extend'}
  195. title={<div id="device">设备自检</div>}
  196. changeStatus={(status) => changeStatus(0, status)}
  197. ></ReportCom>
  198. {/* 液位校验 */}
  199. <LiquidLevelCom
  200. {...subProps}
  201. allData={data?.FluidLevelList}
  202. changeStatus={(status) => changeStatus(1, status)}
  203. />
  204. {/* 加药流量校验 */}
  205. <DosingFlowCom
  206. {...subProps}
  207. allData={data?.DrugFlowList}
  208. changeStatus={(status) => changeStatus(2, status)}
  209. />
  210. <WaterInCom
  211. {...subProps}
  212. allData={data?.WaterInCheckList}
  213. changeStatus={(status) => changeStatus(3, status)}
  214. />
  215. <PressureGaugeCom
  216. {...subProps}
  217. allData={data?.PressureCompareList}
  218. title="压力仪表校验"
  219. changeStatus={(status) => changeStatus(4, status)}
  220. />
  221. <WaterQualityCom
  222. {...subProps}
  223. allData={data?.WaterQualityCompareList}
  224. title="水质仪表校验"
  225. changeStatus={(status) => changeStatus(5, status)}
  226. />
  227. </div>
  228. );
  229. }
  230. function SecureReport(props) {
  231. const { data } = props;
  232. const [dumuList, setDumuList] = useState([]);
  233. // 子集是否显示
  234. const [subStatus, setSubStatus] = useState([1, 1, 1]);
  235. const subProps = { ...props, setSubStatus };
  236. // 子集全部隐藏的情况下,父级也隐藏
  237. const show = useMemo(() => {
  238. let total = subStatus.reduce((item, total) => (total += item), 0);
  239. return total > 0;
  240. }, [subStatus]);
  241. const changeStatus = (type, status) => {
  242. setSubStatus((subStatus) => {
  243. let newSubStatus = [...subStatus];
  244. newSubStatus[type] = status;
  245. return newSubStatus;
  246. });
  247. };
  248. const { run: detailRun } = useRequest(getDumuDetail, {
  249. manual: true,
  250. fetchKey: (id) => id,
  251. onSuccess: (data) => {
  252. var item = dumuList?.find((child) => child.id === data.id);
  253. if (item) {
  254. item.url = base64ToImageUrl(data.event_bg);
  255. }
  256. setDumuList([...dumuList]);
  257. },
  258. });
  259. useEffect(() => {
  260. setDumuList(data?.dumuList);
  261. data?.dumuList?.map((item) => {
  262. detailRun(item.id);
  263. });
  264. }, [data?.dumuList]);
  265. // if (!show) return null;
  266. return (
  267. <div
  268. id="secure"
  269. className={styles.content}
  270. style={{ display: show ? 'block' : 'none' }}
  271. >
  272. <ModuleTitle title="安全自检报告" />
  273. {/* 环境异常 */}
  274. <ReportCom
  275. {...subProps}
  276. allData={data?.sensor}
  277. data={data?.sensorWaringData}
  278. key="sensor"
  279. type={'sensor'}
  280. title={'环境自检'}
  281. changeStatus={(status) => changeStatus(0, status)}
  282. ></ReportCom>
  283. {/* 安防检测异常 */}
  284. <ReportDumCom
  285. {...subProps}
  286. data={dumuList}
  287. title={'安防自检'}
  288. changeStatus={(status) => changeStatus(1, status)}
  289. />
  290. {/* 密闭空间检测异常 */}
  291. <ReportCom
  292. {...subProps}
  293. key="extend"
  294. type={'extend'}
  295. title={'密闭空间自检'}
  296. changeStatus={(status) => changeStatus(2, status)}
  297. ></ReportCom>
  298. </div>
  299. );
  300. }
  301. function AalysisTable(props) {
  302. const { data = {}, statusCheck } = props;
  303. const { FaultAnalysis } = data;
  304. const errorCount = data?.FaultAnalysis?.length || 0;
  305. const columns = [
  306. {
  307. title: '异常名称',
  308. width: '18%',
  309. dataIndex: 'device_name',
  310. },
  311. // {
  312. // title: '位号',
  313. // width: '15%',
  314. // dataIndex: 'device_code',
  315. // },
  316. {
  317. title: '可能原因',
  318. width: '30%',
  319. render: (record) => record.reason,
  320. },
  321. {
  322. title: '解决方案',
  323. render: (record) => {
  324. if (record.fix_plan instanceof Array) {
  325. return (
  326. <div>
  327. {record.fix_plan.map((item) => (
  328. <div style={{ lineHeight: 1.8 }}>
  329. {item.content}
  330. <MandateBtn relationId={record.id} />
  331. </div>
  332. ))}
  333. </div>
  334. );
  335. } else {
  336. return record.fix_plan;
  337. }
  338. },
  339. },
  340. ];
  341. if (statusCheck.length != 3) {
  342. // 不显示异常数据时,隐藏次模块
  343. if (!statusCheck.includes(1)) return null;
  344. // 过滤异常并且此模块没有异常数据时,不显示此模块
  345. if (statusCheck.includes(1) && errorCount == 0) return null;
  346. }
  347. return (
  348. <div className={styles.content} id="technology">
  349. <div className={styles.tableStatus}>异常({errorCount})</div>
  350. <ModuleTitle title="工艺自检报告" />
  351. <Table
  352. columns={columns}
  353. dataSource={FaultAnalysis}
  354. rowKey="device_code"
  355. locale={{
  356. emptyText: <Empty />,
  357. }}
  358. pagination={false}
  359. />
  360. </div>
  361. );
  362. }
  363. function base64ToImageUrl(base64String) {
  364. const byteCharacters = atob(base64String);
  365. const byteArrays = [];
  366. for (let i = 0; i < byteCharacters.length; i++) {
  367. byteArrays.push(byteCharacters.charCodeAt(i));
  368. }
  369. const byteArray = new Uint8Array(byteArrays);
  370. const blob = new Blob([byteArray], { type: 'image/png' });
  371. const imageUrl = URL.createObjectURL(blob);
  372. return imageUrl;
  373. }
  374. export default connect(({ eqSelfInspection }) => ({
  375. userList: eqSelfInspection.userList,
  376. mandateInfo: eqSelfInspection.mandateInfo,
  377. }))(Detail);