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 import timezone def translate_eval_formula(exp_str: str, year: int, month: int, day: int, hour: int): """ 传入 """ pattern = r"\${(.*?)}" matches = re.findall(pattern, exp_str) for match in matches: mpst = MpointStat.objects.filter(Q(mpoint__id=match) | Q(mpoint__name=match) | Q( mpoint__code=match), type='hour', year=year, month=month, day=day, hour=hour).first() if mpst: exp_str = exp_str.replace(f"${{{match}}}", str(mpst.val)) rval = eval(exp_str) return rval def get_day_s(year: int, month: int, day: int, hour: int, hour_split: int = 21): """ 根据给定的小时数, 计算出班天 """ if hour <= hour_split: return year, month, day else: now = datetime.datetime(year, month, day, hour) now2 = now + datetime.timedelta(days=1) return now2.year, now2.month, now2.day # cal_rule = { # "电石渣": { # "total_production": 0.4, # "elec_consume_unit": 0.4, # "production_cost_unit": 0.2 # }, # "原料磨":{ # "production_hour": 0.3, # "elec_consume_unit": 0.3, # "production_cost_unit": 0.1, # "辅料_细度":0.05, # "辅料_水分":0.04, # "干混生料_CaO":0.04 # } # } # def cal_team_score(data): # """ # 计算月度绩效 # """ # qua_rate = {} # month_s = data['month_s'] # for item in data['qua_data']: # qua_rate[f'{item["material_name"]}_{item["testitem_name"]}'] = item["rate_pass"] # goal_dict = get_mgroup_goals(data['mgroup'], data['year_s'], False) # goal_data = {} # try: # rule = cal_rule[data['mgroup_name']] # score = 0 # for key in rule: # new_key = f'{key}_{month_s}' # goal_data[new_key] = goal_dict[new_key] # if '-' in key: # score = score + qua_rate.get(key, 0)/goal_data[new_key]*rule[key] # else: # score = score + data.get(key)/goal_data[new_key]*rule[key] # print(score) # # enstat.goal_data = goal_data # # enstat.score =score # # enstat.save(update_fields=['goal_data', 'score']) # except: # print(traceback.format_exc()) # return goal_data, score def shutdown_or_startup(mplog: MpLog): from apps.wpm.models import StLog from apps.wpm.tasks import cal_exp_duration_hour from apps.wpm.services import get_sflog mpoint = mplog.mpoint mgroup = mpoint.mgroup last_stlog = StLog.objects.filter( mgroup=mgroup, is_shutdown=True).order_by('start_time').last() # 找到最后一次停机记录 if last_stlog: if mplog.tag_update >= last_stlog.start_time: # 认为是有效信号 if last_stlog.end_time is None and mplog.tag_val == 1: # 从停到开 last_stlog.end_time = mplog.tag_update last_stlog.duration = ( last_stlog.end_time - last_stlog.start_time).total_seconds()/3600 last_stlog.save() mgroup.is_runing = True mgroup.save() cal_exp_duration_hour(last_stlog.id) # 触发时间分配 elif last_stlog.end_time and mplog.tag_val == 0 and mplog.tag_update > last_stlog.end_time: # 从开到停 StLog.objects.create( title='停机', is_shutdown=True, mgroup=mgroup, end_time=None, start_time=mplog.tag_update, sflog=get_sflog(mgroup, mplog.tag_update) ) mgroup.is_runing = False mgroup.save() else: StLog.objects.create( title='停机', is_shutdown=True, mgroup=mgroup, end_time=None, start_time=mplog.tag_update, sflog=get_sflog(mgroup, mplog.tag_update)) mgroup.is_runing = False mgroup.save()