From 419fe50acad4674f50c6639b3ec7ccbcaf2cbf44 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期四, 20 三月 2025 17:43:49 +0800
Subject: [PATCH] 走航融合(待完成)

---
 src/model/SatelliteGrid.js                        |    3 
 src/views/underwaymix/UnderwayMixMode.vue         |   95 ++++++++++++++-----
 src/utils/map/grid.js                             |    2 
 src/components.d.ts                               |    4 
 src/views/underwaymix/component/GridStyleTool.vue |  162 +++++++++++++++++++++----------
 src/router/index.js                               |    2 
 6 files changed, 187 insertions(+), 81 deletions(-)

diff --git a/src/components.d.ts b/src/components.d.ts
index f0bc47d..34b6c69 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -27,6 +27,7 @@
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     ElDialog: typeof import('element-plus/es')['ElDialog']
+    ElDivider: typeof import('element-plus/es')['ElDivider']
     ElDropdown: typeof import('element-plus/es')['ElDropdown']
     ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
     ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
@@ -34,15 +35,16 @@
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
     ElIcon: typeof import('element-plus/es')['ElIcon']
     ElInput: typeof import('element-plus/es')['ElInput']
+    ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
     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']
     ElSlider: typeof import('element-plus/es')['ElSlider']
-    ElSpace: typeof import('element-plus/es')['ElSpace']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
     ElTable: typeof import('element-plus/es')['ElTable']
     ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
diff --git a/src/model/SatelliteGrid.js b/src/model/SatelliteGrid.js
index ddf731f..dad244c 100644
--- a/src/model/SatelliteGrid.js
+++ b/src/model/SatelliteGrid.js
@@ -503,6 +503,9 @@
           style: {
             isMixGridHighlight: true
           }
+        },
+        extData: {
+          name: `璧拌埅铻嶅悎 - ${mixTag}`
         }
       });
     }
diff --git a/src/router/index.js b/src/router/index.js
index 47edf4f..770dcf5 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -6,7 +6,7 @@
   routes: [
     {
       path: '/',
-      redirect: '/login'
+      redirect: '/index/underwaymix'
     },
     // 鐧婚檰椤甸潰
     {
diff --git a/src/utils/map/grid.js b/src/utils/map/grid.js
index 64a4cdf..18241d1 100644
--- a/src/utils/map/grid.js
+++ b/src/utils/map/grid.js
@@ -426,7 +426,7 @@
         grid.setOptions({
           ...style,
           fillColor: _color, //澶氳竟褰㈠~鍏呴鑹�
-          fillOpacity: style.opacity ? style.opacity : color[3] == 0 ? 0 : 0.7
+          fillOpacity: style.opacity ? style.opacity : color[3] == 0 ? 0 : 1
         });
 
         res.push(grid);
diff --git a/src/views/underwaymix/UnderwayMixMode.vue b/src/views/underwaymix/UnderwayMixMode.vue
index 3d690d3..3d321e7 100644
--- a/src/views/underwaymix/UnderwayMixMode.vue
+++ b/src/views/underwaymix/UnderwayMixMode.vue
@@ -51,8 +51,16 @@
                   @change="handleMixClick"
                 >
                 </CheckButton>
+                <CheckButton
+                  :disabled="!mixActive"
+                  active-text="椋庨櫓鐑姏鍥�"
+                  inactive-text="椋庨櫓鐑姏鍥�"
+                  :default-value="false"
+                  @change="handleHeatMapClick"
+                >
+                </CheckButton>
               </el-row>
-              <div class="m-t-8">缃戞牸瑕佺礌</div>
+              <!-- <div class="m-t-8">缃戞牸瑕佺礌</div>
               <el-row class="m-t-8">
                 <CheckButton
                   active-text="鏄剧ず缃戞牸"
@@ -99,7 +107,6 @@
               </el-row>
               <div class="m-t-8">璧拌埅瑕佺礌</div>
               <el-row class="m-t-8">
-                <!-- <el-divider content-position="left"></el-divider> -->
 
                 <el-button
                   type="primary"
@@ -110,7 +117,7 @@
                 >
                   {{ underwayVisible ? '闅愯棌璧拌埅璺嚎' : '鏄剧ず璧拌埅璺嚎' }}
                 </el-button>
-              </el-row>
+              </el-row> -->
             </template>
             <template #footer> </template>
           </BaseCard>
@@ -126,7 +133,10 @@
         </el-row>
       </el-col>
     </el-row>
-    <GridStyleTool :gridCtrls="gridCtrls"></GridStyleTool>
+    <GridStyleTool
+      :gridCtrls="gridCtrls"
+      @show-underway="handleUnderwayClick"
+    ></GridStyleTool>
   </el-row>
   <!-- </div> -->
 </template>
@@ -272,12 +282,19 @@
   });
   if (mixActive.value) {
     satelliteGrid.mixGrid(tags);
+    gridCtrls.value = [satelliteGrid];
   } else {
     satelliteGrid.changeVisibility({
       tags,
       showGridViews: true
     });
   }
+}
+
+function handleHeatMapClick() {
+  const tags = fusionDataList.value
+    .filter((v, i) => selectedfusionData.value.indexOf(i) != -1)
+    .map((v) => v.id);
 }
 
 function handleGridClick() {
@@ -291,9 +308,18 @@
   });
 }
 
-function handleUnderwayClick() {
+function handleUnderwayClick({ isShow, dataId }) {
   underwayVisible.value = !underwayVisible.value;
-  underwayVisible.value ? draw() : mapLine.hideLine();
+
+  if (isShow) {
+    draw(dataId);
+  } else {
+    const d = fusionDataList.value.find((v) => v.id == dataId);
+    const mission = missionStore.missionList.find((v) => {
+      return v.missionCode == d.mixDataId;
+    });
+    mapLine.hideLine(mission.missionCode);
+  }
 }
 
 function handleRankClick() {
@@ -389,30 +415,49 @@
   });
 }
 
-function draw() {
+function draw(dataId) {
   if (isUnmounted.value) return;
 
-  selectedfusionData.value.forEach((i) => {
-    const d = fusionDataList.value[i];
+  // selectedfusionData.value.forEach((i) => {
+  //   const d = fusionDataList.value[i];
 
-    const mission = missionStore.missionList.find((v) => {
-      return v.missionCode == d.mixDataId;
-    });
+  //   const mission = missionStore.missionList.find((v) => {
+  //     return v.missionCode == d.mixDataId;
+  //   });
 
-    if (factorDataMap.has(mission.missionCode)) {
-      const fd = factorDataMap.get(mission.missionCode);
-      drawLine(mission.missionCode, fd);
-    } else {
-      search(mission).then((res) => {
-        const fd = new FactorDatas();
-        fd.setData(res.data, drawMode.value, () => {
-          fd.refreshHeight(factorType.value);
-          factorDataMap.set(mission.missionCode, fd);
-          drawLine(mission.missionCode, fd);
-        });
-      });
-    }
+  //   if (factorDataMap.has(mission.missionCode)) {
+  //     const fd = factorDataMap.get(mission.missionCode);
+  //     drawLine(mission.missionCode, fd);
+  //   } else {
+  //     search(mission).then((res) => {
+  //       const fd = new FactorDatas();
+  //       fd.setData(res.data, drawMode.value, () => {
+  //         fd.refreshHeight(factorType.value);
+  //         factorDataMap.set(mission.missionCode, fd);
+  //         drawLine(mission.missionCode, fd);
+  //       });
+  //     });
+  //   }
+  // });
+
+  const d = fusionDataList.value.find((v) => v.id == dataId);
+  const mission = missionStore.missionList.find((v) => {
+    return v.missionCode == d.mixDataId;
   });
+
+  if (factorDataMap.has(mission.missionCode)) {
+    const fd = factorDataMap.get(mission.missionCode);
+    drawLine(mission.missionCode, fd);
+  } else {
+    search(mission).then((res) => {
+      const fd = new FactorDatas();
+      fd.setData(res.data, drawMode.value, () => {
+        fd.refreshHeight(factorType.value);
+        factorDataMap.set(mission.missionCode, fd);
+        drawLine(mission.missionCode, fd);
+      });
+    });
+  }
 }
 
 function drawLine(missionCode, fd) {
diff --git a/src/views/underwaymix/component/GridStyleTool.vue b/src/views/underwaymix/component/GridStyleTool.vue
index 0b06203..76d636a 100644
--- a/src/views/underwaymix/component/GridStyleTool.vue
+++ b/src/views/underwaymix/component/GridStyleTool.vue
@@ -12,53 +12,81 @@
     <el-col span="2">
       <BaseCard v-show="show" direction="right" borderless="r">
         <template #content>
-          <div class="content-wrap">
+          <el-scrollbar class="content-wrap">
             <div v-for="(g, i) in gridCtrlList" :key="i">
               {{ g.name }}
               <div v-for="(value, t) in g.views" :key="t">
                 <!-- {{ value[0] }} -->
-                {{ value[1].extData.name }}
+                {{ value.extData.name }}
                 <!-- {{ key }} -->
                 <!-- <el-text>{{ g.name }}</el-text> -->
                 <!-- <div class="m-t-8">缃戞牸瑕佺礌</div> -->
-                <el-row class="m-t-8">
+                <el-row class="m-t-8" justify="space-between">
                   <CheckButton
                     active-text="鏄剧ず缃戞牸"
                     inactive-text="闅愯棌缃戞牸"
                     :default-value="true"
-                    @change="handleGridClick"
+                    @change="(e) => handleGridClick(e, i, value)"
                   >
                   </CheckButton>
                   <CheckButton
                     active-text="鏄剧ず鎺掑悕"
                     inactive-text="闅愯棌鎺掑悕"
                     :default-value="false"
-                    @change="handleGridClick"
+                    @change="(e) => handleRankClick(e, i, value)"
                   >
                   </CheckButton>
                   <CheckButton
                     active-text="鏄剧ず鏁版嵁"
                     inactive-text="闅愯棌鏁版嵁"
                     :default-value="false"
-                    @change="handleGridClick"
+                    @change="(e) => handleDataClick(e, i, value)"
                   >
                   </CheckButton>
                 </el-row>
-                <el-row class="m-b-8" gap="2">
-                  <div class="m-t-8">缃戞牸閫忔槑搴�</div>
+                <el-row class="m-t-8" justify="space-between">
+                  <CheckButton
+                    active-text="缁樺埗瀵规瘮鑹�"
+                    inactive-text="缁樺埗鏍囧噯鑹�"
+                    :default-value="false"
+                    @change="(e) => handleColorClick(e, i, value)"
+                  >
+                  </CheckButton>
+                  <CheckButton
+                    active-text="鏄剧ず璧拌埅杞ㄨ抗"
+                    inactive-text="闅愯棌璧拌埅杞ㄨ抗"
+                    :default-value="false"
+                    @change="(e) => handleUnderwayClick(e, i, value)"
+                  >
+                  </CheckButton>
+                </el-row>
+                <!-- <el-row class="m-b-8" align="middle"> -->
+                <el-form-item label="閫忔槑搴�">
+                  <!-- <div class="m-t-8">缃戞牸閫忔槑搴�</div> -->
                   <el-slider
-                    v-model="opacityValue"
+                    v-model="value.opacityValue"
                     :min="0"
                     :max="1"
                     :step="0.1"
                     show-stops
-                    @change="handleOpacityChange"
-                    style="width: 200px"
+                    @change="(e) => handleOpacityChange(e, i, value)"
+                    style="width: 150px"
                   />
-                </el-row>
+                  <el-input-number
+                    class="m-l-16"
+                    size="small"
+                    v-model="value.opacityValue"
+                    :min="0"
+                    :max="1"
+                    :step="0.1"
+                    @change="(e) => handleOpacityChange(e, i, value)"
+                  />
+                </el-form-item>
+                <!-- </el-row> -->
+                <el-divider />
               </div>
             </div>
-          </div>
+          </el-scrollbar>
         </template>
       </BaseCard>
     </el-col>
@@ -68,7 +96,7 @@
 /**
  * 缃戞牸鏍峰紡鎺у埗宸ュ叿
  */
-import { ref, watch, computed } from 'vue';
+import { ref, reactive, onMounted, onUnmounted, computed, toRaw } from 'vue';
 
 const props = defineProps({
   // 缃戞牸绠$悊瀵硅薄[SatelliteGrid]鏁扮粍
@@ -78,63 +106,87 @@
   }
 });
 
+const emits = defineEmits(['showUnderway']);
+
 const gridCtrlList = computed(() => {
   return props.gridCtrls.map((g) => {
-    return {
+    return reactive({
       name: g.name,
-      views: Array.from(g.mapViewsMap)
-    };
+      views: Array.from(g.mapViewsMap).map((v) => {
+        return {
+          tag: v[0],
+          extData: v[1].extData,
+          opacityValue: 1
+        };
+      })
+    });
   });
 });
 
-// watch(
-//   () => props.gridCtrls,
-//   (nV, oV) => {
-//     gridCtrlList.value = nV.map((v) => {
-//       return Array.from(v.infoMap);
-//     });
-//   },
-//   { deep: true }
-// );
-
 const show = ref(true);
 
-const gridVisible = ref(false);
-const rankVisible = ref(false);
-const dataVisible = ref(false);
-const isStandardColor = ref(true);
-const isOpacity = ref(false);
-const opacityValue = ref(0.7);
+// const gridVisible = ref(false);
+// const rankVisible = ref(false);
+// const dataVisible = ref(false);
+// const isStandardColor = ref(true);
+// const isOpacity = ref(false);
+// const opacityValue = ref(0.7);
 
-const emits = defineEmits([
-  'showRank',
-  'showData',
-  'changeColor',
-  'changeOpacity'
-]);
+// const emits = defineEmits([
+//   'showRank',
+//   'showData',
+//   'changeColor',
+//   'changeOpacity'
+// ]);
 
-function handleRankClick() {
-  rankVisible.value = !rankVisible.value;
-  emits('showRank', rankVisible.value);
+function handleGridClick(e, index, value) {
+  const key = value.tag;
+  toRaw(props.gridCtrls[index]).changeVisibility({
+    tags: [key],
+    showGridViews: e
+  });
 }
 
-function handleDataClick() {
-  dataVisible.value = !dataVisible.value;
-  emits('showData', dataVisible.value);
+function handleRankClick(e, index, value) {
+  const key = value.tag;
+  toRaw(props.gridCtrls[index]).changeVisibility({
+    tags: [key],
+    showRankTxt: e
+  });
 }
 
-function handleColorClick() {
-  isStandardColor.value = !isStandardColor.value;
-  emits('changeColor', isStandardColor.value);
+function handleDataClick(e, index, value) {
+  const key = value.tag;
+  toRaw(props.gridCtrls[index]).changeVisibility({
+    tags: [key],
+    showDataTxt: e
+  });
 }
 
-function handleOpacityClick() {
-  // isOpacity.value = !isOpacity.value;
-  // emits('changeOpacity', isOpacity.value);
+function handleColorClick(e, index, value) {
+  const key = value.tag;
+  toRaw(props.gridCtrls[index]).changeGridColor({
+    tag: key,
+    useCustomColor: e
+  });
 }
 
-function handleOpacityChange(value) {
-  emits('changeOpacity', value);
+function handleOpacityChange(e, index, value) {
+  console.log(e, index, value);
+
+  const key = value.tag;
+  // value.opacityValue = e;
+  toRaw(props.gridCtrls[index]).changeGridOpacity({
+    tag: key,
+    opacityValue: toRaw(value.opacityValue)
+  });
+}
+
+function handleUnderwayClick(e, index, value) {
+  emits('showUnderway', {
+    isShow: e,
+    dataId: value.tag
+  });
 }
 </script>
 <style scoped>
@@ -142,4 +194,8 @@
   min-width: 300px;
   min-height: 600px;
 }
+
+:deep(.el-input-number) {
+  width: 80px;
+}
 </style>

--
Gitblit v1.9.3