index.jsx 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. import React, { useState, useEffect, useRef, useCallback } from 'react';
  2. import { message, Spin } from 'antd';
  3. import styles from './index.less';
  4. import commonStyles from '../common.less';
  5. import { equipImageMap } from '@/config/sagacare/sagacare_image.js';
  6. import AnSwitch from '../anSwitch';
  7. import { getFeedbackDocumentsHttp, changeAirHttp } from '@/services/sagacare_service/equipment';
  8. import { LoadingOutlined } from '@ant-design/icons';
  9. export default ({ spaceId, projectId }) => {
  10. const {
  11. airOpen,
  12. airClose,
  13. temp_down,
  14. temp_up,
  15. temp_keep,
  16. arrow_down,
  17. arrow_up,
  18. wind_up,
  19. wind_down,
  20. } = equipImageMap;
  21. const hasAir = true;
  22. let isNowAirStatus = useRef('');
  23. let firstLoading = useRef(true);
  24. let [isOpen, setIsOpen] = useState(false);
  25. let [isLoading, setIsLoading] = useState(false);
  26. const [imgSrc, setImgSrc] = useState(null);
  27. let timer = useRef(null);
  28. let airLoadingTimer = useRef(null);
  29. let divBox = useRef(null);
  30. const [spaceStatus, setStatusText] = useState('null');
  31. let [changeLoading, setChangeLoading] = useState({ 4: false, 2: false, 5: false, 6: false });
  32. let [modeName, setModeName] = useState('');
  33. let [tempSet, setTempSet] = useState('');
  34. const airExpend = [
  35. {
  36. title: '温度调节',
  37. type: 'temp',
  38. downType: 4,
  39. upType: 2,
  40. leftImg: arrow_down,
  41. rightImg: arrow_up,
  42. },
  43. {
  44. title: '风量调节',
  45. type: 'wind',
  46. downType: 5,
  47. upType: 6,
  48. leftImg: wind_down,
  49. rightImg: wind_up,
  50. },
  51. ];
  52. const statusImg = (icon) => {
  53. switch (icon) {
  54. case 1:
  55. return setImgSrc(temp_keep);
  56. break;
  57. case 2:
  58. return setImgSrc(temp_down);
  59. break;
  60. case 3:
  61. return setImgSrc(temp_up);
  62. break;
  63. default:
  64. break;
  65. }
  66. };
  67. function timerGetAirInfo(timeLong) {
  68. clearTimeout(timer.current);
  69. timer.current = setTimeout(() => {
  70. divBox.current && getAirInfo(); // 获取空调状态
  71. }, timeLong);
  72. }
  73. function changeSwitch(val) {
  74. if (!isLoading) {
  75. setIsLoading(true);
  76. changeIsLoading(val);
  77. const itemIdSum = val ? 12 : 10; // 10关闭 12开启¬
  78. changeAir(itemIdSum);
  79. }
  80. }
  81. const changeIsLoading = (val) => {
  82. let countTimer = 0;
  83. airLoadingTimer.current = setInterval(() => {
  84. if (countTimer >= 30 || isNowAirStatus.current === val) {
  85. // setIsOpen(isNowAirStatus.current); // 开关
  86. setIsLoading(false);
  87. clearInterval(airLoadingTimer.current);
  88. } else {
  89. countTimer++;
  90. }
  91. }, 1000);
  92. };
  93. const getAirInfo = useCallback(() => {
  94. const paramsObj = {
  95. objectId: spaceId,
  96. projectId: projectId,
  97. };
  98. getFeedbackDocumentsHttp(paramsObj)
  99. .then((res) => {
  100. const val = res.icon == 7 ? false : true;
  101. if (firstLoading.current) {
  102. setIsLoading(false);
  103. }
  104. isNowAirStatus.current = val;
  105. setIsOpen(val); // 开关
  106. firstLoading.current = false;
  107. // setFirstLoading(false)
  108. timerGetAirInfo(3000);
  109. setStatusText(res.spaceStatus); // 状态文案
  110. statusImg(res.icon); // icon
  111. //console.log('res', res);
  112. setModeName(formateModel((res || {}).mode));
  113. setTempSet((res || {}).tempSet);
  114. })
  115. .catch(() => {
  116. timerGetAirInfo(3000);
  117. firstLoading.current = false;
  118. // setIsLoading(false);
  119. });
  120. }, []);
  121. const formateModel = (model) => {
  122. var modeName = '';
  123. if (model) {
  124. if (model === 1) {
  125. modeName = '制冷';
  126. } else if (model === 2) {
  127. modeName = '制热';
  128. } else if (model === 3) {
  129. modeName = '通风';
  130. } else if (model === 4) {
  131. modeName = '除湿';
  132. } else {
  133. modeName = '';
  134. }
  135. } else {
  136. modeName = '';
  137. }
  138. return modeName;
  139. };
  140. const changeAir = useCallback(
  141. (itemId) => {
  142. if (changeLoading[itemId]) {
  143. return;
  144. }
  145. const paramsObj = {
  146. objectId: spaceId, // 空间id
  147. valueType: 1, // 固定为1
  148. itemId: itemId,
  149. };
  150. // console.log('changeLoading', changeLoading);
  151. setChangeLoading({ ...changeLoading, [itemId]: true });
  152. changeAirHttp(paramsObj)
  153. .then((res) => {
  154. setChangeLoading({ ...changeLoading, [itemId]: false });
  155. if (res.result == 'success') {
  156. message.success('指令下发成功');
  157. // getAirInfo();
  158. // timerGetAirInfo(2000);
  159. } else {
  160. message.error('操作失败,请重试');
  161. }
  162. })
  163. .catch((err) => {
  164. setChangeLoading({ ...changeLoading, [itemId]: false });
  165. });
  166. },
  167. [changeLoading],
  168. );
  169. useEffect(() => {
  170. getAirInfo(); // 获取空调状态
  171. //timerGetAirInfo(2000);
  172. return () => {
  173. //console.log('useEffect[]spaceId', divBox.current);
  174. clearTimeout(timer.current);
  175. };
  176. }, []);
  177. return (
  178. <div className={styles.box} ref={divBox}>
  179. <div className={styles.content}>
  180. <div className={styles.env}>
  181. {isOpen && (
  182. <div className={styles.modeshow}>
  183. <span className={styles.mode}>{modeName}</span>
  184. <span className={styles.tempset}>
  185. {tempSet}
  186. {tempSet ? '℃' : ''}
  187. </span>
  188. </div>
  189. )}
  190. <div className={styles.envLeft}>
  191. <span className={commonStyles.eqTitle}>空调</span>
  192. <div className={styles.airStatus}>
  193. <span className={styles.airStatusText}>{isOpen ? '空调已开启' : '空调已关闭'}</span>
  194. {isOpen && (
  195. <div className={styles.airStatusbox}>
  196. <img className={styles.airStatusImg} src={imgSrc} />
  197. <span className={styles.statusText}>{spaceStatus}</span>
  198. </div>
  199. )}
  200. </div>
  201. </div>
  202. <div className={styles.envRight}>
  203. <img className={styles.roomAirImg} src={isOpen ? airOpen : airClose} />
  204. </div>
  205. <div
  206. onClick={() => {
  207. changeSwitch(!isOpen);
  208. }}
  209. className={commonStyles.eqBtn}
  210. >
  211. <AnSwitch isOpen={isOpen} isAir={true} isLoading={isLoading} />
  212. {/*<Switch loading isOpen />*/}
  213. </div>
  214. </div>
  215. </div>
  216. {isOpen && (
  217. <div className={styles.expend}>
  218. {airExpend.map((items, idx) => {
  219. return (
  220. <div className={styles.item} key={idx}>
  221. <div>{items.title}</div>
  222. <div className={styles.itemRight}>
  223. <div
  224. className={styles.itemBg}
  225. onClick={(e) => {
  226. changeAir(items.downType);
  227. }}
  228. >
  229. {changeLoading[items.downType] ? (
  230. <Spin indicator={<LoadingOutlined style={{ fontSize: 20 }} spin />} />
  231. ) : (
  232. <img className={styles.itemImg} src={items.leftImg} />
  233. )}
  234. </div>
  235. <div className={styles.itemBg} onClick={() => changeAir(items.upType)}>
  236. {changeLoading[items.upType] ? (
  237. <Spin indicator={<LoadingOutlined style={{ fontSize: 20 }} spin />} />
  238. ) : (
  239. <img className={styles.itemImg} src={items.rightImg} />
  240. )}
  241. </div>
  242. </div>
  243. </div>
  244. );
  245. })}
  246. </div>
  247. )}
  248. </div>
  249. );
  250. };