index.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import PageContent from '@/components/PageContent';
  2. import TabsContent from '@/components/TabsContent';
  3. import {
  4. queryGateList,
  5. queryGateOverView,
  6. queryMonitorList,
  7. queryMonitorOnlineCount,
  8. } from '@/services/safety';
  9. import { UnityAction } from '@/utils/utils';
  10. import { useNavigate, useParams, useRequest } from '@umijs/max';
  11. import { Button, Space } from 'antd';
  12. import { useEffect, useState } from 'react';
  13. import styles from './index.less';
  14. const doorIcon = require('@/assets/deviceManager/doorIcon.png');
  15. const videoIcon = require('@/assets/air-conditioner.png');
  16. const chartIcon = require('@/assets/deviceManager/chartIcon.png');
  17. const DeviceManager = () => {
  18. const { projectId } = useParams();
  19. const [tab, setTab] = useState(localStorage.safeTab || '1');
  20. //门禁接口
  21. const { data, run, loading } = useRequest(
  22. () => queryGateList({ project_id: projectId }),
  23. {
  24. manual: true,
  25. },
  26. );
  27. const {
  28. data: dataOver,
  29. run: runOver,
  30. loading: loadingOver,
  31. } = useRequest(() => queryGateOverView({ project_id: projectId }), {
  32. manual: true,
  33. });
  34. //视频接口
  35. const {
  36. data: dataVList,
  37. run: runVideo,
  38. loading: loadingVList,
  39. } = useRequest(() => queryMonitorList(projectId));
  40. const {
  41. data: dataVOnline,
  42. run: runVOnLine,
  43. loading: loadingVOnline,
  44. } = useRequest(() => queryMonitorOnlineCount(projectId));
  45. useEffect(() => {
  46. if (data?.list && tab == '2')
  47. UnityAction.sendMsg('doorData', JSON.stringify(data?.list));
  48. if (dataVList?.list && tab == '1')
  49. UnityAction.sendMsg('camData', JSON.stringify(dataVList?.list));
  50. }, [data, dataVList]);
  51. const handleTabChange = (tab) => {
  52. setTab(tab);
  53. if (tab == '1') {
  54. runVideo();
  55. runVOnLine();
  56. } else {
  57. run();
  58. runOver();
  59. }
  60. };
  61. useEffect(() => {
  62. localStorage.safeTab = '1'
  63. if(tab == '2') {
  64. run();
  65. runOver();
  66. }
  67. },[])
  68. return (
  69. <PageContent tabs>
  70. <TabsContent
  71. defaultActiveKey={tab}
  72. onChange={handleTabChange}
  73. items={[
  74. {
  75. label: `视频监控`,
  76. key: '1',
  77. children: (
  78. <Video
  79. data={dataVList?.list}
  80. dataOnline={dataVOnline}
  81. loading={loadingVList}
  82. projectId={projectId}
  83. />
  84. ),
  85. },
  86. {
  87. label: `门禁监控`,
  88. key: '2',
  89. children: (
  90. <Door
  91. data={data?.list}
  92. dataOver={dataOver}
  93. loading={loading}
  94. projectId={projectId}
  95. />
  96. ),
  97. },
  98. ]}
  99. />
  100. </PageContent>
  101. );
  102. };
  103. const Video = ({ projectId, data, dataOnline, loading }) => {
  104. const renderRed = (item) => {
  105. return (
  106. <div className={styles.cardItem}>
  107. <div
  108. className={item.Online ? styles.onlinePoint : styles.outlinePoint}
  109. />
  110. <span className={styles.name}>{item.Name}</span>
  111. </div>
  112. );
  113. };
  114. return (
  115. <Space direction="vertical" size={16} className={styles.sparePart}>
  116. <div className={`card-box ${styles.titleContent}`}>
  117. <div className={styles.titleLeft}>
  118. <img className={styles.img} src={videoIcon} />
  119. <div className={styles.textCon}>
  120. <div className={styles.num}>{dataOnline?.total || 0}</div>
  121. <div className={styles.text}>在库数量(个)</div>
  122. </div>
  123. </div>
  124. <div>
  125. <div className={styles.lTextCon1}>
  126. <div className={styles.onlinePoint} />
  127. <span className={styles.text}>在线:{dataOnline?.online || 0}</span>
  128. </div>
  129. <div className={styles.lTextCon2}>
  130. <div className={styles.outlinePoint} />
  131. <span className={styles.text}>
  132. 离线:{dataOnline?.offline || 0}
  133. </span>
  134. </div>
  135. </div>
  136. </div>
  137. {data?.map((item, idx) => (
  138. <div key={`video_${idx}`} className="card-box">
  139. {renderRed(item)}
  140. </div>
  141. ))}
  142. </Space>
  143. );
  144. };
  145. const Door = ({ data, dataOver, loading, projectId }) => {
  146. const navigate = useNavigate();
  147. const handleClick = () => {
  148. localStorage.safeTab = '2'
  149. navigate(`/safety/detail/${projectId}`);
  150. };
  151. const renderRed = (item) => {
  152. return (
  153. <div className={styles.cardItem}>
  154. <div
  155. className={item?.status ? styles.onlinePoint : styles.outlinePoint}
  156. />
  157. <span className={styles.name}>{item?.name}</span>
  158. </div>
  159. );
  160. };
  161. return (
  162. <Space direction="vertical" size={16} className={styles.doorPart}>
  163. <div className={styles.titleContent}>
  164. <div className={`card-box ${styles.cardLeft}`}>
  165. <div className={styles.up}>
  166. <img className={styles.img} src={doorIcon} />
  167. <div className={styles.textCon}>
  168. <div className={styles.num}>{dataOver?.total}</div>
  169. <div className={styles.text}>门禁数量(个)</div>
  170. </div>
  171. </div>
  172. <div className={styles.bottom}>
  173. <div className={styles.lTextCon2}>
  174. <div className={styles.onlinePoint} />
  175. <span className={styles.text}>在线:{dataOver?.online}</span>
  176. </div>
  177. <div className={styles.lTextCon2}>
  178. <div className={styles.outlinePoint} />
  179. <span className={styles.text}>离线:{dataOver?.offline}</span>
  180. </div>
  181. </div>
  182. </div>
  183. <div className={`card-box ${styles.cardRight}`}>
  184. <div className={styles.textContent}>
  185. <div className={styles.in} />
  186. <span className={styles.text}>今日进厂人数:{2}</span>
  187. </div>
  188. <div className={styles.textContent}>
  189. <div className={styles.out} />
  190. <span className={styles.text}>今日出厂人数:{2}</span>
  191. </div>
  192. <Button className={styles.btn} onClick={handleClick}>
  193. 门禁日志
  194. </Button>
  195. </div>
  196. </div>
  197. {data?.map((item, idx) => (
  198. <div key={`door_${idx}`} className="card-box">
  199. {renderRed(item)}
  200. </div>
  201. ))}
  202. </Space>
  203. );
  204. };
  205. export default DeviceManager;