From ed936082c78d1ce8d3e5ee62aba2fad19872a51a Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 30 Aug 2023 15:19:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mpoint=E5=A2=9E=E5=8A=A0func=5Fon=5Fcha?= =?UTF-8?q?nge=E4=BB=A5=E5=AE=8C=E6=88=90=E5=BC=80=E5=81=9C=E6=9C=BA?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0022_mpoint_func_on_change.py | 18 +++++++++++++ apps/enm/models.py | 1 + apps/enm/services.py | 25 +++++++++++++++++-- apps/enm/tasks.py | 21 +++++++++++++--- 4 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 apps/enm/migrations/0022_mpoint_func_on_change.py diff --git a/apps/enm/migrations/0022_mpoint_func_on_change.py b/apps/enm/migrations/0022_mpoint_func_on_change.py new file mode 100644 index 00000000..a9f6cda2 --- /dev/null +++ b/apps/enm/migrations/0022_mpoint_func_on_change.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-08-30 07:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('enm', '0021_auto_20230825_1649'), + ] + + operations = [ + migrations.AddField( + model_name='mpoint', + name='func_on_change', + field=models.CharField(default='', max_length=100, verbose_name='数据变动时执行方法'), + ), + ] diff --git a/apps/enm/models.py b/apps/enm/models.py index 4f9a3afa..8897487f 100644 --- a/apps/enm/models.py +++ b/apps/enm/models.py @@ -19,6 +19,7 @@ class Mpoint(CommonBDModel): is_auto = models.BooleanField('是否自动采集', default=True) is_all = models.BooleanField('是否记录是整个工段', default=False) formula = models.TextField('计算公式', default='') + func_on_change = models.CharField('数据变动时执行方法', max_length=100, default='') class MpLog(BaseModel): diff --git a/apps/enm/services.py b/apps/enm/services.py index b8931054..2905d79a 100644 --- a/apps/enm/services.py +++ b/apps/enm/services.py @@ -1,9 +1,10 @@ -from apps.enm.models import Mpoint, MpointStat, EnStat +from apps.enm.models import Mpoint, MpointStat, EnStat, MpLog import re import traceback from apps.mtm.services import get_mgroup_goals from django.db.models import Q import datetime +from django.utils.timezone import now def translate_eval_formula(exp_str: str, year: int, month: int, day: int, hour: int): @@ -73,4 +74,24 @@ def get_day_s(year: int, month: int, day: int, hour: int, hour_split: int = 21): # # enstat.save(update_fields=['goal_data', 'score']) # except: # print(traceback.format_exc()) -# return goal_data, score \ No newline at end of file +# return goal_data, score + +def shutdown_or_startup(mplog: MpLog): + from apps.wpm.models import StLog + from apps.wpm.tasks import cal_shut_hour + mpoint = mplog.mpoint + mgroup = mpoint.mgroup + if mplog.tag_val == 1 and mgroup.is_running is False: + # 从停到开 + stlog = StLog.objects.filter(mgroup=mgroup).order_by('start_time').last() + stlog.end_time = now() + stlog.save() + mgroup.is_runing = True + mgroup.save() + cal_shut_hour(stlog.id) # 触发停机时间分配 + elif mplog.tag_val == 0 and mgroup.is_runing is True: + # 从开到停 + StLog.objects.create(mgroup=mgroup, start_time=now) + mgroup.is_runing = False + mgroup.save() + \ No newline at end of file diff --git a/apps/enm/tasks.py b/apps/enm/tasks.py index b8d41d61..3f9b183b 100644 --- a/apps/enm/tasks.py +++ b/apps/enm/tasks.py @@ -4,6 +4,7 @@ from apps.utils.tasks import CustomTask from celery import shared_task, group, chain from apps.utils.sql import DbConnection from server.settings import get_sysconfig, update_sysconfig +import importlib from django.core.cache import cache from apps.enm.models import MpLog, Mpoint, MpointStat, EnStat, EnStat2 from apps.wpm.models import SfLog, StLog @@ -46,11 +47,25 @@ def get_tag_val(): for row in results: mr_one = MpLog() mr_one.tag_id, mr_one.tag_val, mr_one.tag_code, mr_one.tag_update = row - mr_one.mpoint, _ = Mpoint.objects.get_or_create(code=mr_one.tag_code, defaults={'name': mr_one.tag_code, 'code': mr_one.tag_code, 'unit': 'unknown'}) + mpoint, _ = Mpoint.objects.get_or_create(code=mr_one.tag_code, defaults={'name': mr_one.tag_code, 'code': mr_one.tag_code, 'unit': 'unknown'}) + mr_one.mpoint = mpoint mr_one.save() last_tag_id = mr_one.tag_id + if mpoint.func_on_change: + mpoint_val_on_change.delay(mr_one.id) update_sysconfig({'enm': {'last_tag_id': last_tag_id}}) +@shared_task(base=CustomTask) +def mpoint_val_on_change(mpLogId: str): + """测点值变化的时候执行任务 + """ + mplog = MpLog.objects.get(id=mpLogId) + mpoint = mplog.mpoint + module, func = mpoint.func_on_change.rsplit(".", 1) + m = importlib.import_module(module) + f = getattr(m, func) + f(mplog) # 同步执行 + @shared_task(base=CustomTask) def cal_mpointstats_duration(start_time: str, end_time: str): """ @@ -165,14 +180,14 @@ def cal_mpointstats(is_now=1, year=None, month=None, day=None, hour=None): year, month, day, hour = pre.year, pre.month, pre.day, pre.hour # 先统计不带公式的测点 - mpoints_without_formula = Mpoint.objects.filter(is_auto=True, formula='') + mpoints_without_formula = Mpoint.objects.filter(is_auto=True, formula='', func_on_change='') # mpoints_without_formula_group = [] for item in mpoints_without_formula: # mpoints_without_formula_group.append(cal_mpointstat_hour.s(item.id, year, month, day, hour)) cal_mpointstat_hour(item.id, year, month, day, hour) # 再统计其他测点 - mpoints_other = Mpoint.objects.filter(is_auto=True).exclude(formula='') + mpoints_other = Mpoint.objects.filter(is_auto=True, func_on_change='').exclude(formula='') # mpoints_other_group = [] for item in mpoints_other: # mpoints_other_group.append(cal_mpointstat_hour.s(item.id, year, month, day, hour))