factory/apps/opm/serializers.py

283 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 certificates:
pass
else:
certificates = list(Certificate.objects.filter(employee__user=validated_data['worker']))
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)
audit_imgs_ = FileSerializer(source='audit_imgs', many=True)
work_imgs_ = FileSerializer(source='work_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']