index.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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 className={styles.text}>在库数量(个)</div>
  114. </div>
  115. </div>
  116. <div>
  117. <div className={styles.lTextCon1}>
  118. <div className={styles.onlinePoint} />
  119. <span className={styles.text}>在线:{dataOnline?.online || 0}</span>
  120. </div>
  121. <div className={styles.lTextCon2}>
  122. <div className={styles.outlinePoint} />
  123. <span className={styles.text}>
  124. 离线:{dataOnline?.offline || 0}
  125. </span>
  126. </div>
  127. </div>
  128. </div>
  129. {data?.map((item, idx) => (
  130. <div key={`video_${idx}`} className="card-box">
  131. {renderRed(item)}
  132. </div>
  133. ))}
  134. </Space>
  135. );
  136. };
  137. const Door = ({ data, dataOver, loading, projectId }) => {
  138. const navigate = useNavigate();
  139. const handleClick = () => {
  140. navigate(`/safety/detail/${projectId}`);
  141. };
  142. const renderRed = (item) => {
  143. return (
  144. <div className={styles.cardItem}>
  145. <div
  146. className={item?.status ? styles.onlinePoint : styles.outlinePoint}
  147. />
  148. <span className={styles.name}>{item?.name}</span>
  149. </div>
  150. );
  151. };
  152. return (
  153. <Space direction="vertical" size={16} className={styles.doorPart}>
  154. <div className={styles.titleContent}>
  155. <div className={`card-box ${styles.cardLeft}`}>
  156. <div className={styles.up}>
  157. <img className={styles.img} src={img} />
  158. <div className={styles.textCon}>
  159. <div className={styles.num}>{dataOver?.total}</div>
  160. <div className={styles.text}>门禁数量(个)</div>
  161. </div>
  162. </div>
  163. <div className={styles.bottom}>
  164. <div className={styles.lTextCon2}>
  165. <div className={styles.onlinePoint} />
  166. <span className={styles.text}>在线:{dataOver?.online}</span>
  167. </div>
  168. <div className={styles.lTextCon2}>
  169. <div className={styles.outlinePoint} />
  170. <span className={styles.text}>离线:{dataOver?.offline}</span>
  171. </div>
  172. </div>
  173. </div>
  174. <div className={`card-box ${styles.cardRight}`}>
  175. <div className={styles.textContent}>
  176. <div className={styles.in} />
  177. <span className={styles.text}>今日进厂人数:{2}</span>
  178. </div>
  179. <div className={styles.textContent}>
  180. <div className={styles.out} />
  181. <span className={styles.text}>今日出厂人数:{2}</span>
  182. </div>
  183. <Button className={styles.btn} onClick={handleClick}>
  184. 门禁日志
  185. </Button>
  186. </div>
  187. </div>
  188. {data?.map((item, idx) => (
  189. <div key={`door_${idx}`} className="card-box">
  190. {renderRed(item)}
  191. </div>
  192. ))}
  193. </Space>
  194. );
  195. };
  196. export default DeviceManager;