فهرست منبع

Merge branch 'master' of http://182.92.126.35:3000/hrx/mky-vent-base

lxh 6 روز پیش
والد
کامیت
52fc6073c5

+ 1 - 1
.env.development

@@ -6,7 +6,7 @@ VITE_PUBLIC_PATH = /
 
 # 跨域代理,您可以配置多个 ,请注意,没有换行符
 #VITE_PROXY = [["/jeecgboot","http://localhost:8080/jeecg-boot"],["/upload","http://localhost:3300/upload"]]
-VITE_PROXY = [["/sw","http://182.92.126.35:6008"],["/jeecgsystem","http://182.92.126.35:9999"],["/upload","http://182.92.126.35:9999/upload"],["/documents", "http://182.92.126.35:9050"],["/modelreq", "http://182.92.126.35:9999"],["/webRtc", "http://182.92.126.35:8051"], ["/python", "http://127.0.0.1:8008"], ["/tun2D", "http://127.0.0.1:8088/micro-vent-2dModal/tun2D"],["/dataCenter", "http://192.168.1.88:10999"],["/sjzx", "http://192.168.1.88:8062/"]]
+VITE_PROXY = [["/sw","http://182.92.126.35:6008"],["/jeecgsystem","http://182.92.126.35:9999"],["/upload","http://182.92.126.35:9999/upload"],["/documents", "http://182.92.126.35:9050"],["/modelreq", "http://182.92.126.35:9999"],["/webRtc", "http://182.92.126.35:8051"], ["/python", "http://127.0.0.1:8008"], ["/tun2D", "http://127.0.0.1:8088/micro-vent-2dModal/tun2D"],["/dataCenter", "http://192.168.1.88:10999"]]
 # VITE_PROXY = [["/jeecgsystem","http://192.168.183.88:9999"],["/upload","http://192.168.183.88:9999/upload"],["/documents", "http://192.168.183.88:9050"],["/modelreq", "http://192.168.183.88:9999"],["/webRtc", "http://192.168.183.88:8051"]]
 # VITE_PROXY = [["/jeecgsystem","http://10.10.150.72:9999"],["/upload","http://localhost:3300/upload"],["/documents", "http://10.10.150.72:9050"],["/modelreq", "http://10.10.150.72:9999"],["/webRtc", "http://192.168.183.216:8051"]]
 # VITE_PROXY = [["/jeecgsystem","http://192.168.1.8:9999"],["/upload","http://localhost:3300/upload"]]

+ 2 - 2
.env.production

@@ -17,7 +17,7 @@ VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
 #VITE_PROXY = [["/jeecgsystem","http://10.248.223.116:9999"],["/upload","http://localhost:3300/upload"]]
 #VITE_PROXY = [["/jeecgsystem","http://10.248.210.152:9999"],["/upload","http://10.248.210.152:9999/upload"]]
 #VITE_PROXY = [["/jeecgsystem","http://182.92.126.35:9999"],["/upload","http://182.92.126.35:9999/upload"]]
-VITE_PROXY = [["/sw","http://10.246.167.205:6008"],["/modelreq","http://172.16.41.171:9999"],["/upload","http://172.16.41.171:9999/upload"], ["/documents", "http://182.92.126.35:9050"]]
+VITE_PROXY = [["/sw","http://10.246.167.205:6008"],["/modelreq","http://172.16.41.171:9999"],["/upload","http://172.16.41.171:9999/upload"],["/documents", "http://182.92.126.35:9050"],["/dataCenter", "http://192.168.1.88:10999"]]
 #VITE_PROXY = [["/jeecgsystem","http://172.16.41.171:9999"],["/upload","http://172.16.41.171:9999/upload"]]
 #VITE_PROXY = [["/jeecgsystem","http://10.120.120.163:9999"],["/upload","http://10.120.120.163:9999/upload"]]
 #VITE_PROXY = [["/jeecgsystem","http://192.168.1.4:9999"],["/upload","http://localhost:3300/upload"]]
@@ -63,7 +63,7 @@ VITE_LEGACY = false
 #VITE_APP_SUB_APP = [["micro-need-air", "//182.92.126.35:8093/"], ["micro-vent-3dModal", "//182.92.126.35:8091/"]]
 #VITE_APP_SUB_APP = [["micro-need-air", ":8093/"], ["micro-vent-3dModal", ":8091/"]]
 #VITE_APP_SUB_APP = [["micro-vent-3dModal", ":8091/", "micro-vent-3dModal"], ["micro-need-air", ":8093/", "micro-need-air"]]
-VITE_APP_SUB_APP = [["micro-vent-3dModal", "/models/", ":8091/"],["micro-vent-2dModal", "/tun2D/", ":8099/"],["micro-need-air", "/vent-need-air/", ":8093/"]] #[name, entry, container]
+VITE_APP_SUB_APP = [["micro-vent-3dModal", "/models/", ":8091/"],["micro-vent-2dModal", "/tun2D/", ":8099/"],["micro-need-air", "/vent-need-air/", ":8093/"],["micro-vent-doc", "/micro-vent-doc/", ":8076/"]] #[name, entry, container]
 # VITE_APP_SUB_APP = [["micro-vent-3dModal", "//182.92.126.35:8091/", "micro-vent-3dModal"],["micro-vent-2dModal", "//localhost:8088/", "micro-vent-2dModal"], ["micro-need-air", "//182.92.126.35:8099/", "micro-need-air"], ["micro-fire-front", "//182.92.126.35:8097/", "fire-Micro"]]
 #VITE_APP_SUB_APP = [["micro-need-air", "//172.16.41.171:7123/"], ["micro-vent-3dModal", "//172.16.41.171:7121/"]]
 #VITE_APP_SUB_APP = [["micro-vent-3dModal", "//192.168.0.79:7121/"]]

+ 260 - 258
src/layouts/default/header/index.vue

@@ -58,8 +58,8 @@
   <div :class="`${prefixCls}-action`" style="position: fixed; top: 30px; right: 20px; z-index: 999999">
     <div class="right-position">
       <!-- 公司端不显示语音播报功能 weatherBroadcast.vue-->
-      <WeatherBroadcast v-if="sysOrgCode != 'sdmtjtgsd' && isShowQy" />
-      <VoiceBroadcast v-if="sysOrgCode != 'sdmtjtgsd'" />
+      <WeatherBroadcast v-if="sysOrgCode != 'sdmtjtgsd' && isShowQy && portValue != '8062'" />
+      <VoiceBroadcast v-if="sysOrgCode != 'sdmtjtgsd' && portValue != '8062'" />
       <VoiceBroadcastGsd v-if="sysOrgCode == 'sdmtjtgsd'" />
       <UserDropDown v-if="showUserDropdown" :theme="getHeaderTheme" />
       <LoginSelect ref="loginSelectRef" @success="loginSelectOk" />
@@ -67,277 +67,279 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, unref, computed, ref, onMounted, toRaw } from 'vue';
-  import { useGlobSetting } from '/@/hooks/setting';
-  import { propTypes } from '/@/utils/propTypes';
-
-  import { Layout } from 'ant-design-vue';
-  import { AppLogo } from '/@/components/Application';
-  import LayoutMenu from '../menu/index.vue';
-  import LayoutTrigger from '../trigger/index.vue';
-
-  import { AppSearch } from '/@/components/Application';
-
-  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-
-  import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
-  import { SettingButtonPositionEnum } from '/@/enums/appEnum';
-  import { AppLocalePicker } from '/@/components/Application';
-
-  import { UserDropDown, LayoutBreadcrumb, FullScreen, Notify, ErrorAction, LockScreen } from './components';
-  import { useAppInject } from '/@/hooks/web/useAppInject';
-  import { useDesign } from '/@/hooks/web/useDesign';
-
-  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
-  import { useLocale } from '/@/locales/useLocale';
-
-  import WeatherBroadcast from './components/weatherBroadcast.vue';
-  import VoiceBroadcast from './components/VoiceBroadcast.vue';
-  import VoiceBroadcastGsd from './components/VoiceBroadcastGsd.vue';
-
-  import LoginSelect from '/@/views/sys/login/LoginSelect.vue';
-  import { useUserStore } from '/@/store/modules/user';
-  import { useRouter } from 'vue-router';
-
-  import { noHeadeLink } from '../layout.data';
-  import { usePermission } from '/@/hooks/web/usePermission';
-
-  export default defineComponent({
-    name: 'LayoutHeader',
-    components: {
-      Header: Layout.Header,
-      AppLogo,
-      LayoutTrigger,
-      LayoutBreadcrumb,
-      LayoutMenu,
-      UserDropDown,
-      AppLocalePicker,
-      FullScreen,
-      Notify,
-      AppSearch,
-      ErrorAction,
-      LockScreen,
-      LoginSelect,
-      VoiceBroadcast,
-      VoiceBroadcastGsd,
-      WeatherBroadcast,
-      SettingDrawer: createAsyncComponent(() => import('/@/layouts/default/setting/index.vue'), {
-        loading: true,
-      }),
-    },
-    props: {
-      fixed: propTypes.bool,
-    },
-    setup(props) {
-      const { prefixCls } = useDesign('layout-header');
-      const userStore = useUserStore();
-      const { currentRoute } = useRouter();
-      console.log(currentRoute);
-      const { hasPermission } = usePermission();
-      const isShowQy = VENT_PARAM['isShowQy'];
-      const { getShowTopMenu, getShowHeaderTrigger, getSplit, getIsMixMode, getMenuWidth, getIsMixSidebar } = useMenuSetting();
-      const { getUseErrorHandle, getShowSettingButton, getSettingButtonPosition } = useRootSetting();
-      const { title, sysOrgCode, homePath } = useGlobSetting();
-      const {
-        getHeaderTheme,
-        getShowFullScreen,
-        getShowNotice,
-        getShowContent,
-        getShowBread,
-        getShowHeaderLogo,
-        getShowHeader,
-        getShowSearch,
-        getUseLockPage,
-        getShowBreadTitle,
-        getShowFullHeaderRef,
-      } = useHeaderSetting();
-
-      const { getShowLocalePicker } = useLocale();
-
-      const { getIsMobile } = useAppInject();
-
-      const getHeaderClass = computed(() => {
-        const theme = unref(getHeaderTheme);
-        return [
-          prefixCls,
-          {
-            [`${prefixCls}--fixed`]: props.fixed,
-            [`${prefixCls}--mobile`]: unref(getIsMobile),
-            [`${prefixCls}--${theme}`]: theme,
-          },
-        ];
-      });
-
-      const getShowFullHeader = computed(() => {
-        const route = unref(currentRoute);
-        return getShowFullHeaderRef && route.path.startsWith('/micro-');
-      });
-
-      const getShowSetting = computed(() => {
-        if (!unref(getShowSettingButton)) {
-          return false;
-        }
-        const settingButtonPosition = unref(getSettingButtonPosition);
-
-        if (settingButtonPosition === SettingButtonPositionEnum.AUTO) {
-          return unref(getShowHeader);
-        }
-        return settingButtonPosition === SettingButtonPositionEnum.HEADER;
-      });
-
-      const getLogoWidth = computed(() => {
-        if (!unref(getIsMixMode) || unref(getIsMobile)) {
-          return {};
-        }
-        const width = unref(getMenuWidth) < 180 ? 180 : unref(getMenuWidth);
-        return { width: `${width}px` };
-      });
-
-      const getSplitType = computed(() => {
-        return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE;
-      });
-
-      const getMenuMode = computed(() => {
-        return unref(getSplit) ? MenuModeEnum.HORIZONTAL : null;
-      });
-
-      // /**
-      //  * 首页多租户部门弹窗逻辑
-      //  */
-      const loginSelectRef = ref();
-
-      function showLoginSelect() {
-        //update-begin---author:liusq  Date:20220101  for:判断登录进来是否需要弹窗选择租户----
-        //判断是否是登陆进来
-        const loginInfo = toRaw(userStore.getLoginInfo) || {};
-        if (!!loginInfo.isLogin) {
-          loginSelectRef.value.show(loginInfo);
-        }
-        //update-end---author:liusq  Date:20220101  for:判断登录进来是否需要弹窗选择租户----
+import { defineComponent, unref, computed, ref, onMounted, toRaw } from 'vue';
+import { useGlobSetting } from '/@/hooks/setting';
+import { propTypes } from '/@/utils/propTypes';
+
+import { Layout } from 'ant-design-vue';
+import { AppLogo } from '/@/components/Application';
+import LayoutMenu from '../menu/index.vue';
+import LayoutTrigger from '../trigger/index.vue';
+
+import { AppSearch } from '/@/components/Application';
+
+import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
+import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
+import { useRootSetting } from '/@/hooks/setting/useRootSetting';
+
+import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
+import { SettingButtonPositionEnum } from '/@/enums/appEnum';
+import { AppLocalePicker } from '/@/components/Application';
+
+import { UserDropDown, LayoutBreadcrumb, FullScreen, Notify, ErrorAction, LockScreen } from './components';
+import { useAppInject } from '/@/hooks/web/useAppInject';
+import { useDesign } from '/@/hooks/web/useDesign';
+
+import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
+import { useLocale } from '/@/locales/useLocale';
+
+import WeatherBroadcast from './components/weatherBroadcast.vue';
+import VoiceBroadcast from './components/VoiceBroadcast.vue';
+import VoiceBroadcastGsd from './components/VoiceBroadcastGsd.vue';
+
+import LoginSelect from '/@/views/sys/login/LoginSelect.vue';
+import { useUserStore } from '/@/store/modules/user';
+import { useRouter } from 'vue-router';
+
+import { noHeadeLink } from '../layout.data';
+import { usePermission } from '/@/hooks/web/usePermission';
+
+export default defineComponent({
+  name: 'LayoutHeader',
+  components: {
+    Header: Layout.Header,
+    AppLogo,
+    LayoutTrigger,
+    LayoutBreadcrumb,
+    LayoutMenu,
+    UserDropDown,
+    AppLocalePicker,
+    FullScreen,
+    Notify,
+    AppSearch,
+    ErrorAction,
+    LockScreen,
+    LoginSelect,
+    VoiceBroadcast,
+    VoiceBroadcastGsd,
+    WeatherBroadcast,
+    SettingDrawer: createAsyncComponent(() => import('/@/layouts/default/setting/index.vue'), {
+      loading: true,
+    }),
+  },
+  props: {
+    fixed: propTypes.bool,
+  },
+  setup(props) {
+    const { prefixCls } = useDesign('layout-header');
+    const userStore = useUserStore();
+    const { currentRoute } = useRouter();
+    console.log(currentRoute);
+    const { hasPermission } = usePermission();
+    const isShowQy = VENT_PARAM['isShowQy'];
+    const { getShowTopMenu, getShowHeaderTrigger, getSplit, getIsMixMode, getMenuWidth, getIsMixSidebar } = useMenuSetting();
+    const { getUseErrorHandle, getShowSettingButton, getSettingButtonPosition } = useRootSetting();
+    const { title, sysOrgCode, homePath } = useGlobSetting();
+    const {
+      getHeaderTheme,
+      getShowFullScreen,
+      getShowNotice,
+      getShowContent,
+      getShowBread,
+      getShowHeaderLogo,
+      getShowHeader,
+      getShowSearch,
+      getUseLockPage,
+      getShowBreadTitle,
+      getShowFullHeaderRef,
+    } = useHeaderSetting();
+
+    const { getShowLocalePicker } = useLocale();
+
+    const { getIsMobile } = useAppInject();
+
+    const getHeaderClass = computed(() => {
+      const theme = unref(getHeaderTheme);
+      return [
+        prefixCls,
+        {
+          [`${prefixCls}--fixed`]: props.fixed,
+          [`${prefixCls}--mobile`]: unref(getIsMobile),
+          [`${prefixCls}--${theme}`]: theme,
+        },
+      ];
+    });
+
+    const getShowFullHeader = computed(() => {
+      const route = unref(currentRoute);
+      return getShowFullHeaderRef && route.path.startsWith('/micro-');
+    });
+
+    const getShowSetting = computed(() => {
+      if (!unref(getShowSettingButton)) {
+        return false;
       }
+      const settingButtonPosition = unref(getSettingButtonPosition);
 
-      function loginSelectOk() {
-        console.log('成功。。。。。');
+      if (settingButtonPosition === SettingButtonPositionEnum.AUTO) {
+        return unref(getShowHeader);
       }
+      return settingButtonPosition === SettingButtonPositionEnum.HEADER;
+    });
 
-      // 用户下拉框应该在以下情况中隐藏:
-      // 1. 本页面是由其他页面的 iframe 嵌入的页面
-      const showUserDropdown = computed(() => {
-        return window.self === window.top;
-      });
+    const getLogoWidth = computed(() => {
+      if (!unref(getIsMixMode) || unref(getIsMobile)) {
+        return {};
+      }
+      const width = unref(getMenuWidth) < 180 ? 180 : unref(getMenuWidth);
+      return { width: `${width}px` };
+    });
+
+    const getSplitType = computed(() => {
+      return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE;
+    });
+
+    const getMenuMode = computed(() => {
+      return unref(getSplit) ? MenuModeEnum.HORIZONTAL : null;
+    });
+
+    // /**
+    //  * 首页多租户部门弹窗逻辑
+    //  */
+    const loginSelectRef = ref();
+    const portValue = ref('');
+    portValue.value = window.location.port;
+    function showLoginSelect() {
+      //update-begin---author:liusq  Date:20220101  for:判断登录进来是否需要弹窗选择租户----
+      //判断是否是登陆进来
+      const loginInfo = toRaw(userStore.getLoginInfo) || {};
+      if (!!loginInfo.isLogin) {
+        loginSelectRef.value.show(loginInfo);
+      }
+      //update-end---author:liusq  Date:20220101  for:判断登录进来是否需要弹窗选择租户----
+    }
 
-      onMounted(() => {
-        showLoginSelect();
-      });
+    function loginSelectOk() {
+      console.log('成功。。。。。');
+    }
 
-      return {
-        prefixCls,
-        getHeaderClass,
-        getShowHeaderLogo,
-        getHeaderTheme,
-        getShowHeaderTrigger,
-        getIsMobile,
-        getShowBreadTitle,
-        getShowBread,
-        getShowContent,
-        getSplitType,
-        getSplit,
-        getMenuMode,
-        getShowTopMenu,
-        getShowLocalePicker,
-        getShowFullScreen,
-        getShowNotice,
-        getUseErrorHandle,
-        getLogoWidth,
-        getIsMixSidebar,
-        getShowSettingButton,
-        getShowSetting,
-        getShowSearch,
-        getUseLockPage,
-        loginSelectOk,
-        loginSelectRef,
-        currentRoute,
-        title,
-        getShowFullHeader,
-        noHeadeLink,
-        showUserDropdown,
-        sysOrgCode,
-        homePath,
-        hasPermission,
-        isShowQy,
-      };
-    },
-  });
+    // 用户下拉框应该在以下情况中隐藏:
+    // 1. 本页面是由其他页面的 iframe 嵌入的页面
+    const showUserDropdown = computed(() => {
+      return window.self === window.top;
+    });
+
+    onMounted(() => {
+      showLoginSelect();
+    });
+
+    return {
+      portValue,
+      prefixCls,
+      getHeaderClass,
+      getShowHeaderLogo,
+      getHeaderTheme,
+      getShowHeaderTrigger,
+      getIsMobile,
+      getShowBreadTitle,
+      getShowBread,
+      getShowContent,
+      getSplitType,
+      getSplit,
+      getMenuMode,
+      getShowTopMenu,
+      getShowLocalePicker,
+      getShowFullScreen,
+      getShowNotice,
+      getUseErrorHandle,
+      getLogoWidth,
+      getIsMixSidebar,
+      getShowSettingButton,
+      getShowSetting,
+      getShowSearch,
+      getUseLockPage,
+      loginSelectOk,
+      loginSelectRef,
+      currentRoute,
+      title,
+      getShowFullHeader,
+      noHeadeLink,
+      showUserDropdown,
+      sysOrgCode,
+      homePath,
+      hasPermission,
+      isShowQy,
+    };
+  },
+});
 </script>
 <style lang="less">
-  @import './index.less';
-  //update-begin---author:scott ---date:2022-09-30  for:默认隐藏顶部菜单面包屑-----------
-  //顶部欢迎语展示样式
-  @prefix-cls: ~'@{namespace}-layout-header';
-
-  .@{prefix-cls} {
-    display: flex;
-    padding: 0 8px;
-    // align-items: center;
+@import './index.less';
+//update-begin---author:scott ---date:2022-09-30  for:默认隐藏顶部菜单面包屑-----------
+//顶部欢迎语展示样式
+@prefix-cls: ~'@{namespace}-layout-header';
+
+.@{prefix-cls} {
+  display: flex;
+  padding: 0 8px;
+  // align-items: center;
+
+  .headerIntroductionClass {
+    margin-right: 4px;
+    margin-bottom: 2px;
+    border-bottom: 0px;
+    border-left: 0px;
+  }
 
+  &--light {
     .headerIntroductionClass {
-      margin-right: 4px;
-      margin-bottom: 2px;
-      border-bottom: 0px;
-      border-left: 0px;
+      color: @breadcrumb-item-normal-color;
     }
+  }
 
-    &--light {
-      .headerIntroductionClass {
-        color: @breadcrumb-item-normal-color;
-      }
+  &--dark {
+    .headerIntroductionClass {
+      color: rgba(255, 255, 255, 0.6);
     }
 
-    &--dark {
-      .headerIntroductionClass {
-        color: rgba(255, 255, 255, 0.6);
-      }
-
-      .anticon {
-        color: rgba(255, 255, 255, 0.8);
-      }
+    .anticon {
+      color: rgba(255, 255, 255, 0.8);
     }
-
-    //update-end---author:scott ---date::2022-09-30  for:默认隐藏顶部菜单面包屑--------------
-  }
-
-  // background: linear-gradient(#003f77, #0a134c);
-  //   // background: linear-gradient(#02050c 0%, #03114c 100%);
-  //   // border: none;
-  //   border-bottom: 1px solid #81aabf01;
-  //   padding-bottom: 2px;
-  //   box-shadow: 0 0 20px #44caff55 inset;
-  .normal-header {
-    height: 52px !important;
-    line-height: 52px !important;
-    background: var(--vent-header-bg-color) !important;
-    // background: linear-gradient(#005177,#0a344c) !important;
-    border-bottom: 1px solid #81aabf01 !important;
-    padding-bottom: 2px !important;
-    box-shadow: 0 0 20px #44caff55 inset !important;
-    padding: 0 8px !important;
   }
 
-  .no-header {
-    height: 0px !important;
-    display: none !important;
-  }
-  .zaihai-header {
-    position: absolute;
-    background: transparent !important;
-  }
-
-  .header-nav-title {
-    background-image: linear-gradient(#ffffff 50%, #60f4ff);
-    -webkit-background-clip: text;
-    color: transparent;
-    font-weight: 600;
-  }
+  //update-end---author:scott ---date::2022-09-30  for:默认隐藏顶部菜单面包屑--------------
+}
+
+// background: linear-gradient(#003f77, #0a134c);
+//   // background: linear-gradient(#02050c 0%, #03114c 100%);
+//   // border: none;
+//   border-bottom: 1px solid #81aabf01;
+//   padding-bottom: 2px;
+//   box-shadow: 0 0 20px #44caff55 inset;
+.normal-header {
+  height: 52px !important;
+  line-height: 52px !important;
+  background: var(--vent-header-bg-color) !important;
+  // background: linear-gradient(#005177,#0a344c) !important;
+  border-bottom: 1px solid #81aabf01 !important;
+  padding-bottom: 2px !important;
+  box-shadow: 0 0 20px #44caff55 inset !important;
+  padding: 0 8px !important;
+}
+
+.no-header {
+  height: 0px !important;
+  display: none !important;
+}
+.zaihai-header {
+  position: absolute;
+  background: transparent !important;
+}
+
+.header-nav-title {
+  background-image: linear-gradient(#ffffff 50%, #60f4ff);
+  -webkit-background-clip: text;
+  color: transparent;
+  font-weight: 600;
+}
 </style>

+ 6 - 0
src/router/helper/menuHelper.ts

@@ -103,6 +103,12 @@ export async function addBrowseLog(
   from: AppRouteRecordRaw | RouteLocationNormalized,
   ignorePaths: string[]
 ): Promise<void> {
+  const currentPort = window.location.port;
+
+  if (currentPort === '8062') {
+    return Promise.resolve();
+  }
+
   // 在尝试添加浏览器记录时,应该先发出一个结束上次记录的请求(如有)再发出一个开发此次记录的请求
   const url = '/sys/log/addBrowseLog';
 

+ 1 - 1
src/utils/http/axios/index.ts

@@ -22,7 +22,7 @@ import { useUserStoreWithOut } from '/@/store/modules/user';
 const globSetting = useGlobSetting();
 const urlPrefix = globSetting.urlPrefix;
 const { createMessage, createErrorModal } = useMessage();
-debugger;
+
 const proxyFixList = JSON.parse(import.meta.env.VITE_PROXY + '').map((item) => {
   return item[0].replace(/\//g, '');
 });

+ 64 - 0
src/views/monitor/quartz/QuartzModal1.vue

@@ -0,0 +1,64 @@
+<template>
+  <BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit" width="40%">
+    <BasicForm @register="registerForm" />
+  </BasicModal>
+</template>
+<script lang="ts" setup>
+import { ref, computed, unref } from 'vue';
+import { BasicModal, useModalInner } from '/@/components/Modal';
+import { BasicForm, useForm } from '/@/components/Form/index';
+import { formSchema } from './quartz.data';
+import { dataCenterSaveOrUpdateQuartz, getDataCenterQuartzById } from './quartz.api';
+import { isJsonObjectString } from '/@/utils/is';
+// Emits声明
+const emit = defineEmits(['register', 'success']);
+const isUpdate = ref(true);
+//表单配置
+const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
+  // labelWidth: 150,
+  schemas: formSchema,
+  showActionButtonGroup: false,
+  // update-begin--author:liaozhiyang---date:20231017---for:【issues/790】弹窗内文本框不居中问题
+  labelWidth: 100,
+  labelCol: null,
+  wrapperCol: null,
+  // update-end--author:liaozhiyang---date:20231017---for:【issues/790】弹窗内文本框不居中问题
+});
+//表单赋值
+const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
+  //重置表单
+  await resetFields();
+  setModalProps({ confirmLoading: false });
+  isUpdate.value = !!data?.isUpdate;
+  if (unref(isUpdate)) {
+    //获取详情
+    //data.record = await getQuartzById({id: data.record.id});
+    try {
+      data.record.paramterType = isJsonObjectString(data?.record?.parameter) ? 'json' : 'string';
+    } catch (e) {
+      console.log(e);
+    }
+    //表单赋值
+    await setFieldsValue({
+      ...data.record,
+    });
+  }
+});
+//设置标题
+const title = computed(() => (!unref(isUpdate) ? '新增任务' : '编辑任务'));
+//表单提交事件
+async function handleSubmit(v) {
+  try {
+    let values = await validate();
+    setModalProps({ confirmLoading: true });
+    //提交表单
+    await dataCenterSaveOrUpdateQuartz(values, isUpdate.value);
+    //关闭弹窗
+    closeModal();
+    //刷新列表
+    emit('success');
+  } finally {
+    setModalProps({ confirmLoading: false });
+  }
+}
+</script>

+ 218 - 0
src/views/monitor/quartz/index1.vue

@@ -0,0 +1,218 @@
+<template>
+  <div class="device-manager-box">
+    <BasicTable @register="registerTable" :rowSelection="rowSelection">
+      <template #tableTitle>
+        <a-button preIcon="ant-design:plus-outlined" type="primary" @click="handleAdd" style="margin-right: 5px">新增</a-button>
+        <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
+        <j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
+        <a-dropdown v-if="selectedRowKeys.length > 0">
+          <template #overlay>
+            <a-menu>
+              <a-menu-item key="1" @click="batchHandleDelete">
+                <Icon icon="ant-design:delete-outlined" />
+                删除
+              </a-menu-item>
+            </a-menu>
+          </template>
+          <a-button
+            >批量操作
+            <Icon icon="mdi:chevron-down" />
+          </a-button>
+        </a-dropdown>
+      </template>
+      <template #action="{ record }">
+        <div class="vent-row-center">
+          <a-popconfirm v-if="record.status == -1" title="是否启动选中任务?" @confirm="handlerResume(record)" style="display: inline-block">
+            <a class="table-action-link">启动</a>
+          </a-popconfirm>
+          <a-popconfirm v-if="record.status == 0" title="是否暂停选中任务?" @confirm="handlerPause(record)" style="display: inline-block">
+            <a class="table-action-link">停止</a>
+          </a-popconfirm>
+          <TableAction :dropDownActions="getDropDownAction(record)" />
+        </div>
+      </template>
+    </BasicTable>
+    <QuartzModal @register="registerModal" @success="reload" />
+  </div>
+</template>
+<script lang="ts" name="monitor-quartz" setup>
+import { ref } from 'vue';
+import { BasicTable, TableAction } from '/@/components/Table';
+import { useModal } from '/@/components/Modal';
+import { useListPage } from '/@/hooks/system/useListPage';
+import {
+  getDataCenterList,
+  getDataCenterExportUrl,
+  getDataCenterImportUrl,
+  deleteDataCenterQuartz,
+  batchDataCenterDeleteQuartz,
+  resumeDataCenterJob,
+  pauseDataCenterJob,
+  excuteDataCenterJob,
+} from './quartz.api';
+import { columns, searchFormSchema } from './quartz.data';
+import QuartzModal from './QuartzModal1.vue';
+import { useMessage } from '/@/hooks/web/useMessage';
+
+const { createMessage } = useMessage();
+const [registerModal, { openModal }] = useModal();
+// 列表页面公共参数、方法
+const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
+  designScope: 'quartz-template',
+  tableProps: {
+    title: '任务列表',
+    api: getDataCenterList,
+    columns: columns,
+    actionColumn: {
+      width: 180,
+    },
+    formConfig: {
+      labelWidth: 120,
+      schemas: searchFormSchema,
+      fieldMapToTime: [['fieldTime', ['beginDate', 'endDate'], 'YYYY-MM-DD HH:mm:ss']],
+    },
+  },
+  exportConfig: {
+    name: '定时任务列表',
+    url: getDataCenterExportUrl,
+  },
+  importConfig: {
+    url: getDataCenterImportUrl,
+  },
+});
+
+const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
+
+/**
+ * 操作列定义
+ * @param record
+ */
+function getActions(record) {
+  return [
+    {
+      label: '启动',
+      popConfirm: {
+        title: '是否启动选中任务?',
+        confirm: handlerResume.bind(null, record),
+      },
+      ifShow: (_action) => {
+        return record.status == -1;
+      },
+    },
+    {
+      label: '停止',
+      popConfirm: {
+        title: '是否暂停选中任务?',
+        confirm: handlerPause.bind(null, record),
+      },
+      ifShow: (_action) => {
+        return record.status == 0;
+      },
+    },
+  ];
+}
+
+/**
+ * 下拉操作栏
+ */
+function getDropDownAction(record) {
+  return [
+    {
+      label: '立即执行',
+      popConfirm: {
+        title: '是否立即执行任务?',
+        confirm: handlerExecute.bind(null, record),
+      },
+    },
+    {
+      label: '编辑',
+      onClick: handleEdit.bind(null, record),
+    },
+    {
+      label: '删除',
+      popConfirm: {
+        title: '是否确认删除',
+        confirm: handleDelete.bind(null, record),
+      },
+    },
+  ];
+}
+
+/**
+ * 新增事件
+ */
+function handleAdd() {
+  openModal(true, {
+    isUpdate: false,
+  });
+}
+
+/**
+ * 编辑事件
+ */
+function handleEdit(record) {
+  openModal(true, {
+    record,
+    isUpdate: true,
+  });
+}
+
+/**
+ * 删除事件
+ */
+async function handleDelete(record) {
+  await deleteDataCenterQuartz({ id: record.id }, reload);
+}
+
+/**
+ * 立即执行
+ */
+async function handlerExecute(record) {
+  if (record.sysType == 'collect') {
+    await excuteDataCenterJob({ id: record.id }, record.sysType, 'execute', reload);
+  } else if (record.sysType == 'compute') {
+    await excuteDataCenterJob({ id: record.id }, record.sysType, 'execute', reload);
+  } else if (record.sysType == 'monitor') {
+    await excuteDataCenterJob({ id: record.id }, record.sysType, 'execute', reload);
+  } else {
+    // await collectJob({ id: record.id }, reload);
+  }
+}
+
+/**
+ * 暂停
+ */
+async function handlerPause(record) {
+  if (record.sysType == 'collect') {
+    await pauseDataCenterJob({ id: record.id }, record.sysType, 'pause', reload);
+  } else if (record.sysType == 'compute') {
+    await pauseDataCenterJob({ id: record.id }, record.sysType, 'pause', reload);
+  } else if (record.sysType == 'monitor') {
+    await pauseDataCenterJob({ id: record.id }, record.sysType, 'pause', reload);
+  } else {
+    // await collectJob({ id: record.id }, reload);
+  }
+}
+
+/**
+ * 启动
+ */
+async function handlerResume(record) {
+  if (record.sysType == 'collect') {
+    await resumeDataCenterJob({ id: record.id }, record.sysType, 'resume', reload);
+  } else if (record.sysType == 'compute') {
+    await resumeDataCenterJob({ id: record.id }, record.sysType, 'resume', reload);
+  } else if (record.sysType == 'monitor') {
+    await resumeDataCenterJob({ id: record.id }, record.sysType, 'resume', reload);
+  } else {
+    // await collectJob({ id: record.id }, reload);
+  }
+}
+
+/**
+ * 批量删除事件
+ */
+async function batchHandleDelete() {
+  await batchDataCenterDeleteQuartz({ ids: selectedRowKeys.value }, reload);
+}
+</script>

+ 160 - 20
src/views/monitor/quartz/quartz.api.ts

@@ -13,10 +13,18 @@ enum Api {
   importExcelUrl = '/ventanaly/quartzJob/importExcel',
   execute = '/ventanaly/quartzJob/execute',
   deleteBatch = '/ventanaly/quartzJob/deleteBatch',
-  //数据中心  启动  停止   立即执行接口
-  collect = '/collect/quartzJob',
-  compute = '/compute/quartzJob',
-  monitor = '/ventanaly/quartzJob',
+  //数据中心
+  dataCenterList = '/dataCenter/ventanaly/quartzJob/list',
+  //数据采集 collect  数据分析  compute  应用  monitor    ------启动  resume   停止  pause  立即执行 execute
+  collect = '/dataCenter/collect/quartzJob/resume',
+  compute = '/dataCenter/compute/quartzJob/pause',
+  dataCentersave = '/dataCenter/ventanaly/quartzJob/add',
+  dataCenteredit = '/dataCenter/ventanaly/quartzJob/edit',
+  dataCenterget = '/dataCenter/ventanaly/quartzJob/queryById',
+  dataCenterdelete = '/dataCenter/ventanaly/quartzJob/delete',
+  dataCenterexportXlsUrl = '/dataCenter/ventanaly/quartzJob/exportXls',
+  dataCenterimportExcelUrl = '/dataCenter/ventanaly/quartzJob/importExcel',
+  dataCenterdeleteBatch = '/dataCenter/ventanaly/quartzJob/deleteBatch',
 }
 
 /**
@@ -93,48 +101,180 @@ export const executeImmediately = (params, handleSuccess) => {
 };
 
 /**
- * 数据中心---启动
+ * 批量删除任务
  * @param params
  */
-export const collectJob = (params, handleSuccess) => {
-  return defHttp.get({ url: Api.collect, params }).then(() => {
-    handleSuccess();
+export const batchDeleteQuartz = (params, handleSuccess) => {
+  Modal.confirm({
+    title: '确认删除',
+    content: '是否删除选中数据',
+    okText: '确认',
+    cancelText: '取消',
+    onOk: () => {
+      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {
+        handleSuccess();
+      });
+    },
   });
 };
+/**
+ * 数据中心---获取定时任务列表
+ * @param params
+ */
+export const getDataCenterList = (params) =>
+  defHttp.get({
+    headers: {
+      'X-Access-Token':
+        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
+    },
+    url: Api.dataCenterList,
+    params,
+  });
+/**
+ * 导出api
+ */
+export const getDataCenterExportUrl = Api.exportXlsUrl;
+/**
+ * 导入api
+ */
+export const getDataCenterImportUrl = Api.importExcelUrl;
 
 /**
- * 数据中心---暂停
+ * 保存或者更新任务
  * @param params
  */
-export const computeJob = (params, handleSuccess) => {
-  return defHttp.get({ url: Api.compute, params }).then(() => {
-    handleSuccess();
+export const dataCenterSaveOrUpdateQuartz = (params, isUpdate) => {
+  let url = isUpdate ? Api.dataCenteredit : Api.dataCentersave;
+  return defHttp.post({
+    headers: {
+      'X-Access-Token':
+        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
+    },
+    url: url,
+    params,
   });
 };
 
 /**
- * 数据中心---立即执行
+ * 查询任务详情
  * @param params
  */
-export const monitorJob = (params, handleSuccess) => {
-  return defHttp.get({ url: Api.monitor, params }).then(() => {
-    handleSuccess();
+export const getDataCenterQuartzById = (params) => {
+  return defHttp.get({
+    headers: {
+      'X-Access-Token':
+        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
+    },
+    url: Api.get,
+    params,
   });
 };
+
+/**
+ * 删除任务
+ * @param params
+ */
+export const deleteDataCenterQuartz = (params, handleSuccess) => {
+  return defHttp
+    .delete(
+      {
+        headers: {
+          'X-Access-Token':
+            'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
+        },
+        url: Api.delete,
+        data: params,
+      },
+      { joinParamsToUrl: true }
+    )
+    .then(() => {
+      handleSuccess();
+    });
+};
 /**
  * 批量删除任务
  * @param params
  */
-export const batchDeleteQuartz = (params, handleSuccess) => {
+export const batchDataCenterDeleteQuartz = (params, handleSuccess) => {
   Modal.confirm({
     title: '确认删除',
     content: '是否删除选中数据',
     okText: '确认',
     cancelText: '取消',
     onOk: () => {
-      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {
-        handleSuccess();
-      });
+      return defHttp
+        .delete(
+          {
+            headers: {
+              'X-Access-Token':
+                'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
+            },
+            url: Api.deleteBatch,
+            data: params,
+          },
+          { joinParamsToUrl: true }
+        )
+        .then(() => {
+          handleSuccess();
+        });
     },
   });
 };
+
+// // 定义可配置的控制接口
+function generateApiPath(moduleType, operation) {
+  return `/dataCenter/${moduleType}/quartzJob/${operation}`;
+}
+// 启动作业接口
+export const resumeDataCenterJob = (params: any, sysType: string, operation: string, handleSuccess: () => void) => {
+  const currentModule = sysType;
+  const apiPath = generateApiPath(currentModule, operation);
+  return defHttp
+    .get({
+      headers: {
+        'X-Access-Token':
+          'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
+      },
+      url: apiPath,
+      params,
+    })
+    .then(() => {
+      handleSuccess();
+    });
+};
+
+// 停止作业接口
+export const pauseDataCenterJob = (params: any, sysType: String, operation: String, handleSuccess: () => void) => {
+  const currentModule = sysType;
+  const apiPath = generateApiPath(currentModule, operation);
+  return defHttp
+    .get({
+      headers: {
+        'X-Access-Token':
+          'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
+      },
+      url: apiPath,
+      params,
+    })
+    .then(() => {
+      handleSuccess();
+    });
+};
+
+// 立即执行作业接口
+export const excuteDataCenterJob = (params: any, sysType: String, operation: String, handleSuccess: () => void) => {
+  const currentModule = sysType;
+  const apiPath = generateApiPath(currentModule, operation);
+  return defHttp
+    .get({
+      headers: {
+        'X-Access-Token':
+          'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
+      },
+      url: apiPath,
+      params,
+    })
+    .then(() => {
+      handleSuccess();
+    });
+};

+ 2 - 2
src/views/system/ossfile/index.vue

@@ -81,8 +81,8 @@
       console.log('glob.onlineUrl', glob.viewUrl);
       let filePath = encodeURIComponent(record.url);
       //文档采用pdf预览高级模式
-      if(filePath.endsWith(".pdf") || filePath.endsWith(".doc") || filePath.endsWith(".docx")){
-        filePath = filePath + '&officePreviewType=pdf'
+      if (filePath.endsWith('.pdf') || filePath.endsWith('.doc') || filePath.endsWith('.docx')) {
+        filePath = filePath + '&officePreviewType=pdf';
       }
       let url = `${glob.viewUrl}?url=` + filePath;
       window.open(url, '_blank');

+ 0 - 8
src/views/vent/dataCenter/deviceCenter/device.api.ts

@@ -10,20 +10,12 @@ export const getDeviceTypeList = (params) => defHttp.get({ url: Api.deviceTypeLi
 // export const getDeviceListByType = (params) => defHttp.post({ url: Api.deviceList, params });
 export const getDeviceListByType = (params) =>
   defHttp.post({
-    headers: {
-      'X-Access-Token':
-        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
-    },
     url: Api.deviceList,
     params,
   });
 //根据设备id获取设备监控数据
 export const getDevMonitorListById = (params) =>
   defHttp.post({
-    headers: {
-      'X-Access-Token':
-        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
-    },
     url: Api.devMonitorList,
     params,
   });

+ 74 - 188
src/views/vent/dataCenter/deviceCenter/index.vue

@@ -28,10 +28,10 @@
             <div class="right-title">实时监测:</div>
             <a-table
               size="small"
-              :scroll="{ y: 680 }"
+              :scroll="{ y: 650 }"
               :columns="outerColumns"
-              :data-source="deviceList"
-              :pagination="pagination"
+              :data-source="paginatedData2"
+              :pagination="paginationConfig2"
               :row-key="(record) => record.id"
               :expand-row-by-click="true"
               :expanded-row-keys="expandedRowKeys"
@@ -59,11 +59,11 @@
                 <a-table
                   size="small"
                   :columns="innerColumns"
-                  :data-source="monitorList"
-                  :pagination="pagination"
+                  :data-source="paginatedData"
+                  :pagination="paginationConfig"
                   :loading="loadingMap[record.id]"
                   bordered
-                  overflow-y="auto"
+                  :scroll="{ y: 410 }"
                 >
                   <template #bodyCell="{ column, record: innerRecord }">
                     <template v-if="column.dataIndex === 'value'">
@@ -87,7 +87,7 @@
 </template>
 
 <script setup lang="ts">
-import { ref, nextTick, reactive, onMounted, onUnmounted, inject, shallowRef, computed } from 'vue';
+import { ref, nextTick, reactive, onMounted, onUnmounted, watch, shallowRef, computed } from 'vue';
 import { usePermission } from '/@/hooks/web/usePermission';
 import customHeader from '/@/components/vent/customHeader.vue';
 import { AesEncryption } from '/@/utils/cipher';
@@ -119,22 +119,69 @@ const expandedRowKeys = ref([]);
 
 // 加载状态映射
 const loadingMap = reactive({});
-
-// 分页配置
-const pagination = reactive({
+// 分页参数
+const paginationState = ref({
   current: 1,
   pageSize: 10,
-  total: computed(() => deviceList.value.length),
-  showSizeChanger: true,
-  pageSizeOptions: ['10', '20', '50'],
-  onChange: (page, size) => {
-    pagination.current = page;
-    pagination.pageSize = size;
-  },
-  onShowSizeChange: (current, size) => {
-    pagination.current = 1;
-    pagination.pageSize = size;
-  },
+  total: 0,
+});
+const paginationState2 = ref({
+  current: 1,
+  pageSize: 10,
+  total: 0,
+});
+// 计算分页后的数据
+const paginatedData = computed(() => {
+  const start = (paginationState.value.current - 1) * paginationState.value.pageSize;
+  const end = start + paginationState.value.pageSize;
+  return monitorList.value.slice(start, end);
+});
+// 计算分页后的数据
+const paginatedData2 = computed(() => {
+  const start = (paginationState2.value.current - 1) * paginationState2.value.pageSize;
+  const end = start + paginationState2.value.pageSize;
+  return deviceList.value.slice(start, end);
+});
+// 分页器配置 - 修复响应式问题
+const paginationConfig = computed(() => {
+  return {
+    current: paginationState.value.current,
+    pageSize: paginationState.value.pageSize,
+    total: monitorList.value.length,
+    showSizeChanger: true,
+    showQuickJumper: true,
+    showTotal: (total) => `共 ${total} 条`,
+    pageSizeOptions: ['10', '20', '50', '100'],
+    size: 'small',
+    onChange: (page, pageSize) => {
+      paginationState.value.current = page;
+      paginationState.value.pageSize = pageSize;
+    },
+    onShowSizeChange: (current, size) => {
+      paginationState.value.current = 1;
+      paginationState.value.pageSize = size;
+    },
+  };
+});
+const paginationConfig2 = computed(() => {
+  return {
+    current: paginationState2.value.current,
+    pageSize: paginationState2.value.pageSize,
+    total: deviceList.value.length,
+    showSizeChanger: true,
+    showQuickJumper: true,
+    showTotal: (total) => `共 ${total} 条`,
+    pageSizeOptions: ['10', '20', '50', '100'],
+    size: 'small',
+    onChange: (page, pageSize) => {
+      paginationState2.value.current = page;
+      paginationState2.value.pageSize = pageSize;
+    },
+    onShowSizeChange: (current, size) => {
+      paginationState2.value.current = 1;
+      paginationState2.value.pageSize = size;
+    },
+  };
 });
 // 切换tab页面
 async function onChangeTab(tab) {
@@ -371,7 +418,7 @@ const loadMonitoringData = async (deviceId) => {
 
   loadingMap[deviceId] = true;
   try {
-    const result = await getDevMonitorListById({ devId: deviceId });
+    const result = await getDevMonitorListById({ devId: deviceId.toString() });
     monitorList.value = Object.values(result.readData);
   } catch (error) {
     console.error(`加载设备 ${deviceId} 数据失败:`, error);
@@ -384,6 +431,11 @@ onMounted(async () => {
   await getDeviceType();
 });
 onUnmounted(() => {});
+// 监听分页变化
+watch(
+  () => [paginationState.value.current, paginationState.value.pageSize],
+  () => {}
+);
 </script>
 
 <style lang="less" scoped>
@@ -479,172 +531,6 @@ onUnmounted(() => {});
           }
         }
       }
-
-      .detail-content {
-        width: 100%;
-        height: 100%;
-      }
-
-      .history-content {
-        position: relative;
-        width: 100%;
-        height: 100%;
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        background: url('/@/assets/images/fire/bj1.png') no-repeat center;
-        background-size: 100% 100%;
-        color: #fff;
-
-        .left-box {
-          width: 40%;
-          height: 100%;
-          margin-right: 15px;
-          padding: 10px;
-          box-sizing: border-box;
-          background: url('/@/assets/images/fire/bj1.png') no-repeat center;
-          background-size: 100% 100%;
-
-          .left-title {
-            display: flex;
-            height: 30px;
-            align-items: center;
-            font-size: 14px;
-            margin-bottom: 10px;
-
-            span {
-              color: #fff;
-            }
-
-            .zd-open {
-              color: rgb(0, 242, 255);
-            }
-
-            .zd-close {
-              color: #ff0000;
-            }
-
-            .title-fz {
-              margin-right: 25px;
-            }
-          }
-
-          .left-content {
-            display: flex;
-            justify-content: flex-start;
-            align-items: flex-start;
-            flex-wrap: wrap;
-            height: calc(100% - 40px);
-            overflow-y: auto;
-
-            .card-box {
-              position: relative;
-              // width: 242px;
-              width: 182px;
-              height: 120px;
-              margin-bottom: 15px;
-              display: flex;
-              justify-content: center;
-
-              .card-itemN {
-                position: relative;
-                width: 85px;
-                height: 120px;
-                background: url('/@/assets/images/zd-2.png') no-repeat center;
-                background-size: 100% 100%;
-                cursor: pointer;
-
-                .card-item-label {
-                  width: 100%;
-                  position: absolute;
-                  bottom: 5px;
-                  font-size: 12px;
-                  color: #fff;
-                  text-align: center;
-                }
-              }
-
-              .card-itemL {
-                position: relative;
-                width: 85px;
-                height: 120px;
-                background: url('/@/assets/images/zd-3.png') no-repeat center;
-                background-size: 100% 100%;
-                cursor: pointer;
-
-                .card-item-label {
-                  width: 100%;
-                  position: absolute;
-                  bottom: 5px;
-                  font-size: 12px;
-                  color: #fff;
-                  text-align: center;
-                }
-              }
-
-              .card-itemD {
-                position: relative;
-                width: 85px;
-                height: 120px;
-                background: url('/@/assets/images/zd-1.png') no-repeat center;
-                background-size: 100% 100%;
-                cursor: pointer;
-
-                .card-item-label {
-                  width: 100%;
-                  position: absolute;
-                  bottom: 5px;
-                  font-size: 12px;
-                  color: #fff;
-                  text-align: center;
-                }
-              }
-
-              .card-modal {
-                width: 86px;
-                position: absolute;
-                left: 140px;
-                color: #fff;
-                top: 50%;
-                transform: translate(0, -50%);
-                font-size: 12px;
-              }
-
-              .card-modal1 {
-                width: 86px;
-                position: absolute;
-                left: -42px;
-                color: #fff;
-                top: 50%;
-                transform: translate(0, -50%);
-                font-size: 12px;
-              }
-            }
-          }
-        }
-
-        .right-box {
-          width: calc(60% - 15px);
-          height: 100%;
-          padding: 10px;
-          box-sizing: border-box;
-          background: url('/@/assets/images/fire/bj1.png') no-repeat center;
-          background-size: 100% 100%;
-
-          .historytable {
-            height: 100%;
-          }
-
-          .right-title {
-            display: flex;
-            height: 30px;
-            align-items: center;
-            font-size: 14px;
-            color: #fff;
-            margin-bottom: 10px;
-          }
-        }
-      }
     }
   }
 }

+ 1 - 9
src/views/vent/dataCenter/infoCenter/infoCenter.api.ts

@@ -2,15 +2,11 @@ import { defHttp } from '/@/utils/http/axios';
 
 enum Api {
   getDeviceAll = '/dataCenter/compute/deviceData/getDeviceAll',
-  getHomepageSummaryIndexes = '/sjzx/modelreq/safety/homepage/getHomepageSummaryIndexes',
+  getHomepageSummaryIndexes = '/dataCenter/safety/homepage/getHomepageSummaryIndexes',
 }
 //数据列表
 export const getDeviceAll = (params) =>
   defHttp.post({
-    headers: {
-      'X-Access-Token':
-        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
-    },
     url: Api.getDeviceAll,
     params,
   });
@@ -18,9 +14,5 @@ export const getDeviceAll = (params) =>
 //首页数据详情
 export const getHomepageSummaryIndexes = () =>
   defHttp.get({
-    headers: {
-      'X-Access-Token':
-        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
-    },
     url: Api.getHomepageSummaryIndexes,
   });

+ 20 - 5
src/views/vent/dataCenter/stationCenter/device.api.ts

@@ -2,13 +2,28 @@ import { defHttp } from '/@/utils/http/axios';
 
 enum Api {
   subStationList = '/safety/ventanalySubStation/alllist',
-  deviceTypeList = '/safety/ventanalyDeviceInfo/DeviceKind/queryBySystem',
-  deviceList = '/compute/deviceData/getDeviceAll',
-  devMonitorList = '/compute/deviceData/getDeviceMonitorInfo',
+  deviceList = '/dataCenter/compute/deviceData/getDeviceAll',
+  devMonitorList = '/dataCenter/compute/deviceData/getDeviceMonitorInfo',
 }
 // 分站查询接口
 export const subStationList = (params) => defHttp.get({ url: Api.subStationList, params });
 //根据设备类型获取设备列表
-export const getDeviceListByType = (params) => defHttp.post({ url: Api.deviceList, params });
+export const getDeviceListByType = (params) =>
+  defHttp.post({
+    headers: {
+      'X-Access-Token':
+        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
+    },
+    url: Api.deviceList,
+    params,
+  });
 //根据设备id获取设备监控数据
-export const getDevMonitorListById = (params) => defHttp.post({ url: Api.devMonitorList, params });
+export const getDevMonitorListById = (params) =>
+  defHttp.post({
+    headers: {
+      'X-Access-Token':
+        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzU5ODQxMTcwfQ.fHaM3l-d88tUSLOs8sstXsDuSCn6Agbj_EMZMgV6waw',
+    },
+    url: Api.devMonitorList,
+    params,
+  });

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 88 - 911
src/views/vent/dataCenter/stationCenter/index.vue


+ 18 - 10
src/views/vent/home/configurable/components/header.vue

@@ -1,20 +1,29 @@
 <!-- eslint-disable vue/multi-word-component-names -->
 <template>
   <!-- Header部分 -->
-  <div v-if="headerConfig.show" class="w-100% flex costume-header" :class="headerConfig.selector.toggleIcon ? 'costume-headerToggleIcon' : 'costume-header' ">
+  <div
+    v-if="headerConfig.show"
+    class="w-100% flex costume-header"
+    :class="headerConfig.selector.toggleIcon ? 'costume-headerToggleIcon' : 'costume-header'"
+  >
     <!-- 选择下拉框,自动填充剩余空间,这种实现是因为 Select 不支持 suffix -->
     <Dropdown
       v-if="headerConfig.selector.show"
-      class="flex-grow-1 "
+      class="flex-grow-1"
       :class="!headerConfig.selector.toggleIcon ? 'costume-header_left' : ''"
       :trigger="['click']"
       :bordered="false"
       @open-change="visible = $event"
     >
       <div class="flex-basis-100% flex flex-items-center" @click.prevent>
-         <img style="margin-right:10px" v-if="headerConfig.selector.toggleIcon" src="@/assets/images/home-container/configurable/electroChamper/2-2.png" alt=""></img>
+        <img
+          style="margin-right: 10px"
+          v-if="headerConfig.selector.toggleIcon"
+          src="@/assets/images/home-container/configurable/electroChamper/2-2.png"
+          alt=""
+        />
         <SwapOutlined v-else class="w-30px" />
-       
+
         <div class="w-100px flex-grow-1 overflow-hidden whitespace-nowrap text-ellipsis">
           {{ selectedDeviceLabel }}
         </div>
@@ -80,15 +89,14 @@
 <style scoped>
   @import '/@/design/theme.less';
 
-
   .costume-header {
     height: 30px;
     background-image: linear-gradient(90deg, var(--vent-base-light-bg-opcity), transparent 20%, transparent 80%, var(--vent-base-light-bg-opcity));
   }
-  .costume-headerToggleIcon{
-     height: 30px;
-     background: url('@/assets/images/home-container/configurable/electroChamper/2-1.png') ;
-     background-size: 100% 100%;
+  .costume-headerToggleIcon {
+    height: 30px;
+    background: url('@/assets/images/home-container/configurable/electroChamper/2-1.png');
+    background-size: 100% 100%;
   }
   .costume-header_left {
     border-left: 3px solid;
@@ -101,7 +109,7 @@
     border-image-source: linear-gradient(to top, #00000033, var(--vent-base-light-bg), #00000033);
     border-image-slice: 1;
   }
-  img{
+  img {
     width: 16px;
     height: 16px;
     margin-left: 8px;

+ 22 - 8
src/views/vent/monitorManager/fireDoorMonitor/fireDoor.threejs.ssl.ts

@@ -68,7 +68,7 @@ class FireDoorSsl {
       return;
     }
     if (this.mixers && this.fmClock.running) {
-      this.mixers.update(2);
+      this.mixers.update(1);
     }
   }
 
@@ -144,13 +144,6 @@ class FireDoorSsl {
           this.clipActionArr.juanlianmen.timeScale = timeScale;
           // this.clipActionArr.juanlianmen.clampWhenFinished = true;
           this.clipActionArr.juanlianmen.play();
-          if (!this.clipActionArr.gaiban) return;
-          this.clipActionArr.gaiban.paused = true;
-          this.clipActionArr.gaiban.reset();
-          this.clipActionArr.gaiban.time = 0.1;
-          this.clipActionArr.gaiban.timeScale = timeScale;
-          // this.clipActionArr.gaiban.clampWhenFinished = true;
-          this.clipActionArr.gaiban.play();
           this.fmClock.start();
 
           // 显示打开前门文字
@@ -166,6 +159,27 @@ class FireDoorSsl {
           this.clipActionArr.juanlianmen.timeScale = -timeScale;
           // this.clipActionArr.juanlianmen.clampWhenFinished = true;
           this.clipActionArr.juanlianmen.play();
+          this.fmClock.start();
+
+          if (this.damperOpenMesh) this.damperOpenMesh.visible = false;
+        };
+        break;
+      case 3: // 打开盖板
+        handler = () => {
+          if (!this.clipActionArr.gaiban) return;
+          this.clipActionArr.gaiban.paused = true;
+          this.clipActionArr.gaiban.reset();
+          this.clipActionArr.gaiban.time = 0.1;
+          this.clipActionArr.gaiban.timeScale = timeScale;
+          // this.clipActionArr.gaiban.clampWhenFinished = true;
+          this.clipActionArr.gaiban.play();
+          this.fmClock.start();
+
+          if (this.damperOpenMesh) this.damperOpenMesh.visible = false;
+        };
+        break;
+      case 4: // 关闭盖板
+        handler = () => {
           if (!this.clipActionArr.gaiban) return;
           this.clipActionArr.gaiban.paused = true;
           this.clipActionArr.gaiban.reset(); //

+ 7 - 3
src/views/vent/monitorManager/fireDoorMonitor/fireDoor.threejs.ts

@@ -89,8 +89,6 @@ export const setModelType = (type) => {
     fireDoorRed.resetAnimate();
   }
 
-  fhmType = type;
-
   const fhmConfigurations = {
     fireDoor: {
       render: fireDoor ? () => fireDoor.render() : null,
@@ -118,6 +116,10 @@ export const setModelType = (type) => {
     },
   };
 
+  const oldConfig = fhmConfigurations[fhmType];
+  const config = fhmConfigurations[type];
+  fhmType = type;
+
   if (type == 'fireDoor' || type == 'fireDoorF') {
     model.orbitControls.maxPolarAngle = Math.PI / 2;
     model.orbitControls.minPolarAngle = Math.PI / 3;
@@ -133,9 +135,11 @@ export const setModelType = (type) => {
     model.orbitControls.update();
   }
 
-  const config = fhmConfigurations[fhmType];
   const oldCameraPosition = { x: -1000, y: 100, z: 500 };
   return new Promise((resolve) => {
+    if (oldConfig && oldConfig.group) {
+      model.scene?.remove(oldConfig.group);
+    }
     if (config && config.group) {
       model.startAnimation = config.render;
       group = config.group;

+ 44 - 11
src/views/vent/monitorManager/fireDoorMonitor/index.vue

@@ -6,13 +6,18 @@
   <div class="scene-box">
     <div class="top-box">
       <div class="top-center row">
-        <div v-if="hasPermission('btn:control')" class="button-box" @click="setControl('frontGateOpen_S', '打开')">打开防火门</div>
-        <div v-if="hasPermission('btn:control')" class="button-box" @click="setControl('frontGateClose_S', '关闭')">关闭防火门</div>
-        <div v-if="hasPermission('btn:stopControl')" class="button-box" @click="setControl('frontGateStop_S', '停止')">关闭防火门</div>
+        <template v-if="selectData.modelType == 'fireDoorSsl'">
+          <div v-if="hasPermission('btn:control')" class="button-box" @click="() => modalContext1.openModal()"> 防火门控制 </div>
+        </template>
+        <template v-else>
+          <div v-if="hasPermission('btn:control')" class="button-box" @click="setControl('frontGateOpen_S', '打开')">打开防火门</div>
+          <div v-if="hasPermission('btn:control')" class="button-box" @click="setControl('frontGateClose_S', '关闭')">关闭防火门</div>
+          <div v-if="hasPermission('btn:stopControl')" class="button-box" @click="setControl('frontGateStop_S', '停止')">停止</div>
+        </template>
       </div>
       <!-- 控制模式 -->
       <div class="top-right row">
-        <div class="vent-flex-m row" v-if="selectData.contrlMod == 'loopCtrl'">
+        <!-- <div class="vent-flex-m row" v-if="selectData.contrlMod == 'loopCtrl'">
           <div class="control-title">控制模式:</div>
           <a-radio-group v-model:value="selectData.autoRoManual">
             <template v-for="(item, index) in modelList" :key="index">
@@ -35,7 +40,7 @@
             :key="index"
             >{{ item.text }}</div
           >
-        </div>
+        </div> -->
 
         <!-- <div class="run-type row">
           <div class="control-title">运行状态:</div>
@@ -181,6 +186,23 @@
     @handle-cancel="handleCancel"
   />
   <DeviceBaseInfo @register="registerModal" :device-type="selectData['deviceType']" />
+  <BasicModal @register="registerModal1" title="防火门控制">
+    <div class="flex justify-around mt-20px mb-20px">
+      <Button type="primary" class="w-120px" @click="setControl('frontGateOpen_S', '开启', true)">卷帘门开启</Button>
+      <Button type="primary" class="w-120px" @click="setControl('frontGateClose_S', '关闭', true)">卷帘门关闭</Button>
+      <Button type="primary" class="w-120px" @click="setControl('frontGateStop_S', '停止', true)">卷帘门停止</Button>
+    </div>
+    <div class="flex justify-around mt-20px mb-20px">
+      <Button type="primary" class="w-120px" @click="setControl('MBOpen_S', '开启', true)">皮带密闭开启</Button>
+      <Button type="primary" class="w-120px" @click="setControl('MBClose_S', '关闭', true)">皮带密闭关闭</Button>
+      <Button type="primary" class="w-120px" @click="setControl('MBStop_S', '停止', true)">皮带密闭停止</Button>
+    </div>
+    <div class="flex justify-around mt-20px mb-20px">
+      <Button type="primary" class="w-120px" @click="setControl('AllOpen_S', '开启', true)">同时开启</Button>
+      <Button type="primary" class="w-120px" @click="setControl('AllClose_S', '关闭', true)">同时关闭</Button>
+      <Button type="primary" class="w-120px" @click="setControl('AllStop_S', '停止', true)">同时停止</Button>
+    </div>
+  </BasicModal>
 </template>
 
 <script setup lang="ts">
@@ -193,13 +215,13 @@
   import DeviceBaseInfo from '../comment/components/DeviceBaseInfo.vue';
   import { mountedThree, play, destroy, setModelType } from './fireDoor.threejs';
   import { deviceControlApi } from '/@/api/vent/index';
-  import { message } from 'ant-design-vue';
+  import { message, Button } from 'ant-design-vue';
   import { list, getTableList } from './fireDoor.api';
   import lodash from 'lodash';
   import { setDivHeight } from '/@/utils/event';
   import { BorderBox8 as DvBorderBox8 } from '@kjgl77/datav-vue3';
   import { useRouter } from 'vue-router';
-  import { useModal } from '/@/components/Modal';
+  import { useModal, BasicModal } from '/@/components/Modal';
   import { useCamera } from '/@/hooks/system/useCamera';
   import { usePermission } from '/@/hooks/web/usePermission';
   import { getDictItems } from '/@/api/common/api';
@@ -232,6 +254,7 @@
 
   const deviceBaseList = ref([]); // 设备基本信息
   const [registerModal, { openModal, closeModal }] = useModal();
+  const [registerModal1, modalContext1] = useModal();
 
   const { getCamera, removeCamera } = useCamera();
 
@@ -391,12 +414,12 @@
   let isOpenRunning = false; //开关门动作是否在进行
   /** 开关门动画调用 */
   let isdoorOpenRunning = false; //开关门动作是否在进行
-  // let isMidCloseRunning = false; //中间门动作是否在进行
+  let isMBRunning = false; //密闭门动作是否在进行
   // 0 关闭 1 正在打开 2 打开 3正在关闭
   let doorDeviceState = 0; //记录设备状态,为了与下一次监测数据做比较
   function monitorAnimation(selectData) {
     const timeScale = 0.005;
-    // 打开
+    // 打开(普通门或卷帘门)
     if (selectData.frontGateOpen == '1' && !isdoorOpenRunning) {
       isdoorOpenRunning = true;
       if (doorDeviceState != 1) {
@@ -406,7 +429,7 @@
         doorIsOpen.value = true;
       }
     }
-    // 关闭
+    // 关闭(普通门或卷帘门)
     if (selectData.frontGateOpen == '0' && isdoorOpenRunning) {
       isdoorOpenRunning = false;
       if (doorDeviceState != 0) {
@@ -416,6 +439,16 @@
         doorIsOpen.value = false;
       }
     }
+    // 皮带密闭开
+    if (selectData.MBOpen == '1' && !isMBRunning) {
+      isMBRunning = true;
+      play(3, timeScale);
+    }
+    // 皮带密闭关
+    if (selectData.MBOpen == '0' && isMBRunning) {
+      isMBRunning = false;
+      play(4, timeScale);
+    }
   }
 
   function handleCancel() {
@@ -449,7 +482,7 @@
     destroy();
   });
 </script>
-,
+
 <style lang="less" scoped>
   @import '/@/design/vent/modal.less';
   .scene-box {

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است