Browse Source

Merge branch 'release-sy-v1.0.0' of ssh://gitlab.datameta.com:2224/project/water/shuili-vue into release-sy-v1.0.0

sy-water-data-board-ui
panyuyi 2 months ago
parent
commit
1c0f8d3fa7
  1. 59
      src/api/aiSupervision/layerConfigApi.js
  2. 301
      src/views/aiSupervision/layerManage/resource/LayerDetails.vue
  3. 76
      src/views/reservoir/safeOperation/js/mapUtils.js

59
src/api/aiSupervision/layerConfigApi.js

@ -176,7 +176,8 @@ export function queryServiceInfoApi(url, layer) {
return new Promise(async (resolve, reject) => {
const result = await axios.get(`${url}.json`);
if (result.status === 200 && result.data) {
const layerId = result.data.layers.find((f) => f.parentLayerId === -1)?.subLayerIds?.[0];
const layerId = result.data.layers.find((f) => f.parentLayerId === -1)
?.subLayerIds?.[0];
const data = await axios.get(`${url}/${layerId}?f=json`);
if (data.status === 200 && data.data) {
resolve(data.data);
@ -186,30 +187,58 @@ export function queryServiceInfoApi(url, layer) {
}
case "081100":
return new Promise(async (resolve, reject) => {
// layer.name的规则:xxx;xxx:xxx
const name = layer.name;
const nameArr = name.split(":");
let nameArr = name.split(";");
const splitUrl = url?.split("/rest/")[0];
const token = layer.token;
const newUrl = `${splitUrl.replace("/map-", "/data-")}/rest/data/datasources/${nameArr[0]}/datasets/${nameArr[1]}/fields.json?k=${token}`;
const result = await axios.get(newUrl);
if (result.status === 200 && result.data) {
const fields = result.data.fieldNames.map((item) => {
return {
name: item,
alias: item,
type: "-",
};
});
resolve({ fields });
if (nameArr.length === 1) {
const newUrl = `${splitUrl.replace(
"/map-",
"/data-"
)}/rest/data/datasources/${nameArr[0]}/datasets/${
nameArr[1]
}/fields.json?k=${token}`;
const result = await axios.get(newUrl);
if (result.status === 200 && result.data) {
const fields = result.data.fieldNames.map((item) => {
return {
name: item,
alias: item,
type: "-",
};
});
resolve({ fields });
}
} else if (nameArr.length === 2) {
let layerName = nameArr[1];
layerNameArr = layerName.split(":");
const newUrl = `${nameArr[0]}/rest/data/datasources/${layerNameArr[0]}/datasets/${layerNameArr[1]}/fields.json?k=${token}`;
const result = await axios.get(newUrl);
if (result.status === 200 && result.data) {
const fields = result.data.fieldNames.map((item) => {
return {
name: item,
alias: item,
type: "-",
};
});
resolve({ fields });
} else {
reject("请求失败");
}
}
});
case "030300":
return new Promise(async (resolve, reject) => {
const result = await axios.get(
`${url}?service=wfs&version=2.0.0&request=DescribeFeatureType&typeNames=${layer.index}`,
`${url}?service=wfs&version=2.0.0&request=DescribeFeatureType&typeNames=${layer.index}`
);
if (result.status === 200 && result.data) {
const xmlDom = new window.DOMParser().parseFromString(result.data, "text/xml");
const xmlDom = new window.DOMParser().parseFromString(
result.data,
"text/xml"
);
const elements = xmlDom.getElementsByTagName("xs:element");
let fields = [];
for (let i = 0; i < elements.length; i++) {

301
src/views/aiSupervision/layerManage/resource/LayerDetails.vue

@ -17,207 +17,93 @@
</div>
</div>
<div class="middle">
<el-button type="primary" plain @click="dialogFormVisible = true"
>添加图层</el-button
>
<el-button type="primary" plain @click="dialogFormVisible = true">添加图层</el-button>
<el-dialog :title="dialogTitle" :visible.sync="dialogFormVisible">
<el-tabs v-model="activeName" type="card">
<el-tab-pane label="基础字段" name="1">
<el-form :model="editDataInfoForm">
<el-form-item
label="服务类型"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-select
style="width: 80%"
v-model="editDataInfoForm.serviceType"
placeholder="请选择"
>
<el-option
v-for="item in serviceTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-form-item label="服务类型" style="font-size: 1rem" :label-width="'120px'">
<el-select style="width: 80%" v-model="editDataInfoForm.serviceType" placeholder="请选择">
<el-option v-for="item in serviceTypeOptions" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item
label="服务名称"
prop="serviceName"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input
v-model.trim="editDataInfoForm.serviceName"
style="width: 80%"
></el-input>
<el-form-item label="服务名称" prop="serviceName" style="font-size: 1rem" :label-width="'120px'"
v-if="editDataInfoForm.serviceType === '081100'">
<el-input v-model.trim="editDataInfoForm.serviceName"
placeholder="服务名称由两部分构成:数据服务url(如/iserver/services/data-supermap_shuili/rest);服务名称(如namespace:layer1)"
style="width: 80%"></el-input>
</el-form-item>
<el-form-item label="服务名称" style="font-size: 1rem" :label-width="'120px'" v-else>
<el-input v-model.trim="editDataInfoForm.serviceName" style="width: 80%"></el-input>
</el-form-item>
<el-form-item
label="服务别名"
prop="serviceNameAlias"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input
v-model.trim="editDataInfoForm.serviceNameAlias"
style="width: 80%"
></el-input>
<el-form-item label="服务别名" prop="serviceNameAlias" style="font-size: 1rem" :label-width="'120px'">
<el-input v-model.trim="editDataInfoForm.serviceNameAlias" style="width: 80%"></el-input>
</el-form-item>
<el-form-item
label="服务地址"
prop="serviceUrl"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input
v-model.trim="editDataInfoForm.serviceUrl"
style="width: 80%"
></el-input>
<el-form-item label="服务地址" prop="serviceUrl" style="font-size: 1rem" :label-width="'120px'">
<el-input v-model.trim="editDataInfoForm.serviceUrl" style="width: 80%"></el-input>
</el-form-item>
<el-form-item
label="服务token"
prop="serviceToken"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input
v-model.trim="editDataInfoForm.serviceToken"
style="width: 80%"
></el-input>
<el-form-item label="服务token" prop="serviceToken" style="font-size: 1rem" :label-width="'120px'">
<el-input v-model.trim="editDataInfoForm.serviceToken" style="width: 80%"></el-input>
</el-form-item>
<el-form-item
v-if="editDataInfoForm.serviceType === '030300'"
label="服务索引"
prop="serviceIndex"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input
v-model="editDataInfoForm.serviceIndex"
style="width: 80%"
></el-input>
<el-form-item v-if="editDataInfoForm.serviceType === '030300'" label="服务索引" prop="serviceIndex"
style="font-size: 1rem" :label-width="'120px'">
<el-input v-model="editDataInfoForm.serviceIndex" style="width: 80%"></el-input>
</el-form-item>
<el-form-item
v-show="['030300'].includes(editDataInfoForm.serviceType)"
label="样式选择"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-form-item v-show="['030300'].includes(editDataInfoForm.serviceType)" label="样式选择"
style="font-size: 1rem" :label-width="'120px'">
<div class="styleBtn">
<el-tag
type="info"
effect="plain"
class="style-button"
:class="{
'style-button-none': editDataInfoForm.relationStyleName,
}"
@click="handleLayerStyleTypeChange"
>
<el-tag type="info" effect="plain" class="style-button" :class="{
'style-button-none': editDataInfoForm.relationStyleName,
}" @click="handleLayerStyleTypeChange">
{{
editDataInfoForm.relationStyleName
? editDataInfoForm.relationStyleName
: "点击选择样式"
}}
</el-tag>
<el-button
style="margin-left: 15px"
:disabled="editDataInfoForm.relationStyleName === ''"
@click="
editDataInfoForm.relationStyleName = '';
editDataInfoForm.relationStyleId = '';
"
>取消选择样式</el-button
>
<el-button style="margin-left: 15px" :disabled="editDataInfoForm.relationStyleName === ''" @click="
editDataInfoForm.relationStyleName = '';
editDataInfoForm.relationStyleId = '';
">取消选择样式</el-button>
</div>
<styleListDialogVue
:visible="styleDialogVisible"
:$currentStyleId="editDataInfoForm.relationStyleId"
@closeDialog="styleDialogVisible = false"
@confirm="handleConfirm"
></styleListDialogVue>
<styleListDialogVue :visible="styleDialogVisible" :$currentStyleId="editDataInfoForm.relationStyleId"
@closeDialog="styleDialogVisible = false" @confirm="handleConfirm"></styleListDialogVue>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="扩展字段" name="2">
<div class="fn-btns">
<el-button type="primary" class="btn" @click="addRow"
>添加</el-button
>
<el-button type="danger" class="btn" @click="deleteRow"
>删除</el-button
>
<el-button type="primary" class="btn" @click="addRow">添加</el-button>
<el-button type="danger" class="btn" @click="deleteRow">删除</el-button>
</div>
<el-table
max-height="400px"
:data="extendTable"
border
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="50"
align="center"
></el-table-column>
<el-table max-height="400px" :data="extendTable" border @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center"></el-table-column>
<el-table-column prop="field" label="字段名称">
<template slot-scope="scope">
<el-input
v-model="scope.row.field"
:disabled="!scope.row.isEdit"
></el-input>
<el-input v-model="scope.row.field" :disabled="!scope.row.isEdit"></el-input>
</template>
</el-table-column>
<el-table-column prop="alias" label="别名">
<template slot-scope="scope">
<el-input
v-model="scope.row.alias"
:disabled="!scope.row.isEdit"
></el-input>
<el-input v-model="scope.row.alias" :disabled="!scope.row.isEdit"></el-input>
</template>
</el-table-column>
<el-table-column prop="value" label="字段值">
<template slot-scope="scope">
<el-input
v-model="scope.row.value"
:disabled="!scope.row.isEdit"
></el-input>
<el-input v-model="scope.row.value" :disabled="!scope.row.isEdit"></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-button
v-if="scope.row.isEdit"
type="primary"
icon="el-icon-success"
size="mini"
@click="saveRow(scope.$index)"
>保存</el-button
>
<el-button
v-if="scope.row.isEdit"
type="warning"
icon="el-icon-error"
size="mini"
@click="cancelRow(scope.$index)"
>取消</el-button
>
<el-button
v-if="!scope.row.isEdit"
type="primary"
icon="el-icon-edit"
size="mini"
@click="editRow(scope.$index)"
>编辑</el-button
>
<el-button
v-if="!scope.row.isEdit"
type="danger"
icon="el-icon-delete-solid"
size="mini"
@click="deleteRow(scope.$index)"
>删除</el-button
>
<el-button v-if="scope.row.isEdit" type="primary" icon="el-icon-success" size="mini"
@click="saveRow(scope.$index)">保存</el-button>
<el-button v-if="scope.row.isEdit" type="warning" icon="el-icon-error" size="mini"
@click="cancelRow(scope.$index)">取消</el-button>
<el-button v-if="!scope.row.isEdit" type="primary" icon="el-icon-edit" size="mini"
@click="editRow(scope.$index)">编辑</el-button>
<el-button v-if="!scope.row.isEdit" type="danger" icon="el-icon-delete-solid" size="mini"
@click="deleteRow(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
@ -225,22 +111,13 @@
<el-tab-pane label="字段配置" v-if="showFieldExtend()" name="3">
<div class="field-box">
<div class="field-filter">
<el-input
class="keyword-input"
placeholder="请输入搜索字段"
v-model="fieldValue"
clearable
>
<el-input class="keyword-input" placeholder="请输入搜索字段" v-model="fieldValue" clearable>
</el-input>
<el-button class="search-btn">搜索</el-button>
</div>
</div>
<el-table max-height="400px" :data="fieldsTable" border>
<el-table-column
type="index"
width="50"
align="center"
></el-table-column>
<el-table-column type="index" width="50" align="center"></el-table-column>
<el-table-column prop="field" label="字段名称">
</el-table-column>
<el-table-column prop="fieldName" label="字段别名">
@ -250,18 +127,9 @@
</el-table-column>
<el-table-column prop="fieldType" label="字段类型">
</el-table-column>
<el-table-column
prop="isShow"
label="支持查询"
width="80"
align="center"
>
<el-table-column prop="isShow" label="支持查询" width="80" align="center">
<template slot-scope="scope">
<el-checkbox
v-model="scope.row.isShow"
:true-label="1"
:false-label="0"
></el-checkbox>
<el-checkbox v-model="scope.row.isShow" :true-label="1" :false-label="0"></el-checkbox>
</template>
</el-table-column>
</el-table>
@ -270,34 +138,20 @@
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="saveOrUpdateLayer"
> </el-button
>
<el-button type="primary" @click="saveOrUpdateLayer"> </el-button>
</div>
</el-dialog>
<div class="keyword-filter">
<el-input
class="keyword-input"
placeholder="请输入内容"
v-model="keyword"
clearable
>
<el-input class="keyword-input" placeholder="请输入内容" v-model="keyword" clearable>
</el-input>
<el-button class="search-btn">搜索</el-button>
</div>
</div>
<div class="content">
<el-table :data="tableData" stripe style="width: 100%">
<el-table-column
type="index"
:index="
(index) =>
index + (pageOptions.pageNum - 1) * pageOptions.pageSize + 1
"
label="序号"
width="50"
header-align="center"
></el-table-column>
<el-table-column type="index" :index="(index) =>
index + (pageOptions.pageNum - 1) * pageOptions.pageSize + 1
" label="序号" width="50" header-align="center"></el-table-column>
<el-table-column prop="id" label="图层资源目录编号" width="350">
</el-table-column>
<el-table-column prop="serviceNameAlias" label="图层资源名称">
@ -306,28 +160,13 @@
<el-table-column prop="createUser" label="创建人"> </el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="handleEdit(scope.$index, scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.row)"
>删除</el-button
>
<el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
layout="prev, pager, next"
:current-page.sync="pageOptions.pageNum"
:total="pageOptions.total"
:page-size="pageOptions.pageSize"
@current-change="getLayerList"
>
<el-pagination background layout="prev, pager, next" :current-page.sync="pageOptions.pageNum"
:total="pageOptions.total" :page-size="pageOptions.pageSize" @current-change="getLayerList">
</el-pagination>
</div>
</el-container>
@ -518,15 +357,15 @@ export default {
});
},
async saveOrUpdateLayer() {
const reg = /^(?=.{1,100}$)[\u4e00-\u9fa5\w:]+$/;
if (!reg.test(this.editDataInfoForm.serviceName)) {
this.$message({
type: "info",
message:
"格式有误,目录名称仅支持中文、数字、字母、下划线、冒号,最大长度不超过100",
});
return;
}
// const reg = /^(?=.{1,100}$)[\u4e00-\u9fa5\w:./-;]+$/;
// if (!reg.test(this.editDataInfoForm.serviceName)) {
// this.$message({
// type: "info",
// message:
// "线100",
// });
// return;
// }
const params = {
...this.editDataInfoForm,
extendData: JSON.stringify(this.extendTable),

76
src/views/reservoir/safeOperation/js/mapUtils.js

@ -1,9 +1,16 @@
import axios from 'axios'
import axios from "axios";
const identifyLayerActions = {
'021102': async (params) => {
"021102": async (params) => {
return new Promise(async (resolve, reject) => {
const { url, input_geometry, geometry_type, layers = 'all', returnGeometry = false, tolerance = 1 } = params;
const {
url,
input_geometry,
geometry_type,
layers = "all",
returnGeometry = false,
tolerance = 1,
} = params;
const result = await axios.get(`${url}.json`);
if (result.status === 200 && result.data) {
const { xmin, ymin, xmax, ymax } = result.data.fullExtent;
@ -19,13 +26,29 @@ const identifyLayerActions = {
}
});
},
'030300': async (params) => {
"030300": async (params) => {
console.log(params);
},
'081100': async (params) => {
"081100": async (params) => {
return new Promise(async (resolve, reject) => {
const { queryMode, bufferDistance, geometry, url, layerTable, layerName, k } = params;
const queryUrl = url.split('maps/')[0].replace('map-', 'data-');
let {
queryMode,
bufferDistance,
geometry,
url,
layerTable,
layerName,
k,
} = params;
// const queryUrl = url.split('maps/')[0].replace('map-', 'data-');
let queryUrl = "";
if (layerName.split(";").length == 1 && layerName.includes(":")) {
queryUrl = url.split("maps/")[0].replace("map-", "data-");
} else if (layerName.split(";").length == 2 && layerName.includes(":")) {
let dataServiceLayerInfo = layerName.split(";");
queryUrl = dataServiceLayerInfo[0]+"/";
layerName = dataServiceLayerInfo[1];
}
let requestUrl = `${queryUrl}data/featureResults.rjson?returnContent=true`;
if (k) {
requestUrl += `&k=${k}`;
@ -36,42 +59,41 @@ const identifyLayerActions = {
datasetNames: [layerTable || layerName],
getFeatureMode: queryMode,
bufferDistance,
geometry
geometry,
}),
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
},
}
);
resolve(result);
});
}
},
};
export const queryLayersByPos = (position, layerList = [], cb) => {
const { lng, lat } = position;
const layers = layerList
const layers = layerList;
layers.forEach(async (layer) => {
const action = identifyLayerActions[layer.layerType];
switch (layer.layerType) {
case '021102': {
case "021102": {
const input_geometry = `${lng},${lat}`;
const geometry_type = 'esriGeometryPoint';
const geometry_type = "esriGeometryPoint";
const result = await action({
input_geometry,
geometry_type,
url: layer.url
url: layer.url,
});
let res;
if (result?.results?.length > 0) {
res = result.results[0]
res = result.results[0];
}
if(cb) cb(res)
if (cb) cb(res);
break;
}
case '030300':
case "030300":
break;
case '081100': {
const queryMode = 'BUFFER';
@ -85,17 +107,16 @@ export const queryLayersByPos = (position, layerList = [], cb) => {
points: [
{
x: lng,
y: lat
}
y: lat,
},
],
type: 'POINT'
type: "POINT",
};
let type = '';
let type = "";
let isSite = false;
let layerTable = '';
let layerTable = "";
if (layer.extendData) {
const extendData = JSON.parse(layer.extendData);
}
const result = await action({
queryMode,
@ -105,11 +126,10 @@ export const queryLayersByPos = (position, layerList = [], cb) => {
layerName: layer.text,
layerTable,
url: layer.url,
k: layer.serviceToken
k: layer.serviceToken,
});
if ([200, 201].includes(result.status)) {
console.log('处理业务数据 >>>>>> ', result)
console.log("处理业务数据 >>>>>> ", result);
}
break;
}

Loading…
Cancel
Save