from apps.hrm.models import Employee from apps.rpm.models import Rcertificate, Remployee, Rfile, Rparty, Rpjcertificate, Rpjfile, Rpjmember, Rpj, BlackList from apps.system.models import Dept from apps.system.services import sync_dahua_dept from apps.utils.constants import EXCLUDE_FIELDS from apps.utils.fields import MyFilePathField from apps.utils.serializers import CustomModelSerializer from apps.system.serializers import DictSerializer, DictSimpleSerializer, FileSerializer, UserSimpleSerializer from rest_framework import serializers from rest_framework.exceptions import ParseError, ValidationError from django.db import transaction from apps.third.dahua import dhClient from apps.third.tapis import dhapis from apps.utils.tools import check_id_number_e, check_phone_e from apps.wf.serializers import TicketSimpleSerializer from apps.rpm.services import rpj_member_come, rpj_certificate_in from apps.rpm.models import RpjLog from django.conf import settings from django.db.models import Q class RpartyCreateUpdateSerializer(CustomModelSerializer): class Meta: model = Rparty fields = ['name', 'number', 'lawer', 'contacter', 'phone', 'email', 'description', 'belong_dept', 'address'] extra_kwargs = { 'belong_dept': {'required': True} } @transaction.atomic def create(self, validated_data): if BlackList.objects.filter(Q(name=validated_data['name'])|Q(number=validated_data['number'])).exists(): raise ParseError('该相关方在黑名单中') dept = Dept() dept.name = validated_data['name'] dept.parent = validated_data['belong_dept'] dept.type = 'rparty' dept.save() sync_dahua_dept(dept) validated_data['dept'] = dept return super().create(validated_data) @transaction.atomic def update(self, instance, validated_data): instance = super().update(instance, validated_data) dept = instance.dept if dept: dept.name = instance.name dept.is_deleted = False dept.parent = instance.belong_dept # 重新规划归属部门 dept.save() sync_dahua_dept(dept) return instance class RpartySerializer(CustomModelSerializer): admin_ = UserSimpleSerializer(source='admin', read_only=True) belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) class Meta: model = Rparty fields = '__all__' class RpartySimpleSerializer(CustomModelSerializer): class Meta: model = Rparty fields = ['id', 'name'] class RpartyAssignSerializer(serializers.ModelSerializer): name = serializers.CharField(label="姓名") phone = serializers.CharField(label="手机号") username = serializers.CharField(label="账号") class Meta: model = Rparty fields = ['admin', 'name', 'phone', 'username'] class RfileListSerializer(CustomModelSerializer): rparty_ = RpartySimpleSerializer(source='rparty', read_only=True) file_cate_ = DictSerializer(source='file_cate', read_only=True) files_ = FileSerializer(source='files', many=True, read_only=True) class Meta: model = Rfile fields = '__all__' class RpjUpdateSerializer(CustomModelSerializer): class Meta: model = Rpj fields = ['id', 'name', 'contract_number', 'type', 'come_time', 'leave_time', 'belong_dept', 'rparty'] class RpjCreateSerializer(RpjUpdateSerializer): rparty = serializers.PrimaryKeyRelatedField(queryset=Rparty.objects.all(), required=False, allow_null=True) belong_dept = serializers.PrimaryKeyRelatedField(queryset=Dept.objects.all(), required=False, allow_null=True) class RpjListSerializer(CustomModelSerializer): rparty_name = serializers.CharField(source='rparty.name', read_only=True) belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) create_by_name = serializers.CharField(source='create_by.name', read_only=True) ticket_ = TicketSimpleSerializer(source='ticket', read_only=True) class Meta: model = Rpj fields = '__all__' # class RemployeeCreateSerializer(CustomModelSerializer): # phone = serializers.CharField(label="手机号", validators=[]) # rparty = serializers.PrimaryKeyRelatedField(queryset=Rparty.objects.all(), label='相关方ID', required=False) # class Meta: # model = Remployee # fields = ['name', 'phone', 'photo', 'id_number', 'rparty'] # # model = Employee # # exclude = EXCLUDE_FIELDS + ['is_atwork', 'last_check_time', # # 'not_work_remark', 'third_info', 'type'] # # extra_kwargs = { # # 'phone': {'required': True}, # # 'number': {'required': True}, # # 'photo': {'required': True}, # # 'id_number': {'required': True}, # # } # def create(self, validated_data): # with transaction.atomic(): # # 校验上传的证件照 # dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo']) # return super().create(validated_data) class RemployeeCreateSerializer(CustomModelSerializer): rparty = serializers.PrimaryKeyRelatedField(queryset=Rparty.objects.all(), label='相关方ID', required=False) phone = serializers.CharField(label="手机号", validators=[check_phone_e]) photo = serializers.CharField(label='照片地址', required=True) id_number = serializers.CharField(label="身份证号", validators=[check_id_number_e], required=True) class Meta: model = Remployee fields = ['name', 'phone', 'photo', 'id_number', 'rparty'] def create(self, validated_data): if Remployee.objects.filter(id_number=validated_data['id_number'], rparty=validated_data['rparty']).exists(): raise ValidationError('该成员已存在') with transaction.atomic(): if settings.DAHUA_ENABLED: dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo']) return super().create(validated_data) class RemployeeUpdateSerializer(CustomModelSerializer): class Meta: model = Remployee fields = ['phone', 'photo'] def update(self, instance, validated_data): with transaction.atomic(): if settings.DAHUA_ENABLED: dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo']) return super().update(instance, validated_data) class RemployeeSimpleSerializer(CustomModelSerializer): class Meta: model = Remployee fields = ['id', 'name', 'photo', 'id_number'] class RemployeeSerializer(CustomModelSerializer): rparty_name = serializers.CharField(source='rparty.name', read_only=True) photo_f = MyFilePathField(source='photo', read_only=True) blt_ = serializers.SerializerMethodField() class Meta: model = Remployee fields = '__all__' def get_blt_(self, obj): from apps.third.serializers import TDeviceSimpleSerializer ep = obj.employee if ep and hasattr(ep, 'tdevice'): return TDeviceSimpleSerializer(instance=ep.tdevice).data class RcertificateCreateUpdateSerializer(CustomModelSerializer): class Meta: model = Rcertificate exclude = EXCLUDE_FIELDS + ['certificate'] class RcertificateSerializer(CustomModelSerializer): remployee_name = serializers.CharField(source='remployee.name', read_only=True) rparty_name = serializers.CharField(source='rparty.name', read_only=True) file_f = MyFilePathField(source='file', read_only=True) class Meta: model = Rcertificate fields = '__all__' class RpjmemberCreatesSerializer(CustomModelSerializer): employees = serializers.PrimaryKeyRelatedField( queryset=Employee.objects.filter(type='remployee'), many=True, label='员工ID列表' ) class Meta: model = Rpjmember fields = ['employees', 'Rpj'] class RpjmemberCreateSerializer(CustomModelSerializer): rcertificates = serializers.PrimaryKeyRelatedField(label='证书ID', many=True, queryset=Rcertificate.objects.all()) reason = serializers.CharField(label='后入厂原因', required=False, allow_blank=True) class Meta: model = Rpjmember fields = ['remployee', 'rpj', 'duty', 'is_manager', 'rcertificates', 'reason'] def create(self, validated_data): rpj = validated_data['rpj'] if rpj.state in [Rpj.RPJ_DONE, Rpj.RPJ_CLOSE]: raise ParseError('该项目状态成员不可新增') rcertificates = validated_data.pop('rcertificates') remployee = validated_data['remployee'] if remployee.phone and remployee.photo and remployee.id_number: pass else: raise ParseError('该成员信息不全请补充') if Rpjmember.objects.filter(remployee=remployee, rpj=validated_data['rpj']).exists(): raise ParseError('该成员已选择') with transaction.atomic(): ins = super().create(validated_data) for x in rcertificates: rpjc = Rpjcertificate.objects.filter(rpj_member=ins, rcertificate=x).first() if rpjc: pass else: rpjc = Rpjcertificate() rpjc.rpj_member = ins rpjc.rcertificate = x # for i in ['name', 'number', 'type', 'issue_date', 'expiration_date', 'review_date', 'file']: for f in Rcertificate._meta.fields: if f.name not in ['id']: setattr(rpjc, f.name, getattr(x, f.name, None)) rpjc.save() if ins.is_manager: Rpjmember.objects.exclude(id=ins.id).update(is_manager=False) if rpj.state in [Rpj.RPJ_ENTER, Rpj.RPJ_WORKING]: # 如果是待入厂后添加的 # 需要执行入厂操作 ins.note = '后入厂' ins.save() rpj_member_come(ins) rpj_certificate_in(ins) RpjLog.objects.create(rpj=rpj, operation='member_come', remployee=remployee, create_by=self.context['request'].user, reason=validated_data.get('reason', '')) return ins class RpjmemberUpdateSerializer(CustomModelSerializer): rcertificates = serializers.PrimaryKeyRelatedField(label='证书ID', many=True, queryset=Rcertificate.objects.all()) class Meta: model = Rpjmember fields = ['duty', 'is_manager', 'rcertificates'] def update(self, instance, validated_data): rpj = validated_data['rpj'] if rpj.state in [Rpj.RPJ_DONE, Rpj.RPJ_CLOSE]: raise ParseError('该项目状态成员不可修改') rcertificates = validated_data.pop('rcertificates') with transaction.atomic(): ins = super().update(instance, validated_data) for x in rcertificates: rpjc = Rpjcertificate.objects.filter(rpj_member=ins, rcertificate=x).first() if rpjc: pass else: rpjc = Rpjcertificate() rpjc.rpj_member = ins rpjc.rcertificate = x for f in Rcertificate._meta.fields: if f.name not in ['id']: setattr(rpjc, f.name, getattr(x, f.name, None)) rpjc.save() if ins.is_manager: Rpjmember.objects.exclude(id=ins.id).update(is_manager=False) if rpj.state in [Rpj.RPJ_ENTER, Rpj.RPJ_WORKING]: # 如果是待入厂后更改的 rpj_certificate_in(ins) return ins class RpjLogSerializer(CustomModelSerializer): remployee_ = RemployeeSimpleSerializer(source='remployee', read_only=True) create_by_ = UserSimpleSerializer(source='create_by', read_only=True) class Meta: model = RpjLog fields = '__all__' class RpjcertificateSerializer(CustomModelSerializer): file_f = MyFilePathField(source='file', read_only=True) class Meta: model = Rpjcertificate fields = ['rcertificate', 'name', 'type', 'number', 'issue_date', 'expiration_date', 'review_date', 'file', 'file_f'] class RpjmemberSerializer(CustomModelSerializer): remployee_ = RemployeeSerializer(source='remployee', read_only=True) rcertificates_ = serializers.SerializerMethodField() class Meta: model = Rpjmember fields = '__all__' def get_rcertificates_(self, obj): cs = Rpjcertificate.objects.filter(rpj_member=obj) return RpjcertificateSerializer(instance=cs, many=True).data class RpjfileSerializer(CustomModelSerializer): file_cate_ = DictSimpleSerializer(source='file_cate', read_only=True) files_ = FileSerializer(source='files', read_only=True, many=True) class Meta: model = Rpjfile fields = '__all__' class RpjfileUpdateSerializer(CustomModelSerializer): class Meta: model = Rpjfile fields = ['files'] class BlackListCreateSerializer(CustomModelSerializer): class Meta: model = BlackList fields = ['name', 'number', 'reason'] class BlackListUpdateSerializer(CustomModelSerializer): class Meta: model = BlackList fields = ['reason'] class BlackListSerializer(CustomModelSerializer): create_by_ = UserSimpleSerializer(source='create_by', read_only=True) update_by_ = UserSimpleSerializer(source='update_by', read_only=True) class Meta: model = BlackList fields = '__all__'