Browse Source

Merge branch 'master' of http://39.106.8.246:3003/sagacloud/sagacloud-manager-control

zhaojijng 3 years ago
parent
commit
6e38e8095b

+ 1 - 1
config/config.ts

@@ -67,7 +67,7 @@ export default defineConfig({
     },
   ],
   nodeModulesTransform: { type: 'none' },
-  //   mfsu: {},
+  mfsu: {},
   webpack5: {},
   exportStatic: {},
 });

+ 8 - 0
config/proxy.ts

@@ -17,6 +17,14 @@ export default {
       changeOrigin: true,
       pathRewrite: { '^/api': '' },
     },
+    '/server/': {
+      // 要代理的地址
+      target: 'https://duoduoenv.sagacloud.cn/',
+      // 配置了这个可以从 http 代理到 https
+      // 依赖 origin 的功能可能需要这个,比如 cookie
+      changeOrigin: true,
+      //   pathRewrite: { '^/': '' },
+    },
     '/api2/': {
       // 要代理的地址
       target: 'http://192.168.0.14:52010/',

File diff suppressed because it is too large
+ 0 - 73
src/assets/images/page-enviroment/airTemp.svg


File diff suppressed because it is too large
+ 0 - 37
src/assets/images/page-enviroment/curtainTemp.svg


File diff suppressed because it is too large
+ 0 - 76
src/assets/images/page-enviroment/lampTemp.svg


File diff suppressed because it is too large
+ 0 - 52
src/assets/images/page-enviroment/waterTemp.svg


File diff suppressed because it is too large
+ 3 - 0
src/assets/images/page-equipment/curtain-close-icon-row.svg


File diff suppressed because it is too large
+ 3 - 0
src/assets/images/page-equipment/curtain-open-icon-row.svg


BIN
src/assets/images/page-equipment/curtain-open-row.png


+ 3 - 5
src/config/image.js

@@ -12,11 +12,6 @@ export const equipImageMap = {
   envir_tvoc: require('@/assets/images/page-enviroment/tvoc.svg'),
 
   officeImg: require('@/assets/images/page-enviroment/office.svg'),
-  curtainTemp: require('@/assets/images/page-enviroment/curtainTemp.svg'),
-  waterTemp: require('@/assets/images/page-enviroment/waterTemp.svg'),
-  lampTemp: require('@/assets/images/page-enviroment/lampTemp.svg'),
-  airTemp: require('@/assets/images/page-enviroment/airTemp.svg'),
-
   airMapTop: require('@/assets/images/page-enviroment/airMapTop.svg'),
   lampMapTop: require('@/assets/images/page-enviroment/lampMapTop.svg'),
   maptemp3: require('@/assets/images/page-enviroment/maptemp3.png'),
@@ -46,4 +41,7 @@ lamp_open: require('@/assets/images/page-equipment/lamp-open.png'),
 lamp_close: require('@/assets/images/page-equipment/lamp-close.png'),
 expend_down: require('@/assets/images/page-equipment/expend-down.svg'),
 expend_up: require('@/assets/images/page-equipment/expend-up.svg'),
+curtain_open_row: require('@/assets/images/page-equipment/curtain-open-row.png'),
+curtain_open_icon_row: require('@/assets/images/page-equipment/curtain-open-icon-row.svg'),
+curtain_close_icon_row: require('@/assets/images/page-equipment/curtain-close-icon-row.svg'),
 };

+ 58 - 27
src/pages/Equipment/components/deviceModal/airEq/index.jsx

@@ -1,8 +1,10 @@
-import React, { useState, useEffect } from 'react';
+import React, { useState, useEffect, useRef } from 'react';
+import { message } from 'antd';
 import styles from './index.less';
 import commonStyles from '../common.less';
 import { equipImageMap } from '@/config/image.js';
 import AnSwitch from '../anSwitch';
+import { getFeedbackDocumentsHttp, changeAirHttp } from '@/services/ant-design-pro/equipment';
 
 export default () => {
   const {
@@ -17,8 +19,10 @@ export default () => {
     wind_down,
   } = equipImageMap;
   const hasAir = true;
-  const [isOpen, setIsOpen] = useState(true); // 12 开, 10关
-  const temperature = '11';
+  const [isOpen, setIsOpen] = useState(true);
+  const [imgSrc, setImgSrc] = useState(null);
+  const timer = useRef(null);
+  const [spaceStatus, setStatusText] = useState('null');
   const airExpend = [
     {
       title: '温度调节',
@@ -37,21 +41,16 @@ export default () => {
       rightImg: wind_up,
     },
   ];
-  const airData = {
-    spaceStatus: true,
-    icon: 2,
-  };
-
-  const airStatusImg = () => {
-    switch (airData.icon) {
+  const statusImg = (icon) => {
+    switch (icon) {
       case 1:
-        return temp_keep;
+        return setImgSrc(temp_keep);
         break;
       case 2:
-        return temp_down;
+        return setImgSrc(temp_down);
         break;
       case 3:
-        return temp_up;
+        return setImgSrc(temp_up);
         break;
 
       default:
@@ -60,13 +59,47 @@ export default () => {
   };
 
   function changeSwitch(val) {
+    const itemIdSum = val ? 12 : 10; // 10关闭 12开启
+    changeAir(itemIdSum);
     setIsOpen(val);
   }
 
-  const AirExpend = () => {
-    const changeTemp = (type) => {
-      console.log(type, 'win 风蛋糕');
+  const getAirInfo = () => {
+    const paramsObj = {
+      objectId: 'Sp1101080259c4434730d12144ba890fe11f796d3143',
+      projectId: 'Pj1101080259',
+    };
+    getFeedbackDocumentsHttp(paramsObj).then((res) => {
+      const val = res.icon == 7 ? false : true;
+      setIsOpen(val); // 开关
+      setStatusText(res.spaceStatus); // 状态文案
+      statusImg(res.icon); // icon
+    });
+  };
+
+  const changeAir = (itemId) => {
+    const paramsObj = {
+      objectId: 'this.objectId', // 空间id
+      valueType: 1, // 固定为1
+      itemId: itemId,
     };
+    changeAirHttp(paramsObj).then((res) => {
+      if (res.result == 'success') {
+        message.success('指令下发成功');
+        setStatusText(res.spaceStatus); // 状态文案
+      } else {
+        message.error('操作失败,请重试');
+      }
+    });
+  };
+
+  useEffect(() => {
+    // timer = setInterval(() => {
+    getAirInfo(); // 获取空调状态
+    // }, 1000);
+  }, []);
+
+  const AirExpend = () => {
     if (isOpen) {
       return (
         <>
@@ -76,10 +109,10 @@ export default () => {
                 <div className={styles.item} key={idx}>
                   <div>{items.title}</div>
                   <div className={styles.itemRight}>
-                    <div className={styles.itemBg} onClick={() => changeTemp(items.downType)}>
+                    <div className={styles.itemBg} onClick={() => changeAir(items.downType)}>
                       <img className={styles.itemImg} src={items.leftImg} />
                     </div>
-                    <div className={styles.itemBg} onClick={() => changeTemp(items.upType)}>
+                    <div className={styles.itemBg} onClick={() => changeAir(items.upType)}>
                       <img className={styles.itemImg} src={items.rightImg} />
                     </div>
                   </div>
@@ -100,16 +133,14 @@ export default () => {
         <div className={styles.env}>
           <div className={styles.envLeft}>
             <span className={commonStyles.eqTitle}>空调</span>
-            <div className={styles.envnum}>
-              {temperature ? temperature : '--'}
-              <span className={styles.unit}>℃</span>
-            </div>
             <div className={styles.airStatus}>
-              <span>{isOpen ? '空调已开启' : '空调已关闭'}</span>
-              <div className={styles.airStatusbox}>
-                <img className={styles.airStatusImg} src={airStatusImg()} />
-                <span className={styles.statusText}>正在全力降温中的对方的身份</span>
-              </div>
+              <span className={styles.airStatusText}>{isOpen ? '空调已开启' : '空调已关闭'}</span>
+              {isOpen && (
+                <div className={styles.airStatusbox}>
+                  <img className={styles.airStatusImg} src={imgSrc} />
+                  <span className={styles.statusText}>{spaceStatus}</span>
+                </div>
+              )}
             </div>
           </div>
           <div className={styles.envRight}>

+ 26 - 22
src/pages/Equipment/components/deviceModal/airEq/index.less

@@ -13,26 +13,26 @@
         height: 140px;
         padding-top: 24px;
         padding-left: 30px;
-        .envnum {
-          display: flex;
-          flex-direction: row;
-          align-items: flex-start;
-          padding-top: 5px;
-          padding-bottom: 5px;
-          color: #1b144e;
-          font-weight: 400;
-          font-size: 32px;
-          font-family: Montserrat;
-          line-height: 32px;
-          .unit {
-            color: #c4c4c4;
-            font-weight: 800;
-            font-size: 12px;
-            font-family: Mulish;
-            font-style: normal;
-            line-height: 15px;
-          }
-        }
+        // .envnum {
+        //   display: flex;
+        //   flex-direction: row;
+        //   align-items: flex-start;
+        //   padding-top: 5px;
+        //   padding-bottom: 5px;
+        //   color: #1b144e;
+        //   font-weight: 400;
+        //   font-size: 32px;
+        //   font-family: Montserrat;
+        //   line-height: 32px;
+        //   .unit {
+        //     color: #c4c4c4;
+        //     font-weight: 800;
+        //     font-size: 12px;
+        //     font-family: Mulish;
+        //     font-style: normal;
+        //     line-height: 15px;
+        //   }
+        // }
       }
       .envRight {
         width: 165px;
@@ -44,15 +44,19 @@
       }
     }
     .airStatus {
-      padding-top: 5px;
       color: rgba(196, 196, 196, 1);
       font-weight: 400;
       font-size: 14px;
       font-family: PingFang SC;
       line-height: 20px;
+      .airStatusText {
+        display: inline-block;
+        padding-top: 10px;
+      }
       .airStatusbox {
         display: flex;
         align-items: center;
+        padding-top: 28px;
         .airStatusImg {
           width: 12px;
           height: 12px;
@@ -60,7 +64,7 @@
         }
         .statusText {
           display: inline-block;
-          width: 96px;
+          width: 120px;
           overflow: hidden;
           font-size: 11px;
           line-height: 18px;

+ 2 - 6
src/pages/Equipment/components/deviceModal/anSwitch/index.jsx

@@ -1,13 +1,9 @@
 import React, { useState, useEffect } from 'react';
 import './index.less';
 
-export default ({ isOpen, changeSwitch }) => {
-  const cb = () => {
-    changeSwitch(!isOpen);
-  };
-
+export default ({ isOpen }) => {
   return (
-    <div className="box" onClick={cb}>
+    <div className="box">
       <div className={`content ${isOpen ? null : 'closeBg'}`}>
         <div className={`point  ${isOpen ? null : 'closePt'}`}></div>
       </div>

+ 32 - 0
src/pages/Equipment/components/deviceModal/common.less

@@ -76,3 +76,35 @@
 .pdt10 {
   padding-top: 10px;
 }
+
+.dsflex {
+  display: flex;
+}
+
+.eqCirculBtn {
+  position: absolute;
+  top: 86px;
+  right: 15px;
+  display: flex;
+}
+
+.mgr20 {
+  margin-right: 20px;
+}
+
+.circulBtn {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 40px;
+  height: 40px;
+  background: rgba(196, 196, 196, 0.2);
+  border-radius: 50%;
+  &.yell {
+    background: #ffe823;
+  }
+  .btnIcon {
+    width: 20px;
+    height: 20px;
+  }
+}

+ 89 - 0
src/pages/Equipment/components/deviceModal/curtainEq/curtainBtn.jsx

@@ -0,0 +1,89 @@
+import React, { useState, useEffect, useCallback, useRef } from 'react';
+import commonStyles from '../common.less';
+import { equipImageMap } from '@/config/image.js';
+const { curtain_close_icon_row, curtain_open_icon_row } = equipImageMap;
+
+export default ({ id, isTotal, preTime, changePreTime, changeCurtainTex, curtainArr }) => {
+  const [downFlag, setDownFlag] = useState(false);
+  const [upFlag, setUpFlag] = useState(false);
+  const [count, setCount] = useState();
+  let setTimer = useRef(null);
+  const sendData = (setType, id) => {
+    let paramsArr = [];
+    if (isTotal) {
+      curtainArr.forEach((item) => {
+        paramsArr.push({
+          equipmentCategory: 'CFSSES',
+          infoCode: setType,
+          value: 1,
+          objectId: item.id,
+        });
+      });
+    } else {
+      const params = {
+        projectId: 'Pj1101080259',
+        objectId: id, // 设备ID/窗帘组ID
+        equipmentCategory: 'CFSSES', // 设备编码 窗帘:CFSSES
+        infoCode: setType, // 窗帘开设定:EquipOnSet 窗帘关设定:EquipOffSet
+        value: 1, // 窗帘 1 移动/停止
+      };
+      paramsArr.push(params);
+    }
+    console.log(paramsArr, 'paramsArrparamsArr');
+  };
+  const handleCurtain = (setType, id, index) => {
+    const nowTime = Date.now();
+    if (nowTime - preTime <= 2000) return; // 请求间隔 2秒
+    changePreTime(Date.now());
+    sendData(setType, id);
+    if (setType == 'EquipOffSet') {
+      setDownFlag(true);
+      setUpFlag(false);
+    } else {
+      setUpFlag(true);
+      setDownFlag(false);
+    }
+    setCount(2);
+    setTimer.current = setInterval(() => {
+      setCount((count) => {
+        return count - 1;
+      });
+    }, 1000);
+  };
+
+  useEffect(() => {
+    if (count == 2) changeCurtainTex('指令下发中…');
+    if (count == 1) changeCurtainTex('再次点击停止窗帘');
+    if (count === 0) {
+      changeCurtainTex('');
+      setDownFlag(false);
+      setUpFlag(false);
+      clearInterval(setTimer.current);
+    }
+  }, [count]);
+  return (
+    <>
+      <div
+        onClick={() => {
+          handleCurtain('EquipOffSet', id, 1);
+        }}
+        className={`${commonStyles.circulBtn} ${commonStyles.mgr20} ${
+          downFlag ? commonStyles.yell : ''
+        }`}
+      >
+        {downFlag && <div>{count}</div>}
+        {!downFlag && <img className={commonStyles.btnIcon} src={curtain_close_icon_row}></img>}
+      </div>
+
+      <div
+        onClick={() => {
+          handleCurtain('EquipOnSet', id, 2);
+        }}
+        className={`${commonStyles.circulBtn}  ${upFlag ? commonStyles.yell : ''}`}
+      >
+        {upFlag && <div>{count}</div>}
+        {!upFlag && <img className={commonStyles.btnIcon} src={curtain_open_icon_row}></img>}
+      </div>
+    </>
+  );
+};

+ 103 - 0
src/pages/Equipment/components/deviceModal/curtainEq/index.jsx

@@ -0,0 +1,103 @@
+import React, { useState, useEffect, useCallback } from 'react';
+import styles from './index.less';
+import commonStyles from '../common.less';
+import { equipImageMap } from '@/config/image.js';
+import CurtainBtn from './curtainBtn';
+import { getObjectDataEqpGroupHttp } from '@/services/ant-design-pro/equipment';
+
+const { curtain_open_row, expend_down, expend_up } = equipImageMap;
+
+export default () => {
+  const [isMore, setIsMore] = useState(false); // 可以展开
+  const [flagSvg, setFlagSvg] = useState(false); // 箭头方向
+  const [suspendDownFlag, setSuspendDownFlag] = useState(true); // 总向下暂停
+  const [suspendUpFlag, setSuspendUpFlag] = useState(false); // 总向下暂停
+  const [count, setCount] = useState(2); // 倒计时
+  const [countText, setCountText] = useState(); // 倒计时文案
+  const [curtainArr, setCurtainArr] = useState([]); // 窗帘数据
+  const [preTime, setPreTime] = useState(Date.now());
+  const [curtainText, setCurtainText] = useState('');
+  function handleExpend() {
+    setFlagSvg(!flagSvg);
+  }
+  const changePreTime = useCallback((val) => {
+    setPreTime(val);
+  });
+  const changeCurtainTex = useCallback((val) => {
+    setCurtainText(val);
+  });
+  useEffect(() => {
+    const params = {
+      criteria: {
+        projectId: 'Pj1101080259',
+        spaceId: 'Sp1101080259c4434730d12144ba890fe11f796d3143',
+        type: 0,
+      },
+      orders: [{ column: 'sortNum', asc: true }],
+    };
+    getObjectDataEqpGroupHttp(params).then((res) => {
+      let arr = res.content;
+      if (arr.length > 1) {
+        setIsMore(true);
+      } else {
+        setIsMore(false);
+      }
+      setCurtainArr(arr);
+    });
+  }, []);
+
+  return (
+    <div className={commonStyles.box}>
+      <div className={commonStyles.content}>
+        <div className={commonStyles.env}>
+          <div className={commonStyles.envLeft}>
+            <span className={commonStyles.eqTitle}>{isMore ? '窗帘' : curtainArr[0]?.name}</span>
+            <div className={`${commonStyles.eqStatus} ${commonStyles.pdt10}`}>
+              <span>{curtainText}</span>
+            </div>
+            {isMore && (
+              <div className={commonStyles.showAll} onClick={handleExpend}>
+                <img className={commonStyles.showImg} src={flagSvg ? expend_up : expend_down}></img>
+                <div className={commonStyles.showAllText}>显示全部</div>
+              </div>
+            )}
+          </div>
+          <div className={commonStyles.envRight}>
+            <img className={commonStyles.roomEqImg} src={curtain_open_row} />
+          </div>
+          {!flagSvg && (
+            <div className={commonStyles.eqCirculBtn}>
+              <CurtainBtn
+                id=""
+                isTotal={true}
+                preTime={preTime}
+                changePreTime={changePreTime}
+                changeCurtainTex={changeCurtainTex}
+                curtainArr={curtainArr}
+              ></CurtainBtn>
+            </div>
+          )}
+        </div>
+      </div>
+      {curtainArr.map((item, idx) => {
+        if (flagSvg) {
+          return (
+            <div className={`${styles.lampChild} ${commonStyles.flexBetween}`} key={item.id}>
+              <div className={commonStyles.eqTitle}>{item.name}</div>
+              <div className={commonStyles.dsflex}>
+                <CurtainBtn
+                  id={item.id}
+                  isTotal={false}
+                  preTime={preTime}
+                  changePreTime={changePreTime}
+                  changeCurtainTex={changeCurtainTex}
+                  curtainArr={curtainArr}
+                ></CurtainBtn>
+              </div>
+            </div>
+          );
+        }
+      })}
+    </div>
+  );
+};

+ 6 - 0
src/pages/Equipment/components/deviceModal/curtainEq/index.less

@@ -0,0 +1,6 @@
+.lampChild {
+  height: 60px;
+  padding-right: 12px;
+  padding-left: 30px;
+  border-top: 1px solid rgba(196, 196, 196, 0.4);
+}

+ 93 - 158
src/pages/Equipment/components/deviceModal/index.jsx

@@ -1,185 +1,129 @@
 import React, { useState, useEffect } from 'react';
-import { Modal, Row, Col, Form, Select, Input, Button } from 'antd';
-import { CloseOutlined } from '@ant-design/icons';
+import { Modal, Row, Col } from 'antd';
 import Icon from '@/tenants-ui/Icon';
 import styles from './index.less';
-import { EditOutlined } from '@ant-design/icons';
 import { equipImageMap } from '@/config/image.js';
 import AirEq from './airEq';
 import LampEq from './lampEq';
-
-const typeList = [
-  {
-    label: '独立办公室',
-    value: '1s',
-  },
-  {
-    label: '办公区',
-    value: '2s',
-  },
-  {
-    label: '活动区',
-    value: '3s',
-  },
-];
+import CurtainEq from './curtainEq';
+import { getSpaceAdjustList } from '@/services/ant-design-pro/equipment';
 
 export default ({ onClose }) => {
-  const { officeImg, curtainTemp, waterTemp, lampTemp, airTemp } = equipImageMap;
-  const [currentType, setCurrentType] = useState('3s');
-  const [spaceName, setSpaceName] = useState('王总办公室');
-  const [paramList, setParamList] = useState([
+  const envArr = [
     {
       name: '温度',
-      id: 'Tdb',
-      num: 24,
-      describe: '温度适宜',
+      id: 'temperature',
+      num: '0',
+      describe: '--',
     },
     {
       name: 'CO₂',
-      id: 'CO2',
-      num: 410,
-      describe: '空气清新',
+      id: 'co2',
+      num: '0',
+      describe: '--',
     },
     {
       name: 'PM2.5',
-      id: 'PM2d5',
-      num: 0.3,
-      describe: '优秀',
+      id: 'pm25',
+      num: '0',
+      describe: '--',
     },
     {
       name: '甲醛',
-      id: 'HCHO',
-      num: 0.5,
-      describe: '健康',
+      id: 'hcho',
+      num: '0',
+      describe: '--',
     },
     {
       name: '湿度',
-      id: 'RH',
-      num: 26,
+      id: 'humidity',
+      num: '0',
       unit: '%',
-      describe: '健康',
+      describe: '--',
     },
-  ]);
-  //const [paramId, setParamId] = useState('Tdb&RH');
-  const [paramObj, setParamObj] = useState({});
-  const [editVisible, setEditVisible] = useState(false);
-  useEffect(() => {
-    console.log('chartModal-effect');
-    setParamObj(paramList[0]);
-  }, []);
-  const nameChange = () => {
-    setEditVisible(true);
-  };
-  const [form] = Form.useForm();
-  const cancelSave = () => {
-    setEditVisible(false);
-  };
-  const saveForm = () => {
-    form
-      .validateFields()
-      .then((values) => {})
-      .catch((errorInfo) => {
-        //debugger;
+  ];
+  const checkLevel = (value, name) => {
+    if (value || value == 0) {
+      let objList = {
+        temperature: {
+          range: [20, 24],
+          text: ['偏冷', '舒适', '偏热'],
+        },
+        humidity: {
+          range: [30, 70],
+          text: ['干燥', '适宜', '湿润'],
+        },
+        co2: {
+          range: [800, 1500],
+          text: ['适宜', '偏高', '超标'],
+        },
+        pm25: {
+          range: [35, 75],
+          text: ['优', '良', '差'],
+        },
+        hcho: {
+          range: [0.08, 0.1],
+          text: ['适宜', '偏高', '超标'],
+        },
+      };
+      let sortArr = [value, ...objList[name].range].sort((a, b) => {
+        return a - b;
       });
-    // setEditVisible(false);
-  };
-  const [errorObj, setErrorObj] = useState({});
-  const formValueChange = () => {
-    setTimeout(() => {
-      var errors = form.getFieldsError();
-      var errorObjTemp = {};
 
-      errors.forEach(function (item) {
-        if (item?.errors?.length > 0 && item?.name?.length > 0) {
-          errorObjTemp[item.name[0]] = item.errors;
-        }
-      });
-      setErrorObj(errorObjTemp);
-    }, 0);
+      let level = sortArr.findIndex((item) => item === value);
+      let levelTxt = objList[name].text[level];
+      return { level, levelTxt };
+    } else {
+      return { level: '--', levelTxt: '--' };
+    }
   };
+  const { officeImg } = equipImageMap;
+  const [currentType, setCurrentType] = useState('3s');
+  const [spaceName, setSpaceName] = useState('王总办公室');
+  const [paramList, setParamList] = useState([]);
+
+  useEffect(() => {
+    const paramsObj = {
+      criteria: {
+        spaceId: 'Sp1101080259a0fc148d72f242fe9300566c12e15bf4',
+        projectId: 'Pj1101080259',
+      },
+      pubname: 'sagacareAndtenantslink',
+      openid: '9a1ecfbacb6b4f249bf2dd3ec7793ead', // userId
+    };
+    getSpaceAdjustList(paramsObj).then((res) => {
+      res.content &&
+        res.content.forEach((item, idx) => {
+          envArr.forEach((jtem, jdx) => {
+            jtem.describe = checkLevel(item[jtem.id], jtem.id).levelTxt;
+            if (jtem.id == 'humidity') {
+              jtem.num = item[jtem.id].toFixed(0);
+            } else if (jtem.id == 'hcho') {
+              jtem.num = item[jtem.id].toFixed(2);
+            } else {
+              jtem.num = item[jtem.id];
+            }
+          });
+          console.log(paramList, 'paramListparamList');
+          setParamList(envArr);
+        });
+    });
+  }, []);
+
   return (
     <>
       <Modal width={810} visible maskClosable={false} closable={false} footer={null}>
         <div className={styles.main}>
           <div className={styles.header}>
-            {!editVisible && (
-              <div className={styles.show}>
-                <div className={styles.tileline} onClick={nameChange}>
-                  <img src={officeImg} className={styles.titleIcon}></img>
-                  <span>1#-1312</span>
-                  <EditOutlined className={styles.edit} />
-                </div>
-                <div className={styles.timeLine}>
-                  使用时间:<span>08:00-20:00</span>
-                </div>
+            <div className={styles.show}>
+              <div className={styles.tileline}>
+                <img src={officeImg} className={styles.titleIcon}></img>
+                <span>1#-1312</span>
               </div>
-            )}
-            {editVisible && (
-              <div className={styles.editShow}>
-                <Form
-                  layout="vertical"
-                  initialValues={{ spacename: '总裁办公室', spacetype: '3s' }}
-                  onValuesChange={() => {
-                    formValueChange();
-                  }}
-                  form={form}
-                >
-                  <Row gutter={[20, 0]}>
-                    <Col span={8}>
-                      <Form.Item
-                        label="空间名称"
-                        name="spacename"
-                        rules={[{ required: true, message: '空间名称不能为空' }]}
-                      >
-                        <Input
-                          autoComplete="off"
-                          size="large"
-                          style={{ height: '50px' }}
-                          suffix={
-                            errorObj.spacename ? (
-                              <Icon type={'warning'} style={{ color: '#E5574F' }} />
-                            ) : (
-                              <span></span>
-                            )
-                          }
-                        />
-                      </Form.Item>
-                    </Col>
-                    <Col span={8}>
-                      <Form.Item label="空间类型" name="spacetype">
-                        <Select
-                          size="large"
-                          onChange={(val) => {
-                            console.log(val);
-                          }}
-                          options={typeList}
-                        />
-                      </Form.Item>
-                    </Col>
-                    <Col span={8} style={{ display: 'flex', alignItems: 'center' }}>
-                      <Button
-                        type="primary"
-                        shape="round"
-                        size="middle"
-                        style={{ width: 88, height: 50 }}
-                        onClick={saveForm}
-                      >
-                        保存
-                      </Button>
-                      <Button
-                        type="default"
-                        size="middle"
-                        style={{ width: 88, height: 50, border: 'none', marginLeft: 10 }}
-                        icon={<CloseOutlined />}
-                        onClick={cancelSave}
-                      >
-                        取消
-                      </Button>
-                    </Col>
-                  </Row>
-                </Form>
+              <div className={styles.timeLine}>
+                使用时间:<span>08:00-20:00</span>
               </div>
-            )}
+            </div>
             <div className={styles.close} onClick={onClose}>
               <Icon type="close" />
             </div>
@@ -202,24 +146,15 @@ export default ({ onClose }) => {
             <div className={styles.devices}>
               <Row gutter={[12, 18]}>
                 <Col span={12}>
-                  {/* <img style={{ width: '100%' }} src={airTemp}></img> */}
                   <AirEq></AirEq>
                 </Col>
                 <Col span={12}>
-                  {/* <img style={{ width: '100%' }} src={lampTemp}></img> */}
                   <LampEq></LampEq>
                 </Col>
                 <Col span={12}>
-                  <img style={{ width: '100%' }} src={waterTemp}></img>
-                </Col>
-                <Col span={12}>
-                  <img style={{ width: '100%' }} src={curtainTemp}></img>
+                  <CurtainEq></CurtainEq>
                 </Col>
               </Row>
-
-              {/* <img src={lampTemp}></img>
-              <img src={waterTemp}></img>
-              <img src={curtainTemp}></img> */}
             </div>
           </div>
         </div>

+ 111 - 15
src/pages/Equipment/components/deviceModal/lampEq/index.jsx

@@ -1,30 +1,117 @@
-import React, { useState, useEffect } from 'react';
+import React, { useState, useEffect, useCallback, useRef } from 'react';
+import { message } from 'antd';
 import styles from './index.less';
 import commonStyles from '../common.less';
 import { equipImageMap } from '@/config/image.js';
 import AnSwitch from '../anSwitch';
-const { lamp_open, expend_down, expend_up } = equipImageMap;
+import { getLampHttp, getStatusHttp } from '@/services/ant-design-pro/equipment';
+const { lamp_open, lamp_close, expend_down, expend_up } = equipImageMap;
 export default () => {
-  const [isMore, setIsMore] = useState(true);
+  const [isMore, setIsMore] = useState(false);
+  const [isOpen, setIsOpen] = useState(false); // 12 开, 10关
+  const [lampArr, setLampArr] = useState([]); // 12 开, 10关
+  const startTime = null;
+  const endTime = null;
+  const startLightsStatusTimer = useRef(null);
+  const getLamp = () => {
+    // startLightsStatusTimer.current = setInterval(() => {
+    getLampHttp('Sp1101080259c4434730d12144ba890fe11f796d3143').then((res) => {
+      const arr = res.content;
+      if (arr.length > 1) setIsMore(true);
+      arr.forEach((item) => {
+        if (item.runStatus) setIsOpen(true);
+      });
+      setLampArr(arr);
+    });
+    // }, 1000);
+  };
 
-  const lampArr = [
-    { id: '1', title: '主灯', sta: true },
-    { id: '2', title: '顶灯', sta: false },
-  ];
+  useEffect(() => {
+    getLamp(); // 灯设备状态
+  }, []);
 
   const [flagSvg, setFlagSvg] = useState(false);
   function handleExpend() {
+    clearInterval(startLightsStatusTimer.current);
     setFlagSvg(!flagSvg);
   }
+  // 定时调用 查询指令接口
+  const checkChangeLightStatusSuccess = (paramsArr) => {
+    if (endTime - startTime >= 5000) {
+      //   wx.hideLoading();
+      message.error('网络故障,请重试');
+    } else {
+      getStatusHttp(paramsArr).then((res) => {
+        return judgeChangeResponeseSuccess(res);
+      });
+    }
+  };
+  //   检查开关指令下发状态
+  const judgeChangeResponeseSuccess = (response) => {
+    return new Promise((resolve, reject) => {
+      let result = response.content[0];
+      if (result.result === 'success') {
+        if (result.state === 200 && result.exeResult === 'success') {
+          resolve({ status: 'success', data: result });
+        } else if (result.exeResult === 'processing:rcvd' || result.state === 202) {
+          resolve({ status: 'processing', data: result });
+        } else {
+        }
+      } else {
+        console.log('judgeChangeResponeseSuccess-fail');
+      }
+    });
+  };
+  //  开关
+  const changeSwitch = (val, type, id) => {
+    let paramsArr = [];
+    if (type == 'total') {
+      lampArr.forEach((item) => {
+        paramsArr.push({
+          id: item.id,
+          switch: val,
+        });
+      });
+    } else {
+      paramsArr.push({ id: id, switch: val });
+    }
+    console.log(paramsArr, 'paramsArr');
+    setallLampHttp(paramsArr)
+      .then((res) => {
+        startTime = Date.now(); // 开始计时'
+        clearInterval(startLightsStatusTimer.current); // 灯设备
+        return judgeChangeResponeseSuccess(res, paramsArr);
+      })
+      .then(
+        (res) => {
+          switch (res.status) {
+            case 'success':
+              getLamp();
+            case 'processing':
+              // 继续查询
+              //   wx.showLoading({
+              //     title: '加载中...',
+              //     mark: true,
+              //   });
+              endTime = Date.now();
+              checkChangeLightStatusSuccess(paramsArr);
+              break;
+          }
+        },
+        () => {
+          message.error('操作失败,请重试');
+        },
+      );
+  };
 
   return (
     <div className={commonStyles.box}>
       <div className={commonStyles.content}>
         <div className={commonStyles.env}>
           <div className={commonStyles.envLeft}>
-            <span className={commonStyles.eqTitle}>照明</span>
+            <span className={commonStyles.eqTitle}>{isMore ? '光照' : lampArr[0]?.localName}</span>
             <div className={`${commonStyles.eqStatus} ${commonStyles.pdt10}`}>
-              <span>照明已关闭</span>
+              <span>{isOpen ? '照明已开启' : '照明已关闭'}</span>
             </div>
             {isMore && (
               <div className={commonStyles.showAll} onClick={handleExpend}>
@@ -34,11 +121,16 @@ export default () => {
             )}
           </div>
           <div className={commonStyles.envRight}>
-            <img className={commonStyles.roomEqImg} src={lamp_open} />
+            <img className={commonStyles.roomEqImg} src={isOpen ? lamp_open : lamp_close} />
           </div>
           {!flagSvg && (
-            <div className={commonStyles.eqBtn}>
-              <AnSwitch isOpen={true} />
+            <div
+              className={commonStyles.eqBtn}
+              onClick={() => {
+                changeSwitch(!isOpen, 'total');
+              }}
+            >
+              <AnSwitch isOpen={isOpen} />
             </div>
           )}
         </div>
@@ -47,9 +139,13 @@ export default () => {
         if (flagSvg) {
           return (
             <div className={`${styles.lampChild} ${commonStyles.flexBetween}`} key={item.id}>
-              <div className={commonStyles.eqTitle}>{item.title}</div>
-              <div>
-                <AnSwitch isOpen={item.sta}></AnSwitch>
+              <div className={commonStyles.eqTitle}>{item.localName}</div>
+              <div
+                onClick={() => {
+                  changeSwitch(!item.runStatus, 'child', item.id);
+                }}
+              >
+                <AnSwitch isOpen={item.runStatus}></AnSwitch>
               </div>
             </div>
           );

+ 2 - 1
src/pages/Equipment/index.tsx

@@ -21,6 +21,7 @@ import type { navigatorItem } from '@/pages/Environment/index';
 
 const Environment: React.FC = () => {
   const { envir_all, equip_air, equip_lamp, envir_curtain } = equipImageMap;
+
   const [searchText, setSearchText] = useState<{ text: any }>();
   const [showModal, setShowModal] = useState<boolean>(false);
   const [navigatorList] = useState<navigatorItem[]>([
@@ -205,7 +206,7 @@ const Environment: React.FC = () => {
       {showModal && (
         <DeviceModal
           onClose={() => {
-            setShowModal(false);
+            setShowModal(true);
           }}
         ></DeviceModal>
       )}

+ 101 - 0
src/services/ant-design-pro/equipment.js

@@ -0,0 +1,101 @@
+import { request } from 'umi';
+
+const API = 'https://duoduoenv.sagacloud.cn';
+
+function commonParams() {
+  return `openid=9a1ecfbacb6b4f249bf2dd3ec7793ead&pubname=sagacareAndtenantslink&projectId=Pj1101080259&userName=%E5%AE%89%E5%B0%8F%E9%9C%9E&userPhone=17611228068&userId=9a1ecfbacb6b4f249bf2dd3ec7793ead`;
+  //   return `openid=9a1ecfbacb6b4f249bf2dd3ec7793ead&pubname=sagacareAndtenantslink&projectId=Pj1101080259&userName=anxiaoxia&userPhone=17611228068
+  //   &userId=9a1ecfbacb6b4f249bf2dd3ec7793ead`;
+}
+function getProjectId(){
+    return 'Pj1101080259'
+}
+
+//窗帘  设置设备
+// function setEquipeHttp(params) {
+//   return $http({
+//     serverSp: config.brsgServer.duoduoUrl,
+//     url: `/server/object/eqp/infocode/set?${commonParams()}`,
+//     method: 'POST',
+//     isNotShowErrorToast: true,
+//     errorSave: true,
+//     data: JSON.stringify(params),
+//   });
+// }
+
+//窗帘 获取设备
+export const getObjectDataEqpGroupHttp = (params) => {
+  return request(`/server/object/objectDataEqpGroup/query?${commonParams()}`, {
+    method: 'POST',
+    isNotShowErrorToast: true,
+    errorSave: true,
+    data: JSON.stringify({ ...params }),
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  });
+};
+
+// 灯的状态
+export const getLampHttp = (params) => {
+  return request(`/server/light/status/query?${commonParams()}&spaceId=${params}`, {
+    isNotShowErrorToast: true,
+    errorSave: true,
+    method: 'GET',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  });
+};
+
+// 开关失败时 定时查询灯状态
+export const getStatusHttp = (params) => {
+  return request(`/server/light/onoff/setSatus?${commonParams()}`, {
+    method: 'POST',
+    isNotShowErrorToast: true,
+    errorSave: true,
+    data: JSON.stringify(params),
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  });
+};
+
+//  空调 - 调节文案/空调信息
+export const getFeedbackDocumentsHttp = (params) => {
+  return request(`/server/custom/feedback/documents?${commonParams()}`, {
+    isNotShowErrorToast: true,
+    errorSave: true,
+    method: 'POST',
+    data: JSON.stringify(params),
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  });
+};
+
+//  空调 调节
+export const changeAirHttp = (params) => {
+  return request(`/server/custom/feedbackCreate/v2?${commonParams()}`, {
+    method: 'POST',
+    isNotShowErrorToast: true,
+    errorSave: true,
+    data: JSON.stringify({ ...params, projectId: getProjectId() }),
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  });
+};
+
+// 空间环境质量
+export const  getSpaceAdjustList =(params) =>{
+    return request(`/server/space/property?${commonParams()}`,{
+      method: 'POST',
+      isNotShowErrorToast: true,
+      errorSave: true,
+      data: JSON.stringify({...params, criteria: {...params.criteria, projectId: getProjectId()}}),
+      headers: {
+        'Content-Type': 'application/json',
+      },
+    });
+  }