feat: mpoint支持formular

This commit is contained in:
caoqianming 2023-07-24 16:03:06 +08:00
parent 27a2a20cbe
commit 6e98ec57ee
4 changed files with 75 additions and 40 deletions

View File

@ -177,6 +177,18 @@ class CorrectViewSet(CustomGenericViewSet):
item.save()
return Response()
@action(methods=['post'], detail=False, serializer_class=Serializer)
def enstat(self, request, pk=None):
"""矫正能源统计数据
矫正能源统计数据
"""
from apps.enm.models import EnStat
for item in EnStat.objects.exclude(sflog=None):
item.shift = item.sflog.shift
item.save()
return Response()
class TestViewSet(CustomGenericViewSet):
authentication_classes = ()
permission_classes = ()

View File

@ -0,0 +1,18 @@
from apps.enm.models import Mpoint, MpointStat
import re
def translate_eval_formula(exp_str: str, year: int, month: int, day: int, hour: int):
"""
传入
"""
pattern = r'\${(\d+)}'
matches = re.findall(pattern, exp_str)
for match in matches:
mpst = MpointStat.objects.filter(type='hour', mpoint__id=match, year=year, month=month, day=day).first()
if mpst:
exp_str = exp_str.replace(f"${{{match}}}", mpst.val)
rval = eval(exp_str)
return rval

View File

@ -16,6 +16,10 @@ from apps.wpm.services import make_sflogs
from apps.mtm.models import Mgroup, Material
from apps.fim.services import get_cost_unit, get_price_unit
from apps.fim.models import Fee
from django.core.cache import cache
from apps.enm.services import translate_eval_formula
import logging
myLogger = logging.getLogger('log')
def get_current_and_previous_time():
now = datetime.datetime.now()
@ -46,7 +50,7 @@ def get_tag_val():
cache.set('last_tag_id', last_tag_id)
@shared_task(base=CustomTask)
def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: int, next_cal=0):
def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: int):
"""
计算某一测点, 某一时间点某一小时的统计值
"""
@ -56,15 +60,23 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in
if mpoint.material: # 如果计量的是物料
params = {'mpoint': mpoint, 'type': 'hour'}
params['year'], params['month'], params['day'], params['hour'] = year, month, day, hour
mrs = MpLog.objects.filter(
mpoint=mpoint,
tag_update__year=params['year'],
tag_update__month=params['month'],
tag_update__day=params['day'],
tag_update__hour= params['hour']).order_by('tag_update')
val = 0
if mrs.exists():
val = mrs.last().tag_val - mrs.first().tag_val
if mpoint.formula:
formular = mpoint.formular
try:
val = translate_eval_formula(formular, year, month, day, hour)
except:
myLogger.error('公式执行错误:{}-{}'.format(mpoint.id, formular), exc_info=True)
raise
else:
mrs = MpLog.objects.filter(
mpoint=mpoint,
tag_update__year=params['year'],
tag_update__month=params['month'],
tag_update__day=params['day'],
tag_update__hour= params['hour']).order_by('tag_update')
if mrs.exists():
val = mrs.last().tag_val - mrs.first().tag_val
ms, _ = MpointStat.objects.get_or_create(**params, defaults=params)
ms.val = val
ms.save()
@ -113,7 +125,13 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in
ms_sflog_s.val = sum_dict_sflog_s['sum']
ms_sflog_s.save()
cal_mpointstat_manual(mpoint.id, sflog.id, mgroup.id, year_s, month_s, day_s, year, month, day, hour, next_cal)
next_cal_dict = [mpoint.material.id, sflog.id, year, month, day, hour, year_s, month_s, day_s]
if next_cal_dict == cache.get('enm_cal_dict', None):
next_cal = 0
else:
next_cal = 1
cache.set('enm_cal_dict', next_cal_dict, 60)
cal_mpointstat_manual(mpoint.id, sflog.id, mgroup.id, year, month, day, hour, year_s, month_s, day_s, next_cal)
@ -137,22 +155,18 @@ def cal_mpointstats(is_now=1, year=None, month=None, day=None, hour=None):
for mgroup in mgroups:
product = mgroup.product
mpoints = Mpoint.objects.filter(material=product, is_auto=True)
len_mps = len(mpoints)
for ind, item in enumerate(mpoints):
caled_mpointids.append(item.id)
next_cal = 0
if ind == len_mps - 1: # 运行到最后一次再去进行二次计算, 因为产量要作为分母使用
next_cal = 1
cal_mpointstat_hour(item.id, year, month, day, hour, next_cal)
cal_mpointstat_hour(item.id, year, month, day, hour)
# 统计其他测点
mpoints = Mpoint.objects.filter(is_auto=True).exclude(id__in=caled_mpointids).order_by('material')
mpoints = Mpoint.objects.filter(is_auto=True).exclude(id__in=caled_mpointids).order_by('material', 'mgroup')
for i in mpoints:
cal_mpointstat_hour(i.id, year, month, day, hour, 1)
cal_mpointstat_hour(i.id, year, month, day, hour)
@shared_task(base=CustomTask)
def cal_mpointstat_manual(mpointId: str, sflogId: str, mgroupId: str, year_s: int, month_s: int, day_s: int, year=None, month=None, day=None, hour=None, next_cal=0):
def cal_mpointstat_manual(mpointId: str, sflogId: str, mgroupId: str, year: int, month: int, day: int, hour: int, year_s: int, month_s: int, day_s: int, next_cal=0):
"""
手动录入的测点数据进行往上统计一级一级往上
"""
@ -178,13 +192,15 @@ def cal_mpointstat_manual(mpointId: str, sflogId: str, mgroupId: str, year_s: in
if next_cal: # 二次计算
if hour:
compute_enstat('hour_s', sflogId, mgroupId, year_s, month_s, day_s, year, month, day, hour)
else:
compute_enstat('sflog', sflogId, mgroupId, year_s, month_s, day_s, year, month, day, hour)
compute_enstat('hour_s', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
compute_enstat('sflog', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
compute_enstat('day_s', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
compute_enstat('month_sf', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
compute_enstat('month_s', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
compute_enstat('year_s', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
def compute_enstat(type, sflogId, mgroupId, year_s, month_s, day_s, year, month, day, hour):
def compute_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s):
"""
计算能源数据统计
"""
@ -209,7 +225,7 @@ def compute_enstat(type, sflogId, mgroupId, year_s, month_s, day_s, year, month,
enstat, _ = EnStat.objects.get_or_create(type="month_s", mgroup=mgroup, year_s=year_s, month_s=month_s,
defaults={'type': 'month_s', 'mgroup': mgroup, 'year_s': year_s, 'month_s': month_s, 'total_production': 0, 'elec_consume': 0})
elif type == 'year_s':
enstat, _ = EnStat.objects.get_or_create(type="year_s", mgroup=mgroup, year_s=year_s, month_s=month_s,
enstat, _ = EnStat.objects.get_or_create(type="year_s", mgroup=mgroup, year_s=year_s,
defaults={'type': 'year_s', 'mgroup': mgroup, 'year_s': year_s, 'total_production': 0, 'elec_consume': 0})
# 物料统计
@ -251,8 +267,8 @@ def compute_enstat(type, sflogId, mgroupId, year_s, month_s, day_s, year, month,
if material.code == 'elec':
enstat.elec_consume = amount_consume
enstat.save()
print(amount_consume)
imaterial_data.append({'material': mid, 'material_name': material.name, 'material_type': material.type, 'price_unit': price_unit, 'amount_consume': amount_consume, 'cost': cost, 'cost_unit': cost_unit})
imaterial_item = {'material': mid, 'material_name': material.name, 'material_type': material.type, 'price_unit': price_unit, 'amount_consume': amount_consume, 'cost': cost, 'cost_unit': cost_unit}
imaterial_data.append(imaterial_item)
enstat.imaterial_data = imaterial_data
enstat.save()
other_cost_data = []
@ -263,15 +279,4 @@ def compute_enstat(type, sflogId, mgroupId, year_s, month_s, day_s, year, month,
other_cost_data.append(item)
enstat.other_cost_data = other_cost_data
enstat.production_cost_unit = cost_unit_total
enstat.save()
if type == 'hour_s':
compute_enstat('sflog', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
elif type == 'sflog':
compute_enstat('day_s', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
elif type == 'day_s':
compute_enstat('month_sf', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
elif type == 'month_sf':
compute_enstat('month_s', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
elif type == 'month_s':
compute_enstat('year_s', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
enstat.save()

View File

@ -48,12 +48,12 @@ class MpointStatViewSet(BulkCreateModelMixin, BulkDestroyModelMixin, ListModelMi
def perform_create(self, serializer):
ins = serializer.save()
cal_mpointstat_manual.delay(ins.mpoint.id, ins.sflog.id, ins.mgroup.id, ins.year_s, ins.month_s, ins.day_s, nex_cal=1)
cal_mpointstat_manual.delay(ins.mpoint.id, ins.sflog.id, ins.mgroup.id, None, None, None, None, ins.year_s, ins.month_s, ins.day_s, nex_cal=1)
def perform_destroy(self, instance):
mpoint, sflog, mgroup, year_s, month_s, day_s = instance.mpoint, instance.sflog, instance.mgroup, instance.year_s, instance.month_s, instance.day_s
instance.delete()
cal_mpointstat_manual.delay(mpoint.id, sflog.id, mgroup.id, year_s, month_s, day_s)
cal_mpointstat_manual.delay(mpoint.id, sflog.id, mgroup.id, None, None, None, None, year_s, month_s, day_s)
class EnStatViewSet(ListModelMixin, CustomGenericViewSet):