Jelajahi Sumber

有人无人的接口,详情中使用时间的展示

zhaojijng 2 tahun lalu
induk
melakukan
4d6b648398

+ 53 - 44
src/assets/icons/sagacare/iconfont.css

@@ -1,166 +1,175 @@
 @font-face {
-  font-family: 'iconfont'; /* Project id 3184967 */
-  src: url('~@/assets/icons/sagacare/iconfont.woff2') format('woff2'),
-    url('~@/assets/icons/sagacare/iconfont.woff') format('woff'),
-    url('~@/assets/icons/sagacare/iconfont.ttf') format('truetype');
+  font-family: "iconfont"; /* Project id 3184967 */
+  src: url('iconfont.woff2?t=1661310595751') format('woff2'),
+       url('iconfont.woff?t=1661310595751') format('woff'),
+       url('iconfont.ttf?t=1661310595751') format('truetype');
 }
 
 .iconfont {
-  font-size: 12px;
-  font-family: 'iconfont' !important;
+  font-family: "iconfont" !important;
+  font-size: 16px;
   font-style: normal;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-manageyouren:before {
+  content: "\e630";
+}
+
+.icon-managewuren:before {
+  content: "\e62f";
+}
+
 .icon-manageperson:before {
-  content: '\e62d';
+  content: "\e62d";
 }
 
 .icon-manageintroduce:before {
-  content: '\e62b';
+  content: "\e62b";
 }
 
 .icon-managecloth:before {
-  content: '\e62a';
+  content: "\e62a";
 }
 
 .icon-manageswim:before {
-  content: '\e629';
+  content: "\e629";
 }
 
 .icon-managebook:before {
-  content: '\e628';
+  content: "\e628";
 }
 
 .icon-manageexperiment:before {
-  content: '\e627';
+  content: "\e627";
 }
 
 .icon-managereception:before {
-  content: '\e626';
+  content: "\e626";
 }
 
 .icon-manageactivity:before {
-  content: '\e625';
+  content: "\e625";
 }
 
 .icon-managecontrol:before {
-  content: '\e624';
+  content: "\e624";
 }
 
 .icon-managesport:before {
-  content: '\e623';
+  content: "\e623";
 }
 
 .icon-managepublic:before {
-  content: '\e622';
+  content: "\e622";
 }
 
 .icon-managedevice:before {
-  content: '\e620';
+  content: "\e620";
 }
 
 .icon-managelift:before {
-  content: '\e61f';
+  content: "\e61f";
 }
 
 .icon-managedining:before {
-  content: '\e61e';
+  content: "\e61e";
 }
 
 .icon-managewashroom:before {
-  content: '\e61c';
+  content: "\e61c";
 }
 
 .icon-managereduce:before {
-  content: '\e61b';
+  content: "\e61b";
 }
 
 .icon-managezoom:before {
-  content: '\e61a';
+  content: "\e61a";
 }
 
 .icon-manageenvironment:before {
-  content: '\e619';
+  content: "\e619";
 }
 
 .icon-manageequipment:before {
-  content: '\e618';
+  content: "\e618";
 }
 
 .icon-manageruntime:before {
-  content: '\e617';
+  content: "\e617";
 }
 
 .icon-managenotify:before {
-  content: '\e615';
+  content: "\e615";
 }
 
 .icon-managework:before {
-  content: '\e614';
+  content: "\e614";
 }
 
 .icon-managehover:before {
-  content: '\e613';
+  content: "\e613";
 }
 
 .icon-managelight:before {
-  content: '\e611';
+  content: "\e611";
 }
 
 .icon-managecurtain:before {
-  content: '\e610';
+  content: "\e610";
 }
 
 .icon-manageairConditioner:before {
-  content: '\e60f';
+  content: "\e60f";
 }
 
 .icon-managewalk:before {
-  content: '\e60e';
+  content: "\e60e";
 }
 
 .icon-managestair:before {
-  content: '\e60d';
+  content: "\e60d";
 }
 
 .icon-managerest:before {
-  content: '\e60c';
+  content: "\e60c";
 }
 
 .icon-manageoffice:before {
-  content: '\e60b';
+  content: "\e60b";
 }
 
 .icon-managemeeting:before {
-  content: '\e60a';
+  content: "\e60a";
 }
 
 .icon-manageletter:before {
-  content: '\e609';
+  content: "\e609";
 }
 
 .icon-managedocument:before {
-  content: '\e608';
+  content: "\e608";
 }
 
 .icon-managewarning:before {
-  content: '\ea51';
+  content: "\ea51";
 }
 
 .icon-managecloseall:before {
-  content: '\e607';
+  content: "\e607";
 }
 
 .icon-managesearch:before {
-  content: '\e606';
+  content: "\e606";
 }
 
 .icon-manageclose:before {
-  content: '\e605';
+  content: "\e605";
 }
 
 .icon-managebackward:before {
-  content: '\e604';
+  content: "\e604";
 }
+

+ 14 - 0
src/assets/icons/sagacare/iconfont.json

@@ -6,6 +6,20 @@
   "description": "行政管理所用图片",
   "glyphs": [
     {
+      "icon_id": "31441833",
+      "name": "youren",
+      "font_class": "youren",
+      "unicode": "e630",
+      "unicode_decimal": 58928
+    },
+    {
+      "icon_id": "31440631",
+      "name": "wuren",
+      "font_class": "wuren",
+      "unicode": "e62f",
+      "unicode_decimal": 58927
+    },
+    {
       "icon_id": "29802519",
       "name": "person",
       "font_class": "person",

TEMPAT SAMPAH
src/assets/icons/sagacare/iconfont.ttf


TEMPAT SAMPAH
src/assets/icons/sagacare/iconfont.woff


TEMPAT SAMPAH
src/assets/icons/sagacare/iconfont.woff2


+ 21 - 1
src/models/sagacare_spaceFunc.ts

@@ -1,4 +1,6 @@
-import React, { useState, useCallback } from 'react';
+import React, { useEffect, useMemo, useState, useCallback } from 'react';
+import { getSpaceAdjustArray } from '@/services/sagacare_service/environment';
+import { projectObj } from '@/config/api';
 
 export default function () {
   const allFunc = {
@@ -58,8 +60,26 @@ export default function () {
 
     return '';
   }, []);
+  const [hasPersonList, setHasPersonList] = useState<any[]>([]);
+
+  const querySpaceAdjustList = useCallback((selFloorId) => {
+    getSpaceAdjustArray(
+      {
+        criteria: {
+          projectId: projectObj.projectId,
+          floorId: selFloorId,
+        },
+      },
+      {},
+    ).then(function (res) {
+      var resList = res.content || [];
+      setHasPersonList(resList);
+    });
+  }, []);
 
   return {
     getSpaceFunc,
+    hasPersonList,
+    querySpaceAdjustList,
   };
 }

+ 1 - 1
src/pages/Environment/index.tsx

@@ -272,7 +272,7 @@ const Environment: React.FC = () => {
         return ele.id == spaceId;
       });
 
-      var combine = Object.assign({}, mitem, filterSpace[0]);
+      var combine = Object.assign({}, filterSpace[0], mitem);
       combineList.push(combine);
     });
 

+ 105 - 71
src/pages/Equipment/components/deviceModal/index.jsx

@@ -126,82 +126,91 @@ export default ({ onClose, showSpace }) => {
     });
   };
 
-  const operateTime = () => {
+  const operateTime = useMemo(() => {
     // 使用时间
     let timeArr = [];
-    if (showSpace.meetTime && showSpace.workTimeStartTime) {
-      let arr = [];
-      const meetingArr = JSON.parse(JSON.stringify(showSpace.meetTime));
 
-      let startBetween = false; // 会议时间是否跨在 工作头部
-      let endBetween = false; // 会议时间是否跨在 工作尾部
-      let workTimeStartTime = showSpace.workTimeStartTime; // 工作开始时间
-      let workTimeEndTime = showSpace.workTimeEndTime; // 工作开始时间
-      workTimeStartTime = workTimeStartTime.replace(':', '');
-      workTimeEndTime = workTimeEndTime.replace(':', '');
-      for (let i = meetingArr.length - 1; i >= 0; i--) {
-        let element = meetingArr[i];
-        let elementStartTime = element.meetTimeStartTime.replace(':', '');
-        let elementEndTime = element.meetTimeEndTime.replace(':', '');
-        if (elementEndTime > workTimeEndTime) {
-          // 比较工作时间的尾巴
-          if (elementStartTime > workTimeEndTime) {
-            arr.unshift(elementEndTime);
-            arr.unshift(elementStartTime);
-          } else {
-            arr.unshift(elementEndTime);
-            endBetween = true;
-          }
-        }
+    // if (showSpace.meetTime && showSpace.workTimeStartTime) {
+    //   let arr = [];
+    //   const meetingArr = JSON.parse(JSON.stringify(showSpace.meetTime));
 
-        if (elementStartTime < workTimeStartTime) {
-          // 比较工作时间的头
-          if (elementEndTime < workTimeStartTime) {
-            arr.unshift(elementEndTime);
-            arr.unshift(elementStartTime);
-          } else {
-            arr.unshift(elementStartTime);
-            startBetween = true;
-          }
-        }
-      }
-      if (!startBetween && endBetween) {
-        // 尾巴交集
-        arr.push(workTimeStartTime);
-      }
-      if (startBetween && !endBetween) {
-        // 头部交集
-        arr.push(workTimeEndTime);
-      }
-      if (!startBetween && !endBetween) {
-        //无交集
-        arr.push(workTimeStartTime);
-        arr.push(workTimeEndTime);
-      }
-      arr = [...new Set(arr)].sort();
-      for (let j = 0; j < arr.length; j += 2) {
-        const element = arr[j].slice(0, 2) + ':' + arr[j].slice(2);
-        const elemNext = arr[j + 1].slice(0, 2) + ':' + arr[j + 1].slice(2);
-        timeArr.push(`${element}-${elemNext}`);
-      }
-    } else {
-      // 会议时间
-      showSpace.meetTime &&
-        showSpace.meetTime.forEach((item) => {
-          timeArr.push(`${item.meetTimeStartTime}-${item.meetTimeEndTime}`);
-        });
-      // 工作时间
-      showSpace.workTimeStartTime &&
-        timeArr.push(`${showSpace.workTimeStartTime}-${showSpace.workTimeEndTime}`);
-    }
+    //   let startBetween = false; // 会议时间是否跨在 工作头部
+    //   let endBetween = false; // 会议时间是否跨在 工作尾部
+    //   let workTimeStartTime = showSpace.workTimeStartTime; // 工作开始时间
+    //   let workTimeEndTime = showSpace.workTimeEndTime; // 工作开始时间
+    //   workTimeStartTime = workTimeStartTime.replace(':', '');
+    //   workTimeEndTime = workTimeEndTime.replace(':', '');
+    //   for (let i = meetingArr.length - 1; i >= 0; i--) {
+    //     let element = meetingArr[i];
+    //     let elementStartTime = element.meetTimeStartTime.replace(':', '');
+    //     let elementEndTime = element.meetTimeEndTime.replace(':', '');
+    //     if (elementEndTime > workTimeEndTime) {
+    //       // 比较工作时间的尾巴
+    //       if (elementStartTime > workTimeEndTime) {
+    //         arr.unshift(elementEndTime);
+    //         arr.unshift(elementStartTime);
+    //       } else {
+    //         arr.unshift(elementEndTime);
+    //         endBetween = true;
+    //       }
+    //     }
+
+    //     if (elementStartTime < workTimeStartTime) {
+    //       // 比较工作时间的头
+    //       if (elementEndTime < workTimeStartTime) {
+    //         arr.unshift(elementEndTime);
+    //         arr.unshift(elementStartTime);
+    //       } else {
+    //         arr.unshift(elementStartTime);
+    //         startBetween = true;
+    //       }
+    //     }
+    //   }
+    //   if (!startBetween && endBetween) {
+    //     // 尾巴交集
+    //     arr.push(workTimeStartTime);
+    //   }
+    //   if (startBetween && !endBetween) {
+    //     // 头部交集
+    //     arr.push(workTimeEndTime);
+    //   }
+    //   if (!startBetween && !endBetween) {
+    //     //无交集
+    //     arr.push(workTimeStartTime);
+    //     arr.push(workTimeEndTime);
+    //   }
+    //   arr = [...new Set(arr)].sort();
+    //   for (let j = 0; j < arr.length; j += 2) {
+    //     const element = arr[j].slice(0, 2) + ':' + arr[j].slice(2);
+    //     const elemNext = arr[j + 1].slice(0, 2) + ':' + arr[j + 1].slice(2);
+    //     timeArr.push(`${element}-${elemNext}`);
+    //   }
+    // }
+    var runTimeStatus = '';
+    // 会议时间
+    showSpace.meetTime &&
+      showSpace.meetTime.length > 0 &&
+      (runTimeStatus = 'meetingBook') &&
+      showSpace.meetTime.forEach((item) => {
+        timeArr.push(`${item.meetTimeStartTime}-${item.meetTimeEndTime}`);
+      });
+    var workTime = '--';
+    // 工作时间
+    showSpace.workTimeStartTime &&
+      (workTime = `${showSpace.workTimeStartTime}-${showSpace.workTimeEndTime}`);
 
     // 加班时间
-    showSpace.overTimeStartTime &&
-      timeArr.push(`${showSpace.overTimeStartTime}-${showSpace.overTimeEndTime}`);
+    showSpace.overTime &&
+      showSpace.overTime.length > 0 &&
+      (runTimeStatus = 'overtimeWork') &&
+      showSpace.overTime.forEach((item) => {
+        timeArr.push(`${item.overTimeStartTime}-${item.overTimeEndTime}`);
+      });
 
-    if (timeArr.length == 0) timeArr = ['--'];
-    return timeArr;
-  };
+    //if (timeArr.length == 0) timeArr = ['--'];
+    //debugger;
+    return { workTime: workTime, runTimeStatus: runTimeStatus, timeArr: timeArr };
+  }, [showSpace]);
 
   useEffect(() => {
     getData();
@@ -222,10 +231,35 @@ export default ({ onClose, showSpace }) => {
               <div className={styles.tileline}>
                 <img src={officeImg} className={styles.titleIcon}></img>
                 <span>{showSpace.localName}</span>
+                {showSpace.isPassengerPass == true && (
+                  <span className={styles.hasPerson}>
+                    <Icon
+                      className=""
+                      type="youren"
+                      style={{ color: '#CE9F27', fontWeight: 'bold', marginRight: '2px' }}
+                    ></Icon>
+                    有人
+                  </span>
+                )}
+                {showSpace.isPassengerPass == false && (
+                  <span className={styles.hasPerson}>
+                    <Icon
+                      className=""
+                      type="wuren"
+                      style={{ color: '#8B949E', fontWeight: 'bold', marginRight: '2px' }}
+                    ></Icon>
+                    无人
+                  </span>
+                )}
               </div>
               <div className={styles.timeLine}>
-                使用时间:
-                {operateTime().map((item, idx) => {
+                <span className={styles.pdr10}>工作时间:{operateTime.workTime}</span>
+                {operateTime.runTimeStatus == 'meetingBook'
+                  ? '会议时间:'
+                  : operateTime.runTimeStatus == 'overtimeWork'
+                  ? '加班时间:'
+                  : ''}
+                {operateTime.timeArr.map((item, idx) => {
                   return (
                     <span className={styles.pdr10} key={idx}>
                       {item}

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

@@ -17,9 +17,25 @@
       padding-left: 68px;
       .tileline {
         position: relative;
+        display: flex;
+        align-items: center;
         color: #000;
         font-weight: 600;
         font-size: 20px;
+        .hasPerson {
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          width: 50px;
+          height: 20px;
+          margin-left: 10px;
+          padding: 0 6px;
+          color: #626c78;
+          font-size: 11px;
+          white-space: nowrap;
+          background-color: #edf1f5;
+          border-radius: 10px;
+        }
         .titleIcon {
           position: absolute;
           top: 0;

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

@@ -17,7 +17,7 @@ export default ({ spaceId }) => {
     getLampHttp(spaceId).then(
       (res) => {
         // if (res.result != 'success' && waitSetResultFlag.current) return;
-        const arr = res.content;
+        const arr = res.content || [];
         if (arr.length > 1) {
           setIsMore(true);
           let totalIsOpen = false;

+ 10 - 0
src/pages/Equipment/index.less

@@ -10,9 +10,19 @@
   width: 1340px;
   height: 39px;
   padding-top: 10px;
+  .left {
+    display: flex;
+    float: left;
+    span {
+      margin-right: 6px;
+    }
+  }
   .right {
     display: flex;
     float: right;
+    .rightOpen {
+      display: flex;
+    }
     .circle {
       display: inline-block;
       width: 10px;

+ 101 - 24
src/pages/Equipment/index.tsx

@@ -45,6 +45,8 @@ type statistics = {
   runCount: number;
 };
 const Environment: React.FC = () => {
+  const { hasPersonList, querySpaceAdjustList } = useModel('sagacare_spaceFunc');
+
   const { changeLastFloorId } = useModel('sagacare_buildFloor');
   const { searchSpace } = useModel('sagacare_searchInfo');
   const { getSpaceFunc } = useModel('sagacare_spaceFunc');
@@ -412,6 +414,12 @@ const Environment: React.FC = () => {
     }
   }, [selFloorId]);
 
+  useEffect(() => {
+    if (selFloorId) {
+      querySpaceAdjustList(selFloorId);
+    }
+  }, [selFloorId]);
+
   //合并空间设备数据 和 空间数据
   useEffect(() => {
     var combineList: any = [];
@@ -423,13 +431,16 @@ const Environment: React.FC = () => {
       var filterSpace2 = timeMapList.filter((ele) => {
         return ele.id == spaceId;
       });
-      var combine = Object.assign({}, mitem, filterSpace1[0], filterSpace2[0]);
+      var filterSpace3 = hasPersonList.filter((ele) => {
+        return ele.id == spaceId;
+      });
+      var combine = Object.assign({}, filterSpace3[0], filterSpace1[0], filterSpace2[0], mitem);
 
       combineList.push(combine);
     });
     setMapCombineList(combineList);
     console.log('combine');
-  }, [equipMapList, mapList, timeMapList]);
+  }, [equipMapList, mapList, timeMapList, hasPersonList]);
 
   let firtTime: number = 0;
   let lastTime: number = 0;
@@ -453,27 +464,49 @@ const Environment: React.FC = () => {
       ></TopNavigator>
       <div className={styles.maptop}>
         {selNav.id !== 'all' && selNav.id !== 'curtain' && (
+          <div className={styles.left}>
+            <span>
+              <Icon
+                className=""
+                type="youren"
+                style={{ color: '#CE9F27', fontWeight: 'bold' }}
+              ></Icon>
+              有人
+            </span>
+            <span>
+              <Icon
+                className=""
+                type="wuren"
+                style={{ color: '#8B949E', fontWeight: 'bold' }}
+              ></Icon>
+              无人
+            </span>
+          </div>
+        )}
+        {selNav.id !== 'all' && selNav.id !== 'curtain' && (
           <div className={styles.right}>
-            <div>
-              <span
-                className={styles.circle}
-                style={{ backgroundColor: 'rgba(' + selNav.colorStr + '1)' }}
-              ></span>
-              <span>开启</span>
-            </div>
-            <div>
-              <span
-                className={styles.circle}
-                style={{ backgroundColor: 'rgba(' + selNav.colorStr + '0.4)' }}
-              ></span>
-              <span>部分开启</span>
-            </div>
-            <div>
-              <span
-                className={styles.circle}
-                style={{ backgroundColor: 'rgba(196, 196, 196, 0.6)' }}
-              ></span>
-              <span>关闭</span>
+            <div className={styles.rightOpen}>
+              <div>
+                <span
+                  className={styles.circle}
+                  style={{ backgroundColor: 'rgba(' + selNav.colorStr + '1)' }}
+                ></span>
+                <span>开启</span>
+              </div>
+              <div>
+                <span
+                  className={styles.circle}
+                  style={{ backgroundColor: 'rgba(' + selNav.colorStr + '0.4)' }}
+                ></span>
+                <span>部分开启</span>
+              </div>
+              <div>
+                <span
+                  className={styles.circle}
+                  style={{ backgroundColor: 'rgba(196, 196, 196, 0.6)' }}
+                ></span>
+                <span>关闭</span>
+              </div>
             </div>
           </div>
         )}
@@ -556,8 +589,8 @@ const Environment: React.FC = () => {
                           transform:
                             scale == maxScale
                               ? 'scale(1)'
-                              : item.width < 24 * (item.equipStatusList || []).length ||
-                                item.height < 20
+                              : item.width < 28 * (item.equipStatusList || []).length ||
+                                item.height < 28
                               ? 'scale(0.3)'
                               : 'scale(1)',
                         }}
@@ -582,6 +615,50 @@ const Environment: React.FC = () => {
                         })}
                       </div>
                     )}
+                    {(selNav.id == 'airConditioner' || selNav.id == 'light') &&
+                      item.isPassengerPass &&
+                      item.canClick && (
+                        <div
+                          className={mapstyles.hasPerson}
+                          style={{
+                            transform:
+                              scale == maxScale
+                                ? 'scale(1)'
+                                : item.width < 44 * (item.equipStatusList || []).length ||
+                                  item.height < 20
+                                ? 'scale(0.6)'
+                                : 'scale(1)',
+                          }}
+                        >
+                          <Icon
+                            className=""
+                            type="youren"
+                            style={{ color: '#CE9F27', fontWeight: 'bold' }}
+                          ></Icon>
+                        </div>
+                      )}
+                    {(selNav.id == 'airConditioner' || selNav.id == 'light') &&
+                      item.isPassengerPass == false &&
+                      item.canClick && (
+                        <div
+                          className={mapstyles.hasPerson}
+                          style={{
+                            transform:
+                              scale == maxScale
+                                ? 'scale(1)'
+                                : item.width < 44 * (item.equipStatusList || []).length ||
+                                  item.height < 20
+                                ? 'scale(0.5)'
+                                : 'scale(1)',
+                          }}
+                        >
+                          <Icon
+                            className=""
+                            type="wuren"
+                            style={{ color: '#8B949E', fontWeight: 'bold' }}
+                          ></Icon>
+                        </div>
+                      )}
                     {item.canClick && item[selNav.id] != 'noHave' && (
                       <div
                         className={mapstyles.showModal}

+ 1 - 1
src/pages/Runtime/index.tsx

@@ -221,7 +221,7 @@ const Runtime: React.FC = () => {
         return ele.id == spaceId;
       });
 
-      var combine = Object.assign({}, mitem, filterSpace[0]);
+      var combine = Object.assign({}, filterSpace[0], mitem);
       combineList.push(combine);
     });
 

+ 16 - 0
src/sagacare_components/map/index.less

@@ -54,6 +54,22 @@
   height: 1200px;
   transform-origin: 0% 0%;
   cursor: pointer;
+  .hasPerson {
+    position: absolute;
+    top: 2px;
+    right: 5px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 20px;
+    padding: 0 5px;
+    color: #626c78;
+    font-size: 11px;
+    white-space: nowrap;
+    background-color: #edf1f5;
+    border-radius: 10px;
+    transform-origin: 100% 0%;
+  }
   .houseWrap {
     position: absolute;
     box-sizing: border-box;

+ 12 - 0
src/services/sagacare_service/environment.ts

@@ -83,6 +83,18 @@ export async function queryPropertyData(params: any, options?: { [key: string]:
     },
   );
 }
+export async function getSpaceAdjustArray(body: any, otherParam: any) {
+  return request<API.DeviceTimeType>(
+    `/sgadmin/duoduo-service/duoduoenv-service/spaceAdjust/getSpaceAdjustList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+    },
+  );
+}
 export async function queryEnvironmentParam(body: any, otherParam: { [key: string]: any }) {
   //api/duoduo-service/object-service/object/floor/queryParam
   return request<API.EnvironmentParam>(