Browse Source

feat: 完善数据源大屏配置

main
betaqi 2 weeks ago
parent
commit
4b23735751
  1. 152
      src/api/path/dataSource/index.ts
  2. 1
      src/api/path/infra.api.ts
  3. 3
      src/api/path/project.api.ts
  4. 19
      src/enums/dataSourceEnum.ts
  5. 3
      src/packages/public/publicConfig.ts
  6. 7
      src/store/modules/chartEditStore/chartEditStore.d.ts
  7. 74
      src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestDataSourceConfig/index.vue
  8. 24
      src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataSource/index.vue
  9. 20
      src/views/chart/ContentConfigurations/components/ChartData/index.d.ts

152
src/api/path/dataSource/index.ts

@ -7,121 +7,6 @@ import { StorageEnum } from "@/enums/storageEnum";
import { SystemStoreEnum } from '@/store/modules/systemStore/systemStore.d' import { SystemStoreEnum } from '@/store/modules/systemStore/systemStore.d'
import { SelectDataSourceTypeAPIObj } from "@/enums/dataSourceEnum"; import { SelectDataSourceTypeAPIObj } from "@/enums/dataSourceEnum";
const testData = {
"code": 0,
"msg": "",
"data": {
"dimensions": [
"c_40136",
"c_40138",
"_ts"
],
"source": [
{
"c_40136": 24.93,
"c_40138": 11.31,
"_ts": 1753977600000
},
{
"c_40136": 24.94,
"c_40138": 11.31,
"_ts": 1753977720000
},
{
"c_40136": 24.94,
"c_40138": 11.31,
"_ts": 1753977840000
},
{
"c_40136": 24.95,
"c_40138": 11.31,
"_ts": 1753977960000
},
{
"c_40136": 24.96,
"c_40138": 11.31,
"_ts": 1753978080000
},
{
"c_40136": 24.97,
"c_40138": 11.31,
"_ts": 1753978200000
},
{
"c_40136": 24.98,
"c_40138": 11.31,
"_ts": 1753978320000
},
{
"c_40136": 24.99,
"c_40138": 11.31,
"_ts": 1753978440000
},
{
"c_40136": 25,
"c_40138": 11.31,
"_ts": 1753978560000
},
{
"c_40136": 27.45,
"c_40138": 11.51,
"_ts": 1754038560000
},
{
"c_40136": 27.45,
"c_40138": 11.51,
"_ts": 1754038680000
},
{
"c_40136": 27.45,
"c_40138": 11.52,
"_ts": 1754038800000
},
{
"c_40136": 27.45,
"c_40138": 11.52,
"_ts": 1754038920000
},
{
"c_40136": 27.45,
"c_40138": 11.52,
"_ts": 1754039040000
},
{
"c_40136": 27.45,
"c_40138": 11.53,
"_ts": 1754039160000
},
{
"c_40136": 27.45,
"c_40138": 11.53,
"_ts": 1754039280000
},
{
"c_40136": 27.45,
"c_40138": 11.54,
"_ts": 1754039400000
},
{
"c_40136": 27.45,
"c_40138": 11.54,
"_ts": 1754039520000
},
{
"c_40136": 27.45,
"c_40138": 11.55,
"_ts": 1754039640000
},
{
"c_40136": 27.45,
"c_40138": 11.55,
"_ts": 1754039760000
}
]
}
}
/* /*
* *
*/ */
@ -215,11 +100,11 @@ export async function test (){
} }
} }
function getPointParams(requestSource:RequestDataSourceConfig) { function getPointParams(requestSource: RequestDataSourceConfig) {
let params:any = { let params:any = {
queryType: SelectDataSourceTypeAPIObj[requestSource.dataSourceType], queryType: SelectDataSourceTypeAPIObj[requestSource.dataSourceType],
site: requestSource.station, site: requestSource.station,
with: requestSource.recentTimeRange, width: requestSource.recentTimeRange,
deviceSn: requestSource.device.split('|')[0], deviceSn: requestSource.device.split('|')[0],
deviceType: requestSource.device.split('|')[1], deviceType: requestSource.device.split('|')[1],
points: requestSource.points, points: requestSource.points,
@ -229,11 +114,11 @@ function getPointParams(requestSource:RequestDataSourceConfig) {
return params return params
} }
function getEarningParams(requestSource:RequestDataSourceConfig){ function getEarningParams(requestSource: RequestDataSourceConfig) {
let params: any = { let params: any = {
queryType: SelectDataSourceTypeAPIObj[requestSource.dataSourceType], queryType: SelectDataSourceTypeAPIObj[requestSource.dataSourceType],
site:requestSource.station, site: requestSource.station,
with: requestSource.recentTimeRange, width: requestSource.recentTimeRange,
interval: '20m', interval: '20m',
points: [], points: [],
tenantId: getToken() tenantId: getToken()
@ -242,7 +127,8 @@ function getEarningParams(requestSource:RequestDataSourceConfig){
return params return params
} }
export const fetchDataByIot = async (requestSource:RequestDataSourceConfig) => { export const fetchDataByIot = async (requestSource: RequestDataSourceConfig) => {
if (!requestSource.station) return
let params:any = {} let params:any = {}
if(requestSource.dataSourceType === 'point') { if(requestSource.dataSourceType === 'point') {
params = getPointParams(requestSource) params = getPointParams(requestSource)
@ -251,14 +137,34 @@ export const fetchDataByIot = async (requestSource:RequestDataSourceConfig) => {
} }
try { try {
return await http(RequestHttpEnum.POST)<ProjectDetail>(`${ModuleTypeEnum.DATA}/get-by-iot`, params) const res = await http(RequestHttpEnum.POST)<ProjectDetail>(`${ModuleTypeEnum.DATA}/get-by-iot`, params) as any
let keyMap: any = []
if (requestSource.dataSourceType === 'point') {
keyMap = Object.fromEntries(
requestSource.pointsInfo.map(p => [p.columnName, p.nameCn])
)
} else if(requestSource.dataSourceType === 'earning'){
keyMap = {
'sum(earning)': '收益'
}
}
res.data.dimensions = res.data.dimensions.map((key:string) => keyMap[key] || key)
res.data.source = res.data.source.map((item:any) => {
const newItem: Record<string, any> = {}
for (const key in item) {
newItem[keyMap[key] || key] = item[key]
}
return newItem
}) ?? []
return res
// await specialCustomizeHttp({ // await specialCustomizeHttp({
// url: `${ModuleTypeEnum.DATA}/get-by-iot`, // url: `${ModuleTypeEnum.DATA}/get-by-iot`,
// method: 'POST', // method: 'POST',
// params // params
// }) // })
} catch { } catch {
httpErrorHandle() // httpErrorHandle()
} }
} }

1
src/api/path/infra.api.ts

@ -4,6 +4,7 @@ import { RequestHttpEnum, ModuleTypeEnum, ContentTypeEnum } from '@/enums/httpEn
// * 上传文件 // * 上传文件
export const uploadFile = async (data: object) => { export const uploadFile = async (data: object) => {
console.log('uploadFile',data)
try { try {
const res = await http(RequestHttpEnum.POST)<string>(`${ModuleTypeEnum.INFRA}/file/upload`, data, ContentTypeEnum.FORM_DATA) const res = await http(RequestHttpEnum.POST)<string>(`${ModuleTypeEnum.INFRA}/file/upload`, data, ContentTypeEnum.FORM_DATA)
return res return res

3
src/api/path/project.api.ts

@ -38,6 +38,7 @@ export const fetchProjectApi = async (data: object) => {
// * 保存项目 // * 保存项目
export const saveProjectApi = async (data: object) => { export const saveProjectApi = async (data: object) => {
console.log('saveProjectApi')
try { try {
const res = await http(RequestHttpEnum.PUT)(`${ModuleTypeEnum.PROJECT}/update`, data) const res = await http(RequestHttpEnum.PUT)(`${ModuleTypeEnum.PROJECT}/update`, data)
return res return res
@ -48,6 +49,7 @@ export const saveProjectApi = async (data: object) => {
// * 修改项目基础信息 // * 修改项目基础信息
export const updateProjectApi = async (data: object) => { export const updateProjectApi = async (data: object) => {
console.log('updateProjectApi')
try { try {
const res = await http(RequestHttpEnum.PUT)(`${ModuleTypeEnum.PROJECT}/update`, data) const res = await http(RequestHttpEnum.PUT)(`${ModuleTypeEnum.PROJECT}/update`, data)
return res return res
@ -68,6 +70,7 @@ export const deleteProjectApi = async (data: object) => {
// * 修改发布状态 [0 已发布, 1 未发布] // * 修改发布状态 [0 已发布, 1 未发布]
export const changeProjectReleaseApi = async (data: object) => { export const changeProjectReleaseApi = async (data: object) => {
console.log('changeProjectReleaseApi')
try { try {
const res = await http(RequestHttpEnum.PUT)(`${ModuleTypeEnum.PROJECT}/update`, data) const res = await http(RequestHttpEnum.PUT)(`${ModuleTypeEnum.PROJECT}/update`, data)
return res return res

19
src/enums/dataSourceEnum.ts

@ -24,7 +24,7 @@ export const SelectDataSourceTypeAPIObj = {
/** /**
* @description: * @description:
*/ */
export enum EarningTimeRangeEnum { export enum EarningTimeRangeEnum {
@ -40,7 +40,7 @@ export enum EarningTimeRangeEnum {
} }
/** /**
* @description: * @description:
*/ */
export const EarningTimeRangeNameObj = { export const EarningTimeRangeNameObj = {
[EarningTimeRangeEnum.LAST_6h]: '最近6小时', [EarningTimeRangeEnum.LAST_6h]: '最近6小时',
@ -57,11 +57,15 @@ export const EarningTimeRangeNameObj = {
/** /**
* @description: * @description:
*/ */
export enum PointsTimeRangeEnum { export enum PointsTimeRangeEnum {
// 收益 LAST_3d = '3d',
LAST_2d= '2d',
LAST_1d= '1d',
LAST_12h= '12h',
LAST_6h= '6h',
LAST_30= '30m', LAST_30= '30m',
LAST_25= '25m', LAST_25= '25m',
LAST_20 = '20m', LAST_20 = '20m',
@ -72,9 +76,14 @@ export enum PointsTimeRangeEnum {
} }
/** /**
* @description: // 收益时间范围名称 * @description: // 点位时间范围名称
*/ */
export const PointsTimeRangeNameObj = { export const PointsTimeRangeNameObj = {
[PointsTimeRangeEnum.LAST_3d]: '最近3天',
[PointsTimeRangeEnum.LAST_2d]: '最近2天',
[PointsTimeRangeEnum.LAST_1d]: '最近1天',
[PointsTimeRangeEnum.LAST_12h]: '最近12小时',
[PointsTimeRangeEnum.LAST_6h]: '最近6小时',
[PointsTimeRangeEnum.LAST_30]: '最近30分钟', [PointsTimeRangeEnum.LAST_30]: '最近30分钟',
[PointsTimeRangeEnum.LAST_25]: '最近25分钟', [PointsTimeRangeEnum.LAST_25]: '最近25分钟',
[PointsTimeRangeEnum.LAST_20]: '最近20分钟', [PointsTimeRangeEnum.LAST_20]: '最近20分钟',

3
src/packages/public/publicConfig.ts

@ -52,7 +52,8 @@ export const requestDataSourceConfig: RequestDataSourceConfig = {
station: '', station: '',
device: '', device: '',
points: [], points: [],
recentTimeRange: PointsTimeRangeEnum.LAST_20, pointsInfo: [],
recentTimeRange: PointsTimeRangeEnum.LAST_6h,
requestInterval: 5, requestInterval: 5,
requestIntervalUnit: RequestHttpIntervalEnum.SECOND, requestIntervalUnit: RequestHttpIntervalEnum.SECOND,
} }

7
src/store/modules/chartEditStore/chartEditStore.d.ts vendored

@ -242,9 +242,10 @@ export interface RequestConfigType extends RequestPublicConfigType {
export interface RequestDataSourceConfig { export interface RequestDataSourceConfig {
dataSourceType: DataSourceTypeEnum dataSourceType: DataSourceTypeEnum
station: string, station: string,
device: Array[any], device: string,
points: Array[any], points: Array<any>,
recentTimeRange: number, pointsInfo: Array<any>,
recentTimeRange: string,
requestInterval: number, requestInterval: number,
requestIntervalUnit: RequestHttpIntervalEnum, requestIntervalUnit: RequestHttpIntervalEnum,
} }

74
src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestDataSourceConfig/index.vue

@ -89,18 +89,37 @@
v-show="targetDataSourceRequest.dataSourceType == 'point'" v-show="targetDataSourceRequest.dataSourceType == 'point'"
> >
<template #name> <template #name>
点位: 点位: <n-text depth="3">已选 {{ targetDataSourceRequest.points.length }} / 6</n-text>
</template>
<template v-if="loadingPoints">
<n-space vertical justify="space-between" style="height: 428px;">
<template v-for=" i of 12" :key="i">
<n-skeleton text :style="{
width: `${100 - (i - 4) * 10}%`
}" />
</template>
</n-space>
</template>
<template v-else-if="!pointList.length">
<n-empty size="huge" style="height: 428px; display: flex; align-items: center; justify-content: center;">
<template #default>
{{ targetDataSourceRequest.device ? `暂无数据`: `请先选择设备` }}
</template>
</n-empty>
</template> </template>
<n-infinite-scroll style="height: 428px; overflow: auto" :distance="10"> <template v-else>
<n-checkbox-group v-model:value="targetDataSourceRequest.points"> <n-infinite-scroll style="height: 428px; overflow: auto" :distance="10">
<n-grid :y-gap="8" :cols="3"> <n-checkbox-group :value="targetDataSourceRequest.points" @update:value="handlePointsUpdate">
<n-gi v-for="point in pointList" :key="point.columnName"> <n-grid :y-gap="8" :cols="3">
<n-checkbox :value="point.columnName" :label="point.nameCn"/> <n-gi v-for="point in pointList" :key="point.columnName">
</n-gi> <n-checkbox :value="point.columnName" :label="point.nameCn"/>
</n-grid> </n-gi>
</n-checkbox-group> </n-grid>
</n-infinite-scroll> </n-checkbox-group>
</n-infinite-scroll>
</template>
</setting-item-box> </setting-item-box>
</template> </template>
@ -124,10 +143,10 @@ const props = defineProps<{
const selectRecentTimeRangeOptions = computed(() => { const selectRecentTimeRangeOptions = computed(() => {
console.log('computed') console.log('computed')
if (props.targetDataSourceRequest!.dataSourceType === 'point') { if (props.targetDataSourceRequest!.dataSourceType === 'point') {
props.targetDataSourceRequest!.recentTimeRange = selectPointsTimeRangeOptions[0].value // props.targetDataSourceRequest!.recentTimeRange = selectPointsTimeRangeOptions[0].value
return selectPointsTimeRangeOptions return selectPointsTimeRangeOptions
} else if(props.targetDataSourceRequest!.dataSourceType === 'earning') { } else if(props.targetDataSourceRequest!.dataSourceType === 'earning') {
props.targetDataSourceRequest!.recentTimeRange = selectEarningTimeRangeOptions[0].value // props.targetDataSourceRequest!.recentTimeRange = selectEarningTimeRangeOptions[0].value
return selectEarningTimeRangeOptions return selectEarningTimeRangeOptions
} }
return [] return []
@ -151,6 +170,8 @@ watch(() => props.targetDataSourceRequest.station, (val) => {
function handleStationChange() { function handleStationChange() {
props.targetDataSourceRequest.device = '' props.targetDataSourceRequest.device = ''
props.targetDataSourceRequest.points = []
pointList.value = []
} }
const deviceList = ref<any>([]) const deviceList = ref<any>([])
@ -170,9 +191,11 @@ async function loadDevicesData() {
window['$message'].error('设备列表数据获取失败!') window['$message'].error('设备列表数据获取失败!')
} }
} }
watch(() => props.targetDataSourceRequest.device, async (val) => {
watch(() => props.targetDataSourceRequest.device, (val) => { if (val && !deviceList.value.length) {
val && loadPointsData() await loadDevicesData()
}
val && await loadPointsData()
},{ },{
immediate: true, immediate: true,
}) })
@ -183,10 +206,13 @@ function handleDeviceChange () {
const pointList = ref<any>([]) const pointList = ref<any>([])
async function loadPointsData(){ const loadingPoints = ref(false)
async function loadPointsData() {
loadingPoints.value = true
const curDeviceSn = props.targetDataSourceRequest.device.split('|')[0] ?? '' const curDeviceSn = props.targetDataSourceRequest.device.split('|')[0] ?? ''
const findDeviceId = deviceList.value.find((device: any) => device.sn === curDeviceSn).id const findDeviceId = deviceList.value.find((device: any) => device.sn === curDeviceSn).id
if (!findDeviceId) { if (!findDeviceId) {
loadingPoints.value = false
pointList.value = [] pointList.value = []
return return
} }
@ -199,6 +225,22 @@ async function loadPointsData(){
} else { } else {
window['$message'].error('点位列表数据获取失败!') window['$message'].error('点位列表数据获取失败!')
} }
loadingPoints.value = false
}
function handlePointsUpdate(newVal:string[], currentVal:any) {
if (newVal.length > 6 && currentVal.actionType !== "uncheck") return;
props.targetDataSourceRequest.points = newVal
props.targetDataSourceRequest.pointsInfo = pointList.value.filter((point: any) =>
newVal.includes(point.columnName)).map((point: any) => ({
id: point.id,
addr: point.addr,
columnName:point.columnName,
nameCn:point.nameCn,
permission:point.permission,
unit:point.unit,
}))
console.log(props.targetDataSourceRequest.pointsInfo)
} }
onMounted(()=>{ onMounted(()=>{

24
src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataSource/index.vue

@ -11,7 +11,10 @@
</setting-item-box> </setting-item-box>
<setting-item-box name="站点选择" :alone="true"> <setting-item-box name="站点选择" :alone="true">
<n-input size="small" :placeholder="targetData.requestSource.station || '暂无'" <n-input size="small"
:placeholder="siteList.find((r:any) => r.id ===
targetData?.requestSource?.station)?.name ||
'暂无'"
:disabled="true"> :disabled="true">
<template #prefix> <template #prefix>
<n-icon :component="DataCenterIcon"/> <n-icon :component="DataCenterIcon"/>
@ -62,15 +65,14 @@ import { icon } from '@/plugins'
import { import {
ChartDataMatchingAndShow ChartDataMatchingAndShow
} from "@/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index"; } from "@/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index";
import { computed, ref } from "vue"; import { computed, onMounted, ref } from "vue";
import { SettingItemBox } from "@/components/Pages/ChartItemSetting"; import { SettingItemBox } from "@/components/Pages/ChartItemSetting";
import { useTargetData } from "../../../hooks/useTargetData.hook"; import { useTargetData } from "../../../hooks/useTargetData.hook";
import DataSourceModel from "./components/data-source-model.vue"; import DataSourceModel from "./components/data-source-model.vue";
import { useDesignStore } from '@/store/modules/designStore/designStore' import { useDesignStore } from '@/store/modules/designStore/designStore'
import { SelectDataSourceTypeNameObj } from "@/enums/dataSourceEnum"; import { SelectDataSourceTypeNameObj } from "@/enums/dataSourceEnum";
import { specialCustomizeHttp } from "@/api/http";
import { newFunctionHandle } from "@/utils"; import { newFunctionHandle } from "@/utils";
import { fetchDataByIot } from "@/api/path/dataSource"; import { fetchDataByIot, fetchDataSite } from "@/api/path/dataSource";
const { DataCenterIcon, DevicesIcon, ActivityIcon } = icon.carbon const { DataCenterIcon, DevicesIcon, ActivityIcon } = icon.carbon
const { HelpOutlineIcon, FlashIcon } = icon.ionicons5 const { HelpOutlineIcon, FlashIcon } = icon.ionicons5
@ -116,6 +118,20 @@ async function sendHandle(){
} }
} }
const siteList = ref<any>([])
async function loadSiteData() {
const res = await fetchDataSite()
if (res && res.code === 0 && Array.isArray(res.data)) {
siteList.value = res.data
} else {
window['$message'].error('站点列表数据获取失败!')
}
}
onMounted(()=>{
loadSiteData()
})
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

20
src/views/chart/ContentConfigurations/components/ChartData/index.d.ts vendored

@ -136,6 +136,26 @@ export const selectDataSourceTypeOptions: SelectDataSourceType[] = [
] ]
export const selectPointsTimeRangeOptions: SelectDataSourceType[] = [ export const selectPointsTimeRangeOptions: SelectDataSourceType[] = [
{
label: PointsTimeRangeNameObj[PointsTimeRangeEnum.LAST_3d],
value: PointsTimeRangeEnum.LAST_3d
},
{
label: PointsTimeRangeNameObj[PointsTimeRangeEnum.LAST_2d],
value: PointsTimeRangeEnum.LAST_2d
},
{
label: PointsTimeRangeNameObj[PointsTimeRangeEnum.LAST_1d],
value: PointsTimeRangeEnum.LAST_1d
},
{
label: PointsTimeRangeNameObj[PointsTimeRangeEnum.LAST_12h],
value: PointsTimeRangeEnum.LAST_12h
},
{
label: PointsTimeRangeNameObj[PointsTimeRangeEnum.LAST_6h],
value: PointsTimeRangeEnum.LAST_6h
},
{ {
label: PointsTimeRangeNameObj[PointsTimeRangeEnum.LAST_30], label: PointsTimeRangeNameObj[PointsTimeRangeEnum.LAST_30],
value: PointsTimeRangeEnum.LAST_30 value: PointsTimeRangeEnum.LAST_30

Loading…
Cancel
Save