From b9268d89ec2f0d03357073d854146dd4d6c549ce Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Wed, 20 Dec 2023 11:03:32 +0800 Subject: [PATCH 001/142] =?UTF-8?q?style:=20=E5=88=9D=E5=A7=8B=E5=8C=96=20?= =?UTF-8?q?=E7=A6=81=E7=94=A8=E4=B8=80=E4=BA=9B=E9=A1=B5=E9=9D=A2=20?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E6=94=B9=E4=B8=BA=E8=AE=A9=E5=AE=BF=E4=B8=BB?= =?UTF-8?q?=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 6 +- README.md | 84 +++++++++---------- .../components/LayoutHeaderPro/index.vue | 2 +- src/router/index.ts | 2 +- src/router/router-guards.ts | 8 +- src/utils/router.ts | 29 +++++-- .../components/EditTools/index.vue | 2 +- .../ContentHeader/headerRightBtn/index.vue | 2 +- src/views/edit/index.vue | 2 +- src/views/project/index.vue | 18 ++-- .../ProjectItemsList/hooks/useModal.hook.ts | 2 +- .../ProjectLayoutAsideFooter/index.vue | 5 +- .../components/CreateModal/index.vue | 2 +- 13 files changed, 87 insertions(+), 77 deletions(-) diff --git a/.env b/.env index ada25fe7..f0819725 100644 --- a/.env +++ b/.env @@ -2,7 +2,9 @@ VITE_DEV_PORT = '8080' # development path -VITE_DEV_PATH = 'https://demo.mtruning.club' +# VITE_DEV_PATH = 'https://demo.mtruning.club' +VITE_DEV_PATH = 'http://192.168.0.120:3001' # production path -VITE_PRO_PATH = 'https://demo.mtruning.club' \ No newline at end of file +# VITE_PRO_PATH = 'https://demo.mtruning.club' +VITE_PRO_PATH = 'http://192.168.0.120:3001' diff --git a/README.md b/README.md index c664b7c0..e17d8898 100644 --- a/README.md +++ b/README.md @@ -37,61 +37,61 @@ import axiosInstance from './axios' import { RequestHttpEnum, ContentTypeEnum } from '@/enums/httpEnum' export const get = (url: string, params?: object) => { - return axiosInstance({ - url: url, - method: RequestHttpEnum.GET, - params: params, - }) + return axiosInstance({ + url: url, + method: RequestHttpEnum.GET, + params: params, + }) } export const post = (url: string, data?: object, headersType?: string) => { - return axiosInstance({ - url: url, - method: RequestHttpEnum.POST, - data: data, - headers: { - 'Content-Type': headersType || ContentTypeEnum.JSON - } - }) + return axiosInstance({ + url: url, + method: RequestHttpEnum.POST, + data: data, + headers: { + 'Content-Type': headersType || ContentTypeEnum.JSON + } + }) } export const put = (url: string, data?: object, headersType?: string) => { - return axiosInstance({ - url: url, - method: RequestHttpEnum.PUT, - data: data, - headers: { - 'Content-Type': headersType || ContentTypeEnum.JSON - } - }) + return axiosInstance({ + url: url, + method: RequestHttpEnum.PUT, + data: data, + headers: { + 'Content-Type': headersType || ContentTypeEnum.JSON + } + }) } export const del = (url: string, params?: object) => { - return axiosInstance({ - url: url, - method: RequestHttpEnum.DELETE, - params - }) + return axiosInstance({ + url: url, + method: RequestHttpEnum.DELETE, + params + }) } // 获取请求函数,默认get export const http = (type?: RequestHttpEnum) => { - switch (type) { - case RequestHttpEnum.GET: - return get + switch (type) { + case RequestHttpEnum.GET: + return get - case RequestHttpEnum.POST: - return post + case RequestHttpEnum.POST: + return post - case RequestHttpEnum.PUT: - return put + case RequestHttpEnum.PUT: + return put - case RequestHttpEnum.DELETE: - return del + case RequestHttpEnum.DELETE: + return del - default: - return get - } + default: + return get + } } ``` @@ -109,11 +109,3 @@ export const http = (type?: RequestHttpEnum) => { * build: 影响项目构建或依赖修改 * style: 不影响程序逻辑的代码修改 * chore: 不属于以上类型的其他类型(日常事务) - -## 交流 - -QQ 群:1030129384 - -![QQ群](readme/go-view-qq.png) - -![渲染海报](readme/logo-poster.png) diff --git a/src/layout/components/LayoutHeaderPro/index.vue b/src/layout/components/LayoutHeaderPro/index.vue index f89ca7b6..c69c729a 100644 --- a/src/layout/components/LayoutHeaderPro/index.vue +++ b/src/layout/components/LayoutHeaderPro/index.vue @@ -10,7 +10,7 @@ diff --git a/src/router/index.ts b/src/router/index.ts index c8977dda..8b633e99 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -28,7 +28,7 @@ const RootRoute: Array = [ ] -export const constantRouter: any[] = [LoginRoute, ...RootRoute, ReloadRoute]; +export const constantRouter: any[] = [...RootRoute, ReloadRoute]; const router = createRouter({ history: createWebHashHistory(''), diff --git a/src/router/router-guards.ts b/src/router/router-guards.ts index 5c81c514..9dd54ad1 100644 --- a/src/router/router-guards.ts +++ b/src/router/router-guards.ts @@ -28,9 +28,9 @@ export function createRouterGuards(router: Router) { } // @ts-ignore - if (!routerAllowList.includes(to.name) && !loginCheck()) { - next({ name: PageEnum.BASE_LOGIN_NAME }) - } + // if (!routerAllowList.includes(to.name) && !loginCheck()) { + // next({ name: PageEnum.BASE_LOGIN_NAME }) + // } next() }) @@ -44,4 +44,4 @@ export function createRouterGuards(router: Router) { router.onError((error) => { console.log(error, '路由错误'); }); -} \ No newline at end of file +} diff --git a/src/utils/router.ts b/src/utils/router.ts index 006b2f76..53ab7fc2 100644 --- a/src/utils/router.ts +++ b/src/utils/router.ts @@ -59,15 +59,30 @@ export const fetchPathByName = (pageName: string, p?: string) => { * @param windowOpen */ export const routerTurnByPath = ( - path: string, - query?: Array, - isReplace?: boolean, - windowOpen?: boolean + path: string, + query?: Array, + isReplace?: boolean, + windowOpen?: boolean, + isCallByParent?: boolean ) => { let fullPath = '' if (query?.length) { fullPath = `${path}/${query.join('/')}` } + if (isCallByParent) { + // 获取父页面的 window 对象 + var parentWindow = window.parent; + const message = { + // 属于哪个页面 + page: 'customLargeScreen', + // 属于什么类型 + type: 'changeRouter', + url: fullPath, + openNew: windowOpen ? 1 : 0 + } + parentWindow.postMessage(JSON.stringify(message), '*'); + return + } if (windowOpen) { return openNewWindow(fullPath) } @@ -204,11 +219,11 @@ export const loginCheck = () => { /** * * 预览地址 - * @returns + * @returns */ - export const previewPath = (id?: string | number) => { +export const previewPath = (id?: string | number) => { const { origin, pathname } = document.location const path = fetchPathByName(PreviewEnum.CHART_PREVIEW_NAME, 'href') const previewPath = `${origin}${pathname}${path}/${id || fetchRouteParamsLocation()}` return previewPath -} \ No newline at end of file +} diff --git a/src/views/chart/ContentEdit/components/EditTools/index.vue b/src/views/chart/ContentEdit/components/EditTools/index.vue index 3f7ada41..74ec86cc 100644 --- a/src/views/chart/ContentEdit/components/EditTools/index.vue +++ b/src/views/chart/ContentEdit/components/EditTools/index.vue @@ -152,7 +152,7 @@ const editHandle = () => { if (!path) return const id = fetchRouteParamsLocation() updateToSession(id) - routerTurnByPath(path, [id], undefined, true) + routerTurnByPath(path, [id], undefined, true, true) }, 2000) } diff --git a/src/views/chart/ContentHeader/headerRightBtn/index.vue b/src/views/chart/ContentHeader/headerRightBtn/index.vue index fea220c4..f9874142 100644 --- a/src/views/chart/ContentHeader/headerRightBtn/index.vue +++ b/src/views/chart/ContentHeader/headerRightBtn/index.vue @@ -117,7 +117,7 @@ const previewHandle = () => { setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [{ id: previewId, ...storageInfo }]) } // 跳转 - routerTurnByPath(path, [previewId], undefined, true) + routerTurnByPath(path, [previewId], undefined, true, true) } // 模态弹窗 diff --git a/src/views/edit/index.vue b/src/views/edit/index.vue index 4cba7ae4..31d4b5a3 100644 --- a/src/views/edit/index.vue +++ b/src/views/edit/index.vue @@ -102,7 +102,7 @@ function importJSON() { } // 同步数据编辑页 -window.opener.addEventListener(SavePageEnum.CHART, (e: any) => { +window?.opener?.addEventListener(SavePageEnum.CHART, (e: any) => { window['$message'].success('正在进行更新...') setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [e.detail]) content.value = JSONStringify(e.detail) diff --git a/src/views/project/index.vue b/src/views/project/index.vue index 22d179f9..01ed20b3 100644 --- a/src/views/project/index.vue +++ b/src/views/project/index.vue @@ -27,16 +27,16 @@ import { ProjectLayoutSider } from './layout/components/ProjectLayoutSider' import { LayoutHeaderPro } from '@/layout/components/LayoutHeaderPro' import { LayoutTransitionMain } from '@/layout/components/LayoutTransitionMain/index' -import { goDialog } from '@/utils' +// import { goDialog } from '@/utils' -// 提示 -goDialog({ - message: '不要在官方后端上发布任何私密数据,任何人都看得到并进行删除!!!!', - isMaskClosable: true, - closeNegativeText: true, - transformOrigin: 'center', - onPositiveCallback: () => {} -}) +// // 提示 +// goDialog({ +// message: '不要在官方后端上发布任何私密数据,任何人都看得到并进行删除!!!!', +// isMaskClosable: true, +// closeNegativeText: true, +// transformOrigin: 'center', +// onPositiveCallback: () => {} +// }) diff --git a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/index.vue b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/index.vue index 84c6678d..e50d0e5f 100644 --- a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/index.vue @@ -1,5 +1,5 @@ @@ -270,6 +270,7 @@ const clearColor = () => { // 自定义上传操作 const customRequest = (options: UploadCustomRequestOptions) => { const { file } = options + console.log(file) nextTick(async () => { if (file.file) { // 修改名称 @@ -281,10 +282,10 @@ const customRequest = (options: UploadCustomRequestOptions) => { const uploadRes = await uploadFile(uploadParams) if (uploadRes && uploadRes.errcode === '00000') { - if (uploadRes.data.fileurl) { + if (uploadRes.data[0]) { chartEditStore.setEditCanvasConfig( EditCanvasConfigEnum.BACKGROUND_IMAGE, - `${uploadRes.data.fileurl}?time=${new Date().getTime()}` + `${uploadRes.data[0]}?time=${new Date().getTime()}` ) } else { chartEditStore.setEditCanvasConfig( diff --git a/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue b/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue index 6e632cc5..d0387481 100644 --- a/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue @@ -1,23 +1,75 @@ diff --git a/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue b/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue index 21c7d96a..ba269b68 100644 --- a/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue @@ -7,7 +7,7 @@ - + diff --git a/src/views/chart/ContentConfigurations/index.vue b/src/views/chart/ContentConfigurations/index.vue index 110a3c2f..6724928f 100644 --- a/src/views/chart/ContentConfigurations/index.vue +++ b/src/views/chart/ContentConfigurations/index.vue @@ -134,12 +134,12 @@ const chartsDefaultTabList = [ icon: ConstructIcon, render: ChartSetting }, - { - key: TabsEnum.CHART_ANIMATION, - title: '动画', - icon: LeafIcon, - render: ChartAnimation - } + // { + // key: TabsEnum.CHART_ANIMATION, + // title: '动画', + // icon: LeafIcon, + // render: ChartAnimation + // } ] const chartsTabList = [ diff --git a/src/views/chart/ContentHeader/headerRightBtn/index.vue b/src/views/chart/ContentHeader/headerRightBtn/index.vue index f9874142..01555774 100644 --- a/src/views/chart/ContentHeader/headerRightBtn/index.vue +++ b/src/views/chart/ContentHeader/headerRightBtn/index.vue @@ -171,13 +171,13 @@ const btnList = [ icon: renderIcon(BrowsersOutlineIcon), event: previewHandle }, - { - key: 'release', - title: () => (release.value ? '已发布' : '发布'), - icon: renderIcon(SendIcon), - type: () => (release.value ? 'primary' : 'default'), - event: modelShowHandle - } + // { + // key: 'release', + // title: () => (release.value ? '已发布' : '发布'), + // icon: renderIcon(SendIcon), + // type: () => (release.value ? 'primary' : 'default'), + // event: modelShowHandle + // } ] const comBtnList = computed(() => { diff --git a/src/views/chart/hooks/useSync.hook.ts b/src/views/chart/hooks/useSync.hook.ts index f40e2c3c..6a4fa893 100644 --- a/src/views/chart/hooks/useSync.hook.ts +++ b/src/views/chart/hooks/useSync.hook.ts @@ -250,8 +250,7 @@ export const useSync = () => { chartEditStore.componentList = [] chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START) try { - const res = await fetchProjectApi({ projectId: fetchRouteParamsLocation() }) - console.log(res) + const res = await fetchProjectApi({ id: Number(fetchRouteParamsLocation()) }) if (res) { // type dataType = { // id: string @@ -263,6 +262,9 @@ export const useSync = () => { // } if (res.data) { updateStoreInfo(res.data as any) + for(let k in res.data){ + res.data[k] = res.data[k] ? res.data[k] : null + } // 更新全局数据 await updateComponent(JSONParse((res.data as any).content)) return @@ -276,9 +278,8 @@ export const useSync = () => { } chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE) } catch (error) { - console.log(error) chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE) - httpErrorHandle() + // httpErrorHandle() } } diff --git a/src/views/preview/components/PreviewRenderList/index.vue b/src/views/preview/components/PreviewRenderList/index.vue index d22be72d..7193d99f 100644 --- a/src/views/preview/components/PreviewRenderList/index.vue +++ b/src/views/preview/components/PreviewRenderList/index.vue @@ -30,12 +30,13 @@ :chartConfig="item" :themeSetting="themeSetting" :themeColor="themeColor" - :style="{ + :style="{ ...getSizeStyle(item.attr), ...getFilterStyle(item.styles) }" - v-on="useLifeHandler(item)" + v-on="bindEvent(item)" > + @@ -50,6 +51,7 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle, colorCustomMerge } from '@/utils' import { getSizeStyle, getComponentAttrStyle, getStatusStyle, getPreviewConfigStyle } from '../../utils' import { useLifeHandler } from '@/hooks' +import { useCustomEvent } from '../../hooks/useCustomEvent.hook' // 初始化数据池 const { initDataPond, clearMittDataPondMap } = useChartDataPondFetch() @@ -79,6 +81,8 @@ clearMittDataPondMap() onMounted(() => { initDataPond(useChartEditStore) }) + +const { bindEvent } = useCustomEvent() diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/config.ts b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/config.ts index adc4a800..79332d0f 100644 --- a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/config.ts +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/config.ts @@ -18,4 +18,12 @@ export default class Config extends PublicConfigClass implements CreateComponent public key = ComprehensivePUEConfig.key public chartConfig = cloneDeep(ComprehensivePUEConfig) public option = cloneDeep(option) + public customData = cloneDeep({ + title: '综合PUE', + id_1: null, + id_2: null, + id_3: null, + id_4: null, + showInterval: true, + }) } diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/configData.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/configData.vue new file mode 100644 index 00000000..248d3e2f --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/configData.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/index.ts b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/index.ts index a5c52679..f11cd9b4 100644 --- a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/index.ts @@ -5,10 +5,11 @@ export const ComprehensivePUEConfig: ConfigType = { key: 'ComprehensivePUE', chartKey: 'VComprehensivePUE', conKey: 'VCComprehensivePUE', + conDataKey: 'VCDComprehensivePUE', title: '综合PUE', category: ChatCategoryEnum.CUSTOMCOMPONENTS, categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, package: PackagesCategoryEnum.CUSTOMCOMPONENTS, chartFrame: ChartFrameEnum.COMMON, - image: 'photo.png' + image: 'ComprehensivePUE.png' } diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/index.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/index.vue index 5fa187e9..cf411daa 100644 --- a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUE/index.vue @@ -1,17 +1,18 @@ + + + + + + diff --git a/src/hooks/commonDataComponents/useDeviceClassRes.ts b/src/hooks/commonDataComponents/useDeviceClassRes.ts new file mode 100644 index 00000000..398db572 --- /dev/null +++ b/src/hooks/commonDataComponents/useDeviceClassRes.ts @@ -0,0 +1,19 @@ +import { publicInterface } from "@/api/path"; +import { CreateComponentType } from '@/packages/index.d' +import { ResultErrcode } from "@/enums/httpEnum"; +import { DeviceClassType } from '@/store/modules/chartEditStore/chartEditStore.d' +import dataJson from "./data.json"; + +export const handleDeviceClass = (targetComponent: CreateComponentType) => { + const obj = targetComponent.commonData[targetComponent.commonData.currentSource] as DeviceClassType + let { enable, space_complete_id } = obj + if(!enable) return { + errcode: ResultErrcode.SUCCESS, + data: { ...dataJson }, + errmsg: '' + } + const query = { + space_complete_id + } + return publicInterface('/dcim/system/custom_large_screen', 'count_device_by_device_type_active', query) +} diff --git a/src/hooks/useChartCommonData.hook.ts b/src/hooks/useChartCommonData.hook.ts index b1fa0cec..3a5adc5b 100644 --- a/src/hooks/useChartCommonData.hook.ts +++ b/src/hooks/useChartCommonData.hook.ts @@ -12,6 +12,7 @@ import { handleRecordValueHistory } from './commonDataComponents/useRecordValueH import { handlePointRealTime } from './commonDataComponents/usePointRealTimeRes' import { handleSinglePoint } from './commonDataComponents/useSinglePointRes' import { handleMonthAlarmClass } from './commonDataComponents/useMonthAlarmClassRes' +import { handleDeviceClass } from './commonDataComponents/useDeviceClassRes' import { handleNoParam } from './commonDataComponents/useNoParamRes' import { ResultErrcode } from '@/enums/httpEnum' @@ -97,7 +98,7 @@ export const useChartCommonData = ( clearInterval(fetchInterval) const fetchFn = async () => { - let res + let res, isMultiple = true switch (targetComponent.commonData?.currentSource) { case CurrentSourceEnum.POINTHISTORY: res = await handlePointHistory(targetComponent) @@ -113,30 +114,41 @@ export const useChartCommonData = ( break; case CurrentSourceEnum.SINGLEPOINT: res = await handleSinglePoint(targetComponent) + isMultiple = false break; case CurrentSourceEnum.MONTHALARMCLASS: res = await handleMonthAlarmClass(targetComponent) break; + case CurrentSourceEnum.DEVICECLASS: + res = await handleDeviceClass(targetComponent) + break; default: - res = await handleNoParam(targetComponent) + // res = await handleNoParam(targetComponent) break; } if (res && res.errcode === ResultErrcode.SUCCESS) { try { const { data } = res - if(Object.prototype.toString.call(data) === '[object Array]') { - if(data.length) echartsUpdateHandle(data[0]) + // 多值的 + if(isMultiple) { + if(Object.prototype.toString.call(data) === '[object Array]') { + if(data.length && data[0].dimensions && data[0].source) echartsUpdateHandle(data[0]) + else throw Error() + } + else if(Object.prototype.toString.call(data) === '[object Object]'){ + if(data.dimensions && data.source) echartsUpdateHandle(data) + else throw Error() + } } - else if(Object.prototype.toString.call(data) === '[object Object]'){ - echartsUpdateHandle(data) + // 单值的 + else { + if(data) echartsUpdateHandle(data) + else throw Error() } } catch (error) { - console.error(error) + window['$message'].error('数据错误') } } - else if(res && res.errmsg){ - window['$message'].warning(res.errmsg) - } } // 普通初始化与组件交互处理监听 watch( diff --git a/src/packages/components/CustomComponents/CustomComponents/Dashboard/config.ts b/src/packages/components/CustomComponents/CustomComponents/Dashboard/config.ts new file mode 100644 index 00000000..319ef9ed --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Dashboard/config.ts @@ -0,0 +1,32 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { DashboardConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +// import logo from '@/assets/logo.png' +import { CurrentSourceEnum } from '@/store/modules/chartEditStore/chartEditStore.d' + + +export const option = { + dataset: 0, + showUnit: false, + showSubtext: true, + showSubtextUnit: true, + min: 0, + max: 100, + titleFontSize: 24, + titleColor: '#fff', + subtextFontSize: 20, + subtextColor: '#fff' +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + constructor() { + super(); + this.attr.w = 250 + this.attr.h = 250 + this.commonData.currentSource = CurrentSourceEnum.SINGLEPOINT + } + public key = DashboardConfig.key + public chartConfig = cloneDeep(DashboardConfig) + public option = cloneDeep(option) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/Dashboard/config.vue b/src/packages/components/CustomComponents/CustomComponents/Dashboard/config.vue new file mode 100644 index 00000000..bdacaa6b --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Dashboard/config.vue @@ -0,0 +1,65 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/Dashboard/index.ts b/src/packages/components/CustomComponents/CustomComponents/Dashboard/index.ts new file mode 100644 index 00000000..10c06428 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Dashboard/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const DashboardConfig: ConfigType = { + key: 'Dashboard', + chartKey: 'VDashboard', + conKey: 'VCDashboard', + title: '仪表盘', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.ECHARTS, + image: 'Dashboard.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/Dashboard/index.vue b/src/packages/components/CustomComponents/CustomComponents/Dashboard/index.vue new file mode 100644 index 00000000..1848074f --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Dashboard/index.vue @@ -0,0 +1,364 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/RealTimeTraffic/index.vue b/src/packages/components/CustomComponents/CustomComponents/RealTimeTraffic/index.vue index be0b8119..9ef846d9 100644 --- a/src/packages/components/CustomComponents/CustomComponents/RealTimeTraffic/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/RealTimeTraffic/index.vue @@ -6,8 +6,7 @@ :option="option" :manual-update="false" :update-options="{ - notMerge: true, - replaceMerge: ['series', 'xAxis'] + replaceMerge: [] }" autoresize style="overflow: visible" @@ -235,22 +234,34 @@ const getData = () => { } query.types = [methodArr[0]] query.query_type = methodArr[1] || '' - option.xAxis['data'] = [] - option.series[0]['data'] = [] + // option.xAxis['data'] = [] + // option.series[0]['data'] = [] publicInterface('/dcim/dems/statistic', 'get_point_realtime_data_echarts', query).then((res:any) => { if (res && res.data && res.data['current']) { const data = res.data - option.xAxis['data'] = data['echarts'] && data['echarts']['xAxis'] && data['echarts']['xAxis']['data'] ? data['echarts']['xAxis']['data'].map((item:any) => { - const time = query.query_type === '' ? moment(item).format('YYYY-MM-DD HH:mm:ss') : query.query_type === 'day' ? moment(item).format('YYYY-MM-DD') : moment(item).format('YYYY-MM') - return time - }) : [] - option.series[0]['data'] = data['echarts'] && data['echarts']['series'] && data['echarts']['series'][0] && data['echarts']['series'][0]['data'] ? data['echarts']['series'][0] && data['echarts']['series'][0]['data'] : [] - if (query.query_type === '') { - option.tooltip.formatter = '{b}
' + '速率(测点/s)' + '  ' + '{c}' - } else { - option.tooltip.formatter = '{b}
' + '测点总数' + '  ' + '{c}' - } + // option.xAxis['data'] = data['echarts'] && data['echarts']['xAxis'] && data['echarts']['xAxis']['data'] ? data['echarts']['xAxis']['data'].map((item:any) => { + // const time = query.query_type === '' ? moment(item).format('YYYY-MM-DD HH:mm:ss') : query.query_type === 'day' ? moment(item).format('YYYY-MM-DD') : moment(item).format('YYYY-MM') + // return time + // }) : [] + // option.series[0]['data'] = data['echarts'] && data['echarts']['series'] && data['echarts']['series'][0] && data['echarts']['series'][0]['data'] ? data['echarts']['series'][0] && data['echarts']['series'][0]['data'] : [] + // if (query.query_type === '') { + // option.tooltip.formatter = '{b}
' + '速率(测点/s)' + '  ' + '{c}' + // } else { + // option.tooltip.formatter = '{b}
' + '测点总数' + '  ' + '{c}' + // } + nextTick(() => { + if(!vChartRef.value) return + let xAxisData = data['echarts'] && data['echarts']['xAxis'] && data['echarts']['xAxis']['data'] ? data['echarts']['xAxis']['data'].map((item:any) => { + const time = query.query_type === '' ? moment(item).format('YYYY-MM-DD HH:mm:ss') : query.query_type === 'day' ? moment(item).format('YYYY-MM-DD') : moment(item).format('YYYY-MM') + return time + }) : [] + let series0Data = data['echarts'] && data['echarts']['series'] && data['echarts']['series'][0] && data['echarts']['series'][0]['data'] ? data['echarts']['series'][0] && data['echarts']['series'][0]['data'] : [] + vChartRef.value.setOption({ + xAxis: { data: xAxisData }, + series: [{ data:series0Data }] + }) + }) } }).catch((e:unknown) => { console.log(e) diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index 32e28fa2..b4c48450 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -4,6 +4,7 @@ import { RealTimeTrafficConfig } from './RealTimeTraffic' import { OverviewOfComputingNodesConfig } from './OverviewOfComputingNodes' import { GDMapConfig } from './GDMap' import { MonitorRealTimeEventsConfig } from './MonitorRealTimeEvents' +import { DashboardConfig } from './Dashboard' export default [ // Theme1Config, @@ -12,4 +13,5 @@ export default [ OverviewOfComputingNodesConfig, GDMapConfig, MonitorRealTimeEventsConfig, + DashboardConfig, ] diff --git a/src/packages/public/publicConfig.ts b/src/packages/public/publicConfig.ts index cbbb2173..4b212809 100644 --- a/src/packages/public/publicConfig.ts +++ b/src/packages/public/publicConfig.ts @@ -80,7 +80,8 @@ const commonData: commonDataType = { space_complete_id: '' }, deviceClass: { - enable: false + enable: false, + space_complete_id: '' }, singlePoint: { enable: false, diff --git a/src/store/modules/chartEditStore/chartEditStore.d.ts b/src/store/modules/chartEditStore/chartEditStore.d.ts index 041d21b7..f61cab23 100644 --- a/src/store/modules/chartEditStore/chartEditStore.d.ts +++ b/src/store/modules/chartEditStore/chartEditStore.d.ts @@ -335,6 +335,12 @@ export interface MonthAlarmClassType { space_complete_id: string } +// 设备分类统计 +export interface DeviceClassType { + enable: boolean + space_complete_id: string +} + // 通用组件数据 export interface commonDataType { // 多数据 @@ -345,7 +351,8 @@ export interface commonDataType { pointRealTime: PointRealTimeType monthAlarmClass: MonthAlarmClassType // 多数据无参数 - deviceClass: NoParamsType + // 设备分类统计 + deviceClass: DeviceClassType // 单数据 singlePoint: SinglePointType } diff --git a/src/views/chart/ContentCharts/hooks/useAside.hook.ts b/src/views/chart/ContentCharts/hooks/useAside.hook.ts index 836c549d..227bce32 100644 --- a/src/views/chart/ContentCharts/hooks/useAside.hook.ts +++ b/src/views/chart/ContentCharts/hooks/useAside.hook.ts @@ -44,18 +44,18 @@ const packagesListObj = { icon: renderIcon(AirPlaneOutlineIcon), label: PackagesCategoryName.ICONS }, - [PackagesCategoryEnum.THEMESANDLAYOUTS]: { - icon: renderIcon(Apps20RegularIcon), - label: PackagesCategoryName.THEMESANDLAYOUTS - }, + // [PackagesCategoryEnum.THEMESANDLAYOUTS]: { + // icon: renderIcon(Apps20RegularIcon), + // label: PackagesCategoryName.THEMESANDLAYOUTS + // }, [PackagesCategoryEnum.CUSTOMCOMPONENTS]: { icon: renderIcon(AreaCustomIcon), label: PackagesCategoryName.CUSTOMCOMPONENTS }, - [PackagesCategoryEnum.BACKGROUNDS]: { - icon: renderIcon(InsertPhotoSharpIcon), - label: PackagesCategoryName.BACKGROUNDS - } + // [PackagesCategoryEnum.BACKGROUNDS]: { + // icon: renderIcon(InsertPhotoSharpIcon), + // label: PackagesCategoryName.BACKGROUNDS + // } } export const useAsideHook = () => { diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/DeviceClass.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/DeviceClass.vue new file mode 100644 index 00000000..bfdce82f --- /dev/null +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/DeviceClass.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/MonthAlarmClass.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/MonthAlarmClass.vue index 0b6d756a..0215bf10 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/MonthAlarmClass.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/MonthAlarmClass.vue @@ -25,14 +25,14 @@ import {SettingItemBox} from '@/components/Pages/ChartItemSetting' import {useTargetData} from '../../hooks/useTargetData.hook' import {DateOptions, PolicyOptions} from './ComponentsType.d' import {icon} from '@/plugins/icon' -import {commonDataType, RecordValueHistoryType} from '@/store/modules/chartEditStore/chartEditStore.d' +import {commonDataType, MonthAlarmClassType} from '@/store/modules/chartEditStore/chartEditStore.d' const {CloseIcon, AddIcon} = icon.ionicons5 const {targetData} = useTargetData() as { targetData: Ref<{ commonData: commonDataType, id: string }> } const target = computed(() => { - return targetData.value.commonData[targetData.value.commonData.currentSource] + return targetData.value.commonData[targetData.value.commonData.currentSource] as MonthAlarmClassType }) // const recordValueHistory: Ref = computed(() => targetData.value.commonData.recordValueHistory) diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue index 128b1062..f3df6eca 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue @@ -9,7 +9,7 @@ - + @@ -36,6 +37,9 @@ import { computed, PropType, toRefs, watch, reactive, ref } from 'vue' import { CreateComponentType } from '@/packages/index.d' import { icon } from '@/plugins' +import {useChartCommonData} from "@/hooks"; +import {useChartEditStore} from "@/store/modules/chartEditStore/chartEditStore"; +import { cloneDeep } from 'lodash' const props = defineProps({ chartConfig: { @@ -67,22 +71,48 @@ const { w, h } = toRefs(props.chartConfig.attr) const option = reactive({ dataset: props.chartConfig.option.dataset, - style: props.chartConfig.option.style + style: props.chartConfig.option.style, + header: props.chartConfig.option.header }) watch( () => props.chartConfig.option.dataset, (newData: any) => { option.dataset = newData - option?.dataset?.dimensions?.forEach((header: any) => { - header.align = align.value - }) + option.header.value = newData.dimensions + console.log(newData.dimensions.toString(), option.header.options.map((_: {value: string}) => _.value).toString()) + if(newData.dimensions.toString() === option.header.options.map((_: {value: string}) => _.value).toString()) return + option.header.options = newData.dimensions.map((_: string) => ({label: _, value: _})) + // option?.dataset?.dimensions?.forEach((header: any) => { + // header.align = align.value + // }) }, { immediate: true, deep: true } ) + +watch(() => props.chartConfig.option.header, v => { + option.header = v +}, { + immediate: true, + deep: true +}) + +const columns = computed(() => { + let dimensions = option.header.options.filter((_: {label: string, value: string}) => option.header.value.includes(_.value)) + dimensions = dimensions.map((_: {label: string, value: string}) => { + return { + title: _.label, + key: _.value, + align: align.value + } + }) + return dimensions +}) + +useChartCommonData(props.chartConfig, useChartEditStore) diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.d.ts b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.d.ts index f734400a..c52adb3b 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.d.ts +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.d.ts @@ -155,6 +155,11 @@ export const sourceOptions: sourceOptionsItemType[] = [ value: CurrentSourceEnum.MONTHALARMCLASS, type: optionTypeEnum.MULTIPLE, }, + { + label: '测点表格值', + value: CurrentSourceEnum.POINTTABLE, + type: optionTypeEnum.MULTIPLE, + }, { label: '单测点实时值', value: CurrentSourceEnum.SINGLEPOINT, diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue index f3df6eca..9e4a0c46 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue @@ -10,6 +10,7 @@ + diff --git a/src/packages/components/Charts/Mores/Radar/index.vue b/src/packages/components/Charts/Mores/Radar/index.vue index 164516ef..bb13d6e9 100644 --- a/src/packages/components/Charts/Mores/Radar/index.vue +++ b/src/packages/components/Charts/Mores/Radar/index.vue @@ -3,7 +3,7 @@ diff --git a/src/packages/components/Charts/Mores/index.ts b/src/packages/components/Charts/Mores/index.ts index 4ddd2c7f..76bf90dc 100644 --- a/src/packages/components/Charts/Mores/index.ts +++ b/src/packages/components/Charts/Mores/index.ts @@ -10,7 +10,7 @@ import { GraphConfig } from './Graph/index' export default [ // ProcessConfig, - // RadarConfig, + RadarConfig, // FunnelConfig, // HeatmapConfig, WaterPoloConfig, diff --git a/src/packages/components/Tables/Tables/TableScrollBoard/config.ts b/src/packages/components/Tables/Tables/TableScrollBoard/config.ts index f92f690b..4cc20c08 100644 --- a/src/packages/components/Tables/Tables/TableScrollBoard/config.ts +++ b/src/packages/components/Tables/Tables/TableScrollBoard/config.ts @@ -4,12 +4,36 @@ import { TableScrollBoardConfig } from './index' import cloneDeep from 'lodash/cloneDeep' import dataJson from './data.json' +export enum AlignEnum { + LEFT = 'left', + CENTER = 'center', + RIGHT = 'right', +} + +export type MapType = { + show: boolean + key: string + header: string + align: AlignEnum + columnWidth: number +} + export const option = { - header: ['列1', '列2', '列3'], - dataset: dataJson, - index: true, - columnWidth: [30, 100, 100], - align: ['center', 'right', 'right', 'right'], + headerConfig: [], + headerConfigMap: { + index: { + show: true, + key: '行号', + header: '#', + align: 'left', + columnWidth: 30, + } + }, + // header: ['列1', '列2', '列3'], + dataset: { dimensions: [], source: [] }, + // index: true, + // columnWidth: [], + // align: [], rowNum: 5, waitTime: 2, headerHeight: 35, diff --git a/src/packages/components/Tables/Tables/TableScrollBoard/config.vue b/src/packages/components/Tables/Tables/TableScrollBoard/config.vue index 1aec6363..0edd14bb 100644 --- a/src/packages/components/Tables/Tables/TableScrollBoard/config.vue +++ b/src/packages/components/Tables/Tables/TableScrollBoard/config.vue @@ -25,21 +25,20 @@ placeholder="请输入表头高度" > - - - + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + {{item.key ? item.key : '--'}} + + + + + + + + + + + diff --git a/src/packages/components/Tables/Tables/TableScrollBoard/index.vue b/src/packages/components/Tables/Tables/TableScrollBoard/index.vue index 669be3ed..761aa4f7 100644 --- a/src/packages/components/Tables/Tables/TableScrollBoard/index.vue +++ b/src/packages/components/Tables/Tables/TableScrollBoard/index.vue @@ -50,10 +50,11 @@ + + \ No newline at end of file diff --git a/src/packages/components/Informations/Mores/Video/config.ts b/src/packages/components/Informations/Mores/Video/config.ts index 41db6a90..a67bfb05 100644 --- a/src/packages/components/Informations/Mores/Video/config.ts +++ b/src/packages/components/Informations/Mores/Video/config.ts @@ -7,6 +7,8 @@ import video from '@/assets/videos/earth.mp4' export const option = { // 视频路径 dataset: video, + // 视频列表 + datasetList: [], // 循环播放 loop: true, // 静音 @@ -18,6 +20,11 @@ export const option = { } export default class Config extends PublicConfigClass implements CreateComponentType { + constructor() { + super(); + this.styles.filterShow = true + this.styles.blendMode = 'screen' + } public key = VideoConfig.key public chartConfig = cloneDeep(VideoConfig) public option = cloneDeep(option) diff --git a/src/packages/components/Informations/Mores/Video/config.vue b/src/packages/components/Informations/Mores/Video/config.vue index 14a5accc..95916beb 100644 --- a/src/packages/components/Informations/Mores/Video/config.vue +++ b/src/packages/components/Informations/Mores/Video/config.vue @@ -3,11 +3,18 @@ diff --git a/src/packages/components/Informations/Mores/index.ts b/src/packages/components/Informations/Mores/index.ts index 572ab9e0..3ea0d133 100644 --- a/src/packages/components/Informations/Mores/index.ts +++ b/src/packages/components/Informations/Mores/index.ts @@ -4,4 +4,4 @@ import { IframeConfig } from './Iframe/index' import { VideoConfig } from './Video/index' import { WordCloudConfig } from './WordCloud/index' -export default [ImageConfig, ImageCarouselConfig, VideoConfig, IframeConfig, WordCloudConfig] +export default [VideoConfig] diff --git a/src/packages/components/Informations/index.ts b/src/packages/components/Informations/index.ts index bcfbff79..055a34c1 100644 --- a/src/packages/components/Informations/index.ts +++ b/src/packages/components/Informations/index.ts @@ -1,6 +1,6 @@ import Texts from './Texts' // import Inputs from './Inputs' -// import Mores from './Mores' +import Mores from './Mores' // export const InformationList = [...Texts, ...Inputs, ...Mores] -export const InformationList = [...Texts] +export const InformationList = [...Texts, ...Mores] diff --git a/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue b/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue index 21c7d96a..206ae7f0 100644 --- a/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue @@ -9,7 +9,7 @@ - + From 8a52942d3954dedf413773d25d0b421627861d3e Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Mon, 19 Feb 2024 18:15:27 +0800 Subject: [PATCH 053/142] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/components/Informations/Mores/Video/config.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/packages/components/Informations/Mores/Video/config.vue b/src/packages/components/Informations/Mores/Video/config.vue index 95916beb..4d2e2a97 100644 --- a/src/packages/components/Informations/Mores/Video/config.vue +++ b/src/packages/components/Informations/Mores/Video/config.vue @@ -4,15 +4,15 @@ - + - - + + From c06ffdae841136b7180d72d36b8aca85b6cf42cd Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Tue, 20 Feb 2024 18:33:53 +0800 Subject: [PATCH 054/142] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B=E7=BB=84=E6=80=81=E7=BB=84=E4=BB=B6=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=8A=98=E7=BA=BF=E5=9B=BE=E6=9F=B1=E7=8A=B6=E5=9B=BE?= =?UTF-8?q?=E6=80=BB=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 3 +- .../chart/customponents/EngineeringConfig.png | Bin 0 -> 162740 bytes .../Charts/Bars/BarCommon/config.ts | 3 +- .../Charts/Bars/BarCommon/config.vue | 6 +- .../Charts/Bars/BarCrossrange/config.ts | 3 +- .../Charts/Bars/BarCrossrange/config.vue | 6 +- .../Charts/Lines/LineCommon/config.ts | 3 +- .../Charts/Lines/LineCommon/config.vue | 6 +- .../Charts/Lines/LineGradientSingle/config.ts | 3 +- .../Lines/LineGradientSingle/config.vue | 28 ++++++-- .../Charts/Lines/LineGradientSingle/index.vue | 13 ++++ .../Charts/Lines/LineLinearSingle/config.ts | 3 +- .../Charts/Lines/LineLinearSingle/config.vue | 6 +- .../EngineeringConfig/config.ts | 29 ++++++++ .../EngineeringConfig/config.vue | 11 +++ .../EngineeringConfig/configData.vue | 16 +++++ .../EngineeringConfig/index.ts | 16 +++++ .../EngineeringConfig/index.vue | 68 ++++++++++++++++++ .../CustomComponents/index.ts | 2 + .../Decorates/Mores/TimeCommon1/index.vue | 2 +- .../Informations/Mores/Video/config.ts | 3 +- .../Informations/Mores/Video/config.vue | 8 ++- .../Informations/Mores/Video/index.vue | 2 +- 23 files changed, 220 insertions(+), 20 deletions(-) create mode 100644 src/assets/images/chart/customponents/EngineeringConfig.png create mode 100644 src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/config.ts create mode 100644 src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/config.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/configData.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/index.ts create mode 100644 src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/index.vue diff --git a/.env b/.env index 0115e716..30a49059 100644 --- a/.env +++ b/.env @@ -2,7 +2,8 @@ VITE_DEV_PORT = '8080' # development path -VITE_DEV_PATH = 'http://192.168.0.34:11887' +# VITE_DEV_PATH = 'http://192.168.0.34:11887' +VITE_DEV_PATH = 'http://192.168.0.34:18077' # VITE_DEV_PATH = 'http://192.168.0.120:3001' # production path diff --git a/src/assets/images/chart/customponents/EngineeringConfig.png b/src/assets/images/chart/customponents/EngineeringConfig.png new file mode 100644 index 0000000000000000000000000000000000000000..a32e0ff6fefc702a9d72ef3612b518f66375bd82 GIT binary patch literal 162740 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

Z!(wdvyEcFv8Uy%P57 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�U9K~titCARHjZ4z3T8RXIgS+v||6%p^ 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 literal 0 HcmV?d00001 diff --git a/src/packages/components/Charts/Bars/BarCommon/config.ts b/src/packages/components/Charts/Bars/BarCommon/config.ts index a57b6d94..fe20cb39 100644 --- a/src/packages/components/Charts/Bars/BarCommon/config.ts +++ b/src/packages/components/Charts/Bars/BarCommon/config.ts @@ -37,7 +37,8 @@ xAxis: { type: 'value' }, dataset: { ...dataJson }, - series: [seriesItem, seriesItem] + series: [seriesItem, seriesItem], + allSeriesConfig: seriesItem } export default class Config extends PublicConfigClass implements CreateComponentType { diff --git a/src/packages/components/Charts/Bars/BarCommon/config.vue b/src/packages/components/Charts/Bars/BarCommon/config.vue index abe45649..7b03ce5c 100644 --- a/src/packages/components/Charts/Bars/BarCommon/config.vue +++ b/src/packages/components/Charts/Bars/BarCommon/config.vue @@ -107,7 +107,11 @@ const seriesList = computed(() => { return props.optionData.series }) -const allSeriesConfig: Ref = ref(cloneDeep(seriesItem)) +// const allSeriesConfig: Ref = ref(cloneDeep(seriesItem)) + +const allSeriesConfig = computed(() => { + return props.optionData.allSeriesConfig +}) watch(() => allSeriesConfig.value, (v) => { seriesList.value.forEach((item: typeof seriesItem) => { diff --git a/src/packages/components/Charts/Bars/BarCrossrange/config.ts b/src/packages/components/Charts/Bars/BarCrossrange/config.ts index 340656ac..abdd2687 100644 --- a/src/packages/components/Charts/Bars/BarCrossrange/config.ts +++ b/src/packages/components/Charts/Bars/BarCrossrange/config.ts @@ -37,7 +37,8 @@ export const option = { type: 'category' }, dataset: { ...dataJson }, - series: [seriesItem, seriesItem] + series: [seriesItem, seriesItem], + allSeriesConfig: seriesItem } export default class Config extends PublicConfigClass implements CreateComponentType { diff --git a/src/packages/components/Charts/Bars/BarCrossrange/config.vue b/src/packages/components/Charts/Bars/BarCrossrange/config.vue index de0678d3..69d1e74d 100644 --- a/src/packages/components/Charts/Bars/BarCrossrange/config.vue +++ b/src/packages/components/Charts/Bars/BarCrossrange/config.vue @@ -132,7 +132,11 @@ const seriesList = computed(() => { return props.optionData.series }) -const allSeriesConfig: Ref = ref(cloneDeep(seriesItem)) +// const allSeriesConfig: Ref = ref(cloneDeep(seriesItem)) + +const allSeriesConfig = computed(() => { + return props.optionData.allSeriesConfig +}) watch(() => allSeriesConfig.value, (v) => { seriesList.value.forEach((item: typeof seriesItem) => { diff --git a/src/packages/components/Charts/Lines/LineCommon/config.ts b/src/packages/components/Charts/Lines/LineCommon/config.ts index 261e2679..ac9ce632 100644 --- a/src/packages/components/Charts/Lines/LineCommon/config.ts +++ b/src/packages/components/Charts/Lines/LineCommon/config.ts @@ -43,7 +43,8 @@ export const option = { type: 'value' }, dataset: { ...dataJson }, - series: [seriesItem, seriesItem] + series: [seriesItem, seriesItem], + allSeriesConfig: seriesItem } export default class Config extends PublicConfigClass implements CreateComponentType { diff --git a/src/packages/components/Charts/Lines/LineCommon/config.vue b/src/packages/components/Charts/Lines/LineCommon/config.vue index 1e1fe777..58f23e45 100644 --- a/src/packages/components/Charts/Lines/LineCommon/config.vue +++ b/src/packages/components/Charts/Lines/LineCommon/config.vue @@ -142,7 +142,11 @@ const seriesList = computed(() => { return props.optionData.series }) -const allSeriesConfig: Ref = ref(cloneDeep(seriesItem)) +// const allSeriesConfig: Ref = ref(cloneDeep(seriesItem)) + +const allSeriesConfig = computed(() => { + return props.optionData.allSeriesConfig +}) watch(() => allSeriesConfig.value, (v) => { seriesList.value.forEach((item: typeof seriesItem) => { diff --git a/src/packages/components/Charts/Lines/LineGradientSingle/config.ts b/src/packages/components/Charts/Lines/LineGradientSingle/config.ts index 80a79979..ddaef6a4 100644 --- a/src/packages/components/Charts/Lines/LineGradientSingle/config.ts +++ b/src/packages/components/Charts/Lines/LineGradientSingle/config.ts @@ -54,7 +54,8 @@ const options = { type: 'value' }, dataset: { ...dataJson }, - series: [seriesItem] + series: [seriesItem], + allSeriesConfig: seriesItem } export default class Config extends PublicConfigClass implements CreateComponentType { diff --git a/src/packages/components/Charts/Lines/LineGradientSingle/config.vue b/src/packages/components/Charts/Lines/LineGradientSingle/config.vue index b1ca4786..5f5c16c8 100644 --- a/src/packages/components/Charts/Lines/LineGradientSingle/config.vue +++ b/src/packages/components/Charts/Lines/LineGradientSingle/config.vue @@ -126,10 +126,11 @@ import { PropType, computed, ref, watch } from 'vue' import type { Ref } from 'vue' import { lineConf } from '@/packages/chartConfiguration/echarts/index' -import { GlobalThemeJsonType } from '@/settings/chartThemes/index' +import { chartColorsSearch, defaultTheme, GlobalThemeJsonType } from '@/settings/chartThemes/index' import { GlobalSetting, CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' import { seriesItem } from "./config"; import { cloneDeep } from "lodash"; +import { graphic } from "echarts/core"; const props = defineProps({ optionData: { @@ -142,11 +143,30 @@ const seriesList = computed(() => { return props.optionData.series }) -const allSeriesConfig: Ref = ref(cloneDeep(seriesItem)) +// const allSeriesConfig: Ref = ref(cloneDeep(seriesItem)) + +const allSeriesConfig = computed(() => { + return props.optionData.allSeriesConfig +}) watch(() => allSeriesConfig.value, (v) => { - seriesList.value.forEach((item: typeof seriesItem) => { - Object.assign(item, cloneDeep(v)) + seriesList.value.forEach((item: typeof seriesItem, index: number) => { + const themeColor = chartColorsSearch[defaultTheme] + item.areaStyle.color = new graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: themeColor[(3 + index) % themeColor.length] + }, + { + offset: 1, + color: 'rgba(0,0,0, 0)' + } + ]) + Object.assign(item, cloneDeep(v), { + areaStyle: { + color: cloneDeep(item.areaStyle.color) + } + }) }) }, { deep: true, diff --git a/src/packages/components/Charts/Lines/LineGradientSingle/index.vue b/src/packages/components/Charts/Lines/LineGradientSingle/index.vue index 9cd0a29f..2e74b19f 100644 --- a/src/packages/components/Charts/Lines/LineGradientSingle/index.vue +++ b/src/packages/components/Charts/Lines/LineGradientSingle/index.vue @@ -80,6 +80,19 @@ watch( watch( () => props.chartConfig.option.dataset, () => { + const themeColor = colorGradientCustomMerge(chartEditStore.getEditCanvasConfig.chartCustomThemeColorInfo)[defaultTheme] + props.chartConfig.option.series.forEach((value: any, index: number) => { + value.areaStyle.color = new graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: themeColor[(3 + index) % themeColor.length] + }, + { + offset: 1, + color: 'rgba(0,0,0, 0)' + } + ]) + }) option.value = props.chartConfig.option } ) diff --git a/src/packages/components/Charts/Lines/LineLinearSingle/config.ts b/src/packages/components/Charts/Lines/LineLinearSingle/config.ts index 84d26ae3..8160b522 100644 --- a/src/packages/components/Charts/Lines/LineLinearSingle/config.ts +++ b/src/packages/components/Charts/Lines/LineLinearSingle/config.ts @@ -55,7 +55,8 @@ export const option = { type: 'value' }, dataset: { ...dataJson }, - series: [seriesItem] + series: [seriesItem], + allSeriesConfig: seriesItem } export default class Config extends PublicConfigClass implements CreateComponentType { diff --git a/src/packages/components/Charts/Lines/LineLinearSingle/config.vue b/src/packages/components/Charts/Lines/LineLinearSingle/config.vue index 6a7c46bd..bd78340e 100644 --- a/src/packages/components/Charts/Lines/LineLinearSingle/config.vue +++ b/src/packages/components/Charts/Lines/LineLinearSingle/config.vue @@ -178,7 +178,11 @@ const seriesList = computed(() => { return props.optionData.series }) -const allSeriesConfig: Ref = ref(cloneDeep(seriesItem)) +// const allSeriesConfig: Ref = ref(cloneDeep(seriesItem)) + +const allSeriesConfig = computed(() => { + return props.optionData.allSeriesConfig +}) watch(() => allSeriesConfig.value, (v) => { seriesList.value.forEach((item: typeof seriesItem) => { diff --git a/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/config.ts b/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/config.ts new file mode 100644 index 00000000..7eaba032 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/config.ts @@ -0,0 +1,29 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { EngineeringConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' + +export const option = { + // // 图片路径 + // dataset: '', + // // 适应方式 + // fit: 'contain', + // // 圆角 + // borderRadius: 0 +} + +export default class Config extends PublicConfigClass implements CreateComponentType +{ + constructor() { + super(); + this.attr.w = 960 + this.attr.h = 540 + } + public key = EngineeringConfig.key + public chartConfig = cloneDeep(EngineeringConfig) + public option = cloneDeep(option) + public customData = cloneDeep({ + showInterval: false, + mapId: null + }) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/config.vue b/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/config.vue new file mode 100644 index 00000000..8f424483 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/config.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/configData.vue b/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/configData.vue new file mode 100644 index 00000000..74c0e984 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/configData.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/index.ts b/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/index.ts new file mode 100644 index 00000000..f536e9c2 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const EngineeringConfig: ConfigType = { + key: 'EngineeringConfig', + chartKey: 'VEngineeringConfig', + conKey: 'VCEngineeringConfig', + // VCD开头 + conDataKey: 'VCDEngineeringConfig', + title: '工程组态', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'EngineeringConfig.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/index.vue b/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/index.vue new file mode 100644 index 00000000..d71dd865 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/EngineeringConfig/index.vue @@ -0,0 +1,68 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index b4c48450..4a7631f7 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -3,6 +3,7 @@ import { ComprehensivePUEConfig } from './ComprehensivePUE' import { RealTimeTrafficConfig } from './RealTimeTraffic' import { OverviewOfComputingNodesConfig } from './OverviewOfComputingNodes' import { GDMapConfig } from './GDMap' +import { EngineeringConfig } from './EngineeringConfig' import { MonitorRealTimeEventsConfig } from './MonitorRealTimeEvents' import { DashboardConfig } from './Dashboard' @@ -12,6 +13,7 @@ export default [ RealTimeTrafficConfig, OverviewOfComputingNodesConfig, GDMapConfig, + EngineeringConfig, MonitorRealTimeEventsConfig, DashboardConfig, ] diff --git a/src/packages/components/Decorates/Mores/TimeCommon1/index.vue b/src/packages/components/Decorates/Mores/TimeCommon1/index.vue index fe42b362..ebca8a3c 100644 --- a/src/packages/components/Decorates/Mores/TimeCommon1/index.vue +++ b/src/packages/components/Decorates/Mores/TimeCommon1/index.vue @@ -17,7 +17,7 @@ import { isPreview } from '@/utils/router' let date = ref(moment().format('yyyy-MM-DD')) -const weeks = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] +const weeks = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] let time = ref(moment().format('HH:mm:ss ') + weeks[Number(moment().format('e'))]) let timer: any diff --git a/src/packages/components/Informations/Mores/Video/config.ts b/src/packages/components/Informations/Mores/Video/config.ts index a67bfb05..78059f09 100644 --- a/src/packages/components/Informations/Mores/Video/config.ts +++ b/src/packages/components/Informations/Mores/Video/config.ts @@ -6,7 +6,8 @@ import video from '@/assets/videos/earth.mp4' export const option = { // 视频路径 - dataset: video, + dataset: 'https://goviewpro.tos-cn-beijing.volces.com/charts-img-db/charts-img-db_id_17bwi76fzta800.mp4', + datasetCustom: '', // 视频列表 datasetList: [], // 循环播放 diff --git a/src/packages/components/Informations/Mores/Video/config.vue b/src/packages/components/Informations/Mores/Video/config.vue index 4d2e2a97..1bf730bd 100644 --- a/src/packages/components/Informations/Mores/Video/config.vue +++ b/src/packages/components/Informations/Mores/Video/config.vue @@ -6,9 +6,11 @@ - - - + + + + + diff --git a/src/packages/components/Informations/Mores/Video/index.vue b/src/packages/components/Informations/Mores/Video/index.vue index b184c83d..1dfe60ab 100644 --- a/src/packages/components/Informations/Mores/Video/index.vue +++ b/src/packages/components/Informations/Mores/Video/index.vue @@ -12,7 +12,7 @@ :muted="option.muted" :width="w" :height="h" - :src="option.dataset" + :src="option.datasetCustom || option.dataset" > From 6085d019141bca3ce596b2e5942e24a37013db47 Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Wed, 21 Feb 2024 17:49:37 +0800 Subject: [PATCH 055/142] =?UTF-8?q?feat:=20=E6=9F=B1=E7=8A=B6=E5=9B=BE=20?= =?UTF-8?q?=E6=8A=98=E7=BA=BF=E5=9B=BE=E5=A2=9E=E5=8A=A0=E5=8F=8Cy?= =?UTF-8?q?=E8=BD=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/ChartItemSetting/GlobalSetting.vue | 186 +++++++++--------- src/hooks/useChartCommonData.hook.ts | 22 +-- .../Charts/Bars/BarCommon/config.ts | 5 +- .../Charts/Bars/BarCommon/config.vue | 40 +++- .../Charts/Bars/BarCrossrange/config.ts | 17 +- .../Charts/Bars/BarCrossrange/config.vue | 40 +++- .../Charts/Lines/LineCommon/config.ts | 3 +- .../Charts/Lines/LineCommon/config.vue | 40 +++- .../Charts/Lines/LineGradientSingle/config.ts | 3 +- .../Lines/LineGradientSingle/config.vue | 61 +++++- .../Charts/Lines/LineGradientSingle/index.vue | 61 ++++-- .../Charts/Lines/LineLinearSingle/config.ts | 3 +- .../Charts/Lines/LineLinearSingle/config.vue | 40 +++- .../Charts/Lines/LineLinearSingle/index.vue | 18 ++ .../Tables/Tables/TableScrollBoard/index.vue | 2 +- src/settings/chartThemes/global.theme.json | 101 +++++++--- 16 files changed, 470 insertions(+), 172 deletions(-) diff --git a/src/components/Pages/ChartItemSetting/GlobalSetting.vue b/src/components/Pages/ChartItemSetting/GlobalSetting.vue index 68e3fb00..9e33369d 100644 --- a/src/components/Pages/ChartItemSetting/GlobalSetting.vue +++ b/src/components/Pages/ChartItemSetting/GlobalSetting.vue @@ -160,97 +160,99 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + diff --git a/src/router/index.ts b/src/router/index.ts index 8b633e99..cecd06d7 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -11,7 +11,8 @@ const RootRoute: Array = [ { path: '/', name: 'Root', - redirect: PageEnum.BASE_HOME, + // redirect: PageEnum.BASE_HOME, + redirect: '/chart/preview/null', component: Layout, meta: { title: 'Root', diff --git a/src/store/modules/modalStore/modalStore.ts b/src/store/modules/modalStore/modalStore.ts new file mode 100644 index 00000000..21b9be27 --- /dev/null +++ b/src/store/modules/modalStore/modalStore.ts @@ -0,0 +1,30 @@ +import { defineStore } from 'pinia' + +export const useModalStore = defineStore({ + id: 'useModalStore', + state: () => ({ + showModal: false, + title: '', + content: '', + positiveText: '', + negativeText: '', + positiveClick: () => {}, + negativeClick: () => {}, + }) as Record, + actions: { + setModalStore(obj: Record) { + for(let k in obj) { + this[k] = obj[k] + } + }, + clear() { + this.showModal = false + this.title = '' + this.content = '' + this.positiveText = '' + this.negativeText = '' + this.positiveClick = () => {} + this.negativeClick = () => {} + } + } +}) diff --git a/src/store/modules/routerStore/routerStore.ts b/src/store/modules/routerStore/routerStore.ts index 15186518..5297bfb9 100644 --- a/src/store/modules/routerStore/routerStore.ts +++ b/src/store/modules/routerStore/routerStore.ts @@ -5,6 +5,7 @@ export const useRouterStore = defineStore({ state: () => ({ // 为true是router交给parent调用自身不跳转 为false使用自身路由 callByParent: false, + token: null as null | string, }), getters: { getCallByParent():boolean { @@ -14,6 +15,9 @@ export const useRouterStore = defineStore({ actions: { setCallByParent(callByParent: boolean) { this.callByParent = callByParent + }, + setToken(v: string | null) { + this.token = v } } }) diff --git a/src/utils/utils.ts b/src/utils/utils.ts index e8bf1cd1..ad5443ba 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -294,7 +294,6 @@ export const JSONStringify = (data: T) => { export const evalFn = (fn: string) => { var Fun = Function // 一个变量指向Function,防止前端编译工具报错 - console.log(fn) return new Fun('return ' + fn)() } diff --git a/src/views/preview/suspenseIndex.vue b/src/views/preview/suspenseIndex.vue index bdb1aa32..ae8af3b0 100644 --- a/src/views/preview/suspenseIndex.vue +++ b/src/views/preview/suspenseIndex.vue @@ -27,7 +27,7 @@ diff --git a/src/views/preview/components/PreviewRenderGroup/index.vue b/src/views/preview/components/PreviewRenderGroup/index.vue index 0f1dd875..dc2cdc53 100644 --- a/src/views/preview/components/PreviewRenderGroup/index.vue +++ b/src/views/preview/components/PreviewRenderGroup/index.vue @@ -4,6 +4,7 @@ :style="{ ...getSizeStyle(groupData.attr), ...getFilterStyle(groupData.styles), + ...fullScreenStyle }" >

\ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index 4a7631f7..5af97161 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -6,6 +6,7 @@ import { GDMapConfig } from './GDMap' import { EngineeringConfig } from './EngineeringConfig' import { MonitorRealTimeEventsConfig } from './MonitorRealTimeEvents' import { DashboardConfig } from './Dashboard' +import { SystemRuntimeConfig } from './SystemRuntime' export default [ // Theme1Config, @@ -16,4 +17,5 @@ export default [ EngineeringConfig, MonitorRealTimeEventsConfig, DashboardConfig, + SystemRuntimeConfig, ] From ac5e74216ae44986bf25b5ef1644acf64dc7573d Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Tue, 2 Apr 2024 17:54:39 +0800 Subject: [PATCH 084/142] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomComponents/VideoList/config.ts | 31 +++ .../CustomComponents/VideoList/config.vue | 7 + .../CustomComponents/VideoList/configData.vue | 14 ++ .../CustomComponents/VideoList/index.ts | 15 ++ .../CustomComponents/VideoList/index.vue | 177 ++++++++++++++++++ .../CustomComponents/index.ts | 2 + src/plugins/icon.ts | 5 +- 7 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 src/packages/components/CustomComponents/CustomComponents/VideoList/config.ts create mode 100644 src/packages/components/CustomComponents/CustomComponents/VideoList/config.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/VideoList/configData.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/VideoList/index.ts create mode 100644 src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue diff --git a/src/packages/components/CustomComponents/CustomComponents/VideoList/config.ts b/src/packages/components/CustomComponents/CustomComponents/VideoList/config.ts new file mode 100644 index 00000000..9d9fd5f2 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/VideoList/config.ts @@ -0,0 +1,31 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { VideoListConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +// import logo from '@/assets/logo.png' + +export const option = { + // // 图片路径 + // dataset: '', + // // 适应方式 + // fit: 'contain', + // // 圆角 + // borderRadius: 0 +} + +export default class Config extends PublicConfigClass implements CreateComponentType +{ + constructor() { + super(); + this.attr.w = 450 + this.attr.h = 300 + this.request.requestInterval = 15 + } + public key = VideoListConfig.key + public chartConfig = cloneDeep(VideoListConfig) + public option = cloneDeep(option) + public customData = cloneDeep({ + title: '视频列表', + showInterval: true, + }) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/VideoList/config.vue b/src/packages/components/CustomComponents/CustomComponents/VideoList/config.vue new file mode 100644 index 00000000..ae2cf42d --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/VideoList/config.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/VideoList/configData.vue b/src/packages/components/CustomComponents/CustomComponents/VideoList/configData.vue new file mode 100644 index 00000000..3e7f3fd6 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/VideoList/configData.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/VideoList/index.ts b/src/packages/components/CustomComponents/CustomComponents/VideoList/index.ts new file mode 100644 index 00000000..4c0d417a --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/VideoList/index.ts @@ -0,0 +1,15 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const VideoListConfig: ConfigType = { + key: 'VideoList', + chartKey: 'VVideoList', + conKey: 'VCVideoList', + conDataKey: 'VCDVideoList', + title: '视频列表', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'VideoList.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue b/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue new file mode 100644 index 00000000..fe969792 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index 5af97161..7008905b 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -7,6 +7,7 @@ import { EngineeringConfig } from './EngineeringConfig' import { MonitorRealTimeEventsConfig } from './MonitorRealTimeEvents' import { DashboardConfig } from './Dashboard' import { SystemRuntimeConfig } from './SystemRuntime' +import { VideoListConfig } from './VideoList' export default [ // Theme1Config, @@ -18,4 +19,5 @@ export default [ MonitorRealTimeEventsConfig, DashboardConfig, SystemRuntimeConfig, + VideoListConfig, ] diff --git a/src/plugins/icon.ts b/src/plugins/icon.ts index 145293d0..ee75c657 100644 --- a/src/plugins/icon.ts +++ b/src/plugins/icon.ts @@ -111,7 +111,8 @@ import { import { Apps20Regular as Apps20RegularIcon, AlignSpaceEvenlyHorizontal20Filled as AlignSpaceEvenlyHorizontal20FilledIcon, - AlignSpaceEvenlyVertical20Filled as AlignSpaceEvenlyVertical20FilledIcon + AlignSpaceEvenlyVertical20Filled as AlignSpaceEvenlyVertical20FilledIcon, + PlayCircle16Filled as PlayCircle16FilledIcon } from '@vicons/fluent' import { @@ -330,6 +331,8 @@ const fluent = { Apps20RegularIcon, AlignSpaceEvenlyHorizontal20FilledIcon, AlignSpaceEvenlyVertical20FilledIcon, + // 播放 + PlayCircle16FilledIcon, } const material = { From 5566c18aa552a5146cd50d18bbc0a00db199b0bf Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Tue, 2 Apr 2024 18:02:19 +0800 Subject: [PATCH 085/142] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/chart/customponents/VideoList.png | Bin 0 -> 16888 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/assets/images/chart/customponents/VideoList.png diff --git a/src/assets/images/chart/customponents/VideoList.png b/src/assets/images/chart/customponents/VideoList.png new file mode 100644 index 0000000000000000000000000000000000000000..a8dff249432adec6085566e2d079146f45c7e6c5 GIT binary patch literal 16888 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 N Date: Tue, 9 Apr 2024 14:58:17 +0800 Subject: [PATCH 086/142] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=BB=BC?= =?UTF-8?q?=E5=90=88pue=E9=80=9A=E7=94=A8=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ComprehensivePUEV2/Svg.vue | 17 + .../ComprehensivePUEV2/VCircle.vue | 287 +++++++++ .../ComprehensivePUEV2/config.ts | 67 +++ .../ComprehensivePUEV2/config.vue | 67 +++ .../ComprehensivePUEV2/configData.vue | 57 ++ .../ComprehensivePUEV2/index.ts | 15 + .../ComprehensivePUEV2/index.vue | 565 ++++++++++++++++++ .../CustomComponents/VideoList/index.vue | 4 +- .../CustomComponents/index.ts | 2 + 9 files changed, 1079 insertions(+), 2 deletions(-) create mode 100644 src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/Svg.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/VCircle.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/config.ts create mode 100644 src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/config.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/configData.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/index.ts create mode 100644 src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/index.vue diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/Svg.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/Svg.vue new file mode 100644 index 00000000..2a855324 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/Svg.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/VCircle.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/VCircle.vue new file mode 100644 index 00000000..8d7e828a --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/VCircle.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/config.ts b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/config.ts new file mode 100644 index 00000000..e085aa38 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/config.ts @@ -0,0 +1,67 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { ComprehensivePUEV2Config } from './index' +import cloneDeep from 'lodash/cloneDeep' +// import logo from '@/assets/logo.png' + +export const option = { + // // 图片路径 + // dataset: '', + // // 适应方式 + // fit: 'contain', + // // 圆角 + // borderRadius: 0 +} +export const customData = { + title: '综合PUE', + circle: { + title: '实时PUE', + id: null + }, + leftBottom: [ + { + title: '昨日PUE', + id: null + }, + { + title: '上周PUE', + id: null + }, + { + title: '上月PUE', + id: null + } + ], + right: [ + { + title: '总市电负载', + unit: '(kWh)', + id: null + }, + { + title: 'IT用电负载', + unit: '(kWh)', + id: null + }, + { + title: '其他负载', + unit: '(kWh)', + id: null + } + ], + showInterval: true, +} + +export default class Config extends PublicConfigClass implements CreateComponentType +{ + constructor() { + super(); + this.attr.w = 450 + this.attr.h = 300 + this.request.requestInterval = 15 + } + public key = ComprehensivePUEV2Config.key + public chartConfig = cloneDeep(ComprehensivePUEV2Config) + public option = cloneDeep(option) + public customData = cloneDeep(customData) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/config.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/config.vue new file mode 100644 index 00000000..d1759a1d --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/config.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/configData.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/configData.vue new file mode 100644 index 00000000..deb68af3 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/configData.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/index.ts b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/index.ts new file mode 100644 index 00000000..4cdf36e2 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/index.ts @@ -0,0 +1,15 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const ComprehensivePUEV2Config: ConfigType = { + key: 'ComprehensivePUEV2', + chartKey: 'VComprehensivePUEV2', + conKey: 'VCComprehensivePUEV2', + conDataKey: 'VCDComprehensivePUEV2', + title: '综合PUE通用', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'ComprehensivePUE.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/index.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/index.vue new file mode 100644 index 00000000..1618dda5 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV2/index.vue @@ -0,0 +1,565 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue b/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue index fe969792..d2d0032f 100644 --- a/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue @@ -84,8 +84,8 @@ const getData = () => { publicInterface('/dcim/runhe_ai/event', 'get_current_page', {}).then(res => { if (res && res.data) { list.value = res.data - if(!showDialog) { - openVideo(res.data[0]) + if(!showDialog && isPreview()) { + openVideo(res.data[0] || {}) } } }) diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index 7008905b..eb5a5e78 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -1,5 +1,6 @@ // import { Theme1Config } from './Theme1/index' import { ComprehensivePUEConfig } from './ComprehensivePUE' +import { ComprehensivePUEV2Config } from './ComprehensivePUEV2' import { RealTimeTrafficConfig } from './RealTimeTraffic' import { OverviewOfComputingNodesConfig } from './OverviewOfComputingNodes' import { GDMapConfig } from './GDMap' @@ -12,6 +13,7 @@ import { VideoListConfig } from './VideoList' export default [ // Theme1Config, ComprehensivePUEConfig, + ComprehensivePUEV2Config, RealTimeTrafficConfig, OverviewOfComputingNodesConfig, GDMapConfig, From db5fd25c1d78ad9cbafd9a5f3518f85b78f47e44 Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Fri, 12 Apr 2024 10:28:15 +0800 Subject: [PATCH 087/142] =?UTF-8?q?feat:=20=E5=91=8A=E8=AD=A6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=91=84=E5=83=8F=E5=A4=B4=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AlarmDiagram/RealTimeEvent/index.vue | 59 ++++++++++++++++++- src/plugins/icon.ts | 2 +- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue index fef11c29..7af6ad04 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue @@ -25,7 +25,9 @@
{{ moment(item.generate_time).format('yyyy-MM-DD HH:mm:ss') }}
- + +
+
@@ -55,6 +57,7 @@ import { useOriginStore } from '@/store/modules/originStore/originStore' const { LocationIcon } = icon.carbon const { CheckCircleOutlinedIcon } = icon.material +const { PlayCircle16FilledIcon } = icon.fluent const props = defineProps({ chartConfig: { @@ -174,6 +177,59 @@ const getNumber = () => { }) } +let alarmVideos = ref([]) +// let currentVideo: {[k: string]: '' | null} = reactive({ +// ip: '', +// port: null, +// account: '', +// password: '', +// channel: '', +// brand: '', +// plugin: '', +// }) +let currentVideo: any = ref(null) +const getVideos = (ids: number[]) => { + if(ids.length) { + publicInterface('/dcim/video_monitor/other_device', 'get_alarm_device', {device_uids: ids.toString()}).then((res: any) => { + if(res.errcode !== '00000') return + let arr:any = [] + ids.forEach(id => { + arr.push(res.data[id] ? res.data[id][0] : null) + }) + alarmVideos.value = arr.concat() + + let last = arr.find((_: any) => _) + if(!currentVideo.value && !last) return + let obj = currentVideo.value ? JSON.parse(JSON.stringify(currentVideo.value)) : { + ip: '', + port: null, + account: '', + password: '', + channel: '', + brand: '', + plugin: '', + } + if(last) { + for(let k in obj) { + obj[k] = last[k] + } + } + Object.assign(currentVideo, obj) + postMessageToParent({ + type: 'openVideoV2', + data: obj + }) + }) + } +} + +const showVideo = (obj: any) => { + postMessageToParent({ + type: 'openVideoV2', + data: obj + }) +} + const getData = () => { getNumber() const queryModel = { @@ -218,6 +274,7 @@ const getData = () => { serial_no: e.serial_no, remark: e.remark, })) + getVideos(arr.map(_ => _.device.uid)) if (checkAll.value) { arr = arr.map((e:any) => ({ ...e, checked: e.confirm_status !== 'ok' })) } else if (lastTableData.length) { diff --git a/src/plugins/icon.ts b/src/plugins/icon.ts index ee75c657..8352cd4c 100644 --- a/src/plugins/icon.ts +++ b/src/plugins/icon.ts @@ -331,7 +331,7 @@ const fluent = { Apps20RegularIcon, AlignSpaceEvenlyHorizontal20FilledIcon, AlignSpaceEvenlyVertical20FilledIcon, - // 播放 + // 视频播放 PlayCircle16FilledIcon, } From 336d4a12d4767a348956c31199f4cbab5839a0ff Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Fri, 12 Apr 2024 15:23:12 +0800 Subject: [PATCH 088/142] =?UTF-8?q?feat:=20=E5=91=8A=E8=AD=A6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=91=84=E5=83=8F=E5=A4=B4=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AlarmDiagram/RealTimeEvent/index.vue | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue index 7af6ad04..2d5cfdfb 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue @@ -224,9 +224,22 @@ const getVideos = (ids: number[]) => { } const showVideo = (obj: any) => { + let a: {[k: string]: '' | null | boolean} = { + ip: '', + port: null, + account: '', + password: '', + channel: '', + brand: '', + plugin: '', + } + for(let k in a) { + a[k] = obj[k] + } + a.showForce = true postMessageToParent({ type: 'openVideoV2', - data: obj + data: a }) } From 75d13689c7c677fa88f3e747197bb3b1d6fef830 Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Mon, 15 Apr 2024 16:27:35 +0800 Subject: [PATCH 089/142] =?UTF-8?q?feat:=20=E5=91=8A=E8=AD=A6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=91=84=E5=83=8F=E5=A4=B4=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AlarmDiagram/RealTimeEvent/index.vue | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue index 2d5cfdfb..c107b4b8 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue @@ -27,7 +27,7 @@
- +
@@ -188,7 +188,7 @@ let alarmVideos = ref([]) // plugin: '', // }) let currentVideo: any = ref(null) -const getVideos = (ids: number[]) => { +const getVideos = (ids: number[], alarmIds: number[]) => { if(ids.length) { publicInterface('/dcim/video_monitor/other_device', 'get_alarm_device', {device_uids: ids.toString()}).then((res: any) => { if(res.errcode !== '00000') return @@ -198,7 +198,14 @@ const getVideos = (ids: number[]) => { }) alarmVideos.value = arr.concat() - let last = arr.find((_: any) => _) + let index = 0, last:any = {} + for(let i = 0; i < arr.length; i++) { + if(arr[i]) { + last = arr[i] + index = i + break + } + } if(!currentVideo.value && !last) return let obj = currentVideo.value ? JSON.parse(JSON.stringify(currentVideo.value)) : { ip: '', @@ -214,7 +221,9 @@ const getVideos = (ids: number[]) => { obj[k] = last[k] } } + obj.alarmId = alarmIds[index] Object.assign(currentVideo, obj) + obj.showForce = false postMessageToParent({ type: 'openVideoV2', data: obj @@ -223,8 +232,8 @@ const getVideos = (ids: number[]) => { } } -const showVideo = (obj: any) => { - let a: {[k: string]: '' | null | boolean} = { +const showVideo = (obj: any, id: number) => { + let a: {[k: string]: string | null | boolean} = { ip: '', port: null, account: '', @@ -236,7 +245,9 @@ const showVideo = (obj: any) => { for(let k in a) { a[k] = obj[k] } + // 点击时强制打开 a.showForce = true + a.alarmId = id postMessageToParent({ type: 'openVideoV2', data: a @@ -287,7 +298,7 @@ const getData = () => { serial_no: e.serial_no, remark: e.remark, })) - getVideos(arr.map(_ => _.device.uid)) + getVideos(arr.map(_ => _.device.uid), arr.map(_ => _.id)) if (checkAll.value) { arr = arr.map((e:any) => ({ ...e, checked: e.confirm_status !== 'ok' })) } else if (lastTableData.length) { From 8ee2d6657ffcc109ffea9e825eefe46c73930726 Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Tue, 16 Apr 2024 21:31:16 +0800 Subject: [PATCH 090/142] =?UTF-8?q?feat:=20=E5=91=8A=E8=AD=A6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=91=84=E5=83=8F=E5=A4=B4=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomComponents/AlarmDiagram/RealTimeEvent/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue index c107b4b8..2e60f9fa 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue @@ -233,7 +233,7 @@ const getVideos = (ids: number[], alarmIds: number[]) => { } const showVideo = (obj: any, id: number) => { - let a: {[k: string]: string | null | boolean} = { + let a: {[k: string]: string | null | boolean | number} = { ip: '', port: null, account: '', From 67f0706fdd7829dae8ffb28c18a7c681c952ff0f Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Wed, 17 Apr 2024 15:32:48 +0800 Subject: [PATCH 091/142] =?UTF-8?q?feat:=20=E5=91=8A=E8=AD=A6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=91=84=E5=83=8F=E5=A4=B4=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + .../AlarmDiagram/RealTimeEvent/index.vue | 31 +++++++++++++++++-- src/plugins/icon.ts | 11 ++++++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 204cbd34..89defcb7 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@types/crypto-js": "^4.1.1", "@types/keymaster": "^1.6.30", "@types/lodash": "^4.14.184", + "@vicons/fa": "^0.12.0", "animate.css": "^4.1.1", "axios": "^1.4.0", "color": "^4.2.3", diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue index 2e60f9fa..e310a26b 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue @@ -27,7 +27,10 @@
- +
@@ -46,7 +49,7 @@ import type { Ref } from 'vue' import { CreateComponentType } from '@/packages/index.d' import { publicInterface } from '@/api/path/business.api' import BorderBox from './BorderBoxV2.vue' -import {isPreview, postMessageToParent} from '@/utils' +import {isPreview, postMessageToParent, useGetMessageByParent} from '@/utils' import moment from "moment" import {selectTimeOptions} from "@/views/chart/ContentConfigurations/components/ChartData/index.d"; import {RequestHttpIntervalEnum} from "@/enums/httpEnum"; @@ -58,6 +61,7 @@ import { useOriginStore } from '@/store/modules/originStore/originStore' const { LocationIcon } = icon.carbon const { CheckCircleOutlinedIcon } = icon.material const { PlayCircle16FilledIcon } = icon.fluent +const { SpinnerIcon } = icon.fa const props = defineProps({ chartConfig: { @@ -232,6 +236,13 @@ const getVideos = (ids: number[], alarmIds: number[]) => { } } +const showLoading = ref(false) +const {getMessageByParent} = useGetMessageByParent() +getMessageByParent('', (e) => { + if(e.data.type === 'openVideoV2_closeLoading' && e.data.page === 'customLargeScreen') { + showLoading.value = false + } +}) const showVideo = (obj: any, id: number) => { let a: {[k: string]: string | null | boolean | number} = { ip: '', @@ -248,6 +259,8 @@ const showVideo = (obj: any, id: number) => { // 点击时强制打开 a.showForce = true a.alarmId = id + currentVideo.value = a + showLoading.value = true postMessageToParent({ type: 'openVideoV2', data: a @@ -490,6 +503,20 @@ onUnmounted(() => { \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/configData.vue b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/configData.vue new file mode 100644 index 00000000..6c24ab53 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/configData.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/index.ts b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/index.ts new file mode 100644 index 00000000..a4d29826 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + + +export const AirConditioningTableConfig: ConfigType = { + key: 'AirConditioningTable', + chartKey: 'VAirConditioningTable', + conKey: 'VCAirConditioningTable', + conDataKey: 'VCDAirConditioningTable', + title: '空调可视化表格', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'tables_basic.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/index.vue b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/index.vue new file mode 100644 index 00000000..0edba9e7 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/index.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index eb5a5e78..cce40237 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -9,6 +9,7 @@ import { MonitorRealTimeEventsConfig } from './MonitorRealTimeEvents' import { DashboardConfig } from './Dashboard' import { SystemRuntimeConfig } from './SystemRuntime' import { VideoListConfig } from './VideoList' +import { AirConditioningTableConfig } from './AirConditioningTable' export default [ // Theme1Config, @@ -22,4 +23,5 @@ export default [ DashboardConfig, SystemRuntimeConfig, VideoListConfig, + AirConditioningTableConfig, ] diff --git a/src/packages/components/Informations/Texts/TextCommon/config.vue b/src/packages/components/Informations/Texts/TextCommon/config.vue index c7b57729..bf829337 100644 --- a/src/packages/components/Informations/Texts/TextCommon/config.vue +++ b/src/packages/components/Informations/Texts/TextCommon/config.vue @@ -14,20 +14,20 @@
- - - - - - 跳转 - - - + + + + + + + + + + + + + +
diff --git a/src/packages/public/publicConfig.ts b/src/packages/public/publicConfig.ts index a3ec99e4..0f6b97c9 100644 --- a/src/packages/public/publicConfig.ts +++ b/src/packages/public/publicConfig.ts @@ -115,7 +115,8 @@ const commonData: commonDataType = { const customEvent: CustomEventType = { click: { linkHead: 'http://', - link: '' + link: '', + isBlank: false } } diff --git a/src/store/modules/chartEditStore/chartEditStore.d.ts b/src/store/modules/chartEditStore/chartEditStore.d.ts index ed9b6457..0d17d80c 100644 --- a/src/store/modules/chartEditStore/chartEditStore.d.ts +++ b/src/store/modules/chartEditStore/chartEditStore.d.ts @@ -396,6 +396,7 @@ export interface CustomEventType { click: { linkHead: 'http://' | 'https://' link: string + isBlank: boolean } } diff --git a/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue b/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue index 7f5d86c4..0291b927 100644 --- a/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue @@ -10,7 +10,7 @@
链接
- + 跳转
+
+
新开页面
+ +
@@ -30,6 +34,7 @@ import { ChartEventInteraction } from './components/ChartEventInteraction' import { ChartEventAdvancedHandle } from './components/ChartEventAdvancedHandle' import { ChartEventBaseHandle } from './components/ChartEventBaseHandle' import { useTargetData } from '../hooks/useTargetData.hook' +import { postMessageToParent } from "@/utils"; const { targetData, chartEditStore } = useTargetData() const showModal = ref(false) @@ -70,6 +75,14 @@ const finallyLink = computed(() => { return targetData.value.customEvent.click.linkHead + (targetData.value as any).customEvent.click.link }) const handleClick = () => { - window.open(finallyLink.value) + if(targetData.value.customEvent.click.isBlank) postMessageToParent({ + type: 'windowOpen', + url: finallyLink.value, + openNew: true + }) + else postMessageToParent({ + type: 'windowOpen', + url: finallyLink.value, + }) } From 8cb59f3d6bffe5090f3d8a697e0f325c2da07f60 Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Fri, 19 Apr 2024 15:19:48 +0800 Subject: [PATCH 094/142] =?UTF-8?q?feat:=20=E7=A9=BA=E8=B0=83=E5=8F=AF?= =?UTF-8?q?=E8=A7=86=E5=8C=96=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AirConditioningTable/config.ts | 6 +- .../AirConditioningTable/config.vue | 4 +- .../AirConditioningTable/index.vue | 102 ++++++++++++++---- .../preview/hooks/useCustomEvent.hook.ts | 14 ++- 4 files changed, 100 insertions(+), 26 deletions(-) diff --git a/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/config.ts b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/config.ts index 91af0915..965c314e 100644 --- a/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/config.ts +++ b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/config.ts @@ -14,9 +14,9 @@ export const option = { // 展示列 header: { columns: [ - {key: 'node_name', title: '设备名', unit: '', show: true, width: 'auto', align: 'left', ellipsis: true}, - {key: '空调功率', title: '空调功率', unit: 'kW', show: true, width: 'auto', align: 'left', ellipsis: true}, - {key: '用电量', title: '用电量', unit: 'kWh', show: true, width: 'auto', align: 'left', ellipsis: true}, + {key: 'node_name', reg: '', title: '设备名', unit: '', show: true, width: 'auto', align: 'left', ellipsis: true}, + {key: 'col1', reg: '/功率/', title: '空调功率', unit: 'kW', show: true, width: 'auto', align: 'left', ellipsis: true}, + {key: 'col2', reg: '/用电量/', title: '用电量', unit: 'kWh', show: true, width: 'auto', align: 'left', ellipsis: true}, ], // value: [], // options: [], diff --git a/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/config.vue b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/config.vue index 1b73420c..2981a7d7 100644 --- a/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/config.vue +++ b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/config.vue @@ -7,8 +7,8 @@ - - + + diff --git a/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/index.vue b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/index.vue index 0edba9e7..c7cde594 100644 --- a/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/AirConditioningTable/index.vue @@ -78,7 +78,7 @@ watch(() => props.chartConfig.option.header, v => { deep: true }) -let originData = ref({}) as {[k: string]: any} +let originData:any = ref([]) const customData = computed(() => { return props.chartConfig.customData as typeof cd @@ -86,26 +86,46 @@ const customData = computed(() => { let data = computed(() => { let arr:any = [] - if(!Object.keys(originData.value).length) return arr - customData.value.ids.forEach((id: string) => { + // if(!Object.keys(originData.value).length) return arr + // customData.value.ids.forEach((id: string) => { + // let obj: any = {} + // option.header.columns.forEach((col: any, i: number) => { + // if(i === 0) { + // obj[col.key] = originData.value[id]?.[col.key] + // } + // else { + // let o = originData.value[id] ? originData.value[id] : null + // if(o) { + // let arr = [ + // ...Object.values(o.aic), + // ...Object.values(o.aoc), + // ...Object.values(o.dic), + // ...Object.values(o.doc), + // ] + // let t:any = arr.find((_: any) => _.node_name === col.key) || {} + // obj[col.key] = t.value + // } + // else obj[col.key] = undefined + // } + // }) + // arr.push(obj) + // }) + if(!originData.value.length) return arr + customData.value.ids.forEach((id, i) => { + let target = originData.value[i] let obj: any = {} - option.header.columns.forEach((col: any, i: number) => { - if(i === 0) { - obj[col.key] = originData.value[id]?.[col.key] + option.header.columns.forEach((col: any, ci:number) => { + if(ci === 0) { + obj[col.key] = target.node_name } else { - let o = originData.value[id] ? originData.value[id] : null - if(o) { - let arr = [ - ...Object.values(o.aic), - ...Object.values(o.aoc), - ...Object.values(o.dic), - ...Object.values(o.doc), - ] - let t:any = arr.find((_: any) => _.node_name === col.key) || {} - obj[col.key] = t.value + const pattern = col.reg.slice(1, -1); // 移除开始和结束的斜杠 + let t = {node_value: ''} + if(pattern) { + const regex = new RegExp(pattern); + t = target.children.find((_: any) => regex.test(_.node_name)) || {} } - else obj[col.key] = undefined + obj[col.key] = t.node_value } }) arr.push(obj) @@ -153,6 +173,7 @@ if (systemConfig['active_alarm_confirm_status']) { const getData = () => { if(!customData.value.ids.filter((_: string) => _).length) { + originData.value = [] return } let params = { @@ -164,10 +185,53 @@ const getData = () => { } publicInterface('/dcim/dems/device_point', 'cinterface_realtime_data_get_by_uid_no_err_v2', params).then(res => { if (res && res.data) { - originData.value = res.data + let arr = customData.value.ids.map((id: string) => { + let obj = { + node_name: res.data[id] ? res.data[id].node_name : '', + uid: id + } + return obj + }) + getDataChild(arr) } }) } + +const getDataChild = (parents: any) => { + let params = { + "condition": { + "dems_device_uid": '', + "node_name": "", + "signal_id": "", + "node_status": null, + "data_type": "", + "dems_device_template_id": null, + "is_major_paramenter": "", + "is_show": true, + "open_driver": true + }, + "page": { + "page_size": 99999, + "page_number": 1 + } + } + let arr = customData.value.ids.map(_ => { + let p = cloneDeep(params) + p.condition.dems_device_uid = _ + return publicInterface('/dcim/dems/device_point', 'get_page', p) + }) + Promise.all(arr).then(res => { + let data = res.map(item => { + if(item && item.errcode === '00000') return item.data.item || [] + else return [] + }) + data.forEach((item, i) => { + parents[i].children = item + }) + originData.value = parents + }) +} + watch(() => customData.value.ids, () => { getData() }, { @@ -208,7 +272,7 @@ onUnmounted(() => { diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/VCircle.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/VCircle.vue new file mode 100644 index 00000000..8d7e828a --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/VCircle.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/config.ts b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/config.ts new file mode 100644 index 00000000..590a6e0c --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/config.ts @@ -0,0 +1,68 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { ComprehensivePUEV3Config } from './index' +import cloneDeep from 'lodash/cloneDeep' +// import logo from '@/assets/logo.png' + +export const option = { + // // 图片路径 + // dataset: '', + // // 适应方式 + // fit: 'contain', + // // 圆角 + // borderRadius: 0 +} +export const customData = { + title: '综合PUE', + enable: false, + circle: { + title: '实时PUE', + id: null + }, + leftBottom: [ + { + title: '昨日PUE', + id: null + }, + { + title: '上周PUE', + id: null + }, + { + title: '上月PUE', + id: null + } + ], + right: [ + { + title: '总市电负载', + unit: '(kWh)', + id: null + }, + { + title: 'IT用电负载', + unit: '(kWh)', + id: null + }, + { + title: '其他负载', + unit: '(kWh)', + id: null + } + ], + showInterval: true, +} + +export default class Config extends PublicConfigClass implements CreateComponentType +{ + constructor() { + super(); + this.attr.w = 450 + this.attr.h = 300 + this.request.requestInterval = 15 + } + public key = ComprehensivePUEV3Config.key + public chartConfig = cloneDeep(ComprehensivePUEV3Config) + public option = cloneDeep(option) + public customData = cloneDeep(customData) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/config.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/config.vue new file mode 100644 index 00000000..d1759a1d --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/config.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/configData.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/configData.vue new file mode 100644 index 00000000..3821dd8e --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/configData.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/index.ts b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/index.ts new file mode 100644 index 00000000..42d31133 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/index.ts @@ -0,0 +1,15 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const ComprehensivePUEV3Config: ConfigType = { + key: 'ComprehensivePUEV3', + chartKey: 'VComprehensivePUEV3', + conKey: 'VCComprehensivePUEV3', + conDataKey: 'VCDComprehensivePUEV3', + title: '综合PUE通用', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'ComprehensivePUE.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/index.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/index.vue new file mode 100644 index 00000000..72f1f410 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV3/index.vue @@ -0,0 +1,645 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index cce40237..fc1fd20e 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -1,6 +1,6 @@ // import { Theme1Config } from './Theme1/index' import { ComprehensivePUEConfig } from './ComprehensivePUE' -import { ComprehensivePUEV2Config } from './ComprehensivePUEV2' +import { ComprehensivePUEV3Config } from './ComprehensivePUEV3' import { RealTimeTrafficConfig } from './RealTimeTraffic' import { OverviewOfComputingNodesConfig } from './OverviewOfComputingNodes' import { GDMapConfig } from './GDMap' @@ -14,7 +14,7 @@ import { AirConditioningTableConfig } from './AirConditioningTable' export default [ // Theme1Config, ComprehensivePUEConfig, - ComprehensivePUEV2Config, + ComprehensivePUEV3Config, RealTimeTrafficConfig, OverviewOfComputingNodesConfig, GDMapConfig, From 02366f3a6c6496701b9a756ce3dfbb00faff427f Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Mon, 29 Apr 2024 11:23:41 +0800 Subject: [PATCH 100/142] =?UTF-8?q?fix:=20=E8=A7=86=E9=A2=91=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=8F=96=E6=B6=88=E9=BB=98=E8=AE=A4=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomComponents/CustomComponents/VideoList/index.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue b/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue index d2d0032f..b50c422c 100644 --- a/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/VideoList/index.vue @@ -84,9 +84,9 @@ const getData = () => { publicInterface('/dcim/runhe_ai/event', 'get_current_page', {}).then(res => { if (res && res.data) { list.value = res.data - if(!showDialog && isPreview()) { - openVideo(res.data[0] || {}) - } + // if(!showDialog && isPreview()) { + // openVideo(res.data[0] || {}) + // } } }) } From 430e003fd0afbd81e8e1647adf4474abde7c54c4 Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Mon, 20 May 2024 10:04:06 +0800 Subject: [PATCH 101/142] =?UTF-8?q?fix:=20=E6=89=93=E5=8C=85=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomComponents/AlarmDiagram/RealTimeEvent/index.vue | 4 ++-- src/views/login/index.vue | 5 +++-- src/views/preview/components/PreviewRenderList/index.vue | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue index e310a26b..94220caf 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue @@ -2,9 +2,9 @@ - + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/ElectricityConsumption/configData.vue b/src/packages/components/CustomComponents/CustomComponents/ElectricityConsumption/configData.vue new file mode 100644 index 00000000..38941c2f --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ElectricityConsumption/configData.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ElectricityConsumption/index.ts b/src/packages/components/CustomComponents/CustomComponents/ElectricityConsumption/index.ts new file mode 100644 index 00000000..09a4cf3a --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ElectricityConsumption/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const ElectricityConsumptionConfig: ConfigType = { + key: 'ElectricityConsumption', + chartKey: 'VElectricityConsumption', + conKey: 'VCElectricityConsumption', + // VCD开头 + conDataKey: 'VCDElectricityConsumption', + title: '用电量', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'ElectricityConsumption.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/ElectricityConsumption/index.vue b/src/packages/components/CustomComponents/CustomComponents/ElectricityConsumption/index.vue new file mode 100644 index 00000000..c012b800 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ElectricityConsumption/index.vue @@ -0,0 +1,381 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index 7a284e4a..cdf24759 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -13,6 +13,7 @@ import { VideoListConfig } from './VideoList' import { AirConditioningTableConfig } from './AirConditioningTable' import { SiteStatisticsConfig } from './SiteStatistics' import { PowerCapacityConfig } from './PowerCapacity' +import { ElectricityConsumptionConfig } from './ElectricityConsumption' export default [ // Theme1Config, @@ -30,4 +31,5 @@ export default [ AirConditioningTableConfig, SiteStatisticsConfig, PowerCapacityConfig, + ElectricityConsumptionConfig, ] diff --git a/src/plugins/naive.ts b/src/plugins/naive.ts index 0d004df7..b72ba36e 100644 --- a/src/plugins/naive.ts +++ b/src/plugins/naive.ts @@ -68,6 +68,7 @@ import { NSelect, NSlider, NRadioGroup, + NRadioButton, NRadio, NSteps, NStep, @@ -172,6 +173,7 @@ const naive = create({ NSlider, NSelect, NRadioGroup, + NRadioButton, NRadio, NSteps, NStep, From 1bd97da02855e866b45a118b50d36e595bdf610e Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Sat, 6 Jul 2024 16:14:20 +0800 Subject: [PATCH 107/142] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E8=BF=90=E8=A1=8C=E7=8A=B6=E6=80=81=E5=92=8C=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E6=B8=A9=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customponents/DeviceRunningState.png | Bin 0 -> 21444 bytes .../DeviceRunningState/config.ts | 29 +++ .../DeviceRunningState/config.vue | 23 ++ .../DeviceRunningState/configData.vue | 17 ++ .../DeviceRunningState/index.ts | 16 ++ .../DeviceRunningState/index.vue | 246 ++++++++++++++++++ .../TemperatureTop10/config.ts | 25 ++ .../TemperatureTop10/config.vue | 23 ++ .../TemperatureTop10/configData.vue | 17 ++ .../TemperatureTop10/index.ts | 16 ++ .../TemperatureTop10/index.vue | 173 ++++++++++++ .../CustomComponents/index.ts | 4 + 12 files changed, 589 insertions(+) create mode 100644 src/assets/images/chart/customponents/DeviceRunningState.png create mode 100644 src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/config.ts create mode 100644 src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/config.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/configData.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.ts create mode 100644 src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.ts create mode 100644 src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/configData.vue create mode 100644 src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/index.ts create mode 100644 src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/index.vue diff --git a/src/assets/images/chart/customponents/DeviceRunningState.png b/src/assets/images/chart/customponents/DeviceRunningState.png new file mode 100644 index 0000000000000000000000000000000000000000..1d27c949a12cbe723ec5d453dbf1dd30a94643c0 GIT binary patch literal 21444 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 Iszr$U4_te{YybcN literal 0 HcmV?d00001 diff --git a/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/config.ts b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/config.ts new file mode 100644 index 00000000..0cbe1659 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/config.ts @@ -0,0 +1,29 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { DeviceRunningStateConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +// import logo from '@/assets/logo.png' + +export const option = {} +export const customData = { + title: '设备运行状态', + config: JSON.stringify([ + {"id":84,"label":"动力设备","code":"DL","remark":" 高压柜、低压柜、UPS、蓄电池等关于电的动力设备","icon":" ","father_id":0,"complete_id":"84","complete_name":"动力设备","sort":0,"is_leaf_node":false,"father_type":null,"need_data_num":0}, + {"id":87,"label":"环境设备","code":"HJ","remark":"温湿度、空调、漏水、气体等监测或影响环境因素的设备 ","icon":" ","father_id":0,"complete_id":"87","complete_name":"环境设备","sort":0,"is_leaf_node":false,"father_type":null,"need_data_num":0}, + {"id":90,"label":"安防设备","code":"AF","remark":" 视频、门禁、红外、消防及其他安防类设备","icon":" ","father_id":0,"complete_id":"90","complete_name":"安防设备","sort":0,"is_leaf_node":false,"father_type":null,"need_data_num":0} + ]), + showInterval: true, +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + constructor() { + super(); + this.attr.w = 450 + this.attr.h = 300 + this.request.requestInterval = 15 + } + public key = DeviceRunningStateConfig.key + public chartConfig = cloneDeep(DeviceRunningStateConfig) + public option = cloneDeep(option) + public customData = cloneDeep(customData) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/config.vue b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/config.vue new file mode 100644 index 00000000..ccedcbe7 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/config.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/configData.vue b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/configData.vue new file mode 100644 index 00000000..0c06865f --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/configData.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.ts b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.ts new file mode 100644 index 00000000..71a9e4c5 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const DeviceRunningStateConfig: ConfigType = { + key: 'DeviceRunningState', + chartKey: 'VDeviceRunningState', + conKey: 'VCDeviceRunningState', + // VCD开头 + conDataKey: 'VCDDeviceRunningState', + title: '设备运行状态', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'DeviceRunningState.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.vue b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.vue new file mode 100644 index 00000000..443ac7b3 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.vue @@ -0,0 +1,246 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.ts b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.ts new file mode 100644 index 00000000..27197444 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.ts @@ -0,0 +1,25 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { TemperatureTop10Config } from './index' +import cloneDeep from 'lodash/cloneDeep' +// import logo from '@/assets/logo.png' + +export const option = {} +export const customData = { + title: '区域温度TOP10', + ids: '', + showInterval: true, +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + constructor() { + super(); + this.attr.w = 450 + this.attr.h = 300 + this.request.requestInterval = 15 + } + public key = TemperatureTop10Config.key + public chartConfig = cloneDeep(TemperatureTop10Config) + public option = cloneDeep(option) + public customData = cloneDeep(customData) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.vue b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.vue new file mode 100644 index 00000000..ccedcbe7 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/configData.vue b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/configData.vue new file mode 100644 index 00000000..dd4ac527 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/configData.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/index.ts b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/index.ts new file mode 100644 index 00000000..d980b8dc --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const TemperatureTop10Config: ConfigType = { + key: 'TemperatureTop10', + chartKey: 'VTemperatureTop10', + conKey: 'VCTemperatureTop10', + // VCD开头 + conDataKey: 'VCDTemperatureTop10', + title: '区域温度TOP10', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'TemperatureTop10.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/index.vue b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/index.vue new file mode 100644 index 00000000..cba659e9 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/index.vue @@ -0,0 +1,173 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index cdf24759..f3396076 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -14,6 +14,8 @@ import { AirConditioningTableConfig } from './AirConditioningTable' import { SiteStatisticsConfig } from './SiteStatistics' import { PowerCapacityConfig } from './PowerCapacity' import { ElectricityConsumptionConfig } from './ElectricityConsumption' +import { DeviceRunningStateConfig } from './DeviceRunningState' +import { TemperatureTop10Config } from './TemperatureTop10' export default [ // Theme1Config, @@ -32,4 +34,6 @@ export default [ SiteStatisticsConfig, PowerCapacityConfig, ElectricityConsumptionConfig, + DeviceRunningStateConfig, + TemperatureTop10Config, ] From 44a992059a4eb2b225ddf6693dd2a45b4ad35870 Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Sat, 6 Jul 2024 17:16:24 +0800 Subject: [PATCH 108/142] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomComponents/ComprehensivePUEV4/index.vue | 9 +++++---- .../CustomComponents/DeviceRunningState/index.vue | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV4/index.vue b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV4/index.vue index 1618dda5..90a934a7 100644 --- a/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV4/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/ComprehensivePUEV4/index.vue @@ -12,8 +12,8 @@
-
{{item.label}}
-
{{item.unit}}
+
{{item.label}} {{item.unit}}
+
{{item.value}}
@@ -516,6 +516,7 @@ onUnmounted(() => { width: 100%; height: 100%; display: flex; + overflow-y: auto; .left{ flex: 6; min-width: 60%; @@ -554,9 +555,9 @@ onUnmounted(() => { justify-content: center; white-space: nowrap; text-overflow: ellipsis; - overflow: hidden; + //overflow: hidden; & > div:nth-child(2) { - margin: 5px 0; + //margin: 5px 0; } } } diff --git a/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.vue b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.vue index 443ac7b3..661aecbb 100644 --- a/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/DeviceRunningState/index.vue @@ -185,6 +185,7 @@ onUnmounted(() => { } } .bottomBox{ + overflow: auto; display: flex; flex-wrap: wrap; height: calc(100% - 20px); From c5f5c9c4916ae610bdeabe6555db7d0903f24426 Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Mon, 8 Jul 2024 16:14:46 +0800 Subject: [PATCH 109/142] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 4 +- .../components/Charts/Maps/MapBase/config.ts | 29 +-- .../components/Charts/Maps/MapBase/config.vue | 142 ++++++------ .../components/Charts/Maps/MapBase/index.vue | 211 +++++++++++++++--- 4 files changed, 265 insertions(+), 121 deletions(-) diff --git a/.env b/.env index d02e0c1c..7363131b 100644 --- a/.env +++ b/.env @@ -3,9 +3,9 @@ VITE_DEV_PORT = '8080' # development path # VITE_DEV_PATH = 'http://192.168.0.34:11887' -VITE_DEV_PATH = 'http://192.168.0.34:8022' +VITE_DEV_PATH = 'http://192.168.0.34:18077' # VITE_DEV_PATH = 'http://192.168.0.120:3001' -VITE_DEV_TOKEN = '0e1e851b-8522-477c-9f84-d415999816d1' +VITE_DEV_TOKEN = '71705982-1d76-473c-bb81-d15776f0f6aa' # production path VITE_PRO_PATH = 'http://192.168.0.235:8177' diff --git a/src/packages/components/Charts/Maps/MapBase/config.ts b/src/packages/components/Charts/Maps/MapBase/config.ts index a2a81434..5829309e 100644 --- a/src/packages/components/Charts/Maps/MapBase/config.ts +++ b/src/packages/components/Charts/Maps/MapBase/config.ts @@ -53,15 +53,16 @@ export const option = { type: 'effectScatter', coordinateSystem: 'geo', symbolSize: 4, - legendHoverLink: false, + legendHoverLink: true, showEffectOn: 'render', - // rippleEffect: { - // scale: 6, - // color: '#FFFFFF', - // brushType: 'fill' - // }, + rippleEffect: { + scale: 6, + // color: '#FFFFFF', + // color: '#4dca59', + brushType: 'fill', + }, tooltip: { - show: true, + show: false, backgroundColor: 'rgba(0,0,0,.6)', borderColor: 'rgba(147, 235, 248, .8)', textStyle: { @@ -78,13 +79,13 @@ export const option = { textShadowBlur: 10, textBorderWidth: 0, color: '#FFFFFF', - show: false + show: true }, - symbol: 'none', + // symbol: 'none', itemStyle: { color: '#FFFFFF', borderColor: 'rgba(225,255,255,2)', - borderWidth: 4, + borderWidth: 0, shadowColor: '#E1FFFF', shadowBlur: 10 }, @@ -111,7 +112,7 @@ export const option = { } }, label: { - show: true, + show: false, color: '#FFFFFF', fontSize: 12 }, @@ -119,7 +120,8 @@ export const option = { disabled: false, label: { color: '#FFFFFF', - fontSize: 12 + fontSize: 12, + show: false, }, itemStyle: { areaColor: '#4196FF', @@ -178,7 +180,8 @@ export const option = { export const customData = { // k: 名字 v: 数值 - dataMap: '{}' + dataMap: '{}', + showInterval: true, } export const MapDefaultConfig = { ...option } diff --git a/src/packages/components/Charts/Maps/MapBase/config.vue b/src/packages/components/Charts/Maps/MapBase/config.vue index 98f57d84..f21e4fb4 100644 --- a/src/packages/components/Charts/Maps/MapBase/config.vue +++ b/src/packages/components/Charts/Maps/MapBase/config.vue @@ -194,88 +194,88 @@ - - - - - + + + + + - + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - + + + + - - - - - - - - - - - - 值越小速度越快 - - - - - - 特效尾迹长度[0,1]值越大,尾迹越长重 - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/JumpBtn/configData.vue b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/configData.vue new file mode 100644 index 00000000..d500a337 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/configData.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/JumpBtn/index.ts b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/index.ts new file mode 100644 index 00000000..7899fdd2 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const JumpBtnConfig: ConfigType = { + key: 'JumpBtn', + chartKey: 'VJumpBtn', + conKey: 'VCJumpBtn', + // VCD开头 + conDataKey: 'VCDJumpBtn', + title: '跳转按钮', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'JumpBtn.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/JumpBtn/index.vue b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/index.vue new file mode 100644 index 00000000..0d8c2ee4 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/index.vue @@ -0,0 +1,185 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/Position/config.ts b/src/packages/components/CustomComponents/CustomComponents/Position/config.ts new file mode 100644 index 00000000..ad96112a --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Position/config.ts @@ -0,0 +1,25 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { PositionConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +// import logo from '@/assets/logo.png' + +export const option = {} +export const customData = { + label: '数据中心', + id: null, + showInterval: true, +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + constructor() { + super(); + this.attr.w = 100 + this.attr.h = 100 + this.request.requestInterval = 15 + } + public key = PositionConfig.key + public chartConfig = cloneDeep(PositionConfig) + public option = cloneDeep(option) + public customData = cloneDeep(customData) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/Position/config.vue b/src/packages/components/CustomComponents/CustomComponents/Position/config.vue new file mode 100644 index 00000000..ccedcbe7 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Position/config.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/Position/configData.vue b/src/packages/components/CustomComponents/CustomComponents/Position/configData.vue new file mode 100644 index 00000000..4b7b1970 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Position/configData.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/Position/index.ts b/src/packages/components/CustomComponents/CustomComponents/Position/index.ts new file mode 100644 index 00000000..ddcc34df --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Position/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const PositionConfig: ConfigType = { + key: 'Position', + chartKey: 'VPosition', + conKey: 'VCPosition', + // VCD开头 + conDataKey: 'VCDPosition', + title: '告警定位', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'Position.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/Position/index.vue b/src/packages/components/CustomComponents/CustomComponents/Position/index.vue new file mode 100644 index 00000000..3cbe7052 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Position/index.vue @@ -0,0 +1,129 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index f3396076..1701fcc0 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -16,6 +16,8 @@ import { PowerCapacityConfig } from './PowerCapacity' import { ElectricityConsumptionConfig } from './ElectricityConsumption' import { DeviceRunningStateConfig } from './DeviceRunningState' import { TemperatureTop10Config } from './TemperatureTop10' +import { PositionConfig } from './Position' +import { JumpBtnConfig } from './JumpBtn' export default [ // Theme1Config, @@ -36,4 +38,6 @@ export default [ ElectricityConsumptionConfig, DeviceRunningStateConfig, TemperatureTop10Config, + PositionConfig, + JumpBtnConfig, ] diff --git a/vite.config.ts b/vite.config.ts index 1e5aac66..1be37600 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -25,6 +25,10 @@ export default ({ mode } : { mode:any }) => defineConfig({ find: '@', replacement: pathResolve('src') }, + { + find: '~@', + replacement: pathResolve('src') + }, { find: 'vue-i18n', replacement: 'vue-i18n/dist/vue-i18n.cjs.js' //解决i8n警告 From d995d65294159c64f8d22b267e522af609e41a04 Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Mon, 15 Jul 2024 15:23:29 +0800 Subject: [PATCH 117/142] =?UTF-8?q?feat:=20=E8=B7=B3=E8=BD=AC=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=8A=A0padding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomComponents/CustomComponents/JumpBtn/index.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/packages/components/CustomComponents/CustomComponents/JumpBtn/index.vue b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/index.vue index 0d8c2ee4..0e6a6f82 100644 --- a/src/packages/components/CustomComponents/CustomComponents/JumpBtn/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/index.vue @@ -146,6 +146,7 @@ onUnmounted(() => { display: flex; margin-left: 10px; align-items: center; + padding-left: 5px; .rect { position: absolute; top: 0; From a32bb7283b610475207ec38a135493b80c41850b Mon Sep 17 00:00:00 2001 From: huanghao1412 Date: Mon, 15 Jul 2024 15:39:43 +0800 Subject: [PATCH 118/142] =?UTF-8?q?feat:=20=E8=B7=B3=E8=BD=AC=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomComponents/CustomComponents/JumpBtn/config.ts | 1 + .../CustomComponents/CustomComponents/JumpBtn/configData.vue | 5 +++++ .../CustomComponents/CustomComponents/JumpBtn/index.vue | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/packages/components/CustomComponents/CustomComponents/JumpBtn/config.ts b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/config.ts index 93182ba2..484d5439 100644 --- a/src/packages/components/CustomComponents/CustomComponents/JumpBtn/config.ts +++ b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/config.ts @@ -7,6 +7,7 @@ import cloneDeep from 'lodash/cloneDeep' export const option = {} export const customData = { label: '1号楼', + jumpEnable: true, id: null, id1: null, showInterval: true, diff --git a/src/packages/components/CustomComponents/CustomComponents/JumpBtn/configData.vue b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/configData.vue index d500a337..99e7354d 100644 --- a/src/packages/components/CustomComponents/CustomComponents/JumpBtn/configData.vue +++ b/src/packages/components/CustomComponents/CustomComponents/JumpBtn/configData.vue @@ -14,6 +14,11 @@
+ + + + + diff --git a/src/packages/components/Tables/Tables/TableScrollBoard/index.vue b/src/packages/components/Tables/Tables/TableScrollBoard/index.vue index d8be6100..7ef8e963 100644 --- a/src/packages/components/Tables/Tables/TableScrollBoard/index.vue +++ b/src/packages/components/Tables/Tables/TableScrollBoard/index.vue @@ -49,13 +49,12 @@ diff --git a/src/packages/components/Charts/Pies/PieCommon3/data.json b/src/packages/components/Charts/Pies/PieCommon3/data.json new file mode 100644 index 00000000..57bfeed9 --- /dev/null +++ b/src/packages/components/Charts/Pies/PieCommon3/data.json @@ -0,0 +1,43 @@ +{ + "dimensions": ["name", "value"], + "source": [{ + "name": "财务管理决策实训", + "value": 18 +}, +{ + "name": "商品流通业实训", + "value": 16 +}, +{ + "name": "暖心陪伴(津乐园20cm定制蛋糕)", + "value": 15 +}, +{ + "name": "嘉果荟萃(津乐园20cm定制蛋糕)", + "value": 14 +}, +{ + "name": "优雅圆舞曲(津乐园20cm)", + "value": 10 +}, +{ + "name": "巧克力之夏(津乐园20cm定制蛋糕)", + "value": 7.9 +}, +{ + "name": "财税宝4G", + "value": 6.7 +}, +{ + "name": "成本会计", + "value": 6 +}, +{ + "name": "纳税会计与筹划", + "value": 4.5 +}, +{ + "name": "金融担保业实训", + "value": 3 +}] +} diff --git a/src/packages/components/Charts/Pies/PieCommon3/index.ts b/src/packages/components/Charts/Pies/PieCommon3/index.ts new file mode 100644 index 00000000..243c7c7d --- /dev/null +++ b/src/packages/components/Charts/Pies/PieCommon3/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const PieCommon3Config: ConfigType = { + key: 'PieCommon3', + chartKey: 'VPieCommon3', + conKey: 'VCPieCommon3', + title: '饼图-自定义', + category: ChatCategoryEnum.PIE, + categoryName: ChatCategoryEnumName.PIE, + package: PackagesCategoryEnum.CHARTS, + chartFrame: ChartFrameEnum.ECHARTS, + image: 'PieCommon3.png' +} diff --git a/src/packages/components/Charts/Pies/PieCommon3/index.vue b/src/packages/components/Charts/Pies/PieCommon3/index.vue new file mode 100644 index 00000000..7a0aa69d --- /dev/null +++ b/src/packages/components/Charts/Pies/PieCommon3/index.vue @@ -0,0 +1,185 @@ + + + diff --git a/src/packages/components/Charts/Pies/index.ts b/src/packages/components/Charts/Pies/index.ts index cf9f4495..dfa447f7 100644 --- a/src/packages/components/Charts/Pies/index.ts +++ b/src/packages/components/Charts/Pies/index.ts @@ -1,6 +1,7 @@ import { PieCommonConfig } from './PieCommon/index' import { PieCommon1Config } from './PieCommon1/index' import { PieCommon2Config } from './PieCommon2/index' +import { PieCommon3Config } from './PieCommon3/index' import { PieCircleConfig } from './PieCircle/index' -export default [PieCommonConfig, PieCommon1Config, PieCommon2Config, PieCircleConfig] +export default [PieCommonConfig, PieCommon1Config, PieCommon2Config, PieCircleConfig,PieCommon3Config] diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/VModalV1.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/VModalV1.vue index 7f565df9..3f16326e 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/VModalV1.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/VModalV1.vue @@ -54,7 +54,7 @@ diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/config.ts b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/config.ts index e9225f66..2a62053a 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/config.ts +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/config.ts @@ -29,5 +29,6 @@ export default class Config extends PublicConfigClass implements CreateComponent showInterval: true, showFilter: false, space_complete_id: '', + dems_device_point_signal_ids: [], }) } diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/configData.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/configData.vue index 157336f2..79c0d72b 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/configData.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/configData.vue @@ -5,6 +5,9 @@ + + + diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue index 8af3f02e..444fefb7 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue @@ -279,6 +279,8 @@ const getData = () => { append_space_to_content: 'complete', handle_statuss: alarmHandleStatuss.value, recovery_statuss: alarmRecoveryStatus.value, + dems_device_point_signal_ids: props.chartConfig.customData?.dems_device_point_signal_ids.split(','), + }, page: { page_size: 10, diff --git a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/config.ts b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/config.ts new file mode 100644 index 00000000..b2ac3784 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/config.ts @@ -0,0 +1,32 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { ClassifiedStatistic } from './index' +import cloneDeep from 'lodash/cloneDeep' +// import logo from '@/assets/logo.png' + +export const option = { + // 图片路径 + dataset: '', + // 适应方式 + fit: 'contain', + // 圆角 + borderRadius: 0 +} + +export default class Config extends PublicConfigClass implements CreateComponentType +{ + constructor() { + super(); + this.attr.w = 450 + this.attr.h = 300 + this.request.requestInterval = 15 + } + public key = ClassifiedStatistic.key + public chartConfig = cloneDeep(ClassifiedStatistic) + public option = cloneDeep(option) + public customData = cloneDeep({ + title: '分类统计', + showInterval: true, + currentSource:'device' + }) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/config.vue b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/config.vue new file mode 100644 index 00000000..d1759a1d --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/config.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/configData.vue b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/configData.vue new file mode 100644 index 00000000..584e0389 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/configData.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.ts b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.ts new file mode 100644 index 00000000..cea6e10b --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const ClassifiedStatistic: ConfigType = { + key: 'ClassifiedStatistic', + chartKey: 'VClassifiedStatistic', + conKey: 'VCClassifiedStatistic', + // VCD开头 + conDataKey: 'VCDClassifiedStatistic', + title: '分类统计', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'ClassifiedStatistic.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue new file mode 100644 index 00000000..28e2c073 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/Overview/config.ts b/src/packages/components/CustomComponents/CustomComponents/Overview/config.ts new file mode 100644 index 00000000..8c93ca48 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Overview/config.ts @@ -0,0 +1,31 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { Overview } from './index' +import cloneDeep from 'lodash/cloneDeep' +// import logo from '@/assets/logo.png' + +export const option = { + // 图片路径 + dataset: '', + // 适应方式 + fit: 'contain', + // 圆角 + borderRadius: 0 +} + +export default class Config extends PublicConfigClass implements CreateComponentType +{ + constructor() { + super(); + this.attr.w = 250 + this.attr.h = 200 + this.request.requestInterval = 15 + } + public key = Overview.key + public chartConfig = cloneDeep(Overview) + public option = cloneDeep(option) + public customData = cloneDeep({ + title: '概览', + showInterval: true, + }) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/Overview/config.vue b/src/packages/components/CustomComponents/CustomComponents/Overview/config.vue new file mode 100644 index 00000000..d1759a1d --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Overview/config.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/Overview/configData.vue b/src/packages/components/CustomComponents/CustomComponents/Overview/configData.vue new file mode 100644 index 00000000..584e0389 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Overview/configData.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/Overview/index.ts b/src/packages/components/CustomComponents/CustomComponents/Overview/index.ts new file mode 100644 index 00000000..e2e867fe --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Overview/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const Overview: ConfigType = { + key: 'Overview', + chartKey: 'VOverview', + conKey: 'VCOverview', + // VCD开头 + conDataKey: 'VCDOverview', + title: '概览', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'Overview.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue b/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue new file mode 100644 index 00000000..9dbd3918 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/config.ts b/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/config.ts new file mode 100644 index 00000000..89f1f10e --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/config.ts @@ -0,0 +1,32 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { RoomTemperature } from './index' +import cloneDeep from 'lodash/cloneDeep' +// import logo from '@/assets/logo.png' + +export const option = { + // 图片路径 + dataset: '', + // 适应方式 + fit: 'contain', + // 圆角 + borderRadius: 0 +} + +export default class Config extends PublicConfigClass implements CreateComponentType +{ + constructor() { + super(); + this.attr.w = 450 + this.attr.h = 300 + this.request.requestInterval = 15 + } + public key = RoomTemperature.key + public chartConfig = cloneDeep(RoomTemperature) + public option = cloneDeep(option) + public customData = cloneDeep({ + title: '分类统计', + showInterval: true, + currentSource:'device' + }) +} diff --git a/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/config.vue b/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/config.vue new file mode 100644 index 00000000..d1759a1d --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/config.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/configData.vue b/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/configData.vue new file mode 100644 index 00000000..584e0389 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/configData.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/index.ts b/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/index.ts new file mode 100644 index 00000000..1e9bdb6c --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const RoomTemperature: ConfigType = { + key: 'RoomTemperature', + chartKey: 'VRoomTemperature', + conKey: 'VCRoomTemperature', + // VCD开头 + conDataKey: 'VCDRoomTemperature', + title: '机房温度', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'RoomTemperature.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/index.vue b/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/index.vue new file mode 100644 index 00000000..2eb67364 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/RoomTemperature/index.vue @@ -0,0 +1,426 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.ts b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.ts index 1ee60608..fb7b15e4 100644 --- a/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.ts +++ b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/config.ts @@ -9,7 +9,24 @@ export const customData = { title: '区域温度TOP10', ids: '', demonstration: false, + queryType: 'temp_list_dashboard', showInterval: true, + colName1:'区域设备', + colName2:'实时温度', + queryTypeOptions : [ + { + label: '区域温湿度', + value:'temp_list_dashboard' + }, + { + label: '机房温湿度排名', + value:'room_temp_sort_dashboard' + }, + { + label: '机房温湿度', + value:'room_temp_dashboard' + }, + ] } export default class Config extends PublicConfigClass implements CreateComponentType { diff --git a/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/configData.vue b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/configData.vue index f04c14c9..871453be 100644 --- a/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/configData.vue +++ b/src/packages/components/CustomComponents/CustomComponents/TemperatureTop10/configData.vue @@ -2,11 +2,22 @@ + + + + + + + + + + + @@ -16,6 +27,7 @@ import { SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' const props = defineProps(['customData', 'request']) + diff --git a/src/packages/public/publicConfig.ts b/src/packages/public/publicConfig.ts index 986fdb97..2bc810a8 100644 --- a/src/packages/public/publicConfig.ts +++ b/src/packages/public/publicConfig.ts @@ -88,10 +88,18 @@ const commonData: commonDataType = { enable: false, space_complete_id: '' }, + assetsClass: { + enable: false, + dataSource: '' + }, pointTable: { enable: false, ids: [] }, + categoryBrandCountTable: { + enable: false, + currentSource:'', + }, singlePoint: { enable: false, pointId: '', diff --git a/src/store/modules/chartEditStore/chartEditStore.d.ts b/src/store/modules/chartEditStore/chartEditStore.d.ts index 51144f33..8fbda575 100644 --- a/src/store/modules/chartEditStore/chartEditStore.d.ts +++ b/src/store/modules/chartEditStore/chartEditStore.d.ts @@ -264,10 +264,16 @@ export enum CurrentSourceEnum { SINGLEPOINT = 'singlePoint', // 设备分类统计 DEVICECLASS = 'deviceClass', + // 设备分类统计 + ASSETSCLASS = 'assetsClass', + // 区域设备个数 + AREADEVCOUNT = 'areaDevCount', // 当月告警分类统计 MONTHALARMCLASS = 'monthAlarmClass', // 测点表格 POINTTABLE = 'pointTable', + // 测点表格 + CATEGORYBRANDCOUNTTABLE = 'categoryBrandCountTable', // 手动输入 MANUALINPUT = 'manualInput', // 手动输入(单值) @@ -346,12 +352,25 @@ export interface DeviceClassType { enable: boolean space_complete_id: string } +// 统计 +export interface AssetsClassType { + enable: boolean + dataSource: string +} +export interface AreaDevCountType { + enable: boolean + dataSource: string +} // 测点表格值 export interface PointTableType { enable: boolean ids: string[] } +export interface CategoryBrandCountTableType { + enable: boolean + currentSource: string +} // 手动输入值 export interface ManualInputType { @@ -381,9 +400,12 @@ export interface commonDataType { pointRealTime: PointRealTimeType monthAlarmClass: MonthAlarmClassType pointTable: PointTableType + categoryBrandCountTable: CategoryBrandCountTableType // 多数据无参数 // 设备分类统计 deviceClass: DeviceClassType + assetsClass: AssetsClassType + areaDevCount: AreaDevCountType // 单数据 singlePoint: SinglePointType // 手动输入 diff --git a/src/styles/common/format.scss b/src/styles/common/format.scss index 8fefec95..ef6c0973 100644 --- a/src/styles/common/format.scss +++ b/src/styles/common/format.scss @@ -18,6 +18,6 @@ body { /* 滚动条滑块 */ ::-webkit-scrollbar-thumb { border-radius: 4px; - background: #a3a3a3; + background: #294C79; } diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/AssetsClass.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/AssetsClass.vue new file mode 100644 index 00000000..d11885d7 --- /dev/null +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/AssetsClass.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/CategoryBrandCountTable.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/CategoryBrandCountTable.vue new file mode 100644 index 00000000..c3ff0c7c --- /dev/null +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/CategoryBrandCountTable.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.d.ts b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.d.ts index a9b52656..f3fe023d 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.d.ts +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.d.ts @@ -150,6 +150,16 @@ export const sourceOptions: sourceOptionsItemType[] = [ value: CurrentSourceEnum.DEVICECLASS, type: optionTypeEnum.MULTIPLE, }, + { + label: '分类统计', + value: CurrentSourceEnum.ASSETSCLASS, + type: optionTypeEnum.MULTIPLE, + }, + { + label: '区域设备个数', + value: CurrentSourceEnum.AREADEVCOUNT, + type: optionTypeEnum.MULTIPLE, + }, { label: '当月告警分类统计', value: CurrentSourceEnum.MONTHALARMCLASS, @@ -160,6 +170,11 @@ export const sourceOptions: sourceOptionsItemType[] = [ value: CurrentSourceEnum.POINTTABLE, type: optionTypeEnum.MULTIPLE, }, + { + label: '分类品牌表格值', + value: CurrentSourceEnum.CATEGORYBRANDCOUNTTABLE, + type: optionTypeEnum.MULTIPLE, + }, { label: '手动输入值', value: CurrentSourceEnum.MANUALINPUT, diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue index 95f1b3da..61034a61 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue @@ -10,8 +10,11 @@ + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/AlarmTrend/configData.vue b/src/packages/components/CustomComponents/CustomComponents/AlarmTrend/configData.vue new file mode 100644 index 00000000..e056cd4d --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/AlarmTrend/configData.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/packages/components/CustomComponents/CustomComponents/AlarmTrend/index.ts b/src/packages/components/CustomComponents/CustomComponents/AlarmTrend/index.ts new file mode 100644 index 00000000..fb5886fd --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/AlarmTrend/index.ts @@ -0,0 +1,16 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/CustomComponents/index.d' + +export const AlarmTrend: ConfigType = { + key: 'AlarmTrend', + chartKey: 'VAlarmTrend', + conKey: 'VCAlarmTrend', + // VCD开头 + conDataKey: 'VCDAlarmTrend', + title: '告警趋势', + category: ChatCategoryEnum.CUSTOMCOMPONENTS, + categoryName: ChatCategoryEnumName.CUSTOMCOMPONENTS, + package: PackagesCategoryEnum.CUSTOMCOMPONENTS, + chartFrame: ChartFrameEnum.COMMON, + image: 'AlarmTrend.png' +} diff --git a/src/packages/components/CustomComponents/CustomComponents/AlarmTrend/index.vue b/src/packages/components/CustomComponents/CustomComponents/AlarmTrend/index.vue new file mode 100644 index 00000000..4fb34a25 --- /dev/null +++ b/src/packages/components/CustomComponents/CustomComponents/AlarmTrend/index.vue @@ -0,0 +1,256 @@ + + + + + \ No newline at end of file diff --git a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue index 28e2c073..064f5d47 100644 --- a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue @@ -6,9 +6,13 @@
+
+ {{Object.values(item)[0]}} + +
- {{Object.keys(item)[0]}}{{Object.values(item)[0]}}台 + {{Object.keys(item)[0]}}
@@ -29,7 +33,8 @@ import {cloneDeep} from 'lodash' import moment from "moment" import {selectTimeOptions} from "@/views/chart/ContentConfigurations/components/ChartData/index.d"; import {RequestHttpIntervalEnum} from "@/enums/httpEnum"; - +import {useGlobalQueryParamsStore} from '@/store/modules/globalQueryParamsStore/globalQueryParamsStore' +const globalQueryParamsStore = useGlobalQueryParamsStore() const props = defineProps({ chartConfig: { type: Object as PropType, @@ -47,13 +52,14 @@ const getStyle = (radius: number) => { overflow: 'hidden' } } -console.log(props.chartConfig,'chartConfig'); let type_count:any = ref([]) +const queryParams = { + ...globalQueryParamsStore.getGlobalQueryParams +} const getData = () => { if(props.chartConfig?.customData?.currentSource==='IT'){ - publicInterface('/dcim/asset', 'get_asset_overview_page_info_new', {}).then(res => { - console.log(res,'res----') + publicInterface('/dcim/asset', 'get_asset_overview_page_info_new', queryParams).then(res => { if (res && res.data) { type_count.value = res.data.type_count // for (const key in computeNodeData) { @@ -62,8 +68,7 @@ const getData = () => { } }) }else{ - publicInterface('/dcim/dems/device', 'get_dev_category_count', {}).then(res => { - console.log(res,'res----') + publicInterface('/dcim/dems/device', 'get_dev_category_count', queryParams).then(res => { if (res && res.data) { type_count.value = res.data.map((item:any)=>{ return { @@ -147,12 +152,25 @@ onUnmounted(() => { overflow: auto; color:#fff; .img{ + position: relative; width: 100px; height: 100px; img{ width: 100%; height: 100%; } + .value{ + position: absolute; + width: 100%; + top:50%; + left:50%; + transform: translate(-50%,-50%); + white-space: pre-wrap; + text-align: center; + font-size: 17px; + + + } } } .count{ diff --git a/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue b/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue index 9dbd3918..1ef26ad8 100644 --- a/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue @@ -30,7 +30,8 @@ import {cloneDeep} from 'lodash' import moment from "moment" import {selectTimeOptions} from "@/views/chart/ContentConfigurations/components/ChartData/index.d"; import {RequestHttpIntervalEnum} from "@/enums/httpEnum"; - +import {useGlobalQueryParamsStore} from '@/store/modules/globalQueryParamsStore/globalQueryParamsStore' +const globalQueryParamsStore = useGlobalQueryParamsStore() const props = defineProps({ chartConfig: { type: Object as PropType, @@ -48,13 +49,13 @@ const getStyle = (radius: number) => { overflow: 'hidden' } } -console.log(props.chartConfig,'chartConfig'); let type_count:any = ref([]) - +const queryParams = { + ...globalQueryParamsStore.getGlobalQueryParams +} const getData = () => { if(props.chartConfig?.customData?.currentSource==='IT'){ - publicInterface('/dcim/asset', 'get_asset_overview_page_info_new', {}).then(res => { - console.log(res,'res----') + publicInterface('/dcim/asset', 'get_asset_overview_page_info_new', queryParams).then(res => { if (res && res.data) { let commonBrands = res.data.type_count.reduce((prev:any, curr:any) => { @@ -80,8 +81,7 @@ const getData = () => { } }) }else{ - publicInterface('/dcim/dems/device', 'get_dev_category_count', {}).then(res => { - console.log(res,'res----') + publicInterface('/dcim/dems/device', 'get_dev_category_count', queryParams).then(res => { if (res && res.data) { const commonBrands:any = res.data.reduce((prev:any, curr:any) => { return curr.count > prev.count ? curr : prev; @@ -104,7 +104,6 @@ const getData = () => { } }) } - console.log(type_count.value,`type_count_${props.chartConfig?.customData?.currentSource}`) } let timer:unknown diff --git a/src/packages/components/CustomComponents/CustomComponents/index.ts b/src/packages/components/CustomComponents/CustomComponents/index.ts index 504b3b28..1dcdfd6e 100644 --- a/src/packages/components/CustomComponents/CustomComponents/index.ts +++ b/src/packages/components/CustomComponents/CustomComponents/index.ts @@ -20,6 +20,7 @@ import { PositionConfig } from './Position' import { JumpBtnConfig } from './JumpBtn' import { ClassifiedStatistic } from './ClassifiedStatistic' import { AlarmLevelStatistic } from './AlarmLevelStatistic' +import { AlarmTrend } from './AlarmTrend' import { RoomTemperature } from './RoomTemperature' import { Overview } from './Overview' @@ -46,6 +47,7 @@ export default [ JumpBtnConfig, ClassifiedStatistic, AlarmLevelStatistic, + AlarmTrend, RoomTemperature, Overview ] diff --git a/src/packages/components/Decorates/Borders/BorderCustom1/index.vue b/src/packages/components/Decorates/Borders/BorderCustom1/index.vue index 5c079b17..4e029e6d 100644 --- a/src/packages/components/Decorates/Borders/BorderCustom1/index.vue +++ b/src/packages/components/Decorates/Borders/BorderCustom1/index.vue @@ -25,7 +25,6 @@ const { dataset, fit, borderRadius } = toRefs(props.chartConfig.option) const option = shallowReactive({ dataset: '' }) - const getStyle = (radius: number) => { return { borderRadius: `${radius}px`, diff --git a/src/packages/components/Tables/Tables/TablesBasic/index.vue b/src/packages/components/Tables/Tables/TablesBasic/index.vue index edf7f255..3307ff49 100644 --- a/src/packages/components/Tables/Tables/TablesBasic/index.vue +++ b/src/packages/components/Tables/Tables/TablesBasic/index.vue @@ -13,6 +13,7 @@
({ + queryParams: {} + }), + getters: { + getGlobalQueryParams():{[k:string]: any} { + return this.queryParams + } + }, + actions: { + setGlobalQueryParams(queryParams: {[k:string]: any}, merge: boolean = true) { + if(merge) { + this.queryParams = cloneDeep(queryParams) + } + else { + Object.assign(this.queryParams, queryParams) + } + } + } +}) diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/AlarmTrend.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/AlarmTrend.vue index ed218a78..50bd6ec1 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/AlarmTrend.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/AlarmTrend.vue @@ -7,15 +7,16 @@ - - + + - - + + - - + + + @@ -26,12 +27,32 @@ import type {Ref} from 'vue' import {SettingItemBox} from '@/components/Pages/ChartItemSetting' import {useTargetData} from '../../hooks/useTargetData.hook' import {commonDataType, AlarmTrendType} from '@/store/modules/chartEditStore/chartEditStore.d' +import { useOriginStore } from '@/store/modules/originStore/originStore' +const originStore = useOriginStore() +const systemConstant = originStore?.getOriginStore?.user?.systemConstant +const levelOptions = systemConstant['warn_levels'].filter((item:any)=>{ +if(item.value){ + item.value = item.value*1 + return item +} +}) const {targetData} = useTargetData() as { targetData: Ref<{ commonData: commonDataType, id: string }> } const currentObj = computed(() => { return targetData.value.commonData[targetData.value.commonData.currentSource] as AlarmTrendType }) - +const confirmStatusOption = [ + { label: '已确认', value: 'ok' }, + { label: '未确认', value: 'not' } + ] +const recoveryStatusOption = [ + { label: '已恢复', value: 'ok' }, + { label: '未恢复', value: 'not' } + ] +// const recoveryStatusOption = [ +// { label: '已恢复', value: 'ok' }, +// { label: '未恢复', value: 'not' } +// ] diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/configData.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/configData.vue index 79c0d72b..8d820821 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/configData.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/configData.vue @@ -5,8 +5,8 @@ - - + + diff --git a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue index 9f8a7755..151597d1 100644 --- a/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue +++ b/src/packages/components/CustomComponents/AlarmDiagram/RealTimeEvent/index.vue @@ -13,33 +13,59 @@ style="overflow: visible" >
-
- - - {{ item.confirm_status === 'ok'?'已确认':'未确认' }} +
+ + + {{ item.confirm_status === 'ok' ? '已确认' : '未确认' }} - - {{select1.options[item.level - 1].label}} + + {{ select1.options[item.level - 1].label }} -
{{ item.content }}
-
-
{{ moment(item.generate_time).format('yyyy-MM-DD HH:mm:ss') }}
- - +
{{ item.content }}
+
+
+ {{ moment(item.generate_time).format('yyyy-MM-DD HH:mm:ss') }} +
+ +
- -
查询结果为空
+ +
查询结果为空
- - + + @@ -49,11 +75,11 @@ import type { Ref } from 'vue' import { CreateComponentType } from '@/packages/index.d' import { publicInterface } from '@/api/path/business.api' import BorderBox from './BorderBoxV2.vue' -import {isPreview, postMessageToParent, useGetMessageByParent} from '@/utils' -import moment from "moment" -import {selectTimeOptions} from "@/views/chart/ContentConfigurations/components/ChartData/index.d"; -import {RequestHttpIntervalEnum} from "@/enums/httpEnum"; -import {icon} from '@/plugins/icon' +import { isPreview, postMessageToParent, useGetMessageByParent } from '@/utils' +import moment from 'moment' +import { selectTimeOptions } from '@/views/chart/ContentConfigurations/components/ChartData/index.d' +import { RequestHttpIntervalEnum } from '@/enums/httpEnum' +import { icon } from '@/plugins/icon' import VModal from './VModal.vue' import VModalV1 from './VModalV1.vue' import { useOriginStore } from '@/store/modules/originStore/originStore' @@ -109,59 +135,64 @@ interface Select2Type { color: string }[] } -const select2:Select2Type = reactive({ +const select2: Select2Type = reactive({ value: [], options: [ { label: '已确认', value: 'ok', number: 0, color: '#4DCA59' }, - { label: '未确认', value: 'not', number: 0, color: '#f5b442' }, + { label: '未确认', value: 'not', number: 0, color: '#f5b442' } ] }) - type tableDataItemType = { - id: number, - content: string, - generate_time: string, - checked: boolean, - confirm_status: 'ok' | 'not', - level: number, - color1: string, - color2: string, - position: string, - device_name: string, - node_name: string, - confirm_people: string, - confirm_time: string, - reconfirmation_time_str: string, - serial_no: string, - remark: string, - [k:string]: any, + id: number + content: string + generate_time: string + checked: boolean + confirm_status: 'ok' | 'not' + level: number + color1: string + color2: string + position: string + device_name: string + node_name: string + confirm_people: string + confirm_time: string + reconfirmation_time_str: string + serial_no: string + remark: string + [k: string]: any } -let tableData:tableDataItemType[] = reactive([]) -watch(() => tableData.map(_ => _.checked), (v:boolean[]) => { - if(!v.length) checkAll.value = false - else if(v.every(_ => _)) checkAll.value = true - else if(v.every(_ => !_)) checkAll.value = false -}) +let tableData: tableDataItemType[] = reactive([]) +watch( + () => tableData.map(_ => _.checked), + (v: boolean[]) => { + if (!v.length) checkAll.value = false + else if (v.every(_ => _)) checkAll.value = true + else if (v.every(_ => !_)) checkAll.value = false + } +) let checkAll = ref(false) -watch(() => checkAll.value, (v) => { - tableData.forEach(_ => _.checked = v) -}) +watch( + () => checkAll.value, + v => { + tableData.forEach(_ => (_.checked = v)) + } +) const getNumber = () => { - console.log(props.chartConfig.customData?.dems_device_point_signal_ids,'props.chartConfig.customData?.dems_device_point_signal_ids') + const q = { space_complete_id: props.chartConfig.customData?.space_complete_id, confirm_statuss: alarmConfirmStatus.value, handle_statuss: alarmHandleStatuss.value, recovery_statuss: alarmRecoveryStatus.value, - dems_device_point_signal_ids: props.chartConfig.customData?.dems_device_point_signal_ids.split(','), + signal_ids: props.chartConfig.customData?.dems_device_point_signal_ids.split(',') } publicInterface('/dcim/dems/devie_active_alarm', 'count_by_level_new', q).then(res => { if (res && JSON.stringify(res.data) !== '{}') { select1.options.forEach((item, i) => { - item.number = res.data[`level${i+1}`] + item.number = res.data[`level${i + 1}`] }) } }) @@ -172,7 +203,8 @@ const getNumber = () => { space_complete_id: props.chartConfig.customData?.space_complete_id, append_space_to_content: 'complete', handle_statuss: alarmHandleStatuss.value, - recovery_statuss: alarmRecoveryStatus.value + recovery_statuss: alarmRecoveryStatus.value, + dems_device_point_signal_ids: props.chartConfig.customData?.dems_device_point_signal_ids.split(',') } } publicInterface('/dcim/dems/devie_active_alarm', 'get_app_alarm_num_by_condition', param).then(res => { @@ -195,68 +227,74 @@ let alarmVideos = ref([]) // }) let currentVideo: any = ref({}) const getVideos = (ids: number[], alarmIds: number[]) => { - if(ids.length) { - publicInterface('/dcim/video_monitor/other_device', 'get_alarm_device', {device_uids: ids.toString()}).then((res: any) => { - // if(res.errcode !== '00000') return - if(!res?.data) return - let arr:any = [] - ids.forEach(id => { - arr.push(res.data[id] ? res.data[id][0] : null) - }) - alarmVideos.value = arr.concat() + if (ids.length) { + publicInterface('/dcim/video_monitor/other_device', 'get_alarm_device', { device_uids: ids.toString() }).then( + (res: any) => { + // if(res.errcode !== '00000') return + if (!res?.data) return + let arr: any = [] + ids.forEach(id => { + arr.push(res.data[id] ? res.data[id][0] : null) + }) + alarmVideos.value = arr.concat() - let index = 0, last:any = {} - for(let i = 0; i < arr.length; i++) { - if(arr[i]) { - last = arr[i] - index = i - break + let index = 0, + last: any = {} + for (let i = 0; i < arr.length; i++) { + if (arr[i]) { + last = arr[i] + index = i + break + } } - } - if(JSON.stringify(currentVideo.value) === '{}' && !last) return - let obj = JSON.stringify(currentVideo.value) !== '{}' ? JSON.parse(JSON.stringify(currentVideo.value)) : { - ip: '', - port: null, - account: '', - password: '', - channel: '', - brand: '', - plugin: '', - } - if(last) { - for(let k in obj) { - obj[k] = last[k] + if (JSON.stringify(currentVideo.value) === '{}' && !last) return + let obj = + JSON.stringify(currentVideo.value) !== '{}' + ? JSON.parse(JSON.stringify(currentVideo.value)) + : { + ip: '', + port: null, + account: '', + password: '', + channel: '', + brand: '', + plugin: '' + } + if (last) { + for (let k in obj) { + obj[k] = last[k] + } } + obj.alarmId = alarmIds[index] + currentVideo.value = obj + obj.showForce = false + postMessageToParent({ + type: 'openVideoV2', + data: obj + }) } - obj.alarmId = alarmIds[index] - currentVideo.value = obj - obj.showForce = false - postMessageToParent({ - type: 'openVideoV2', - data: obj - }) - }) + ) } } const showLoading = ref(false) -const {getMessageByParent} = useGetMessageByParent() -getMessageByParent('', (e) => { - if(e.data.type === 'openVideoV2_closeLoading' && e.data.page === 'customLargeScreen') { +const { getMessageByParent } = useGetMessageByParent() +getMessageByParent('', e => { + if (e.data.type === 'openVideoV2_closeLoading' && e.data.page === 'customLargeScreen') { showLoading.value = false } }) const showVideo = (obj: any, id: number) => { - let a: {[k: string]: string | null | boolean | number} = { + let a: { [k: string]: string | null | boolean | number } = { ip: '', port: null, account: '', password: '', channel: '', brand: '', - plugin: '', + plugin: '' } - for(let k in a) { + for (let k in a) { a[k] = obj[k] } // 点击时强制打开 @@ -281,8 +319,7 @@ const getData = () => { append_space_to_content: 'complete', handle_statuss: alarmHandleStatuss.value, recovery_statuss: alarmRecoveryStatus.value, - dems_device_point_signal_ids: props.chartConfig.customData?.dems_device_point_signal_ids.split(','), - + dems_device_point_signal_ids: props.chartConfig.customData?.dems_device_point_signal_ids.split(',') }, page: { page_size: 10, @@ -290,14 +327,14 @@ const getData = () => { } } publicInterface('/dcim/dems/devie_active_alarm', 'get_page', queryModel).then(res => { - if(res && !res.data) { + if (res && !res.data) { tableData.splice(0) return } - if(res && res.data) { + if (res && res.data) { res.data.item = res.data.item.filter((_: tableDataItemType) => _.level) const lastTableData = [...tableData] - let arr:tableDataItemType[] = res.data['item'].map((e:any) => ({ + let arr: tableDataItemType[] = res.data['item'].map((e: any) => ({ ...e, id: e.id, content: e.content, @@ -314,11 +351,14 @@ const getData = () => { confirm_time: e.confirm_time, reconfirmation_time_str: e.reconfirmation_time_str, serial_no: e.serial_no, - remark: e.remark, + remark: e.remark })) - getVideos(arr.map(_ => _.device?.uid), arr.map(_ => _.id)) + getVideos( + arr.map(_ => _.device?.uid), + arr.map(_ => _.id) + ) if (checkAll.value) { - arr = arr.map((e:any) => ({ ...e, checked: e.confirm_status !== 'ok' })) + arr = arr.map((e: any) => ({ ...e, checked: e.confirm_status !== 'ok' })) } else if (lastTableData.length) { arr.map(e => { const lastIndex = lastTableData.findIndex(item => item.id === e.id) @@ -336,10 +376,10 @@ const getData = () => { // show: false, // data: {} // }) -const clickItem = (i:number) => { +const clickItem = (i: number) => { postMessageToParent({ type: 'openRealTimeEventDetail', - currentAlarm: tableData[i], + currentAlarm: tableData[i] }) // 自己写的详情 @@ -357,15 +397,17 @@ const systemConstant = originStore.getOriginStore.user.systemConstant const systemConfig = originStore.getOriginStore.user.systemConfig if (systemConstant['warn_levels']) { - select1.options = systemConstant['warn_levels'].filter((item: any) => item.value !== '').map((item: any) => { - return { label: item.label, value: Number(item.value), number: 0, color: item.remark } - }) + select1.options = systemConstant['warn_levels'] + .filter((item: any) => item.value !== '') + .map((item: any) => { + return { label: item.label, value: Number(item.value), number: 0, color: item.remark } + }) } let alarmHandleStatuss: Ref = ref([]) let alarmRecoveryStatus: Ref = ref([]) let alarmConfirmStatus: Ref = ref([]) -if(systemConfig) { +if (systemConfig) { if (systemConfig['active_alarm_level']) { for (let i = 0; i < Number(systemConfig['active_alarm_level']); i++) { select1.value.push(i + 1) @@ -383,9 +425,12 @@ if(systemConfig) { } } -watch(() => select1.value.join('&&') + select2.value.join('&&'), (v) => { - getData() -}) +watch( + () => select1.value.join('&&') + select2.value.join('&&'), + v => { + getData() + } +) // const modalV1Obj = reactive({ // show: false, @@ -401,16 +446,16 @@ watch(() => select1.value.join('&&') + select2.value.join('&&'), (v) => { // singleIds: [], // }) const clickBatch = () => { - if(!tableData.filter(_ => _.checked).length) { + if (!tableData.filter(_ => _.checked).length) { window['$message'].warning('请先选择数据') return } let selectIds = tableData.filter(_ => _.checked && _.confirm_status !== 'ok').map(_ => _.id) - if(!selectIds.length) return + if (!selectIds.length) return postMessageToParent({ type: 'openRealTimeEventDialog', multipleConfirm: true, - selectIds, + selectIds }) // Object.assign(modalV1Obj, { // show: true, @@ -426,8 +471,8 @@ const clickBatch = () => { // }) } -getMessageByParent('', (e) => { - if(e.data.type === 'openRealTimeEventDialog_confirmed' && e.data.page === 'customLargeScreen') { +getMessageByParent('', e => { + if (e.data.type === 'openRealTimeEventDialog_confirmed' && e.data.page === 'customLargeScreen') { console.log('openRealTimeEventDialog_confirmed') getData() } @@ -436,7 +481,7 @@ const clickSingle = (id: number) => { postMessageToParent({ type: 'openRealTimeEventDialog', multipleConfirm: false, - selectIds: [id], + selectIds: [id] }) // 自己写的弹窗 @@ -468,7 +513,7 @@ const clickSingle = (id: number) => { // }) // } -const jumpTo = (row:any) => { +const jumpTo = (row: any) => { if (row.space && row.space.space_type !== 'device') { publicInterface('/dcim/space_page', 'get', { space_id: row.space_id, order: 'sort,id asc' }).then(res => { if (res && res.data && res.data.length) { @@ -476,13 +521,11 @@ const jumpTo = (row:any) => { type: 'changeRouterV1', url: `/dynamicRing/schematicDiagram/${res.data[0].id}` }) - } - else { + } else { window['$message'].warning('所选节点没有配置页面') } }) - } - else { + } else { window['$message'].warning('所选节点没有配置页面') } } @@ -490,29 +533,39 @@ const jumpTo = (row:any) => { const jumpMore = () => { postMessageToParent({ type: 'changeRouterV1', - url: `/alarmManage/monitorAlarm` + url: `/alarmManage/monitorAlarm`, + query:{dems_device_point_signal_ids:props.chartConfig.customData?.dems_device_point_signal_ids} + }) } -let timer:unknown -watch(() => [props.chartConfig.request.requestInterval, props.chartConfig.request.requestIntervalUnit, props.chartConfig.customData?.space_complete_id].join('&&'), v => { - if(!isPreview()) return - if(props.chartConfig.request.requestInterval) { - if(timer) clearInterval(timer as number) - const obj = selectTimeOptions.find(_ => _.value === props.chartConfig.request.requestIntervalUnit) || {unit: 0} - const unit = obj.unit - const number = unit * props.chartConfig.request.requestInterval - timer = setInterval(() => { - getData() - }, number) +let timer: unknown +watch( + () => + [ + props.chartConfig.request.requestInterval, + props.chartConfig.request.requestIntervalUnit, + props.chartConfig.customData?.space_complete_id + ].join('&&'), + v => { + if (!isPreview()) return + if (props.chartConfig.request.requestInterval) { + if (timer) clearInterval(timer as number) + const obj = selectTimeOptions.find(_ => _.value === props.chartConfig.request.requestIntervalUnit) || { unit: 0 } + const unit = obj.unit + const number = unit * props.chartConfig.request.requestInterval + timer = setInterval(() => { + getData() + }, number) + } } -}) +) onMounted(() => { nextTick(() => { getData() }) - if(!isPreview()) return - const obj = selectTimeOptions.find(_ => _.value === props.chartConfig.request.requestIntervalUnit) || {unit: 0} + if (!isPreview()) return + const obj = selectTimeOptions.find(_ => _.value === props.chartConfig.request.requestIntervalUnit) || { unit: 0 } const unit = obj.unit const number = unit * props.chartConfig.request.requestInterval! timer = setInterval(() => { @@ -549,18 +602,18 @@ onUnmounted(() => { animation: rotate 1s linear infinite; } -.mr5{ +.mr5 { margin-right: 5px; } -.mr10{ +.mr10 { margin-right: 10px; } -.textEllipsis{ +.textEllipsis { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } -.emptyBox{ +.emptyBox { height: 100%; width: 100%; display: flex; @@ -568,13 +621,13 @@ onUnmounted(() => { justify-content: center; } -.itemBox{ +.itemBox { width: 100%; height: 100%; display: flex; flex-direction: column; overflow-y: auto; - .item{ + .item { flex: none; height: 30px; display: flex; @@ -582,7 +635,7 @@ onUnmounted(() => { justify-content: center; padding: 0 10px; margin: 3px 0; - background: rgba(65,150,255,.05); + background: rgba(65, 150, 255, 0.05); cursor: pointer; } } diff --git a/src/packages/components/CustomComponents/CustomComponents/AlarmLevelStatistic/configData.vue b/src/packages/components/CustomComponents/CustomComponents/AlarmLevelStatistic/configData.vue index 86550138..04731205 100644 --- a/src/packages/components/CustomComponents/CustomComponents/AlarmLevelStatistic/configData.vue +++ b/src/packages/components/CustomComponents/CustomComponents/AlarmLevelStatistic/configData.vue @@ -3,7 +3,7 @@ - + - {{ alarmLevel["level_4"] }} + {{ alarmLevel['level_4'] }} - {{ alarmLevel["level_3"] }} + {{ alarmLevel['level_3'] }} - {{ alarmLevel["level_2"] }} + {{ alarmLevel['level_2'] }} - {{ alarmLevel["level_1"] }} + {{ alarmLevel['level_1'] }} - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 告警总数 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 告警总数 @@ -390,21 +208,12 @@ points="36 0 36 22 37 22 37 1 395 1 395 219 37 219 37 198 36 198 36 220 396 220 396 0 36 0" /> - + {{ alarmLevelTotal }} - + @@ -416,7 +225,19 @@ \ No newline at end of file + diff --git a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/configData.vue b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/configData.vue index 584e0389..b149fb32 100644 --- a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/configData.vue +++ b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/configData.vue @@ -1,11 +1,18 @@ @@ -15,16 +22,14 @@ import { SettingItemBox } from '@/components/Pages/ChartItemSetting' const props = defineProps(['customData', 'request']) const multipleSourceOptions = [ { - label: '配电设备', - value:'device' + label: '动环设备', + value: 'device' }, { label: 'IT设备', - value:'IT' - }, - + value: 'IT' + } ] - + diff --git a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue index 1d0e0e87..70688833 100644 --- a/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/ClassifiedStatistic/index.vue @@ -1,51 +1,73 @@ diff --git a/src/packages/components/CustomComponents/CustomComponents/Overview/configData.vue b/src/packages/components/CustomComponents/CustomComponents/Overview/configData.vue index 584e0389..b149fb32 100644 --- a/src/packages/components/CustomComponents/CustomComponents/Overview/configData.vue +++ b/src/packages/components/CustomComponents/CustomComponents/Overview/configData.vue @@ -1,11 +1,18 @@ @@ -15,16 +22,14 @@ import { SettingItemBox } from '@/components/Pages/ChartItemSetting' const props = defineProps(['customData', 'request']) const multipleSourceOptions = [ { - label: '配电设备', - value:'device' + label: '动环设备', + value: 'device' }, { label: 'IT设备', - value:'IT' - }, - + value: 'IT' + } ] - + diff --git a/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue b/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue index 9c671d40..a3ea5776 100644 --- a/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue +++ b/src/packages/components/CustomComponents/CustomComponents/Overview/index.vue @@ -1,17 +1,19 @@ - + diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/CompanyTempTop.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/CompanyTempTop.vue index bbb8521f..e61c4435 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/CompanyTempTop.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/CompanyTempTop.vue @@ -4,12 +4,16 @@ - + + + + + diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointHistory.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointHistory.vue index f50c2258..63167f5f 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointHistory.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointHistory.vue @@ -10,13 +10,13 @@ - + diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointRealTime.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointRealTime.vue index d21c7d1d..11547688 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointRealTime.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointRealTime.vue @@ -14,13 +14,13 @@ - + diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointTable.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointTable.vue index 5c0f6af8..ce9f13cc 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointTable.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/PointTable.vue @@ -4,13 +4,13 @@ - + diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/SinglePoint.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/SinglePoint.vue index 773444b6..3265a21b 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/components/SinglePoint.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/components/SinglePoint.vue @@ -4,10 +4,10 @@ - + diff --git a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue index 3a2eb00a..71417a91 100644 --- a/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartDataV2/index.vue @@ -2,31 +2,31 @@
- + @@ -36,16 +36,26 @@ :show-button="false" placeholder="请输入" size="small" - style="flex: 1;" + style="flex: 1" > - +
- + - +
-
- 暂无数据 -
+
暂无数据