diff --git a/apps/qm/tasks.py b/apps/qm/tasks.py index 7bd06f20..d59ea517 100644 --- a/apps/qm/tasks.py +++ b/apps/qm/tasks.py @@ -4,6 +4,38 @@ 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): @@ -16,7 +48,6 @@ def cal_quastat(quastatId: str): # """ 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, @@ -26,72 +57,9 @@ def cal_quastat(quastatId: str): 'month_s': ins.month_s, 'day_s': ins.day_s } - results_day = qs.filter(**params).values('belong_dept', 'material', - 'testitem', 'year_s', 'month_s', 'day_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_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() + # 日统计 + cal_quastat_type(qs, params_o=params, type='day_s') # 月统计 - params.pop('day_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() - + cal_quastat_type(qs, params_o=params, type='month_s') # 年统计 - params.pop('month_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() \ No newline at end of file + cal_quastat_type(qs, params_o=params, type='year_s') \ No newline at end of file