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
| @@ -46,6 +46,9 @@ export const formSchema: FormSchema[] = [ | @@ -46,6 +46,9 @@ export const formSchema: FormSchema[] = [ | ||
| 46 | ifShow: ({ model }) => { | 46 | ifShow: ({ model }) => { |
| 47 | return model[PackageField.URL]; | 47 | return model[PackageField.URL]; |
| 48 | }, | 48 | }, |
| 49 | + componentProps: { | ||
| 50 | + maxLength: 255, | ||
| 51 | + }, | ||
| 49 | }, | 52 | }, |
| 50 | { | 53 | { |
| 51 | field: PackageField.CHECK_SUM_ALG, | 54 | field: PackageField.CHECK_SUM_ALG, |
| @@ -30,7 +30,7 @@ | @@ -30,7 +30,7 @@ | ||
| 30 | <Select | 30 | <Select |
| 31 | class="min-w-25" | 31 | class="min-w-25" |
| 32 | v-model:value="item.active" | 32 | v-model:value="item.active" |
| 33 | - @change="(value) => handleChangeChars(value, item.device)" | 33 | + @change="(value) => handleChangeChars(value, item.device, item)" |
| 34 | placeholder="请选择设备属性" | 34 | placeholder="请选择设备属性" |
| 35 | > | 35 | > |
| 36 | <Select.Option v-for="attr in item.attributes" :key="attr" :value="attr"> | 36 | <Select.Option v-for="attr in item.attributes" :key="attr" :value="attr"> |
| @@ -38,10 +38,10 @@ | @@ -38,10 +38,10 @@ | ||
| 38 | </Select.Option> | 38 | </Select.Option> |
| 39 | </Select> | 39 | </Select> |
| 40 | </div> | 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 | <div | 43 | <div |
| 44 | - v-show="!item.emptyFlag" | 44 | + v-show="!item.notFoundData" |
| 45 | :id="`chart-${item.device}`" | 45 | :id="`chart-${item.device}`" |
| 46 | style="width: 100%; height: 400px" | 46 | style="width: 100%; height: 400px" |
| 47 | ></div> | 47 | ></div> |
| @@ -57,7 +57,7 @@ | @@ -57,7 +57,7 @@ | ||
| 57 | </div> | 57 | </div> |
| 58 | </template> | 58 | </template> |
| 59 | <script setup lang="ts"> | 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 | import { BasicModal, useModalInner } from '/@/components/Modal'; | 61 | import { BasicModal, useModalInner } from '/@/components/Modal'; |
| 62 | import * as echarts from 'echarts'; | 62 | import * as echarts from 'echarts'; |
| 63 | import { exportViewChartApi } from '/@/api/export/exportManager'; | 63 | import { exportViewChartApi } from '/@/api/export/exportManager'; |
| @@ -70,6 +70,15 @@ | @@ -70,6 +70,15 @@ | ||
| 70 | val: { ts: number; value: string }[]; | 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 | defineProps({ | 82 | defineProps({ |
| 74 | width: { | 83 | width: { |
| 75 | type: String as PropType<string>, | 84 | type: String as PropType<string>, |
| @@ -85,11 +94,7 @@ | @@ -85,11 +94,7 @@ | ||
| 85 | 94 | ||
| 86 | let currentRecord: ExecuteReportRecord = {} as unknown as ExecuteReportRecord; | 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 | const chartsInstance = shallowReactive<{ [key: string]: echarts.ECharts }>({}); | 99 | const chartsInstance = shallowReactive<{ [key: string]: echarts.ECharts }>({}); |
| 95 | //生成随机颜色 | 100 | //生成随机颜色 |
| @@ -125,13 +130,14 @@ | @@ -125,13 +130,14 @@ | ||
| 125 | }, | 130 | }, |
| 126 | } as echarts.EChartsOption; | 131 | } as echarts.EChartsOption; |
| 127 | }) || ([] as echarts.EChartsOption[]); | 132 | }) || ([] as echarts.EChartsOption[]); |
| 133 | + | ||
| 128 | const chartOption = { | 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 | series: [chartDataConfig.at(0)?.series], | 136 | series: [chartDataConfig.at(0)?.series], |
| 137 | + legend: { | ||
| 138 | + data: Object.keys(result), | ||
| 139 | + }, | ||
| 133 | }; | 140 | }; |
| 134 | - | ||
| 135 | return chartOption; | 141 | return chartOption; |
| 136 | }; | 142 | }; |
| 137 | 143 | ||
| @@ -145,9 +151,11 @@ | @@ -145,9 +151,11 @@ | ||
| 145 | ...item, | 151 | ...item, |
| 146 | active: item.attributes.at(0), | 152 | active: item.attributes.at(0), |
| 147 | })); | 153 | })); |
| 148 | - for (const item of deviceInfo) { | 154 | + for (const item of unref(chartInstance)) { |
| 149 | const { attributes, device } = item; | 155 | const { attributes, device } = item; |
| 156 | + | ||
| 150 | const keys = attributes.length ? attributes.at(0) : ''; | 157 | const keys = attributes.length ? attributes.at(0) : ''; |
| 158 | + | ||
| 151 | const sendParams = { | 159 | const sendParams = { |
| 152 | ...data.record.executeCondition.executeCondition, | 160 | ...data.record.executeCondition.executeCondition, |
| 153 | ...{ | 161 | ...{ |
| @@ -156,7 +164,7 @@ | @@ -156,7 +164,7 @@ | ||
| 156 | }; | 164 | }; |
| 157 | 165 | ||
| 158 | const result = await exportViewChartApi(device, sendParams); | 166 | const result = await exportViewChartApi(device, sendParams); |
| 159 | - validateHasData(result); | 167 | + item.notFoundData = validateHasData(result); |
| 160 | const { xAxisData, series } = getChartsOption(result as unknown as ResponsData); | 168 | const { xAxisData, series } = getChartsOption(result as unknown as ResponsData); |
| 161 | 169 | ||
| 162 | await nextTick(); | 170 | await nextTick(); |
| @@ -179,7 +187,7 @@ | @@ -179,7 +187,7 @@ | ||
| 179 | }, | 187 | }, |
| 180 | }, | 188 | }, |
| 181 | legend: { | 189 | legend: { |
| 182 | - data: attributes, | 190 | + // data: attributes, |
| 183 | top: '20px', | 191 | top: '20px', |
| 184 | }, | 192 | }, |
| 185 | toolbox: {}, | 193 | toolbox: {}, |
| @@ -247,7 +255,7 @@ | @@ -247,7 +255,7 @@ | ||
| 247 | } | 255 | } |
| 248 | ); | 256 | ); |
| 249 | const loading = ref(false); | 257 | const loading = ref(false); |
| 250 | - const renderCharts = async (device: string, keys: string) => { | 258 | + const renderCharts = async (device: string, keys: string, item: ChartInstance) => { |
| 251 | const sendParams = { | 259 | const sendParams = { |
| 252 | ...currentRecord.executeCondition.executeCondition, | 260 | ...currentRecord.executeCondition.executeCondition, |
| 253 | ...{ | 261 | ...{ |
| @@ -257,16 +265,8 @@ | @@ -257,16 +265,8 @@ | ||
| 257 | try { | 265 | try { |
| 258 | loading.value = true; | 266 | loading.value = true; |
| 259 | const result = await exportViewChartApi(device, sendParams); | 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 | const { xAxisData, series } = getChartsOption(result as unknown as ResponsData); | 270 | const { xAxisData, series } = getChartsOption(result as unknown as ResponsData); |
| 271 | 271 | ||
| 272 | chartsInstance[device].setOption({ | 272 | chartsInstance[device].setOption({ |
| @@ -280,15 +280,15 @@ | @@ -280,15 +280,15 @@ | ||
| 280 | }; | 280 | }; |
| 281 | 281 | ||
| 282 | const validateHasData = (record: Recordable) => { | 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 | const resize = () => { | 294 | const resize = () => { |