index.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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, Spin } 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 DeviceManager = () => {
  17. const { projectId } = useParams();
  18. const [tab, setTab] = useState(localStorage.safeTab || '1');
  19. //门禁接口
  20. const { data, run, loading } = useRequest(
  21. () => queryGateList({ project_id: projectId }),
  22. {
  23. manual: true,
  24. },
  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 || loadingOver}
  94. projectId={projectId}
  95. />
  96. ),
  97. },
  98. ]}
  99. />
  100. </PageContent>
  101. );
  102. };
  103. const Video = ({ 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. <Spin spinning={loading}>
  116. <div className="content-tab">
  117. <div className={styles.sparePart}>
  118. <div className={styles.titleContent}>
  119. <div className={styles.titleLeft}>
  120. <img className={styles.img} src={videoIcon} />
  121. <div className={styles.textCon}>
  122. <div className="value-number">{dataOnline?.total || 0}</div>
  123. <div className={styles.text}>在库数量(个)</div>
  124. </div>
  125. </div>
  126. <div>
  127. <div className={styles.lTextCon1}>
  128. <div className={styles.onlinePoint} />
  129. <span className={styles.text}>
  130. 在线:{dataOnline?.online || 0}
  131. </span>
  132. </div>
  133. <div className={styles.lTextCon2}>
  134. <div className={styles.outlinePoint} />
  135. <span className={styles.text}>
  136. 离线:{dataOnline?.offline || 0}
  137. </span>
  138. </div>
  139. </div>
  140. </div>
  141. <div className={styles.listContent}>
  142. {data?.map((item, idx) => (
  143. <div
  144. key={`video_${idx}`}
  145. className={`card-box ${styles.listItem}`}
  146. >
  147. {renderRed(item)}
  148. </div>
  149. ))}
  150. </div>
  151. </div>
  152. </div>
  153. </Spin>
  154. );
  155. };
  156. const Door = ({ data, dataOver, loading, projectId }) => {
  157. const navigate = useNavigate();
  158. const handleClick = () => {
  159. localStorage.safeTab = '2';
  160. navigate(`/safety/detail/${projectId}`);
  161. };
  162. const renderRed = (item) => {
  163. return (
  164. <div className={styles.cardItem}>
  165. <div
  166. className={item?.status ? styles.onlinePoint : styles.outlinePoint}
  167. />
  168. <span className={styles.name}>{item?.name}</span>
  169. </div>
  170. );
  171. };
  172. return (
  173. <Spin spinning={loading}>
  174. <div className="content-tab">
  175. <div className={styles.doorPart}>
  176. <div className={styles.titleContent}>
  177. <div className={styles.cardLeft}>
  178. <div className={styles.up}>
  179. <img className={styles.img} src={doorIcon} />
  180. <div className={styles.textCon}>
  181. <div className="value-number">{dataOver?.total}</div>
  182. <div className={styles.text}>门禁数量(个)</div>
  183. </div>
  184. </div>
  185. <div className={styles.bottom}>
  186. <div className={styles.lTextCon2}>
  187. <div className={styles.onlinePoint} />
  188. <span className={styles.text}>在线:{dataOver?.online}</span>
  189. </div>
  190. <div className={styles.lTextCon2}>
  191. <div className={styles.outlinePoint} />
  192. <span className={styles.text}>离线:{dataOver?.offline}</span>
  193. </div>
  194. </div>
  195. </div>
  196. <div className={styles.cardRight}>
  197. <div className={styles.textContent}>
  198. <div className={styles.in} />
  199. <span className={styles.text}>
  200. 今日进厂次数:{dataOver?.today_in}
  201. </span>
  202. </div>
  203. <div className={styles.textContent}>
  204. <div className={styles.out} />
  205. <span className={styles.text}>
  206. 今日出厂次数:{dataOver?.today_out}
  207. </span>
  208. </div>
  209. <Button className={styles.btn} onClick={handleClick}>
  210. 门禁日志
  211. </Button>
  212. </div>
  213. </div>
  214. <div className={styles.listContent}>
  215. {data?.map((item, idx) => (
  216. <div
  217. key={`door_${idx}`}
  218. className={`card-box ${styles.listItem}`}
  219. >
  220. {renderRed(item)}
  221. </div>
  222. ))}
  223. </div>
  224. </div>
  225. </div>
  226. </Spin>
  227. );
  228. };
  229. export default DeviceManager;