Commit 1d1844dc authored by xuchaozou's avatar xuchaozou

fix: 修复前端出图部分字段获取失败

parent e3475b52
Pipeline #95892 failed with stages
......@@ -96,9 +96,9 @@
"@wisdom-cesium/krpano": "^1.0.29-60",
"@wisdom-map/arcgismap":"^2.0.97",
"@wisdom-map/basemap":"^2.0.4",
"@wisdom-map/gis-component": "^1.0.32",
"@wisdom-map/gis-utils": "^1.0.27",
"@wisdom-map/pd-map": "^1.0.123",
"@wisdom-map/gis-component": "^1.0.35",
"@wisdom-map/gis-utils": "^1.0.30",
"@wisdom-map/pd-map": "^1.0.128",
"@wisdom-utils/components": "0.1.337",
"@wisdom-utils/utils": "0.1.377",
"ace-builds": "^1.4.12",
......
/* eslint-disable no-restricted-syntax */
import { Space, Table, Button, Popconfirm, notification, Spin, Input, Radio } from 'antd';
import { Space, Table, Button, Popconfirm, notification, Spin, Input, Radio, message } from 'antd';
import React, { useState, useEffect } from 'react';
import styles from '../SchemeConfig.less';
import {
......@@ -9,11 +9,18 @@ import {
updatePublishedMetaData,
GettMaplayer,
deleteConfig,
GetFileContent,
getAllMetaData,
AddStyleConfigJson
} from '@/services/webConfig/api';
import { LayerSetting } from '@/services/gis/gis';
import AddModal from './AddModal';
import PreviewModal from './VectorPreviewModal';
import MeteDataModal from './MeteDataModal';
import AddSlicedModal from './AddSlicedModal';
import { mapConfig , VectorUtils} from '@wisdom-map/gis-utils'
import {parseUrlQueryParams , queryParamsToUrl} from '@/utils/utils'
const VectorData = props => {
const [treeLoading, setTreeLoading] = useState(false); // 弹窗显示
const [tileData, setTileData] = useState([]); // table表格数据
......@@ -172,6 +179,9 @@ const VectorData = props => {
newLoadings[index] = false;
setLoading(newLoadings);
if (res.success) {
updateVectorConfig({
mapServerName : record['ServiceName']
})
setFlag(flag + 1);
notification.success({
message: '提示',
......@@ -197,6 +207,287 @@ const VectorData = props => {
});
});
};
const updateVectorConfig = async ({
mapServerName
}) => {
try {
const schemes = await updateCurrentMapschemes({mapServerName, exportScheme : mapConfig.exportScheme.arcgis})
if(schemes.length == 0) return
const vectorData = await getVectorConfigData({
schemes,
mapServerName
})
if(!vectorData) return
const isFilterField = getDataIsFilterField({
schemes,
vectorData
})
if(!isFilterField) return
const metaData = await getMetaData({mapServerName})
if(!metaData) return
await updateVectorFileds({
metaData,
schemes,
vectorData
})
} catch (error) {
console.log(error)
}
}
const updateCurrentMapschemes = async ({mapServerName, exportScheme}) => {
const data = await LayerSetting({client : "sandbox"})
if(data.code == "0") {
return data.data.filter(item => item.id == mapServerName &&
(
exportScheme ? item.exportScheme == mapConfig.exportScheme.arcgis : true
)
)
}
return []
}
const getVectorConfigData = async () => {
const data = await GetFileContent({
path : "StyleConfig/StyleConfig.json",
preventCache : Date.now()
})
if(data.code == "0" && data.data.data && data.data.hasOwnProperty("version")) {
return data.data
}
return null
}
const getDataIsFilterField = ({
schemes,
vectorData
}) => {
for(let i = 0 ; i < schemes.length ; i++) {
const scheme = schemes[i]
const data = vectorData.data[`${scheme.schemename}-${scheme.id}`]
if(Array.isArray(data)) {
const hasFilter = data.find(({style}) => style.layers.find(layer => !!layer.filter))
if(hasFilter) {
return true
}
}
}
return false
}
const getMetaData = async ({mapServerName}) => {
const data = await getAllMetaData({mapServerName})
return Array.isArray(data) ? data : null
}
const updateVectorFileds = async ({metaData , schemes, vectorData}) => {
let isUpdateFile = false
schemes.map(scheme => {
const data = vectorData.data[`${scheme.schemename}-${scheme.id}`]
if(!data) return
data.map(({style}) => {
const setFilterCollection = new Map()
const setLayerCollection = new Set()
style.layers.map(layer => {
const metaLayer = metaData.find(item => item.name == layer['source-layer'])
if(!metaLayer) {
setLayerCollection.add(layer['source-layer'])
return
}
handleFilterField({
layer,
setFilterCollection,
metaLayer
})
handleLayoutTextField({
layer,
setFilterCollection,
metaLayer
})
})
if(updateStyleLayer({
style,
setLayerCollection
})) {
isUpdateFile = true
}
if(updateTileUrlAndField({
style,
setFilterCollection
})) {
isUpdateFile = true
}
})
updateStyle(data)
if(data.length == 0) {
delete vectorData.data[`${scheme.schemename}-${scheme.id}`]
}
})
if(isUpdateFile) {
const result = await AddStyleConfigJson({
fileName : "StyleConfig",
preventCache : Date.now()
}, vectorData)
return result && result.code == 0 ? true : false
}
}
const handleFilterField = ({
layer,
setFilterCollection,
metaLayer
}) => {
if(!layer.filter) return
const parseField = VectorUtils.filterFieldsHandle({
layerItem : layer,
outfields : null,
layerFields : []
})
if(!(parseField && parseField.sqlObj && parseField.sqlObj.length > 0)) return
const hasCondition = parseField.sqlObj.every(item => {
return !item.label || metaLayer.fields.find(field => field.name == item.label)
})
if(!hasCondition) {
const layerName = layer['source-layer']
layer.filter = ""
if(!setFilterCollection.has(layerName)) {
setFilterCollection.set(layerName, new Set())
}
const setCollection = setFilterCollection.get(layerName)
parseField.sqlObj.map(item => setCollection.add(item.label))
}
}
const handleLayoutTextField = ({
layer,
setFilterCollection,
metaLayer
}) => {
function extractBraceContentsRegex(str) {
const regex = /\{([^}]+)\}/g;
const contents = [];
let match;
while ((match = regex.exec(str))!== null) {
contents.push(match[1]);
}
return contents;
}
const data = extractBraceContentsRegex(layer?.layout?.['text-field'])?.filter(fieldName => {
return !(metaLayer.fields.find(item => item.name == fieldName))
})
if(data && data.length > 0) {
layer['layout']['text-field'] = ""
const layerName = layer['source-layer']
if(!setFilterCollection.has(layerName)) {
setFilterCollection.set(layerName, new Set())
}
const setCollection = setFilterCollection.get(layerName)
data.map(item => {
setCollection.add(item)
})
}
}
const updateTileUrlAndField = ({
style,
setFilterCollection
}) => {
const tileUrl = style?.sources?.osm?.tiles[0]
if(!tileUrl || setFilterCollection.size < 1) return false
const {params , url} = parseUrlQueryParams({
url : tileUrl
})
const layerNameArr = params.layerNames.split(",")
const outfields = params.outfields.split(";")
if(layerNameArr.length != outfields.length ) return
layerNameArr.map((layerName, index) => {
if(!outfields[index]) return
const layerNameCollection = setFilterCollection.get(layerName)
if(!layerNameCollection) return
const outFieldsArr = outfields[index].split(",")
Array.from(layerNameCollection).map(field => {
const indexCollections = []
outFieldsArr.map((outFiled, index) => {
if(outFiled == field) {
indexCollections.push(index)
}
})
indexCollections.sort((a,b) => a - b > 0 ? -1 : 1)
indexCollections.map(index => {
outFieldsArr.splice(index, 1)
})
})
outfields[index] = outFieldsArr.join(",")
})
style.sources.osm.tiles[0] = queryParamsToUrl({
url,
params : {
...params,
outfields : outfields.join(";")
}
})
return true
}
const updateStyleLayer = ({
style,
setLayerCollection
}) => {
if(setLayerCollection.size == 0) {
return false
}
let indexCollections = []
style.layers.map((layer , index) => {
const layerName = layer['source-layer']
if(setLayerCollection.has(layerName)) {
indexCollections.push(index)
}
})
indexCollections.sort((a,b) => a - b > 0 ? -1 : 1)
indexCollections.map(index => {
style.layers.splice(index , 1)
})
const tileUrl = style?.sources?.osm?.tiles[0]
const {params , url} = parseUrlQueryParams({
url : tileUrl
})
const layerNameArr = params.layerNames.split(",")
const outfields = params.outfields.split(";")
indexCollections = []
layerNameArr.map((layerName, index) => {
if(setLayerCollection.has(layerName)) {
indexCollections.push(index)
}
})
indexCollections.sort((a,b) => a - b > 0 ? -1 : 1)
indexCollections.map(index => {
layerNameArr.splice(index , 1)
outfields.splice(index , 1)
})
style.sources.osm.tiles[0] = queryParamsToUrl({
url,
params : {
...params,
outfields : outfields.join(";"),
layerNames : layerNameArr.join(";"),
}
})
return true
}
const updateStyle = (data) => {
const indexCollections = []
data.map((item , index) => {
if(!(item.style && item.style.layers && item.style.layers.length > 0)) {
indexCollections.push(index)
}
})
indexCollections.sort((a,b) => a - b > 0 ? -1 : 1)
indexCollections.map(index => {
data.splice(index, 1)
})
}
const previewMetaData = record => {
setCurrentMetaData(record);
setPreviewVisible(true);
......@@ -229,6 +520,7 @@ const VectorData = props => {
deleteVectorService(query).then(res => {
if (res.success) {
setFlag(flag + 1);
deleteVectorData(record)
notification.success({
message: '提示',
duration: 3,
......@@ -244,6 +536,29 @@ const VectorData = props => {
});
};
const deleteVectorData = async (record) => {
try {
const mapServerName = record?.ServiceName?.split('.')?.[0]
if(!mapServerName) return
const schemes = await updateCurrentMapschemes({mapServerName})
if(schemes.length == 0) return
const vectorData = await getVectorConfigData({
schemes,
mapServerName
})
if(!vectorData) return
schemes.map(scheme => {
delete vectorData.data[`${scheme.schemename}-${scheme.id}`]
})
await AddStyleConfigJson({
fileName : "StyleConfig",
preventCache : Date.now()
}, vectorData)
} catch {
}
}
const delConfirmSliced = record => {
const { servicename = '' } = record;
setTreeLoading(true);
......
......@@ -195,6 +195,8 @@ export const deleteVectorService = query =>
export const updatePublishedMetaData = query =>
get(`${PANDA_GIS}/MetaData/D_UpdatePublishedMetaData`, query);
export const getAllMetaData = query => get(`${PANDA_GIS}/MetaData/all`, query);
// 删除配置
export const deleteConfig = query => get(`${PANDA_GIS}/MapLayer/DeleteMapLayer`, query);
......@@ -213,6 +215,8 @@ export const GetbaseMapschemeName = query =>
// 设置web状态
export const setServiceType = query => get(`${PANDA_GIS}/MetaData/SetServiceType`, query);
//获取某个图层详细信息
export const QueryMetaDataLayerFields = query => get(`${PANDA_GIS}/MetaData/QueryMetaDataLayerFields`, query);
// 设置web的默认方案
export const SetDefaultsSchemeName = param =>
post(`${PANDA_GIS}/Maplayer/SetDefaultsSchemeName`, param);
......@@ -326,6 +330,13 @@ export const UpdateSchemPipeNetwork = param =>
export const GetSpriteSheet = param => get(`${PANDA_GIS}/MultiMedia/GetSpriteSheet`, param);
export const GetFileContent = param => {
return post(`${PANDA_GIS}/MultiMedia/FileContent?${Object.entries(param).map(([key , value]) => `${key}=${value}`).join("&")}`)
};
export const AddStyleConfigJson = (param, data) => {
return post(`${PANDA_GIS}/MultiMedia/AddStyleConfigJson?${Object.entries(param).map(([key , value]) => `${key}=${value}`).join("&")}`, data)
}
// 同步地图组件
export const SyncMapComponent = query => get(`${PUBLISH_SERVICE}/WebSite/SyncMapComponent`, query);
......
......@@ -83,3 +83,32 @@ export function handleMapMaxZoom(layerType) {
}
return mapConfig.baseMapMaxLevel[configName];
}
export function parseUrlQueryParams ({
url
}) {
const [urlStr , paramsStr] = url.split("?")
let params = {}
if(paramsStr) {
const paramsObj = new URLSearchParams(paramsStr)
for(const [key, value] of paramsObj) {
params[key] = value
}
}
return {
params,
url : urlStr
}
}
export function queryParamsToUrl ({
url,
params = {}
}) {
let urlStr = url
if(urlStr.indexOf("?") == -1) {
urlStr += "?"
}
urlStr += Object.entries(params).map(([key,value]) => `${key}=${value}`).join("&")
return urlStr
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment