129 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
| import json
 | |
| from apps.dpm.models import CheckTaskSet, CheckWork, RiskPoint, Risk
 | |
| from rest_framework import serializers
 | |
| from apps.utils.serializers import CustomModelSerializer
 | |
| from apps.utils.constants import EXCLUDE_FIELDS
 | |
| from apps.system.models import Dictionary
 | |
| from django_celery_beat.models import PeriodicTask
 | |
| import time
 | |
| 
 | |
| 
 | |
| class RiskPointCreateUpdateSerializer(CustomModelSerializer):
 | |
|     class Meta:
 | |
|         model = RiskPoint
 | |
|         exclude = EXCLUDE_FIELDS
 | |
| 
 | |
| 
 | |
| class RiskPointSerializer(CustomModelSerializer):
 | |
|     class Meta:
 | |
|         model = RiskPoint
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class RiskCreateUpdateSerializer(CustomModelSerializer):
 | |
|     class Meta:
 | |
|         model = Risk
 | |
|         exclude = EXCLUDE_FIELDS + ['riskd']
 | |
| 
 | |
|     def save(self, **kwargs):
 | |
|         obj = super().save(**kwargs)
 | |
|         if obj.riskl and obj.riske and obj.riskc:
 | |
|             obj.riskd = obj.riskl * obj.riske * obj.riskc
 | |
|             if obj.riskd >= 320:
 | |
|                 obj.level = 40
 | |
|             elif 320 > obj.riskd >= 160:
 | |
|                 obj.level = 30
 | |
|             elif 160 > obj.riskd >= 70:
 | |
|                 obj.level = 20
 | |
|             else:
 | |
|                 obj.level = 10
 | |
|             obj.save()
 | |
|             self.cal_riskpoint_level(obj)
 | |
|         return obj
 | |
| 
 | |
|     @staticmethod
 | |
|     def cal_riskpoint_level(risk):
 | |
|         """
 | |
|         计算风险点风险等级
 | |
|         """
 | |
|         riskpoint = risk.riskpoint
 | |
|         levels = Risk.objects.filter(riskpoint=riskpoint).values_list('level', flat=True)
 | |
|         riskpoint.level = max(levels)
 | |
|         riskpoint.save()
 | |
|         RiskCreateUpdateSerializer.cal_area_level(riskpoint)
 | |
| 
 | |
|     @staticmethod
 | |
|     def cal_area_level(riskpoint):
 | |
|         """
 | |
|         计算区域风险等级
 | |
|         """
 | |
|         area = riskpoint.area
 | |
|         if area:
 | |
|             levels = RiskPoint.objects.filter(area=area).values_list('level', flat=True)
 | |
|             area.level = max(levels)
 | |
|             area.save()
 | |
| 
 | |
| 
 | |
| class RiskSerializer(CustomModelSerializer):
 | |
|     class Meta:
 | |
|         model = Risk
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class CheckTaskSetCreateUpdateSerializer(CustomModelSerializer):
 | |
|     class Meta:
 | |
|         model = CheckTaskSet
 | |
|         exclude = EXCLUDE_FIELDS + ['periodictask']
 | |
| 
 | |
|     def save(self, **kwargs):
 | |
|         ins = super().save(**kwargs)
 | |
|         if ins.periodictask:
 | |
|             pobj = ins.periodictask
 | |
|             pobj.name = 'checktask_' + time.strftime('%Y%m%d%H%M%S')
 | |
|             pobj.task = 'apps.dpm.dispath_checkwork_task'
 | |
|             pobj.kwargs = json.dumps({'checktaskset': ins.id})
 | |
|         else:
 | |
|             pobj = PeriodicTask()
 | |
|         sch = ins.myschedule
 | |
|         if sch.crontab:
 | |
|             pobj.crontab = sch.crontab
 | |
|         elif sch.interval:
 | |
|             pobj.interval = sch.interval
 | |
|         pobj.save()
 | |
|         ins.periodictask = pobj
 | |
|         ins.save()
 | |
|         return ins
 | |
| 
 | |
| 
 | |
| class CheckTaskSetSerializer(CustomModelSerializer):
 | |
|     enabled = serializers.BooleanField(source='periodictask.enabled', read_only=True)
 | |
|     last_run_at = serializers.DateTimeField(source='periodictask.last_run_at', read_only=True)
 | |
|     total_run_count = serializers.IntegerField(source='periodictask.total_run_count', read_only=True)
 | |
| 
 | |
|     class Meta:
 | |
|         model = CheckTaskSet
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class CheckWork_10_CreateUpdateSerializer(CustomModelSerializer):
 | |
|     category = serializers.PrimaryKeyRelatedField(
 | |
|         label='检查分类', queryset=Dictionary.objects.filter(type__code='checkwork_category'))
 | |
| 
 | |
|     class Meta:
 | |
|         model = CheckWork
 | |
|         fields = ['name', 'description', 'category', 'time_start', 'time_end', 'enabled']
 | |
| 
 | |
|     def save(self, **kwargs):
 | |
|         kwargs['type'] = 10  # 创建/编辑只有手动类型
 | |
|         return super().save(**kwargs)
 | |
| 
 | |
| 
 | |
| class CheckWorkSerializer(CustomModelSerializer):
 | |
|     category_name = serializers.CharField(source='category.name', read_only=True)
 | |
|     user_duty_name = serializers.CharField(source='user_duty.name', read_only=True)
 | |
|     riskpoint_name = serializers.CharField(source='riskpoint.name', read_only=True)
 | |
| 
 | |
|     class Meta:
 | |
|         model = CheckWork
 | |
|         fields = '__all__'
 |