react antd,echarts全景视图

1.公告滚动,40s更新一次
2.echarts图标 左右轮播 60s更新一次
3.table 表格

import { useState, useEffect } from 'react';

import Slider from 'react-slick';
import 'slick-carousel/slick/slick-theme.css';
import 'slick-carousel/slick/slick.css';

import Layout from './Layout1';
import Kpi from './components/Kpi';

import Profile from './components/Profile';
import useData, { useLineData, useSeriesDataInterval } from './hooks/useSeriesData';
import styles from './index.less';
import './index.scss';
import {
  getPanoramicViewCoreData,
  getPanoramicViewConsum,
  getPanoramicViewTonConsum,
  alarmRuleReport,
} from '@/services/Fullview/index';
import Bar from './components/Column/components/Bar';
import TabAndChart from './components/Column/components/TabAndChart';
import MapUI from './components/Map/components/MapUI';
import config from './config/index';
import _ from 'lodash';
import { getUserInfo } from '@/services/session';
import { useRequest } from '@umijs/max';
import { response } from 'express';
const path = 'fullview';
let flag1 = 1;
let flagRight1 = 1;

const pageConfig = config[path];
const ruleTypeOptions = [
  { label: '表计异常', value: 1 },
  { label: '服务器异常', value: 2 },
  { label: '能耗超标', value: 3 },
  { label: '设备异常', value: 4 },
  { label: '数据异常', value: 5 },
];
function Fullview() {
  const [leftSlider, setLeftSlider] = useState(null);
  const [rightSlider, setRightSlider] = useState(null);
  const [refSlider, setRefSlider] = useState(null);

  const [kpiEnergyList, setKpiEnergyList] = useState(null);
  const [consumList, setConsumList] = useState(null);
  const [consumListRight, setConsumListRight] = useState(null);
  const [current, setCurrent] = useState(0);

  const [state, setState] = useState([]);
  const [target, setTarget] = useState([]);
  const [flag, setFlag] = useState(1);
  const [flagRight, setFlagRight] = useState(1);

  const [type, setType] = useState(1);
  // const [flagType, setflagType] = useState(0);

  const { data = {} } = useData(path);
  const { singleData = {} } = data;
  const { data: intervalDatas = {} } = useSeriesDataInterval(path);
  const { data: lineData = {} } = useLineData(path);
  const { month = {}, year = {} } = lineData;
  const [timerId, setTimerId] = useState<number | null>(0 || null);
  const [limits, setLimits] = useState<{ [key: string]: [number, number] }>({
    // 'xinye#Management.Eng_Elec_Cons_1': [110, 160],
    // 'xinye#Management.Eng_All_Cons_1': [120, 180],
  });
  // 轮播
  const syncSlides = (toSlider: { slickGoTo: (arg0: number) => void } | null, next: number) => {
    console.log('rightSlider', toSlider);
    if (toSlider) {
      toSlider.slickGoTo(next);
    }
  };
  const leftSliderSettings = {
    dots: true,
    infinite: true,
    // How many slides to show in one frame
    slidesToShow: 1,
    // How many slides to scroll at once
    slidesToScroll: 1,
    autoplay: false,
    speed: 300,
    // 10s播一次
    autoplaySpeed: 10000,
    centerMode: true,
    centerPadding: '0px',
    beforeChange: (_: any, next: number) => {
      syncSlides(rightSlider, next);
    },
  };
  const rightSliderSettings = {
    ...leftSliderSettings, // 使用左侧轮播器的设置
    beforeChange: (_, next: number) => {
      syncSlides(leftSlider, next);
    },
  };

  const getData = (type: any) => {
    getPanoramicViewCoreData(type).then((res) => {
      // debugger;
      if (res.code === 200) {
        // 中间最上边
        let data =
          res.data.firstRowMetricList?.map((item: { geo: string; flag: string; icon: string }) => {
            item.geo = 'xinye';
            if (item.flag === 'E') {
              item.icon = './fullview/map/electric.png';
            } else if (item.flag === 'GREEN') {
              item.icon = './fullview/map/green-electric.png';
            } else if (item.flag === 'G') {
              item.icon = './fullview/map/gas.png';
            } else if (item.flag === 'W') {
              item.icon = './fullview/map/water.png';
            } else if (item.flag === 'ENG_ALL_CONS') {
              item.icon = './fullview/map/coal.png';
            } else if (item.flag === 'ENG_ALL_CARBON') {
              item.icon = './fullview/map/co2.png';
            }
            // item.domainMetric = "xinye";
            return item;
          }) || [];
        pageConfig.keyMetrics = data?.length > 0 ? data : pageConfig.keyMetrics;
        // 最中间的值
        res.data.deptResVoList?.forEach(
          (element: {
            [x: string]: { left: number; top: number };
            deptName: string;
            itemValueList: any;
          }) => {
            element['dpt'] = element.deptName;
            element['position'] = {
              left: 0,
              top: 2,
            };
            element['metrics'] = element.itemValueList;
            if (element.deptName === '经典薄片车间') {
              element['position'] = {
                left: 0,
                top: 2,
              };
              element['geo'] = 'xinye|joint_workshop|classics_sheet_workshop';
            } else if (element.deptName === '公辅车间') {
              element['position'] = {
                left: 312,
                top: 0,
              };
              element['geo'] = 'xinye|joint_workshop|classics_sheet_workshop';
            } else if (element.deptName === '行政楼') {
              element['position'] = {
                left: 38,
                top: 320,
              };
            } else if (element.deptName === '老车间') {
              element['position'] = {
                left: 729,
                top: 6,
              };
            } else if (element.deptName === '其他区域') {
              element['position'] = {
                left: 729,
                top: 317,
              };
            }
            // element['dpt'] =
          },
        );
        pageConfig.areas = res.data.deptResVoList;
        setKpiEnergyList(res.data.kpiEnergyList);
      }
    });
  };
  const getView = (flag: any, type: any) => {
    getPanoramicViewConsum(flag, type).then((res) => {
      if (res.code === 200) {
        res.data.forEach((element: { [x: string]: string; name: string }) => {
          element['geo'] = 'xinye|old_workshop|newstyle_sheet_workshop';
          if (element.name === '电力') {
            element['domainMetric'] = 'Management.Eng_Elec_Cons_1';
          } else if (element.name === '天然气') {
            element['domainMetric'] = 'Management.Eng_NG_Cons_1';
          } else if (element.name === '工业水') {
            element['domainMetric'] = 'Management.Eng_Water_Cons_1';
          } else if (element.name === '"蒸汽') {
            element['domainMetric'] = 'Management.Eng_Steam_Cons_1';
          }
        });
        let data = res.data.map((item: { geo: string }) => {
          item.geo = 'xinye';
          // item.name = item.
          // item.domainMetric = "xinye";
          return item;
        });
        pageConfig.metricsRight = data;
        pageConfig.consumList = data;
        // 耗量
        pageConfig.deptCons = data;
        console.log(pageConfig.deptCons);
        setConsumList(data);
      }
    });
  };
  const getPanoraTonConsum = (flag: any, type: any) => {
    getPanoramicViewTonConsum(flag, type).then((res) => {
      if (res.code === 200) {
        res.data.forEach((element: { [x: string]: string; name: string }) => {
          element['geo'] = 'xinye|old_workshop|newstyle_sheet_workshop';
          if (element.name === '电力') {
            element['domainMetric'] = 'Management.Eng_Elec_Cons_1';
          } else if (element.name === '天然气') {
            element['domainMetric'] = 'Management.Eng_NG_Cons_1';
          } else if (element.name === '工业水') {
            element['domainMetric'] = 'Management.Eng_Water_Cons_1';
          } else if (element.name === '"蒸汽') {
            element['domainMetric'] = 'Management.Eng_Steam_Cons_1';
          }
        });
        let data = res.data.map((item: { geo: string }) => {
          item.geo = 'xinye';
          // item.name = item.
          // item.domainMetric = "xinye";
          return item;
        });
        pageConfig.metrics = data;
        pageConfig.consumList = data;

        pageConfig.deptCons1 = data;
        setConsumListRight(data);
        // console.log(pageConfig, intervalDatas);
      }
    });
  };
  const getType = (type: any) => {
    ruleTypeOptions.map((res) => {
      let lable = '';
      if (res.value === parseInt(type)) {
        lable = res.label;
      }
      console.log(lable, 'lable');
      return lable;
    });
  };
  const getAlarmRuleReport = () => {
    let status = 1;
    getUserInfo().then((res) => {
      if (res.code === 200) {
        let id = res?.data?.user?.userId;
        let num = 0;
        alarmRuleReport(id, status, '').then((response) => {
          if (response.code === 200) {
            console.log(response, 'current === index');
            setState(response.data);
            // let data = [{
            //   id: 1,
            //   ruleType: 1,
            //   alarmContent: 'iPhone11挥泪降价1600元 iPhone12出道即巅峰?5G手机',
            // },
            // {
            //   id: 2,
            //   ruleType: 1,
            //   alarmContent: 'VR式体验奔驰博物馆重新开张 广东最惨的"88888"车牌'
            // },
            // {
            //   id: 3,
            //   ruleType: 1,
            //   alarmContent: '4年5队的落选秀太香了 巅峰2.6帽!力压魔兽夺最佳新秀'
            // },
            // {
            //   id: 4,
            //   ruleType: 1,
            //   alarmContent: '你好世界:寻找心中的风景 [征集]寻找中式风景禅意美'
            // }]
            // setState(data)
            if (data.length > 0) {
              const timer: NodeJS.Timeout = setInterval(() => {
                let currentNum = (num + 1) % data.length;
                num = currentNum;
                setCurrent(_.cloneDeep(currentNum));
                console.log(currentNum, current, num, 'currentcurrentcurrentcurrent');
                // getAlarmRuleReport()
              }, 10000);

              return () => {
                clearInterval(timer); // 组件卸载时清除定时器
              };
            }
          }
        });
      }
    });
  };
  useEffect(() => {
    getView(flag, type);
    getAlarmRuleReport();
    getData(type);
    setFlag(_.cloneDeep(flag));
  }, [flag]);
  useEffect(() => {
    getData(type);
    getPanoraTonConsum(flagRight, type);
    setFlagRight(_.cloneDeep(flagRight));
  }, [flagRight]);
  useEffect(() => {
    const id: NodeJS.Timeout = setInterval(() => {
      getData(type);
      getView(flag1, type);
      getPanoraTonConsum(flagRight1, type);
    }, 60 * 1000);
    return () => {
      clearInterval(id); // 组件卸载时清除定时器
    };
  }, []);
  // 告警
  useEffect(() => {
    // const timer: NodeJS.Timeout = setInterval(() => {
    //   setAnimate(true)
    //   getAlarmRuleReport()
    // }, 1500);

    const id: NodeJS.Timeout = setInterval(() => {
      getAlarmRuleReport();
    }, 40 * 1000);
    return () => {
      clearInterval(id); // 组件卸载时清除定时器
      // clearInterval(timer); // 组件卸载时清除定时器
    };
  }, []);

  return (
    <Layout>
      <div className={styles.view}>
        <div className={styles.content}>
          {/* 头像 */}
          {/* <Profile /> */}
          <div className={styles.title}>全景视图</div>
          {/* <div className={styles.warning}>warning</div> */}
          <div className="cl-seamless-container" style={{ color: '#4cdced' }}>
            <span className="image"></span>
            <ul className="cl-seamless-list">
              {state?.map((item, index) => (
                <li className={styles.consulationNewsItem} key={index} style={{ fontSize: '18px' }}>
                  {current === index ? (
                    <>
                      <span
                        style={{
                          background: '#0c465a',
                          border: '2px solid #0da1b7',
                          padding: '2px 10px',
                          marginRight: '20px',
                          borderRadius: '6px',
                          fontSize: '14px',
                        }}
                      >
                        {ruleTypeOptions?.map((res) =>
                          parseInt(item?.ruleType) === res.value ? <>{res.label}</> : <></>,
                        )}
                      </span>
                      {item?.alarmContent}
                    </>
                  ) : (
                    <></>
                  )}
                </li>
              ))}
            </ul>
          </div>

          <div className={styles.main}>
            <div className={styles.left}>
              {consumList ? (
                <Slider
                  {...leftSliderSettings}
                  ref={(slider) => {
                    setLeftSlider(slider);
                  }}
                  className="left-column"
                >
                  {/* 左侧内容轮播项 */}
                  {pageConfig.metrics.map((m, i) => (
                    <div key={i}>
                      <TabAndChart
                        type="耗量"
                        unit={m.unit}
                        metricName={m.name}
                        // todo:4个页面变化
                        area={m.name}
                        limits={limits[`${m.geo}#${m.domainMetric}`]}
                        dayData={intervalDatas.minute?.[`${m.geo}#${m.domainMetric}`] || []}
                        monthData={month?.[`${m.geo}#${m.domainMetric}`]}
                        yearData={year?.[`${m.geo}#${m.domainMetric}`]}
                        listData={consumList}
                        getFlag={(value: any) => {
                          console.log(value);
                          if (value === 'day') {
                            flag1 = 1;
                            setFlag(_.cloneDeep(1));
                          }
                          if (value === 'month') {
                            flag1 = 2;
                            setFlag(_.cloneDeep(2));
                          }
                          if (value === 'year') {
                            flag1 = 3;
                            setFlag(_.cloneDeep(3));
                          }
                          console.log(flag);
                        }}
                      />
                      {/* <Bar
                        type="耗量"
                        metric={m.domainMetric}
                        dpts={pageConfig.deptCons}
                        actuals={actual}
                        targets={target}
                      /> */}
                    </div>
                  ))}
                </Slider>
              ) : (
                <></>
              )}
            </div>

            <div className={styles.middle}>
              <MapUI
                bg={pageConfig.bg}
                keyMetrics={pageConfig.keyMetrics}
                data={singleData}
                intervalData={intervalDatas.day}
                areas={pageConfig.areas}
                type={0}
              />
              <Kpi kpiEnergyList={kpiEnergyList} />
            </div>

            <div className={styles.right}>
              {consumListRight ? (
                <Slider
                  {...rightSliderSettings}
                  ref={(slider) => setRightSlider(slider)}
                  className="right-column"
                >
                  {pageConfig.metricsRight.map((m, i) => (
                    <div key={i}>
                      <TabAndChart
                        type="单耗"
                        unit={m.unit}
                        metricName={m.name}
                        area={m.name}
                        limits={limits[`${m.geo}#${m.domainMetric}`]}
                        dayData={intervalDatas.minute?.[`${m.geo}#${m.domainMetric}`] || []}
                        monthData={month?.[`${m.geo}#${m.domainMetric}`]}
                        yearData={year?.[`${m.geo}#${m.domainMetric}`]}
                        listData={consumListRight}
                        getFlag={(value: any) => {
                          if (value === 'day') {
                            flagRight1 = 1;
                            setFlagRight(_.cloneDeep(1));
                          }
                          if (value === 'month') {
                            flagRight1 = 2;
                            setFlagRight(_.cloneDeep(2));
                          }
                          if (value === 'year') {
                            flagRight1 = 3;
                            setFlagRight(_.cloneDeep(3));
                          }
                        }}
                      />
                      {/* <Bar
                        type="单耗"
                        metric={m.domainMetric}
                        dpts={pageConfig.deptCons1}
                        actuals={singleData}
                        targets={[]}
                      /> */}
                    </div>
                  ))}
                </Slider>
              ) : (
                <></>
              )}
            </div>
          </div>
        </div>
      </div>
    </Layout>
  );
}

export default Fullview;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/292706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB批量写入操作

一、概述 MongoDB为客户端提供了批量执行写入操作的能力。批量写入操作影响单个集合。MongoDB允许应用程序确定批量写入操作所需的可接受确认级别。 db.collection.bulkWrite&#xff08;&#xff09;方法提供了执行批量插入、更新和删除操作的能力。 MongoDB还支持通过db.col…

使用Apache POI将数据写入Excel文件

首先导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version> </dependency> <dependency><groupId>org.apache.poi</groupId><artifactId>po…

Spring Cloud Gateway 缓存区异常

目录 1、问题背景 2、分析源码过程 3、解决办法 最近在测试环境spring cloud gateway突然出现了异常&#xff0c;在这里记录一下&#xff0c;直接上干货 1、问题背景 测试环境spring cloud gateway遇到以下异常 DataBufferLimitException: Exceeded limit on max bytes t…

Spring 面试题学习笔记整理

Spring 面试题学习笔记整理 Spring的理解IOC读取 xml注入 配置过程解析注解注入过程 高频 &#xff1a;IOC 理解 及原理 底层实现IoC的底层实现高频&#xff1a;Bean的生命周期&#xff08;图解&#xff09;高频&#xff1a;Bean的生命周期&#xff08;文解&#xff09;扩展知识…

STM32和ESP8266的WiFi模块控制与数据传输

基于STM32和ESP8266 WiFi模块的控制与数据传输是一种常见的嵌入式系统应用。在这种应用中&#xff0c;STM32作为主控制器负责控制和与外部传感器交互&#xff0c;而ESP8266 WiFi模块则用于实现无线通信和数据传输。本文将介绍如何在STM32上控制ESP8266模块&#xff0c;建立WiFi…

【React系列】React生命周期、setState深入理解、 shouldComponentUpdate和PureComponent性能优化、脚手架

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 生命周期 1.1. 认识生命周期 很多的事物都有从创建到销毁的整个过程&#xff0c;这个过程称之为是生命周期&…

3D 纹理的综合指南

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 我们经常看到超现实主义的视频游戏和动画电影角色出现在屏幕上。他们皮肤上的…

EasyRecovery2024永久免费版电脑数据恢复软件

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、…

嵌入式(三)中断解析 | 中断基本概念 CC2530中断系统 中断编程全解析

文章目录 1中断的概念和作用1.1 概念1.2 作用1.3 中断 其他概念 2. CC2530的中断系统3 中断编程3.1 中断配置3.1.1 使能端口组的中断功能3.1.2 使能当前端口组有哪些端口引脚中断3.1.3 设置中断触发方式 3.2 中断处理函数编写3.2.1 基本编写格式3.2.2 识别触发外部中断的端口Po…

实验笔记之——bug:in /usr/local/lib/libfmt.a(format.cc.o) is referenced by DSO

最近在编译D-MAP的时候遇到下面的问题 在github issue好像也有类似的提问 compiling error with fmt Issue #4 hku-mars/D-Map GitHub 这应该是fmt配置没有连接上。为此寻找所有包含的fmt文件&#xff0c;在头文件处加入 #define FMT_HEADER_ONLY #include "fmt/for…

Java学习苦旅(十九)——详解Java的堆和优先级队列

本篇博客将详细讲解堆和优先级队列。 文章目录 堆概念向下调整 优先级队列概念内部原理入队列出队列返回队首元素java中的优先级队列常用操作 topK问题结尾 堆 概念 堆逻辑上是一棵完全二叉树。 堆物理上是保存在数组中。 满足任意结点的值都大于其子树中结点的值&#xff…

北京大学漏洞报送证书

获取来源&#xff1a;edusrc&#xff08;教育漏洞报告平台&#xff09; url&#xff1a;教育漏洞报告平台(EDUSRC) 兑换价格&#xff1a;30金币 获取条件&#xff1a;北京大学任意中危或以上级别漏洞

【React系列】Portals、Fragment

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) Portals 某些情况下&#xff0c;我们希望渲染的内容独立于父组件&#xff0c;甚至是独立于当前挂载到的DOM元素中&am…

浅谈基于物联网的建筑物综合环境能耗监测管理系统

叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;随着社会经济的快速发展&#xff0c;我国建筑能源消费总量逐年增加&#xff0c;占社会能源消费总量的近30%。国际发达国家建设部科技司的相关研究表明&#xff0c;随着城市化进程的加快和人民生活质量的提高&…

案例091:基于微信小程序的农场驿站平台的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

ubuntu桥接方式上网

vmvare:VMware Workstation 17 Pro ubuntu: Ubuntu 14.04.6 LTS window10 下面是我的电脑配置 下面是ubuntu虚拟机的配置 vi /etc/network/interfaces 下面的gateway就是window -ipconfig 截图里的默认网关 auto lo iface lo inet loopbackauto eth0 iface eth0 inet stat…

日常工作 经验总结

1,在使用vue2开发项目时,快捷有效的组件化component 若有参数传递时,可以通过这样传递 在component中: 2,上拉加载,下拉刷新 若是使用局部进行上拉加载 下拉刷新 且需要用到scroll-view时 那么需要切记scroll-view在内被mescroll-uni包裹。若场景有限 对于无数据显示…

优雅实现微信小程序动态tabBar,根据不同用户角色显示不同底部导航——更新版(支持自由组合总数超过5个tabBar菜单)

背景 在开发小程序过程中&#xff0c;有个需求是&#xff0c;小程序底部的tabBar需要根据不同用户角色显示不同底部导航。此时就需要用到自定义底部导航 custom-tab-bar。 上次发文是组合显示4个底部tabBar导航&#xff0c;很多小伙伴评论说组合超过5个怎么办。他们的需求总数…

C语言KR圣经笔记 5.6指针数组;指针的指针

5.6 指针数组&#xff1b;指针的指针 因为指针本身也是变量&#xff0c;所以它们也能像其他变量一样保存在数组里面。我们写个程序来说明&#xff0c;该程序将一些文本行按照字母顺序排列&#xff0c;算是 UNIX 程序 sort 的精简版本。 在第三章中&#xff0c;我们介绍了对一…

设计创新,流程优化:3D开发HOOPS在数字化工厂中的多面应用

随着科技的不断发展&#xff0c;数字化转型已经成为各行各业的共同趋势&#xff0c;而工业领域也不例外。在这一浩大的变革浪潮中&#xff0c;Tech Soft 3D的HOOPS正以其卓越的性能和多功能性&#xff0c;成为数字化工厂领域的关键推动力。 数字化工厂概述 数字化工厂是指通过…