fix: quastat task 计算优化2
This commit is contained in:
parent
e0fcb2e22b
commit
4ae0ce1d9e
104
apps/qm/tasks.py
104
apps/qm/tasks.py
|
@ -4,6 +4,38 @@ from apps.qm.models import QuaStat
|
||||||
from apps.utils.tasks import CustomTask
|
from apps.utils.tasks import CustomTask
|
||||||
from django.db.models import Sum, F, ExpressionWrapper, FloatField, Q
|
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)
|
@shared_task(base=CustomTask)
|
||||||
def cal_quastat(quastatId: str):
|
def cal_quastat(quastatId: str):
|
||||||
|
@ -16,7 +48,6 @@ def cal_quastat(quastatId: str):
|
||||||
# """
|
# """
|
||||||
ins = QuaStat.objects.get(id=quastatId)
|
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))
|
qs = QuaStat.objects.exclude(Q(val_avg__isnull=True)|Q(num_test__isnull=True)|Q(num_ok__isnull=True))
|
||||||
# 日统计
|
|
||||||
params = {
|
params = {
|
||||||
'testitem': ins.testitem,
|
'testitem': ins.testitem,
|
||||||
'material': ins.material,
|
'material': ins.material,
|
||||||
|
@ -26,72 +57,9 @@ def cal_quastat(quastatId: str):
|
||||||
'month_s': ins.month_s,
|
'month_s': ins.month_s,
|
||||||
'day_s': ins.day_s
|
'day_s': ins.day_s
|
||||||
}
|
}
|
||||||
results_day = qs.filter(**params).values('belong_dept', 'material',
|
# 日统计
|
||||||
'testitem', 'year_s', 'month_s', 'day_s').annotate(
|
cal_quastat_type(qs, params_o=params, type='day_s')
|
||||||
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())
|
|
||||||
)
|
|
||||||
for r1 in results_day:
|
|
||||||
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, **{'type': 'day_s'}, defaults={**params, **{'type': 'day_s'}, **stat_params}
|
|
||||||
)
|
|
||||||
for k in stat_params:
|
|
||||||
setattr(qua, k, stat_params[k])
|
|
||||||
qua.save()
|
|
||||||
# 月统计
|
# 月统计
|
||||||
params.pop('day_s')
|
cal_quastat_type(qs, params_o=params, type='month_s')
|
||||||
results_month = qs.filter(**params).values('belong_dept', 'material',
|
|
||||||
'testitem', 'year_s', 'month_s').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())
|
|
||||||
)
|
|
||||||
for r1 in results_month:
|
|
||||||
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, **{'type': 'month_s'}, defaults={**params, **{'type': 'month_s'}, **stat_params}
|
|
||||||
)
|
|
||||||
for k in stat_params:
|
|
||||||
setattr(qua, k, stat_params[k])
|
|
||||||
qua.save()
|
|
||||||
|
|
||||||
# 年统计
|
# 年统计
|
||||||
params.pop('month_s')
|
cal_quastat_type(qs, params_o=params, type='year_s')
|
||||||
|
|
||||||
results_year = qs.filter(**params).values('belong_dept', 'material',
|
|
||||||
'testitem', 'year_s').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())
|
|
||||||
)
|
|
||||||
for r1 in results_year:
|
|
||||||
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, **{'type': 'year_s'}, defaults={**params, **{'type': 'year_s'}, **stat_params}
|
|
||||||
)
|
|
||||||
for k in stat_params:
|
|
||||||
setattr(qua, k, stat_params[k])
|
|
||||||
qua.save()
|
|
Loading…
Reference in New Issue