152 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
 | 
						|
from wsgiref.validate import validator
 | 
						|
from apps.hrm.serializers import EmployeeSimpleSerializer
 | 
						|
from apps.system.models import Dept
 | 
						|
from apps.utils.fields import MyFilePathField
 | 
						|
from apps.utils.serializers import CustomModelSerializer
 | 
						|
from apps.utils.tools import check_id_number_e, check_phone_e
 | 
						|
from apps.vm.models import Visit, Visitor, Vpeople
 | 
						|
from rest_framework import serializers
 | 
						|
from rest_framework.exceptions import ParseError
 | 
						|
from django.db import transaction
 | 
						|
from apps.third.dahua import dhClient
 | 
						|
from apps.third.tapis import dhapis
 | 
						|
from apps.system.serializers import UserSimpleSerializer, FileSerializer
 | 
						|
from apps.wf.serializers import TicketSerializer
 | 
						|
 | 
						|
 | 
						|
class VisitCreateUpdateSerializer(CustomModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = Visit
 | 
						|
        fields = ['id', 'purpose', 'name', 'description', 'visit_time',
 | 
						|
                  'leave_time', 'receptionist', 'company', 'level', 'count_people', 'vehicle_photos']
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        receptionist = validated_data.get('receptionist', None)
 | 
						|
        if receptionist is None and validated_data['purpose'] != 50:
 | 
						|
            raise ParseError('请指定接待人')
 | 
						|
        if receptionist:
 | 
						|
            if receptionist.type != 'employee':
 | 
						|
                raise ParseError('接待人需为正式员工')
 | 
						|
            validated_data['belong_dept'] = validated_data['receptionist'].belong_dept
 | 
						|
        else:
 | 
						|
            validated_data['belong_dept'] = Dept.objects.all().order_by('create_time').first()
 | 
						|
        return super().create(validated_data)
 | 
						|
 | 
						|
    def update(self, instance, validated_data):
 | 
						|
        receptionist = validated_data.get('receptionist', None)
 | 
						|
        if receptionist is None and validated_data['purpose'] != 50:
 | 
						|
            raise ParseError('请指定接待人')
 | 
						|
        if receptionist:
 | 
						|
            if receptionist.type != 'employee':
 | 
						|
                raise ParseError('接待人需为正式员工')
 | 
						|
            validated_data['belong_dept'] = validated_data['receptionist'].belong_dept
 | 
						|
        else:
 | 
						|
            validated_data['belong_dept'] = Dept.objects.all().order_by('create_time').first()
 | 
						|
        return super().update(instance, validated_data)
 | 
						|
 | 
						|
 | 
						|
class VisitSerializer(CustomModelSerializer):
 | 
						|
    receptionist_ = UserSimpleSerializer(source='receptionist', read_only=True)
 | 
						|
    ticket_ = TicketSerializer(source='ticket', read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Visit
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
 | 
						|
class VisitorCreateSerializer(CustomModelSerializer):
 | 
						|
    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 = Visitor
 | 
						|
        fields = ['name', 'phone', 'photo', 'id_number']
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        with transaction.atomic():
 | 
						|
            # 校验上传的证件照
 | 
						|
            if validated_data.get('photo', None):
 | 
						|
                dhClient.request(
 | 
						|
                    **dhapis['person_img_upload'], file_path_rela=validated_data['photo'])
 | 
						|
            return super().create(validated_data)
 | 
						|
 | 
						|
 | 
						|
class VisitorSerializer(CustomModelSerializer):
 | 
						|
    photo_f = MyFilePathField(source='photo', read_only=True)
 | 
						|
    blt_ = serializers.SerializerMethodField()
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Visitor
 | 
						|
        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 VpeopleCreateSerializer(CustomModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = Vpeople
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        visit = validated_data['visit']
 | 
						|
        visitor = validated_data['visitor']
 | 
						|
        if visit.state != Visit.V_CREATE:
 | 
						|
            raise ParseError('项目非创建状态不可新增成员')
 | 
						|
        if visit.level == 10:
 | 
						|
            if visitor.id_number and visitor.photo:
 | 
						|
                pass
 | 
						|
            else:
 | 
						|
                raise ParseError('访客信息不全,请完善后再试')
 | 
						|
        if Vpeople.objects.filter(visit=visit, visitor=visitor).exists():
 | 
						|
            raise ParseError('该访客已选中')
 | 
						|
        ins = super().create(validated_data)
 | 
						|
        if ins.is_main:
 | 
						|
            Vpeople.objects.filter(visit=visit).exclude(
 | 
						|
                id=ins.id).update(is_main=False)
 | 
						|
        if visit.level == 10:
 | 
						|
            visit.count_people = Vpeople.objects.filter(visit=visit).count()
 | 
						|
            visit.save()
 | 
						|
        return ins
 | 
						|
 | 
						|
 | 
						|
class VpeopleSerializer(CustomModelSerializer):
 | 
						|
    visitor_ = VisitorSerializer(source='visitor', read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Vpeople
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
 | 
						|
class VisitorRegisterSerializer(serializers.Serializer):
 | 
						|
    type = serializers.CharField(label="人员类型")
 | 
						|
    name = serializers.CharField(label="姓名")
 | 
						|
    phone = serializers.CharField(label="手机号")
 | 
						|
    code = serializers.CharField(label='手机号验证码')
 | 
						|
    wxmp_openid = serializers.CharField(label='微信小程序ID', required=False)
 | 
						|
    wx_openid = serializers.CharField(label='微信公众号ID', required=False)
 | 
						|
 | 
						|
 | 
						|
class VisitDetailSerializer(CustomModelSerializer):
 | 
						|
    receptionist_ = UserSimpleSerializer(source='receptionist', read_only=True)
 | 
						|
    receptionist_name = serializers.CharField(
 | 
						|
        source='receptionist.name', read_only=True)
 | 
						|
    visitors_ = serializers.SerializerMethodField()
 | 
						|
    ticket_ = TicketSerializer(source='ticket', read_only=True)
 | 
						|
    vehicle_photos_ = FileSerializer(source='vehicle_photos', read_only=True, many=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Visit
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
    def get_visitors_(self, obj):
 | 
						|
        objs = Vpeople.objects.filter(
 | 
						|
            visit=obj).order_by('is_main', 'create_time')
 | 
						|
        return VpeopleSerializer(instance=objs, many=True).data
 |