98 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			4.5 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,
 | |
|         'material': ins.material,
 | |
|         'belong_dept': ins.belong_dept,
 | |
|         'year_s': ins.year_s,
 | |
|         'month_s': ins.month_s,
 | |
|         'day_s': ins.day_s
 | |
|     }
 | |
|     results_day = QuaStat.objects.filter(**params).values('belong_dept', 'material',
 | |
|                                         'testitem', 'year_s', 'month_s', 'day_s').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_day:
 | |
|         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': 'day_s'}, defaults={**params, **{'type': 'day_s'}, **stat_params}
 | |
|         )
 | |
|         if not is_created:
 | |
|             for k in stat_params:
 | |
|                 setattr(qua, k, stat_params[k])
 | |
|             qua.save()
 | |
|     # 月统计
 | |
|     params.pop('day_s')
 | |
|     results_month = QuaStat.objects.filter(**params).values('belong_dept', 'material',
 | |
|                                         'testitem', 'year_s', 'month_s').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_s'}, defaults={**params, **{'type': 'month_s'}, **stat_params}
 | |
|         )
 | |
|         if not is_created:
 | |
|             for k in stat_params:
 | |
|                 setattr(qua, k, stat_params[k])
 | |
|             qua.save()
 | |
|     
 | |
|     # 年统计
 | |
|     params.pop('month_s')
 | |
|     
 | |
|     results_year = QuaStat.objects.filter(**params).values('belong_dept', 'material',
 | |
|                                         'testitem', 'year_s').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_s'}, defaults={**params, **{'type': 'year_s'}, **stat_params}
 | |
|         )
 | |
|         if not is_created:
 | |
|             for k in stat_params:
 | |
|                 setattr(qua, k, stat_params[k])
 | |
|             qua.save() |