143 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
import json
 | 
						|
from apps.dpm.models import CheckTaskSet, CheckWork, RiskPoint, Risk, Hazard
 | 
						|
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
 | 
						|
from django.db import transaction
 | 
						|
 | 
						|
 | 
						|
class RiskPointCreateUpdateSerializer(CustomModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = RiskPoint
 | 
						|
        exclude = EXCLUDE_FIELDS
 | 
						|
 | 
						|
 | 
						|
class RiskPointSerializer(CustomModelSerializer):
 | 
						|
    area_name = serializers.CharField(source='area.name', read_only=True)
 | 
						|
    dept_res_name = serializers.CharField(source='dept_res.name', read_only=True)
 | 
						|
    user_res_name = serializers.CharField(source='user_res.name', read_only=True)
 | 
						|
    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 CheckTaskSetCreateSerializer(CustomModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = CheckTaskSet
 | 
						|
        exclude = EXCLUDE_FIELDS + ['periodictask']
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        with transaction.atomic():
 | 
						|
            sch = validated_data["myschedule"]
 | 
						|
            pobj = PeriodicTask()
 | 
						|
            pobj.name = 'checktask_' + time.strftime('%Y%m%d%H%M%S')
 | 
						|
            pobj.task = 'apps.dpm.tasks.dispath_checkwork_task'
 | 
						|
            if sch.crontab:
 | 
						|
                pobj.crontab = sch.crontab
 | 
						|
            elif sch.interval:
 | 
						|
                pobj.interval = sch.interval
 | 
						|
            pobj.save()
 | 
						|
            validated_data["periodictask"] = pobj
 | 
						|
            ins = super().create(validated_data)
 | 
						|
            pobj.kwargs = json.dumps({'checktaskset': ins.id})
 | 
						|
            pobj.save()
 | 
						|
            return ins
 | 
						|
 | 
						|
class CheckTaskSetUpdateSerializer(CustomModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = CheckTaskSet
 | 
						|
        fields = ["expire", "note"]
 | 
						|
 | 
						|
 | 
						|
class CheckTaskSetSerializer(CustomModelSerializer):
 | 
						|
    user_duty_name = serializers.CharField(source="user_duty.name", read_only=True)
 | 
						|
    myschedule_name = serializers.CharField(source="myschedule.name", read_only=True)
 | 
						|
    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__'
 | 
						|
 | 
						|
 | 
						|
class HazardSerializer(CustomModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = Hazard
 | 
						|
        fields = '__all__' |