277 lines
11 KiB
Python
277 lines
11 KiB
Python
from apps.hrm.models import Certificate
|
|
from apps.opm.models import GasCheck, Operation, Opl, OplCate, OplCert, OplWorker
|
|
from apps.system.models import Dictionary
|
|
from apps.system.serializers import DeptSimpleSerializer, DictSimpleSerializer, UserSimpleSerializer
|
|
from apps.utils.fields import MyFilePathField
|
|
from apps.utils.serializers import CustomModelSerializer
|
|
from apps.utils.constants import EXCLUDE_FIELDS
|
|
from rest_framework import serializers
|
|
from django.db import transaction
|
|
from rest_framework.exceptions import ParseError, ValidationError
|
|
from apps.am.serializers import AreaSimpleSerializer
|
|
from apps.wf.serializers import TicketSerializer
|
|
from apps.system.serializers import FileSerializer
|
|
from apps.third.serializers import TDeviceSimpleSerializer
|
|
from django.core.cache import cache
|
|
from apps.wf.models import Ticket
|
|
|
|
|
|
class OplCateCreateUpdateSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = OplCate
|
|
exclude = EXCLUDE_FIELDS
|
|
|
|
|
|
class OplCateSerializer(CustomModelSerializer):
|
|
|
|
class Meta:
|
|
model = OplCate
|
|
fields = '__all__'
|
|
|
|
|
|
class OplCateSimpleSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = OplCate
|
|
fields = ['id', 'name', 'code', 'sort']
|
|
|
|
|
|
class OplCateDetailSerializer(CustomModelSerializer):
|
|
measure_options_ = DictSimpleSerializer(source='measure_options', read_only=True, many=True)
|
|
risk_options_ = DictSimpleSerializer(source='risk_options', read_only=True, many=True)
|
|
close_options_ = DictSimpleSerializer(source='close_options', read_only=True, many=True)
|
|
|
|
class Meta:
|
|
model = OplCate
|
|
fields = '__all__'
|
|
|
|
|
|
class OperationCreateUpdateSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = Operation
|
|
exclude = EXCLUDE_FIELDS + ['number']
|
|
|
|
def validate(self, attrs):
|
|
dept_ter = attrs['dept_ter']
|
|
dept_bus = attrs['dept_bus']
|
|
if dept_ter.type != 'dept' or dept_bus.type != 'dept':
|
|
raise ValidationError('属地和业务部门需为本部')
|
|
return super().validate(attrs)
|
|
|
|
|
|
class OperationPartialUpdateSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = Operation
|
|
fields = ['vchannels', 'dept_ter', 'dept_bus']
|
|
|
|
|
|
class OperationSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = Operation
|
|
fields = "__all__"
|
|
|
|
|
|
class OperationDetailSerializer(CustomModelSerializer):
|
|
area_ = AreaSimpleSerializer(source='area', read_only=True)
|
|
dept_ter_ = DeptSimpleSerializer(source='dept_ter', read_only=True)
|
|
dept_bus_ = DeptSimpleSerializer(source='dept_bus', read_only=True)
|
|
coordinator_ = UserSimpleSerializer(source='coordinator', read_only=True)
|
|
coordinator_name = serializers.CharField(source='coordinator.name', read_only=True)
|
|
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
|
|
cates_ = OplCateSimpleSerializer(source='cates', read_only=True, many=True)
|
|
vchannels_ = TDeviceSimpleSerializer(source='vchannels', read_only=True, many=True)
|
|
|
|
class Meta:
|
|
model = Operation
|
|
fields = "__all__"
|
|
|
|
|
|
class OplWorkerCreateSerializer(CustomModelSerializer):
|
|
certificates = serializers.PrimaryKeyRelatedField(label='证书ID', many=True, queryset=Certificate.objects.all())
|
|
|
|
class Meta:
|
|
model = OplWorker
|
|
fields = ['id', 'worker', 'duty', 'certificates', 'opl']
|
|
|
|
def create(self, validated_data):
|
|
opl = validated_data['opl']
|
|
ticket = opl.ticket
|
|
if ticket and ticket.state.type != 1:
|
|
raise ParseError('许可证已处理不可新增')
|
|
certificates = validated_data.pop('certificates')
|
|
if OplWorker.objects.filter(worker=validated_data['worker'], opl=validated_data['opl']).exists():
|
|
raise ParseError('该成员已加入')
|
|
with transaction.atomic():
|
|
oplw = super().create(validated_data)
|
|
for x in certificates:
|
|
oplc = OplCert.objects.filter(opl_worker=oplw, certificate=x).first()
|
|
if oplc:
|
|
pass
|
|
else:
|
|
oplc = OplCert()
|
|
oplc.opl_worker = oplw
|
|
oplc.certificate = x
|
|
for f in Certificate._meta.fields:
|
|
if f.name not in ['id']:
|
|
setattr(oplc, f.name, getattr(x, f.name, None))
|
|
oplc.save()
|
|
return oplw
|
|
|
|
|
|
class OplWorkerUpdateSerializer(CustomModelSerializer):
|
|
certificates = serializers.PrimaryKeyRelatedField(label='证书ID', many=True, queryset=Certificate.objects.all())
|
|
|
|
class Meta:
|
|
model = OplWorker
|
|
fields = ['id', 'duty', 'certificates']
|
|
|
|
def update(self, instance, validated_data):
|
|
certificates = validated_data.pop('certificates')
|
|
with transaction.atomic():
|
|
oplw = super().update(instance, validated_data)
|
|
for x in certificates:
|
|
oplc = OplCert.objects.filter(opl_worker=oplw, certificate=x).first()
|
|
if oplc:
|
|
pass
|
|
else:
|
|
oplc = OplCert()
|
|
oplc.opl_worker = oplw
|
|
oplc.certificate = x
|
|
for f in Certificate._meta.fields:
|
|
if f.name not in ['id']:
|
|
setattr(oplc, f.name, getattr(x, f.name, None))
|
|
oplc.save()
|
|
return oplw
|
|
|
|
|
|
class OplCertSerializer(CustomModelSerializer):
|
|
file_f = MyFilePathField(source='file', read_only=True)
|
|
|
|
class Meta:
|
|
model = OplCert
|
|
fields = ['certificate', 'name', 'type', 'number', 'issue_date',
|
|
'expiration_date', 'review_date', 'file', 'file_f']
|
|
|
|
|
|
class OplWorkerSerializer(CustomModelSerializer):
|
|
worker_ = UserSimpleSerializer(source='worker', read_only=True)
|
|
worker_name = serializers.CharField(source='worker.name', read_only=True)
|
|
certificates_ = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = OplWorker
|
|
fields = '__all__'
|
|
|
|
def get_certificates_(self, obj):
|
|
cs = OplCert.objects.filter(opl_worker=obj)
|
|
return OplCertSerializer(instance=cs, many=True).data
|
|
|
|
|
|
class GasCheckCreateUpdateSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = GasCheck
|
|
exclude = EXCLUDE_FIELDS
|
|
|
|
|
|
class GasCheckSerializer(CustomModelSerializer):
|
|
checker_ = UserSimpleSerializer(source='checker', read_only=True)
|
|
|
|
class Meta:
|
|
model = GasCheck
|
|
fields = '__all__'
|
|
|
|
|
|
class OplCreateUpdateSerializer(CustomModelSerializer):
|
|
id = serializers.CharField(read_only=True)
|
|
cate_name = serializers.CharField(source='cate.name', read_only=True)
|
|
cate_code = serializers.CharField(source='cate.code', read_only=True)
|
|
operation_name = serializers.CharField(source='operation.name', read_only=True)
|
|
|
|
class Meta:
|
|
model = Opl
|
|
fields = ['id', 'operation', 'level', 'cate', 'start_time', 'end_time',
|
|
'dept_do', 'charger', 'monitor', 'work_time', 'work_type',
|
|
'accept_time', 'power', 'power_to', 'power_from',
|
|
'power_end_time', 'power_start_time', 'power_days',
|
|
'other_risk', 'other_emr', 'escape_route',
|
|
'risks_checked', 'measures_checked', 'create_imgs', 'cate_name', 'cate_code', 'operation_name']
|
|
|
|
def create(self, validated_data):
|
|
operation = validated_data['operation']
|
|
if operation.state == Operation.OP_DONE:
|
|
raise ParseError('作业已关闭不可创建许可')
|
|
cate = validated_data['cate']
|
|
if Opl.objects.filter(operation=operation, cate=cate).exclude(ticket__act_state=5).exists():
|
|
raise ParseError('该类有效许可证已存在,不可重复申请')
|
|
return super().create(validated_data)
|
|
|
|
|
|
class OplSerializer(CustomModelSerializer):
|
|
cate_name = serializers.CharField(source='cate.name', read_only=True)
|
|
cate_ = OplCateSimpleSerializer(source='cate', read_only=True)
|
|
|
|
class Meta:
|
|
model = Opl
|
|
fields = '__all__'
|
|
|
|
|
|
class OplListSerializer(CustomModelSerializer):
|
|
cate_name = serializers.CharField(source='cate.name', read_only=True)
|
|
cate_code = serializers.CharField(source='cate.code', read_only=True)
|
|
operation_name = serializers.CharField(source='operation.name', read_only=True)
|
|
cate_ = OplCateSimpleSerializer(source='cate', read_only=True)
|
|
dept_do_ = DeptSimpleSerializer(source='dept_do', read_only=True)
|
|
charger_ = UserSimpleSerializer(source='charger', read_only=True)
|
|
monitor_ = UserSimpleSerializer(source='monitor', read_only=True)
|
|
ticket_ = TicketSerializer(source='ticket', read_only=True)
|
|
mtask_uid = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Opl
|
|
fields = '__all__'
|
|
|
|
def get_mtask_uid(self, obj):
|
|
return cache.get('opl_' + obj.id, None)
|
|
|
|
|
|
class OplDetailSerializer(CustomModelSerializer):
|
|
cate_name = serializers.CharField(source='cate.name', read_only=True)
|
|
cate_code = serializers.CharField(source='cate.code', read_only=True)
|
|
operation_name = serializers.CharField(source='operation.name', read_only=True)
|
|
operation_ = OperationDetailSerializer(source='operation', read_only=True)
|
|
dept_do_ = DeptSimpleSerializer(source='dept_do', read_only=True)
|
|
charger_ = UserSimpleSerializer(source='charger', read_only=True)
|
|
charger_name = serializers.CharField(source='charger.name', read_only=True)
|
|
monitor_name = serializers.CharField(source='monitor.name', read_only=True)
|
|
monitor_ = UserSimpleSerializer(source='monitor', read_only=True)
|
|
ticket_ = TicketSerializer(source='ticket', read_only=True)
|
|
risks_checked_ = serializers.SerializerMethodField()
|
|
measures_checked_ = serializers.SerializerMethodField()
|
|
close_dos_ = serializers.SerializerMethodField()
|
|
create_imgs_ = FileSerializer(source='create_imgs', many=True)
|
|
close_imgs_ = FileSerializer(source='close_imgs', many=True)
|
|
mtask_uid = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Opl
|
|
fields = '__all__'
|
|
|
|
def get_risks_checked_(self, obj):
|
|
qs = Dictionary.objects.filter(id__in=obj.risks_checked).values('id', 'name')
|
|
return list(qs)
|
|
|
|
def get_measures_checked_(self, obj):
|
|
qs = Dictionary.objects.filter(id__in=obj.measures_checked).values('id', 'name')
|
|
return list(qs)
|
|
|
|
def get_close_dos_(self, obj):
|
|
qs = Dictionary.objects.filter(id__in=obj.close_dos).values('id', 'name')
|
|
return list(qs)
|
|
|
|
def get_mtask_uid(self, obj):
|
|
return cache.get('opl_' + obj.id, None)
|
|
|
|
class OplCloseSerializer(CustomModelSerializer):
|
|
class Meta:
|
|
model = Opl
|
|
fields = ['close_imgs', 'close_note', 'close_dos', 'close_desc']
|