diff --git a/frontend/src/api/select/index.ts b/frontend/src/api/select/index.ts index d52bcf9d..e8a3581b 100644 --- a/frontend/src/api/select/index.ts +++ b/frontend/src/api/select/index.ts @@ -115,10 +115,18 @@ export function uploadFile(data: any) { }); } // 所在位置下拉列表 -export function getAddvcdDropdownByRvcd(params: any) { +export function getAddvcdDropdownByRvcd(data: any = {}) { return request({ url: '/base/msalongb/noAuth/GetKendoList', method: 'post', - params + data + }); +} +//沿程配置下拉列表 +export function noAuthGetKendoPage(data: any = {}) { + return request({ + url: '/base/msalongb/noAuth/GetKendoPage', + method: 'post', + data }); } diff --git a/frontend/src/api/stll/index.ts b/frontend/src/api/stll/index.ts index bfa8ced7..5d860617 100644 --- a/frontend/src/api/stll/index.ts +++ b/frontend/src/api/stll/index.ts @@ -39,6 +39,14 @@ export function vmsstbprptGetKendoList(queryParams: any) { data: queryParams }); } +//获取电站 +export function overviewvmsstbprptGetKendoList(queryParams: any) { + return request({ + url: '/eq/vmsstbprpt/GetKendoList', + method: 'post', + data: queryParams + }); +} export function vmsstbprptGetKendoList1(queryParams: any) { return request({ url: '/eq/vmsstbprpt/GetKendoList', diff --git a/frontend/src/api/sw/index.ts b/frontend/src/api/sw/index.ts index 5f0ce5bf..4abd7e4e 100644 --- a/frontend/src/api/sw/index.ts +++ b/frontend/src/api/sw/index.ts @@ -42,7 +42,7 @@ export function getCxswList(data: any) { //获取出入库水温下拉选则树 export function getVmsstbprpt(data: any) { return request({ - url: '/wt/vmsstbprpt/GetKendoList', + url: '/eq/vmsstbprpt/GetKendoList', method: 'post', data }); diff --git a/frontend/src/api/system/disposeManage/index.ts b/frontend/src/api/system/disposeManage/index.ts new file mode 100644 index 00000000..6972338e --- /dev/null +++ b/frontend/src/api/system/disposeManage/index.ts @@ -0,0 +1,50 @@ +import request from '@/utils/request'; + +// 获取所有沿程配置数据 +export function threedroambGetKendoListCust(data: any) { + return request({ + url: '/api/wmp-sys-server/sys/threedroamb/GetKendoListCust', + method: 'post', + data: data + }); +} +export function threedroambsave(data: any) { + return request({ + url: '/api/wmp-sys-server/sys/threedroamb/save', + method: 'post', + data: data + }); +} +export function threedroambdelete(data: any) { + return request({ + url: '/api/wmp-sys-server/sys/threedroamb/delete', + method: 'get', + params: data + }); +} +//根据id查询弹窗 +export function threedroambGetKendoById(data: any) { + return request({ + url: '/api/wmp-sys-server/sys/threedroamb/getThreedRoamDetails', + method: 'get', + params: data + }); +} +// 导入接口 +export function threedroambimport(data: FormData) { + return request({ + url: '/api/wmp-sys-server/sys/threedroamb/import', + method: 'post', + data: data, + headers: { 'Content-Type': 'multipart/form-data' } + }); +} +// 导出模板 +export function threedroambexport(data: any) { + return request({ + url: '/api/wmp-sys-server/sys/threedroamb/export', + method: 'post', + data: data, + responseType: 'blob' + }); +} \ No newline at end of file diff --git a/frontend/src/modules/alongFishMod/index.vue b/frontend/src/modules/alongFishMod/index.vue index 2ca8e91d..99b5030a 100644 --- a/frontend/src/modules/alongFishMod/index.vue +++ b/frontend/src/modules/alongFishMod/index.vue @@ -34,7 +34,7 @@ { const getYearData = async () => { try { const filter: any = {}; - if (baseid.value && baseid.value !== 'all') { - filter.baseId = baseid.value; + if (moreSelect.value.value) { + filter.baseId = moreSelect.value.value; } const params = { @@ -285,7 +283,7 @@ const getYearData = async () => { ); const latestYear = uniqueYears[0]; - // baseid 为 all 时取第一个有数据的流域 + // 取第一个有数据的流域 const firstWbsCode = Object.keys(data)[0]; select.value.options = objYear[firstWbsCode] || []; select.value.value = latestYear @@ -326,70 +324,6 @@ const updateYearOptionsByBase = async (wbsCode: string) => { * 获取流域树形选择器数据 + 年份数据 + 图表数据 * 在基地变化时调用,是整个模块数据加载的入口 */ -const getMoreSelectData = async () => { - if (!baseid.value) return; - - isInitializing.value = true; - - try { - const params = { - filter: { - logic: 'and', - filters: [ - { - field: 'wbsType', - operator: 'eq', - value: 'PSB_RVCD' - }, - baseid.value !== 'all' - ? { - field: 'objid', - operator: 'eq', - value: baseid.value - } - : null - ].filter(Boolean) - }, - group: [ - { dir: 'asc', field: 'orderIndex' }, - { dir: 'asc', field: 'wbsCode' }, - { dir: 'asc', field: 'wbsName' }, - { dir: 'asc', field: 'objid' } - ], - groupResultFlat: true - }; - - const res = await wbsbGetKendoList(params); - const data = res?.data?.data || []; - - if (data.length > 0) { - const treeData = buildTreeData(data); - const filteredData = filterSelectOptions(treeData); - - // 只有一个流域时隐藏树形选择器 - moreSelect.value.options = filteredData; - moreSelect.value.value = treeData?.[0]?.children?.[0]?.value; - - // 先获取年份数据缓存到 yearOptions,再根据实际选中的流域设置年份选项 - await getYearData(); - if (moreSelect.value.value) { - await updateYearOptionsByBase(moreSelect.value.value); - } - await getChartData(); - } else { - moreSelect.value.options = []; - moreSelect.value.value = undefined; - await getYearData(); - } - } catch (error) { - console.error('获取树形选择器数据失败:', error); - moreSelect.value.options = []; - moreSelect.value.value = undefined; - } finally { - isInitializing.value = false; - } -}; - /** * 获取图表数据 * 根据当前选中的流域(hbrvcd)、年份(yr)、基地(baseId)调用 fishChanges2 API @@ -404,28 +338,18 @@ const getChartData = async () => { filter: { logic: 'and', filters: [ - moreSelect.value.value - ? { - field: 'hbrvcd', - operator: 'eq', - dataType: 'string', - value: moreSelect.value.value - } - : null, + { + field: 'baseId', + operator: 'eq', + dataType: 'string', + value: moreSelect.value.value + }, { field: 'yr', operator: 'eq', dataType: 'string', value: moment(select.value.value).format('YYYY') - }, - baseid.value !== 'all' - ? { - field: 'baseId', - operator: 'eq', - dataType: 'string', - value: baseid.value - } - : null + } ].filter(Boolean) }, group: [ @@ -452,73 +376,6 @@ const getChartData = async () => { } }; -// ==================== 树形工具函数 ==================== - -/** - * 将 API 返回的扁平数据转换为树形结构 - * 按 objid(基地)分组,每个基地下包含其流域列表 - * @param data 扁平的流域数据数组 - */ -const buildTreeData = (data: any[]) => { - if (!data || data.length === 0) return []; - - // 构建基地名称映射 - const jiDiListMap: Record = {}; - JidiSelectEventStore.jidiData.forEach((item: any) => { - jiDiListMap[item.wbsCode] = item.wbsName; - }); - - // 按 objid 分组并去重 - const dataMapNameMap: Record = {}; - data.forEach(item => { - const objId = item.objid || item.objId; - if (!dataMapNameMap[objId]) { - dataMapNameMap[objId] = []; - } - const exists = dataMapNameMap[objId].some( - existing => existing.wbsCode === item.wbsCode - ); - if (!exists) { - dataMapNameMap[objId].push(item); - } - }); - - const treeData = Object.keys(dataMapNameMap).map(objId => ({ - title: jiDiListMap[objId] || '---', - value: objId, - selectable: false, - children: dataMapNameMap[objId].map((item: any) => ({ - title: item.wbsName, - value: item.wbsCode - })) - })); - - // 排序:数字在前升序,非数字排在最后 - treeData.sort((a, b) => { - const numA = Number(a.value); - const numB = Number(b.value); - const aIsNum = !isNaN(numA); - const bIsNum = !isNaN(numB); - if (aIsNum && bIsNum) return numA - numB; - if (aIsNum) return -1; - if (bIsNum) return 1; - return a.value.localeCompare(b.value); - }); - - return treeData; -}; - -/** - * 过滤树形选择器数据 - * 当只有一个基地且只有一个流域时,直接返回流域列表(跳过基地层级) - */ -const filterSelectOptions = (options: any[]) => { - if (options?.length === 1 && options?.[0]?.children?.length === 1) { - return options[0].children; - } - return options; -}; - // ==================== 弹框相关 ==================== /** @@ -581,8 +438,32 @@ watch( () => JidiSelectEventStore.selectedItem, async newVal => { if (newVal && newVal.wbsCode) { - baseid.value = newVal.wbsCode; - await getMoreSelectData(); + if (newVal.wbsCode === 'all') { + moreSelect.value.value = moreSelect.value.options[0]?.value; + } else { + moreSelect.value.value = newVal.wbsCode; + } + await getYearData(); + if (moreSelect.value.value) { + await updateYearOptionsByBase(moreSelect.value.value); + } + await getChartData(); + } + }, + { deep: true, immediate: true } +); + +// 监听 JidiSelectEventStore.jidiData 变化,同步 moreSelect 下拉框选项 +watch( + () => JidiSelectEventStore.jidiData, + newVal => { + const filtered = newVal.filter(item => item.wbsCode !== 'all'); + moreSelect.value.options = filtered.map(item => ({ + value: item.wbsCode, + title: item.wbsName + })); + if (!moreSelect.value.value && filtered.length > 0) { + moreSelect.value.value = filtered[0].wbsCode; } }, { deep: true, immediate: true } diff --git a/frontend/src/modules/churukushuiwenMod/index.vue b/frontend/src/modules/churukushuiwenMod/index.vue index abf6cc30..b8e71b73 100644 --- a/frontend/src/modules/churukushuiwenMod/index.vue +++ b/frontend/src/modules/churukushuiwenMod/index.vue @@ -37,7 +37,7 @@ @@ -49,7 +49,7 @@ import { ref, onMounted, onUnmounted, watch } from 'vue'; import * as echarts from 'echarts'; import dayjs from 'dayjs'; import SidePanelItem from '@/components/SidePanelItem/index.vue'; -import { getVmsstbprpt, inOutOneGetKendoListCust } from '@/api/sw'; +import { inOutOneGetKendoListCust } from '@/api/sw'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import churukushuiwen from './churukushuiwen.vue'; import { MapClass } from '@/components/gis/map.class'; @@ -93,7 +93,6 @@ const scopeDate = ref({ }); // ==================== 业务变量 ==================== -const baseid = ref(''); // 当前选中的基地ID const modalVisible = ref(false); // 弹框显示状态 const clickDataInfo = ref(null); // 点击的数据点信息 const stationName = ref(''); // 站点名称 @@ -169,7 +168,6 @@ function calculateXAxisInterval(dateCount: number): number { return Math.ceil(dateCount / 4) - 1; // 动态计算间隔,保证最多4个刻度 } const paramsOne: any = ref({ - value: '', tm: [currentMonth, currentMonth] }); /** @@ -194,20 +192,10 @@ async function fetchChartData() { logic: 'and', filters: [ { - // OR逻辑:查询入库或出库水温 - logic: 'or', - filters: [ - { - field: 'engDwtCode', - operator: 'eq', - value: paramsOne.value.value - }, // 出库站点编码 - { - field: 'engIwtCode', - operator: 'eq', - value: paramsOne.value.value - } // 入库站点编码 - ] + field: 'baseId', + operator: 'eq', + dataType: 'string', + value: select.value.value }, // 时间范围过滤 { field: 'dt', operator: 'gte', dataType: 'date', value: startDate }, @@ -584,12 +572,10 @@ const handleChartClick = (params: any) => { dataIndex: dataIndex // 数据索引 }; - // 获取站点名称(从下拉选项中查找) - // console.log('站点名称:', select.value.options, paramsOne.value.value); - const selectedStation = select.value.options - .flatMap((base: any) => base.children || []) - .find((station: any) => station.stcd === paramsOne.value.value); - stationName.value = selectedStation?.title || '未知站点'; + // 获取站点名称 + stationName.value = select.value.options?.find( + (item: any) => item.value === select.value.value + )?.title || '未知站点'; // 打开弹框 modalVisible.value = true; @@ -612,7 +598,7 @@ const handleModalClose = () => { const handlePanelChange1 = (data: any, type: string) => { // TODO: 后续可扩展联动逻辑 if (data.moreSelect && data.scopeDate) { - paramsOne.value.value = data.moreSelect; + select.value.value = data.moreSelect; paramsOne.value.tm = data.scopeDate; fetchChartData(); } @@ -628,143 +614,31 @@ const handlePanelChange1 = (data: any, type: string) => { } }; -/** - * 获取站点下拉选项数据 - * 根据选中的基地ID查询对应的站点列表 - */ -const getselsectData = async () => { - loading.value = true; // 开始加载站点数据 - - try { - let params = { - filter: { - logic: 'and', - filters: [ - // 如果baseid不是'all',则添加基地过滤条件 - baseid.value != 'all' - ? { - field: 'baseId', - operator: 'eq', - dataType: 'string', - value: baseid.value - } - : null, - // 站点类型过滤:只查询ENG类型站点 - { - field: 'sttpCode', - operator: 'contains', - dataType: 'string', - value: 'ENG' - }, - // 只查询有效站点(dtin=1) - { - field: 'dtin', - operator: 'eq', - dataType: 'string', - value: 1 - } - ].filter(Boolean) // 过滤掉null值 - }, - sort: [ - // 如果是'all',按基地排序;否则不排序 - baseid.value == 'all' - ? { - field: 'baseStepSort', - dir: 'asc' - } - : null, - { - field: 'rvcdStepSort', - dir: 'asc' - }, - { - field: 'siteStepSort', - dir: 'asc' - } - ].filter(Boolean), // 过滤掉null值 - select: [ - 'stcd', // 站点编码 - 'stnm', // 站点名称 - 'lgtd', // 经度 - 'lttd', // 纬度 - 'siteStepSort', // 站点排序 - 'baseId', // 基地ID - 'baseName' // 基地名称 - ] - }; - - // 调用API获取站点数据 - const res = await getVmsstbprpt(params); - console.log('res', res); - const data = res?.data?.data || res?.data; - const obj: any = {}; - if (data) { - // 将扁平数据转换为树形结构(按基地分组) - data.map(e => { - if (obj[e.baseId]) { - // 如果基地已存在,添加子节点 - obj[e.baseId] = { - ...obj[e.baseId], - children: [ - ...obj[e.baseId].children, - { ...e, value: e.stcd, title: e.stnm } - ] - }; - } else { - // 创建新的基地节点 - obj[e.baseId] = { - value: e.baseId, - title: e.baseName, - selectable: false, - key: e.baseId, - children: [{ ...e, value: e.stcd, title: e.stnm }] - }; - } - }); - - // 转换为数组并按jiDiList顺序排序 - let treeData: any = []; - const dataMapNameArr: any = Object.entries(obj).map(([, v]) => v); - treeData = dataMapNameArr?.sort((a: any, b: any) => { - const indexA = JidiSelectEventStore.jidiData.findIndex( - item => item.wbsCode === a.value - ); - const indexB = JidiSelectEventStore.jidiData.findIndex( - item => item.wbsCode === b.value - ); - return indexA - indexB; - }); - console.log('treeData', treeData); - // 更新下拉框选项 - select.value.options = treeData; - - // 设置默认选中值 - if (baseid.value == 'all') { - select.value.value = '008640203800000001'; // 默认选中第一个站点 - } else { - select.value.value = treeData?.[0]?.children[0]?.value; // 选中当前基地的第一个站点 - } - } - } catch (error) { - console.error('获取站点数据失败:', error); - } finally { - loading.value = false; // 关闭loading - } -}; - // ==================== Watch监听器 ==================== -/** - * 监听基地选择变化 - * 当用户切换基地时,重新加载站点下拉选项 - */ watch( - () => JidiSelectEventStore.selectedItem, // 监听Store中的选中项 + () => JidiSelectEventStore.selectedItem, newVal => { - baseid.value = newVal.wbsCode; // 更新基地ID - getselsectData(); // 重新获取站点数据 + select.value.value = newVal.wbsCode; + fetchChartData(); }, - { deep: true, immediate: true } // 深度监听,立即执行 + { deep: true, immediate: true } +); + +// 监听 JidiSelectEventStore.jidiData 变化,同步下拉框选项 +watch( + () => JidiSelectEventStore.jidiData, + newVal => { + select.value.options = newVal.map(item => ({ + value: item.wbsCode, + title: item.wbsName + })); + // 如果当前没有选中值,默认选中第一个有效项 + if (!select.value.value && newVal.length > 0) { + select.value.value = newVal[0].wbsCode; + } + }, + { deep: true, immediate: true } ); diff --git a/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue b/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue index 1d2c566b..73a52149 100644 --- a/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue +++ b/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue @@ -33,7 +33,7 @@ import { ref, onMounted, onBeforeUnmount, watch } from 'vue' import * as echarts from 'echarts' import SidePanelItem from '@/components/SidePanelItem/index.vue'; -import { wbsbGetKendoList, avgMonGetKendoListCust } from "@/api/sw"; +import { avgMonGetKendoListCust } from "@/api/sw"; import { useJidiSelectEventStore } from "@/store/modules/jidiSelectEvent"; import MonthlyAverage from './monthlyAverage.vue' import MonthlyAverageMaxModal from './TwoLayers/monthlyAverageMaxModal.vue' @@ -55,7 +55,6 @@ const searchParams = ref({ dateValue: '' // 可以是 string 或 Dayjs 对象 }); const unit = '°C' -const baseid: any = ref(null); const loading = ref(false); const showemit = ref(true); @@ -94,123 +93,6 @@ const datetimePicker = ref({ options: [], }); -const filterSelectOptions = (selectOptions: any) => { - if (selectOptions?.length === 1 && selectOptions?.[0]?.children?.length === 1) { - return [{ ...selectOptions?.[0]?.children?.[0], isLeaf: true }] - } else if (selectOptions.length) { - return selectOptions.map((e) => { - if (e?.children?.length > 1) { - return { ...e, isLeaf: false, selectable: true, children: e.children.map((item) => ({ ...item, isLeaf: true })) } - } else { - return { ...e.children[0], isLeaf: true } - } - }) - } - return [] -} - -//获取选择器配置参数 -const getSelectConfig = async () => { - loading.value = true; - - try { - let obj: any = {} - if (baseid.value === 'all') { - obj = { rstcdStepSort: 'asc', siteStepSort: 'asc' } - } else { - obj = { siteStepSort: 'asc' } - } - const filters = [ - { - field: 'wbsType', - operator: 'eq', - value: 'PSB_RVCD' - } - ] - if (baseid.value && baseid.value !== 'all') { - filters.push({ - field: 'objId', - operator: 'eq', - value: baseid.value - }) - } - let data: any = { - filter: { - logic: 'and', - filters - } - } - - if (obj) { - data.sort = [obj] - } else { - data = { - ...data, - group: [ - { dir: 'asc', field: 'orderIndex' }, - { dir: 'asc', field: 'wbsCode' }, - { dir: 'asc', field: 'wbsName' }, - { dir: 'asc', field: 'objid' }, - ], - groupResultFlat: true - } - } - let res = await wbsbGetKendoList(data) - let dataOne = res?.data?.data || res?.data - - if (dataOne.length > 0) { - let dataMapNameMap: any = {} - let jiDiListMap: any = {} - JidiSelectEventStore.jidiData.forEach((item: any) => { - jiDiListMap[item.wbsCode] = item.wbsName - }) - - dataOne.map((item: any, index: number) => { - const { stcd, stnm, objId } = item - if (dataMapNameMap[objId]) { - dataMapNameMap[objId].push({ ...item, baseName: jiDiListMap[objId], baseId: objId }) - } else { - dataMapNameMap[objId] = [{ ...item, baseName: jiDiListMap[objId], baseId: objId }] - } - return { label: item.wbsName, value: item.wbsCode, baseId: objId, baseName: jiDiListMap[objId] } - }) - - let dataMapNameArr: any = [] - - Object.keys(dataMapNameMap).forEach((item: any) => { - dataMapNameArr.push({ - title: dataMapNameMap[item]?.[0]?.baseName, - value: item, - selectable: false, - children: dataMapNameMap[item].map((item2: any) => { - return { - title: item2.wbsName, - value: item2.wbsCode - } - }) - }) - }) - dataMapNameArr = dataMapNameArr.sort((a: any, b: any) => { - const indexA = JidiSelectEventStore.jidiData.findIndex(item => item.wbsCode === a.value); - const indexB = JidiSelectEventStore.jidiData.findIndex(item => item.wbsCode === b.value); - return indexA - indexB; - }) - select.value.options = filterSelectOptions(dataMapNameArr) - if (filterSelectOptions(dataMapNameArr)[0]?.children) { - select.value.value = filterSelectOptions(dataMapNameArr)[0]?.children[0]?.value - } else if (filterSelectOptions(dataMapNameArr)[0]?.value) { - select.value.value = filterSelectOptions(dataMapNameArr)[0]?.value - } else { - select.value.value = '' - } - } - getEchartsData() - } catch (error) { - console.error('选择器配置加载失败:', error); - } finally { - loading.value = false; - } -} //获取图表配置 const getEchartsData = async () => { if (loading.value) return; // 防止重复请求 @@ -238,7 +120,7 @@ const getEchartsData = async () => { "logic": "and", "filters": [ { - "field": "rvcd", + "field": "baseId", "operator": "eq", "dataType": "string", "value": select.value.value @@ -527,7 +409,7 @@ const initChart = (newXData: any[], actualData: any[], lastData: any[], naturalD // 设置弹框数据 stationName.value = stnm; modalData.value = { - baseid: baseid.value, + baseid: select.value.value, rvcd: select.value.value, date: datetimePicker.value.value, stcd: stcd, @@ -575,8 +457,24 @@ const handlePanelChange1 = (data) => { watch( () => JidiSelectEventStore.selectedItem, (newVal) => { - baseid.value = newVal.wbsCode; - getSelectConfig() + select.value.value = newVal.wbsCode; + getEchartsData() + }, + { deep: true, immediate: true } +); + +// 监听 JidiSelectEventStore.jidiData 变化,同步下拉框选项 +watch( + () => JidiSelectEventStore.jidiData, + newVal => { + select.value.options = newVal.map(item => ({ + value: item.wbsCode, + title: item.wbsName + })); + // 如果当前没有选中值,默认选中第一个有效项 + if (!select.value.value && newVal.length > 0) { + select.value.value = newVal[0].wbsCode; + } }, { deep: true, immediate: true } ); diff --git a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/TwoLayer/STLLXFFS.vue b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/TwoLayer/STLLXFFS.vue index 29fe3d31..b69ffd0b 100644 --- a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/TwoLayer/STLLXFFS.vue +++ b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/TwoLayer/STLLXFFS.vue @@ -38,12 +38,20 @@ class="tab-style" @change="fetchTableData" > - +
-
+
- +
@@ -96,6 +100,7 @@ import dayjs from 'dayjs'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import { dayGetKendoListCust, + overviewvmsstbprptGetKendoList, vmsstbprptGetKendoList, msstbprptGetKendoList } from '@/api/stll'; @@ -745,7 +750,7 @@ watch(ecoFlowType, () => { // 监听 tabList 变化,当变为空时清理图表实例 watch( () => tabList.value.length, - (newLen) => { + newLen => { if (newLen === 0 && chartInstance) { chartInstance.dispose(); chartInstance = null; @@ -766,12 +771,18 @@ const rstcdOption = async () => { filters: [ params.value.qid != 'all' ? { - field: 'sttpCode', - operator: 'eq', + field: 'baseId', + operator: 'contains', dataType: 'string', - value: 'ENG' + value: params.value.qid } - : null + : null, + { + field: 'sttpCode', + operator: 'eq', + dataType: 'string', + value: 'ENG' + } ].filter(Boolean) }, sort: [ @@ -782,7 +793,34 @@ const rstcdOption = async () => { ], select: ['stcd', 'stnm'] }; - let res = await vmsstbprptGetKendoList(obj); + if (params.value.qid == 'all') { + obj.sort = [ + { + field: 'ttpwr', + dir: 'desc' + } + ]; + } else { + obj.sort = [ + { + field: 'baseId', + dir: 'asc' + }, + { + field: 'rvcdStepSort', + dir: 'asc' + }, + { + field: 'rstcdStepSort', + dir: 'asc' + }, + { + field: 'siteStepSort', + dir: 'asc' + } + ]; + } + let res = await overviewvmsstbprptGetKendoList(obj); rstcdOptions.value = res.data.data.map((item: any) => { return { value: item.stcd, @@ -834,7 +872,7 @@ const handleResize = () => { width: 35%; height: 482px; // position: relative; - + .pie-chart { width: 100%; height: 100%; diff --git a/frontend/src/modules/shuiShengShengTaiDiaoCha/index.vue b/frontend/src/modules/shuiShengShengTaiDiaoCha/index.vue index 463af983..5d340902 100644 --- a/frontend/src/modules/shuiShengShengTaiDiaoCha/index.vue +++ b/frontend/src/modules/shuiShengShengTaiDiaoCha/index.vue @@ -30,7 +30,7 @@ import * as echarts from 'echarts'; import type { EChartsOption } from 'echarts'; import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; -import { wbsbGetKendoList, getDftYear, getFishListStat } from '@/api/stdc'; +import { getDftYear, getFishListStat } from '@/api/stdc'; import moment from 'moment'; defineOptions({ @@ -41,7 +41,6 @@ defineOptions({ const JidiSelectEventStore = useJidiSelectEventStore(); // ==================== 基础状态 ==================== -const baseid = ref(''); const isInitializing = ref(false); const dataLoading = ref(false); @@ -174,8 +173,8 @@ const handleResize = () => { const getYearData = async () => { try { const filter: any = {}; - if (baseid.value && baseid.value !== 'all') { - filter.baseId = baseid.value; + if (moreSelect.value.value) { + filter.baseId = moreSelect.value.value; } const params = { @@ -236,69 +235,6 @@ const updateYearOptionsByBase = async (wbsCode: string) => { } }; -const getMoreSelectData = async () => { - if (!baseid.value) return; - - isInitializing.value = true; - - try { - const params = { - filter: { - logic: 'and', - filters: [ - { - field: 'wbsType', - operator: 'eq', - value: 'PSB_RVCD' - }, - baseid.value !== 'all' - ? { - field: 'objid', - operator: 'eq', - value: baseid.value - } - : null - ].filter(Boolean) - }, - group: [ - { dir: 'asc', field: 'orderIndex' }, - { dir: 'asc', field: 'wbsCode' }, - { dir: 'asc', field: 'wbsName' }, - { dir: 'asc', field: 'objid' } - ], - groupResultFlat: true - }; - - const res = await wbsbGetKendoList(params); - const data = res?.data?.data || []; - // debugger - - if (data.length > 0) { - const treeData = buildTreeData(data); - const filteredData = filterSelectOptions(treeData); - - moreSelect.value.options = filteredData; - moreSelect.value.value = treeData?.[0]?.children?.[0]?.value; - - await getYearData(); - if (moreSelect.value.value) { - await updateYearOptionsByBase(moreSelect.value.value); - } - await getChartData(); - } else { - moreSelect.value.options = []; - moreSelect.value.value = undefined; - await getYearData(); - } - } catch (error) { - console.error('获取树形选择器数据失败:', error); - moreSelect.value.options = []; - moreSelect.value.value = undefined; - } finally { - isInitializing.value = false; - } -}; - /** * 获取图表数据 * 根据当前选中的流域(hbrvcd)调用 getFishListStat API @@ -314,7 +250,7 @@ const getChartData = async () => { logic: 'and', filters: [ { - field: 'hbrvcd', + field: 'baseId', operator: 'eq', dataType: 'string', value: moreSelect.value.value @@ -340,61 +276,6 @@ const getChartData = async () => { } }; -// ==================== 树形工具函数 ==================== - -const buildTreeData = (data: any[]) => { - if (!data || data.length === 0) return []; - - const jiDiListMap: Record = {}; - JidiSelectEventStore.jidiData.forEach((item: any) => { - jiDiListMap[item.wbsCode] = item.wbsName; - }); - - const dataMapNameMap: Record = {}; - data.forEach(item => { - const objId = item.objid || item.objId; - if (!dataMapNameMap[objId]) { - dataMapNameMap[objId] = []; - } - const exists = dataMapNameMap[objId].some( - existing => existing.wbsCode === item.wbsCode - ); - if (!exists) { - dataMapNameMap[objId].push(item); - } - }); - - const treeData = Object.keys(dataMapNameMap).map(objId => ({ - title: jiDiListMap[objId] || '---', - value: objId, - selectable: false, - children: dataMapNameMap[objId].map((item: any) => ({ - title: item.wbsName, - value: item.wbsCode - })) - })); - - treeData.sort((a, b) => { - const numA = Number(a.value); - const numB = Number(b.value); - const aIsNum = !isNaN(numA); - const bIsNum = !isNaN(numB); - if (aIsNum && bIsNum) return numA - numB; - if (aIsNum) return -1; - if (bIsNum) return 1; - return a.value.localeCompare(b.value); - }); - - return treeData; -}; - -const filterSelectOptions = (options: any[]) => { - if (options?.length === 1 && options?.[0]?.children?.length === 1) { - return options[0].children; - } - return options; -}; - // ==================== 事件处理 ==================== const handlePanelChange = async (data: any) => { @@ -421,8 +302,32 @@ watch( () => JidiSelectEventStore.selectedItem, async newVal => { if (newVal && newVal.wbsCode) { - baseid.value = newVal.wbsCode; - await getMoreSelectData(); + if (newVal.wbsCode === 'all') { + moreSelect.value.value = moreSelect.value.options[0]?.value; + } else { + moreSelect.value.value = newVal.wbsCode; + } + await getYearData(); + if (moreSelect.value.value) { + await updateYearOptionsByBase(moreSelect.value.value); + } + await getChartData(); + } + }, + { deep: true, immediate: true } +); + +// 监听 JidiSelectEventStore.jidiData 变化,同步 moreSelect 下拉框选项 +watch( + () => JidiSelectEventStore.jidiData, + newVal => { + const filtered = newVal.filter(item => item.wbsCode !== 'all'); + moreSelect.value.options = filtered.map(item => ({ + value: item.wbsCode, + title: item.wbsName + })); + if (!moreSelect.value.value && filtered.length > 0) { + moreSelect.value.value = filtered[0].wbsCode; } }, { deep: true, immediate: true } diff --git a/frontend/src/modules/waterQuality/index.vue b/frontend/src/modules/waterQuality/index.vue index ba62cf76..8f8fe542 100644 --- a/frontend/src/modules/waterQuality/index.vue +++ b/frontend/src/modules/waterQuality/index.vue @@ -26,7 +26,7 @@ import { ref, onMounted, onBeforeUnmount, nextTick, watch } from 'vue'; import * as echarts from 'echarts'; import type { EChartsOption } from 'echarts'; import SidePanelItem from '@/components/SidePanelItem/index.vue'; -import { qgcGetKendoListCust, wbsbGetKendoList } from '@/api/sz'; +import { qgcGetKendoListCust } from '@/api/sz'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import { useModelStore } from '@/store/modules/model'; import { @@ -835,12 +835,6 @@ const getecharts = async () => { field: 'baseId', operator: 'eq', dataType: 'string', - value: wbsCode.value - }, - { - field: 'rvcd', - operator: 'eq', - dataType: 'string', value: select.value.value }, { @@ -1154,93 +1148,6 @@ onBeforeUnmount(() => { } }); -//根据流域获取河段 -const getSelect = async () => { - if (!wbsCode.value) { - console.warn('wbsCode 为空,无法获取河段数据'); - return; - } - - let params = { - filter: { - logic: 'and', - filters: [ - { - field: 'objId', - operator: 'eq', - dataType: 'string', - value: wbsCode.value - }, - { - field: 'wbsType', - operator: 'eq', - dataType: 'string', - value: 'PSB_RVCD' - } - ] - }, - group: [ - { - dir: 'asc', - field: 'orderIndex' - }, - { - dir: 'des', - field: 'wbsCode' - }, - { - dir: 'des', - field: 'wbsName' - } - ], - groupResultFlat: 'true' - }; - - try { - let res = await wbsbGetKendoList(params); - - // 处理返回的数据 - 注意数据结构可能是嵌套的 - let data; - if (res && res.data && res.data.data) { - // 如果 res.data.data 是数组,直接使用 - if (Array.isArray(res.data.data)) { - data = res.data.data; - } - // 如果 res.data.data 是对象且有 data 属性,使用 res.data.data.data - else if (res.data.data.data && Array.isArray(res.data.data.data)) { - data = res.data.data.data; - } else { - console.warn('无法解析河段数据:', res); - return; - } - } else { - console.warn('未获取到河段数据'); - return; - } - - if (data && data.length > 0) { - select.value.value = data[0].wbsCode; - select.value.options = data.map(item => { - return { - value: item.wbsCode, - label: item.wbsName - }; - }); - - // 获取完选择器数据后,立即加载图表数据 - await nextTick(); - getecharts(); - } else { - console.warn('河段数据为空'); - select.value.value = ''; - select.value.options = []; - hasData.value = false; - } - } catch (error) { - console.error('获取河段数据失败:', error); - } -}; - //监听子组件的数据变化 const handlePanelChange1 = async data => { console.log('当前所有控件状态:', data); @@ -1269,7 +1176,21 @@ watch( newVal => { console.log(newVal); wbsCode.value = newVal.wbsCode; - getSelect(); + select.value.value = newVal.wbsCode; + getecharts(); + }, + { deep: true, immediate: true } +); + +// 监听 JidiSelectEventStore.jidiData 变化,同步下拉框选项(过滤掉"当前全部"项) +watch( + () => JidiSelectEventStore.jidiData, + newVal => { + const filtered = newVal.filter(item => item.wbsCode !== 'all'); + select.value.options = filtered.map(item => ({ + value: item.wbsCode, + label: item.wbsName + })); }, { deep: true, immediate: true } ); diff --git a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue index a43b2945..5f837240 100644 --- a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue +++ b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue @@ -25,11 +25,9 @@ import { ref, onMounted, onBeforeUnmount, watch, computed } from 'vue'; import * as echarts from 'echarts'; import type { ECharts } from 'echarts'; import SidePanelItem from '@/components/SidePanelItem/index.vue'; -import { getKendoListCust, wbsbGetKendoList } from '@/api/sw'; +import { getKendoListCust } from '@/api/sw'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; -import { da } from 'element-plus/es/locale/index.mjs'; -import { f } from 'vue-router/dist/router-CWoNjPRp.mjs'; import { useModelStore } from '@/store/modules/model'; const modelStore = useModelStore(); @@ -50,9 +48,7 @@ const getCurrentHourTime = () => { return `${year}-${month}-${day} ${hour}`; }; const JidiSelectEventStore = useJidiSelectEventStore(); -const baseid: any = ref(null); const paramsOne = { - rvcd: '', tm: [] }; const dataOne = ref(''); @@ -300,10 +296,10 @@ const init = async () => { logic: 'and', filters: [ { - field: 'rvcd', + field: 'baseId', operator: 'eq', dataType: 'string', - value: paramsOne.rvcd + value: select.value.value }, { field: 'tm', @@ -378,151 +374,11 @@ const init = async () => { loading.value = false; } }; -//获取选择器配置参数 -const getSelectConfig = async () => { - loading.value = true; - try { - let obj: any = {}; - if (baseid.value === 'all') { - obj = { rstcdStepSort: 'asc', siteStepSort: 'asc' }; - } else { - obj = { siteStepSort: 'asc' }; - } - const filters = [ - { - field: 'wbsType', - operator: 'eq', - value: 'PSB_RVCD' - } - ]; - if (baseid.value && baseid.value !== 'all') { - filters.push({ - field: 'objId', - operator: 'eq', // contains - value: baseid.value - }); - } - let data: any = { - filter: { - logic: 'and', - filters - } - // select: ['WBS_CODE', 'WBS_NAME'] - }; - - if (obj) { - data.sort = [obj]; - } else { - data = { - ...data, - group: [ - { dir: 'asc', field: 'orderIndex' }, - { dir: 'asc', field: 'wbsCode' }, - { dir: 'asc', field: 'wbsName' }, - { dir: 'asc', field: 'objid' } - ], - groupResultFlat: true - }; - } - let res = await wbsbGetKendoList(data); - let dataOne = res?.data?.data || res?.data; - - if (dataOne.length > 0) { - let dataMapNameMap: any = {}; - let jiDiListMap: any = {}; - JidiSelectEventStore.jidiData.forEach((item: any) => { - jiDiListMap[item.wbsCode] = item.wbsName; - }); - - dataOne.map((item: any, index: number) => { - const { stcd, stnm, objId } = item; - if (dataMapNameMap[objId]) { - dataMapNameMap[objId].push({ - ...item, - baseName: jiDiListMap[objId], - baseId: objId - }); - } else { - dataMapNameMap[objId] = [ - { ...item, baseName: jiDiListMap[objId], baseId: objId } - ]; - } - return { - label: item.wbsName, - value: item.wbsCode, - baseId: objId, - baseName: jiDiListMap[objId] - }; - }); - let dataMapNameArr: any = []; - - Object.keys(dataMapNameMap).forEach((item: any) => { - dataMapNameArr.push({ - title: dataMapNameMap[item]?.[0]?.baseName, - value: item, - selectable: false, - // baseId:dataMapNameMap[item]?.[0]?.baseId, - children: dataMapNameMap[item].map((item2: any) => { - return { - title: item2.wbsName, - value: item2.wbsCode - }; - }) - }); - }); - dataMapNameArr = dataMapNameArr.sort((a: any, b: any) => { - const indexA = JidiSelectEventStore.jidiData.findIndex( - item => item.wbsCode === a.value - ); - const indexB = JidiSelectEventStore.jidiData.findIndex( - item => item.wbsCode === b.value - ); - return indexA - indexB; - }); - select.value.options = filterSelectOptions(dataMapNameArr); - if (filterSelectOptions(dataMapNameArr)[0]?.children) { - select.value.value = - filterSelectOptions(dataMapNameArr)[0]?.children[0]?.value; - } else if (filterSelectOptions(dataMapNameArr)[0]?.value) { - select.value.value = filterSelectOptions(dataMapNameArr)[0]?.value; - } else { - select.value.value = ''; - } - } - } catch (error) { - console.error('选择器配置加载失败:', error); - } finally { - loading.value = false; - } -}; - -const filterSelectOptions = (selectOptions: any) => { - if ( - selectOptions?.length === 1 && - selectOptions?.[0]?.children?.length === 1 - ) { - return [{ ...selectOptions?.[0]?.children?.[0], isLeaf: true }]; - } else if (selectOptions.length) { - return selectOptions.map(e => { - if (e?.children?.length > 1) { - return { - ...e, - isLeaf: false, - selectable: true, - children: e.children.map(item => ({ ...item, isLeaf: true })) - }; - } else { - return { ...e.children[0], isLeaf: true }; - } - }); - } - return []; -}; //监听子组件的数据变化 const handlePanelChange1 = data => { console.log('当前所有控件状态:', data); if (data.moreSelect) { - paramsOne.rvcd = data.moreSelect; + select.value.value = data.moreSelect; } if (data.datetime) { @@ -565,7 +421,7 @@ const handlePanelChange1 = data => { paramsOne.tm = result; console.log(paramsOne.tm, 'paramsOne.tm'); } - if (paramsOne.rvcd || paramsOne.tm.length > 0) { + if (select.value.value || paramsOne.tm.length > 0) { init(); } }; @@ -573,8 +429,26 @@ const handlePanelChange1 = data => { watch( () => JidiSelectEventStore.selectedItem, newVal => { - baseid.value = newVal.wbsCode; - getSelectConfig(); + // if (newVal.baseId) { + select.value.value = newVal.wbsCode; + init(); + // } + }, + { deep: true, immediate: true } +); + +// 监听 JidiSelectEventStore.jidiData 变化,同步下拉框选项(不过滤"当前全部"项) +watch( + () => JidiSelectEventStore.jidiData, + newVal => { + select.value.options = newVal.map(item => ({ + value: item.wbsCode, + title: item.wbsName + })); + // 如果当前没有选中值,默认选中第一个有效项 + if (!select.value.value && newVal.length > 0) { + select.value.value = newVal[0].baseId || newVal[0].wbsCode; + } }, { deep: true, immediate: true } ); diff --git a/frontend/src/store/modules/jidiSelectEvent.ts b/frontend/src/store/modules/jidiSelectEvent.ts index 72f7734d..35bb918a 100644 --- a/frontend/src/store/modules/jidiSelectEvent.ts +++ b/frontend/src/store/modules/jidiSelectEvent.ts @@ -47,7 +47,7 @@ export const useJidiSelectEventStore = defineStore('jidiSelectEvent', () => { dir: 'asc' } ], - select: ['wbsCode', 'wbsName'] + select: ['wbsCode', 'wbsName', 'baseId'] }; const res = await wbsbGetKendoList(params); const data = res?.data?.data || [ diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index 4bddc19e..7cf48b05 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -34,7 +34,7 @@ service.interceptors.request.use( config.headers._sysid = '10EC2E0B-AEA9-4757-83A2-201BA1BC54E9'; config.headers.authorization = - 'bearer 223f63a2-0b13-4757-8e15-f342098e63ca'; + 'bearer b142d8ee-7e9d-4704-97c9-da935615bac3'; config.baseURL = '/'; } else { const user = useUserStoreHook(); diff --git a/frontend/src/views/system/ConfigManagement/ConfigManagementForm.vue b/frontend/src/views/system/ConfigManagement/ConfigManagementForm.vue index 96f6a7eb..becf29cf 100644 --- a/frontend/src/views/system/ConfigManagement/ConfigManagementForm.vue +++ b/frontend/src/views/system/ConfigManagement/ConfigManagementForm.vue @@ -37,13 +37,13 @@ - +
@@ -238,47 +240,19 @@
- -
- - - {{ item.stnm }}-{{ item.sttpName }} - - - - 保存 - - - - -
+ + + + + diff --git a/frontend/src/views/system/ConfigManagement/index.vue b/frontend/src/views/system/ConfigManagement/index.vue index 2e3570c1..f1a10194 100644 --- a/frontend/src/views/system/ConfigManagement/index.vue +++ b/frontend/src/views/system/ConfigManagement/index.vue @@ -48,7 +48,7 @@ + + diff --git a/frontend/src/views/system/disposeManage/disposeManageSearch.vue b/frontend/src/views/system/disposeManage/disposeManageSearch.vue new file mode 100644 index 00000000..99b08eff --- /dev/null +++ b/frontend/src/views/system/disposeManage/disposeManageSearch.vue @@ -0,0 +1,70 @@ + + + + diff --git a/frontend/src/views/system/disposeManage/index.vue b/frontend/src/views/system/disposeManage/index.vue new file mode 100644 index 00000000..82c73720 --- /dev/null +++ b/frontend/src/views/system/disposeManage/index.vue @@ -0,0 +1,293 @@ + + + + + +