From d0d240c08678872b802e49c63dff6f4e54508f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=81=E4=B8=87=E6=88=90?= Date: Mon, 11 Nov 2024 09:22:37 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/backend/report/MulipleReport.vue | 40 +++++++++++++++---- .../views/backend/report/RunningReport.vue | 25 +++++++++++- .../src/views/backend/report/SingleReport.vue | 33 ++++++++++++--- 3 files changed, 85 insertions(+), 13 deletions(-) diff --git a/ui/dasadmin/src/views/backend/report/MulipleReport.vue b/ui/dasadmin/src/views/backend/report/MulipleReport.vue index 5afde476..9a8831e4 100644 --- a/ui/dasadmin/src/views/backend/report/MulipleReport.vue +++ b/ui/dasadmin/src/views/backend/report/MulipleReport.vue @@ -54,7 +54,7 @@
查询 - 导出 + 导出 保存为模板
@@ -69,7 +69,7 @@ > @@ -143,7 +143,10 @@ import { useI18n } from 'vue-i18n' import { shortUuid } from '/@/utils/random' const { t } = useI18n() import { useAdminInfo } from '/@/stores/adminInfo' +import { cloneDeep } from 'lodash-es' const adminInfo = useAdminInfo() +import { useEnumStore } from '/@/stores/enums' +const enumStore = useEnumStore() const shortcuts = [ { text: '今天', @@ -233,6 +236,28 @@ const getReportTemplateList = () => { } }) } +const exportCsv = () => { + const exportColumnLabel = [{ prop: 'deviceId', label: '风机' }, { prop: 'time', label: '时间' }, ...reportTableColumn.value] + const itemsRest = cloneDeep(reportTableData.value).map((item: any) => { + if (item.deviceId) { + item.deviceId = windBlowerList.value.find((val: any) => val.irn == item.deviceId)?.name + } + const { id, ...rest } = item + return rest + }) + const csvContent = [ + exportColumnLabel.map((header: any) => header.label).join(', '), + ...itemsRest.map((row: any) => exportColumnLabel.map((header) => row[header.prop] ?? '-').join(', ')), + ].join('\n') + const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }) + const link = document.createElement('a') + link.href = URL.createObjectURL(blob) + link.download = Date.now() + '.csv' + link.style.display = 'none' + document.body.appendChild(link) + link.click() + document.body.removeChild(link) +} const addReportTemplate = () => { ElMessageBox.prompt('请输入模板名称', '添加模板', { confirmButtonText: '提交', @@ -336,7 +361,7 @@ const addColumn = () => { const addRow = () => {} const removeColumn = (val: any) => { const columnName = val.column.property - reportTableColumn.value = reportTableColumn.value.filter((val:any) => val.prop !== columnName) + reportTableColumn.value = reportTableColumn.value.filter((val: any) => val.prop !== columnName) } const handleSelections = (value: any) => { currentChooseRows.value = JSON.parse(JSON.stringify(value)) @@ -424,7 +449,7 @@ const queryHistoryData = () => { if (!windBlowerValue.value.length) return ElMessage.warning('请选择风机!') if (!timeRange.value.length) return ElMessage.warning('请选择时间!') if (!interval.value) return ElMessage.warning('请选择间隔!') - const attributeCodes = reportTableColumn.value.map((val:any) => val.prop).filter((item:any) => item != null && item !== '') + const attributeCodes = reportTableColumn.value.map((val: any) => val.prop).filter((item: any) => item != null && item !== '') if (!attributeCodes.length) return ElMessage.warning('请添加测点!') reportLoading.value = true // idCounter.value = 0 @@ -450,7 +475,7 @@ const queryHistoryData = () => { if (realResult) { let tableData = [] as any - attributeCodes.forEach((item:any) => { + attributeCodes.forEach((item: any) => { if (Object.keys(realResult).includes(item)) { tableData.push({ name: item, @@ -467,7 +492,8 @@ const queryHistoryData = () => { if (!processedData.has(time)) { processedData.set(time, { id: shortUuid(), time: timestampToTime(time), deviceId }) } - processedData.get(time)[name] = value[index] + const values = value[index] + processedData.get(time)[name] = enumStore.keys.includes(name) ? enumStore.data?.[name]?.[values] : values }) }) } @@ -526,7 +552,7 @@ const generateMissingData = (data: any, deviceIds: any) => { time: item.time, deviceId: deviceId, } as any - allKeys.forEach((key: any) => { + allKeys.forEach((key: string) => { if (!['id', 'time', 'deviceId'].includes(key)) { generatedItem[key] = '-' } diff --git a/ui/dasadmin/src/views/backend/report/RunningReport.vue b/ui/dasadmin/src/views/backend/report/RunningReport.vue index 9d7c9f7c..d9d163fc 100644 --- a/ui/dasadmin/src/views/backend/report/RunningReport.vue +++ b/ui/dasadmin/src/views/backend/report/RunningReport.vue @@ -16,7 +16,7 @@
查询 - 导出 + 导出
@@ -74,6 +74,7 @@ import { queryWindTurbinesPages, historyReq } from '/@/api/backend/statAnalysis/ import { shortUuid } from '/@/utils/random' import { useI18n } from 'vue-i18n' const { t } = useI18n() +import { cloneDeep } from 'lodash-es' const selectedIndex = ref(0) const buttons = ['日报', '月报'] const attributeCodes = ref(['iKWhThisDay', 'iOperationHoursDay', 'iWindSpeed']) @@ -186,6 +187,8 @@ const queryHistoryData = () => { requestData.startTime = new Date(getFirstAndLastDate(timeValue.value)[0] + ' 00:00:00').getTime() requestData.endTime = new Date(getFirstAndLastDate(timeValue.value)[1] + ' 23:59:59').getTime() } + console.log(requestData, 7777) + reportLoading.value = true historyReq(requestData).then((res) => { @@ -256,6 +259,26 @@ const queryHistoryData = () => { }) } +const exportCsv = () => { + const exportColumnLabel = [{ prop: 'time', label: '时间' }, ...reportTableColumn.value] + const itemsRest = cloneDeep(reportTableData.value).map((item: any) => { + const { id, deviceId, prop, ...rest } = item + return rest + }) + const csvContent = [ + exportColumnLabel.map((header: any) => header.label).join(', '), + ...itemsRest.map((row: any) => exportColumnLabel.map((header) => row[header.prop] ?? '-').join(', ')), + ].join('\n') + const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }) + const link = document.createElement('a') + link.href = URL.createObjectURL(blob) + link.download = Date.now() + '.csv' + link.style.display = 'none' + document.body.appendChild(link) + link.click() + document.body.removeChild(link) +} + // 时间转换 const timestampToTime = (timestamp: any) => { let timestamps = timestamp ? timestamp : null diff --git a/ui/dasadmin/src/views/backend/report/SingleReport.vue b/ui/dasadmin/src/views/backend/report/SingleReport.vue index 1c1e3176..8f17d6ba 100644 --- a/ui/dasadmin/src/views/backend/report/SingleReport.vue +++ b/ui/dasadmin/src/views/backend/report/SingleReport.vue @@ -58,7 +58,7 @@
查询 - 导出 + 导出 保存为模板
@@ -139,7 +139,10 @@ import Measurement from './measureList.vue' import { useI18n } from 'vue-i18n' const { t } = useI18n() import { useAdminInfo } from '/@/stores/adminInfo' +import { cloneDeep } from 'lodash-es' const adminInfo = useAdminInfo() +import { useEnumStore } from '/@/stores/enums' +const enumStore = useEnumStore() const shortcuts = [ { text: '今天', @@ -229,6 +232,25 @@ const getReportTemplateList = () => { } }) } +const exportCsv = () => { + const exportColumnLabel = [{ prop: 'time', label: '时间' }, ...reportTableColumn.value] + const itemsRest = cloneDeep(reportTableData.value).map((item: any) => { + const { id, ...rest } = item + return rest + }) + const csvContent = [ + exportColumnLabel.map((header: any) => header.label).join(', '), + ...itemsRest.map((row: any) => exportColumnLabel.map((header) => row[header.prop] ?? '-').join(', ')), + ].join('\n') + const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }) + const link = document.createElement('a') + link.href = URL.createObjectURL(blob) + link.download = Date.now() + '.csv' + link.style.display = 'none' + document.body.appendChild(link) + link.click() + document.body.removeChild(link) +} const addReportTemplate = () => { ElMessageBox.prompt('请输入模板名称', '添加模板', { confirmButtonText: '提交', @@ -314,7 +336,7 @@ const chooseMeasurePoint = () => { } const removeColumn = (val: any) => { const columnName = val.column.property - reportTableColumn.value = reportTableColumn.value.filter((val:any) => val.prop !== columnName) + reportTableColumn.value = reportTableColumn.value.filter((val: any) => val.prop !== columnName) } const handleSelections = (value: any) => { @@ -403,7 +425,7 @@ const queryHistoryData = () => { if (!windBlowerValue.value) return ElMessage.warning('请选择风机!') if (!timeRange.value.length) return ElMessage.warning('请选择时间!') if (!interval.value) return ElMessage.warning('请选择间隔!') - const attributeCodes = reportTableColumn.value.map((val:any) => val.prop).filter((item:any) => item != null && item !== '') + const attributeCodes = reportTableColumn.value.map((val: any) => val.prop).filter((item: any) => item != null && item !== '') if (!attributeCodes.length) return ElMessage.warning('请添加测点!') reportLoading.value = true const requestData = { @@ -423,7 +445,7 @@ const queryHistoryData = () => { if (Object.keys(result)?.length) { const realResult = result[windBlowerValue.value] let tableData = [] as any - attributeCodes.forEach((item:any) => { + attributeCodes.forEach((item: any) => { if (Object.keys(realResult).includes(item)) { tableData.push({ name: item, @@ -440,7 +462,8 @@ const queryHistoryData = () => { if (!processedData.has(time)) { processedData.set(time, { id: idCounter.value++, time: timestampToTime(time) }) } - processedData.get(time)[name] = value[index] + const values = value[index] + processedData.get(time)[name] = enumStore.keys.includes(name) ? enumStore.data?.[name]?.[values] : values }) }) } From e521234d94685e41aec1c391e7b2a7b2fff59c0e Mon Sep 17 00:00:00 2001 From: geting <13585118195@163.com> Date: Mon, 11 Nov 2024 09:56:48 +0800 Subject: [PATCH 02/18] =?UTF-8?q?=E7=90=86=E8=AE=BA=E9=A3=8E=E9=80=9F?= =?UTF-8?q?=E5=8A=9F=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/statAnalysis/powerCurveAnalysis.vue | 13 +++---------- .../views/backend/theoreticalpowerCurve/index.vue | 3 ++- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/ui/dasadmin/src/views/backend/statAnalysis/powerCurveAnalysis.vue b/ui/dasadmin/src/views/backend/statAnalysis/powerCurveAnalysis.vue index a9f5319e..4bcfef39 100644 --- a/ui/dasadmin/src/views/backend/statAnalysis/powerCurveAnalysis.vue +++ b/ui/dasadmin/src/views/backend/statAnalysis/powerCurveAnalysis.vue @@ -42,7 +42,7 @@ v-model="statAnalysisFatory" :placeholder="'请选择' + t('statAnalysis.madeinfatory')" class="statAnalysisSelect" - @change="factoryChange" + clearable > { }) } -const factoryChange = (val: any) => { - if (!option.legend.data.includes('理论值')) { - querytheoretical(val) - } else { - ElMessage.info('理论曲线已存在,无需选择!!') - } -} const querytheoretical = (val: any) => { const madeinfactory = val.split(':')[0] const model = val.split(':')[1] @@ -300,7 +292,8 @@ const statAnalysisOperate = () => { startTime: new Date(statAnalysisTime.value[0]).getTime(), endTime: new Date(statAnalysisTime.value[1]).getTime(), } - querytheoretical(statAnalysisDeviceId.value) + const params = statAnalysisFatory.value ? statAnalysisFatory.value : statAnalysisDeviceId.value + querytheoretical(params) historyDataReq(requestData) } const historyDataReq = (data: any) => { diff --git a/ui/dasadmin/src/views/backend/theoreticalpowerCurve/index.vue b/ui/dasadmin/src/views/backend/theoreticalpowerCurve/index.vue index a56a8fe9..e1875d2a 100644 --- a/ui/dasadmin/src/views/backend/theoreticalpowerCurve/index.vue +++ b/ui/dasadmin/src/views/backend/theoreticalpowerCurve/index.vue @@ -102,7 +102,7 @@ const update = (file: any) => { formData.append('file', file.file) const v = generateRandomNumber(16) const id = encrypt_aes(currentRow.value.id, v) - formData.append('id', currentRow.value.id) + formData.append('id', id) return importData(formData, v) .then((res: any) => { if (res.success) { @@ -266,6 +266,7 @@ const deleteDetails = (val: any) => { .then((res: any) => { if (res.code == 200) { ElMessage.success(res.msg ?? '删除成功') + currentRow.value = null getList() } else { ElMessage.error(res.msg ?? '删除失败') From 116cd62e594e550ba59d7fcada90dde3af325a57 Mon Sep 17 00:00:00 2001 From: huguanghan Date: Mon, 11 Nov 2024 16:05:10 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E7=89=A9=E6=A8=A1=E5=9E=8Bcode=E2=80=94>?= =?UTF-8?q?name=E7=BC=93=E5=AD=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysIotModelServiceImpl.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java b/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java index 67750e0c..0476b8c3 100644 --- a/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java +++ b/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java @@ -469,7 +469,7 @@ public class SysIotModelServiceImpl implements SysIotModelService { addModelFieldCache(highCreateList.get(i)); } } - for (SysIotModelField item : calCreateList){ + for (SysIotModelField item : calCreateList) { createTdStableOrColumn(item); addModelFieldCache(item); } @@ -582,7 +582,7 @@ public class SysIotModelServiceImpl implements SysIotModelService { if (sysIotModelField.getAttributeType() == 199) { Long iotModelId = sysIotModelField.getIotModelId(); String modelCode = dataService.iotModelMap.get(iotModelId.toString()); - tdEngineService.deleteStable("c_" + modelCode +"_"+ sysIotModelField.getAttributeCode()); + tdEngineService.deleteStable("c_" + modelCode + "_" + sysIotModelField.getAttributeCode()); } else { String stableName = null; SysIotModel sysIotModel = sysIotModelMapper.selectById(sysIotModelField.getIotModelId()); @@ -611,6 +611,15 @@ public class SysIotModelServiceImpl implements SysIotModelService { private void addModelFieldCache(SysIotModelField sysIotModelField) { //获取物模型编码 String modelCode = dataService.iotModelMap.get(sysIotModelField.getIotModelId().toString()); + Map fieldCodeNameMap = dataService.fieldCodeNameMap.get(modelCode); + if (fieldCodeNameMap == null) { + Map fieldCodeName = new HashMap<>(); + fieldCodeName.put(sysIotModelField.getAttributeCode(),sysIotModelField.getAttributeName()); + dataService.fieldCodeNameMap.put(modelCode,fieldCodeName); + } + else { + fieldCodeNameMap.put(sysIotModelField.getAttributeCode(), sysIotModelField.getAttributeName()); + } if (sysIotModelField.getAttributeType() == 199) { Map map = dataService.calculateIotFieldMap.get(modelCode); if (map == null) { @@ -657,10 +666,12 @@ public class SysIotModelServiceImpl implements SysIotModelService { private void deleteModelFieldCache(SysIotModelField sysIotModelField) { //获取物模型编码 String modelCode = dataService.iotModelMap.get(sysIotModelField.getIotModelId().toString()); - if (sysIotModelField.getAttributeType() == 199){ + Map fieldCodeName = dataService.fieldCodeNameMap.get(modelCode); + fieldCodeName.remove(sysIotModelField.getAttributeCode()); + if (sysIotModelField.getAttributeType() == 199) { Map map = dataService.calculateIotFieldMap.get(modelCode); map.remove(sysIotModelField.getAttributeCode()); - }else { + } else { if (sysIotModelField.getHighSpeed() == 0) { Map map = dataService.lowIotFieldMap.get(modelCode); map.remove(sysIotModelField.getAttributeCode()); From 777cf261000d8f61f2f6960507a4015ad208e5a0 Mon Sep 17 00:00:00 2001 From: fengrong Date: Mon, 11 Nov 2024 16:24:03 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/dasadmin/src/views/backend/dashboard.vue | 438 +++++++++++------- .../src/views/backend/home/windMatrix.vue | 4 +- 2 files changed, 277 insertions(+), 165 deletions(-) diff --git a/ui/dasadmin/src/views/backend/dashboard.vue b/ui/dasadmin/src/views/backend/dashboard.vue index 033c251e..7b386788 100644 --- a/ui/dasadmin/src/views/backend/dashboard.vue +++ b/ui/dasadmin/src/views/backend/dashboard.vue @@ -1,5 +1,5 @@