diff --git a/apps/ecm/service.py b/apps/ecm/service.py index d8b64956..04cf88f6 100644 --- a/apps/ecm/service.py +++ b/apps/ecm/service.py @@ -104,7 +104,7 @@ def notify_event(event: Event): voice_msg = '位于{}的未知人员,'.format(event.area.name) for i in event.cates.all(): voice_msg = voice_msg + i.name + ',' - event.voice_msg = voice_msg + ',请及时处理' + event.voice_msg = voice_msg + '请及时处理' event.save() # 喇叭播放 Thread(target=save_voice_and_speak, args=(event,), daemon=True).start() diff --git a/apps/hrm/serializers.py b/apps/hrm/serializers.py index 5c5dc3eb..706e4886 100755 --- a/apps/hrm/serializers.py +++ b/apps/hrm/serializers.py @@ -41,6 +41,12 @@ def phone_check(phone): return phone +class EmployeeImproveSerializer(CustomModelSerializer): + class Meta: + model = Employee + fields = ['phone', 'number', 'photo', 'id_number'] + + class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer): phone = serializers.CharField(label="手机号") diff --git a/apps/hrm/services.py b/apps/hrm/services.py index a6658cca..a52e6aa7 100755 --- a/apps/hrm/services.py +++ b/apps/hrm/services.py @@ -9,7 +9,18 @@ from datetime import datetime class HrmService: @classmethod - def sync_dahua_employee(cls, ep: Employee, old_photo=''): + def sync_dahua_employee(cls, ep: Employee, old_photo='', start_time=None, end_time=None): + """同步大华信息 + + Args: + ep (Employee): 人员实例 + old_photo (str, optional): 原照片地址. Defaults to ''. + start_time (_type_, optional): 开人脸卡起始时间. Defaults to None. + end_time (_type_, optional): 开人脸卡结束时间. Defaults to None. + + Returns: + _type_: _description_ + """ dh_id = None dh_photo = None dh_face_card = None @@ -57,8 +68,8 @@ class HrmService: dhClient.request(**dhapis['person_update'], json=json_data) # 开人脸卡 长时间 if ep.job_state in [Employee.JOB_ON]: - if not ep.third_info.get('dh_face_card', None): - dh_face_card = cls.open_face_card(ep=ep, dh_id=dh_id, departmentId=departmentId) + dh_face_card = cls.open_face_card( + ep=ep, dh_id=dh_id, departmentId=departmentId, start_time=start_time, end_time=end_time) else: _, res = dhClient.request(**dhapis['person_gen_id']) dh_id = res['id'] @@ -95,38 +106,54 @@ class HrmService: ) _, res = dhClient.request(**dhapis['person_add'], json=json_data) # 开人脸卡 - if ep.job_state in [Employee.JOB_ON] and ep.type == 'employee': - dh_face_card = cls.open_face_card(ep=ep, dh_id=dh_id, departmentId=departmentId) + if ep.job_state in [Employee.JOB_ON]: + dh_face_card = cls.open_face_card( + ep=ep, dh_id=dh_id, departmentId=departmentId, start_time=start_time, end_time=end_time) return {'dh_id': dh_id, 'dh_photo': dh_photo, 'dh_face_card': dh_face_card} @classmethod - def open_face_card(cls, ep, dh_id, departmentId): - """开人脸卡 + def open_face_card(cls, ep, dh_id, departmentId, start_time, end_time): + """开人脸卡/有卡就更新卡时间 """ - _, res = dhClient.request(**dhapis['card_gen_id']) - cardId = res['id'] - cardNumber = str(ep.id)[3:8] + rannum(5) - now = datetime.now() - if ep.type == 'employee': # 如果是内部人员 - 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") - elif ep.type == 'remployee': - pass - elif ep.type == 'visitor': - pass - json_data = { - "id": cardId, - "cardNumber": cardNumber, - "category": 0, - "cardType": 0, - "personId": dh_id, - "departmentId": departmentId, - "startDate": startDate, - "endDate": endDate - } - _, res = dhClient.request(**dhapis['card_add'], json=json_data) - return cardId + if not ep.third_info.get('dh_face_card', None): + cardNumber = ep.third_info.get('dh_face_card') + # 如果有人脸卡就执行更新操作 + if start_time is None: # 如果时间段未提供,跳过更新操作 + pass + else: + startDate = start_time.strftime("%Y-%m-%d %H:%M:%S") + endDate = end_time.strftime("%Y-%m-%d %H:%M:%S") + json_data = { + "cardNumber": cardNumber, + "startDate": startDate, + "endDate": endDate, + } + _, res = dhClient.request(**dhapis['card_update']) + return cardNumber + else: + _, res = dhClient.request(**dhapis['card_gen_id']) + cardId = res['id'] + cardNumber = str(ep.id)[3:8] + rannum(5) + now = datetime.now() + if start_time is None: # 如果未规定时间 + 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") + else: + startDate = start_time.strftime("%Y-%m-%d %H:%M:%S") + endDate = end_time.strftime("%Y-%m-%d %H:%M:%S") + json_data = { + "id": cardId, + "cardNumber": cardNumber, + "category": 0, + "cardType": 0, + "personId": dh_id, + "departmentId": departmentId, + "startDate": startDate, + "endDate": endDate + } + _, res = dhClient.request(**dhapis['card_add'], json=json_data) + return cardNumber @classmethod def swipe(cls, data: dict): diff --git a/apps/hrm/signals.py b/apps/hrm/signals.py index ffd24632..19e63d3c 100755 --- a/apps/hrm/signals.py +++ b/apps/hrm/signals.py @@ -7,16 +7,16 @@ from apps.hrm.models import Employee @receiver(post_save, sender=User) def updateEmployee(sender, instance, created, **kwargs): # if created: - if not instance.is_superuser: - ep, ep_created = Employee.objects.get_or_create(user=instance, - defaults={ - "user": instance, - "name": instance.name, - "phone": instance.phone, - "belong_dept": instance.belong_dept, - "post": instance.post - }) - if not ep_created: - ep.belong_dept = instance.belong_dept - ep.post = instance.post - ep.save() + ep, ep_created = Employee.objects.get_or_create(user=instance, + defaults={ + "user": instance, + "name": instance.name, + "phone": instance.phone, + "belong_dept": instance.belong_dept, + "post": instance.post, + "type": instance.type + }) + if not ep_created: + ep.belong_dept = instance.belong_dept + ep.post = instance.post + ep.save() diff --git a/apps/hrm/views.py b/apps/hrm/views.py index 37ca64a6..d39116bf 100755 --- a/apps/hrm/views.py +++ b/apps/hrm/views.py @@ -15,7 +15,7 @@ from apps.hrm.filters import (ClockRecordFilterSet, EmployeeFilterSet, from apps.hrm.models import Certificate, ClockRecord, Employee, NotWorkRemark from apps.hrm.serializers import (CertificateCreateUpdateSerializer, CertificateSerializer, ChannelAuthoritySerializer, ClockRecordListSerializer, - EmployeeCreateUpdateSerializer, + EmployeeCreateUpdateSerializer, EmployeeImproveSerializer, EmployeeNotWorkRemarkSerializer, EmployeeSerializer, NotWorkRemarkListSerializer) @@ -23,6 +23,7 @@ from apps.hrm.serializers import (CertificateCreateUpdateSerializer, Certificate from apps.third.clients import dhClient from apps.third.tapis import dhapis from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet +from rest_framework.permissions import IsAuthenticated # Create your views here. @@ -48,9 +49,30 @@ class EmployeeViewSet(CustomModelViewSet): 个人信息 """ user = request.user - if user.employee: - return Response(EmployeeSerializer(instance=user.employee).data) - raise ParseError('请先完善个人信息') + Employee.objects.get_or_create(user=user, + defaults={ + "user": user, + "name": user.name, + "phone": user.phone, + "belong_dept": user.belong_dept, + "post": user.post, + "type": user.type + }) + return Response(EmployeeSerializer(instance=user.employee).data) + + @action(methods=['post'], detail=True, permission_classes=[IsAuthenticated], + serializer_class=EmployeeImproveSerializer) + @transaction.atomic + def improve_info(self, request, *args, **kwargs): + """完善个人信息 + + 完善个人信息 + """ + ep = request.user.employee + serializer = EmployeeImproveSerializer(instance=ep, data=request.data) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response() @action(methods=['post'], detail=True, perms_map={'post': 'employee:notworkremark'}, serializer_class=EmployeeNotWorkRemarkSerializer) diff --git a/apps/rpm/services.py b/apps/rpm/services.py index a99a67c2..361ac907 100644 --- a/apps/rpm/services.py +++ b/apps/rpm/services.py @@ -1,5 +1,6 @@ +from apps.hrm.models import Employee from apps.wf.models import Ticket, Transition -from apps.rpm.models import Rpj +from apps.rpm.models import Rcertificate, Rpj, Rpjmember def bind_opl(ticket: Ticket, transition: Transition, new_ticket_data: dict): @@ -11,3 +12,30 @@ def bind_opl(ticket: Ticket, transition: Transition, new_ticket_data: dict): rpj.ticket = rpj rpj.save() + +def rpj_audit_end(ticket): + rpj = Rpj.objects.get(ticket=ticket) + if rpj.state == Rpj.RPJ_AUDIT: + rpj.state = Rpj.RPJ_ENTER + rpj.save() + # 更新入厂项目人员库 + for i in Rpjmember.objects.filter(rpj=rpj): + rep = i.remployee + ep = Employee.objects.filter(id_number=rep.id_number, type='remployee').first() + if ep: + pass + else: + ep = Employee() + ep.id_number = rep.id_number + ep.name = rep.name + ep.phone = rep.phone + ep.photo = rep.photo + ep.save() + rep.employee = ep + rep.save() + # 更新入厂项目人员证书库 + for i in Rcertificate.objects.filter(rpj=rpj): + + # 同步至大华人员库并下发人脸 + Thread(target=HrmService.sync_dahua_employee, args=(ep, '', visit.visit_time, visit.leave_time)).start() + # 发送通知? diff --git a/apps/third/tapis.py b/apps/third/tapis.py index 7dccb43e..23b89fb1 100755 --- a/apps/third/tapis.py +++ b/apps/third/tapis.py @@ -48,6 +48,10 @@ dhapis = { "url": "/evo-apigw/evo-brm/1.2.0/card/add", "method": "post" }, + "card_update": { + "url": "/evo-apigw/evo-brm/1.2.0/card/update", + "method": "put" + }, "card_gen_id": { "url": "/evo-apigw/evo-brm/1.0.0/card/generate-id", "method": "get" diff --git a/apps/vm/serializers.py b/apps/vm/serializers.py index 2048c0b8..bb33227f 100644 --- a/apps/vm/serializers.py +++ b/apps/vm/serializers.py @@ -2,7 +2,6 @@ from apps.hrm.models import Employee from apps.utils.constants import EXCLUDE_FIELDS from apps.utils.serializers import CustomModelSerializer from apps.vm.models import Visit, Visitor, Vpeople -from apps.hrm.serializers import phone_check from rest_framework import serializers from rest_framework.exceptions import ParseError from django.db import transaction @@ -24,7 +23,7 @@ class VisitSerializer(CustomModelSerializer): class VisitorCreateSerializer(CustomModelSerializer): - phone = serializers.CharField(label="手机号", validators=[phone_check]) + # phone = serializers.CharField(label="手机号", validators=[phone_check]) class Meta: model = Visitor diff --git a/apps/vm/services.py b/apps/vm/services.py index 707b9e06..842a59fd 100644 --- a/apps/vm/services.py +++ b/apps/vm/services.py @@ -1,4 +1,6 @@ +from threading import Thread from apps.hrm.models import Employee +from apps.hrm.services import HrmService from apps.vm.models import Visit, Vpeople @@ -29,10 +31,14 @@ def visit_audit_end(ticket): pass else: ep = Employee() + ep.id_number = visitor.id_number ep.name = visitor.name ep.phone = visitor.phone ep.photo = visitor.photo - ep.id_number = visitor.id_number ep.save() visitor.employee = ep + visitor.visit = visit #更新当前所属访客项目 visitor.save() + # 同步至大华人员库并下发人脸 + Thread(target=HrmService.sync_dahua_employee, args=(ep, '', visit.visit_time, visit.leave_time)).start() + # 发送通知? diff --git a/apps/vm/views.py b/apps/vm/views.py index ecab79a4..3287152e 100644 --- a/apps/vm/views.py +++ b/apps/vm/views.py @@ -83,27 +83,6 @@ class VisitorViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Custo password=password) return Response({'user': user.id}, status=201) - @action(methods=['post'], detail=False, permission_classes=[IsAuthenticated], - serializer_class=VisitorCreateSerializer) - @transaction.atomic - def improve_info(self, request, *args, **kwargs): - """完善个人信息 - - 完善个人信息 - """ - user = self.request.user - serializer = self.get_serializer(data=request.data) - serializer.is_valid(raise_exception=True) - vdata = serializer.validated_data - epdata = vdata - epdata['type'] = 'visitor' - epdata['user'] = user - ep = Employee(**epdata) - ep.save() - vdata['employee'] = ep - Visitor(**vdata).save() - return Response() - class VpeopleViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, DestroyModelMixin, CustomGenericViewSet): perms_map = {'get': '*', 'post': 'visit:update', 'put': 'visit:update', 'delete': 'visit:update'}