wujingjing
2025-01-19 6d279e10194646139fb63bf8fddded84dfbc4777
剩余操作
已修改3个文件
113 ■■■■ 文件已修改
src/components/chat/chatComponents/summaryCom/components/recordSetTable/map/LayerControl.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/chat/smallChat/index.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/model/map/OLMap.ts 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/chat/chatComponents/summaryCom/components/recordSetTable/map/LayerControl.vue
@@ -76,7 +76,7 @@
<script setup lang="ts">
import { Close } from '@element-plus/icons-vue';
import { ElTree } from 'element-plus';
import { onMounted, ref, watch } from 'vue';
import { computed, onMounted, ref, watch } from 'vue';
import { useDrag } from '/@/hooks/useDrag';
import type { OLMap } from '/@/model/map/OLMap';
import { GaoDeSourceType, gaoDeSourceTypeMap, OverlayType } from '/@/model/map/OLMap';
@@ -100,7 +100,7 @@
const activeSourceType = ref(props.olMap.activeSourceType);
const changeSourceType = (val: GaoDeSourceType) => {
    props.olMap.setSourceUrl(val);
    props.olMap.applySourceType(val);
};
const overlayTreeRef = ref<InstanceType<typeof ElTree>>();
@@ -120,15 +120,31 @@
    });
};
const setTreeChecked = (checked: boolean) => {
    treeData.value.forEach((item) => {
        if (checked) {
            overlayTreeRef.value?.setCheckedKeys([ROOT_OVERLAY_TYPE.Marker]);
        } else {
            overlayTreeRef.value?.setCheckedKeys([]);
        }
    });
};
let isHumanCheckTrigger = false;
watch(
    () => props.olMap.markerIsVisible.value,
    (val) => {
        if (isHumanCheckTrigger) {
            isHumanCheckTrigger = false;
            return;
        }
        setTreeChecked(val);
    }
);
const handleNodeClick = (data: any, node: any) => {
    if (data.id === ROOT_OVERLAY_TYPE.Marker) {
        const overlays = props.olMap.map.getOverlays().getArray();
        const filteredOverlays = overlays.filter((overlay) => {
            const type = overlay.get('type');
            return type === OverlayType.Marker;
        });
        props.olMap.adjustViewToOverlays(filteredOverlays);
        props.olMap.adjustViewToMarkers();
    }
};
@@ -152,6 +168,7 @@
};
const handleCheck = (data: any, node: any) => {
    const checkedKeys = node.checkedKeys;
    isHumanCheckTrigger = true;
    const isVisible = checkedKeys.includes(ROOT_OVERLAY_TYPE.Marker);
    props.olMap.toggleMarkerOverlayVisible(isVisible);
};
src/components/chat/smallChat/index.vue
@@ -84,7 +84,7 @@
import { AssistantContent } from './types';
import { agentStreamByPost } from '/@/api/ai/chat';
import { Logger } from '/@/model/logger/Logger';
import type { OLMap } from '/@/model/map/OLMap';
import { GaoDeSourceType, gaoDeSourceTypeMap, type OLMap } from '/@/model/map/OLMap';
import assistantPic from '/static/images/role/assistant-200x192.png';
import userPic from '/static/images/role/user-200x206.png';
import { useDrag } from '/@/hooks/useDrag';
@@ -103,7 +103,11 @@
const chatContainerRef = ref<HTMLDivElement>(null);
const { startDrag, style: chatContainerStyle, handleStyle } = useDrag({
const {
    startDrag,
    style: chatContainerStyle,
    handleStyle,
} = useDrag({
    handle: chatHeaderRef,
});
@@ -118,10 +122,35 @@
    return result as ChatMessage<AssistantContent>;
};
const mockCommand = (question: string) => {
    if (question === `切换${gaoDeSourceTypeMap[GaoDeSourceType.Vector]}`) {
        handleMapCommand({ operate: '切换标准地图' });
        return;
    } else if (question === `切换${gaoDeSourceTypeMap[GaoDeSourceType.Satellite]}`) {
        handleMapCommand({ operate: '切换卫星地图' });
        return;
    } else if (question === `切换${gaoDeSourceTypeMap[GaoDeSourceType.SatelliteRoad]}`) {
        handleMapCommand({ operate: '切换路网地图' });
        return;
    } else if (question === '显示设备') {
        handleMapCommand({ operate: '显示设备' });
        return;
    } else if (question === '隐藏设备') {
        handleMapCommand({ operate: '隐藏设备' });
        return;
    } else if (question === '聚焦设备') {
        handleMapCommand({ operate: '聚焦设备' });
        return;
    }
}
const startStream = (question: string) => {
    if (lastIsInit) {
        showHistory.value = false;
    }
    // mockCommand(question);
    // return;
    let haveMapOperate = false;
    agentStreamByPost(
        {
@@ -157,6 +186,7 @@
        last.content.isLoading = content.isLoading;
    }
};
const handleMapCommand = (command: any) => {
    if (!command) return;
    switch (command.operate) {
@@ -166,6 +196,26 @@
        case '缩小':
            props.olMap.zoomOut();
            break;
        case `切换${gaoDeSourceTypeMap[GaoDeSourceType.Vector]}`:
            props.olMap.setSourceType(GaoDeSourceType.Vector);
            break;
        case `切换${gaoDeSourceTypeMap[GaoDeSourceType.Satellite]}`:
            props.olMap.setSourceType(GaoDeSourceType.Satellite);
            break;
        case `切换${gaoDeSourceTypeMap[GaoDeSourceType.SatelliteRoad]}`:
            props.olMap.setSourceType(GaoDeSourceType.SatelliteRoad);
            break;
        case '显示设备':
            props.olMap.toggleMarkerOverlayVisible(true);
            break;
        case '隐藏设备':
            props.olMap.toggleMarkerOverlayVisible(false);
            break;
        case '聚焦设备':
            props.olMap.adjustViewToMarkers();
            break;
    }
    refreshAssistantMessage({ value: `已执行操作: ${command.operate}` });
@@ -215,7 +265,7 @@
    const [userMessage, assistantMessage] = applyMessage();
    const question = inputText.value;
    inputText.value = '';
    startStream(question);
};
src/model/map/OLMap.ts
@@ -1,7 +1,6 @@
import { defaultsDeep } from 'lodash-es';
import type { Overlay } from 'ol';
import { Map as OpenLayerMap, View } from 'ol';
import { ZoomSlider } from 'ol/control';
import type { Extent } from 'ol/extent';
import { getTopLeft, getWidth } from 'ol/extent';
import Tile from 'ol/layer/Tile';
@@ -121,14 +120,19 @@
        });
        this.activeSourceType.value = sourceType;
        this.markerIsVisible.value = markerIsVisible;
        this.setSourceUrl(this.activeSourceType.value);
        this.applySourceType(this.activeSourceType.value);
        this.listenMapClick();
        this.addBasicControl();
    }
    setSourceUrl(type: GaoDeSourceType = GaoDeSourceType.Vector) {
    applySourceType(type: GaoDeSourceType = GaoDeSourceType.Vector) {
        const url = getGaoDeSourceUrl(type);
        this.source.setUrl(url);
    }
    setSourceType(type: GaoDeSourceType = GaoDeSourceType.Vector) {
        this.activeSourceType.value = type;
        this.applySourceType(type);
    }
    addMarkerLayer(dataList: any[], options: any) {
        const { markerOpt } = options;
@@ -194,6 +198,16 @@
        return overlay;
    }
    adjustViewToMarkers() {
        const overlays = this.map.getOverlays().getArray();
        const filteredOverlays = overlays.filter((overlay) => {
            const type = overlay.get('type');
            return type === OverlayType.Marker;
        });
        this.adjustViewToOverlays(filteredOverlays);
    }
    adjustViewToOverlays(overlays: Overlay[]) {
        if (overlays.length === 0) return;
        const extent = overlays.reduce<number[] | null>((ext, item) => {
@@ -254,7 +268,7 @@
    setConfig(config: MapConfig) {
        this.activeSourceType.value = config.sourceType;
        this.markerIsVisible.value = config.markerIsVisible;
        this.setSourceUrl(this.activeSourceType.value);
        this.applySourceType(this.activeSourceType.value);
        this.toggleMarkerOverlayVisible(this.markerIsVisible.value);
    }