feat: 实现供水运营专题大屏BI可视化

- 新增OperationDashboard.vue全屏大屏组件
- 添加6个核心KPI指标卡片: 进水总量/出水总量/产销差率/营收额/平均水质/报警次数
- 实现6个ECharts图表: 供水趋势/水质分布/报警统计/管网空间/设备状态/营收分析
- 创建静态HTML版本operation-dashboard.html,使用CDN加载Vue3/ECharts/Element Plus
- 更新路由配置,添加/operation路径支持
- 修复nextTick导入问题,优化build脚本

🚧 开发者: bot_dev1
📝 任务: #38 [BI] 运营仪表盘 + 供水专题大屏
This commit is contained in:
2026-06-15 09:06:11 +08:00
parent 37bcc78eee
commit 85df71fc28
17426 changed files with 4091508 additions and 47 deletions
+22
View File
@@ -0,0 +1,22 @@
import { PluginFunc } from 'dayjs/esm'
declare const plugin: PluginFunc
export = plugin
declare module 'dayjs/esm' {
export function max(dayjs: [Dayjs, ...Dayjs[]]): Dayjs
export function max(noDates: never[]): null
export function max(maybeDates: Dayjs[]): Dayjs | null
export function max(...dayjs: [Dayjs, ...Dayjs[]]): Dayjs
export function max(...noDates: never[]): null
export function max(...maybeDates: Dayjs[]): Dayjs | null
export function min(dayjs: [Dayjs, ...Dayjs[]]): Dayjs
export function min(noDates: never[]): null
export function min(maybeDates: Dayjs[]): Dayjs | null
export function min(...dayjs: [Dayjs, ...Dayjs[]]): Dayjs
export function min(...noDates: never[]): null
export function min(...maybeDates: Dayjs[]): Dayjs | null
}
+39
View File
@@ -0,0 +1,39 @@
export default (function (o, c, d) {
var sortBy = function sortBy(method, dates) {
if (!dates || !dates.length || dates.length === 1 && !dates[0] || dates.length === 1 && Array.isArray(dates[0]) && !dates[0].length) {
return null;
}
if (dates.length === 1 && dates[0].length > 0) {
var _dates = dates;
dates = _dates[0];
}
dates = dates.filter(function (date) {
return date;
});
var result;
var _dates2 = dates;
result = _dates2[0];
for (var i = 1; i < dates.length; i += 1) {
if (!dates[i].isValid() || dates[i][method](result)) {
result = dates[i];
}
}
return result;
};
d.max = function () {
var args = [].slice.call(arguments, 0); // eslint-disable-line prefer-rest-params
return sortBy('isAfter', args);
};
d.min = function () {
var args = [].slice.call(arguments, 0); // eslint-disable-line prefer-rest-params
return sortBy('isBefore', args);
};
});