feat():知识检索知识库弹框开发

qzc-dev
李神峰 2025-08-04 17:59:49 +08:00
parent ce1be1eec6
commit 39d8bb47d0
1 changed files with 244 additions and 64 deletions

View File

@ -1,7 +1,7 @@
import React, { useEffect, useState } from 'react'
import { useLocation } from 'react-router'
import { useDispatch, useSelector } from 'react-redux'
import { Collapse, DatePicker, Input, Modal,message } from 'antd';
import { Collapse, DatePicker, Input, Modal, message } from 'antd';
import './index.less'
import Yujing from './item_yujing/index.js'
import Yuqing from './item_yuqing'
@ -24,7 +24,9 @@ import QSYDW from './item_qishiyedanwei'
import YHJMH from './item_yanhejuminhu'
import SetWxqStation from '../setMapStation/wxq'
import Bzt from '../../gcaqjc/bzt2'
import ShenLiu from '../MapCtrl/Pops/ShenLiu';
import ShenYa from '../MapCtrl/Pops/ShenYa';
import WeiYi from '../MapCtrl/Pops/WeiYi';
import Tuli from '../TuLi/Tuli.js'
import Tuli2 from '../TuLi/Tuli2.js';
import Tuli3 from '../TuLi/Tuli3.js'
@ -33,7 +35,15 @@ import Tuli5 from '../TuLi/Tuli5.js'
import SearchResultList from './SearchResultList';
import { httpget } from '../../../utils/request';
import apiurl from '../../../service/apiurl';
import FillStyle from "ol/style/Fill";
import GeoJSONFormat from 'ol/format/GeoJSON';
import { Vector as VectorSource } from "ol/source";
import StrokeStyle from "ol/style/Stroke";
import { geometryCenter } from '../../../utils/tools'
import Feature from "ol/Feature";
import VectorLayer from "ol/layer/Vector";
import Style from "ol/style/Style";
import moment from 'moment';
const { Panel } = Collapse;
@ -91,6 +101,7 @@ const HomePage = ({ showPanels }) => {
moment(moment().add(-1, 'days').format('YYYY-MM-DD 08:00:00')),
moment(moment().format('YYYY-MM-DD 08:00:00')),
])
let mapObj = useSelector(s => s.map.map)
// 在 globalSearch 函数中添加搜索结果状态
const [searchResults, setSearchResults] = useState([]);
@ -118,88 +129,256 @@ const HomePage = ({ showPanels }) => {
};
// 业务规则库弹框
const regularOpen = async (record) => {
debugger
const id = record?.id.split('-')[0]
const id = record?.unionCode
const com = record.type == '业务规则库' ?
{ url: apiurl.zsk.ywgz.getOne } :
record.type == '调度方案库' ?
{ url: apiurl.zsk.ddfa.getOne } :
{ url: apiurl.zsk.gcaq.getOne };
{ url: apiurl.zsk.ywgz.getOne } :
record.type == '调度方案库' ?
{ url: apiurl.zsk.ddfa.getOne } :
{ url: apiurl.zsk.gcaq.getOne };
const res = await httpget(com.url + id)
// 导入业务规则库的Modal组件
// 使用映射函数进行导入
try {
const ModalForm = await importMap[record.type]();
Modal.destroyAll(); // 先销毁可能存在的其他Modal
const modal = Modal.confirm({
title: `${record.name}详情`,
width: 1000,
content: (
<ModalForm.default
mode="view"
record={res}
/>
),
icon: null,
okButtonProps: { style: { display: 'none' } },
cancelButtonProps: { style: { display: 'none' } },
closable: true
});
} catch (error) {
console.error('模块导入失败:', error);
message.error(`无法加载${record.type}详情,请稍后再试`);
}
// 使用映射函数进行导入
try {
const ModalForm = await importMap[record.type]();
Modal.destroyAll(); // 先销毁可能存在的其他Modal
const modal = Modal.confirm({
title: `${record.name}详情`,
width: 1000,
content: (
<ModalForm.default
mode="view"
record={res}
/>
),
icon: null,
okButtonProps: { style: { display: 'none' } },
cancelButtonProps: { style: { display: 'none' } },
closable: true
});
} catch (error) {
console.error('模块导入失败:', error);
message.error(`无法加载${record.type}详情,请稍后再试`);
}
return;
}
const clickItem = (item) => {
// 工程安全监测点
const renderGCaqModal = (record) => {
const row = { ...record, stationCode: record.id }
let popType = '';
//业务规则库
if (item.type == '业务规则库' || item.type == '调度方案库' || item.type == '工程安全知识库') {
regularOpen(item)
if (record.type == '渗压站') {
popType = 'shenya';
} else if (record.type == '渗流站') {
popType = 'shenliu';
} else if (record.type == '位移站') {
popType = 'weiyi';
}
dispatch.runtime.setFeaturePop({
type: popType,
data: row,
lgtd: record.lgtd,
lttd: record.lttd,
id: record.id
});
return;
}
// 加载危险区图层数据
const getGeoJsonData = async () => {
const radarRangeData = await fetch(`${process.env.PUBLIC_URL}/data/geojson/macheng/wxq2.geojson`)
.then(resp => resp.json())
.then(data => data.features)
.catch(() => []);
const wxq = {}
radarRangeData.map((item) => {
wxq[item.properties.ADCD] = item
})
sessionStorage.setItem('wxq', JSON.stringify(wxq))
return [...radarRangeData];
};
// 危险区图层
const addLayer = () => {
getGeoJsonData().then((data) => {
debugger
var layer = new VectorLayer({
// @ts-ignore
name: "ZHZS_WXQ",
source: new VectorSource(),
style: new Style({
stroke: new StrokeStyle({
color: 'rgba(255,0,0,0.9)',
width: 2,
}),
fill: new FillStyle({
color: 'rgba(255,0,0,0.3)',
}),
})
});
const features = data.map((item) => {
// debugger
const geojsonFormat = new GeoJSONFormat();
let geometry = geojsonFormat.readGeometry(item.geometry, {
featureProjection: 'EPSG:3857',
});
const feature = new Feature({
geometry,
data: { ...item.properties, geometry: item.geometry, myLayerType: 'wxq' },
});
return feature
})
features.forEach(feature => layer.getSource().addFeature(feature));
mapObj && mapObj.addLayer(layer);
mapObj && mapObj.on('click', function (evt) {
//console.log("271++++",postmessageData);
var feature = mapObj && mapObj.forEachFeatureAtPixel(evt.pixel, function (feature) {
return feature;
});
if (feature) {
const data = feature.values_.data
const center = geometryCenter(data.geometry);
if (data && data.myLayerType === 'wxq') {
dispatch.runtime.setCameraTarget({
center: [center[0], center[1]],
zoom: 18,
pitch: 60
})
dispatch.runtime.setFeaturePop({
id: data.PID,
data: { ...data },
type: 'wxq',
lgtd: center[0],
lttd: center[1],
})
}
}
});
});
}
const clickItem = (item) => {
// 业务规则库
if (item.type == '业务规则库' || item.type == '调度方案库' || item.type == '工程安全知识库') {
regularOpen(item)
return; // 添加return避免继续执行
}
// 工程安全监测点
if (item.type == '渗压站' || item.type == '渗流站' || item.type == '位移站') {
renderGCaqModal(item)
return; // 添加return避免继续执行
}
// 判断是否为知识库或安全监测站类型
const isKnowledgeOrMonitoringStation = item.type === 'daminfo' || item.type === 'stinfo';
// 如果有经纬度信息,则进行处理
if (item.lgtd && item.lttd) {
if ((item.lgtd && item.lttd) || item.type == '危险区') {
// 关闭所有已打开的弹窗
dispatch.runtime.closeFeaturePopAll();
// 关闭所有业务图层
// dispatch.map.closeBusinessLayersEffect();
// 根据类型确定弹窗类型
// 先关闭所有图层
dispatch.map.setLayerVisible({
HdswLayer: false,
RealDrpLayer: false,
PicStLayer: false,
ShuiKuLayer: false,
TuRangLayer: false,
GongShuiLayer: false
});
// 根据类型确定弹窗类型和图层
let popType = item.type;
let layerToShow = {};
// 对特定类型进行映射
if (item.type === 'swst') popType = 'hdsw'; // 水文站映射到河道水位
if (item.type === 'qxst') popType = 'drp'; // 气象站映射到雨情
if (item.type === 'picst') popType = 'picst'; // 视频站
// 然后根据类型打开对应图层
if (item.type === 'swst' || item.type === 'hdsw') {
dispatch.map.setLayerVisible({ HdswLayer: true });
} else if (item.type === 'qxst' || item.type === 'drp') {
dispatch.map.setLayerVisible({ RealDrpLayer: true });
} else if (item.type === 'picst') {
dispatch.map.setLayerVisible({ PicStLayer: true });
// 对特定类型进行映射和图层设置
switch (item.type) {
case '水文站':
popType = 'hdsw';
layerToShow = { HdswLayer: true };
break;
case 'qxst':
case '气象站':
case '雨量站':
popType = 'drp';
layerToShow = { RealDrpLayer: true };
break;
case '视频站':
popType = 'tuxiang';
layerToShow = { PicStLayer: true };
break;
case 'shuiku':
case '水库':
popType = 'shuiku';
layerToShow = { ShuiKuLayer: true };
break;
case '土壤墒情站':
popType = 'turangshangqing';
layerToShow = { TuRangLayer: true };
break;
case '流量站':
popType = 'gongshui';
layerToShow = { GongShuiLayer: true };
break;
case '危险区':
popType = 'wxq';
layerToShow = { AZDLayer: true };
break;
default:
// 默认不设置特定图层
break;
}
// 设置图层可见性
if (Object.keys(layerToShow).length > 0) {
dispatch.map.setLayerVisible(layerToShow);
}
const record = JSON.parse(item.jsonStr);
if (item.type == '危险区' || item.type == '安置点') {
addLayer()
const wxq = JSON.parse(sessionStorage.getItem('wxq'))?.[record?.adcd] || ''
if (!wxq) {
message.error('暂无经纬度数据')
return
}
const data = wxq.properties
const center = geometryCenter(wxq.geometry);
dispatch.runtime.setCameraTarget({
center: [center[0], center[1]],
zoom: 18,
pitch: 60
})
dispatch.runtime.setFeaturePop({
id: data.PID,
data: { ...data },
type: 'wxq',
lgtd: center[0],
lttd: center[1],
})
return;
}
// 显示弹窗
dispatch.runtime.setFeaturePop({
type: popType,
data: item,
data: record,
lgtd: item.lgtd,
lttd: item.lttd,
id: item.id
id: record.id
});
// 如果不是知识库或安全监测站类型,则进行地图定位
if (!isKnowledgeOrMonitoringStation) {
dispatch.runtime.setCameraTarget({
center: [item.lgtd, item.lttd],
zoom: 15,
pitch: 60
});
}
// 设置地图视角
dispatch.runtime.setCameraTarget({
center: [item.lgtd, item.lttd],
zoom: 15,
pitch: 60
});
}
}
@ -207,7 +386,8 @@ const HomePage = ({ showPanels }) => {
dispatch.runtime.closeFeaturePopAll()
// 如果是搜索结果,不要关闭图层
if (checkedObj.label === '搜索结果') {
// 可以选择保持当前图层状态,或者显示某些默认图层
// 主动设置相关图层可见
return;
}
if (checkedObj.label === '水库' || checkedObj.label === '大坝' || checkedObj.label === '溢洪道' || checkedObj.label === '视频点') {
@ -370,7 +550,7 @@ const HomePage = ({ showPanels }) => {
{checkedObj.label === '企事业单位' ? <QSYDW /> : null}
{checkedObj.label === '沿河居民户' ? <YHJMH /> : null}
{checkedObj.label === '危险区' || checkedObj.label === '安置点' || checkedObj.label === '企事业单位' || checkedObj.label === '沿河居民户' ? <SetWxqStation /> : null}
{checkedObj.label === '危险区' || checkedObj.label === '安置点' || checkedObj.label === '企事业单位' || checkedObj.label === '沿河居民户' ? <SetWxqStation /> : null}
</div>
: null
}