hrm 完善个人信息
This commit is contained in:
parent
da0e356438
commit
62b3c44345
|
@ -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()
|
||||||
|
|
|
@ -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="手机号")
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
# 发送通知?
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
# 发送通知?
|
||||||
|
|
|
@ -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'}
|
||||||
|
|
Loading…
Reference in New Issue