factory/apps/qm/tasks.py

65 lines
2.7 KiB
Python

from __future__ import absolute_import, unicode_literals
from celery import shared_task
from apps.qm.models import QuaStat
from apps.utils.tasks import CustomTask
from django.db.models import Sum, F, ExpressionWrapper, FloatField, Q
def cal_quastat_type(qs, params_o: dict, type: str):
params = params_o.copy()
v_list = ['belong_dept', 'material', 'testitem', 'year_s', 'month_s', 'day_s']
if type == 'month_s':
v_list = ['belong_dept', 'material', 'testitem', 'year_s', 'month_s']
elif type == 'year_s':
v_list = ['belong_dept', 'material', 'testitem', 'year_s']
results = qs.filter(**params).values(*v_list).annotate(
avg_val_total=Sum(F('val_avg')*F('num_test')),
num_test_1=Sum('num_test'),
num_ok_1=Sum('num_ok')).annotate(
avg_val_1=ExpressionWrapper(F('avg_val_total')/F('num_test_1'), output_field=FloatField()),
rate_pass_1=ExpressionWrapper(F('num_ok_1')/F('num_test_1'), output_field=FloatField())
)
params['type'] = type
if type == 'month_s':
params.pop('day_s')
elif type == 'year_s':
params.pop('month_s')
for r1 in results:
stat_params = {
'val_avg': r1['avg_val_1'],
'num_test': r1['num_test_1'],
'num_ok': r1['num_ok_1'],
'rate_pass': r1['rate_pass_1']
}
qua, is_created = QuaStat.objects.get_or_create(
**params, defaults={**params, **stat_params}
)
for k in stat_params:
setattr(qua, k, stat_params[k])
qua.save()
@shared_task(base=CustomTask)
def cal_quastat(quastatId: str):
# 可以直接使用sql语言
# query = """
# SELECT field1, SUM(field2 * field3) AS field2_field3_sum, SUM(field1) AS field1_sum,
# SUM(field2 * field3) / SUM(field1) AS result
# FROM your_table_name
# GROUP BY field1
# """
ins = QuaStat.objects.get(id=quastatId)
qs = QuaStat.objects.exclude(Q(val_avg__isnull=True)|Q(num_test__isnull=True)|Q(num_ok__isnull=True))
params = {
'testitem': ins.testitem,
'material': ins.material,
'belong_dept': ins.belong_dept,
'type': 'sflog',
'year_s': ins.year_s,
'month_s': ins.month_s,
'day_s': ins.day_s
}
# 日统计
cal_quastat_type(qs, params_o=params, type='day_s')
# 月统计
cal_quastat_type(qs, params_o=params, type='month_s')
# 年统计
cal_quastat_type(qs, params_o=params, type='year_s')