# 决策模块重构设计方案 > 版本:v1.0 | 日期:2026-09-09 | 模块:yudao-module-bi 决策支持(decision) > 对齐目标:数据看板与多维度报表、实时 KPI 监控与异常预警、历史数据驱动的负荷预测与决策研判 --- ## 一、背景与目标 现有 `yudao-module-bi` 决策支持子模块已具备代码骨架(KPI / 预警 / 预测 / 看板四个域),但**配置数据全部为空**(`bi_kpi_definition`、`bi_dashboard`、`bi_chart_config`、`bi_alert_rule`、`bi_forecast_data` 均为 0 条),尚未与系统业务数据打通。 本次重构围绕三大业务目标: | # | 目标 | 落地形态 | |---|------|----------| | 1 | 整合用电营销、生产运维、物资采购、库存、能耗等核心数据 | 配置式可视化看板(大屏)+ 多维度报表 | | 2 | 实时监控供电量、设备运行、生产效率、质量、成本、安全等核心 KPI,异常自动预警 | KPI 指标库 + 快照聚合 + 预警规则中心 | | 3 | 基于历史数据开展负荷预测、需求分析、趋势研判 | Java 统计预测引擎,支撑电网调度、运维计划、采购策略、客户经营决策 | --- ## 二、现状分析与数据摸底 ### 2.1 现有决策模块骨架(代码已就绪) | 域 | 表 | 服务 | 控制器 | 备注 | |----|----|------|--------|------| | KPI 指标定义 | `bi_kpi_definition` | BiKpiDefinitionService | DecisionKpiDefinitionController | SQL 配置式,`query_sql` 实时执行 | | KPI 聚合展示 | — | BiDecisionKpiService | DecisionKpiController | overview/detail/category/refresh | | 预警规则 | `bi_alert_rule` | BiAlertRuleService | DecisionAlertRuleController | 阈值 + 比较符 + 通知方式 | | 预警记录 | `bi_alert_record` | BiAlertRecordService | DecisionAlertController | 分页/未处理数/确认/处理 | | 负荷预测 | `bi_forecast_data` | BiForecastService | DecisionForecastController | 现为 SMA 简单移动平均占位,支持联动生成工单 | | 仪表盘 | `bi_dashboard` | DashboardService | DashboardController | 按 `{code}/data` 返回图表数据 | | 图表配置 | `bi_chart_config` | BiChartConfigService | BiChartConfigController | SQL + chartType + position + chartOptions | | 数据源配置 | `bi_data_source_config` | BiDataSourceConfigService | BiDataSourceConfigController | 多数据源预留 | ### 2.2 预警定时任务(已存在) `AlertEvaluationTask` 每 5 分钟(可配 `bi.alert.evaluation.interval`)扫描启用预警规则 → 执行 KPI SQL → 与阈值比较 → 生成预警记录,并对同一 KPI 未处理预警去重。 ### 2.3 业务数据摸底(mom-xgdl 库 2026-09-09) | 数据域 | 表 | 现状 | 说明 | |--------|----|------|------| | 设备 | `mes_dv_machinery` | 1 台(生产机,status=1,效率100) | status:0-停 / 1-运行 | | 遥测 | `mes_dv_telemetry` | 296 条(4 台设备) | 工艺参数(温度/匝数等),含 `whether_anomaly` 异常标志、`telemetry_data_time`、`shift_name` | | 生产 | `mes_pro_work_order / task / feedback` | 0 | 工单/任务/报工 | | 质量 | `mes_qc_iqc/ipqc/oqc/ncr` | 0 | 来料/过程/出货/不合格品 | | 库存 | `mes_wm_material_stock/transaction` | 1+1 | 库存余额 + 流水 | | 安灯 | `mes_pro_andon_record` | 0 | 现场异常呼叫(安全监控入口) | | 采购 | `erp_purchase_request/order` | 0 | 采购申请/订单 | | 销售 | `erp_sale_order` | 0 | 销售订单 | | 财务 | `erp_finance_receipt/payment` | 0 | 收款/付款 | | 客户 | `crm_customer/contract/receivable` | 0 | 客户/合同/回款 | > **结论**:当前处于开发/试运行初期,业务数据未铺开。KPI 指标、预警规则、看板图表一律按**真实表结构 + 真实字段**配置,数据积累后自动出值;设备运行与遥测异常指标当前即有真实数据支撑。 ### 2.4 关键数据缺口 | 缺口 | 现状 | 本次策略 | |------|------|----------| | 能耗/供电量数据 | 无独立用电量记录表;`mes_dv_telemetry` 为工艺参数遥测,无功率/电量参数 | **从遥测参数聚合**:按 `param_name` 匹配 功率/电量/电流 类参数聚合;无匹配参数时 KPI 返回 0 占位并保留接口 | | 安全数据 | 无事故/隐患台账,仅 `mes_pro_andon_record` 安灯记录 | 安全 KPI 基于安灯记录(数量/未处置数),隐患台账留待后续 | | KPI 历史 | 无历史值存储,无法做趋势/同比环比/预测 | **新增 `bi_kpi_value_history` 快照表 + 定时聚合任务** | --- ## 三、总体架构设计 ``` ┌────────────────────────────────────────────────────────────────┐ │ 管理层(大屏/报表) │ │ bi_dashboard {code}/data → 配置式大屏(采购销售/仓库/生产设备 │ │ /质量/能耗/营销 + 决策总览) │ │ 多维度报表:按 时间 / 车间 / 设备类型 / 物料分类 / 客户 / 供应商 │ │ 交叉分析(新增 /bi/decision/report 汇总接口) │ ├────────────────────────────────────────────────────────────────┤ │ 监控层(KPI + 预警) │ │ bi_kpi_definition(SQL 指标库) │ │ ├── 实时层:BiDecisionKpiService 按需实时执行 SQL │ │ ├── 快照层:(新增)KpiSnapshotTask 定时写入 bi_kpi_value_history│ │ └── 预警层:AlertEvaluationTask 评估 bi_alert_rule → bi_alert_record│ ├────────────────────────────────────────────────────────────────┤ │ 决策层(预测/研判) │ │ BiForecastEngine(统计预测引擎:SMA/WMA/线性回归/同比环比/季节指数)│ │ ├── 基于 bi_kpi_value_history 的 KPI 趋势预测(负荷/产量/采购/回款)│ │ └── 联动:预测结果 → 生成生产工单(复用 generate-work-order) │ └────────────────────────────────────────────────────────────────┘ ``` ### 3.1 分层职责 | 层 | 输入 | 处理 | 输出 | |----|------|------|------| | 数据接入 | 各业务表(mes/erp/crm/srm)+ 遥测 | 跨模块 SQL(单库 JdbcTemplate) | KPI 当前值 | | 监控 | KPI 指标库 | 实时查询 + 定时快照 + 阈值评估 | overview / 快照历史 / 预警记录 | | 决策 | 快照历史 | 统计预测引擎 | 预测序列 + 置信区间 + 工单联动 | | 展示 | 看板/图表配置 | 配置驱动组装 | 大屏 / 报表 | ### 3.2 实时性设计 | 层级 | 机制 | 周期 | |------|------|------| | KPI 实时查询 | 前端按 `refreshInterval` 调 `overview/{kpiCode}` | 按需 | | KPI 快照 | 新增 `KpiSnapshotTask` 聚合至 `bi_kpi_value_history` | 默认 1 小时(可配 `bi.kpi.snapshot.interval`) | | 预警评估 | 现有 `AlertEvaluationTask` | 默认 5 分钟(可配 `bi.alert.evaluation.interval`) | | 遥测异常 | 直接聚合 `mes_dv_telemetry.whether_anomaly` | 随快照 | --- ## 四、KPI 指标体系设计 统一编码规则:`{域简称}_{指标英文}`,共 7 类(category 扩展原注释枚举)。 ### 4.1 域划分与指标清单 #### A. 供电电量 / 能耗域(category = `energy`) | code | 名称 | 单位 | 数据来源 SQL 逻辑 | |------|------|------|--------------------| | energy_telemetry_devices | 遥测在采设备数 | 台 | `COUNT(DISTINCT tb_device_id)` from mes_dv_telemetry(近24h) | | energy_telemetry_points | 在采测点总数 | 个 | `COUNT(*)` from mes_dv_telemetry(近24h) | | energy_anomaly_rate | 遥测异常率 | % | `SUM(whether_anomaly)/COUNT(*)` 近24h | | energy_power_load | 实时功率负荷 | kW | `SUM(timely_value)` where param_name like '%功率%'(无参数返回0占位) | | energy_power_consumption | 周期用电量 | kWh | 聚合电度类参数差值(预留模型,本期占位) | #### B. 设备运行域(category = `device_operation`) | code | 名称 | 单位 | SQL 逻辑 | |------|------|------|----------| | device_total | 设备总数 | 台 | `COUNT(*)` from mes_dv_machinery | | device_running | 运行设备数 | 台 | `COUNT(*) where status=1` | | device_operation_rate | 开机率 | % | 运行 / 总数 | | device_avg_efficiency | 平均生产效率 | 件/时 | `AVG(production_efficiency)` | | device_need_repair | 待维修工单 | 个 | `COUNT(*) where status<终态` from mes_dv_repair | | device_overdue_mainten | 到期未保养设备 | 台 | `last_mainten_time < 计划周期`(预留,返回0) | #### C. 生产效率域(category = `production`) | code | 名称 | 单位 | SQL 逻辑 | |------|------|------|----------| | prod_work_order_total | 工单总数 | 单 | `COUNT(*)` from mes_pro_work_order(近30天) | | prod_work_order_finish | 完工工单数 | 单 | `status=已完工` | | prod_plan_achieve_rate | 工单计划达成率 | % | 完工量之和 / 计划量之和 | | prod_feedback_qualified | 报工合格率 | % | SUM(qualified)/SUM(feedback) from mes_pro_feedback | | prod_daily_output | 日产量 | 件 | SUM(feedback_quantity) 当日 | | prod_task_duration | 工单平均工期 | 天 | AVG(duration) from mes_pro_task | #### D. 质量域(category = `quality`) | code | 名称 | 单位 | SQL 逻辑 | |------|------|------|----------| | quality_iqc_pass_rate | 来料检验合格率 | % | SUM(qualified)/SUM(check) from mes_qc_iqc | | quality_ipqc_pass_rate | 过程检验合格率 | % | from mes_qc_ipqc | | quality_oqc_pass_rate | 出货检验合格率 | % | from mes_qc_oqc | | quality_ncr_count | 不合格品报告数 | 单 | `COUNT(*)` from mes_qc_ncr | #### E. 物资采购 / 成本域(category = `procurement`) | code | 名称 | 单位 | SQL 逻辑 | |------|------|------|----------| | pur_request_amount | 采购申请金额(近30天) | 元 | `SUM(total_price)` from erp_purchase_request | | pur_order_amount | 采购订单金额(近30天) | 元 | `SUM(total_price)` from erp_purchase_order | | pur_order_pending_in | 待入库采购量 | 件 | `SUM(total_count-in_count)` from erp_purchase_order | | stock_amount_value | 库存货值 | 元 | `SUM(stock.quantity*item.cost_price)` from mes_wm_material_stock join mdm_item | | stock_low_alert | 库存低于安全库存物料数 | 个 | `quantity < item.safety_stock` | | cost_payment_amount | 应付款(近30天) | 元 | `SUM(payment_price)` from erp_finance_payment | #### F. 用电营销 / 客户经营域(category = `sales`) | code | 名称 | 单位 | SQL 逻辑 | |------|------|------|----------| | sale_order_amount | 销售订单金额(近30天) | 元 | `SUM(total_price)` from erp_sale_order | | crm_contract_amount | 合同签订金额 | 元 | `SUM(total_price)` from crm_contract(审核通过) | | crm_receivable_amount | 实际回款金额 | 元 | `SUM(price)` from crm_receivable | | crm_customer_count | 客户总数 | 个 | `COUNT(*)` from crm_customer | | crm_receivable_overdue | 逾期未回款金额 | 元 | 佣金计划 `receivable_plan` 超 return_time 未回 | | srm_avg_score | 供应商平均综合评分 | 分 | `AVG(composite_score)` from srm_supplier_evaluation | #### G. 安全域(category = `safety`) | code | 名称 | 单位 | SQL 逻辑 | |------|------|------|----------| | safety_andon_count | 安灯报警数(近30天) | 次 | `COUNT(*)` from mes_pro_andon_record | | safety_andon_unhandled | 未处置安灯数 | 个 | `COUNT(*) where status=未处置` | ### 4.2 维度设计 | 维度 | 来源 | 用途 | |------|------|------| | 时间 | 日 / 周 / 月 / 年 | 全部指标趋势 | | 车间 | `mes_dv_machinery.workshop_id`、`mes_pro_work_order` | 设备/生产 | | 设备类型 | `mes_dv_machinery_type` | 设备/能耗 | | 物料分类 | `mdm_item` 分类 | 采购/库存 | | 客户 | `crm_customer` | 营销/回款 | | 供应商 | `srm_supplier` / `erp_supplier` | 采购/成本 | --- ## 五、KPI 历史快照与聚合(本次新增) ### 5.1 新增表 `bi_kpi_value_history` | 字段 | 类型 | 说明 | |------|------|------| | id | bigint | 主键 | | kpi_id | bigint | 关联 bi_kpi_definition.id | | kpi_code | varchar(64) | KPI 编码(冗余) | | kpi_name | varchar(128) | KPI 名称(冗余) | | category | varchar(32) | 分类 | | kpi_value | decimal(18,4) | 快照值 | | snapshot_time | datetime | 快照时间点(整点) | | period_type | varchar(16) | 统计周期:hour/day/week/month | | dimension_value | varchar(64) | 业务维度值(预留,默认 all) | | remark | varchar(255) | 备注 | | 审计字段 | — | creator/create_time/updater/update_time/deleted | 索引:`idx_kpi_time(kpi_code, snapshot_time)`,`idx_category_time(category, snapshot_time)`。 ### 5.2 新增聚合任务 `KpiSnapshotTask` - 定时(默认每小时 `0 0 * * * *`,可配 `bi.kpi.snapshot.cron`)扫描 `status=1` 的 KPI 定义 - 执行每条 `query_sql` 取当前值,写入 `bi_kpi_value_history` - 同名 KPI 同一整点去重(覆盖式更新或跳过去重,取最新) - 失败 SQL 记日志降级,不中断整体 ### 5.3 新增查询接口(趋势研判) | 方法 | 路径 | 说明 | |------|------|------| | GET | `/bi/decision/kpi/trend/{kpiCode}?beginTime=&endTime=&periodType=` | KPI 历史快照趋势(供报表/大屏折线) | | GET | `/bi/decision/kpi/compare/{kpiCode}` | 同比环比(较上月/去年同期),基于快照 | --- ## 六、预警规则体系 ### 6.1 规则配置(本次落库示例) | KPI | 规则 | 级别 | 阈值 | 比较符 | |-----|------|------|------|--------| | energy_anomaly_rate | 遥测异常率过高 | 警告 | 5 (%) | >= | | device_operation_rate | 开机率过低 | 严重 | 60 (%) | < | | device_avg_efficiency | 设备效率过低 | 警告 | 80 (件/时) | < | | quality_oqc_pass_rate | 出货检验合格率过低 | 严重 | 95 (%) | < | | stock_low_alert | 库存低于安全库存物料数超限 | 严重 | 10 (个) | > | | safety_andon_unhandled | 未处置安灯持续累积 | 紧急 | 1 (个) | > | | crm_receivable_overdue | 逾期回款金额过大 | 严重 | 500000 (元) | > | > 阈值仅为初始建议值,上线后按实际水平调整。`notificationType` 统一配置为 `system`(站内信/待办集成,后续扩展 message/email)。 ### 6.2 预警生命周期 ``` 规则启用 → 定时评估(5min)→ 命中阈值 → 生成 bi_alert_record(status=0) → 前端"预警中心"展示 + 未处理计数 → 确认(confirm) / 处理(handle) → 关闭 ``` 去重策略:同一 KPI 存在未处理预警时不再重复生成(现有逻辑)。 --- ## 七、能耗/供电量聚合方案(从遥测参数聚合) ### 7.1 处理原则 - 以 `mes_dv_telemetry` 为唯一实时能耗来源,按 `param_name` 特征匹配能力参数: - 功率类:`param_name LIKE '%功率%'` → `energy_power_load`(实时功率,kW) - 电量类:`param_name LIKE '%电量%' OR '%用电%' OR '%电度%'` → 电量采集(预留) - 电流/电压类:`%电流%`、`%电压%` → 电能质量辅助指标 - 当前测点无能力参数时,相关 KPI 返回 0 / 无数据占位,**不伪造数据**,待测点补充后自动出值。 ### 7.2 能耗聚合模型(本次落地) | 指标 | 聚合口径 | |------|----------| | 实时功率负荷 | 当前批次 `timely_value` 求和,按设备 | | 班次能耗估算 | 按 `shift_name` 分组 `AVG(timely_value)` × 运行时长(预留) | | 日用电量 | 电度类参数 `max_value-min_value` 跨日回差(预留模型,表结构就绪) | --- ## 八、Java 统计预测引擎设计 ### 8.1 模型库(本次落地) | 模型 | 算法 | 适用场景 | 实现 | |------|------|----------|------| | SMA | 简单移动平均(窗口 12) | 平稳序列 | 现有逻辑保留 | | WMA | 加权移动平均(近期权重递增) | 有轻微趋势 | 新增 | | LR | 一元线性回归(最小二乘) | 线性趋势(产量/采购/回款) | 新增 | | SEASONAL | 季节指数(按周期归一化) | 周期性负荷 | 新增 | | YOY/QOQ | 同比/环比外推 | 营销类快速预估 | 新增 | ### 8.2 引擎结构 ``` BiForecastEngine(新增,纯 Java 工具类) ├─ sma(List, window) ├─ wma(List, window) ├─ linearRegression(List) → slope/intercept/预测下N期 ├─ seasonalIndex(List, period) → 季节因子 + 去季节预测 └─ forecastByModel(code, modelType, data, periods) → 统一出口 ``` ### 8.3 接口扩展(BiForecastService + Controller) | 方法 | 路径 | 说明 | |------|------|------| | GET | `/bi/decision/kpi/trend/{kpiCode}?beginTime=&endTime=&periodType=` | KPI 历史快照趋势取数(喂给引擎) | | POST | `/bi/decision/forecast/generate` 扩展参数 `model=SMA\|WMA\|LR\|SEASONAL` + `periods=` | 按模型生成预测,落 `bi_forecast_data` | | POST | `/bi/decision/forecast/generate-from-kpi?kpiCode=&model=&periods=` | 从 KPI 快照历史生成预测(负荷/产量/采购/回款) | | POST | `/bi/decision/forecast/generate-work-order` | 预测联动创建生产工单(现有,延续) | 预测结果字段沿用 `bi_forecast_data`:forecast_value / lowerBound / upperBound / confidenceLevel(95%) / modelVersion(如 `v2.0-lr`)。 ### 8.4 决策支撑场景映射 | 决策场景 | 预测对象 | 数据源 | 输出 | |----------|----------|--------|------| | 电网调度/产能排程 | 日产量、工单负荷 | prod_daily_output 快照 | 未来 7/30 天产量预测 | | 运维计划 | 设备效率、异常率 | device_avg_efficiency、energy_anomaly_rate | 异常趋势预警 | | 采购策略 | 采购金额、库存周转 | pur_order_amount、stock_low_alert | 下月采购量预测 | | 客户经营 | 回款、合同 | crm_receivable_amount | 下月回款预测 | --- ## 九、看板与多维度报表方案 ### 9.1 看板布局(bi_dashboard + bi_chart_config 落库) | code | 名称 | 覆盖图表(chart_config) | |------|------|--------------------------| | decision_overview | 决策总览大屏 | 核心 KPI 卡片(number)+ 各域趋势折线 | | purchase_sales | 采购销售大屏 | 采购金额趋势/销售订单趋势/来票额/回款(沿用既有 code) | | warehouse | 仓库大屏 | 库存货值/低库存/出入库流水/库位分布 | | production_equipment | 生产设备大屏 | 设备开机率/效率/工单达成率/产量趋势/遥测异常 | | quality | 质量大屏 | 各检验合格率/NCR 数量 | | energy | 能耗监控大屏(新增) | 实时功率负荷/在采测点/异常率/班次能耗 | | sales_customer | 营销客户大屏(新增) | 合同签定/回款/逾期/客户数/供应商评分 | ### 9.2 多维度报表(新增 `/bi/decision/report`) | 方法 | 路径 | 说明 | |------|------|------| | POST | `/bi/decision/report/cross` | 交叉表:时间 × 车间/客户/供应商/物料分类 × 指标值 | | GET | `/bi/decision/report/topn?category=&dimension=&limit=` | TOP N 排行(客户回款 TOP、不良 TOP、缺料 TOP) | 响应统一为 `{ columns, rows }` 结构,前端渲染普通表格/透视图。 --- ## 十、数据库变更清单 | 操作 | 对象 | 说明 | |------|------|------| | 新建表 | `bi_kpi_value_history` | KPI 历史快照 | | 初始化数据 | `bi_kpi_definition` | 约 26 条 KPI(上表全部 code) | | 初始化数据 | `bi_alert_rule` | 约 7 条预警规则 | | 初始化数据 | `bi_dashboard` | 7 个看板 | | 初始化数据 | `bi_chart_config` | 各看板图表(约 30 张) | | 不改表 | `bi_forecast_data` | 现有结构够用,仅扩展 modelVersion 使用 | > 业务表零改动:KPI 体系只读各业务表,不加任何冗余字段。符合《文件上传规则》《SQL 脚本规范》(无 tenant_id)等既有约束。 --- ## 十一、实施步骤 | 步骤 | 内容 | 交付 | |------|------|------| | 1 | 新增 `bi_kpi_value_history` 表 + DO + Mapper | 表结构、代码 | | 2 | 新增 `KpiSnapshotTask` 快照聚合任务 | 定时任务 | | 3 | `BiDecisionKpiService` 增加 trend / compare 接口 | Controller + Service | | 4 | BiForecastEngine 统计预测引擎 + BiForecastService 扩展 | 预测能力 | | 5 | KPI 指标库 / 预警规则 / 看板图表 SQL 脚本落库 | 初始化脚本 | | 6 | 编译检查(mvn compile)+ 数据库回读验证 | 验证报告 | ## 十二、风险与注意事项 - 业务表当前为空,KPI 出值依赖数据积累;本次保证"结构正确 + SQL 可执行",数据到位自动出值。 - 遥测无功率/电量参数时,能耗 KPI 返回 0 占位,测点补充后自动生效,**不伪造数据**。 - KPI `query_sql` 为管理员可配置项,属系统边界内可信配置;运行时经 JdbcTemplate 参数化执行,无注入风险。 - 快照量估算:26 KPI × 每小时 = 约 624 行/天,年数据量 ~23 万行,规模可控。 - 预警阈值初值需上线后校准。