You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Workshop模块中创建月度指标历史及对象集历史并支持按月份检索?

Workshop模块指标历史记录与对象集历史记录实现方案

一、按月创建指标历史记录并支持月份检索

1. 数据存储设计

创建专门的指标历史表存储每月指标快照,表结构示例:

CREATE TABLE workshop_metric_history (
    id INT AUTO_INCREMENT PRIMARY KEY,
    workshop_id INT NOT NULL COMMENT '关联车间ID',
    metric_key VARCHAR(50) NOT NULL COMMENT '指标标识(如production_volume、defect_rate)',
    metric_value DECIMAL(10,2) NOT NULL COMMENT '指标数值',
    record_month VARCHAR(7) NOT NULL COMMENT '记录月份(格式:YYYY-MM)',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
    INDEX idx_workshop_month (workshop_id, record_month)
);

添加idx_workshop_month联合索引,提升月份检索的查询效率。

2. 按月生成历史记录

有两种主流实现方式:

  • 定时任务自动生成:每月固定时间(如每月1号凌晨)触发任务,计算上月各项指标值并插入历史表。伪代码示例:
# Python+APScheduler实现定时任务
from datetime import datetime, timedelta
from models import Workshop, WorkshopMetricHistory
from db import db

def generate_monthly_metrics():
    last_month = datetime.now().replace(day=1) - timedelta(days=1)
    record_month = last_month.strftime("%Y-%m")
    workshops = Workshop.query.all()
    
    for workshop in workshops:
        # 调用业务方法计算上月指标
        production_volume = calculate_production_volume(workshop.id, last_month)
        defect_rate = calculate_defect_rate(workshop.id, last_month)
        
        # 插入历史记录
        db.session.add(WorkshopMetricHistory(
            workshop_id=workshop.id,
            metric_key="production_volume",
            metric_value=production_volume,
            record_month=record_month
        ))
        db.session.add(WorkshopMetricHistory(
            workshop_id=workshop.id,
            metric_key="defect_rate",
            metric_value=defect_rate,
            record_month=record_month
        ))
    db.session.commit()

# 配置每月1号凌晨1点执行
scheduler.add_job(generate_monthly_metrics, 'cron', day='1', hour='1')
  • 手动触发生成:在系统后台添加按钮,允许管理员手动指定月份生成对应历史记录,用于补录历史数据场景。

3. 月份检索功能实现

  • 前端:提供月份下拉选择框(可基于当前时间生成近12个月选项),用户选择后提交请求。
  • 后端:接收workshop_id和record_month参数,执行查询返回对应数据。SQL示例:
SELECT metric_key, metric_value 
FROM workshop_metric_history 
WHERE workshop_id = ? AND record_month = ?;

前端可将返回结果以图表或表格形式展示该月份的各项指标。

二、对象集历史记录创建方案

对象集历史记录核心是追踪对象的状态变更、字段修改轨迹,具体实现步骤如下:

1. 确定追踪维度

明确需要记录的对象类型(如车间设备、生产工单)、需追踪的字段,以及是否需要记录操作人、操作时间等元数据。

2. 历史表设计

以车间设备为例,创建对象历史表:

CREATE TABLE workshop_object_history (
    id INT AUTO_INCREMENT PRIMARY KEY,
    object_type VARCHAR(50) NOT NULL COMMENT '对象类型(如equipment、work_order)',
    object_id INT NOT NULL COMMENT '关联对象ID',
    changed_fields JSON NOT NULL COMMENT '变更字段及新旧值(如{"status": {"old": "running", "new": "maintenance"}})',
    change_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '变更时间',
    operator_id INT COMMENT '操作人ID(可选)',
    INDEX idx_object_type_id (object_type, object_id)
);

用JSON类型存储changed_fields,可灵活适配不同对象的字段变更需求。

3. 触发历史记录的方式

  • 数据库触发器:适合无需业务逻辑干预的场景,对象表发生INSERT/UPDATE/DELETE操作时自动写入历史记录。MySQL触发器示例:
DELIMITER //
CREATE TRIGGER equipment_update_trigger
AFTER UPDATE ON workshop_equipment
FOR EACH ROW
BEGIN
    INSERT INTO workshop_object_history (object_type, object_id, changed_fields)
    VALUES (
        'equipment',
        OLD.id,
        JSON_OBJECT(
            'status', JSON_OBJECT('old', OLD.status, 'new', NEW.status),
            'maintain_date', JSON_OBJECT('old', OLD.maintain_date, 'new', NEW.maintain_date)
        )
    );
END //
DELIMITER ;
  • 业务代码手动记录:适合需结合业务逻辑判断是否记录的场景,如仅特定字段变更时写入历史。伪代码示例:
def update_equipment_status(equipment_id, new_status, operator_id):
    equipment = Equipment.query.get(equipment_id)
    old_status = equipment.status
    
    if old_status != new_status:
        # 记录变更历史
        changed_fields = {"status": {"old": old_status, "new": new_status}}
        db.session.add(WorkshopObjectHistory(
            object_type="equipment",
            object_id=equipment_id,
            changed_fields=changed_fields,
            operator_id=operator_id
        ))
        # 更新设备状态
        equipment.status = new_status
        db.session.commit()

4. 历史记录查询

用户查看对象历史时,可根据对象类型和ID查询:

SELECT change_time, changed_fields, operator_id 
FROM workshop_object_history 
WHERE object_type = ? AND object_id = ? 
ORDER BY change_time DESC;

前端解析JSON字段后,以时间线形式展示对象的变更轨迹。

内容的提问来源于stack exchange,提问作者harsh2702

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:13:12