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()