from apps.hrm.errors import DH_PHOTO_FALI, PHONE_EXIST, PHONE_F_WRONG from apps.system.models import Dept, User from rest_framework.serializers import ModelSerializer from rest_framework import serializers from apps.utils.serializers import CustomModelSerializer from apps.utils.constants import EXCLUDE_FIELDS from apps.utils.tools import rannum, ranstr from .models import ClockRecord, Employee, NotWorkRemark from apps.system.serializers import DeptSimpleSerializer,UserSimpleSerializer from django.db import transaction from apps.third.clients import dhClient from apps.third.tapis import dhapis import re from server.settings import DEBUG from rest_framework.exceptions import ParseError from datetime import datetime, timedelta class EmployeeBaseSerializer(CustomModelSerializer): def save(self, **kwargs): if self.validated_data.get('user', None): user = self.validated_data['user'] self.validated_data['name'] = user.name self.validated_data['belong_dept'] = user.belong_dept return super().save(**kwargs) def phone_check(phone): re_phone = '^1[358]\d{9}$|^147\d{8}$|^176\d{8}$' if not re.match(re_phone, phone): raise serializers.ValidationError(**PHONE_F_WRONG) return phone class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer): phone = serializers.CharField(label="手机号", validators=[phone_check]) class Meta: model = Employee exclude = EXCLUDE_FIELDS + ['face_data', 'is_atwork', 'last_check_time', 'not_work_remark', 'third_info'] extra_kwargs = { 'phone': {'required': True}, 'number': {'required': True}, 'photo': {'required': True}, 'id_number': {'required': True}, } @transaction.atomic def create(self, validated_data): instance = super().create(validated_data) if dhClient: # 创建人员 _, res = dhClient.request(**dhapis['person_gen_id']) personId = res['id'] departmentId = 1 if instance.belong_dept: try: departmentId = instance.belong_dept.third_info['dh_id'] except: pass json_data = { "service":"ehs", "id": personId, "name": instance.name, "code": instance.number, "paperType": 111, "paperNumber": instance.id_number, "paperAddress": "default", "departmentId": departmentId, "phone": instance.phone, "email": instance.email, "sex": 1 if instance.gender == '男' else 2 } _, res = dhClient.request(**dhapis['person_img_upload'], file_path_rela=instance.photo) dh_photo = res["fileUrl"] json_data.update( { "biosignatureTypeList":[3], "personBiosignatures":[{ "type":3, "index":1, "path": dh_photo }] } ) _, res = dhClient.request(**dhapis['person_add'], json=json_data) # 开人脸卡 _, res = dhClient.request(**dhapis['card_gen_id']) cardId = res['id'] cardNumber = instance.id[:8] + rannum(2) now = datetime.now() startDate = now.strftime("%Y-%m-%d %H:%M:%S") endDate = (datetime(year=now.year+50, month=now.month, day=1)).strftime("%Y-%m-%d %H:%M:%S") json_data = { "id": cardId, "cardNumber": cardNumber, "category": 0, "cardType": 0, "personId": personId, "departmentId":departmentId, "startDate": startDate, "endDate": endDate } _, res = dhClient.request(**dhapis['card_add'], json=json_data) instance.third_info = {'dh_id':personId, 'dh_photo':dh_photo, 'dh_face_card':res['id']} instance.save() return instance @transaction.atomic def update(self, instance, validated_data): old_photo = instance.photo instance = super().update(instance, validated_data) departmentId = 1 if instance.belong_dept: try: departmentId = instance.belong_dept.third_info['dh_id'] except: pass if dhClient: third_info = instance.third_info dh_id = instance.third_info['dh_id'] dh_photo = third_info['dh_photo'] json_data = { "service":"ehs", "id": dh_id, "name": instance.name, "code": instance.number, "paperType": 111, "paperNumber": instance.id_number, "paperAddress": "default", "departmentId": departmentId, "phone": instance.phone, "email": instance.email, "sex": 1 if instance.gender == '男' else 2, "biosignatureTypeList":[3], "personBiosignatures":[{ "type":3, "index":1, "path": third_info['dh_photo'] }] } if instance.photo != old_photo: _, res = dhClient.request(**dhapis['person_img_upload'], file_path_rela=instance.photo) dh_photo = res["fileUrl"] json_data.update( { "biosignatureTypeList":[3], "personBiosignatures":[{ "type":3, "index":1, "path": dh_photo }] } ) third_info['dh_photo'] = dh_photo dhClient.request(**dhapis['person_update'], json=json_data) # 开人脸卡 if instance.job_state in [Employee.JOB_ON]: if not third_info.get('dh_face_card', None): _, res = dhClient.request(**dhapis['card_gen_id']) cardId = res['id'] cardNumber = instance.id[3:8] + rannum(5) now = datetime.now() startDate = now.strftime("%Y-%m-%d %H:%M:%S") endDate = (datetime(year=now.year+50, month=now.month, day=1)).strftime("%Y-%m-%d %H:%M:%S") json_data = { "id": cardId, "cardNumber": cardNumber, "category": 0, "cardType": 0, "personId": third_info['dh_id'], "departmentId":departmentId, "startDate": startDate, "endDate": endDate } _, res = dhClient.request(**dhapis['card_add'], json=json_data) third_info['dh_face_card'] = cardNumber instance.save() return instance class ChannelAuthoritySerializer(serializers.Serializer): pks = serializers.ListField(child=serializers.CharField(max_length=20), label="员工ID列表") channels = serializers.ListField(child=serializers.CharField(max_length=20), label="门通道ID列表") class EmployeeSerializer(EmployeeBaseSerializer): belong_dept_ = DeptSimpleSerializer(source='belong_dept', read_only=True) class Meta: model = Employee exclude = ['face_data'] read_only_fields = ['is_atwork', 'last_check_time', 'not_work_remark'] class EmployeeNotWorkRemarkSerializer(ModelSerializer): class Meta: model = Employee fields = ['not_work_remark'] class ClockRecordListSerializer(serializers.ModelSerializer): create_by_ = UserSimpleSerializer(source='create_by', read_only=True) class Meta: model = ClockRecord fields = '__all__' class NotWorkRemarkListSerializer(serializers.ModelSerializer): class Meta: model = NotWorkRemark fields = '__all__'