如何在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
相关产品推荐
相关产品推荐

