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': params.pop('day_s') v_list = ['belong_dept', 'material', 'testitem', 'year_s', 'month_s'] elif type == 'year_s': params.pop('month_s') params.pop('day_s') v_list = ['belong_dept', 'material', 'testitem', 'year_s'] qs_ = qs.filter(**params).values(*v_list) results = qs_.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()) 不知道为什么算出来是0 ) query = """ SELECT SUM(num_test * val_avg)/SUM(num_test) AS avg_val_1, SUM(num_test) AS num_test_1, SUM(num_ok) AS num_ok_1, SUM(num_ok)/SUM(num_test) as rate_pass_1 FROM qm_quastat where year_s = 2023 and month_s = 7 and day_s = 7 and type = 'sflog' GROUP BY belong_dept_id, material_id, testitem_id """ params['type'] = type 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['num_ok_1']/r1['num_test_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): ins = QuaStat.objects.get(id=quastatId) qs = QuaStat.objects.filter(type='sflog').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, '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')