hrm 完善个人信息

This commit is contained in:
曹前明 2022-07-11 09:13:19 +08:00
parent da0e356438
commit 62b3c44345
10 changed files with 145 additions and 74 deletions

View File

@ -104,7 +104,7 @@ def notify_event(event: Event):
voice_msg = '位于{}的未知人员,'.format(event.area.name) voice_msg = '位于{}的未知人员,'.format(event.area.name)
for i in event.cates.all(): for i in event.cates.all():
voice_msg = voice_msg + i.name + ',' voice_msg = voice_msg + i.name + ','
event.voice_msg = voice_msg + ',请及时处理' event.voice_msg = voice_msg + '请及时处理'
event.save() event.save()
# 喇叭播放 # 喇叭播放
Thread(target=save_voice_and_speak, args=(event,), daemon=True).start() Thread(target=save_voice_and_speak, args=(event,), daemon=True).start()

View File

@ -41,6 +41,12 @@ def phone_check(phone):
return phone return phone
class EmployeeImproveSerializer(CustomModelSerializer):
class Meta:
model = Employee
fields = ['phone', 'number', 'photo', 'id_number']
class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer): class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer):
phone = serializers.CharField(label="手机号") phone = serializers.CharField(label="手机号")

View File

@ -9,7 +9,18 @@ from datetime import datetime
class HrmService: class HrmService:
@classmethod @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_id = None
dh_photo = None dh_photo = None
dh_face_card = None dh_face_card = None
@ -57,8 +68,8 @@ class HrmService:
dhClient.request(**dhapis['person_update'], json=json_data) dhClient.request(**dhapis['person_update'], json=json_data)
# 开人脸卡 长时间 # 开人脸卡 长时间
if ep.job_state in [Employee.JOB_ON]: 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(
dh_face_card = cls.open_face_card(ep=ep, dh_id=dh_id, departmentId=departmentId) ep=ep, dh_id=dh_id, departmentId=departmentId, start_time=start_time, end_time=end_time)
else: else:
_, res = dhClient.request(**dhapis['person_gen_id']) _, res = dhClient.request(**dhapis['person_gen_id'])
dh_id = res['id'] dh_id = res['id']
@ -95,38 +106,54 @@ class HrmService:
) )
_, res = dhClient.request(**dhapis['person_add'], json=json_data) _, res = dhClient.request(**dhapis['person_add'], json=json_data)
# 开人脸卡 # 开人脸卡
if ep.job_state in [Employee.JOB_ON] and ep.type == 'employee': if ep.job_state in [Employee.JOB_ON]:
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)
return {'dh_id': dh_id, 'dh_photo': dh_photo, 'dh_face_card': dh_face_card} return {'dh_id': dh_id, 'dh_photo': dh_photo, 'dh_face_card': dh_face_card}
@classmethod @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']) if not ep.third_info.get('dh_face_card', None):
cardId = res['id'] cardNumber = ep.third_info.get('dh_face_card')
cardNumber = str(ep.id)[3:8] + rannum(5) # 如果有人脸卡就执行更新操作
now = datetime.now() if start_time is None: # 如果时间段未提供,跳过更新操作
if ep.type == 'employee': # 如果是内部人员 pass
startDate = now.strftime("%Y-%m-%d %H:%M:%S") else:
endDate = (datetime(year=now.year+50, startDate = start_time.strftime("%Y-%m-%d %H:%M:%S")
month=now.month, day=1)).strftime("%Y-%m-%d %H:%M:%S") endDate = end_time.strftime("%Y-%m-%d %H:%M:%S")
elif ep.type == 'remployee': json_data = {
pass "cardNumber": cardNumber,
elif ep.type == 'visitor': "startDate": startDate,
pass "endDate": endDate,
json_data = { }
"id": cardId, _, res = dhClient.request(**dhapis['card_update'])
"cardNumber": cardNumber, return cardNumber
"category": 0, else:
"cardType": 0, _, res = dhClient.request(**dhapis['card_gen_id'])
"personId": dh_id, cardId = res['id']
"departmentId": departmentId, cardNumber = str(ep.id)[3:8] + rannum(5)
"startDate": startDate, now = datetime.now()
"endDate": endDate if start_time is None: # 如果未规定时间
} startDate = now.strftime("%Y-%m-%d %H:%M:%S")
_, res = dhClient.request(**dhapis['card_add'], json=json_data) endDate = (datetime(year=now.year+50,
return cardId 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 @classmethod
def swipe(cls, data: dict): def swipe(cls, data: dict):

View File

@ -7,16 +7,16 @@ from apps.hrm.models import Employee
@receiver(post_save, sender=User) @receiver(post_save, sender=User)
def updateEmployee(sender, instance, created, **kwargs): def updateEmployee(sender, instance, created, **kwargs):
# if created: # if created:
if not instance.is_superuser: ep, ep_created = Employee.objects.get_or_create(user=instance,
ep, ep_created = Employee.objects.get_or_create(user=instance, defaults={
defaults={ "user": instance,
"user": instance, "name": instance.name,
"name": instance.name, "phone": instance.phone,
"phone": instance.phone, "belong_dept": instance.belong_dept,
"belong_dept": instance.belong_dept, "post": instance.post,
"post": instance.post "type": instance.type
}) })
if not ep_created: if not ep_created:
ep.belong_dept = instance.belong_dept ep.belong_dept = instance.belong_dept
ep.post = instance.post ep.post = instance.post
ep.save() ep.save()

View File

@ -15,7 +15,7 @@ from apps.hrm.filters import (ClockRecordFilterSet, EmployeeFilterSet,
from apps.hrm.models import Certificate, ClockRecord, Employee, NotWorkRemark from apps.hrm.models import Certificate, ClockRecord, Employee, NotWorkRemark
from apps.hrm.serializers import (CertificateCreateUpdateSerializer, CertificateSerializer, ChannelAuthoritySerializer, from apps.hrm.serializers import (CertificateCreateUpdateSerializer, CertificateSerializer, ChannelAuthoritySerializer,
ClockRecordListSerializer, ClockRecordListSerializer,
EmployeeCreateUpdateSerializer, EmployeeCreateUpdateSerializer, EmployeeImproveSerializer,
EmployeeNotWorkRemarkSerializer, EmployeeNotWorkRemarkSerializer,
EmployeeSerializer, EmployeeSerializer,
NotWorkRemarkListSerializer) NotWorkRemarkListSerializer)
@ -23,6 +23,7 @@ from apps.hrm.serializers import (CertificateCreateUpdateSerializer, Certificate
from apps.third.clients import dhClient from apps.third.clients import dhClient
from apps.third.tapis import dhapis from apps.third.tapis import dhapis
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from rest_framework.permissions import IsAuthenticated
# Create your views here. # Create your views here.
@ -48,9 +49,30 @@ class EmployeeViewSet(CustomModelViewSet):
个人信息 个人信息
""" """
user = request.user user = request.user
if user.employee: Employee.objects.get_or_create(user=user,
return Response(EmployeeSerializer(instance=user.employee).data) defaults={
raise ParseError('请先完善个人信息') "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'}, @action(methods=['post'], detail=True, perms_map={'post': 'employee:notworkremark'},
serializer_class=EmployeeNotWorkRemarkSerializer) serializer_class=EmployeeNotWorkRemarkSerializer)

View File

@ -1,5 +1,6 @@
from apps.hrm.models import Employee
from apps.wf.models import Ticket, Transition 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): 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.ticket = rpj
rpj.save() 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()
# 发送通知?

View File

@ -48,6 +48,10 @@ dhapis = {
"url": "/evo-apigw/evo-brm/1.2.0/card/add", "url": "/evo-apigw/evo-brm/1.2.0/card/add",
"method": "post" "method": "post"
}, },
"card_update": {
"url": "/evo-apigw/evo-brm/1.2.0/card/update",
"method": "put"
},
"card_gen_id": { "card_gen_id": {
"url": "/evo-apigw/evo-brm/1.0.0/card/generate-id", "url": "/evo-apigw/evo-brm/1.0.0/card/generate-id",
"method": "get" "method": "get"

View File

@ -2,7 +2,6 @@ from apps.hrm.models import Employee
from apps.utils.constants import EXCLUDE_FIELDS from apps.utils.constants import EXCLUDE_FIELDS
from apps.utils.serializers import CustomModelSerializer from apps.utils.serializers import CustomModelSerializer
from apps.vm.models import Visit, Visitor, Vpeople from apps.vm.models import Visit, Visitor, Vpeople
from apps.hrm.serializers import phone_check
from rest_framework import serializers from rest_framework import serializers
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from django.db import transaction from django.db import transaction
@ -24,7 +23,7 @@ class VisitSerializer(CustomModelSerializer):
class VisitorCreateSerializer(CustomModelSerializer): class VisitorCreateSerializer(CustomModelSerializer):
phone = serializers.CharField(label="手机号", validators=[phone_check]) # phone = serializers.CharField(label="手机号", validators=[phone_check])
class Meta: class Meta:
model = Visitor model = Visitor

View File

@ -1,4 +1,6 @@
from threading import Thread
from apps.hrm.models import Employee from apps.hrm.models import Employee
from apps.hrm.services import HrmService
from apps.vm.models import Visit, Vpeople from apps.vm.models import Visit, Vpeople
@ -29,10 +31,14 @@ def visit_audit_end(ticket):
pass pass
else: else:
ep = Employee() ep = Employee()
ep.id_number = visitor.id_number
ep.name = visitor.name ep.name = visitor.name
ep.phone = visitor.phone ep.phone = visitor.phone
ep.photo = visitor.photo ep.photo = visitor.photo
ep.id_number = visitor.id_number
ep.save() ep.save()
visitor.employee = ep visitor.employee = ep
visitor.visit = visit #更新当前所属访客项目
visitor.save() visitor.save()
# 同步至大华人员库并下发人脸
Thread(target=HrmService.sync_dahua_employee, args=(ep, '', visit.visit_time, visit.leave_time)).start()
# 发送通知?

View File

@ -83,27 +83,6 @@ class VisitorViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Custo
password=password) password=password)
return Response({'user': user.id}, status=201) 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): class VpeopleViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, DestroyModelMixin, CustomGenericViewSet):
perms_map = {'get': '*', 'post': 'visit:update', 'put': 'visit:update', 'delete': 'visit:update'} perms_map = {'get': '*', 'post': 'visit:update', 'put': 'visit:update', 'delete': 'visit:update'}