Commit c747340d1ad53cebc7509ebe2249f1fe2b2ef348
Merge branch 'ww' into 'main'
fix: report export show report trend device not found data but not destory chart See merge request huang/yun-teng-iot-front!429
Showing
2 changed files
with
37 additions
and
34 deletions
| ... | ... | @@ -30,7 +30,7 @@ |
| 30 | 30 | <Select |
| 31 | 31 | class="min-w-25" |
| 32 | 32 | v-model:value="item.active" |
| 33 | - @change="(value) => handleChangeChars(value, item.device)" | |
| 33 | + @change="(value) => handleChangeChars(value, item.device, item)" | |
| 34 | 34 | placeholder="请选择设备属性" |
| 35 | 35 | > |
| 36 | 36 | <Select.Option v-for="attr in item.attributes" :key="attr" :value="attr"> |
| ... | ... | @@ -38,10 +38,10 @@ |
| 38 | 38 | </Select.Option> |
| 39 | 39 | </Select> |
| 40 | 40 | </div> |
| 41 | - <div> | |
| 42 | - <Empty v-show="item.emptyFlag" /> | |
| 41 | + <div class="w-full h-full flex justify-center items-center"> | |
| 42 | + <Empty v-show="item.notFoundData" description="暂无数据" class="text-dark-50" /> | |
| 43 | 43 | <div |
| 44 | - v-show="!item.emptyFlag" | |
| 44 | + v-show="!item.notFoundData" | |
| 45 | 45 | :id="`chart-${item.device}`" |
| 46 | 46 | style="width: 100%; height: 400px" |
| 47 | 47 | ></div> |
| ... | ... | @@ -57,7 +57,7 @@ |
| 57 | 57 | </div> |
| 58 | 58 | </template> |
| 59 | 59 | <script setup lang="ts"> |
| 60 | - import { ref, PropType, nextTick, shallowReactive, onMounted, onUnmounted } from 'vue'; | |
| 60 | + import { ref, PropType, nextTick, shallowReactive, onMounted, onUnmounted, unref } from 'vue'; | |
| 61 | 61 | import { BasicModal, useModalInner } from '/@/components/Modal'; |
| 62 | 62 | import * as echarts from 'echarts'; |
| 63 | 63 | import { exportViewChartApi } from '/@/api/export/exportManager'; |
| ... | ... | @@ -70,6 +70,15 @@ |
| 70 | 70 | val: { ts: number; value: string }[]; |
| 71 | 71 | } |
| 72 | 72 | |
| 73 | + interface ChartInstance { | |
| 74 | + device: string; | |
| 75 | + name: string; | |
| 76 | + attributes: string[]; | |
| 77 | + active?: string; | |
| 78 | + notFoundData?: boolean; | |
| 79 | + loading?: boolean; | |
| 80 | + } | |
| 81 | + | |
| 73 | 82 | defineProps({ |
| 74 | 83 | width: { |
| 75 | 84 | type: String as PropType<string>, |
| ... | ... | @@ -85,11 +94,7 @@ |
| 85 | 94 | |
| 86 | 95 | let currentRecord: ExecuteReportRecord = {} as unknown as ExecuteReportRecord; |
| 87 | 96 | |
| 88 | - const chartInstance = ref< | |
| 89 | - { device: string; name: string; attributes: string[]; active?: string; emptyFlag?: boolean }[] | |
| 90 | - >([]); | |
| 91 | - | |
| 92 | - const notFoundData = ref(false); | |
| 97 | + const chartInstance = ref<ChartInstance[]>([]); | |
| 93 | 98 | |
| 94 | 99 | const chartsInstance = shallowReactive<{ [key: string]: echarts.ECharts }>({}); |
| 95 | 100 | //生成随机颜色 |
| ... | ... | @@ -125,13 +130,14 @@ |
| 125 | 130 | }, |
| 126 | 131 | } as echarts.EChartsOption; |
| 127 | 132 | }) || ([] as echarts.EChartsOption[]); |
| 133 | + | |
| 128 | 134 | const chartOption = { |
| 129 | - xAxisData: chartDataConfig.at(0)?.xAxis?.map(function (str) { | |
| 130 | - return str.replace(' ', '\n'); | |
| 131 | - }), | |
| 135 | + xAxisData: (chartDataConfig.at(0)?.xAxis as string[])?.map((str) => str.replace(' ', '\n')), | |
| 132 | 136 | series: [chartDataConfig.at(0)?.series], |
| 137 | + legend: { | |
| 138 | + data: Object.keys(result), | |
| 139 | + }, | |
| 133 | 140 | }; |
| 134 | - | |
| 135 | 141 | return chartOption; |
| 136 | 142 | }; |
| 137 | 143 | |
| ... | ... | @@ -145,9 +151,11 @@ |
| 145 | 151 | ...item, |
| 146 | 152 | active: item.attributes.at(0), |
| 147 | 153 | })); |
| 148 | - for (const item of deviceInfo) { | |
| 154 | + for (const item of unref(chartInstance)) { | |
| 149 | 155 | const { attributes, device } = item; |
| 156 | + | |
| 150 | 157 | const keys = attributes.length ? attributes.at(0) : ''; |
| 158 | + | |
| 151 | 159 | const sendParams = { |
| 152 | 160 | ...data.record.executeCondition.executeCondition, |
| 153 | 161 | ...{ |
| ... | ... | @@ -156,7 +164,7 @@ |
| 156 | 164 | }; |
| 157 | 165 | |
| 158 | 166 | const result = await exportViewChartApi(device, sendParams); |
| 159 | - validateHasData(result); | |
| 167 | + item.notFoundData = validateHasData(result); | |
| 160 | 168 | const { xAxisData, series } = getChartsOption(result as unknown as ResponsData); |
| 161 | 169 | |
| 162 | 170 | await nextTick(); |
| ... | ... | @@ -179,7 +187,7 @@ |
| 179 | 187 | }, |
| 180 | 188 | }, |
| 181 | 189 | legend: { |
| 182 | - data: attributes, | |
| 190 | + // data: attributes, | |
| 183 | 191 | top: '20px', |
| 184 | 192 | }, |
| 185 | 193 | toolbox: {}, |
| ... | ... | @@ -247,7 +255,7 @@ |
| 247 | 255 | } |
| 248 | 256 | ); |
| 249 | 257 | const loading = ref(false); |
| 250 | - const renderCharts = async (device: string, keys: string) => { | |
| 258 | + const renderCharts = async (device: string, keys: string, item: ChartInstance) => { | |
| 251 | 259 | const sendParams = { |
| 252 | 260 | ...currentRecord.executeCondition.executeCondition, |
| 253 | 261 | ...{ |
| ... | ... | @@ -257,16 +265,8 @@ |
| 257 | 265 | try { |
| 258 | 266 | loading.value = true; |
| 259 | 267 | const result = await exportViewChartApi(device, sendParams); |
| 260 | - chartInstance.value.forEach((f) => { | |
| 261 | - if (f.device === device) { | |
| 262 | - if (Object.keys(result).length === 0) { | |
| 263 | - f.emptyFlag = true; | |
| 264 | - } else { | |
| 265 | - f.emptyFlag = false; | |
| 266 | - } | |
| 267 | - } | |
| 268 | - }); | |
| 269 | - validateHasData(result); | |
| 268 | + | |
| 269 | + item.notFoundData = validateHasData(result); | |
| 270 | 270 | const { xAxisData, series } = getChartsOption(result as unknown as ResponsData); |
| 271 | 271 | |
| 272 | 272 | chartsInstance[device].setOption({ |
| ... | ... | @@ -280,15 +280,15 @@ |
| 280 | 280 | }; |
| 281 | 281 | |
| 282 | 282 | const validateHasData = (record: Recordable) => { |
| 283 | - notFoundData.value = true; | |
| 284 | - const { val = [], attr } = (record as unknown as ResponsData) || {}; | |
| 285 | - if (!attr || !val.length) { | |
| 286 | - notFoundData.value = false; | |
| 283 | + // const { val = [], attr } = (record as unknown as ResponsData) || {}; | |
| 284 | + if (!Object.keys(record).length) { | |
| 285 | + return true; | |
| 287 | 286 | } |
| 287 | + return false; | |
| 288 | 288 | }; |
| 289 | 289 | |
| 290 | - const handleChangeChars = (value: string, device: string) => { | |
| 291 | - renderCharts(device, value); | |
| 290 | + const handleChangeChars = (value: string, device: string, item: ChartInstance) => { | |
| 291 | + renderCharts(device, value, item); | |
| 292 | 292 | }; |
| 293 | 293 | |
| 294 | 294 | const resize = () => { | ... | ... |