index.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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 img = require('@/assets/air-conditioner.png');
  15. const chartIcon = require('@/assets/deviceManager/chartIcon.png');
  16. const DeviceManager = () => {
  17. const { projectId } = useParams();
  18. const [tab, setTab] = useState('1');
  19. //门禁接口
  20. const { data, run, loading } = useRequest(
  21. () => queryGateList({ project_id: projectId }),
  22. {
  23. manual: true,
  24. },
  25. );
  26. const {
  27. data: dataOver,
  28. run: runOver,
  29. loading: loadingOver,
  30. } = useRequest(() => queryGateOverView({ project_id: projectId }), {
  31. manual: true,
  32. });
  33. //视频接口
  34. const {
  35. data: dataVList,
  36. run: runVideo,
  37. loading: loadingVList,
  38. } = useRequest(() => queryMonitorList(projectId));
  39. const {
  40. data: dataVOnline,
  41. run: runVOnLine,
  42. loading: loadingVOnline,
  43. } = useRequest(() => queryMonitorOnlineCount(projectId));
  44. useEffect(() => {
  45. if (data?.list && tab == '2')
  46. UnityAction.sendMsg('doorData', JSON.stringify(data?.list));
  47. if (dataVList?.list && tab == '1')
  48. UnityAction.sendMsg('camData', JSON.stringify(dataVList?.list));
  49. }, [data, dataVList]);
  50. const handleTabChange = (tab) => {
  51. setTab(tab);
  52. if (tab == '1') {
  53. runVideo();
  54. runVOnLine();
  55. } else {
  56. run();
  57. runOver();
  58. }
  59. };
  60. return (
  61. <PageContent>
  62. <TabsContent
  63. defaultActiveKey="1"
  64. onChange={handleTabChange}
  65. items={[
  66. {
  67. label: `视频监控`,
  68. key: '1',
  69. children: (
  70. <Video
  71. data={dataVList?.list}
  72. dataOnline={dataVOnline}
  73. loading={loadingVList}
  74. projectId={projectId}
  75. />
  76. ),
  77. },
  78. {
  79. label: `门禁`,
  80. key: '2',
  81. children: (
  82. <Door
  83. data={data?.list}
  84. dataOver={dataOver}
  85. loading={loading}
  86. projectId={projectId}
  87. />
  88. ),
  89. },
  90. ]}
  91. />
  92. </PageContent>
  93. );
  94. };
  95. const Video = ({ projectId, data, dataOnline, loading }) => {
  96. const renderRed = (item) => {
  97. return (
  98. <div className={styles.cardItem}>
  99. <div
  100. className={item.Online ? styles.onlinePoint : styles.outlinePoint}
  101. />
  102. <span className={styles.name}>{item.Name}</span>
  103. </div>
  104. );
  105. };
  106. return (
  107. <Space direction="vertical" size={16} className={styles.sparePart}>
  108. <div className={`card-box ${styles.titleContent}`}>
  109. <div className={styles.titleLeft}>
  110. <img className={styles.img} src={img} />
  111. <div className={styles.textCon}>
  112. <div className={styles.num}>{dataOnline?.total || 0}</div>
  113. <div>在库数量(个)</div>
  114. </div>
  115. </div>
  116. <div>
  117. <div className={styles.lTextCon1}>
  118. <div className={styles.onlinePoint} />
  119. <span>在线:{dataOnline?.online || 0}</span>
  120. </div>
  121. <div className={styles.lTextCon2}>
  122. <div className={styles.outlinePoint} />
  123. <span>离线:{dataOnline?.offline || 0}</span>
  124. </div>
  125. </div>
  126. </div>
  127. {data?.map((item, idx) => (
  128. <div key={`video_${idx}`} className="card-box">
  129. {renderRed(item)}
  130. </div>
  131. ))}
  132. </Space>
  133. );
  134. };
  135. const Door = ({ data, dataOver, loading, projectId }) => {
  136. const navigate = useNavigate();
  137. const handleClick = () => {
  138. navigate(`/safety/detail/${projectId}`);
  139. };
  140. const renderRed = (item) => {
  141. return (
  142. <div className={styles.cardItem}>
  143. <div
  144. className={item?.status ? styles.onlinePoint : styles.outlinePoint}
  145. />
  146. <span className={styles.name}>{item?.name}</span>
  147. </div>
  148. );
  149. };
  150. return (
  151. <Space direction="vertical" size={16} className={styles.doorPart}>
  152. <div className={styles.titleContent}>
  153. <div className={`card-box ${styles.cardLeft}`}>
  154. <div className={styles.up}>
  155. <img className={styles.img} src={img} />
  156. <div className={styles.textCon}>
  157. <div className={styles.num}>{dataOver?.total}</div>
  158. <div>在库数量(个)</div>
  159. </div>
  160. </div>
  161. <div style={{ display: 'flex', justifyContent: 'space-around' }}>
  162. <div style={{ display: 'flex', alignItems: 'center' }}>
  163. <div
  164. style={{
  165. backgroundColor: '#12ceb3',
  166. width: '10px',
  167. height: '10px',
  168. borderRadius: '5px',
  169. marginRight: '10px',
  170. }}
  171. />
  172. <span>在线:{dataOver?.online}</span>
  173. </div>
  174. <div style={{ display: 'flex', alignItems: 'center' }}>
  175. <div
  176. style={{
  177. backgroundColor: 'gray',
  178. width: '10px',
  179. height: '10px',
  180. borderRadius: '5px',
  181. marginRight: '10px',
  182. }}
  183. />
  184. <span>离线:{dataOver?.offline}</span>
  185. </div>
  186. </div>
  187. </div>
  188. <div className={`card-box ${styles.titleTwoContent}`}>
  189. <div
  190. style={{
  191. display: 'flex',
  192. flexDirection: 'column',
  193. height: '100%',
  194. justifyContent: 'space-around',
  195. }}
  196. >
  197. <div
  198. style={{
  199. display: 'flex',
  200. alignItems: 'center',
  201. }}
  202. >
  203. <div
  204. style={{
  205. backgroundColor: '#4a90e2',
  206. width: '10px',
  207. height: '10px',
  208. borderRadius: '5px',
  209. marginRight: '10px',
  210. }}
  211. />
  212. <span>今日进厂人数:{2}</span>
  213. </div>
  214. <div
  215. style={{
  216. display: 'flex',
  217. alignItems: 'center',
  218. }}
  219. >
  220. <div
  221. style={{
  222. backgroundColor: '#f5a623',
  223. width: '10px',
  224. height: '10px',
  225. borderRadius: '5px',
  226. marginRight: '10px',
  227. }}
  228. />
  229. <span>今日出厂人数:{2}</span>
  230. </div>
  231. <Button onClick={handleClick}>门禁日志</Button>
  232. </div>
  233. </div>
  234. </div>
  235. <Space direction="vertical" className={styles.sparePart}>
  236. {data?.map((item, idx) => (
  237. <div
  238. key={`door_${idx}`}
  239. className="card-box"
  240. style={{ padding: '10px' }}
  241. >
  242. {renderRed(item)}
  243. </div>
  244. ))}
  245. </Space>
  246. </Space>
  247. );
  248. };
  249. export default DeviceManager;