diff --git a/frontend/src/api/yldc/index.ts b/frontend/src/api/yldc/index.ts new file mode 100644 index 00000000..4643b2f1 --- /dev/null +++ b/frontend/src/api/yldc/index.ts @@ -0,0 +1,64 @@ +import request from '@/utils/request'; +//获取有数据的流域 +export function wbsbGetKendoList(data: any) { + return request({ + url: '/fpr/wbsb/GetKendoList', + method: 'post', + data + }); +} +//获取鱼类调查装置 +export function msstbprptGetKendoList(data: any) { + return request({ + url: '/fpr/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +//获取鱼类介绍 +export function fishDicGetKendoList(data: any) { + return request({ + url: '/fpr/fishDic/GetKendoList', + method: 'post', + data + }); +} +//获取鱼类调查统计数据 +export function getFprdDataInfo(data: any) { + return request({ + url: '/fpr/sdFprdR/getFprdDataInfo', + method: 'post', + data + }); +} +// +export function sdFprdRGetKendoListCust(data: any) { + return request({ + url: '/fpr/sdFprdR/GetKendoListCust', + method: 'post', + data + }); +} +//装置名称 /api/dec-lygk-base-server/base/vmsstbprpt/GetKendoList +export function vmsstbprptGetKendoList(data: any) { + return request({ + url: '/fpr/vmsstbprpt/GetKendoList', + method: 'post', + data + }); +} +//鱼种类 /api/wmp-env-server/sdFprdR/getFishInfo +export function sdFprdRgetFishInfo() { + return request({ + url: '/fpr/sdFprdR/getFishInfo', + method: 'post', + }); +} +//获取鱼类变化信息 +export function sdFprdRGetFtpChangeInfo(data: { baseId: string; year: string }) { + return request({ + url: '/fpr/sdFprdR/getFtpChangeInfo', + method: 'post', + data + }); +} \ No newline at end of file diff --git a/frontend/src/assets/images/fish_survey_liang.png b/frontend/src/assets/images/fish_survey_liang.png new file mode 100644 index 00000000..d81b210f Binary files /dev/null and b/frontend/src/assets/images/fish_survey_liang.png differ diff --git a/frontend/src/assets/images/fish_survey_shu.png b/frontend/src/assets/images/fish_survey_shu.png new file mode 100644 index 00000000..df6bdd5b Binary files /dev/null and b/frontend/src/assets/images/fish_survey_shu.png differ diff --git a/frontend/src/assets/images/fish_survey_zhong.png b/frontend/src/assets/images/fish_survey_zhong.png new file mode 100644 index 00000000..3b85578d Binary files /dev/null and b/frontend/src/assets/images/fish_survey_zhong.png differ diff --git a/frontend/src/components/MapModal/components/CommonAttachmentModal.vue b/frontend/src/components/MapModal/components/CommonAttachmentModal.vue index 1957f533..142beee2 100644 --- a/frontend/src/components/MapModal/components/CommonAttachmentModal.vue +++ b/frontend/src/components/MapModal/components/CommonAttachmentModal.vue @@ -27,7 +27,12 @@
- + +
@@ -52,7 +57,7 @@ import { ref, watch } from 'vue'; import { getIdUrl } from '@/api/mapModal'; import PdfView from '@/components/pdf/pdfView.vue'; - +import LiveVideoBox from '@/views/shiPinJianKong/components/LiveVideoBox.vue'; interface AttachmentFileItem { id: string; name: string; diff --git a/frontend/src/components/MapModal/components/NoLiveVideo.vue b/frontend/src/components/MapModal/components/NoLiveVideo.vue index 17b5eb60..2158f2f4 100644 --- a/frontend/src/components/MapModal/components/NoLiveVideo.vue +++ b/frontend/src/components/MapModal/components/NoLiveVideo.vue @@ -23,7 +23,7 @@ v-model:value="dateRange" format="YYYY-MM-DD" value-format="YYYY-MM-DD" - style="width: 100%" + style="width: 300px" @change="handleDateChange" /> @@ -281,7 +281,9 @@ watch( .video-mode { display: flex; - height: 600px; + height: 60vh; + min-height: 400px; + max-height: 800px; gap: 12px; .video-main { @@ -309,16 +311,24 @@ watch( flex-direction: column; border: 1px solid #e8e8e8; border-radius: 4px; + min-width: 0; .sidebar-search { padding: 8px; display: flex; align-items: center; border-bottom: 1px solid #e8e8e8; + flex-wrap: wrap; + gap: 8px; + + :deep(.ant-picker) { + max-width: 100%; + } } .sidebar-list { - height: 600px; + flex: 1; + min-height: 0; overflow-y: auto; display: grid; grid-template-columns: repeat(2, 1fr); @@ -339,13 +349,13 @@ watch( } &.active { - border-color: #1890ff; - background: #e6f7ff; + // border-color: #1890ff; + // background: #e6f7ff; } .item-thumb { width: 100%; - height: 105px; + height: 143px; background: #1a1a1a; overflow: hidden; display: flex; @@ -375,8 +385,8 @@ watch( .item-time { padding: 4px; - font-size: 11px; - color: #666; + font-size: 14px; + color: #000000D9; text-align: center; white-space: nowrap; overflow: hidden; @@ -393,4 +403,78 @@ watch( } } } + +// 响应式适配 +@media screen and (max-width: 1400px) { + .no-live-video { + .video-mode { + height: 55vh; + gap: 10px; + + .video-main { + flex: 0 0 65%; + } + + .video-sidebar { + flex: 0 0 35%; + + .sidebar-list { + grid-template-columns: repeat(2, 1fr); + gap: 6px; + padding: 6px; + } + } + } + } +} + +@media screen and (max-width: 1200px) { + .no-live-video { + .video-mode { + height: 50vh; + gap: 8px; + + .video-main { + flex: 0 0 70%; + } + + .video-sidebar { + flex: 0 0 30%; + + .sidebar-list { + grid-template-columns: 1fr; + } + + .sidebar-search { + :deep(.ant-picker-range) { + width: 100% !important; + } + } + } + } + } +} + +@media screen and (max-width: 768px) { + .no-live-video { + .video-mode { + flex-direction: column; + height: auto; + + .video-main { + flex: none; + height: 50vh; + } + + .video-sidebar { + flex: none; + height: 40vh; + + .sidebar-list { + grid-template-columns: repeat(2, 1fr); + } + } + } + } +} diff --git a/frontend/src/components/MapModal/index.vue b/frontend/src/components/MapModal/index.vue index 09e4f41e..3e974242 100644 --- a/frontend/src/components/MapModal/index.vue +++ b/frontend/src/components/MapModal/index.vue @@ -677,7 +677,7 @@ const setQGCTabList = async (_tabs: any, stcd: string) => { }; const res2 = await getVideoList(params); console.log('', modelStore.params.sttp); - // debugger + // if ( res2?.data?.data?.length > 0 || res2?.data?.records?.length > 0 || diff --git a/frontend/src/components/MapModal/setting.config.ts b/frontend/src/components/MapModal/setting.config.ts index ea097c15..aeea96a7 100644 --- a/frontend/src/components/MapModal/setting.config.ts +++ b/frontend/src/components/MapModal/setting.config.ts @@ -310,7 +310,9 @@ const FPTabs1: Array = [ name: '基础信息', key: 'basicInfo', type: 'basic', - url: '/api/dec-lygk-base-server/base/msstbprpt/getStcdInfo' + default: true, // 默认显示 + url: '/api/dec-lygk-base-server/base/msstbprpt/getStcdInfo', + }, { name: '实时视频', @@ -396,14 +398,14 @@ const FBTabs: Array = [ } } ] + }, + { + name: '实时视频', + key: 'videoInfo', + type: 'video', + url: '/video/dataStcdFrame/getVideoMonitorList' } // { - // name: '实时视频', - // key: 'videoInfo', - // type: 'video', - // url: '/video/dataStcdFrame/getVideoMonitorList' - // } - // { // name: "全景影像", // key: "panoramaInfo", // type: "panorama" @@ -873,7 +875,7 @@ const noLiveVideoTabs: Array = [ }, { name: '录像视频', - key: 'videoInfo', + key: 'noLiveVideo', type: 'noLiveVideo', url: '/video/dataStcdFrame/getVideoMonitorList' } diff --git a/frontend/src/components/SidePanelItem/index.vue b/frontend/src/components/SidePanelItem/index.vue index df4bbf5a..a464c85c 100644 --- a/frontend/src/components/SidePanelItem/index.vue +++ b/frontend/src/components/SidePanelItem/index.vue @@ -53,7 +53,12 @@ show-search placeholder="请选择" :size="'small'" - style="width: 120px" + :style="{ width: select.width || '80px' }" + :dropdown-style="{ + maxHeight: '400px', + overflow: 'auto', + minWidth: '200px' + }" :options="select.options" :filter-option="filterOption" @focus="handleFocus" @@ -84,7 +89,7 @@ value: 'value', children: 'children' }" - tree-node-filter-prop="label" + tree-node-filter-prop="title" popup-class-name="no-wrap-tree-select" @select="handleTreeSelect" @expand="handleTreeExpand" @@ -177,11 +182,12 @@ interface PromptConfig { } interface SelectConfig { - picker: any; - format: any; - show: boolean; - value: string | undefined; - options: SelectProps['options']; + picker?: any; + format?: any; + show?: boolean; + value?: string | undefined; + options?: SelectProps['options']; + width?: string; } // 定义组件名(便于调试和递归) @@ -239,7 +245,8 @@ const props = defineProps({ default: () => ({ show: false, value: undefined, - options: [] + options: [], + width: '' }) }, moreSelect: { @@ -652,7 +659,7 @@ const handleTreeSelect = (selectedKeys: string | string[], info: any) => { } moreSelectValue.value = selectedValue; - + // // 保存选中节点的额外属性(如 lgtd、lttd 等) if (info && typeof info === 'object') { selectedNodeExtra.value = { @@ -683,11 +690,16 @@ const handleFocus = () => { // Handle focus }; -const filterOption = (input: string, option?: { label: string; value: string }) => { +const filterOption = ( + input: string, + option?: { label: string; value: string } +) => { if (!option) return false; const label = option.label?.toLowerCase() || ''; const value = option.value?.toLowerCase() || ''; - return label.includes(input.toLowerCase()) || value.includes(input.toLowerCase()); + return ( + label.includes(input.toLowerCase()) || value.includes(input.toLowerCase()) + ); }; // 文字提示容器 @@ -759,7 +771,6 @@ const emitAllValues = () => { } else { payload.scopeDate = []; } - emit('update-values', payload); }; diff --git a/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue b/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue index ac7acf40..e871f270 100644 --- a/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue +++ b/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue @@ -596,7 +596,7 @@ const handleSearch = () => { // console.log( typeOne.value ) // console.log( formState.dtinType ) // console.log(typeOne.value == 'all' && formState.dtinType !='') - // debugger + // const filters: any[] = [ formState.dataDimensionVal != 'all' ? { field: 'baseId', @@ -660,7 +660,7 @@ const handleSearch = () => { // 刷新表格 tableRef.value?.getList(filter) if (kong.value) { - // debugger + // fetchPieData() } kong.value = true @@ -781,7 +781,7 @@ watch( () => props.typeOne, (newVal) => { typeOne.value = newVal - // debugger + // } ) @@ -798,7 +798,7 @@ watch( () => formState.types, (newType, oldType) => { if (!formState.dateValues || newType === oldType) return - // debugger + // const currentValue: any = formState.dateValues if (newType === 'year') { diff --git a/frontend/src/modules/EnvironmentalQuality/TwoLayers/HJMZDTwoLays.vue b/frontend/src/modules/EnvironmentalQuality/TwoLayers/HJMZDTwoLays.vue index 250a3217..d89fd1b2 100644 --- a/frontend/src/modules/EnvironmentalQuality/TwoLayers/HJMZDTwoLays.vue +++ b/frontend/src/modules/EnvironmentalQuality/TwoLayers/HJMZDTwoLays.vue @@ -564,7 +564,7 @@ watch( if (!stcd) { return; } - // debugger + // tableRef.value.tableData = []; getCol({ stcd, startTime, endTime }); }, diff --git a/frontend/src/modules/EnvironmentalQuality/index.vue b/frontend/src/modules/EnvironmentalQuality/index.vue index 2d3c4279..d2c9a511 100644 --- a/frontend/src/modules/EnvironmentalQuality/index.vue +++ b/frontend/src/modules/EnvironmentalQuality/index.vue @@ -319,7 +319,7 @@ const initChart = (): Promise => { const getEchartsData = async () => { // 1. 格式验证 const currentValue = datetimePicker.value.value; - // debugger + // if (select.value.value === 'year') { // 年度模式:验证是否为 YYYY 格式(4位数字) if (!/^\d{4}$/.test(currentValue)) { @@ -361,7 +361,7 @@ const getEchartsData = async () => { if( ! baseid.value){ return } - // debugger + // let params = { "filter": { "logic": "and", @@ -439,7 +439,7 @@ const getEchartsData = async () => { ] }; console.log('请求参数:', params); - // debugger + // // 4. 调用API并处理数据 loading.value = true; try { @@ -687,7 +687,7 @@ const updateChartData = (currentLabel: string, lastYearLabel: string) => { if (barData) { // 新增:获取对应的 baseid 或 rstcd const selectedId = chartDataIdMap.value[dataIndex] || ''; - // debugger + // clickedBarData.value = { name: barData.name.replace('\n', ''), // 去除换行符 current: barData.current, diff --git a/frontend/src/modules/GYZLLB/index.vue b/frontend/src/modules/GYZLLB/index.vue index fbc8e841..91f70884 100644 --- a/frontend/src/modules/GYZLLB/index.vue +++ b/frontend/src/modules/GYZLLB/index.vue @@ -714,7 +714,7 @@ const getechartsdata = async (yearOne: string) => { stopAutoPlay(); return; } - // debugger + // // 缓存全量数据 cachedApiData.value = responseData; currentYear.value = yearOne; diff --git a/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue b/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue index 0f04e34d..fb8619e4 100644 --- a/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue +++ b/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue @@ -37,7 +37,7 @@ import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import { getChuiXiangShuiWenTreeStcd, getCxswList } from '@/api/sw'; import { useModelStore } from '@/store/modules/model'; -import { useMapModalStore } from '@/store/modules/mapModal'; +// import { useMapModalStore } from '@/store/modules/mapModal'; import { MapClass } from '@/components/gis/map.class'; const modelStore = useModelStore(); @@ -356,7 +356,6 @@ const selectOptions = async () => { const data = { filter, sort }; const res = await getChuiXiangShuiWenTreeStcd(data); let dataOne = res?.data?.data || res.data; - if (dataOne.length > 0) { const treeData = dataOne.map(item => { return { @@ -547,7 +546,7 @@ const initChart = () => { )}-${lastDay} 23:59:59`; console.log(endTime); modelStore.modalVisible = true; - modelStore.params.sttp = 'WT'; + modelStore.params.sttp = 'WTRV'; modelStore.params.enfc = '1'; modelStore.title = stnm; // modelStore.isBasicEdit = true; @@ -663,53 +662,53 @@ const updateChart = () => { chartInstance.setOption(option, { notMerge: true }); }; -const handleChartClick = (params: any) => { - if (!params || !params.seriesName) return; +// const handleChartClick = (params: any) => { +// if (!params || !params.seriesName) return; - const matchMonth = params.seriesName.match(/\d+/); - const monthNum = matchMonth ? parseInt(matchMonth[0]) : 1; +// const matchMonth = params.seriesName.match(/\d+/); +// const monthNum = matchMonth ? parseInt(matchMonth[0]) : 1; - const year = - typeof datetimePicker.value.value === 'string' - ? parseInt(datetimePicker.value.value) - : datetimePicker.value.value; +// const year = +// typeof datetimePicker.value.value === 'string' +// ? parseInt(datetimePicker.value.value) +// : datetimePicker.value.value; - const startTime = `${year}-${String(monthNum).padStart(2, '0')}-01 00:00:00`; - const lastDay = new Date(year, monthNum, 0).getDate(); - const endTime = `${year}-${String(monthNum).padStart( - 2, - '0' - )}-${lastDay} 23:59:59`; +// const startTime = `${year}-${String(monthNum).padStart(2, '0')}-01 00:00:00`; +// const lastDay = new Date(year, monthNum, 0).getDate(); +// const endTime = `${year}-${String(monthNum).padStart( +// 2, +// '0' +// )}-${lastDay} 23:59:59`; - const currentStcd = select.value.value; - let currentStnm = ''; +// const currentStcd = select.value.value; +// let currentStnm = ''; - select.value.options.forEach((station: any) => { - station.children?.forEach((child: any) => { - if (child.value === currentStcd) { - currentStnm = child.title; - } - }); - }); +// select.value.options.forEach((station: any) => { +// station.children?.forEach((child: any) => { +// if (child.value === currentStcd) { +// currentStnm = child.title; +// } +// }); +// }); - import('@/store/modules/model').then(({ useModelStore }) => { - import('@/components/MapModal/setting.config').then(({ handleTabs }) => { - const modelStore = useModelStore(); +// import('@/store/modules/model').then(({ useModelStore }) => { +// import('@/components/MapModal/setting.config').then(({ handleTabs }) => { +// const modelStore = useModelStore(); - modelStore.params = { - sttp: 'WT', - stcd: currentStcd, - titleName: currentStnm, - enfc: '1', - timeRange: [startTime, endTime] - } as any; +// modelStore.params = { +// sttp: 'WT', +// stcd: currentStcd, +// titleName: currentStnm, +// enfc: '1', +// timeRange: [startTime, endTime] +// } as any; - modelStore.title = currentStnm ? `${currentStnm} ` : ''; - modelStore.tabList = handleTabs(modelStore.params); - modelStore.modalVisible = true; - }); - }); -}; +// modelStore.title = currentStnm ? `${currentStnm} ` : ''; +// modelStore.tabList = handleTabs(modelStore.params); +// modelStore.modalVisible = true; +// }); +// }); +// }; // ==================== 生命周期和监听 ==================== @@ -750,19 +749,9 @@ watch( // }, // { deep: true } // ); -const handlePanelChange1 = (data: any, type: string) => { +const handlePanelChange1 = (data: any) => { console.log('当前所有控件状态:', data); if (data.moreSelect && data.datetime) { - if (type == 'click') { - const mapClass = MapClass.getInstance(); - mapClass.flyTopanto( - [ - Number(data.selectedNodeExtra.lgtd), - Number(data.selectedNodeExtra.lttd) - ], - 15 - ); - } year.value = data.datetime; fetchChartData(data.moreSelect, data.datetime); } else { @@ -772,6 +761,16 @@ const handlePanelChange1 = (data: any, type: string) => { selected.value = {}; showemit.value = false; } + if (data?.selectedNodeExtra?.lttd && data?.selectedNodeExtra?.lgtd) { + const mapClass = MapClass.getInstance(); + mapClass.flyTopanto( + [ + Number(data.selectedNodeExtra.lgtd), + Number(data.selectedNodeExtra.lttd) + ], + 15 + ); + } }; diff --git a/frontend/src/modules/churukushuiwenMod/index.vue b/frontend/src/modules/churukushuiwenMod/index.vue index 71ff0fb7..388895b7 100644 --- a/frontend/src/modules/churukushuiwenMod/index.vue +++ b/frontend/src/modules/churukushuiwenMod/index.vue @@ -52,6 +52,7 @@ import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { getVmsstbprpt, inOutOneGetKendoListCust } from '@/api/sw'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import churukushuiwen from './churukushuiwen.vue'; +import { MapClass } from '@/components/gis/map.class'; // ==================== 组件基础配置 ==================== // 定义组件名(便于调试和递归) defineOptions({ @@ -608,10 +609,12 @@ const handleModalClose = () => { */ const handlePanelChange1 = (data: any, type: string) => { // TODO: 后续可扩展联动逻辑 - if (data.moreSelect) { + if (data.moreSelect && data.scopeDate) { paramsOne.value.value = data.moreSelect; - } - if (type == 'click') { + paramsOne.value.tm = data.scopeDate; + fetchChartData(); + } + if (data?.selectedNodeExtra?.lttd && data?.selectedNodeExtra?.lgtd) { const mapClass = MapClass.getInstance(); mapClass.flyTopanto( [ @@ -621,8 +624,6 @@ const handlePanelChange1 = (data: any, type: string) => { 13 ); } - paramsOne.value.tm = data.scopeDate; - fetchChartData(); }; /** @@ -695,7 +696,6 @@ const getselsectData = async () => { console.log('res', res); const data = res?.data?.data || res?.data; const obj: any = {}; - if (data) { // 将扁平数据转换为树形结构(按基地分组) data.map(e => { @@ -733,7 +733,6 @@ const getselsectData = async () => { return indexA - indexB; }); console.log('treeData', treeData); - // 更新下拉框选项 select.value.options = treeData; diff --git a/frontend/src/modules/fishSurvey/FishChangeTu/index.vue b/frontend/src/modules/fishSurvey/FishChangeTu/index.vue new file mode 100644 index 00000000..b2c4c93f --- /dev/null +++ b/frontend/src/modules/fishSurvey/FishChangeTu/index.vue @@ -0,0 +1,338 @@ + + + + + diff --git a/frontend/src/modules/fishSurvey/FishIntroduce/index.vue b/frontend/src/modules/fishSurvey/FishIntroduce/index.vue index 220c21f7..e910b751 100644 --- a/frontend/src/modules/fishSurvey/FishIntroduce/index.vue +++ b/frontend/src/modules/fishSurvey/FishIntroduce/index.vue @@ -1,76 +1,98 @@ \ No newline at end of file + diff --git a/frontend/src/modules/fishSurvey/FishVideo/index.vue b/frontend/src/modules/fishSurvey/FishVideo/index.vue index 324687dd..7c4a9546 100644 --- a/frontend/src/modules/fishSurvey/FishVideo/index.vue +++ b/frontend/src/modules/fishSurvey/FishVideo/index.vue @@ -1,76 +1,144 @@ \ No newline at end of file + diff --git a/frontend/src/modules/fishSurvey/SurveyQingKuang/DeviceTableModal.vue b/frontend/src/modules/fishSurvey/SurveyQingKuang/DeviceTableModal.vue new file mode 100644 index 00000000..68e8558b --- /dev/null +++ b/frontend/src/modules/fishSurvey/SurveyQingKuang/DeviceTableModal.vue @@ -0,0 +1,407 @@ + + + + + diff --git a/frontend/src/modules/fishSurvey/SurveyQingKuang/index.vue b/frontend/src/modules/fishSurvey/SurveyQingKuang/index.vue new file mode 100644 index 00000000..a823e004 --- /dev/null +++ b/frontend/src/modules/fishSurvey/SurveyQingKuang/index.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/frontend/src/modules/fishSurvey/ZhuanZhiIntroduce/index.vue b/frontend/src/modules/fishSurvey/ZhuanZhiIntroduce/index.vue index 24c07ee7..d2bca5f2 100644 --- a/frontend/src/modules/fishSurvey/ZhuanZhiIntroduce/index.vue +++ b/frontend/src/modules/fishSurvey/ZhuanZhiIntroduce/index.vue @@ -1,75 +1,111 @@ \ No newline at end of file + diff --git a/frontend/src/modules/guoyusheshijiansheqingkuang/ModalPage/index.vue b/frontend/src/modules/guoyusheshijiansheqingkuang/ModalPage/index.vue index 3806a835..aec41654 100644 --- a/frontend/src/modules/guoyusheshijiansheqingkuang/ModalPage/index.vue +++ b/frontend/src/modules/guoyusheshijiansheqingkuang/ModalPage/index.vue @@ -308,7 +308,7 @@ const buildFilter = () => { // 处理排序变化 const handleSortChange = (info: { field: string; order: string | null }) => { - // debugger + // if (info.field && info.order) { sortState.value = info; } else { @@ -356,6 +356,8 @@ const handleViewDetail = (record: any, type: string) => { modelStore.params.sttp = lastValue modelStore.title = record.stnm; modelStore.params.stcd = record.stcd; + modelStore.params.bldsttCcode = record.bldsttCcode; + // } // console.log('【查看详情】', record) }; diff --git a/frontend/src/modules/qixidiliuliangbianhua/index.vue b/frontend/src/modules/qixidiliuliangbianhua/index.vue index cb30c56f..8fff3e8e 100644 --- a/frontend/src/modules/qixidiliuliangbianhua/index.vue +++ b/frontend/src/modules/qixidiliuliangbianhua/index.vue @@ -609,13 +609,13 @@ const getselsectData = async () => { value: item.stcd }; }); - // debugger + // }; const convertDateRange = (dateRange: string[]) => { if (!dateRange || dateRange.length !== 2) { return null; } - // debugger + // const [startStr, endStr] = dateRange; diff --git a/frontend/src/modules/qixidishuiwenbianhua/index.vue b/frontend/src/modules/qixidishuiwenbianhua/index.vue index 42cb222a..08100bb2 100644 --- a/frontend/src/modules/qixidishuiwenbianhua/index.vue +++ b/frontend/src/modules/qixidishuiwenbianhua/index.vue @@ -514,7 +514,7 @@ const convertDateRange = (dateRange: string[]) => { if (!dateRange || dateRange.length !== 2) { return null; } - // debugger + // const [startStr, endStr] = dateRange; @@ -634,7 +634,7 @@ const getselsectData = async () => { value: item.stcd }; }); - // debugger + // }; //// watch( diff --git a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xianZhiYanChenBianHua/index.vue b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xianZhiYanChenBianHua/index.vue index b1e98f89..2de69007 100644 --- a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xianZhiYanChenBianHua/index.vue +++ b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xianZhiYanChenBianHua/index.vue @@ -170,7 +170,7 @@ const chartRef = ref(); // 处理图表点击事件 const handleChartClick = (params: any) => { - // debugger + // console.log('点击数据点:', params); const { name, value, data } = params; modelStore.modalVisible = true; diff --git a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue index 7245ee49..30ae4cb3 100644 --- a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue +++ b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue @@ -404,7 +404,7 @@ const fetchData = async () => { }); data.value = processedData; - // debugger + // // 提取唯一的基地名称作为 X 轴数据 echartsXData.value = [ ...new Set(processedData.map(item => item.basename)) diff --git a/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue b/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue index a7921bb2..1791ddf0 100644 --- a/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue +++ b/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue @@ -37,6 +37,7 @@ :allow-clear="false" format="YYYY-MM-DD" style="width: 260px" + :presets="DateSetting.RangeButton.days1" /> @@ -103,7 +104,7 @@ import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import { dayGetKendoListCust, hourGetKendoListCust } from '@/api/stll'; import BasicTable from '@/components/BasicTable/index.vue'; import { useModelStore } from '@/store/modules/model'; - +import { DateSetting } from '@/utils/enumeration'; const modelStore = useModelStore(); const props = defineProps<{ options?: any[]; diff --git a/frontend/src/modules/shengtaidabiaoMod/index.vue b/frontend/src/modules/shengtaidabiaoMod/index.vue index 7cdf61dc..5c9c4353 100644 --- a/frontend/src/modules/shengtaidabiaoMod/index.vue +++ b/frontend/src/modules/shengtaidabiaoMod/index.vue @@ -244,7 +244,7 @@ const getData = async () => { // 根据API响应结构规范处理数据 if (res.data && res.data.list) { const apiList = res.data.list; - // debugger + // // 只使用前两条数据(type: 1 和 type: 2) if (apiList && apiList.length > 0) { dataArr.value = apiList.slice(0, 2).map((item: any) => ({ @@ -311,7 +311,7 @@ const getcont = async () => { if (list) { titleData.value = list } - // debugger + // }; // 页面加载时执行的逻辑 onMounted(() => { diff --git a/frontend/src/modules/shengtaidabiaoTwoMod/index.vue b/frontend/src/modules/shengtaidabiaoTwoMod/index.vue index f384b4f0..dd15352e 100644 --- a/frontend/src/modules/shengtaidabiaoTwoMod/index.vue +++ b/frontend/src/modules/shengtaidabiaoTwoMod/index.vue @@ -307,7 +307,7 @@ const initChart = () => { const handleChartClick = (params: any) => { const categoryName = params.name; const currentIndex = params.dataIndex; - // debugger + // // 设置弹框标题 detailModalTitle.value = @@ -318,7 +318,7 @@ const handleChartClick = (params: any) => { // 获取当前点击项的详细数据 const baseId = mode.value === 'top' ? chartData.value.baseIds[currentIndex] : undefined; const qecPerformance = mode.value === 'left' ? chartData.value.qecPerformances[currentIndex] : undefined; - // debugger + // const currentItem = { baseId: baseId, @@ -505,7 +505,7 @@ const getcont = async () => { if (list) { titleData.value = list; } - // debugger + // }; // 页面加载时执行的逻辑 onMounted(() => { diff --git a/frontend/src/modules/shuiWenNianNeiFenBu/index.vue b/frontend/src/modules/shuiWenNianNeiFenBu/index.vue index 42ec49b6..adec0042 100644 --- a/frontend/src/modules/shuiWenNianNeiFenBu/index.vue +++ b/frontend/src/modules/shuiWenNianNeiFenBu/index.vue @@ -224,6 +224,7 @@ const getselectData = async () => { // 合并结果并设置选项 select.value.options = [...dataMapNameArr, ...otherArr]; + // // if (baseid.value == 'all') { // select.value.value = '008640202300001021' @@ -536,23 +537,23 @@ onBeforeUnmount(() => { //监听子组件的数据变化 const handlePanelChange1 = (data: any, type: string) => { console.log('当前所有控件状态:', data); - if (type == 'click') { + // 当选择器或日期变化时,重新加载图表数据 + if (data.moreSelect || data.datetime) { + select.value.value = data.moreSelect; + datetimePicker.value.value = data.datetime; + // + getshuiwenList(); + } + if (data?.selectedNodeExtra?.lttd && data?.selectedNodeExtra?.lgtd) { const mapClass = MapClass.getInstance(); mapClass.flyTopanto( [ Number(data.selectedNodeExtra.lgtd), Number(data.selectedNodeExtra.lttd) ], - 15 + 15 ); } - // 当选择器或日期变化时,重新加载图表数据 - if (data.moreSelect || data.datetime) { - select.value.value = data.moreSelect; - datetimePicker.value.value = data.datetime; - // debugger - getshuiwenList(); - } }; const baseid = ref(''); watch( diff --git a/frontend/src/modules/shuizhijiancegongzuoQK/index.vue b/frontend/src/modules/shuizhijiancegongzuoQK/index.vue index 6732ea46..d655156f 100644 --- a/frontend/src/modules/shuizhijiancegongzuoQK/index.vue +++ b/frontend/src/modules/shuizhijiancegongzuoQK/index.vue @@ -208,7 +208,7 @@ const getDataList = async () => { } // const params = [data1, data2] const res1 = await msstbprptGetKendoList(data1); - // debugger + // let finalData = facilities.value.map((item) => ({ ...item, count: 0 })) if (res1.data) { const { data } = res1 @@ -220,7 +220,7 @@ const getDataList = async () => { }) } console.log(finalData) - // debugger/ + // / const res2 = await msstbprptGetKendoList(data2); if (res2.data) { const responseData = res2?.data?.data @@ -231,7 +231,7 @@ const getDataList = async () => { } facilities.value = finalData console.log(finalData) - // debugger + // } catch (error) { console.error('获取数据失败:', error); } finally { diff --git a/frontend/src/modules/stllyanchengChangeMod/index.vue b/frontend/src/modules/stllyanchengChangeMod/index.vue index a8882c91..905d6795 100644 --- a/frontend/src/modules/stllyanchengChangeMod/index.vue +++ b/frontend/src/modules/stllyanchengChangeMod/index.vue @@ -166,7 +166,7 @@ const getSelect = async () => { } if (data && data.length > 0) { - // debugger; + // ; select.value.value = data[0].wbsCode; selectData.value = data[0].wbsCode; // 同步选中第一个 select.value.options = data.map(item => ({ diff --git a/frontend/src/store/modules/model.ts b/frontend/src/store/modules/model.ts index 58cc6681..38fe7274 100644 --- a/frontend/src/store/modules/model.ts +++ b/frontend/src/store/modules/model.ts @@ -34,6 +34,7 @@ export const useModelStore = defineStore('model', () => { sttpMap?: string; // 新增:站点类型映射 dtinType?: string; bldstt: string; + bldsttCcode: string; }>({ sttp: 'eng', stcd: '', @@ -45,7 +46,8 @@ export const useModelStore = defineStore('model', () => { sttpCode: '', sttpMap: '', dtinType: '', - bldstt: '' + bldstt: '', + bldsttCcode:'' }); const filter = ref({ stllgzlx: '', // 生态流量 - 规则类型 diff --git a/frontend/src/views/fish-survey/fishSurveyZhuanZhi.vue b/frontend/src/views/fish-survey/fishSurveyZhuanZhi.vue index 527d7a48..040cfe26 100644 --- a/frontend/src/views/fish-survey/fishSurveyZhuanZhi.vue +++ b/frontend/src/views/fish-survey/fishSurveyZhuanZhi.vue @@ -1,9 +1,73 @@ - + diff --git a/frontend/src/views/shiPinJianKong/components/LiveVideoBox.vue b/frontend/src/views/shiPinJianKong/components/LiveVideoBox.vue index a038dcf4..269ba916 100644 --- a/frontend/src/views/shiPinJianKong/components/LiveVideoBox.vue +++ b/frontend/src/views/shiPinJianKong/components/LiveVideoBox.vue @@ -14,6 +14,13 @@
+ +
+
+ +
数据源错误,无法加载视频
+
+
@@ -31,6 +38,9 @@ import videojs from 'video.js'; import 'video.js/dist/video-js.css'; const baseUrl = import.meta.env.VITE_APP_ATTACHMENT_URL; +// 错误提示显示状态 +const showError = ref(false); + // 注册 HLS 支持(video.js 8.x 内置了 HLS 支持) interface VideoData { @@ -89,6 +99,11 @@ const initPlayer = () => { player.dispose(); player = null; } + + // 重试计数器(用于限制重试次数) + let retryCount = 0; + const maxRetries = 5; + try { // 创建 video 元素 const videoElement = document.createElement('video'); @@ -195,36 +210,55 @@ const initPlayer = () => { const error = player.error(); console.error('播放器错误:', error); - // 保持最后一帧画面,不显示错误提示 - // 在后台静默重试 - let retryCount = 0; - const maxRetries = 10; + // 检查是否已达到最大重试次数 + if (retryCount >= maxRetries) { + console.warn(`已达到最大重试次数(${maxRetries}次),停止重试`); + // 显示自定义错误提示层 + showError.value = true; + return; + } - const attemptReload = () => { - if (retryCount < maxRetries && player && videoUrl.value) { - retryCount++; - setTimeout(() => { - try { - player.src({ - src: videoUrl.value, - type: videoType // 指定视频类型 - }); - player.load(); - player.play(); - } catch (e) { - if (retryCount < maxRetries) { - attemptReload(); + // 增加重试计数 + retryCount++; + console.log(`视频加载失败,正在进行第 ${retryCount}/${maxRetries} 次重试...`); + + // 立即显示自定义错误提示层 + showError.value = true; + + // 延迟后重试 + setTimeout(() => { + try { + if (player && videoUrl.value) { + // 隐藏错误提示层(重试时) + showError.value = false; + player.src({ + src: videoUrl.value, + type: videoType + }); + player.load(); + player.play(); + } + } catch (e) { + console.error('重试加载视频失败:', e); + // 如果重试失败且未达到最大次数,继续重试 + if (retryCount < maxRetries) { + setTimeout(() => { + if (player) { + player.error(); // 触发下一次错误处理 } - } - }, 3000); + }, 100); + } } - }; - - attemptReload(); + }, 3000); }); // 监听加载完成 - player.on('loadeddata', () => {}); + player.on('loadeddata', () => { + // 加载成功时重置重试计数器 + retryCount = 0; + // 隐藏错误提示 + showError.value = false; + }); // 监听播放状态 player.on('play', () => {}); @@ -339,6 +373,40 @@ onUnmounted(() => { } } + .custom-error-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0); + display: flex; + align-items: center; + justify-content: center; + z-index: 10; + + .error-content { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + .error-icon { + font-size: 48px; + margin-bottom: 12px; + opacity: 0.5; + color: #999; + } + + .error-text { + font-size: 14px; + color: #fff; + text-align: center; + margin-top: 12px; + } + } + } + .video-empty { width: 100%; height: 100%; diff --git a/frontend/src/views/shuiZhiJianCe/shuiHuanJingZhiLiangZhuangKuang.vue b/frontend/src/views/shuiZhiJianCe/shuiHuanJingZhiLiangZhuangKuang.vue index 33661117..00b92a16 100644 --- a/frontend/src/views/shuiZhiJianCe/shuiHuanJingZhiLiangZhuangKuang.vue +++ b/frontend/src/views/shuiZhiJianCe/shuiHuanJingZhiLiangZhuangKuang.vue @@ -12,7 +12,7 @@ watch( () => JidiSelectEventStore.selectedItem, (newVal) => { console.log(newVal); - // debugger + // wbsCode.value = newVal.wbsCode; }, { deep: true, immediate: true }