feat: mpoint支持formular
This commit is contained in:
parent
27a2a20cbe
commit
6e98ec57ee
|
@ -177,6 +177,18 @@ class CorrectViewSet(CustomGenericViewSet):
|
||||||
item.save()
|
item.save()
|
||||||
return Response()
|
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):
|
class TestViewSet(CustomGenericViewSet):
|
||||||
authentication_classes = ()
|
authentication_classes = ()
|
||||||
permission_classes = ()
|
permission_classes = ()
|
||||||
|
|
|
@ -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
|
|
@ -16,6 +16,10 @@ from apps.wpm.services import make_sflogs
|
||||||
from apps.mtm.models import Mgroup, Material
|
from apps.mtm.models import Mgroup, Material
|
||||||
from apps.fim.services import get_cost_unit, get_price_unit
|
from apps.fim.services import get_cost_unit, get_price_unit
|
||||||
from apps.fim.models import Fee
|
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():
|
def get_current_and_previous_time():
|
||||||
now = datetime.datetime.now()
|
now = datetime.datetime.now()
|
||||||
|
@ -46,7 +50,7 @@ def get_tag_val():
|
||||||
cache.set('last_tag_id', last_tag_id)
|
cache.set('last_tag_id', last_tag_id)
|
||||||
|
|
||||||
@shared_task(base=CustomTask)
|
@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: # 如果计量的是物料
|
if mpoint.material: # 如果计量的是物料
|
||||||
params = {'mpoint': mpoint, 'type': 'hour'}
|
params = {'mpoint': mpoint, 'type': 'hour'}
|
||||||
params['year'], params['month'], params['day'], params['hour'] = year, month, day, 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
|
val = 0
|
||||||
if mrs.exists():
|
if mpoint.formula:
|
||||||
val = mrs.last().tag_val - mrs.first().tag_val
|
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, _ = MpointStat.objects.get_or_create(**params, defaults=params)
|
||||||
ms.val = val
|
ms.val = val
|
||||||
ms.save()
|
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.val = sum_dict_sflog_s['sum']
|
||||||
ms_sflog_s.save()
|
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:
|
for mgroup in mgroups:
|
||||||
product = mgroup.product
|
product = mgroup.product
|
||||||
mpoints = Mpoint.objects.filter(material=product, is_auto=True)
|
mpoints = Mpoint.objects.filter(material=product, is_auto=True)
|
||||||
len_mps = len(mpoints)
|
|
||||||
for ind, item in enumerate(mpoints):
|
for ind, item in enumerate(mpoints):
|
||||||
caled_mpointids.append(item.id)
|
caled_mpointids.append(item.id)
|
||||||
next_cal = 0
|
cal_mpointstat_hour(item.id, year, month, day, hour)
|
||||||
if ind == len_mps - 1: # 运行到最后一次再去进行二次计算, 因为产量要作为分母使用
|
|
||||||
next_cal = 1
|
|
||||||
cal_mpointstat_hour(item.id, year, month, day, hour, next_cal)
|
|
||||||
|
|
||||||
# 统计其他测点
|
# 统计其他测点
|
||||||
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:
|
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)
|
@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 next_cal: # 二次计算
|
||||||
if hour:
|
if hour:
|
||||||
compute_enstat('hour_s', 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)
|
||||||
else:
|
compute_enstat('sflog', sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s)
|
||||||
compute_enstat('sflog', sflogId, mgroupId, year_s, month_s, day_s, year, month, day, hour)
|
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, 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):
|
|
||||||
"""
|
"""
|
||||||
计算能源数据统计
|
计算能源数据统计
|
||||||
"""
|
"""
|
||||||
|
@ -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,
|
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})
|
defaults={'type': 'month_s', 'mgroup': mgroup, 'year_s': year_s, 'month_s': month_s, 'total_production': 0, 'elec_consume': 0})
|
||||||
elif type == 'year_s':
|
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})
|
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':
|
if material.code == 'elec':
|
||||||
enstat.elec_consume = amount_consume
|
enstat.elec_consume = amount_consume
|
||||||
enstat.save()
|
enstat.save()
|
||||||
print(amount_consume)
|
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({'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.imaterial_data = imaterial_data
|
||||||
enstat.save()
|
enstat.save()
|
||||||
other_cost_data = []
|
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)
|
other_cost_data.append(item)
|
||||||
enstat.other_cost_data = other_cost_data
|
enstat.other_cost_data = other_cost_data
|
||||||
enstat.production_cost_unit = cost_unit_total
|
enstat.production_cost_unit = cost_unit_total
|
||||||
enstat.save()
|
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)
|
|
|
@ -48,12 +48,12 @@ class MpointStatViewSet(BulkCreateModelMixin, BulkDestroyModelMixin, ListModelMi
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
ins = serializer.save()
|
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):
|
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
|
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()
|
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):
|
class EnStatViewSet(ListModelMixin, CustomGenericViewSet):
|
||||||
|
|
Loading…
Reference in New Issue