Browse Source

Merge remote-tracking branch 'origin/dev' into dev

Hwf 7 months ago
parent
commit
9d3298da07

+ 8 - 0
src/api/globalMap/mitigation.ts

@@ -7,3 +7,11 @@ export const getRescue = (data) => {
     data: data
   });
 };
+// 交通视频
+export const getTraffic = (data) => {
+  return request({
+    url: '/api/gateway/v2/get_video_transportation_list',
+    method: 'post',
+    data: data
+  });
+};

+ 13 - 0
src/api/globalMap/spatialAnalysis.ts

@@ -403,3 +403,16 @@ export const getVideoDisasterPrevention = (id: string) => {
     }
   });
 };
+
+// 交通视频
+export const getVideoTraffic = (id: string) => {
+  return request({
+    url: '/api/gateway/v2/get_video_transportation_list',
+    method: 'post',
+    data: {
+      query: {
+        id: id
+      }
+    }
+  });
+};

+ 4 - 2
src/components/Map/data.ts

@@ -27,8 +27,8 @@ import {
   getWaterList,
   getVideoDrowning,
   getVideoForestFire,
-  getVideoDisasterPrevention
-} from '@/api/globalMap/spatialAnalysis';
+  getVideoDisasterPrevention, getVideoTraffic
+} from "@/api/globalMap/spatialAnalysis";
 import { getRescueTeamsInfo } from '@/api/globalMap/rescueTeam';
 
 export const methodList = {
@@ -65,6 +65,7 @@ export const methodList = {
   '32': getVideoDrowning,
   '33': getVideoForestFire,
   '34': getVideoDisasterPrevention,
+  '35': getVideoTraffic,
   '41': getRescueTeamsInfo
 };
 export const titleList = {
@@ -102,5 +103,6 @@ export const titleList = {
   '32': '防溺水',
   '33': '森林防火',
   '34': '防灾救援',
+  '35': '交通视频',
   '41': '救援队伍'
 };

+ 0 - 21
src/types/components.d.ts

@@ -21,7 +21,6 @@ declare module 'vue' {
     ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
     ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
     ElButton: typeof import('element-plus/es')['ElButton']
-    ElCard: typeof import('element-plus/es')['ElCard']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
@@ -38,34 +37,20 @@ declare module 'vue' {
     ElIcon: typeof import('element-plus/es')['ElIcon']
     ElImage: typeof import('element-plus/es')['ElImage']
     ElInput: typeof import('element-plus/es')['ElInput']
-    ElLink: typeof import('element-plus/es')['ElLink']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
     ElOption: typeof import('element-plus/es')['ElOption']
     ElPagination: typeof import('element-plus/es')['ElPagination']
-    ElPopover: typeof import('element-plus/es')['ElPopover']
-    ElRadio: typeof import('element-plus/es')['ElRadio']
-    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
     ElSelect: typeof import('element-plus/es')['ElSelect']
-    ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
-    ElSkeletonItem: typeof import('element-plus/es')['ElSkeletonItem']
     ElSlider: typeof import('element-plus/es')['ElSlider']
-    ElStep: typeof import('element-plus/es')['ElStep']
-    ElSteps: typeof import('element-plus/es')['ElSteps']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
-    ElTable: typeof import('element-plus/es')['ElTable']
-    ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
-    ElTabPane: typeof import('element-plus/es')['ElTabPane']
-    ElTabs: typeof import('element-plus/es')['ElTabs']
     ElText: typeof import('element-plus/es')['ElText']
     ElTimeline: typeof import('element-plus/es')['ElTimeline']
     ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
-    ElTooltip: typeof import('element-plus/es')['ElTooltip']
     ElTree: typeof import('element-plus/es')['ElTree']
-    ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
     ElUpload: typeof import('element-plus/es')['ElUpload']
     FileUpload: typeof import('./../components/FileUpload/index.vue')['default']
     FooterSection: typeof import('./../components/FooterSection/index.vue')['default']
@@ -76,12 +61,10 @@ declare module 'vue' {
     HikvisionPlayer: typeof import('./../components/HKVideo/hikvision-player.vue')['default']
     HKVideo: typeof import('./../components/HKVideo/index.vue')['default']
     IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
-    IEpUploadFilled: typeof import('~icons/ep/upload-filled')['default']
     IFrame: typeof import('./../components/iFrame/index.vue')['default']
     ImagePreview: typeof import('./../components/ImagePreview/index.vue')['default']
     ImageUpload: typeof import('./../components/ImageUpload/index.vue')['default']
     Index2: typeof import('./../components/Dialog/index2.vue')['default']
-    InfoDialog: typeof import('./../components/InfoDialog/index.vue')['default']
     LangSelect: typeof import('./../components/LangSelect/index.vue')['default']
     LineWidthSelect: typeof import('./../components/LineWidthSelect/index.vue')['default']
     Map: typeof import('./../components/Map/index.vue')['default']
@@ -113,10 +96,6 @@ declare module 'vue' {
     VideoContainer2: typeof import('./../components/HKVideo/video-container2.vue')['default']
     VideoTagEdit: typeof import('./../components/VideoTagEdit/index.vue')['default']
     YMap: typeof import('./../components/Map/YMap.vue')['default']
-    YMapold: typeof import('./../components/Map/YMapold.vue')['default']
     YztMap: typeof import('./../components/Map/YztMap/index.vue')['default']
   }
-  export interface ComponentCustomProperties {
-    vLoading: typeof import('element-plus/es')['ElLoadingDirective']
-  }
 }

+ 180 - 0
src/views/globalMap/RightMenu/TrafficVideo.vue

@@ -0,0 +1,180 @@
+<template>
+  <div class="menu-content">
+    <div class="container">
+      <div class="gradient-text title">交通视频</div>
+      <div class="box-left">
+        <el-input v-model="queryParams.keyword" class="custom-input" placeholder="搜索" @input="initData">
+          <template #prefix>
+            <el-icon class="el-input__icon"><search /></el-icon>
+          </template>
+        </el-input>
+        <div class="btn" @click="handleCancel">取消</div>
+      </div>
+      <!--      <div class="gradient-text">视频类型</div>-->
+      <div class="custom-table">
+        <div class="th">
+          <div class="td">
+            <div style="width: 240px">
+              <el-select
+                v-model="queryParams.area"
+                placeholder="所有区县"
+                size="large"
+                class="custom-select2"
+                popper-class="custom-select-popper2"
+                :teleported="false"
+                @change="initData"
+              >
+                <el-option label="所有区县" value="" />
+                <el-option v-for="item in district_type" :key="item.value" :label="item.label" :value="item.label" />
+              </el-select>
+            </div>
+          </div>
+          <div class="td">名称</div>
+        </div>
+        <div class="table-content">
+          <div v-for="(item, index) in listData" :key="index" class="tr" @click="handleShowDialog(item)">
+            <div class="td">{{ item.area }}</div>
+            <div class="td">{{ item.name }}</div>
+          </div>
+        </div>
+      </div>
+      <Dialog v-if="showDialog" v-model="showDialog" type="md" title="交通视频" hide-footer>
+        <div style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center">
+          <HKVideo :dot_data="videoMonitorData" />
+        </div>
+      </Dialog>
+    </div>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { Search } from '@element-plus/icons-vue';
+import { getRescue, getTraffic } from "@/api/globalMap/mitigation";
+import { deepClone } from '@/utils';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { district_type } = toRefs<any>(proxy?.useDict('district_type'));
+const queryParams = reactive({
+  current: 1,
+  size: 10,
+  keyword: '',
+  area: ''
+});
+const total = ref(0);
+
+const listData = ref([]);
+
+let showDialog = ref(false);
+let videoMonitorData = ref({});
+const handleShowDialog = (row) => {
+  showDialog.value = false;
+  nextTick(() => {
+    videoMonitorData.value = row;
+    showDialog.value = true;
+  });
+};
+const initData = () => {
+  let newQueryParams = deepClone(queryParams);
+  newQueryParams.query = {
+    area: queryParams.area,
+    keyword: queryParams.keyword
+  };
+  delete newQueryParams.area;
+  delete newQueryParams.keyword;
+  getTraffic(newQueryParams).then((res) => {
+    listData.value = res.rows;
+    total.value = res.total;
+  });
+};
+const handleCancel = () => {
+  queryParams.keyword = '';
+  initData();
+};
+initData();
+</script>
+
+<style lang="scss" scoped>
+.menu-content {
+  width: 1579px;
+  height: 1394px;
+  background: url('@/assets/images/map/rightMenu/content.png') no-repeat;
+  padding: 130px 20px 20px 20px;
+  font-size: 36px;
+  position: relative;
+  color: #ffffff;
+}
+.title {
+  font-size: 60px;
+  position: absolute;
+  top: 30px;
+  left: 160px;
+}
+.custom-table {
+  width: 1499px;
+  .table-content {
+    height: 880px;
+    overflow-y: auto;
+    overflow-x: hidden;
+  }
+  .th {
+    width: 1499px;
+    height: 151px;
+    background: url('@/assets/images/map/rightMenu/th.png') no-repeat;
+    display: flex;
+  }
+  .tr {
+
+    height: 139px;
+    background: url('@/assets/images/map/rightMenu/td.png') no-repeat;
+    //margin-left: -23px;
+    display: flex;
+    padding-right: 20px;
+    &:hover {
+      background: url('@/assets/images/map/rightMenu/td_checked.png') no-repeat;
+    }
+  }
+  .td {
+    flex: 1;
+    color: #edfaff;
+    font-size: 38px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    cursor: pointer;
+  }
+  .td-text {
+    /* 设置字体透明 */
+    color: transparent;
+    /* 使用 -webkit-background-clip 属性将背景剪裁至文本形状 */
+    -webkit-background-clip: text;
+    /* 非Webkit内核浏览器需要使用标准前缀 */
+    background-clip: text;
+    font-family: 'YouSheBiaoTiHei';
+    /* 设置线性渐变,从红色渐变到蓝色 */
+    background-image: linear-gradient(to bottom, #ffffff 50%, #3075d3 100%);
+    font-size: 48px;
+  }
+  .text-green {
+    background-image: linear-gradient(to bottom, #ffffff 50%, #40c75f 100%);
+  }
+  .text-danger {
+    background-image: linear-gradient(to bottom, #ffffff 50%, #ff2f3c 100%);
+  }
+}
+.box-left {
+  display: flex;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  .btn {
+    width: 140px;
+    min-width: 140px;
+    height: 56px;
+    background: url('@/assets/images/map/rightMenu/potentialFloodHazard/btn.png') no-repeat;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    cursor: pointer;
+    margin-left: 20px;
+  }
+}
+</style>

+ 3 - 0
src/views/globalMap/RightMenu/index.vue

@@ -67,6 +67,8 @@
           <ForestDefenseVideo v-if="menuState.menuData[menuState.activeIndex]?.name === '森防视频'" :activeMap="activeMap" @handle-menu="handleMenu" />
           <!--防灾救援-->
           <Mitigation v-if="menuState.menuData[menuState.activeIndex]?.name === '防灾救援'" @handle-menu="handleMenu" />
+          <!--交通视频-->
+          <TrafficVideo v-if="menuState.menuData[menuState.activeIndex]?.name === '交通视频'" @handle-menu="handleMenu" />
           <!--易涝隐患点-->
           <PotentialFloodHazard v-if="menuState.menuData[menuState.activeIndex]?.name === '易涝隐患点'" @handle-menu="handleMenu" />
           <!--通讯保障-->
@@ -120,6 +122,7 @@ import MobileCommandVehicle from './MobileCommandVehicle.vue';
 import Helicopter from './Helicopter.vue';
 import TyphoonVideo from './TyphoonVideo.vue';
 import RescueTeam from './RescueTeam.vue';
+import TrafficVideo from './TrafficVideo.vue';
 interface Props {
   pointType: PointType[];
   activeMap: string;

+ 1 - 1
src/views/routineCommandMap/LeftSection/RiskMonitor.vue

@@ -113,7 +113,7 @@ import {
 const active = ref('0');
 const riskList = ref([
   { name: '危化品', value: '0' },
-  { name: '雨', value: '1' },
+  { name: '雨', value: '1' },
   { name: '森林火灾', value: '2' }
 ]);
 // 危化品

+ 6 - 5
src/views/routineCommandMap/RightSection/index.vue

@@ -82,13 +82,14 @@ const props = defineProps({
   flag: Boolean
 });
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { mm_event_type } = toRefs<any>(
-  proxy?.useDict('mm_event_type')
-);
+const { mm_event_type } = toRefs<any>(proxy?.useDict('mm_event_type'));
 const queryParams = reactive({
-  year: '2024'
+  year: ['2024', '2025']
 });
-const yearOptions = reactive([{ name: '2024', value: '2024' }]);
+const yearOptions = reactive([
+  { name: '2024', value: '2024' },
+  { name: '2025', value: '2025' }
+]);
 const statisticalData = ref({
   nf: '',
   nf_value: '',