index.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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('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. return (
  62. <PageContent tabs>
  63. <TabsContent
  64. defaultActiveKey="1"
  65. onChange={handleTabChange}
  66. items={[
  67. {
  68. label: `视频监控`,
  69. key: '1',
  70. children: (
  71. <Video
  72. data={dataVList?.list}
  73. dataOnline={dataVOnline}
  74. loading={loadingVList}
  75. projectId={projectId}
  76. />
  77. ),
  78. },
  79. {
  80. label: `门禁`,
  81. key: '2',
  82. children: (
  83. <Door
  84. data={data?.list}
  85. dataOver={dataOver}
  86. loading={loading}
  87. projectId={projectId}
  88. />
  89. ),
  90. },
  91. ]}
  92. />
  93. </PageContent>
  94. );
  95. };
  96. const Video = ({ projectId, data, dataOnline, loading }) => {
  97. const renderRed = (item) => {
  98. return (
  99. <div className={styles.cardItem}>
  100. <div
  101. className={item.Online ? styles.onlinePoint : styles.outlinePoint}
  102. />
  103. <span className={styles.name}>{item.Name}</span>
  104. </div>
  105. );
  106. };
  107. return (
  108. <Space direction="vertical" size={16} className={styles.sparePart}>
  109. <div className={`card-box ${styles.titleContent}`}>
  110. <div className={styles.titleLeft}>
  111. <img className={styles.img} src={videoIcon} />
  112. <div className={styles.textCon}>
  113. <div className={styles.num}>{dataOnline?.total || 0}</div>
  114. <div className={styles.text}>在库数量(个)</div>
  115. </div>
  116. </div>
  117. <div>
  118. <div className={styles.lTextCon1}>
  119. <div className={styles.onlinePoint} />
  120. <span className={styles.text}>在线:{dataOnline?.online || 0}</span>
  121. </div>
  122. <div className={styles.lTextCon2}>
  123. <div className={styles.outlinePoint} />
  124. <span className={styles.text}>
  125. 离线:{dataOnline?.offline || 0}
  126. </span>
  127. </div>
  128. </div>
  129. </div>
  130. {data?.map((item, idx) => (
  131. <div key={`video_${idx}`} className="card-box">
  132. {renderRed(item)}
  133. </div>
  134. ))}
  135. </Space>
  136. );
  137. };
  138. const Door = ({ data, dataOver, loading, projectId }) => {
  139. const navigate = useNavigate();
  140. const handleClick = () => {
  141. navigate(`/safety/detail/${projectId}`);
  142. };
  143. const renderRed = (item) => {
  144. return (
  145. <div className={styles.cardItem}>
  146. <div
  147. className={item?.status ? styles.onlinePoint : styles.outlinePoint}
  148. />
  149. <span className={styles.name}>{item?.name}</span>
  150. </div>
  151. );
  152. };
  153. return (
  154. <Space direction="vertical" size={16} className={styles.doorPart}>
  155. <div className={styles.titleContent}>
  156. <div className={`card-box ${styles.cardLeft}`}>
  157. <div className={styles.up}>
  158. <img className={styles.img} src={doorIcon} />
  159. <div className={styles.textCon}>
  160. <div className={styles.num}>{dataOver?.total}</div>
  161. <div className={styles.text}>门禁数量(个)</div>
  162. </div>
  163. </div>
  164. <div className={styles.bottom}>
  165. <div className={styles.lTextCon2}>
  166. <div className={styles.onlinePoint} />
  167. <span className={styles.text}>在线:{dataOver?.online}</span>
  168. </div>
  169. <div className={styles.lTextCon2}>
  170. <div className={styles.outlinePoint} />
  171. <span className={styles.text}>离线:{dataOver?.offline}</span>
  172. </div>
  173. </div>
  174. </div>
  175. <div className={`card-box ${styles.cardRight}`}>
  176. <div className={styles.textContent}>
  177. <div className={styles.in} />
  178. <span className={styles.text}>今日进厂人数:{2}</span>
  179. </div>
  180. <div className={styles.textContent}>
  181. <div className={styles.out} />
  182. <span className={styles.text}>今日出厂人数:{2}</span>
  183. </div>
  184. <Button className={styles.btn} onClick={handleClick}>
  185. 门禁日志
  186. </Button>
  187. </div>
  188. </div>
  189. {data?.map((item, idx) => (
  190. <div key={`door_${idx}`} className="card-box">
  191. {renderRed(item)}
  192. </div>
  193. ))}
  194. </Space>
  195. );
  196. };
  197. export default DeviceManager;