73 lines
3.2 KiB
Python
73 lines
3.2 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
|
|
|
|
|
|
@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)
|
|
# 月统计
|
|
params = {
|
|
'testitem': ins.testitem,
|
|
'product': ins.product,
|
|
'belong_dept': ins.belong_dept,
|
|
'year': ins.year,
|
|
'month': ins.month
|
|
}
|
|
results_month = QuaStat.objects.filter(**params).values('belong_dept', 'product',
|
|
'testitem', 'year', 'month').annotate(
|
|
avg_val_total=Sum(F('avg_val')*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())
|
|
)
|
|
for r1 in results_month:
|
|
stat_params = {
|
|
'avg_val': 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, **{'type': 'month'}, defaults={**params, **{'type': 'month'}, **stat_params}
|
|
)
|
|
if not is_created:
|
|
for k in stat_params:
|
|
setattr(qua, k, stat_params[k])
|
|
qua.save()
|
|
|
|
# 年统计
|
|
params.pop('month')
|
|
|
|
results_year = QuaStat.objects.filter(**params).values('belong_dept', 'product',
|
|
'testitem', 'year').annotate(
|
|
avg_val_total=Sum(F('avg_val')*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())
|
|
)
|
|
for r1 in results_year:
|
|
stat_params = {
|
|
'avg_val': 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, **{'type': 'year'}, defaults={**params, **{'type': 'year'}, **stat_params}
|
|
)
|
|
if not is_created:
|
|
for k in stat_params:
|
|
setattr(qua, k, stat_params[k])
|
|
qua.save() |