diff --git a/README.md b/README.md index b0152d1..7585c90 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,7 @@ - 成员项目: 基于 vben5(ant-design-vue) 的前端项目 [ruoyi-plus-vben5](https://github.com/imdap/ruoyi-plus-vben5) - 成员项目: 基于soybean 的前端项目 [ruoyi-plus-soybean](https://gitee.com/xlsea/ruoyi-plus-soybean) -## 配套后端代码仓库地址 -| 介绍 | 项目名 | 项目地址 | -|------------|:-----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 🔥 分布式集群框架 | RuoYi-Vue-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus)
- [GitHub](https://github.com/dromara/RuoYi-Vue-Plus)
- [GitCode](https://gitcode.com/dromara/RuoYi-Vue-Plus) | -| 🔥 微服务框架 | RuoYi-Cloud-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Cloud-Plus)
- [GitHub](https://github.com/dromara/RuoYi-Cloud-Plus)
- [GitCode](https://gitcode.com/dromara/RuoYi-Cloud-Plus) | ## 分支说明 @@ -57,27 +52,3 @@ npm run build:prod | 缓存监控 | 对系统的缓存信息查询,命令统计等。 | 支持 | 支持 | | 在线构建器 | 拖动表单元素生成相应的HTML代码。 | 支持 | 支持 | | 使用案例 | 系统的一些功能案例 | 支持 | 不支持 | - -## 演示图例 - -| | | -| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -| ![输入图片说明](https://foruda.gitee.com/images/1680077524361362822/270bb429_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680077619939771291/989bf9b6_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680077681751513929/1c27c5bd_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680077721559267315/74d63e23_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680077765638904515/1b75d4a6_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078026375951297/eded7a4b_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078237104531207/0eb1b6a7_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078254306078709/5931e22f_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078287971528493/0b9af60a_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078308138770249/8d3b6696_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078352553634393/db5ef880_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078378238393374/601e4357_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078414983206024/2aae27c1_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078446738419874/ecce7d59_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078475971341775/149e8634_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078491666717143/3fadece7_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078558863188826/fb8ced2a_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078574561685461/ae68a0b2_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078594932772013/9d8bfec6_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078626493093532/fcfe4ff6_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078643608812515/0295bd4f_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078685196286463/d7612c81_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078703877318597/56fce0bc_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078716586545643/b6dbd68f_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078734103217688/eb1e6aa6_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078759131415480/73c525d8_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078779416197879/75e3ed02_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078802329118061/77e10915_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078893627848351/34a1c342_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078928175016986/f126ec4a_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078941718318363/b68a0f72_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078963175518631/3bb769a1_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680078982294090567/b31c343d_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680079000642440444/77ca82a9_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680079020995074177/03b7d52e_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680079039367822173/76811806_1766278.png '屏幕截图') | -| ![输入图片说明](https://foruda.gitee.com/images/1680079274333484664/4dfdc7c0_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680079290467458224/d6715fcf_1766278.png '屏幕截图') | diff --git a/src/api/ems/report/iotAdvancedReport.ts b/src/api/ems/report/iotAdvancedReport.ts new file mode 100644 index 0000000..ceddb4c --- /dev/null +++ b/src/api/ems/report/iotAdvancedReport.ts @@ -0,0 +1,60 @@ +import request from '@/utils/request'; +import type { + EfficiencyAnalysisVO, + EnergyAbnormalAlertReportVO, + EmsActionResponse, + InstrumentConditionReportVO, + MeterBalanceReportVO, + RecordIotenvInstantReportQuery +} from '../types'; + +export interface MeterBalanceReportQuery extends RecordIotenvInstantReportQuery { + rootMonitorId?: string; + aggregationType?: 'LAST' | 'AVG' | 'SUM' | string; + imbalanceThreshold?: number | string; +} + +export interface EfficiencyAnalysisQuery extends RecordIotenvInstantReportQuery { + metricCodes?: string[]; +} + +export interface EnergyAbnormalAlertReportQuery extends RecordIotenvInstantReportQuery { + alarmStatus?: number; + pushStatus?: string; +} + +// 查询仪表工况分析 +export function getInstrumentConditionReport(data: RecordIotenvInstantReportQuery): Promise> { + return request({ + url: '/ems/report/iotAdvanced/instrumentCondition', + method: 'post', + data + }); +} + +// 查询计量平衡报表 +export function getMeterBalanceReport(data: MeterBalanceReportQuery): Promise> { + return request({ + url: '/ems/report/iotAdvanced/meterBalance', + method: 'post', + data + }); +} + +// 查询综合运行能效分析 +export function getEfficiencyAnalysisReport(data: EfficiencyAnalysisQuery): Promise> { + return request({ + url: '/ems/report/iotAdvanced/efficiencyAnalysis', + method: 'post', + data + }); +} + +// 查询用能异常报警报表 +export function getEnergyAbnormalAlertReport(data: EnergyAbnormalAlertReportQuery): Promise> { + return request({ + url: '/ems/report/iotAdvanced/energyAbnormalAlert', + method: 'post', + data + }); +} diff --git a/src/api/ems/report/tempBoard.ts b/src/api/ems/report/tempBoard.ts new file mode 100644 index 0000000..e94cf00 --- /dev/null +++ b/src/api/ems/report/tempBoard.ts @@ -0,0 +1,334 @@ +import request from '@/utils/request' + +import type { AxiosPromise } from 'axios' + +// ==================== TS 类型定义 ==================== + +/** 温度看板通用查询参数 */ +export interface TempBoardQuery { + /** 开始时间 yyyy-MM-dd HH:mm:ss */ + startTime?: string + /** 结束时间 yyyy-MM-dd HH:mm:ss */ + endTime?: string + /** 测点ID列表 */ + monitorIds?: string[] + /** 高温阈值(默认35) */ + highTempThreshold?: number + /** 低温阈值(默认10) */ + lowTempThreshold?: number + /** 温升过快阈值 ℃/分钟(默认1.0) */ + rapidRiseThreshold?: number + /** 温度抖动标准差阈值(默认2.0) */ + stddevThreshold?: number + /** 采样间隔异常阈值 秒(默认300) */ + gapThresholdSeconds?: number + /** 长时间未更新阈值 秒(默认600) */ + staleThresholdSeconds?: number + /** TopN 数量(默认10) */ + topN?: number + /** 单测点趋势查询 */ + monitorId?: string + /** 预期采样数(完整率计算用) */ + expectedSampleCount?: number +} + +/** 测点温度排行项 */ +export interface MonitorTempRank { + monitorId: string + monitorName: string + temperature: number + collectTime: string +} + +/** 数据新鲜度项 */ +export interface FreshnessItem { + monitorId: string + monitorName: string + temperature: number + collectTime: string + ageSeconds: number +} + +/** 温度总览 VO */ +export interface TempBoardOverviewVO { + monitorCount: number + avgLatestTemp: number + maxLatestTemp: number + maxTempMonitorId: string + minLatestTemp: number + minTempMonitorId: string + highTempTopN: MonitorTempRank[] + lowTempTopN: MonitorTempRank[] + freshnessList: FreshnessItem[] +} + +/** 实时监控 VO */ +export interface TempBoardRealtimeVO { + monitorId: string + monitorName: string + temperature: number + collectTime: string + recodeTime: string + delaySeconds: number + staleSeconds: number +} + +/** 趋势分析 VO */ +export interface TempBoardTrendVO { + statTime: string + monitorId: string + monitorName: string + avgTemp: number + maxTemp: number + minTemp: number + changeRate: number + sampleCount: number + peakTemp: number + peakTime: string + valleyTemp: number + valleyTime: string + prevTemp: number + prevTime: string +} + +/** 分布分析 VO */ +export interface TempBoardDistributionVO { + tempBucket: string + tempBin: number + sampleCount: number + statDate: string + statHour: number + avgTemp: number + monitorId: string + monitorName: string + temperature: number +} + +/** 异常预警 VO */ +export interface TempBoardAnomalyVO { + monitorId: string + monitorName: string + temperature: number + collectTime: string + anomalyType: string + risePerMin: number + tempStddev: number + startTime: string + endTime: string + maxTemp: number + sampleCount: number + prevTemp: number + prevTime: string + statTime: string +} + +/** 对比分析 VO */ +export interface TempBoardComparisonVO { + monitorId: string + monitorName: string + avgTemp: number + maxTemp: number + minTemp: number + tempRange: number + tempStddev: number + statDate: string + todayAvg: number + yesterdayAvg: number + diffValue: number +} + +/** 数据质量 VO */ +export interface TempBoardQualityVO { + monitorId: string + monitorName: string + delayBucket: string + sampleCount: number + collectTime: string + recodeTime: string + delaySeconds: number + prevTime: string + gapSeconds: number + actualCount: number + expectedCount: number + completenessRate: number + firstTime: string + lastTime: string + temperature: number +} + +/** 高级分析 VO */ +export interface TempBoardAdvancedVO { + fromNode: string + toNode: string + flowCount: number + statTime: string + monitorId: string + monitorName: string + avgTemp: number + sampleCount: number + tempBucket: string + maxTemp: number + minTemp: number + tempStddev: number + avgDelay: number +} + +// ==================== API 函数 ==================== + +const BASE_URL = '/ems/report/tempBoard' + +// --- A. 温度总览 --- +/** 温度总览 */ +export const getTempOverview = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/overview`, method: 'get', params: query }) + +// --- B. 实时监控 --- +/** 实时温度明细 */ +export const getRealtimeDetail = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/realtime/detail`, method: 'get', params: query }) + +/** 高温测点 */ +export const getHighTempMonitors = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/realtime/highTemp`, method: 'get', params: query }) + +/** 低温测点 */ +export const getLowTempMonitors = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/realtime/lowTemp`, method: 'get', params: query }) + +/** 长时间未更新测点 */ +export const getStaleMonitors = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/realtime/stale`, method: 'get', params: query }) + +/** 入库延迟排行 */ +export const getDelayRanking = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/realtime/delay`, method: 'get', params: query }) + +// --- C. 趋势分析 --- +/** 单测点分钟趋势 */ +export const getMinuteTrend = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/trend/minute`, method: 'get', params: query }) + +/** 单测点小时趋势 */ +export const getHourlyTrend = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/trend/hourly`, method: 'get', params: query }) + +/** 多测点对比趋势 */ +export const getMultiCompareTrend = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/trend/multiCompare`, method: 'get', params: query }) + +/** 日均温趋势 */ +export const getDailyTrend = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/trend/daily`, method: 'get', params: query }) + +/** 温度变化率趋势 */ +export const getChangeRateTrend = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/trend/changeRate`, method: 'get', params: query }) + +/** 峰谷时刻表 */ +export const getPeakValley = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/trend/peakValley`, method: 'get', params: query }) + +// --- D. 分布分析 --- +/** 温度区间分布 */ +export const getIntervalDistribution = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/distribution/interval`, method: 'get', params: query }) + +/** 温度直方图 */ +export const getHistogram = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/distribution/histogram`, method: 'get', params: query }) + +/** 温度箱线图数据 */ +export const getBoxplotData = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/distribution/boxplot`, method: 'get', params: query }) + +/** 日历热力图 */ +export const getCalendarHeatmap = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/distribution/calendarHeatmap`, method: 'get', params: query }) + +/** 小时热力图 */ +export const getHourlyHeatmap = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/distribution/hourlyHeatmap`, method: 'get', params: query }) + +// --- E. 异常预警 --- +/** 高温事件 */ +export const getHighTempEvents = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/anomaly/highTemp`, method: 'get', params: query }) + +/** 低温事件 */ +export const getLowTempEvents = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/anomaly/lowTemp`, method: 'get', params: query }) + +/** 连续高温时段 */ +export const getContinuousHighTemp = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/anomaly/continuousHighTemp`, method: 'get', params: query }) + +/** 温升过快事件 */ +export const getRapidRiseEvents = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/anomaly/rapidRise`, method: 'get', params: query }) + +/** 温度抖动异常 */ +export const getJitterAnomalies = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/anomaly/jitter`, method: 'get', params: query }) + +// --- F. 对比分析 --- +/** 测点平均温度排行 */ +export const getAvgTempRanking = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/comparison/avgRanking`, method: 'get', params: query }) + +/** 测点稳定性排行 */ +export const getStabilityRanking = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/comparison/stabilityRanking`, method: 'get', params: query }) + +/** 今日vs昨日对比 */ +export const getDailyDiff = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/comparison/dailyDiff`, method: 'get', params: query }) + +/** 峰值对比 */ +export const getPeakCompare = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/comparison/peak`, method: 'get', params: query }) + +/** 波动幅度对比 */ +export const getFluctuationCompare = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/comparison/fluctuation`, method: 'get', params: query }) + +// --- G. 数据质量 --- +/** 入库延迟分布 */ +export const getDelayDistribution = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/quality/delayDistribution`, method: 'get', params: query }) + +/** 时间逆序可疑数据 */ +export const getTimeReversal = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/quality/timeReversal`, method: 'get', params: query }) + +/** 采样间隔异常 */ +export const getSamplingGapAnomalies = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/quality/samplingGap`, method: 'get', params: query }) + +/** 数据完整率 */ +export const getCompletenessRate = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/quality/completeness`, method: 'get', params: query }) + +/** 测点活跃度 */ +export const getMonitorActivity = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/quality/activity`, method: 'get', params: query }) + +// --- H. 高级分析 --- +/** 桑基图数据 */ +export const getSankeyData = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/advanced/sankey`, method: 'get', params: query }) + +/** 主题河流图数据 */ +export const getThemeRiverData = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/advanced/themeRiver`, method: 'get', params: query }) + +/** 矩形树图数据 */ +export const getTreemapData = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/advanced/treemap`, method: 'get', params: query }) + +/** 旭日图数据 */ +export const getSunburstData = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/advanced/sunburst`, method: 'get', params: query }) + +/** 平行坐标图数据 */ +export const getParallelData = (query: TempBoardQuery): AxiosPromise => + request({ url: `${BASE_URL}/advanced/parallel`, method: 'get', params: query }) diff --git a/src/api/monitor/operlog/types.ts b/src/api/monitor/operlog/types.ts index 10f65c7..ab3f375 100644 --- a/src/api/monitor/operlog/types.ts +++ b/src/api/monitor/operlog/types.ts @@ -4,6 +4,7 @@ export interface OperLogQuery extends PageQuery { operName: string; businessType: string; status: string; + operRemark: string; orderByColumn: string; isAsc: string; } @@ -28,6 +29,7 @@ export interface OperLogVO extends BaseEntity { errorMsg: string; operTime: string; costTime: number; + operRemark: string; } export interface OperLogForm { @@ -50,4 +52,5 @@ export interface OperLogForm { errorMsg: string; operTime: string; costTime: number; + operRemark: string; } diff --git a/src/views/ems/base/baseMonitorInfo/index.vue b/src/views/ems/base/baseMonitorInfo/index.vue index 5effc61..f62a7d9 100644 --- a/src/views/ems/base/baseMonitorInfo/index.vue +++ b/src/views/ems/base/baseMonitorInfo/index.vue @@ -37,7 +37,7 @@ 展开/折叠 - + - - - - - - - - - - - + + + + + + + + + + - - - + - - - - - - - - - - - +