添加地图模块管理 图层 图例 图例数据

This commit is contained in:
扈兆增 2026-05-20 17:55:48 +08:00
parent 363c353bdf
commit c31d89f364
24 changed files with 2863 additions and 8293 deletions

View File

@ -0,0 +1,34 @@
import request from '@/utils/request';
// 获取所有地图 图例树
export function getAllMapLayerTree(data: any) {
return request({
url: '/api/wmp-sys-server/mapLayer/getAllMapLayerTree',
method: 'post',
data: data
});
}
// 保存地图 图例
export function saveMapLayer(data: any) {
return request({
url: '/api/wmp-sys-server/mapLayer/save',
method: 'post',
data: data
});
}
// 删除地图 图例
export function deleteMapLayer(data: any) {
return request({
url: '/api/wmp-sys-server/mapLayer/delete',
method: 'post',
data: data
});
}
// 获取所有地图 图例树
export function getAllMapLegendParentIdTree(data: any) {
return request({
url: '/api/wmp-sys-server/mapLegend/getAllMapLegendTree',
method: 'get',
params: data
});
}

View File

@ -0,0 +1,26 @@
import request from '@/utils/request';
// 获取所有地图 图层
export function getAllMapLegendTree(data: any) {
return request({
url: '/api/wmp-sys-server/mapLegend/GetKendoList',
method: 'post',
data: data
});
}
// 保存地图 图层
export function saveMapLegend(data: any) {
return request({
url: '/api/wmp-sys-server/mapLegend/save',
method: 'post',
data: data
});
}
// 删除地图 图层
export function deleteMapLegend(data: any) {
return request({
url: '/api/wmp-sys-server/mapLegend/delete',
method: 'post',
data: data
});
}

View File

@ -43,7 +43,7 @@
:allow-clear="item.fieldProps?.allowClear" :allow-clear="item.fieldProps?.allowClear"
:presets="item.presets" :presets="item.presets"
style="width: 100%" style="width: 100%"
@change="(val) => triggerManualValuesChange(item.name, val)" @change="val => triggerManualValuesChange(item.name, val)"
/> />
<!-- 日期范围选择器 --> <!-- 日期范围选择器 -->
@ -58,7 +58,7 @@
:allow-clear="item.fieldProps?.allowClear" :allow-clear="item.fieldProps?.allowClear"
:presets="item.presets" :presets="item.presets"
style="width: 100%" style="width: 100%"
@change="(val) => triggerManualValuesChange(item.name, val)" @change="val => triggerManualValuesChange(item.name, val)"
/> />
<!-- 普通输入框 --> <!-- 普通输入框 -->
@ -68,11 +68,16 @@
:placeholder="item.placeholder || '请输入'" :placeholder="item.placeholder || '请输入'"
:allow-clear="item.fieldProps?.allowClear" :allow-clear="item.fieldProps?.allowClear"
:style="{ width: item.width ? item.width + 'px' : '200px' }" :style="{ width: item.width ? item.width + 'px' : '200px' }"
@change="(e) => triggerManualValuesChange(item.name, e.target.value)" @change="
e => triggerManualValuesChange(item.name, e.target.value)
"
/> />
<!-- 电站下拉框 --> <!-- 电站下拉框 -->
<div class="flex gap-[10px]" v-else-if="item.type === 'waterStation'"> <div
class="flex gap-[10px]"
v-else-if="item.type === 'waterStation'"
>
<a-form-item-rest> <a-form-item-rest>
<!-- 基地下拉框 --> <!-- 基地下拉框 -->
<!-- <a-select <!-- <a-select
@ -168,7 +173,7 @@
:placeholder="item.placeholder || '请选择'" :placeholder="item.placeholder || '请选择'"
:allow-clear="item.fieldProps?.allowClear" :allow-clear="item.fieldProps?.allowClear"
:style="{ width: item.width ? item.width + 'px' : '200px' }" :style="{ width: item.width ? item.width + 'px' : '200px' }"
@change="(val) => triggerManualValuesChange(item.name, val)" @change="val => triggerManualValuesChange(item.name, val)"
show-search show-search
:filter-option="filterOption" :filter-option="filterOption"
> >
@ -182,14 +187,43 @@
</a-select-option> </a-select-option>
</a-select> </a-select>
<!-- 树形选择 -->
<a-tree-select
v-else-if="item.type === 'TreeSelect'"
v-model:value="formData[item.name]"
:tree-data="item.options"
:placeholder="item.placeholder || '请选择'"
:allow-clear="item.fieldProps?.allowClear"
:style="{ width: item.width ? item.width + 'px' : '200px' }"
:field-names="
item.fieldNames || {
label: 'label',
value: 'value',
children: 'children'
}
"
:show-search="item.showSearch !== false"
:multiple="item.multiple"
:tree-checkable="item.treeCheckable"
:check-strictly="item.checkStrictly"
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
@change="val => triggerManualValuesChange(item.name, val)"
/>
<!-- 单选框 --> <!-- 单选框 -->
<a-radio-group <a-radio-group
v-else-if="item.type === 'Radio'" v-else-if="item.type === 'Radio'"
v-model:value="formData[item.name]" v-model:value="formData[item.name]"
:style="{ width: item.width ? item.width + 'px' : '200px' }" :style="{ width: item.width ? item.width + 'px' : '200px' }"
@change="(e) => triggerManualValuesChange(item.name, e.target.value)" @change="
e => triggerManualValuesChange(item.name, e.target.value)
"
>
<a-radio
v-for="opt in item.options"
:key="opt.value"
:value="opt.value"
> >
<a-radio v-for="opt in item.options" :key="opt.value" :value="opt.value">
{{ opt.label }} {{ opt.label }}
</a-radio> </a-radio>
</a-radio-group> </a-radio-group>
@ -223,16 +257,16 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, computed, reactive, watch, onMounted, nextTick } from "vue"; import { ref, computed, reactive, watch, onMounted, nextTick } from 'vue';
import { useShuJuTianBaoStore } from "@/store/modules/shuJuTianBao"; import { useShuJuTianBaoStore } from '@/store/modules/shuJuTianBao';
const shuJuTianBaoStore = useShuJuTianBaoStore(); const shuJuTianBaoStore = useShuJuTianBaoStore();
// --- --- // --- ---
export interface SearchItem { export interface SearchItem {
type?: "Input" | "Select" | "DataPicker" | string; type?: 'Input' | 'Select' | 'TreeSelect' | 'DataPicker' | string;
name: string; name: string;
label: string; label: string;
picker?: "year" | "month" | "date" | "week"; picker?: 'year' | 'month' | 'date' | 'week';
fieldProps?: any; fieldProps?: any;
placeholder?: string; placeholder?: string;
span?: number; span?: number;
@ -246,6 +280,16 @@ export interface SearchItem {
label: string; label: string;
value: any; value: any;
}[]; }[];
treeData?: any[];
fieldNames?: {
label?: string;
value?: string;
children?: string;
};
showSearch?: boolean;
multiple?: boolean;
treeCheckable?: boolean;
checkStrictly?: boolean;
component?: any; component?: any;
} }
@ -260,13 +304,13 @@ interface Props {
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
initialValues: () => ({}), initialValues: () => ({}),
showSearch: true, showSearch: true,
showReset: true, showReset: true
}); });
const emit = defineEmits<{ const emit = defineEmits<{
(e: "finish", values: any): void; (e: 'finish', values: any): void;
(e: "valuesChange", changedValues: any, allValues: any): void; (e: 'valuesChange', changedValues: any, allValues: any): void;
(e: "reset"): void; (e: 'reset'): void;
}>(); }>();
const formRef = ref<any>(); const formRef = ref<any>();
@ -279,7 +323,7 @@ const filterOption = (inputValue: string, option: any) => {
}; };
// 2. false/null/undefined // 2. false/null/undefined
const validSearchList = computed(() => { const validSearchList = computed(() => {
return props.searchList.filter((item) => item); return props.searchList.filter(item => item);
}); });
// --- --- // --- ---
@ -287,14 +331,14 @@ const initForm = () => {
const initial = JSON.parse(JSON.stringify(props.initialValues || {})); const initial = JSON.parse(JSON.stringify(props.initialValues || {}));
// 1. formData // 1. formData
Object.keys(formData).forEach((key) => delete formData[key]); Object.keys(formData).forEach(key => delete formData[key]);
// 2. // 2.
Object.assign(formData, initial); Object.assign(formData, initial);
// 3. searchList false/null/undefined // 3. searchList false/null/undefined
validSearchList.value.forEach((item) => { validSearchList.value.forEach(item => {
if (item.type == "waterStation") { if (item.type == 'waterStation') {
// //
// shuJuTianBaoStore.getBaseOption(); // shuJuTianBaoStore.getBaseOption();
shuJuTianBaoStore.getSelectForOption(); shuJuTianBaoStore.getSelectForOption();
@ -302,7 +346,7 @@ const initForm = () => {
} }
if (item.fieldProps?.required) { if (item.fieldProps?.required) {
rules[item.name] = [ rules[item.name] = [
{ required: true, message: `${item.label}不能为空`, trigger: "blur" }, { required: true, message: `${item.label}不能为空`, trigger: 'blur' }
]; ];
} }
}); });
@ -318,7 +362,7 @@ const triggerManualValuesChange = (changedKey: string, newValue: any) => {
const changedValues = { [changedKey]: newValue }; const changedValues = { [changedKey]: newValue };
// //
// 使 {...formData} // 使 {...formData}
emit("valuesChange", changedValues, { ...formData }); emit('valuesChange', changedValues, { ...formData });
}; };
// const dataDimensionDataChange = (value: any) => { // const dataDimensionDataChange = (value: any) => {
@ -332,24 +376,24 @@ const triggerManualValuesChange = (changedKey: string, newValue: any) => {
const lyChange = (value: any) => { const lyChange = (value: any) => {
formData.hbrvcd = value; formData.hbrvcd = value;
formData.rstcd = ""; formData.rstcd = '';
shuJuTianBaoStore.getEngOption(formData.hbrvcd); shuJuTianBaoStore.getEngOption(formData.hbrvcd);
// valuesChange a-form-item-rest // valuesChange a-form-item-rest
triggerManualValuesChange("hbrvcd", formData.hbrvcd); triggerManualValuesChange('hbrvcd', formData.hbrvcd);
}; };
const stcdIdChange = (value: any) => { const stcdIdChange = (value: any) => {
if (props.zhujianfujian == "fu") { if (props.zhujianfujian == 'fu') {
formData.rstcd = value; formData.rstcd = value;
shuJuTianBaoStore.getFpssOption(formData.hbrvcd, value); shuJuTianBaoStore.getFpssOption(formData.hbrvcd, value);
// valuesChange // valuesChange
triggerManualValuesChange("rstcd", formData.rstcd); triggerManualValuesChange('rstcd', formData.rstcd);
} else { } else {
formData.stcd = value; formData.stcd = value;
shuJuTianBaoStore.getFpssOption(formData.hbrvcd, value); shuJuTianBaoStore.getFpssOption(formData.hbrvcd, value);
// valuesChange // valuesChange
triggerManualValuesChange("stcd", formData.stcd); triggerManualValuesChange('stcd', formData.stcd);
} }
}; };
@ -359,7 +403,7 @@ onMounted(() => {
watch( watch(
() => props.initialValues, () => props.initialValues,
(newVal) => { newVal => {
if (newVal && formRef.value) { if (newVal && formRef.value) {
formRef.value.setFieldsValue(newVal); formRef.value.setFieldsValue(newVal);
Object.assign(formData, newVal); Object.assign(formData, newVal);
@ -371,11 +415,11 @@ watch(
// --- --- // --- ---
const handleFinish = (values: any) => { const handleFinish = (values: any) => {
const finalValues = { ...formData, ...values }; const finalValues = { ...formData, ...values };
emit("finish", finalValues); emit('finish', finalValues);
}; };
const handleValuesChange = (changedValues: any, allValues: any) => { const handleValuesChange = (changedValues: any, allValues: any) => {
emit("valuesChange", changedValues, allValues); emit('valuesChange', changedValues, allValues);
}; };
const handleReset = () => { const handleReset = () => {
@ -384,7 +428,7 @@ const handleReset = () => {
nextTick(() => { nextTick(() => {
initForm(); initForm();
}); });
emit("reset"); emit('reset');
} }
}; };
@ -392,7 +436,7 @@ defineExpose({
form: formRef, form: formRef,
formData, formData,
reset: handleReset, reset: handleReset,
submit: () => formRef.value?.submit(), submit: () => formRef.value?.submit()
}); });
</script> </script>

View File

@ -20,8 +20,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, onMounted, watch, nextTick } from 'vue'; import { ref, computed, onMounted, watch, nextTick } from "vue";
import { calcTableScrollY } from '@/utils/index'; import { calcTableScrollY } from "@/utils/index";
// --- Types --- // --- Types ---
interface Props { interface Props {
@ -33,24 +33,26 @@ interface Props {
rowKey?: string; rowKey?: string;
searchParams?: Record<string, any>; searchParams?: Record<string, any>;
defaultPageSize?: number; defaultPageSize?: number;
isPage?: boolean;
getCheckboxProps?: (record: any) => any; getCheckboxProps?: (record: any) => any;
transformData?: (res: any) => { records: any[]; total: number }; transformData?: (res: any) => { records: any[]; total: number };
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
enableRowSelection: false, enableRowSelection: false,
rowKey: 'id', rowKey: "id",
isPage: true,
data: () => [], data: () => [],
searchParams: () => ({}), searchParams: () => ({}),
defaultPageSize: 20, defaultPageSize: 20,
getCheckboxProps: undefined, getCheckboxProps: undefined,
transformData: undefined, transformData: undefined,
scrollY: undefined scrollY: undefined,
}); });
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'data-loaded', params: any, data: any): void; (e: "data-loaded", params: any, data: any): void;
(e: 'selection-change', selectedRowKeys: string[], selectedRows: any[]): void; (e: "selection-change", selectedRowKeys: string[], selectedRows: any[]): void;
}>(); }>();
// --- State --- // --- State ---
@ -68,8 +70,8 @@ const tableScrollY = ref<number>(0); // ✅ 新增:存储容器高度
// --- Computed Scroll Config --- // --- Computed Scroll Config ---
const scrollConfig = computed(() => { const scrollConfig = computed(() => {
const config: any = { const config: any = {
x: '100%', x: "100%",
y: 0 y: 0,
}; };
// // 1. scrollY使 // // 1. scrollY使
@ -91,11 +93,11 @@ const rowSelection = computed(() => ({
onChange: (keys: string[], rows: any[]) => { onChange: (keys: string[], rows: any[]) => {
selectedRowKeys.value = keys; selectedRowKeys.value = keys;
selectedRows.value = rows; selectedRows.value = rows;
emit('selection-change', keys, rows); emit("selection-change", keys, rows);
}, },
getCheckboxProps: props.getCheckboxProps getCheckboxProps: props.getCheckboxProps
? props.getCheckboxProps ? props.getCheckboxProps
: (record: any) => ({}) : (record: any) => ({}),
})); }));
// --- Pagination Config --- // --- Pagination Config ---
@ -106,7 +108,7 @@ const paginationConfig = computed(() => ({
showSizeChanger: true, showSizeChanger: true,
showQuickJumper: true, showQuickJumper: true,
showTotal: (total: number) => `${total}`, showTotal: (total: number) => `${total}`,
pageSizeOptions: ['20', '50', '100'] pageSizeOptions: ["20", "50", "100"],
})); }));
// --- Methods --- // --- Methods ---
@ -118,13 +120,18 @@ const getList = async (filter?: Record<string, any>) => {
if (filter !== undefined) { if (filter !== undefined) {
lastFilter.value = filter; lastFilter.value = filter;
} }
console.log(props.searchParams);
try { try {
const params = { const params = {
...props.searchParams, ...props.searchParams,
skip: page.value, skip: page.value,
take: size.value, take: size.value,
filter: lastFilter.value filter: lastFilter.value,
}; };
if (!props.isPage) {
delete params.take;
delete params.skip;
}
const res = await props.listUrl(params); const res = await props.listUrl(params);
@ -136,15 +143,15 @@ const getList = async (filter?: Record<string, any>) => {
finalRecords = result.records || []; finalRecords = result.records || [];
finalTotal = result.total || 0; finalTotal = result.total || 0;
} else { } else {
finalRecords = res?.data?.records || res?.data || []; finalRecords = res?.data?.records || res?.data?.data || res?.data || [];
finalTotal = res?.data?.total || res?.total || 0; finalTotal = res.data?.data?.total || res?.data?.total || res?.total || 0;
} }
tableData.value = finalRecords; tableData.value = finalRecords;
total.value = finalTotal; total.value = finalTotal;
emit('data-loaded', params, { records: finalRecords, total: finalTotal }); emit("data-loaded", params, { records: finalRecords, total: finalTotal });
} catch (error) { } catch (error) {
console.error('Fetch table data error:', error); console.error("Fetch table data error:", error);
tableData.value = []; tableData.value = [];
total.value = 0; total.value = 0;
} finally { } finally {
@ -183,18 +190,10 @@ defineExpose({
clearSelection, clearSelection,
getSelected: () => ({ getSelected: () => ({
keys: selectedRowKeys.value, keys: selectedRowKeys.value,
rows: selectedRows.value rows: selectedRows.value,
}) }),
}); });
watch(
() => props.searchParams,
() => {
page.value = 1;
getList();
},
{ deep: true }
);
const observer = new ResizeObserver(() => { const observer = new ResizeObserver(() => {
tableScrollY.value = calcTableScrollY(tableContainerRef.value); tableScrollY.value = calcTableScrollY(tableContainerRef.value);
}); });

View File

@ -21,7 +21,8 @@ service.interceptors.request.use(
} }
if ( if (
config.url.includes('/dec-lygk-base-server') || config.url.includes('/dec-lygk-base-server') ||
config.url.includes('/wmp-env-server') config.url.includes('/wmp-env-server') ||
config.url.includes('/wmp-sys-server')
) { ) {
config.headers._appid = '974975A6-47FD-4C04-9ACD-68938D2992BD'; config.headers._appid = '974975A6-47FD-4C04-9ACD-68938D2992BD';
config.headers._isolateid = '5b34aecb-adfb-4dfc-ad95-21505a9eb388'; config.headers._isolateid = '5b34aecb-adfb-4dfc-ad95-21505a9eb388';
@ -29,7 +30,7 @@ service.interceptors.request.use(
config.headers._sysid = '10EC2E0B-AEA9-4757-83A2-201BA1BC54E9'; config.headers._sysid = '10EC2E0B-AEA9-4757-83A2-201BA1BC54E9';
config.headers.authorization = config.headers.authorization =
'bearer ff5f2ec1-27ba-4ff4-8987-606cbfac6f2f'; 'bearer bcaab66c-0455-4062-aa2a-85c1af405d9b';
config.baseURL = '/'; config.baseURL = '/';
} else { } else {
const user = useUserStoreHook(); const user = useUserStoreHook();

View File

@ -1,10 +1,11 @@
<template> <template>
<a-modal <a-modal
:title="isEdit ? '编辑配置' : '新增配置'" :title="isEdit ? '编辑沿程配置' : '新增沿程配置'"
v-model:open="modalVisible" v-model:open="modalVisible"
:confirm-loading="localLoading" :confirm-loading="localLoading"
width="600px" width="1200px"
:destroy-on-close="true" :destroy-on-close="true"
ok-text="保存"
@cancel="handleCancel" @cancel="handleCancel"
@ok="handleOk" @ok="handleOk"
> >
@ -15,43 +16,270 @@
name="edit_form" name="edit_form"
:labelCol="{ span: 5 }" :labelCol="{ span: 5 }"
> >
<a-form-item label="配置项名称" name="configName"> <a-row>
<a-col :span="12">
<a-form-item label="沿程配置名称" name="name">
<a-input <a-input
v-model:value="formData.configName" v-model:value="formData.name"
style="width: 100%" style="width: 100%"
placeholder="请输入配置项名称" placeholder="请输入沿程配置名称"
/> /> </a-form-item
</a-form-item> ></a-col>
<a-form-item label="配置类型" name="configType"> <a-col :span="12">
<a-form-item label="配置编码" name="code">
<a-input <a-input
v-model:value="formData.configType" v-model:value="formData.code"
style="width: 100%" style="width: 100%"
placeholder="请输入配置类型" placeholder="请输入配置编码"
/> /> </a-form-item
</a-form-item> ></a-col>
<a-form-item label="配置值" name="configValue"> </a-row>
<a-row>
<a-col :span="12">
<a-form-item label="所在河段" name="rvnm">
<a-input <a-input
v-model:value="formData.configValue" v-model:value="formData.rvnm"
style="width: 100%" style="width: 100%"
placeholder="请输入配置值" placeholder="请输入所在河段"
/> /> </a-form-item
</a-form-item> ></a-col>
<a-form-item label="描述" name="description"> <a-col :span="12">
<a-form-item label="备注" name="description">
<a-textarea <a-textarea
:rows="4"
v-model:value="formData.description" v-model:value="formData.description"
style="width: 100%" style="width: 100%"
placeholder="请输入描述" placeholder="请输入备注"
:rows="3" /> </a-form-item
/> ></a-col>
</a-form-item> </a-row>
</a-form> </a-form>
<div class="config-tree-container">
<!-- 新增一级节点区域 -->
<div v-if="addingNewNode" class="add-node-row">
<a-select
v-model:value="newNodeData.stcd"
show-search
placeholder="请选择站点"
style="width: 300px"
:filter-option="filterOption"
@change="handleNodeSelect"
>
<a-select-option
v-for="item in stationList"
:key="item.stcd"
:value="item.stcd"
>
{{ item.stnm }}
</a-select-option>
</a-select>
<a-button
type="primary"
@click="handleSaveNewNode"
style="margin-left: 8px"
>
保存
</a-button>
<a-button @click="handleCancelAdd" style="margin-left: 8px">
<MinusOutlined />
</a-button>
</div>
<a-button v-else class="mb-4" type="primary" @click="handleAdd">
<PlusOutlined /> 新增一级节点
</a-button>
<!-- 树形结构 -->
<a-tree
v-if="treeData.length > 0"
:tree-data="treeData"
:default-expand-all="false"
:selectable="false"
block-node
style="width: 300px"
>
<template #title="{ dataRef }">
<!-- 编辑状态只显示编辑区域 -->
<div
v-if="editingNode && editingNodeKey === dataRef.key"
class="add-child-node-row w-[300px]"
>
<a-select
v-model:value="editNodeData.stcd"
show-search
placeholder="请选择站点"
style="width: 300px"
:filter-option="filterOption"
@change="handleEditNodeSelect"
>
<a-select-option
v-for="item in stationList"
:key="item.stcd"
:value="item.stcd"
>
{{ item.stnm }}
</a-select-option>
</a-select>
<a-button
type="primary"
@click.stop="handleSaveEditNode"
style="margin-left: 8px"
>
保存
</a-button>
<a-button
@click.stop="handleCancelEditNode"
style="margin-left: 8px"
>
<MinusOutlined />
</a-button>
</div>
<!-- 非编辑状态显示正常节点内容 -->
<template v-else>
<div class="tree-node-wrapper">
<span class="tree-node-title"> {{ getNodeTitle(dataRef) }} </span>
<div class="tree-node-actions">
<!-- 一级节点支持新增子节点编辑排序删除 -->
<template v-if="!dataRef.parentId">
<a-button
type="link"
size="small"
@click.stop="handleAddChild(dataRef)"
title="添加子节点"
>
<PlusOutlined />
</a-button>
<a-button
type="link"
size="small"
@click.stop="handleEditNode(dataRef)"
title="编辑"
>
<EditOutlined />
</a-button>
<a-button
type="link"
size="small"
@click.stop="handleMoveUp(dataRef)"
title="上移"
:disabled="isFirstNode(dataRef)"
>
<ArrowUpOutlined />
</a-button>
<a-button
type="link"
size="small"
@click.stop="handleMoveDown(dataRef)"
title="下移"
:disabled="isLastNode(dataRef)"
>
<ArrowDownOutlined />
</a-button>
<a-button
type="link"
size="small"
danger
@click.stop="handleDeleteNode(dataRef)"
title="删除"
>
<DeleteOutlined />
</a-button>
</template>
<!-- 二级节点只支持编辑排序删除 -->
<template v-else>
<a-button
type="link"
size="small"
@click.stop="handleEditNode(dataRef)"
title="编辑"
>
<EditOutlined />
</a-button>
<a-button
type="link"
size="small"
@click.stop="handleMoveUp(dataRef)"
title="上移"
:disabled="isFirstNode(dataRef)"
>
<ArrowUpOutlined />
</a-button>
<a-button
type="link"
size="small"
@click.stop="handleMoveDown(dataRef)"
title="下移"
:disabled="isLastNode(dataRef)"
>
<ArrowDownOutlined />
</a-button>
<a-button
type="link"
size="small"
danger
@click.stop="handleDeleteNode(dataRef)"
title="删除"
>
<DeleteOutlined />
</a-button>
</template>
</div>
</div>
<!-- 子节点添加区域 -->
<div
v-if="addingChildNode && currentParentKey === dataRef.key"
class="add-child-node-row"
>
<a-select
v-model:value="childNodeData.stcd"
show-search
placeholder="请选择站点"
style="width: 300px"
:filter-option="filterOption"
@change="handleChildNodeSelect"
>
<a-select-option
v-for="item in stationList"
:key="item.stcd"
:value="item.stcd"
>
{{ item.stnm }}
</a-select-option>
</a-select>
<a-button
type="primary"
@click.stop="handleSaveChildNode"
style="margin-left: 8px"
>
保存
</a-button>
<a-button
@click.stop="handleCancelAddChild"
style="margin-left: 8px"
>
<MinusOutlined />
</a-button>
</div>
</template>
</template>
</a-tree>
<a-empty v-else description="暂无数据" style="margin-top: 20px" />
</div>
</a-modal> </a-modal>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'; import { ref, reactive, computed, watch } from 'vue';
import { message } from 'ant-design-vue'; import { message, Modal } from 'ant-design-vue';
import type { Rule } from 'ant-design-vue/es/form'; import type { Rule } from 'ant-design-vue/es/form';
import dayjs from 'dayjs';
import {
PlusOutlined,
MinusOutlined,
EditOutlined,
DeleteOutlined,
ArrowUpOutlined,
ArrowDownOutlined
} from '@ant-design/icons-vue';
interface Props { interface Props {
visible: boolean; visible: boolean;
@ -81,27 +309,366 @@ const formRef = ref();
const defaultFormData = reactive({ const defaultFormData = reactive({
id: undefined, id: undefined,
configName: undefined, name: undefined,
configType: undefined, code: undefined,
configValue: undefined, rvnm: undefined,
description: undefined description: undefined
}); });
const formData: any = reactive({ ...defaultFormData }); const formData: any = reactive({ ...defaultFormData });
const rules: Record<string, Rule[]> = { const rules: Record<string, Rule[]> = {
configName: [ name: [{ required: true, message: '请输入沿程配置名称', trigger: 'blur' }],
{ required: true, message: '请输入配置项名称', trigger: 'blur' } code: [{ required: true, message: '请输入配置编码', trigger: 'blur' }],
], rvnm: [{ required: true, message: '请输入所在河段', trigger: 'blur' }]
configType: [{ required: true, message: '请输入配置类型', trigger: 'blur' }]
}; };
const isEdit = computed(() => !!props.initialValues); const isEdit = computed(() => !!props.initialValues);
//
const treeData = ref<any[]>([]);
//
const addingNewNode = ref(false);
const newNodeData = ref({
stcd: undefined,
stnm: '',
sttpName: ''
});
//
const addingChildNode = ref(false);
const currentParentKey = ref<string | null>(null);
const childNodeData = ref({
stcd: undefined,
stnm: '',
sttpName: ''
});
//
const editingNode = ref(false);
const editingNodeKey = ref<string | null>(null);
const editNodeData = ref({
stcd: undefined,
stnm: '',
sttpName: '',
originalData: null as any
});
//
const stationList = ref([
{ stcd: '1', stnm: '站点A', sttpName: '类型1' },
{ stcd: '2', stnm: '站点B', sttpName: '类型2' },
{ stcd: '3', stnm: '站点C', sttpName: '类型1' },
{ stcd: '4', stnm: '站点D', sttpName: '类型3' }
]);
// ID
let nodeIdCounter = 0;
const generateNodeId = () => `node_${Date.now()}_${++nodeIdCounter}`;
//
const getNodeTitle = (dataRef: any) => {
if (!dataRef.parentId) {
// stnm
return dataRef.stnm || '';
} else {
// stnm + sttpName
return `${dataRef.stnm || ''} ${dataRef.sttpName || ''}`;
}
};
//
const filterOption = (input: string, option: any) => {
return (
option.children[0].children.toLowerCase().indexOf(input.toLowerCase()) >= 0
);
};
//
const isFirstNode = (dataRef: any) => {
const siblings = getSiblings(dataRef);
return siblings.length > 0 && siblings[0].key === dataRef.key;
};
//
const isLastNode = (dataRef: any) => {
const siblings = getSiblings(dataRef);
return (
siblings.length > 0 && siblings[siblings.length - 1].key === dataRef.key
);
};
//
const getSiblings = (dataRef: any) => {
if (!dataRef.parentId) {
//
return treeData.value;
} else {
// children
const parent = findNodeByKey(treeData.value, dataRef.parentId);
return parent?.children || [];
}
};
// key
const findNodeByKey = (nodes: any[], key: string): any => {
for (const node of nodes) {
if (node.key === key) {
return node;
}
if (node.children && node.children.length > 0) {
const found = findNodeByKey(node.children, key);
if (found) return found;
}
}
return null;
};
//
const handleAdd = () => {
addingNewNode.value = true;
newNodeData.value = {
stcd: undefined,
stnm: '',
sttpName: ''
};
};
//
const handleNodeSelect = (value: string) => {
const station = stationList.value.find(item => item.stcd === value);
if (station) {
newNodeData.value.stnm = station.stnm;
newNodeData.value.sttpName = station.sttpName;
}
};
//
const handleSaveNewNode = () => {
if (!newNodeData.value.stcd) {
message.error('请选择站点');
return;
}
const newNode = {
key: generateNodeId(),
stcd: newNodeData.value.stcd,
stnm: newNodeData.value.stnm,
sttpName: newNodeData.value.sttpName,
parentId: null,
children: []
};
treeData.value.push(newNode);
addingNewNode.value = false;
message.success('添加成功');
};
//
const handleCancelAdd = () => {
addingNewNode.value = false;
newNodeData.value = {
stcd: undefined,
stnm: '',
sttpName: ''
};
};
//
const handleAddChild = (parentData: any) => {
addingChildNode.value = true;
currentParentKey.value = parentData.key;
childNodeData.value = {
stcd: undefined,
stnm: '',
sttpName: ''
};
};
//
const handleChildNodeSelect = (value: string) => {
const station = stationList.value.find(item => item.stcd === value);
if (station) {
childNodeData.value.stnm = station.stnm;
childNodeData.value.sttpName = station.sttpName;
}
};
//
const handleSaveChildNode = () => {
if (!childNodeData.value.stcd) {
message.error('请选择站点');
return;
}
const parent = findNodeByKey(treeData.value, currentParentKey.value!);
if (!parent) {
message.error('父节点不存在');
return;
}
const newChild = {
key: generateNodeId(),
stcd: childNodeData.value.stcd,
stnm: childNodeData.value.stnm,
sttpName: childNodeData.value.sttpName,
parentId: parent.key,
children: []
};
if (!parent.children) {
parent.children = [];
}
//
parent.children.unshift(newChild);
addingChildNode.value = false;
currentParentKey.value = null;
message.success('添加子节点成功');
};
//
const handleCancelAddChild = () => {
addingChildNode.value = false;
currentParentKey.value = null;
childNodeData.value = {
stcd: undefined,
stnm: '',
sttpName: ''
};
};
//
const handleEditNode = (dataRef: any) => {
editingNode.value = true;
editingNodeKey.value = dataRef.key;
//
editNodeData.value = {
stcd: dataRef.stcd,
stnm: dataRef.stnm,
sttpName: dataRef.sttpName,
originalData: { ...dataRef }
};
};
//
const handleEditNodeSelect = (value: string) => {
const station = stationList.value.find(item => item.stcd === value);
if (station) {
editNodeData.value.stnm = station.stnm;
editNodeData.value.sttpName = station.sttpName;
editNodeData.value.stcd = station.stcd;
}
};
//
const handleSaveEditNode = () => {
if (!editNodeData.value.stcd) {
message.error('请选择站点');
return;
}
//
const node = findNodeByKey(treeData.value, editingNodeKey.value!);
if (!node) {
message.error('节点不存在');
return;
}
//
node.stcd = editNodeData.value.stcd;
node.stnm = editNodeData.value.stnm;
node.sttpName = editNodeData.value.sttpName;
editingNode.value = false;
editingNodeKey.value = null;
message.success('编辑成功');
};
//
const handleCancelEditNode = () => {
editingNode.value = false;
editingNodeKey.value = null;
editNodeData.value = {
stcd: undefined,
stnm: '',
sttpName: '',
originalData: null
};
};
//
const handleMoveUp = (dataRef: any) => {
const siblings = getSiblings(dataRef);
const index = siblings.findIndex(item => item.key === dataRef.key);
if (index > 0) {
//
[siblings[index - 1], siblings[index]] = [
siblings[index],
siblings[index - 1]
];
message.success('上移成功');
}
};
//
const handleMoveDown = (dataRef: any) => {
const siblings = getSiblings(dataRef);
const index = siblings.findIndex(item => item.key === dataRef.key);
if (index < siblings.length - 1) {
//
[siblings[index], siblings[index + 1]] = [
siblings[index + 1],
siblings[index]
];
message.success('下移成功');
}
};
//
const handleDeleteNode = (dataRef: any) => {
Modal.confirm({
title: '确认删除',
content: `确定要删除节点"${dataRef.stnm}"吗?`,
okText: '确定',
cancelText: '取消',
onOk: () => {
if (!dataRef.parentId) {
//
const index = treeData.value.findIndex(
item => item.key === dataRef.key
);
if (index > -1) {
treeData.value.splice(index, 1);
}
} else {
//
const parent = findNodeByKey(treeData.value, dataRef.parentId);
if (parent && parent.children) {
const index = parent.children.findIndex(
item => item.key === dataRef.key
);
if (index > -1) {
parent.children.splice(index, 1);
}
}
}
message.success('删除成功');
}
});
};
const handleOk = async () => { const handleOk = async () => {
try { try {
await formRef.value.validate(); await formRef.value.validate();
const submitValues = { const submitValues = {
...formData ...formData,
captureDate: formData.captureDate
? dayjs(formData.captureDate).format('YYYY-MM-DD')
: undefined,
configNodes: treeData.value //
}; };
emit('ok', submitValues); emit('ok', submitValues);
} catch (error) { } catch (error) {
@ -115,9 +682,26 @@ const initForm = () => {
const values = props.initialValues; const values = props.initialValues;
Object.keys(formData).forEach(key => { Object.keys(formData).forEach(key => {
if (values.hasOwnProperty(key)) { if (values.hasOwnProperty(key)) {
if (key === 'captureDate' && values[key]) {
formData[key] = dayjs(values[key]);
} else {
formData[key] = values[key]; formData[key] = values[key];
} }
}
}); });
//
if (values.configNodes && Array.isArray(values.configNodes)) {
treeData.value = values.configNodes.map((node: any) => ({
...node,
children:
node.children?.map((child: any) => ({
...child
})) || []
}));
} else {
treeData.value = [];
}
} else { } else {
resetForm(); resetForm();
} }
@ -128,6 +712,8 @@ const resetForm = () => {
formRef.value.resetFields(); formRef.value.resetFields();
} }
Object.assign(formData, defaultFormData); Object.assign(formData, defaultFormData);
treeData.value = [];
addingNewNode.value = false;
}; };
const handleCancel = () => { const handleCancel = () => {
@ -151,4 +737,48 @@ defineExpose({
}); });
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss">
.config-tree-container {
margin-top: 16px;
.add-node-row {
display: flex;
align-items: center;
margin-bottom: 16px;
}
}
.tree-node-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
padding-right: 8px;
.tree-node-title {
flex: 1;
}
.tree-node-actions {
opacity: 0;
transition: opacity 0.2s;
}
}
//
.tree-node-wrapper:hover {
.tree-node-actions {
opacity: 1;
}
}
//
.add-child-node-row {
display: flex;
align-items: center;
padding: 8px 0 8px 24px;
margin-top: 4px;
background-color: #f5f5f5;
border-radius: 4px;
}
</style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="config-management-search"> <div class="content-search">
<BasicSearch <BasicSearch
ref="basicSearchRef" ref="basicSearchRef"
:searchList="searchList" :searchList="searchList"
@ -10,9 +10,7 @@
> >
<template #actions> <template #actions>
<a-tooltip title="新增配置"> <a-tooltip title="新增配置">
<a-button @click="props.handleAdd" type="primary"> <a-button @click="props.handleAdd" type="primary"> 新增沿程配置 </a-button>
新增配置
</a-button>
</a-tooltip> </a-tooltip>
</template> </template>
</BasicSearch> </BasicSearch>
@ -20,8 +18,8 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, computed, onMounted } from 'vue'; import { ref, computed, onMounted } from "vue";
import BasicSearch from '@/components/BasicSearch/index.vue'; import BasicSearch from "@/components/BasicSearch/index.vue";
interface Props { interface Props {
handleAdd: () => void; handleAdd: () => void;
@ -30,28 +28,36 @@ interface Props {
const props = defineProps<Props>(); const props = defineProps<Props>();
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'reset', values: any): void; (e: "reset", values: any): void;
(e: 'searchFinish', values: any): void; (e: "searchFinish", values: any): void;
}>(); }>();
const initSearchData = { const initSearchData = {
configName: '' configName: "",
}; };
const searchData = ref<any>({ ...initSearchData }); const searchData = ref<any>({ ...initSearchData });
const searchList: any = computed(() => [ const searchList: any = computed(() => [
{ {
type: 'Input', type: "Input",
name: 'configName', name: "name",
label: '配置项名称', label: "沿程配置名称",
fieldProps: { fieldProps: {
allowClear: true allowClear: true,
} },
} },
{
type: "Input",
name: "rvnm",
label: "所在河段",
fieldProps: {
allowClear: true,
},
},
]); ]);
const onSearchFinish = (values: any) => { const onSearchFinish = (values: any) => {
emit('searchFinish', values); emit("searchFinish", values);
}; };
const onValuesChange = (changedValues: any, allValues: any) => { const onValuesChange = (changedValues: any, allValues: any) => {
@ -59,11 +65,11 @@ const onValuesChange = (changedValues: any, allValues: any) => {
}; };
const handleReset = () => { const handleReset = () => {
emit('reset', initSearchData); emit("reset", initSearchData);
}; };
onMounted(() => { onMounted(() => {
emit('searchFinish', initSearchData); emit("searchFinish", initSearchData);
}); });
</script> </script>
<style lang="scss"></style> <style lang="scss"></style>

View File

@ -1,6 +1,6 @@
<!-- d:\wordpack\WholeProcessPlatform\frontend\src\views\system\map\components\ConfigManagement\index.vue --> <!-- d:\wordpack\WholeProcessPlatform\frontend\src\views\system\map\components\ConfigManagement\index.vue -->
<template> <template>
<div class="config-management"> <div class="content">
<ConfigManagementSearch <ConfigManagementSearch
ref="configManagementSearch" ref="configManagementSearch"
:handle-add="handleAdd" :handle-add="handleAdd"
@ -12,23 +12,22 @@
:data="dataSource" :data="dataSource"
:list-url="fetchConfigData" :list-url="fetchConfigData"
:search-params="searchParams" :search-params="searchParams"
:enable-row-selection="true"
@selection-change="handleSelectionChange"
> >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'"> <template v-if="column.key === 'action'">
<a-space> <div class="flex gap-[6px]">
<a-button type="link" size="small" @click="handleEdit(record)" <a-button class="!p-0" type="link" size="small" @click="handleEdit(record)"
>编辑</a-button >编辑</a-button
> >
<a-button <a-button
class="!p-0"
type="link" type="link"
size="small" size="small"
danger danger
@click="handleDelete(record)" @click="handleDelete(record)"
>删除</a-button >删除</a-button
> >
</a-space> </div>
</template> </template>
<template v-if="column.key === 'configType'"> <template v-if="column.key === 'configType'">
<a-tag :color="getConfigTypeColor(record.configType)"> <a-tag :color="getConfigTypeColor(record.configType)">
@ -48,50 +47,69 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from "vue";
import BasicTable from '@/components/BasicTable/index.vue'; import BasicTable from "@/components/BasicTable/index.vue";
import ConfigManagementSearch from './ConfigManagementSearch.vue'; import ConfigManagementSearch from "./ConfigManagementSearch.vue";
import ConfigManagementForm from './ConfigManagementForm.vue'; import ConfigManagementForm from "./ConfigManagementForm.vue";
import { message } from 'ant-design-vue'; import { message } from "ant-design-vue";
// //
const columns = [ const columns = [
{ {
title: '配置项名称', title: "序号",
dataIndex: 'configName', dataIndex: "index",
key: 'configName', key: "index",
width: 150 width: 60,
align: "center",
customRender: ({ text, record, index }) => index + 1,
}, },
{ {
title: '配置类型', title: "沿程配置名称",
key: 'configType', dataIndex: "name",
dataIndex: 'configType', key: "name",
width: 120
},
{
title: '配置值',
dataIndex: 'configValue',
key: 'configValue',
ellipsis: true
},
{
title: '描述',
dataIndex: 'description',
key: 'description',
ellipsis: true
},
{
title: '更新时间',
dataIndex: 'updateTime',
key: 'updateTime',
width: 180
},
{
title: '操作',
key: 'action',
width: 150, width: 150,
fixed: 'right' },
} {
title: "配置编码",
key: "code",
dataIndex: "code",
width: 120,
},
{
title: "所在河段",
dataIndex: "rvnm",
key: "rvnm",
ellipsis: true,
},
{
title: "创建人",
key: "recordUser",
dataIndex: "recordUser",
},
{
title: "创建时间",
key: "recordTime",
dataIndex: "recordTime",
width: 150,
},
{
title: "更新时间",
key: "modifyTime",
dataIndex: "modifyTime",
width: 150,
},
{
title: "备注",
dataIndex: "remark",
key: "remark",
width: 360,
},
{
title: "操作",
key: "action",
width: 120,
fixed: "right",
},
]; ];
// //
@ -101,52 +119,393 @@ const currentRecord = ref<any | null>(null);
const editModalVisible = ref(false); const editModalVisible = ref(false);
// //
const dataSource = ref([]); const dataSource = ref([
{
_tls: {},
id: "D0E1293DB0324E729AB074D8BD61C745",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "0001-01-01 00:00:00",
modifyTime: "0001-01-01 00:00:00",
displayRecordUser: null,
isolateType: null,
name: "雅砻江通用配置",
code: "common",
rvcd: "SJLY176",
rvnm: "雅砻江",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "E8E0425BFA8143BCB2D0FC9C45FE2853",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "0001-01-01 00:00:00",
modifyTime: "0001-01-01 00:00:00",
displayRecordUser: null,
isolateType: null,
name: "澜沧江干流通用配置",
code: "common",
rvcd: "SJLY126",
rvnm: "澜沧江干流",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "9AE90200DF324B6981C85129D5288C8E",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:08",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "清江通用配置",
code: "common",
rvcd: "SJLY109",
rvnm: "清江",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "F2EC0A6870534C14810AECA990E092D6",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:09",
modifyTime: "2024-07-08 16:25:05",
displayRecordUser: null,
isolateType: null,
name: "澧水通用配置",
code: "common",
rvcd: "SJLY110",
rvnm: "澧水",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "F99C360B47B14F10AAE688534ECAFA87",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:10",
modifyTime: "2024-06-14 15:25:10",
displayRecordUser: null,
isolateType: null,
name: "红水河通用配置",
code: "common",
rvcd: "SJLY130",
rvnm: "红水河",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "3E8E27C07F5B41D9A3915E969D9E1BB8",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:11",
modifyTime: "2024-07-18 17:29:22",
displayRecordUser: null,
isolateType: null,
name: "大渡河通用配置",
code: "common",
rvcd: "SJLY148",
rvnm: "大渡河",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "BB4FBC900D2C462080BDC7638EB4459F",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:12",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "洞庭湖环湖区通用配置",
code: "common",
rvcd: "SJLY155",
rvnm: "洞庭湖环湖区",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "8E707E0628414DC2BFC42CFAA32D2A76",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:13",
modifyTime: "2024-05-29 10:08:26",
displayRecordUser: null,
isolateType: null,
name: "丰满以下通用配置",
code: "common",
rvcd: "SJLY168",
rvnm: "丰满以下",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "BB911176EE164E3F85B6DABF1F6C3F14",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:13",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "丰满以上通用配置",
code: "common",
rvcd: "SJLY169",
rvnm: "丰满以上",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "3246C417FA544C3592FA367B15F90927",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:15",
modifyTime: "2024-07-08 16:14:42",
displayRecordUser: null,
isolateType: null,
name: "南盘江通用配置",
code: "common",
rvcd: "SJLY178",
rvnm: "南盘江",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "2589AC1BFB5549F2AD497D3EDB7C45A9",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:16",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "瓯江温溪以上通用配置",
code: "common",
rvcd: "SJLY194",
rvnm: "瓯江温溪以上",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "2A450ADE4A884F90A35866C89FF9A012",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:16",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "富春江水库以上通用配置",
code: "common",
rvcd: "SJLY195",
rvnm: "富春江水库以上",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "761683529B374922864910CD334BE7D3",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:17",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "黄河干流中游通用配置",
code: "common",
rvcd: "SJLY1C",
rvnm: "黄河干流中游",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "2A64FFA5D7944CE9A7D3C844F5A7B7AA",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:18",
modifyTime: "2024-08-07 10:29:42",
displayRecordUser: null,
isolateType: null,
name: "黄河干流上游通用配置",
code: "common",
rvcd: "SJLY1U",
rvnm: "黄河干流上游",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "1B0ECE32A8F74E47B0B5EB6774476728",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:19",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "长江干流通用配置",
code: "common",
rvcd: "SJLY208",
rvnm: "长江干流",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "96600AD12B9645D9A86B0754BE03F9C3",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:20",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "资水通用配置",
code: "common",
rvcd: "SJLY214",
rvnm: "资水",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "2B70280D51D44398815C99EF700A6B55",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:20",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "沅水通用配置",
code: "common",
rvcd: "SJLY216",
rvnm: "沅水",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "F9CD484CBE254AD0A7B7D3D058443455",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:21",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "赣江通用配置",
code: "common",
rvcd: "SJLY217",
rvnm: "赣江",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "0AA0EA96FA5649FEA3B7881FC6F0C85C",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:22",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "黔浔江及西江通用配置",
code: "common",
rvcd: "SJLY25",
rvnm: "黔浔江及西江",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
{
_tls: {},
id: "533473B0349546CC82B50C21CF843101",
recordUser: "20210802-1454-3403-3753-a22ed7009522",
recordTime: "2023-08-04 17:46:23",
modifyTime: null,
displayRecordUser: null,
isolateType: null,
name: "闽江上游通用配置",
code: "common",
rvcd: "SJLY33",
rvnm: "闽江上游",
remark: null,
recordUserName: "20210802-1454-3403-3753-a22ed7009522",
departmentId: null,
displayDepartment: null,
},
]);
// //
const getConfigTypeColor = (type: string) => { const getConfigTypeColor = (type: string) => {
const colorMap: Record<string, string> = { const colorMap: Record<string, string> = {
系统配置: 'blue', 系统配置: "blue",
显示配置: 'green', 显示配置: "green",
业务配置: 'orange' 业务配置: "orange",
}; };
return colorMap[type] || 'default'; return colorMap[type] || "default";
}; };
// //
const fetchConfigData = (params: any) => { const fetchConfigData = (params: any) => {
return new Promise(resolve => { return new Promise((resolve) => {
setTimeout(() => { setTimeout(() => {
resolve({ resolve({
data: { data: {
records: [ records: [
{ {
id: 1, id: 1,
configName: '默认缩放级别', configName: "默认缩放级别",
configType: '显示配置', configType: "显示配置",
configValue: '10', configValue: "10",
description: '地图默认显示的缩放级别', description: "地图默认显示的缩放级别",
updateTime: '2023-05-15 10:30:00' updateTime: "2023-05-15 10:30:00",
}, },
{ {
id: 2, id: 2,
configName: '数据刷新间隔', configName: "数据刷新间隔",
configType: '系统配置', configType: "系统配置",
configValue: '300', configValue: "300",
description: '数据自动刷新的时间间隔(秒)', description: "数据自动刷新的时间间隔(秒)",
updateTime: '2023-06-20 14:45:00' updateTime: "2023-06-20 14:45:00",
}, },
{ {
id: 3, id: 3,
configName: '预警阈值', configName: "预警阈值",
configType: '业务配置', configType: "业务配置",
configValue: '85%', configValue: "85%",
description: '触发预警的阈值百分比', description: "触发预警的阈值百分比",
updateTime: '2023-07-10 09:15:00' updateTime: "2023-07-10 09:15:00",
} },
], ],
total: 3 total: 3,
} },
}); });
}, 500); }, 500);
}); });
@ -176,11 +535,6 @@ const onSearchFinish = (values: any) => {
// //
const handleReset = (params: any) => {}; const handleReset = (params: any) => {};
//
const handleSelectionChange = (selectedRows: any[]) => {
console.log('选中的行:', selectedRows);
};
// //
const editModalCancel = () => { const editModalCancel = () => {
editModalVisible.value = false; editModalVisible.value = false;

View File

@ -29,16 +29,63 @@
placeholder="请输入图层编码" placeholder="请输入图层编码"
/> />
</a-form-item> </a-form-item>
<a-form-item label="标签显示级别" name="treeLevel"> <a-form-item label="图层类型" name="type" v-if="isInterface">
<a-select
:options="typeOpiton"
v-model:value="formData.type"
:fieldNames="{
label: 'dictName',
value: 'itemCode',
}"
style="width: 100%"
placeholder="请输入图层类型"
/>
</a-form-item>
<a-form-item label="标签显示级别" name="treeLevel" v-if="!isInterface">
<a-input-number <a-input-number
v-model:value="formData.treeLevel" v-model:value="formData.treeLevel"
style="width: 100%" style="width: 100%"
placeholder="请输入标签显示级别" placeholder="请输入标签显示级别"
:min="0" :min="0"
:max="24"
:step="1" :step="1"
/> />
</a-form-item> </a-form-item>
<a-form-item label="备注" name="description"> <a-form-item label="锚点接口" name="url" v-if="isInterface">
<a-input
v-model:value="formData.url"
style="width: 100%"
placeholder="请输入锚点接口"
/>
</a-form-item>
<a-form-item
label="三维接口"
name="urlThd"
v-if="isInterface && formData.type === 'geojson'"
>
<a-input
v-model:value="formData.urlThd"
style="width: 100%"
placeholder="请输入三维接口"
/>
</a-form-item>
<a-form-item
label="gisJson"
name="paramJson"
v-if="isInterface && formData.type === 'geojson'"
>
<a-textarea
rows="4"
v-model:value="formData.paramJson"
style="width: 100%"
placeholder="请输入gisJson"
/>
</a-form-item>
<a-form-item
label="备注"
name="description"
v-if="!isInterface || formData.type === 'geojson'"
>
<a-textarea <a-textarea
rows="4" rows="4"
v-model:value="formData.description" v-model:value="formData.description"
@ -51,46 +98,42 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'; import { ref, reactive, computed, watch } from "vue";
import { message } from 'ant-design-vue'; import { message } from "ant-design-vue";
import type { Rule } from 'ant-design-vue/es/form'; import type { Rule } from "ant-design-vue/es/form";
import { getDictItemsByCode } from "@/api/dict";
// Props // Props
interface Props { interface Props {
visible: boolean; visible: boolean;
initialValues?: any | null; initialValues?: any | null;
loading?: boolean; loading?: boolean;
isInterface?: boolean;
} }
// //
const localLoading = ref(false); const localLoading = ref(false);
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
visible: false, visible: false,
initialValues: null, initialValues: null,
loading: false loading: false,
isInterface: false,
}); });
const modalVisible = computed({ const modalVisible = computed({
get: () => props.visible, get: () => props.visible,
set: val => emit('update:visible', val) set: (val) => emit("update:visible", val),
}); });
// Emits // Emits
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'update:visible', value: boolean): void; (e: "update:visible", value: boolean): void;
(e: 'cancel'): void; (e: "cancel"): void;
(e: 'ok', values: any): void; (e: "ok", values: any, type: string): void;
(
e: 'preview-click',
record: any,
type: string,
index: number,
action: string
): void;
}>(); }>();
// //
const formRef = ref(); const formRef = ref();
// 1. // 1.
const bodyLengthError = ref<string>(''); const bodyLengthError = ref<string>("");
const weightError = ref<string>(''); const weightError = ref<string>("");
// //
const defaultFormData = reactive({ const defaultFormData = reactive({
@ -98,16 +141,17 @@ const defaultFormData = reactive({
title: undefined, title: undefined,
code: undefined, code: undefined,
treeLevel: undefined, treeLevel: undefined,
description: undefined description: undefined,
parentId: undefined,
}); });
const typeOpiton = ref<any>([]);
const formData: any = reactive({ ...defaultFormData }); const formData: any = reactive({ ...defaultFormData });
// //
const rules: Record<string, Rule[]> = { const rules: Record<string, Rule[]> = {
title: [{ required: true, message: '请输入图层名称', trigger: 'blur' }], title: [{ required: true, message: "请输入图层名称", trigger: "blur" }],
code: [{ required: true, message: '请输入图层编码', trigger: 'blur' }], code: [{ required: true, message: "请输入图层编码", trigger: "blur" }],
treeLevel: [ type: [{ required: true, message: "请输入图层类型", trigger: "change" }],
{ required: true, message: '请输入标签显示级别', trigger: 'blur' } treeLevel: [{ required: true, message: "请输入标签显示级别", trigger: "blur" }],
]
}; };
// //
@ -119,20 +163,23 @@ const handleOk = async () => {
await formRef.value.validate(); await formRef.value.validate();
// //
const submitValues = { const submitValues = {
...formData ...formData,
}; };
emit('ok', submitValues); emit("ok", submitValues, "form");
} catch (error) { } catch (error) {
console.error('Validate Failed:', error); console.error("Validate Failed:", error);
message.error('请检查表单填写是否正确'); message.error("请检查表单填写是否正确");
} }
}; };
const initForm = () => { const initForm = () => {
if (props.initialValues) { if (props.initialValues) {
// --- --- // --- ---
const values = props.initialValues; const values = props.initialValues;
if (props.isInterface) {
initType();
}
// //
Object.keys(formData).forEach(key => { Object.keys(formData).forEach((key) => {
// initialValues // initialValues
if (values.hasOwnProperty(key)) { if (values.hasOwnProperty(key)) {
formData[key] = values[key]; formData[key] = values[key];
@ -142,6 +189,11 @@ const initForm = () => {
resetForm(); resetForm();
} }
}; };
const initType = () => {
getDictItemsByCode({ dictCode: "LayerTypeCode" }).then((res) => {
typeOpiton.value = res.data;
});
};
// //
const resetForm = () => { const resetForm = () => {
if (formRef.value) { if (formRef.value) {
@ -149,20 +201,20 @@ const resetForm = () => {
} }
Object.assign(formData, defaultFormData); Object.assign(formData, defaultFormData);
// //
bodyLengthError.value = ''; bodyLengthError.value = "";
weightError.value = ''; weightError.value = "";
}; };
// //
const handleCancel = () => { const handleCancel = () => {
emit('update:visible', false); emit("update:visible", false);
emit('cancel'); emit("cancel");
resetForm(); resetForm();
}; };
watch( watch(
() => props.visible, () => props.visible,
newVisible => { (newVisible) => {
if (newVisible) { if (newVisible) {
initForm(); initForm();
} }
@ -171,7 +223,7 @@ watch(
); );
// //
defineExpose({ defineExpose({
localLoading localLoading,
}); });
</script> </script>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="guoYuSheShiShuJuTianBao-search"> <div class="content-search">
<BasicSearch <BasicSearch
ref="basicSearchRef" ref="basicSearchRef"
:searchList="searchList" :searchList="searchList"
@ -10,9 +10,7 @@
> >
<template #actions> <template #actions>
<a-tooltip title="新增图层"> <a-tooltip title="新增图层">
<a-button @click="props.handleAdd" type="primary"> <a-button @click="props.handleAdd" type="primary"> 新增图层 </a-button>
新增图层
</a-button>
</a-tooltip> </a-tooltip>
</template> </template>
</BasicSearch> </BasicSearch>
@ -20,40 +18,40 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, computed, onMounted, watch } from 'vue'; import { ref, computed, onMounted, watch } from "vue";
import BasicSearch from '@/components/BasicSearch/index.vue'; // import BasicSearch from "@/components/BasicSearch/index.vue"; //
interface Props { interface Props {
handleAdd: () => void; handleAdd: (record: any) => void;
} }
const props = defineProps<Props>(); const props = defineProps<Props>();
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'reset', values: any): void; (e: "reset", values: any): void;
(e: 'searchFinish', values: any): void; (e: "searchFinish", values: any): void;
}>(); }>();
const initSearchData = { const initSearchData = {
title: '' title: "",
}; };
const searchData = ref<any>({ ...initSearchData }); const searchData = ref<any>({ ...initSearchData });
const searchList: any = computed(() => [ const searchList: any = computed(() => [
{ {
type: 'Input', type: "Input",
name: 'title', name: "title",
label: '图层名称', label: "图层名称",
fieldProps: { fieldProps: {
allowClear: true allowClear: true,
} },
} },
]); ]);
// --- Methods --- // --- Methods ---
// 2. // 2.
const onSearchFinish = (values: any) => { const onSearchFinish = (values: any) => {
emit('searchFinish', values); emit("searchFinish", values);
}; };
// //
const onValuesChange = (changedValues: any, allValues: any) => { const onValuesChange = (changedValues: any, allValues: any) => {
@ -61,11 +59,11 @@ const onValuesChange = (changedValues: any, allValues: any) => {
}; };
// //
const handleReset = () => { const handleReset = () => {
emit('reset', initSearchData); emit("reset", initSearchData);
}; };
onMounted(() => { onMounted(() => {
emit('searchFinish', initSearchData); emit("searchFinish", initSearchData);
}); });
</script> </script>
<style lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -137,7 +137,7 @@ const modalVisible = computed({
const emit = defineEmits<{ const emit = defineEmits<{
(e: "update:visible", value: boolean): void; (e: "update:visible", value: boolean): void;
(e: "cancel"): void; (e: "cancel"): void;
(e: "ok", values: any): void; (e: "ok", values: any, type: string): void;
}>(); }>();
const formRef = ref(); const formRef = ref();
@ -167,8 +167,9 @@ const handleOk = async () => {
await formRef.value.validate(); await formRef.value.validate();
const submitValues = { const submitValues = {
...formData, ...formData,
dataType: 2,
}; };
emit("ok", submitValues); emit("ok", submitValues, "form");
} catch (error) { } catch (error) {
console.error("Validate Failed:", error); console.error("Validate Failed:", error);
message.error("请检查表单填写是否正确"); message.error("请检查表单填写是否正确");

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="legend-data-search"> <div class="content-search">
<BasicSearch <BasicSearch
ref="basicSearchRef" ref="basicSearchRef"
:searchList="searchList" :searchList="searchList"
@ -23,6 +23,7 @@ import BasicSearch from "@/components/BasicSearch/index.vue";
interface Props { interface Props {
handleAdd: () => void; handleAdd: () => void;
options: any[];
} }
const props = defineProps<Props>(); const props = defineProps<Props>();
@ -34,9 +35,9 @@ const emit = defineEmits<{
const initSearchData = { const initSearchData = {
name: "", name: "",
parentName: "", parentId: "",
}; };
const options = ref<any>([]);
const searchData = ref<any>({ ...initSearchData }); const searchData = ref<any>({ ...initSearchData });
const searchList: any = computed(() => [ const searchList: any = computed(() => [
{ {
@ -48,9 +49,11 @@ const searchList: any = computed(() => [
}, },
}, },
{ {
type: "Select", type: "TreeSelect",
name: "code", name: "parentId",
label: "父级图例", label: "父级图例",
fieldNames: { label: "name", value: "id", children: "childrenList" },
options: props.options,
fieldProps: { fieldProps: {
allowClear: true, allowClear: true,
}, },
@ -68,9 +71,8 @@ const onValuesChange = (changedValues: any, allValues: any) => {
const handleReset = () => { const handleReset = () => {
emit("reset", initSearchData); emit("reset", initSearchData);
}; };
onMounted(() => { onMounted(() => {
emit("searchFinish", initSearchData); emit("searchFinish", initSearchData);
}); });
</script> </script>
<style lang="scss"></style> <style scoped lang="scss"></style>

File diff suppressed because it is too large Load Diff

View File

@ -81,7 +81,7 @@ const modalVisible = computed({
const emit = defineEmits<{ const emit = defineEmits<{
(e: "update:visible", value: boolean): void; (e: "update:visible", value: boolean): void;
(e: "cancel"): void; (e: "cancel"): void;
(e: "ok", values: any): void; (e: "ok", values: any, record: any): void;
}>(); }>();
const formRef = ref(); const formRef = ref();
@ -108,8 +108,9 @@ const handleOk = async () => {
await formRef.value.validate(); await formRef.value.validate();
const submitValues = { const submitValues = {
...formData, ...formData,
dataType: 1,
}; };
emit("ok", submitValues); emit("ok", submitValues, "form");
} catch (error) { } catch (error) {
console.error("Validate Failed:", error); console.error("Validate Failed:", error);
message.error("请检查表单填写是否正确"); message.error("请检查表单填写是否正确");

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="legend-structure-search"> <div class="content-search">
<BasicSearch <BasicSearch
ref="basicSearchRef" ref="basicSearchRef"
:searchList="searchList" :searchList="searchList"
@ -22,7 +22,7 @@ import { ref, computed, onMounted } from "vue";
import BasicSearch from "@/components/BasicSearch/index.vue"; import BasicSearch from "@/components/BasicSearch/index.vue";
interface Props { interface Props {
handleAdd: () => void; handleAdd: (record: any) => void;
} }
const props = defineProps<Props>(); const props = defineProps<Props>();
@ -64,4 +64,4 @@ onMounted(() => {
emit("searchFinish", initSearchData); emit("searchFinish", initSearchData);
}); });
</script> </script>
<style lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="station-management-search"> <div class="content-search">
<BasicSearch <BasicSearch
ref="basicSearchRef" ref="basicSearchRef"
:searchList="searchList" :searchList="searchList"
@ -10,9 +10,7 @@
> >
<template #actions> <template #actions>
<a-tooltip title="新增电站"> <a-tooltip title="新增电站">
<a-button @click="props.handleAdd" type="primary"> <a-button @click="props.handleAdd" type="primary"> 新增电站 </a-button>
新增电站
</a-button>
</a-tooltip> </a-tooltip>
</template> </template>
</BasicSearch> </BasicSearch>
@ -20,8 +18,8 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, computed, onMounted } from 'vue'; import { ref, computed, onMounted } from "vue";
import BasicSearch from '@/components/BasicSearch/index.vue'; import BasicSearch from "@/components/BasicSearch/index.vue";
interface Props { interface Props {
handleAdd: () => void; handleAdd: () => void;
@ -30,28 +28,28 @@ interface Props {
const props = defineProps<Props>(); const props = defineProps<Props>();
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'reset', values: any): void; (e: "reset", values: any): void;
(e: 'searchFinish', values: any): void; (e: "searchFinish", values: any): void;
}>(); }>();
const initSearchData = { const initSearchData = {
stationName: '' stationName: "",
}; };
const searchData = ref<any>({ ...initSearchData }); const searchData = ref<any>({ ...initSearchData });
const searchList: any = computed(() => [ const searchList: any = computed(() => [
{ {
type: 'Input', type: "Input",
name: 'stationName', name: "stationName",
label: '电站名称', label: "电站名称",
fieldProps: { fieldProps: {
allowClear: true allowClear: true,
} },
} },
]); ]);
const onSearchFinish = (values: any) => { const onSearchFinish = (values: any) => {
emit('searchFinish', values); emit("searchFinish", values);
}; };
const onValuesChange = (changedValues: any, allValues: any) => { const onValuesChange = (changedValues: any, allValues: any) => {
@ -59,11 +57,11 @@ const onValuesChange = (changedValues: any, allValues: any) => {
}; };
const handleReset = () => { const handleReset = () => {
emit('reset', initSearchData); emit("reset", initSearchData);
}; };
onMounted(() => { onMounted(() => {
emit('searchFinish', initSearchData); emit("searchFinish", initSearchData);
}); });
</script> </script>
<style lang="scss"></style> <style lang="scss"></style>

View File

@ -1,6 +1,6 @@
<!-- d:\wordpack\WholeProcessPlatform\frontend\src\views\system\map\components\StationManagement\index.vue --> <!-- d:\wordpack\WholeProcessPlatform\frontend\src\views\system\map\components\StationManagement\index.vue -->
<template> <template>
<div class="station-management"> <div class="content">
<StationManagementSearch <StationManagementSearch
ref="stationManagementSearch" ref="stationManagementSearch"
:handle-add="handleAdd" :handle-add="handleAdd"
@ -18,21 +18,15 @@
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'"> <template v-if="column.key === 'action'">
<a-space> <a-space>
<a-button type="link" size="small" @click="handleEdit(record)" <a-button type="link" size="small" @click="handleEdit(record)">编辑</a-button>
>编辑</a-button <a-button type="link" size="small" danger @click="handleDelete(record)"
>
<a-button
type="link"
size="small"
danger
@click="handleDelete(record)"
>删除</a-button >删除</a-button
> >
</a-space> </a-space>
</template> </template>
<template v-if="column.key === 'status'"> <template v-if="column.key === 'status'">
<a-tag :color="record.status === 'running' ? 'green' : 'red'"> <a-tag :color="record.status === 'running' ? 'green' : 'red'">
{{ record.status === 'running' ? '运行中' : '停运' }} {{ record.status === "running" ? "运行中" : "停运" }}
</a-tag> </a-tag>
</template> </template>
</template> </template>
@ -48,50 +42,50 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from "vue";
import BasicTable from '@/components/BasicTable/index.vue'; import BasicTable from "@/components/BasicTable/index.vue";
import StationManagementSearch from './StationManagementSearch.vue'; import StationManagementSearch from "./StationManagementSearch.vue";
import StationManagementForm from './StationManagementForm.vue'; import StationManagementForm from "./StationManagementForm.vue";
import { message } from 'ant-design-vue'; import { message } from "ant-design-vue";
// //
const columns = [ const columns = [
{ {
title: '电站名称', title: "电站名称",
dataIndex: 'stationName', dataIndex: "stationName",
key: 'stationName', key: "stationName",
width: 150
},
{
title: '所属流域',
dataIndex: 'basin',
key: 'basin',
width: 120
},
{
title: '装机容量(MW)',
dataIndex: 'capacity',
key: 'capacity',
width: 120
},
{
title: '状态',
key: 'status',
dataIndex: 'status',
width: 100
},
{
title: '位置坐标',
dataIndex: 'coordinates',
key: 'coordinates',
ellipsis: true
},
{
title: '操作',
key: 'action',
width: 150, width: 150,
fixed: 'right' },
} {
title: "所属流域",
dataIndex: "basin",
key: "basin",
width: 120,
},
{
title: "装机容量(MW)",
dataIndex: "capacity",
key: "capacity",
width: 120,
},
{
title: "状态",
key: "status",
dataIndex: "status",
width: 100,
},
{
title: "位置坐标",
dataIndex: "coordinates",
key: "coordinates",
ellipsis: true,
},
{
title: "操作",
key: "action",
width: 150,
fixed: "right",
},
]; ];
// //
@ -105,38 +99,38 @@ const dataSource = ref([]);
// //
const fetchStationData = (params: any) => { const fetchStationData = (params: any) => {
return new Promise(resolve => { return new Promise((resolve) => {
setTimeout(() => { setTimeout(() => {
resolve({ resolve({
data: { data: {
records: [ records: [
{ {
id: 1, id: 1,
stationName: '三峡电站', stationName: "三峡电站",
basin: '长江流域', basin: "长江流域",
capacity: 22500, capacity: 22500,
status: 'running', status: "running",
coordinates: '111.29,30.83' coordinates: "111.29,30.83",
}, },
{ {
id: 2, id: 2,
stationName: '葛洲坝电站', stationName: "葛洲坝电站",
basin: '长江流域', basin: "长江流域",
capacity: 2715, capacity: 2715,
status: 'running', status: "running",
coordinates: '111.28,30.75' coordinates: "111.28,30.75",
}, },
{ {
id: 3, id: 3,
stationName: '溪洛渡电站', stationName: "溪洛渡电站",
basin: '金沙江流域', basin: "金沙江流域",
capacity: 13860, capacity: 13860,
status: 'stopped', status: "stopped",
coordinates: '103.65,28.25' coordinates: "103.65,28.25",
} },
], ],
total: 3 total: 3,
} },
}); });
}, 500); }, 500);
}); });
@ -168,7 +162,7 @@ const handleReset = (params: any) => {};
// //
const handleSelectionChange = (selectedRows: any[]) => { const handleSelectionChange = (selectedRows: any[]) => {
console.log('选中的行:', selectedRows); console.log("选中的行:", selectedRows);
}; };
// //

View File

@ -5,6 +5,7 @@
:confirm-loading="localLoading" :confirm-loading="localLoading"
width="600px" width="600px"
:destroy-on-close="true" :destroy-on-close="true"
ok-text="保存"
@cancel="handleCancel" @cancel="handleCancel"
@ok="handleOk" @ok="handleOk"
> >
@ -15,39 +16,72 @@
name="edit_form" name="edit_form"
:labelCol="{ span: 5 }" :labelCol="{ span: 5 }"
> >
<a-form-item label="项目名称" name="projectName"> <a-form-item label="倾斜影像名称" name="stnm">
<a-input <a-input
v-model:value="formData.projectName" v-model:value="formData.stnm"
style="width: 100%" style="width: 100%"
placeholder="请输入项目名称" placeholder="请输入倾斜影像名称"
/> />
</a-form-item> </a-form-item>
<a-form-item label="拍摄日期" name="captureDate"> <a-form-item label="所在河段" name="hbrvcdName">
<a-date-picker
v-model:value="formData.captureDate"
style="width: 100%"
placeholder="请选择拍摄日期"
/>
</a-form-item>
<a-form-item label="文件大小" name="fileSize">
<a-input <a-input
v-model:value="formData.fileSize" v-model:value="formData.hbrvcdName"
style="width: 100%" style="width: 100%"
placeholder="请输入文件大小" placeholder="请输入所在河段"
/> />
</a-form-item> </a-form-item>
<a-form-item label="状态" name="status"> <a-form-item label="所属电站" name="ennm">
<a-select v-model:value="formData.status" style="width: 100%"> <a-input
<a-select-option value="processed">已处理</a-select-option> v-model:value="formData.ennm"
<a-select-option value="pending">待处理</a-select-option> style="width: 100%"
</a-select> placeholder="请输入所属电站"
/>
</a-form-item> </a-form-item>
<a-form-item label="覆盖区域" name="coverageArea"> <a-form-item label="倾斜影像URL" name="url">
<a-input
v-model:value="formData.url"
style="width: 100%"
placeholder="请输入倾斜影像URL"
/>
</a-form-item>
<a-form-item label="模型坐标" name="location">
<a-textarea <a-textarea
v-model:value="formData.coverageArea" v-model:value="formData.location"
:rows="4"
style="width: 100%" style="width: 100%"
placeholder="请输入覆盖区域" placeholder="请输入模型坐标"
:rows="3" />
</a-form-item>
<a-form-item label="模型精度" name="accuracy">
<a-input-number
v-model:value="formData.accuracy"
style="width: 100%"
placeholder="请输入模型精度"
:min="0"
/>
</a-form-item>
<a-form-item label="边界范围" name="boundary">
<a-textarea
v-model:value="formData.boundary"
:rows="4"
style="width: 100%"
placeholder="请输入边界范围"
/>
</a-form-item>
<a-form-item label="模型高度" name="height">
<a-input-number
v-model:value="formData.height"
style="width: 100%"
placeholder="请输入模型高度"
:min="0"
/>
</a-form-item>
<a-form-item label="备注" name="description">
<a-textarea
v-model:value="formData.description"
:rows="4"
style="width: 100%"
placeholder="请输入备注"
/> />
</a-form-item> </a-form-item>
</a-form> </a-form>
@ -55,10 +89,10 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'; import { ref, reactive, computed, watch } from "vue";
import { message } from 'ant-design-vue'; import { message } from "ant-design-vue";
import type { Rule } from 'ant-design-vue/es/form'; import type { Rule } from "ant-design-vue/es/form";
import dayjs from 'dayjs'; import dayjs from "dayjs";
interface Props { interface Props {
visible: boolean; visible: boolean;
@ -70,18 +104,18 @@ const localLoading = ref(false);
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
visible: false, visible: false,
initialValues: null, initialValues: null,
loading: false loading: false,
}); });
const modalVisible = computed({ const modalVisible = computed({
get: () => props.visible, get: () => props.visible,
set: val => emit('update:visible', val) set: (val) => emit("update:visible", val),
}); });
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'update:visible', value: boolean): void; (e: "update:visible", value: boolean): void;
(e: 'cancel'): void; (e: "cancel"): void;
(e: 'ok', values: any): void; (e: "ok", values: any): void;
}>(); }>();
const formRef = ref(); const formRef = ref();
@ -92,15 +126,16 @@ const defaultFormData = reactive({
captureDate: undefined, captureDate: undefined,
fileSize: undefined, fileSize: undefined,
status: undefined, status: undefined,
coverageArea: undefined coverageArea: undefined,
}); });
const formData: any = reactive({ ...defaultFormData }); const formData: any = reactive({ ...defaultFormData });
const rules: Record<string, Rule[]> = { const rules: Record<string, Rule[]> = {
projectName: [{ required: true, message: '请输入项目名称', trigger: 'blur' }], stnm: [{ required: true, message: "请输入倾斜影像名称", trigger: "blur" }],
captureDate: [ hbrvcdName: [{ required: true, message: "请输入所在河段", trigger: "blur" }],
{ required: true, message: '请选择拍摄日期', trigger: 'change' } ennm: [{ required: true, message: "请输入所属电站", trigger: "blur" }],
] url: [{ required: true, message: "请输入倾斜影像URL", trigger: "blur" }],
location: [{ required: true, message: "请输入模型坐标", trigger: "blur" }],
}; };
const isEdit = computed(() => !!props.initialValues); const isEdit = computed(() => !!props.initialValues);
@ -111,22 +146,22 @@ const handleOk = async () => {
const submitValues = { const submitValues = {
...formData, ...formData,
captureDate: formData.captureDate captureDate: formData.captureDate
? dayjs(formData.captureDate).format('YYYY-MM-DD') ? dayjs(formData.captureDate).format("YYYY-MM-DD")
: undefined : undefined,
}; };
emit('ok', submitValues); emit("ok", submitValues);
} catch (error) { } catch (error) {
console.error('Validate Failed:', error); console.error("Validate Failed:", error);
message.error('请检查表单填写是否正确'); message.error("请检查表单填写是否正确");
} }
}; };
const initForm = () => { const initForm = () => {
if (props.initialValues) { if (props.initialValues) {
const values = props.initialValues; const values = props.initialValues;
Object.keys(formData).forEach(key => { Object.keys(formData).forEach((key) => {
if (values.hasOwnProperty(key)) { if (values.hasOwnProperty(key)) {
if (key === 'captureDate' && values[key]) { if (key === "captureDate" && values[key]) {
formData[key] = dayjs(values[key]); formData[key] = dayjs(values[key]);
} else { } else {
formData[key] = values[key]; formData[key] = values[key];
@ -146,14 +181,14 @@ const resetForm = () => {
}; };
const handleCancel = () => { const handleCancel = () => {
emit('update:visible', false); emit("update:visible", false);
emit('cancel'); emit("cancel");
resetForm(); resetForm();
}; };
watch( watch(
() => props.visible, () => props.visible,
newVisible => { (newVisible) => {
if (newVisible) { if (newVisible) {
initForm(); initForm();
} }
@ -162,7 +197,7 @@ watch(
); );
defineExpose({ defineExpose({
localLoading localLoading,
}); });
</script> </script>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="tilt-photo-management-search"> <div class="content-search">
<BasicSearch <BasicSearch
ref="basicSearchRef" ref="basicSearchRef"
:searchList="searchList" :searchList="searchList"
@ -10,9 +10,7 @@
> >
<template #actions> <template #actions>
<a-tooltip title="新增倾斜摄影"> <a-tooltip title="新增倾斜摄影">
<a-button @click="props.handleAdd" type="primary"> <a-button @click="props.handleAdd" type="primary"> 新增倾斜摄影 </a-button>
新增倾斜摄影
</a-button>
</a-tooltip> </a-tooltip>
</template> </template>
</BasicSearch> </BasicSearch>
@ -20,8 +18,8 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, computed, onMounted } from 'vue'; import { ref, computed, onMounted } from "vue";
import BasicSearch from '@/components/BasicSearch/index.vue'; import BasicSearch from "@/components/BasicSearch/index.vue";
interface Props { interface Props {
handleAdd: () => void; handleAdd: () => void;
@ -30,28 +28,36 @@ interface Props {
const props = defineProps<Props>(); const props = defineProps<Props>();
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'reset', values: any): void; (e: "reset", values: any): void;
(e: 'searchFinish', values: any): void; (e: "searchFinish", values: any): void;
}>(); }>();
const initSearchData = { const initSearchData = {
projectName: '' stnm: "",
}; };
const searchData = ref<any>({ ...initSearchData }); const searchData = ref<any>({ ...initSearchData });
const searchList: any = computed(() => [ const searchList: any = computed(() => [
{ {
type: 'Input', type: "Input",
name: 'projectName', name: "stnm",
label: '项目名称', label: "倾斜影像名称",
fieldProps: { fieldProps: {
allowClear: true allowClear: true,
} },
} },
{
type: "Select",
name: "hbrvcdName",
label: "所在河段",
fieldProps: {
allowClear: true,
},
},
]); ]);
const onSearchFinish = (values: any) => { const onSearchFinish = (values: any) => {
emit('searchFinish', values); emit("searchFinish", values);
}; };
const onValuesChange = (changedValues: any, allValues: any) => { const onValuesChange = (changedValues: any, allValues: any) => {
@ -59,11 +65,11 @@ const onValuesChange = (changedValues: any, allValues: any) => {
}; };
const handleReset = () => { const handleReset = () => {
emit('reset', initSearchData); emit("reset", initSearchData);
}; };
onMounted(() => { onMounted(() => {
emit('searchFinish', initSearchData); emit("searchFinish", initSearchData);
}); });
</script> </script>
<style lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -1,6 +1,6 @@
<!-- d:\wordpack\WholeProcessPlatform\frontend\src\views\system\map\components\TiltPhotoManagement\index.vue --> <!-- d:\wordpack\WholeProcessPlatform\frontend\src\views\system\map\components\TiltPhotoManagement\index.vue -->
<template> <template>
<div class="tilt-photo-management"> <div class="content">
<TiltPhotoManagementSearch <TiltPhotoManagementSearch
ref="tiltPhotoManagementSearch" ref="tiltPhotoManagementSearch"
:handle-add="handleAdd" :handle-add="handleAdd"
@ -12,26 +12,26 @@
:data="dataSource" :data="dataSource"
:list-url="fetchTiltPhotoData" :list-url="fetchTiltPhotoData"
:search-params="searchParams" :search-params="searchParams"
:enable-row-selection="true"
@selection-change="handleSelectionChange"
> >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'"> <template v-if="column.key === 'action'">
<a-space> <div class="flex gap-[6px]">
<a-button type="link" size="small" @click="handlePreview(record)" <a-button
>预览</a-button class="!p-0"
> type="link"
<a-button type="link" size="small" @click="handleEdit(record)" size="small"
@click="handleEdit(record)"
>编辑</a-button >编辑</a-button
> >
<a-button <a-button
class="!p-0"
type="link" type="link"
size="small" size="small"
danger danger
@click="handleDelete(record)" @click="handleDelete(record)"
>删除</a-button >删除</a-button
> >
</a-space> </div>
</template> </template>
<template v-if="column.key === 'status'"> <template v-if="column.key === 'status'">
<a-tag :color="record.status === 'processed' ? 'green' : 'orange'"> <a-tag :color="record.status === 'processed' ? 'green' : 'orange'">
@ -60,39 +60,58 @@ import { message } from 'ant-design-vue';
// //
const columns = [ const columns = [
{ {
title: '项目名称', title: '序号',
dataIndex: 'projectName', dataIndex: 'index',
key: 'projectName', key: 'index',
width: 60,
align: 'center',
customRender: ({ text, record, index }) => index + 1
},
{
title: '倾斜影像名称',
dataIndex: 'stnm',
key: 'stnm',
width: 150 width: 150
}, },
{ {
title: '拍摄日期', title: 'URL',
dataIndex: 'captureDate', dataIndex: 'url',
key: 'captureDate', key: 'url',
width: 360
},
{
title: '所在河段',
dataIndex: 'hbrvcdName',
key: 'hbrvcdName',
width: 120 width: 120
}, },
{ {
title: '文件大小', title: '所属电站',
dataIndex: 'fileSize', key: 'ennm',
key: 'fileSize', dataIndex: 'ennm',
width: 100 width: 140
}, },
{ {
title: '状态', title: '创建人',
key: 'status', key: 'recordUser',
dataIndex: 'status', dataIndex: 'recordUser'
width: 100
}, },
{ {
title: '覆盖区域', title: '创建时间',
dataIndex: 'coverageArea', key: 'recordTime',
key: 'coverageArea', dataIndex: 'recordTime',
ellipsis: true width: 150
},
{
title: '更新时间',
key: 'modifyTime',
dataIndex: 'modifyTime',
width: 150
}, },
{ {
title: '操作', title: '操作',
key: 'action', key: 'action',
width: 200, width: 80,
fixed: 'right' fixed: 'right'
} }
]; ];
@ -104,7 +123,728 @@ const currentRecord = ref<any | null>(null);
const editModalVisible = ref(false); const editModalVisible = ref(false);
// //
const dataSource = ref([]); const dataSource = ref([
{
_tls: {},
id: 'OSGB_008640203500000001_GF',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-18 01:16:30',
modifyTime: '2024-11-05 10:59:18',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008640203500000001_GF',
stnm: '羊曲光伏区',
url: 'https://211.99.26.225:18085/qingXieSheYing/huanghe/yangQu_YQ-GF_merge/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY1U',
hbrvcdName: '黄河干流上游',
rstcd: '008640203500000001',
ennm: '羊曲',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '08',
baseName: '黄河上游干流',
lgtd: null,
lttd: null,
location:
'{\n destination: [-925601.0019712645, 5101341.168949657, 3707151.451255355],\n orientation: {\n heading: 3.935777607555498,\n pitch: -0.30960256782642825,\n roll: 6.280804479489018\n },\n center: [100.27966528149938, 35.74512881924376, 2527]\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[100.280085008313,35.7434126745264],[100.274143813334,35.7434126745264],[100.274854725553,35.7449360578545],[100.276936682769,35.746535610349],[100.283233333858,35.7494808181167],[100.285353375656,35.7472084379856],[100.281087902338,35.7437554357753],[100.280085008313,35.7434126745264]]]}}]}',
height: 44,
comments: null
},
{
_tls: {},
id: 'OSGB_008640203900000001',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:56:52',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008640203900000001',
stnm: '班多',
url: 'https://211.99.26.225:18085/qingXieSheYing/huanghe/banDuo/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY1U',
hbrvcdName: '黄河干流上游',
rstcd: '008640203900000001',
ennm: '班多',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '08',
baseName: '黄河上游干流',
lgtd: null,
lttd: null,
location:
' {\r\n destination: [-929696.6123032116, 5129200.419350642, 3668757.052689075],\r\n orientation: {\r\n heading: 3.0798081424820065,\r\n pitch: -0.6148159031298439,\r\n roll: 0.000238697395245957\r\n },\r\n center: [100.271729604817, 35.3107902811941, 2800]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[100.276306819621,35.3070198708922],[100.26643399204,35.3070198708922],[100.266505742241,35.3149697931008],[100.272461008877,35.3151850437021],[100.276966921465,35.3151850437021],[100.276966921465,35.3077660729768],[100.276306819621,35.3070198708922]]]}}]}',
height: 44,
comments: null
},
{
_tls: {},
id: 'OSGB_008640203800000001',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:56:35',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008640203800000001',
stnm: '拉西瓦',
url: 'https://211.99.26.225:18085/qingXieSheYing/huanghe/laXiWa/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY1U',
hbrvcdName: '黄河干流上游',
rstcd: '008640203800000001',
ennm: '拉西瓦',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '08',
baseName: '黄河上游干流',
lgtd: null,
lttd: null,
location:
'{\r\n destination: [-1002668.01364282, 5065411.889787282, 3736496.3127215244],\r\n orientation: {\r\n heading: 4.485903770759803,\r\n pitch: -0.5306318071338225,\r\n roll: 6.279578857452076\r\n },\r\n center: [101.184897041962, 36.070651370076, 2416.45174914598]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","name":"lxw_boundary","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[101.177314346395,36.0553063647701],[101.168809017664,36.0686783789251],[101.1787903122448,36.07534306172733],[101.18569389717655,36.07509083882469],[101.1913078908158,36.07363038685621],[101.193688241279,36.0708615649096],[101.177314346395,36.0553063647701]]]}}]}',
height: 60,
comments: null
},
{
_tls: {},
id: 'OSGB_008640203700000001',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:56:19',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008640203700000001',
stnm: '积石峡',
url: 'https://211.99.26.225:18085/qingXieSheYing/huanghe/jiShiXia/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY1U',
hbrvcdName: '黄河干流上游',
rstcd: '008640203700000001',
ennm: '积石峡',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '08',
baseName: '黄河上游干流',
lgtd: null,
lttd: null,
location:
'{\r\n destination: [-1139534.4509009295, 5052836.302100392, 3713220.2343443115],\r\n orientation: {\r\n heading: 5.981366614893845,\r\n pitch: -0.5440370528907605,\r\n roll: 6.282077087471317\r\n },\r\n center: [102.704592220253, 35.8259043091842, 1903.53630185407]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","name":"jsx_boundary","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[102.69530681909,35.8294628842497],[102.693855857125,35.8314865943588],[102.694466788479,35.8333193884199],[102.696452315378,35.8358394802539],[102.709014591339,35.8358394802539],[102.71389317825289,35.81905253997487],[102.71452157450645,35.8150089466911],[102.71217191894967,35.81405269152264],[102.70890004171,35.8142277836168],[102.69530681909,35.8294628842497]]]}}]}',
height: 84,
comments: null
},
{
_tls: {},
id: 'OSGB_008640202600000001',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:56:01',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008640202600000001',
stnm: '苏只',
url: 'https://211.99.26.225:18085/qingXieSheYing/huanghe/suZhi/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY1U',
hbrvcdName: '黄河干流上游',
rstcd: '008640202600000001',
ennm: '苏只',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: 'other',
baseName: '其他',
lgtd: null,
lttd: null,
location:
'{\r\n destination: [-1106591.5264852343, 5056266.424429915, 3718716.7615750157],\r\n orientation: {\r\n heading: 3.819123893872565,\r\n pitch: -0.6049551059892484,\r\n roll: 6.2807611001840336\r\n },\r\n center: [102.337330495664, 35.8720315291731, 1860.26357494015]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[102.336727944938,35.8659431118492],[102.330113343119,35.8703608062048],[102.340644171285,35.8785514503344],[102.346709546238,35.876354542871],[102.336727944938,35.8659431118492]]]}}]}',
height: 38,
comments: null
},
{
_tls: {},
id: 'OSGB_008640202300000001',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:55:46',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008640202300000001',
stnm: '龙羊峡',
url: 'https://211.99.26.225:18085/qingXieSheYing/huanghe/longYangXia/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY1U',
hbrvcdName: '黄河干流上游',
rstcd: '008640202300000001',
ennm: '龙羊峡',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '08',
baseName: '黄河上游干流',
lgtd: null,
lttd: null,
location:
' {\r\n destination: [-978484.4656175541, 5067136.757304259, 3741215.7656669803],\r\n orientation: {\r\n heading: 4.77058620280604,\r\n pitch: -0.773546963192036,\r\n roll: 6.278725977146404\r\n },\r\n center: [100.918351276306, 36.1228958229073, 2558.99829344545]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","features":[{"geometry":{"coordinates":[[[100.9139009281504,36.12777454726780],[100.9187677105970,36.11856061983825],[100.9220536986745,36.11315168748092],[100.9249463460061,36.11485880837403],[100.9278413602013,36.11721954956330],[100.9282265686215,36.11997360475776],[100.9277455925826,36.12411089425434],[100.9273678902740,36.12541103255819],[100.9271311603723,36.12686307096899],[100.9269482104378,36.12761047963833],[100.9266428533750,36.12830806106303],[100.9254395254174,36.12974059434591],[100.9237363800039,36.13137931925510],[100.9218180310860,36.13220316143079],[100.9192024368766,36.13220316143079],[100.9135570752082,36.13076718414857],[100.9124022180582,36.13034376456862],[100.9139009281504,36.12777454726780]]],"type":"Polygon"},"properties":{"UserID":0},"type":"Feature"}]}',
height: 44,
comments: null
},
{
_tls: {},
id: 'OSGB_008640200600000001',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:55:30',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008640200600000001',
stnm: '李家峡',
url: 'https://211.99.26.225:18085/qingXieSheYing/huanghe/liJiaXia/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY1U',
hbrvcdName: '黄河干流上游',
rstcd: '008640200600000001',
ennm: '李家峡',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '08',
baseName: '黄河上游干流',
lgtd: null,
lttd: null,
location:
'{\r\n destination: [-1056838.2342324483, 5050939.864163284, 3740880.678268031],\r\n orientation: {\r\n heading: 4.259448409474915,\r\n pitch: -0.6511273262566135,\r\n roll: 6.279577142738661\r\n },\r\n center: [101.807873387655, 36.1182917300895, 2142.83166118246]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[101.805962184839,36.1167844227604],[101.804733343478,36.118918726177],[101.806134653802,36.1201260089176],[101.809454681338,36.1214842020009],[101.820729839792,36.1214842020009],[101.82124724668,36.1182935261862],[101.809174419274,36.1147579124457],[101.805962184839,36.1167844227604]]]}}]}',
height: 40,
comments: null
},
{
_tls: {},
id: 'OSGB_008610902100000002',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:55:12',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008610902100000002',
stnm: '永庆',
url: 'https://211.99.26.225:18085/qingXieSheYing/fengman/yq3dt/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY168',
hbrvcdName: '丰满以下',
rstcd: '008610902100000002',
ennm: '永庆',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '12',
baseName: '东北',
lgtd: null,
lttd: null,
location:
'{\r\n destination: [-2749991.4000875778, 3703611.667716356, 4391097.823840936],\r\n orientation: {\r\n heading: 1.9622093407367442,\r\n pitch: -0.535668550857455,\r\n roll: 0.003603576674832354\r\n },\r\n center: [126.60619194343177, 43.7782410182646, 5000.53630185407]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[126.603568306525,43.7719078767057],[126.596380902377,43.7738856187867],[126.603471831301,43.7834366659097],[126.615772422293,43.7796500133887],[126.611431037237,43.7708948868593],[126.603568306525,43.7719078767057]]]}}]}',
height: -24,
comments: null
},
{
_tls: {},
id: 'OSGB_008610902100000001',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:54:51',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008610902100000001',
stnm: '丰满',
url: 'https://211.99.26.225:18085/qingXieSheYing/fengman/fm3dt/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY168',
hbrvcdName: '丰满以下',
rstcd: '008610902100000001',
ennm: '丰满',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '12',
baseName: '东北',
lgtd: null,
lttd: null,
location:
' {\r\n destination: [-2757984.791200001, 3702731.89344555, 4387429.141142541],\r\n orientation: {\r\n heading: 2.726968159168443,\r\n pitch: -0.659333747749792,\r\n roll: 0.001705711752572725\r\n },\r\n center: [126.68777681485555, 43.72062815295212, 0]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[126.677201910442,43.7219629899428],[126.674824396421,43.7269429179591],[126.683017181222,43.7293204319798],[126.689699923334,43.7293204319798],[126.694037279993,43.7253364895667],[126.700013193613,43.7183967189117],[126.687290280746,43.7135453051668],[126.682631638408,43.7125171909957],[126.68125010999,43.7139629765488],[126.677201910442,43.7219629899428]]]}}]}',
height: -10,
comments: null
},
{
_tls: {},
id: 'OSGB_008640204000000001',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:53:43',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008640204000000001',
stnm: '公伯峡',
url: 'https://211.99.26.225:18085/qingXieSheYing/huanghe/gongBoXia/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY1U',
hbrvcdName: '黄河干流上游',
rstcd: '008640204000000001',
ennm: '公伯峡',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '08',
baseName: '黄河上游干流',
lgtd: null,
lttd: null,
location:
'{\r\n destination: [-1097283.8773704714, 5058275.150543221, 3719350.2177485977],\r\n orientation: {\r\n heading: 4.069005072911528,\r\n pitch: -0.7601115186776273,\r\n roll: 6.2796739221159825\r\n },\r\n center: [102.230856244147, 35.8777364102304, 1800]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","name":"gbx_boundary","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[102.23096545810546,35.87070203368848],[102.22344702081998,35.87705511319469],[102.225531265309,35.8796295746632],[102.228103470885,35.8811594485677],[102.231953373348,35.882991934893],[102.234374272713,35.8803524821126],[102.23707888742315,35.87656171574784],[102.23096545810546,35.87070203368848]]]}}]}',
height: 50,
comments: null
},
{
_tls: {},
id: 'OSGB_008640203500001021',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:53:28',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008640203500001021',
stnm: '羊曲移栽园',
url: 'https://211.99.26.225:18085/qingXieSheYing/huanghe/yangQu_YQ-YZY/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY119',
hbrvcdName: '浑江口以上',
rstcd: '008640203500001021',
ennm: '羊曲移栽园',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: 'other',
baseName: '其他',
lgtd: null,
lttd: null,
location:
'{\r\n destination: [-918241.2550154594, 5118065.7637626715, 3687260.3390196203],\r\n orientation: {\r\n heading: 5.259836877525001,\r\n pitch: -0.5723985723270184,\r\n roll: 6.279958994450198\r\n },\r\n center: [100.16275372918831, 35.52723692659094, 2803.53630185407]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","name":"yq_yzy_boundary","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[100.168575254524,35.5191839263442],[100.15747928780189,35.51922272824219],[100.15760326472177,35.5315736364896],[100.168522948508,35.5316589109779],[100.168575254524,35.5191839263442]]]}}]}',
height: 44,
comments: null
},
{
_tls: {},
id: 'OSGB_008640203700001017',
recordUser: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
recordTime: '2023-05-14 00:02:12',
modifyTime: '2024-11-05 10:53:11',
displayRecordUser: null,
recordUserName: 'A62AB110-D4EC-FF3E-F293-140AB60CAE61',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008640203700001017',
stnm: '积石峡鱼类增殖站',
url: 'https://211.99.26.225:18085/qingXieSheYing/huanghe/jiShiXia_JSX-ZZZ/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY119',
hbrvcdName: '浑江口以上',
rstcd: '008640203700001017',
ennm: '积石峡鱼类增殖站',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: 'other',
baseName: '其他',
lgtd: null,
lttd: null,
location:
'{\r\n destination: [-1140971.640070955, 5051928.865525266, 3713299.455800881],\r\n orientation: {\r\n heading: 4.248666390778816,\r\n pitch: -0.32885653878595567,\r\n roll: 6.28017762476892\r\n },\r\n center: [102.722027790477, 35.820066370996095, 1903]\r\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[102.713719729036,35.8161431299919],[102.712877840146,35.8205587513157],[102.715214511352,35.8215552728596],[102.721451361704,35.8232905948584],[102.722585334496,35.8232905948584],[102.725609261939,35.822912603928],[102.726502695048,35.82193326379],[102.726932230196,35.819270145871],[102.727327402532,35.8167616606054],[102.724251930871,35.8157995018734],[102.721537268734,35.8154902365666],[102.717654270994,35.8157823204674],[102.713719729036,35.8161431299919]]]}}]}',
height: 44,
comments: null
},
{
_tls: {},
id: 'OSGB_008660107300000001',
recordUser: '1',
recordTime: '2023-06-26 14:51:49',
modifyTime: '2024-11-05 10:52:50',
displayRecordUser: null,
recordUserName: '1',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008660107300000001',
stnm: '瀑布沟',
url: 'https://211.99.26.225:18085/qingXieSheYing2/ddh_3dtiles/pbg_3dtiles/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY148',
hbrvcdName: '大渡河',
rstcd: '008660107300000001',
ennm: '瀑布沟',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '03',
baseName: '大渡河干流',
lgtd: null,
lttd: null,
location:
'{\n destination: [102.87008, 29.19082, 4401.88],\n orientation: {\n heading: 5.380675551,\n pitch: -0.87091929675,\n roll: 0\n },\n center: [102.8376039, 29.2093539, 820]\n }',
accuracy: 16,
boundary:
'{ "type": "FeatureCollection", "name": "pbg", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features": [ { "type": "Feature", "properties": { "id": 1 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 102.840797640489782, 29.213964126878459 ], [ 102.855678001879326, 29.2114613969921 ], [ 102.856222073593756, 29.21021003204892 ], [ 102.85643970227953, 29.208169763119823 ], [ 102.85630368435092, 29.204959740004711 ], [ 102.855841223393654, 29.204089225261626 ], [ 102.838022874746216, 29.204796518490379 ], [ 102.829181709386788, 29.206591955147985 ], [ 102.827930344443615, 29.209475535234443 ], [ 102.827277458386291, 29.212875983449607 ], [ 102.840797640489782, 29.213964126878459 ] ] ] ] } } ] }',
height: 40,
comments: null
},
{
_tls: {},
id: 'OSGB_008660103600000001',
recordUser: '1',
recordTime: '2023-06-26 14:51:49',
modifyTime: '2024-11-05 10:52:17',
displayRecordUser: null,
recordUserName: '1',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008660103600000001',
stnm: '沙坪二级',
url: 'https://211.99.26.225:18085/qingXieSheYing2/ddh_3dtiles/sperji_3dtiles/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY148',
hbrvcdName: '大渡河',
rstcd: '008660103600000001',
ennm: '沙坪二级',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '03',
baseName: '大渡河干流',
lgtd: null,
lttd: null,
location:
'{\n destination: [103.2141, 29.23316, 904.46],\n orientation: {\n heading: 5.3297119368,\n pitch: -0.5429719303,\n roll: 0\n },\n center: [103.2087888, 29.2373865,550]\n }',
accuracy: 16,
boundary:
'{ "type": "FeatureCollection", "name": "spej", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features": [ { "type": "Feature", "properties": { "id": 1 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 103.194898409051149, 29.235538315468801 ], [ 103.205283447950208, 29.241197228880864 ], [ 103.218342478901107, 29.242130016805927 ], [ 103.220021497166229, 29.240824113710836 ], [ 103.221016470952961, 29.238398865105669 ], [ 103.219710567857874, 29.236097988223843 ], [ 103.201738853834954, 29.227205410004892 ], [ 103.194898409051149, 29.235538315468801 ] ] ] ] } } ] }',
height: 25,
comments: null
},
{
_tls: {},
id: 'OSGB_008660102000000001',
recordUser: '1',
recordTime: '2023-06-26 14:51:50',
modifyTime: '2024-11-05 10:52:01',
displayRecordUser: null,
recordUserName: '1',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008660102000000001',
stnm: '枕头坝一级',
url: 'https://211.99.26.225:18085/qingXieSheYing2/ddh_3dtiles/ztbyiji_3dtiles/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY148',
hbrvcdName: '大渡河',
rstcd: '008660102000000001',
ennm: '枕头坝一级',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '03',
baseName: '大渡河干流',
lgtd: null,
lttd: null,
location:
'{\n destination: [103.0548, 29.23505, 1204.95],\n orientation: {\n heading: 4.7448521045,\n pitch: -0.6974335691,\n roll: 0\n },\n center: [103.0451569, 29.2361348,800]\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection", "features": [ {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[103.03508037100005,29.238394261000053],[103.03550867400008,29.237775601000067],[103.04157630000009,29.23394466900004],[103.05002338600008,29.231422440000074],[103.05477335100005,29.230721413000026],[103.05757159700005,29.23245366100008],[103.05479238700008,29.235480335000034],[103.04545733500004,29.238693915000056],[103.04071493500004,29.240112232000058],[103.03860197300008,29.240531017000023],[103.03593697700006,29.240726132000077],[103.03508037100005,29.238394261000053]]]},"properties":{"OBJECTID":1,"SHAPE_Leng":0.0510784849056,"SHAPE_Area":0.000108878511485}} ]}',
height: 30,
comments: null
},
{
_tls: {},
id: 'OSGB_008660101400000001',
recordUser: '1',
recordTime: '2023-06-26 14:51:49',
modifyTime: '2024-11-05 10:51:51',
displayRecordUser: null,
recordUserName: '1',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008660101400000001',
stnm: '龚嘴',
url: 'https://211.99.26.225:18085/qingXieSheYing2/ddh_3dtiles/gz_3dtiles/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY148',
hbrvcdName: '大渡河',
rstcd: '008660101400000001',
ennm: '龚嘴',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '03',
baseName: '大渡河干流',
lgtd: null,
lttd: null,
location:
'{\n destination: [103.48497, 29.2966, 912.53],\n orientation: {\n heading: 5.5286794715,\n pitch: -0.48712139423,\n roll: 0\n },\n center: [103.4780156, 29.3029672, 490]\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection", "features": [ {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[103.47109546400009,29.305520493000074],[103.47912852400003,29.294803400000035],[103.48588619300006,29.297658754000054],[103.48019452200003,29.309289559000035],[103.47109546400009,29.305520493000074]]]},"properties":{"OBJECTID":1,"SHAPE_Leng":0.0435272300608,"SHAPE_Area":0.000111320725035}} ]}',
height: 36,
comments: null
},
{
_tls: {},
id: 'OSGB_008660101300000001',
recordUser: '1',
recordTime: '2023-06-26 14:51:49',
modifyTime: '2024-11-05 10:51:37',
displayRecordUser: null,
recordUserName: '1',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008660101300000001',
stnm: '铜街子',
url: 'https://211.99.26.225:18085/qingXieSheYing2/ddh_3dtiles/tjz_3dtiles/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY148',
hbrvcdName: '大渡河',
rstcd: '008660101300000001',
ennm: '铜街子',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '03',
baseName: '大渡河干流',
lgtd: null,
lttd: null,
location:
'{\n destination: [103.63945, 29.26618, 1147.14],\n orientation: {\n heading: 3.6472145379,\n pitch: -0.57752944948,\n roll: 0\n },\n center: [103.6327243, 29.2565762,500]\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection", "features": [ {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[103.62492291400008,29.254544099000043],[103.63393954100007,29.249170900000024],[103.63571001800005,29.25017305600005],[103.64182317400008,29.263368120000052],[103.63166798600008,29.267510368000046],[103.62537263200005,29.255693378000046],[103.62492291400008,29.254544099000043]]]},"properties":{"OBJECTID":3,"SHAPE_Leng":0.0526639365108,"SHAPE_Area":0.000174571026443}} ]}',
height: 33,
comments: null
},
{
_tls: {},
id: 'OSGB_008660103900000001',
recordUser: '1',
recordTime: '2023-06-26 14:51:49',
modifyTime: '2024-11-05 10:51:22',
displayRecordUser: null,
recordUserName: '1',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008660103900000001',
stnm: '大岗山',
url: 'https://211.99.26.225:18085/qingXieSheYing2/ddh_3dtiles/dgs_3dtiles/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY148',
hbrvcdName: '大渡河',
rstcd: '008660103900000001',
ennm: '大岗山',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '03',
baseName: '大渡河干流',
lgtd: null,
lttd: null,
location:
'{\n destination: [102.21188, 29.43792, 1998.92],\n orientation: {\n heading: 0.54628805587,\n pitch: -0.62674773439,\n roll: 0\n },\n center: [102.218611, 29.4495989, 1101]\n }',
accuracy: 16,
boundary:
'{ "type": "FeatureCollection", "name": "dgs", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features": [ { "type": "Feature", "properties": { "id": 1 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 102.211945639635587, 29.463552037774974 ], [ 102.222998605826191, 29.463466355866519 ], [ 102.227368383157355, 29.458582487084623 ], [ 102.226168836439001, 29.437419055696413 ], [ 102.215201552156842, 29.437933147147138 ], [ 102.210831774825678, 29.442131560661398 ], [ 102.211945639635587, 29.463552037774974 ] ] ] ] } } ] }',
height: 34,
comments: null
},
{
_tls: {},
id: 'OSGB_008660105700000001',
recordUser: '1',
recordTime: '2023-06-26 14:51:49',
modifyTime: '2024-11-05 10:51:11',
displayRecordUser: null,
recordUserName: '1',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008660105700000001',
stnm: '双江口',
url: 'https://211.99.26.225:18085/qingXieSheYing2/ddh_3dtiles/sjk_3dtiles/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY148',
hbrvcdName: '大渡河',
rstcd: '008660105700000001',
ennm: '双江口',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '03',
baseName: '大渡河干流',
lgtd: null,
lttd: null,
location:
'{\n destination: [101.92794, 31.79046, 2999.46],\n orientation: {\n heading: 5.1129420437,\n pitch: -0.66270151698,\n roll: 0\n },\n center: [101.9174412, 31.7944958, 2317]\n }',
accuracy: 16,
boundary:
'{\r\n"type": "FeatureCollection",\r\n"name": "sjk_boundary",\r\n"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },\r\n"features": [\r\n{ "type": "Feature", "properties": { "id": 1 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 101.918070761460442, 31.799020881908287 ], [ 101.915831763674746, 31.794542886336899 ], [ 101.920579518015487, 31.790091866642445 ], [ 101.934553022268375, 31.790091866642445 ], [ 101.934660925776129, 31.792654574951371 ], [ 101.918070761460442, 31.799020881908287 ] ] ] ] } }\r\n]\r\n}',
height: 52,
comments: null
},
{
_tls: {},
id: 'OSGB_008660107200000001',
recordUser: '1',
recordTime: '2023-06-26 14:51:49',
modifyTime: '2024-11-05 10:50:58',
displayRecordUser: null,
recordUserName: '1',
departmentId: null,
displayDepartment: null,
stcd: 'OSGB_008660107200000001',
stnm: '深溪沟',
url: 'https://211.99.26.225:18085/qingXieSheYing2/ddh_3dtiles/sxg_3dtiles/tileset.json',
rvcd: null,
rvcdName: null,
hbrvcd: 'SJLY148',
hbrvcdName: '大渡河',
rstcd: '008660107200000001',
ennm: '深溪沟',
sttp: null,
sttpCode: null,
sttpName: null,
sttpFullPath: null,
sttpTreeLevel: null,
baseId: '03',
baseName: '大渡河干流',
lgtd: null,
lttd: null,
location:
'{\n destination: [102.93682, 29.30348, 1593],\n orientation: {\n heading: 4.0931461618,\n pitch: -1.040739833,\n roll: 0\n },\n center: [102.9330302, 29.3016719, 1100]\n }',
accuracy: 16,
boundary:
'{"type":"FeatureCollection", "features": [ {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[102.93710628900004,29.305941235000034],[102.93332294600003,29.304870477000065],[102.92946821900006,29.302693271000066],[102.92604179500006,29.299195463000046],[102.92289292500004,29.290856630000064],[102.92579295700006,29.290469959000063],[102.93764309500006,29.303935349000028],[102.93710628900004,29.305941235000034]]]},"properties":{"OBJECTID":2,"SHAPE_Leng":0.0451083802786,"SHAPE_Area":0.0000854803537049}} ]}',
height: 51,
comments: null
}
]);
// //
const fetchTiltPhotoData = (params: any) => { const fetchTiltPhotoData = (params: any) => {
@ -174,11 +914,6 @@ const onSearchFinish = (values: any) => {
// //
const handleReset = (params: any) => {}; const handleReset = (params: any) => {};
//
const handleSelectionChange = (selectedRows: any[]) => {
console.log('选中的行:', selectedRows);
};
// //
const editModalCancel = () => { const editModalCancel = () => {
editModalVisible.value = false; editModalVisible.value = false;

View File

@ -11,60 +11,52 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, defineAsyncComponent } from 'vue'; import { ref, defineAsyncComponent } from "vue";
// Tab // Tab
const tabs = [ const tabs = [
{ {
name: '图层管理', name: "图层管理",
value: 'layer' value: "layer",
}, },
{ {
name: '图例结构管理', name: "图例结构管理",
value: 'legend' value: "legend",
}, },
{ {
name: '图例数据管理', name: "图例数据管理",
value: 'legendData' value: "legendData",
}, },
{ {
name: '电站专题管理', name: "电站专题管理",
value: 'station' value: "station",
}, },
{ {
name: '沿程配置管理', name: "沿程配置管理",
value: 'config' value: "config",
}, },
{ {
name: '倾斜摄影管理', name: "倾斜摄影管理",
value: 'tilt' value: "tilt",
} },
]; ];
// tab // tab
const activeTab = ref('layer'); const activeTab = ref("layer");
// //
const getComponent = (value: string) => { const getComponent = (value: string) => {
const componentMap: Record<string, any> = { const componentMap: Record<string, any> = {
layer: defineAsyncComponent( layer: defineAsyncComponent(() => import("./components/LayerManagement/index.vue")),
() => import('./components/LayerManagement/index.vue') legend: defineAsyncComponent(() => import("./components/LegendStructure/index.vue")),
), legendData: defineAsyncComponent(() => import("./components/LegendData/index.vue")),
legend: defineAsyncComponent(
() => import('./components/LegendStructure/index.vue')
),
legendData: defineAsyncComponent(
() => import('./components/LegendData/index.vue')
),
station: defineAsyncComponent( station: defineAsyncComponent(
() => import('./components/StationManagement/index.vue') () => import("./components/StationManagement/index.vue")
),
config: defineAsyncComponent(
() => import('./components/ConfigManagement/index.vue')
), ),
config: defineAsyncComponent(() => import("./components/ConfigManagement/index.vue")),
tilt: defineAsyncComponent( tilt: defineAsyncComponent(
() => import('./components/TiltPhotoManagement/index.vue') () => import("./components/TiltPhotoManagement/index.vue")
) ),
}; };
return componentMap[value] || null; return componentMap[value] || null;
@ -95,6 +87,9 @@ const getComponent = (value: string) => {
box-sizing: border-box; box-sizing: border-box;
overflow: hidden; overflow: hidden;
} }
:deep(.ant-form-item) {
margin-bottom: 0 !important;
}
} }
:deep(.ant-tabs) { :deep(.ant-tabs) {

View File

@ -64,6 +64,16 @@ export default ({ mode }: ConfigEnv): UserConfig => {
new RegExp('^/api/wmp-env-server'), new RegExp('^/api/wmp-env-server'),
'/api/wmp-env-server' '/api/wmp-env-server'
) )
},
'/api/wmp-sys-server': {
target: 'https://211.99.26.225:12122',
changeOrigin: true,
secure: false,
rewrite: path =>
path.replace(
new RegExp('^/api/wmp-sys-server'),
'/api/wmp-sys-server'
)
} }
} }
}, },