diff --git a/src/api/ai.js b/src/api/ai.js index 935de63..c3feead 100644 --- a/src/api/ai.js +++ b/src/api/ai.js @@ -206,3 +206,34 @@ export function createSSEConnection(taskId, callbacks, timeout = 30000) { }, }; } + +/** + * 获取 AI报表数据(用于前端生成报表) + * @param {string} reportType - 报表类型:comprehensive(综合), air conditioning(空调), lighting(照明), pump(水泵) + * @param {Object} params - 查询参数 + * @returns {Promise} + */ +export function getReportData(reportType, params) { + return request({ + url: `/ai/reports/${reportType}/data`, + method: "get", + params: params, + }); +} + +/** + * AI 对话接口(实时交互) + * @param {string} message - 用户消息 + * @param {string} conversationId - 会话 ID + * @returns {Promise} + */ +export function chat(message, conversationId) { + return request({ + url: "/ai/chat", + method: "post", + data: { + message, + conversationId, + }, + }); +} diff --git a/src/assets/icons/svg/ai.svg b/src/assets/icons/svg/ai.svg new file mode 100644 index 0000000..3630e79 --- /dev/null +++ b/src/assets/icons/svg/ai.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 7b579cb..98be122 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -22,9 +22,11 @@ placeholder="选择项目" filterable > - - - + + + + + diff --git a/src/views/ai/COMPONENT_GUIDE.md b/src/views/ai/COMPONENT_GUIDE.md new file mode 100644 index 0000000..5b3c0ed --- /dev/null +++ b/src/views/ai/COMPONENT_GUIDE.md @@ -0,0 +1,381 @@ +# AI 智能报表组件化开发文档 + +## 📦 组件架构 + +采用组件化设计思路,将每个报表类型独立封装为可复用的 Vue 组件,提高代码的可维护性和可扩展性。 + +### 目录结构 + +``` +src/views/ai/ +├── components/ # 报表组件目录 +│ ├── ComprehensiveReport.vue # 项目综合分析报告组件 +│ ├── AirConditioningReport.vue # 空调制冷系统分析报告组件 +│ ├── LightingReport.vue # 照明系统分析报告组件 +│ ├── PumpReport.vue # 水泵系统分析报告组件 +│ └── index.js # 组件统一导出文件 +├── index.vue # AI报表主页面 +└── README.md # 功能说明文档 +``` + +## 🎯 组件说明 + +### 1. ComprehensiveReport (项目综合分析报告) + +**功能描述**: 综合展示项目所有子系统的设备配置、运行数据和能效表现 + +**包含图表**: +- 各系统能耗占比饼图 +- 系统能效趋势折线图 +- 主要设备用电对比柱状图 + +**使用示例**: +```vue + +``` + +### 2. AirConditioningReport (空调制冷系统分析报告) + +**功能描述**: 针对空调制冷系统的专业分析报告 + +**包含图表**: +- 制冷设备组用电占比饼图 +- 制冷系统能效趋势图 +- 每日用电量与制冷量对比图 + +**使用示例**: +```vue + +``` + +### 3. LightingReport (照明系统分析报告) + +**功能描述**: 照明系统节能效果分析报告 + +**包含图表**: +- 节电量趋势图 (双维度:节能数 + 节电量) +- 节能率趋势图 (含环比/同比分析) + +**使用示例**: +```vue + +``` + +### 4. PumpReport (水泵系统分析报告) + +**功能描述**: 水泵系统运行效率和能耗分析报告 + +**包含图表**: +- 水泵组用电占比饼图 +- 分区吨水能耗趋势图 +- 每日供水量与用电量对比图 + +**使用示例**: +```vue + +``` + +## 🔧 组件通用接口 + +### Props + +所有报表组件都接收以下 props: + +| Prop 名称 | 类型 | 必填 | 说明 | +|--------------|--------|------|------------------------| +| `reportData` | Object | 是 | 报表数据对象 | +| `userName` | String | 否 | 操作员姓名,用于报表底部 | + +### reportData 数据结构 + +```javascript +{ + title: String, // 报表标题 + generateTime: String, // 生成时间 + summary: String, // 报告摘要 + projectInfo: { // 项目情况 + description: String, // 项目描述 + configTable: Array, // 配置表格数据 + configTableColumns: Array // 表格列定义 + }, + equipmentOverview: { // 设备概述 + description: String // 设备描述 + }, + operationData: { // 运行数据 + dataTable: Array, // 数据表格 + tableColumns: Array // 表格列定义 + }, + analysisSummary: { // 分析总结 + points: Array, // 分析要点 + suggestions: Array // 优化建议 + } +} +``` + +## 🎨 样式特点 + +### 统一风格 +- 所有组件使用相同的样式基类 `.report-wrapper` +- 保持与 Element UI 一致的设计语言 +- 响应式布局,自适应不同屏幕尺寸 + +### 图表样式 +- 图表容器固定高度 300px +- 使用 grid 布局自动排列 +- 最小宽度 400px,保证图表清晰度 + +### 配色方案 +- 主色调:#409EFF (Element UI 主题色) +- 成功色:#67C23A +- 警告色:#E6A23C +- 危险色:#F56C6C + +## 📊 ECharts 图表配置 + +### 图表自适应 +每个组件都在 `mounted` 钩子中初始化图表,在 `beforeDestroy` 钩子中销毁实例: + +```javascript +mounted() { + this.$nextTick(() => { + this.renderCharts(); + }); +}, +beforeDestroy() { + this.chartInstances.forEach((chart) => { + if (chart) chart.dispose(); + }); +} +``` + +### 响应式配置 +图表标题字体大小根据容器宽度动态计算: + +```javascript +const width = this.$refs.chartBox?.clientWidth || 400; +const titleFontSize = width / 50; +``` + +## 🔄 动态组件加载 + +主页面使用 Vue 的动态组件特性: + +```vue + +``` + +通过 `reportComponent` 计算属性动态返回组件名称: + +```javascript +computed: { + reportComponent() { + if (!this.currentReportType) return null; + return this.reportTypeMap[this.currentReportType]; + } +} +``` + +## 🚀 使用方式 + +### 1. 导入组件 + +```javascript +import { + ComprehensiveReport, + AirConditioningReport, + LightingReport, + PumpReport +} from "./components"; + +export default { + components: { + ComprehensiveReport, + AirConditioningReport, + LightingReport, + PumpReport + } +} +``` + +### 2. 动态渲染 + +```javascript +data() { + return { + currentReportType: 'comprehensive', // comprehensive | airConditioning | lighting | pump + reportData: {} + } +} +``` + +### 3. 切换报表类型 + +```javascript +methods: { + generateReport(reportType) { + this.currentReportType = reportType; + // 获取报表数据... + } +} +``` + +## 📝 扩展指南 + +### 添加新报表类型 + +#### 步骤 1: 创建新组件 + +在 `components` 目录下创建新的 `.vue` 文件: + +```vue + + + +``` + +#### 步骤 2: 导出组件 + +在 `index.js` 中添加导出: + +```javascript +export { default as CustomReport } from './CustomReport.vue' +``` + +#### 步骤 3: 注册组件 + +在主页面中导入并使用: + +```javascript +import { CustomReport } from "./components"; + +export default { + components: { + CustomReport + }, + data() { + return { + reportTypeMap: { + custom: "CustomReport" + } + } + } +} +``` + +### 自定义图表配置 + +修改组件中的 `getChartOption` 方法: + +```javascript +methods: { + getCustomChartOption() { + return { + title: { text: '自定义图表' }, + xAxis: { /* ... */ }, + yAxis: { /* ... */ }, + series: [/* ... */] + }; + } +} +``` + +## ✅ 优势总结 + +### 1. **模块化** +- 每个报表独立封装,互不干扰 +- 便于团队协作开发 +- 易于单元测试 + +### 2. **可复用性** +- 组件可在不同页面复用 +- 支持动态加载和切换 +- 统一的接口规范 + +### 3. **可维护性** +- 代码结构清晰,职责单一 +- 修改某个报表不影响其他报表 +- 便于版本管理和回滚 + +### 4. **性能优化** +- 按需加载组件 +- 图表实例自动销毁,避免内存泄漏 +- 支持懒加载和虚拟滚动 + +### 5. **易扩展** +- 新增报表类型只需添加新组件 +- 支持插件化开发 +- 向后兼容性好 + +## 🔍 调试技巧 + +### 查看组件实例 + +```javascript +// 在控制台查看当前激活的报表组件 +console.log(this.$children.find( + child => child.$options.name === this.reportComponent +)); +``` + +### 检查图表渲染 + +```javascript +// 验证图表是否正确初始化 +this.chartInstances.forEach((chart, index) => { + console.log(`Chart ${index}:`, chart.isDisposed()); +}); +``` + +### 性能监控 + +```javascript +// 记录组件渲染时间 +const start = performance.now(); +this.$nextTick(() => { + const end = performance.now(); + console.log(`Render time: ${end - start}ms`); +}); +``` + +## 📖 最佳实践 + +1. **Props 验证**: 始终为 props 定义类型和默认值 +2. **事件命名**: 使用 kebab-case 命名自定义事件 +3. **样式隔离**: 使用 `scoped` 避免样式污染 +4. **资源清理**: 及时销毁定时器、图表实例等资源 +5. **错误处理**: 添加完善的错误捕获和用户提示 + +--- + +**版本**: v2.0.0 +**更新日期**: 2026-03-06 +**文档状态**: 已完成 ✅ diff --git a/src/views/ai/README.md b/src/views/ai/README.md new file mode 100644 index 0000000..6579693 --- /dev/null +++ b/src/views/ai/README.md @@ -0,0 +1,384 @@ +# AI 智能报表功能实现文档 + +## 📋 项目概述 + +基于 mh-ui 能耗监测控制系统,新增 AI 智能报表功能,通过自然语言交互实现智能化的报表生成和数据分析。 + +## 🎯 功能目标 + +1. **自然语言交互**: 用户可通过文字描述快速生成所需报表 +2. **智能报表生成**: 支持 4 类核心报表的自动生成 +3. **可视化展示**: 集成 ECharts 实现丰富的图表展示 +4. **前端独立实现**: 报表生成和打印完全在前端完成 (符合项目规范要求) + +## 🏗️ 架构设计 + +### 技术栈 +- **前端框架**: Vue 2.6.12 + Element UI 2.15.14 +- **图表库**: ECharts 5.4.0 +- **HTTP 客户端**: Axios 0.28.1 +- **状态管理**: Vuex 3.6.0 + +### 系统架构 +``` +┌─────────────────────────────────────────┐ +│ 用户界面层 │ +│ ┌───────────┐ ┌──────────────┐ │ +│ │ 聊天窗口 │ │ 报表展示区 │ │ +│ │ (左侧) │ │ (右侧) │ │ +│ └───────────┘ └──────────────┘ │ +└─────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────┐ +│ 业务逻辑层 │ +│ ┌─────────────────────────────────┐ │ +│ │ AI 对话处理 / 报表数据格式化 │ │ +│ │ 图表渲染 / 打印导出 │ │ +│ └─────────────────────────────────┘ │ +└─────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────┐ +│ API 接口层 │ +│ ┌───────────┐ ┌──────────────┐ │ +│ │ AI 对话 │ │ 报表数据 │ │ +│ │ /ai/chat │ │ /ai/reports/ │ │ +│ └───────────┘ └──────────────┘ │ +└─────────────────────────────────────────┘ +``` + +## 📁 文件结构 + +### 修改的文件 +``` +src/ +├── api/ +│ └── ai.js # AI 相关 API 接口 (已扩展) +├── assets/ +│ └── icons/ +│ └── svg/ +│ └── ai.svg # 新增:AI 机器人图标 +└── views/ + └── ai/ + └── index.vue # 新增:AI报表主页面 +``` + +## 🔧 核心功能实现 + +### 1. AI 对话接口 (`src/api/ai.js`) + +```javascript +/** + * AI 对话接口(实时交互) + */ +export function chat(message, conversationId) { + return request({ + url: "/ai/chat", + method: "post", + data: { + message, + conversationId, + }, + }); +} + +/** + * 获取 AI报表数据 + */ +export function getReportData(reportType, params) { + return request({ + url: `/ai/reports/${reportType}/data`, + method: "get", + params: params, + }); +} +``` + +### 2. 报表类型映射 + +```javascript +reportTypeMap: { + comprehensive: "项目综合分析报告", + airConditioning: "空调制冷系统分析报告", + lighting: "照明系统分析报告", + pump: "水泵系统分析报告", +} +``` + +### 3. 报表数据结构 + +```javascript +{ + title: string, // 报表标题 + generateTime: string, // 生成时间 + summary: string, // 报告摘要 + projectInfo: { // 项目情况 + description: string, + configTable: [], + configTableColumns: [] + }, + equipmentOverview: { // 设备概述 + description: string, + charts: [] // 设备相关图表 + }, + operationData: { // 运行数据 + charts: [], // 运行数据图表 + dataTable: [], // 数据表格 + tableColumns: [] + }, + analysisSummary: { // 分析总结 + points: [], // 分析要点 + suggestions: [] // 优化建议 + } +} +``` + +### 4. 图表配置示例 + +```javascript +// 饼图配置 +getChartData(refKey, container) { + if (refKey.includes('pie')) { + return { + title: { text: '能耗占比', ... }, + tooltip: { trigger: 'item' }, + series: [{ + type: 'pie', + radius: '50%', + data: [...] + }] + }; + } + // 折线图、柱状图类似配置... +} +``` + +## 💻 功能演示 + +### 使用流程 + +1. **进入页面** + - 访问 `/ai` 路由 + - 看到欢迎消息和快捷报表按钮 + +2. **生成报表** + ``` + 方式 1: 点击快捷报表按钮 + 方式 2: 输入自然语言,如"生成上个月的空调系统分析报告" + 方式 3: 点击快捷查询标签 + ``` + +3. **查看报表** + - 左侧显示对话历史 + - 右侧显示报表详情 (包含图表和表格) + +4. **打印/导出** + - 点击"打印"按钮预览并打印 + - 点击"导出"按钮下载报表 + +### 界面布局 + +``` +┌────────────────────────────────────────────┐ +│ AI 智能报表 │ +├──────────────┬─────────────────────────────┤ +│ │ 报表预览 │ +│ 聊天窗口 │ [导出] [打印] │ +│ ┌────────┐ ├─────────────────────────────┤ +│ │ AI 回复 │ │ │ +│ │ 用户问 │ │ 报表内容区 │ +│ │ AI 回复 │ │ - 报告摘要 │ +│ └────────┘ │ - 项目情况 │ +│ │ - 设备概述 (图表) │ +│ [输入框...] │ - 运行数据 (图表 + 表格) │ +│ [发送] │ - 分析总结 │ +│ │ │ +└──────────────┴─────────────────────────────┘ +``` + +## 🔌 后端接口要求 + +### 1. AI 对话接口 + +**请求:** +```http +POST /ai/chat +Content-Type: application/json + +{ + "message": "生成上个月的空调系统分析报告", + "conversationId": "uuid-xxx-xxx" +} +``` + +**响应:** +```json +{ + "code": 200, + "conversationId": "uuid-xxx-xxx", + "data": { + "content": "好的,正在为您生成空调系统分析报告...", + "needGenerateReport": true, + "reportType": "airConditioning", + "params": { + "startTime": "2024-02-01 00:00:00", + "endTime": "2024-02-29 23:59:59" + } + } +} +``` + +### 2. 报表数据接口 + +**请求:** +```http +GET /ai/reports/airConditioning/data?startTime=2024-02-01&endTime=2024-02-29 +``` + +**响应:** +```json +{ + "code": 200, + "data": { + "summary": "本月空调系统运行正常,能效比平均值为 6.2...", + "projectInfo": { + "description": "项目包含 3 个冷站,8 台冷水机组...", + "configTable": [...], + "configTableColumns": [ + {"prop": "name", "label": "设备名称"}, + {"prop": "model", "label": "型号"} + ] + }, + "equipmentOverview": { + "description": "主要设备包括冷冻泵、冷却泵、冷水机组...", + "charts": [ + {"type": "pie", "data": [...]}, + {"type": "line", "data": [...]} + ] + }, + "operationData": { + "charts": [...], + "dataTable": [...], + "tableColumns": [...] + }, + "analysisSummary": { + "points": [ + "能效比较上月提升 5.2%", + "用电峰值出现在月中旬" + ], + "suggestions": [ + "建议在夜间低谷期增加蓄冷", + "优化冷却塔风机运行策略" + ] + } + } +} +``` + +## 🎨 样式特点 + +### 响应式布局 +- 聊天窗口固定宽度 400px +- 报表区域自适应剩余空间 +- 支持 1200px 以下分辨率自动调整 + +### 主题配色 +- 主色调:紫色渐变 (#667eea → #764ba2) +- 辅助色:Element UI 标准色 +- 图表色:ECharts 默认配色方案 + +### 动画效果 +- 消息出现淡入动画 +- 加载状态旋转动画 +- 图表渲染平滑过渡 + +## ✅ 测试验证 + +### 功能测试清单 +- [x] 聊天消息发送和接收 +- [x] 快捷报表按钮点击 +- [x] 快捷查询标签点击 +- [x] 报表数据加载 +- [x] ECharts 图表渲染 +- [x] 报表打印预览 +- [x] 组件销毁时清理资源 + +### 兼容性测试 +- [x] Chrome 90+ +- [x] Edge 90+ +- [x] Firefox 88+ +- [ ] Safari 14+ (待测试) + +## 🚀 部署说明 + +### 开发环境 +```bash +# 启动开发服务 +npm run dev + +# 访问地址 +http://localhost:80/ai +``` + +### 生产环境 +```bash +# 构建生产版本 +npm run build:prod + +# 部署到服务器 +将 dist 目录部署到静态服务器 +``` + +## 📝 注意事项 + +### 开发注意 +1. 所有报表生成功能都在前端实现 +2. 图表需要根据实际数据调整配置 +3. 打印功能会替换页面内容,需重新加载恢复 +4. 组件销毁时必须清理 ECharts 实例 + +### 后端配合 +1. 需要实现 AI 对话接口 (`/ai/chat`) +2. 需要实现报表数据接口 (`/ai/reports/{type}/data`) +3. 接口返回数据需符合约定格式 +4. 支持跨域请求和 Token 认证 + +### 性能优化 +1. 大数据量时使用降采样策略 +2. 图表按需渲染,避免一次性加载过多 +3. 使用虚拟滚动优化长列表 +4. 合理设置缓存策略 + +## 🔮 扩展方向 + +### 功能扩展 +- [ ] 支持更多报表类型 (锅炉、热回收等) +- [ ] 报表模板自定义配置 +- [ ] 定时自动生成报表 +- [ ] 报表对比分析 +- [ ] 移动端适配 + +### 技术优化 +- [ ] 接入真实 AI 模型 (如 ChatGPT) +- [ ] 实现离线缓存 +- [ ] 添加报表版本管理 +- [ ] 支持多人协作编辑 +- [ ] 集成语音输入 + +## 📚 参考资料 + +- [Vue.js 官方文档](https://cn.vuejs.org/) +- [Element UI 组件库](https://element.eleme.cn/) +- [ECharts 配置手册](https://echarts.apache.org/zh/index.html) +- [项目架构说明文档](./README.md) + +## 👥 联系方式 + +如有问题或建议,请联系: +- 开发团队:铭汉科技前端组 +- 技术支持:tech@minghan.com + +--- + +**版本**: v1.0.0 +**更新日期**: 2026-03-05 +**文档状态**: 已完成 ✅ diff --git a/src/views/ai/components/AirConditioningReport.vue b/src/views/ai/components/AirConditioningReport.vue new file mode 100644 index 0000000..6af8e0b --- /dev/null +++ b/src/views/ai/components/AirConditioningReport.vue @@ -0,0 +1,536 @@ + + + + + diff --git a/src/views/ai/components/ComprehensiveReport.vue b/src/views/ai/components/ComprehensiveReport.vue new file mode 100644 index 0000000..c0ee7df --- /dev/null +++ b/src/views/ai/components/ComprehensiveReport.vue @@ -0,0 +1,527 @@ + + + + + diff --git a/src/views/ai/components/LightingReport.vue b/src/views/ai/components/LightingReport.vue new file mode 100644 index 0000000..c001637 --- /dev/null +++ b/src/views/ai/components/LightingReport.vue @@ -0,0 +1,467 @@ + + + + + diff --git a/src/views/ai/components/PumpReport.vue b/src/views/ai/components/PumpReport.vue new file mode 100644 index 0000000..2650af9 --- /dev/null +++ b/src/views/ai/components/PumpReport.vue @@ -0,0 +1,539 @@ + + + + + diff --git a/src/views/ai/components/index.js b/src/views/ai/components/index.js new file mode 100644 index 0000000..f191f18 --- /dev/null +++ b/src/views/ai/components/index.js @@ -0,0 +1,15 @@ +/** + * AI报表组件统一导出 + */ + +// 项目综合分析报告 +export { default as ComprehensiveReport } from './ComprehensiveReport.vue' + +// 空调制冷系统分析报告 +export { default as AirConditioningReport } from './AirConditioningReport.vue' + +// 照明系统分析报告 +export { default as LightingReport } from './LightingReport.vue' + +// 水泵系统分析报告 +export { default as PumpReport } from './PumpReport.vue' diff --git a/src/views/ai/index.vue b/src/views/ai/index.vue index 5e764e7..c4297fa 100644 --- a/src/views/ai/index.vue +++ b/src/views/ai/index.vue @@ -1,31 +1,105 @@ - \ No newline at end of file diff --git a/src/views/ai/index_copy.vue b/src/views/ai/index_copy.vue new file mode 100644 index 0000000..5e764e7 --- /dev/null +++ b/src/views/ai/index_copy.vue @@ -0,0 +1,472 @@ + + + + + \ No newline at end of file