From 307b17ef15c73a071912a262834f2a5f68e1fa87 Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期四, 11 九月 2025 15:20:35 +0800 Subject: [PATCH] 完成走航季度报告自动生成 --- src/views/historymode/component/MissionReport.vue | 365 +++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 291 insertions(+), 74 deletions(-) diff --git a/src/views/historymode/component/MissionReport.vue b/src/views/historymode/component/MissionReport.vue index 2f55c67..8cb9b57 100644 --- a/src/views/historymode/component/MissionReport.vue +++ b/src/views/historymode/component/MissionReport.vue @@ -72,6 +72,7 @@ import chartMapAmap from '@/utils/chart/chart-map-amap'; import { Legend } from '@/model/Legend'; import { getHexColor, getColorBetweenTwoColors } from '@/utils/color'; +import { getGridDataDetailFactorValue } from '@/model/GridDataDetail'; // 鍊熺敤鍗槦閬ユ祴妯″潡涓殑100绫崇綉鏍� const props = defineProps({ @@ -106,7 +107,8 @@ cityName: formObj.value.location.cName, districtCode: formObj.value.location.dCode, districtName: formObj.value.location.dName - } + }, + factorTypes: radioOptions(TYPE0).map((e) => e.name) }; }); @@ -121,6 +123,7 @@ srySceneCount: 5, sryProbByFactor: '棰楃矑鐗╋紙PM锛夌浉鍏砐澶勶紝鍗犳瘮 %锛屼富瑕佹秹鍙婂伐鍦版壃灏樻薄鏌撻棶棰樸�侀亾璺壃灏樻薄鏌撻棶棰樼瓑锛沄OC鐩稿叧X澶勶紝鍗犳瘮 %锛屼富瑕佹秹鍙婂姞娌圭珯娌规皵娉勯湶銆侀楗补鐑熸薄鏌撶瓑', + sryFocusRegion: '鑱氱劍鍖哄煙', missionInfoList: [ { missionCode: '', @@ -129,7 +132,8 @@ _airQulity: 'AQI锛�30锛堜紭锛�', mainFactor: '', _abnormalFactors: '', - sceneCount: 0 + sceneCount: 0, + _kilometres: '1000' } ], missionDetailList: [ @@ -147,6 +151,7 @@ avgValue: 38 } ], + _airQulity: 'AQI锛�30锛堜紭锛�', aqi: 30, pollutionDegree: '浼�' } @@ -174,6 +179,31 @@ } ] } + ], + gridFusionByAQIList: [ + { + pollutionDegree: '浼�', + _areaDes: '璧拌埅鍖哄煙澶у皬', + _gridDes: '100绫虫鏂瑰舰缃戞牸', + _missionDes: '20250729銆�20250730涓ゆ', + highRiskGridList: [ + { + index: 1, + factor: 'PM2.5', + // 鏍囧噯鑹茬綉鏍煎浘 + gridImgUrl1: '', + // 瀵规瘮鑹茬綉鏍煎浘 + gridImgUrl2: '', + factorValue: 20, + // 鍥涜嚦鑼冨洿锛岄『搴忎负鏈�灏忕粡搴︼紝鏈�澶х粡搴︼紝鏈�灏忕含搴︼紝鏈�澶х含搴� + bounds: [121.4945, 121.4955, 31.2304, 31.2314], + _boundsDes: '鍥涜嚦鑼冨洿', + // 娑夊強琛楅晣 + town: '', + _scenesDes: '娑夊強鐨勬薄鏌撳満鏅�' + } + ] + } ] }; @@ -183,7 +213,9 @@ generateMissionList(params.value).then(() => { generateMissionDetail(params.value).then(() => { generateClueByRiskArea(params.value).then(() => { - generateDocx(); + generateGridFusion(params.value).then(() => { + generateDocx(); + }); }); }); }); @@ -217,6 +249,7 @@ return `${item.first}鐩稿叧${item.second}澶勶紝鍗犳瘮 ${Math.round(item.third * 1000) / 10}%锛屼富瑕佹秹鍙�${getPollutingProblemTypes(item.first)}绛塦; }) .join('锛�'); + templateParam.sryFocusRegion = res.data.focusRegion.join('銆�'); }); } @@ -228,18 +261,6 @@ item._abnormalFactors = item.abnormalFactors .map((factor) => factor) .join('銆�'); - return item; - }); - }); -} - -function generateMissionDetail(param) { - return dataAnalysisApi.fetchMissionDetail(param).then((res) => { - templateParam.missionDetailList = res.data.map((item, index) => { - const t = formatDateTimeRange(item.startTime, item.endTime).split(' '); - item._index = index + 1; - item._startTime = t[0]; - item._time = t[1]; item._kilometres = Math.round(item.kilometres / 1000); const keySceneMap = new Map(); @@ -256,16 +277,35 @@ `${info.count}涓�${type}锛�${info.scenes.map((s) => s.name).join('銆�')}锛塦 ) .join('銆�'); - item._dataStat = item.dataStatistics - .map( - (e) => - `${e.factor.des}锛堣寖鍥�${e.minValue}鈥�${e.maxValue}渭g/m鲁锛屽潎鍊�${e.avgValue}渭g/m鲁锛塦 - ) - .join('銆�'); + item._focusScene = + item.scenes.length > 0 + ? item.scenes.map((s) => s.name).join('銆�') + : '閬撹矾浜ら�氬瘑闆嗗尯鍜岄儴鍒嗘柦宸ュ懆杈�'; + return item; + }); + }); +} + +function generateMissionDetail(param) { + return dataAnalysisApi.fetchMissionDetail(param).then((res) => { + templateParam.missionDetailList = res.data.map((item, index) => { + const t = formatDateTimeRange(item.startTime, item.endTime).split(' '); + item._index = index + 1; + item._startTime = t[0]; + item._time = t[1]; + item._kilometres = Math.round(item.kilometres / 1000); + item._airQulity = `AQI锛�${item.aqi}锛�${item.pollutionDegree}锛塦; const factorNames = radioOptions(TYPE0).map((e) => e.name); item._dataStatistics = item.dataStatistics.filter((e) => { return factorNames.indexOf(e.factor) != -1; + }); + + radioOptions(TYPE0).forEach((f) => { + const _factor = item.dataStatistics.find((e) => e.factor == f.name); + item[`avgValue_${f.name}`] = _factor?.avgValue ?? '-'; + item[`maxValue_${f.name}`] = _factor?.maxValue ?? '-'; + item[`minValue_${f.name}`] = _factor?.minValue ?? '-'; }); return item; @@ -278,7 +318,7 @@ templateParam.clueByAreaList = res.data.map((item, index) => { return { _index: index + 1, - _area: item.sceneInfo.name + '鍛ㄨ竟', + _area: `${item.sceneInfo.type}${item.sceneInfo.name}鍛ㄨ竟`, clueByFactorList: item.clueByFactorList.map((cbf) => { return { factor: cbf.factor, @@ -348,63 +388,240 @@ return images; } -function handleMixClick() { - const tags = [1, 2]; - const fetchGridData = () => { - gridApi.mixUnderwayGridData(props.groupId, tags).then((res) => { - const gridData = res.data.map((v) => { - const data = v.pm25; - const grid = gridCellList.value.find((g) => { - return g.cellIndex == v.cellId; +function generateGridFusion(param) { + return dataAnalysisApi.fetchGridFusion(param).then((res) => { + const promiseList = []; + templateParam.gridFusionByAQIList = []; + + res.data.forEach((item) => { + const scenes = []; + item.missionList.forEach((m) => { + m.keyScene.map((s) => { + if (scenes.indexOf(s.name) == -1) { + scenes.push(s.name); + } }); - const { color, nextColor, range, nextRange } = - Legend.getStandardColorAndNext('PM25', data); - const ratio = (data - range) / (nextRange - range); - const _color = getColorBetweenTwoColors( - color.map((v) => v * 255), - nextColor.map((v) => v * 255), - ratio - ); - - // // 鏍规嵁閬ユ祴鏁版嵁璁$畻缃戞牸棰滆壊 - // const { color, nextColor, range, nextRange } = - // Legend.getCustomColorAndNext(data, min, max); - // const ratio = (data - range) / (nextRange - range); - - // const _color = getColorBetweenTwoColors( - // color.map((v) => v * 255), - // nextColor.map((v) => v * 255), - // ratio - // ); - return { - centerLng: grid.longitude, - centerLat: grid.latitude, - value: _color, - coordinates: [ - [grid.point1Lon, grid.point1Lat], - [grid.point2Lon, grid.point2Lat], - [grid.point3Lon, grid.point3Lat], - [grid.point4Lon, grid.point4Lat] - ] - }; }); - // chartMapAmap.generateGridMap(gridData).then((url) => { - // gridBase64Url.value = url; - // }); - gridBase64Url.value = chartMap.generateGridMap(gridData); + const gfbAQI = { + pollutionDegree: item.pollutionDegree, + _areaDes: `璧拌埅鍖哄煙缁忚繃${scenes.join('銆�')}`, + _gridDes: `${item.gridLen}绫虫鏂瑰舰缃戞牸`, + _missionDes: `${item.missionList.map((m) => m.missionCode).join('銆�')}鍏�${item.missionList.length}娆 + }; + const _highRiskGridList = []; + item.highRiskGridList.forEach((g, i) => { + // const g = item.highRiskGridList[0]; + // const i = 0; + const p = generateGridFusionImg(g.factorType, item.gridFusionList).then( + (url) => { + const { url1, url2 } = url; + _highRiskGridList.push({ + index: i + 1, + factor: g.factorType, + // 鏍囧噯鑹茬綉鏍煎浘 + gridImgUrl1: url1, + // 瀵规瘮鑹茬綉鏍煎浘 + gridImgUrl2: url2, + factorValue: g.factorValue, + // 鍥涜嚦鑼冨洿锛岄『搴忎负鏈�灏忕粡搴︼紝鏈�澶х粡搴︼紝鏈�灏忕含搴︼紝鏈�澶х含搴� + _boundsDes: `缁忓害${g.bounds[0]}鑷�${g.bounds[1]}锛岀含搴�${g.bounds[2]}鑷�${g.bounds[3]}`, + // 娑夊強琛楅晣 + town: g.town, + _scenesDes: + g.highRiskScenes.length > 0 + ? `娑夊強鐨勬薄鏌撳満鏅寘鎷�${g.highRiskScenes.map((s) => s.name).join('銆�')}` + : '缃戞牸鍐呭彲鑳藉瓨鍦ㄩ殣钘忛闄╂簮' + }); + } + ); + promiseList.push(p); + }); + gfbAQI.highRiskGridList = _highRiskGridList; + templateParam.gridFusionByAQIList.push(gfbAQI); }); - }; + return Promise.all(promiseList).then(() => { + return templateParam.gridFusionByAQIList; + }); + // templateParam.gridFusionByAQIList = res.data.map((item) => { + // const scenes = []; + // item.missionList.forEach((m) => { + // m.keyScene.map((s) => { + // if (scenes.indexOf(s.name) == -1) { + // scenes.push(s.name); + // } + // }); + // }); + // return { + // pollutionDegree: item.pollutionDegree, + // _areaDes: `璧拌埅鍖哄煙缁忚繃${scenes.join('銆�')}`, + // _gridDes: `${item.gridLen}绫虫鏂瑰舰缃戞牸`, + // _missionDes: `${item.missionList.map((m) => m.missioncode).join('銆�')}${item.missionList.length}娆, + // highRiskGridList: item.highRiskGridList.map(async (g, i) => { + // const { url1, url2 } = await generateGridFusionImg( + // g.factorType, + // item.gridFusionList + // ); + // return { + // index: i + 1, + // factor: g.factorType, + // // 鏍囧噯鑹茬綉鏍煎浘 + // gridImgUrl1: url1, + // // 瀵规瘮鑹茬綉鏍煎浘 + // gridImgUrl2: url2, + // factorValue: g.factorValue, + // // 鍥涜嚦鑼冨洿锛岄『搴忎负鏈�灏忕粡搴︼紝鏈�澶х粡搴︼紝鏈�灏忕含搴︼紝鏈�澶х含搴� + // _boundsDes: `缁忓害${g.bounds[0]}鑷�${g.bounds[1]}锛岀含搴�${g.bounds[2]}鑷�${g.bounds[3]}`, + // // 娑夊強琛楅晣 + // town: g.town, + // _scenesDes: g.highRiskScenes.map((s) => s.name).join('銆�') + // }; + // }) + // }; + // }); + }); +} - if (gridCellList.value.length == 0) { - gridApi - .fetchGridCell(props.groupId) - .then((res) => { - gridCellList.value = res.data; - }) - .then(() => fetchGridData()); - } else { - fetchGridData(); +async function generateGridFusionImg(factorName, dataList) { + let min = 1000000; + let max = 0; + dataList.forEach((v) => { + min = Math.min(min, getGridDataDetailFactorValue(v.data, factorName)); + max = Math.max(max, getGridDataDetailFactorValue(v.data, factorName)); + }); + + const gridDataStand = []; + const gridDataCustom = []; + dataList.forEach((v) => { + const data = getGridDataDetailFactorValue(v.data, factorName); + const grid = v.cell; + + // 鏍囧噯鑹� + const { + color: color1, + nextColor: nextColor1, + range: range1, + nextRange: nextRange1 + } = Legend.getStandardColorAndNext(factorName, data); + const ratio1 = (data - range1) / (nextRange1 - range1); + const _color1 = getColorBetweenTwoColors( + color1.map((v) => v * 255), + nextColor1.map((v) => v * 255), + ratio1 + ); + + // 瀵规瘮鑹� + const { color, nextColor, range, nextRange } = Legend.getCustomColorAndNext( + data, + min, + max + ); + const ratio = (data - range) / (nextRange - range); + const _color = getColorBetweenTwoColors( + color.map((v) => v * 255), + nextColor.map((v) => v * 255), + ratio + ); + + gridDataStand.push({ + centerLng: grid.longitude, + centerLat: grid.latitude, + value: _color1, + coordinates: [ + [grid.point1Lon, grid.point1Lat], + [grid.point2Lon, grid.point2Lat], + [grid.point3Lon, grid.point3Lat], + [grid.point4Lon, grid.point4Lat] + ] + }); + gridDataCustom.push({ + centerLng: grid.longitude, + centerLat: grid.latitude, + value: _color, + coordinates: [ + [grid.point1Lon, grid.point1Lat], + [grid.point2Lon, grid.point2Lat], + [grid.point3Lon, grid.point3Lat], + [grid.point4Lon, grid.point4Lat] + ] + }); + }); + const url1 = await chartMap.generateGridMap(gridDataStand); + const url2 = await chartMap.generateGridMap(gridDataCustom); + if (gridBase64Url.value == null) { + gridBase64Url.value = url1; } + return { + url1, + url2 + }; +} + +function handleMixClick({ tags = [10, 11], factorName = 'PM25' }) { + generateGridFusion(params.value).then(() => {}); + // const fetchGridData = () => { + // gridApi.mixUnderwayGridData(props.groupId, tags).then((res) => { + // var min = 1000000; + // var max = 0; + // res.data.forEach((v) => { + // min = Math.min(min, getGridDataDetailFactorValue(v, factorName)); + // max = Math.max(max, getGridDataDetailFactorValue(v, factorName)); + // }); + + // const gridData = res.data.map((v) => { + // const data = getGridDataDetailFactorValue(v, factorName); + // const grid = gridCellList.value.find((g) => { + // return g.cellIndex == v.cellId; + // }); + // // const { color, nextColor, range, nextRange } = + // // Legend.getStandardColorAndNext('PM25', data); + // // const ratio = (data - range) / (nextRange - range); + // // const _color = getColorBetweenTwoColors( + // // color.map((v) => v * 255), + // // nextColor.map((v) => v * 255), + // // ratio + // // ); + + // // 鏍规嵁閬ユ祴鏁版嵁璁$畻缃戞牸棰滆壊 + // const { color, nextColor, range, nextRange } = + // Legend.getCustomColorAndNext(data, min, max); + // const ratio = (data - range) / (nextRange - range); + + // const _color = getColorBetweenTwoColors( + // color.map((v) => v * 255), + // nextColor.map((v) => v * 255), + // ratio + // ); + // return { + // centerLng: grid.longitude, + // centerLat: grid.latitude, + // value: _color, + // coordinates: [ + // [grid.point1Lon, grid.point1Lat], + // [grid.point2Lon, grid.point2Lat], + // [grid.point3Lon, grid.point3Lat], + // [grid.point4Lon, grid.point4Lat] + // ] + // }; + // }); + // // chartMapAmap.generateGridMap(gridData).then((url) => { + // // gridBase64Url.value = url; + // // }); + // chartMap.generateGridMap(gridData).then((url) => { + // gridBase64Url.value = url; + // }); + // }); + // }; + + // if (gridCellList.value.length == 0) { + // gridApi + // .fetchGridCell(props.groupId) + // .then((res) => { + // gridCellList.value = res.data; + // }) + // .then(() => fetchGridData()); + // } else { + // fetchGridData(); + // } } function generateDocx() { -- Gitblit v1.9.3