vm service bug
This commit is contained in:
parent
83f6039499
commit
99543ed413
|
@ -3,7 +3,7 @@ from apps.hrm.models import Employee
|
|||
from apps.third.models import TDevice
|
||||
from apps.third.tapis import dhapis
|
||||
from apps.third.clients import dhClient
|
||||
from apps.utils.tools import rannum
|
||||
from apps.utils.tools import rannum, ranstr
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
|
@ -37,7 +37,7 @@ class HrmService:
|
|||
"service": "ehs",
|
||||
"id": dh_id,
|
||||
"name": ep.name,
|
||||
"code": ep.number,
|
||||
"code": ep.number if ep.number else ranstr(6),
|
||||
"paperType": 111,
|
||||
"paperNumber": ep.id_number,
|
||||
"paperAddress": "default",
|
||||
|
@ -74,7 +74,7 @@ class HrmService:
|
|||
"service": "ehs",
|
||||
"id": dh_id,
|
||||
"name": ep.name,
|
||||
"code": ep.number,
|
||||
"code": ep.number if ep.number else ranstr(6),
|
||||
"paperType": 111,
|
||||
"paperNumber": ep.id_number,
|
||||
"paperAddress": "default",
|
||||
|
@ -101,7 +101,7 @@ class HrmService:
|
|||
dh_face_card = cls.open_face_card(
|
||||
ep=ep, dh_id=dh_id, departmentId=departmentId, start_time=start_time, end_time=end_time)
|
||||
# 授予门禁权限
|
||||
dh_dchannels = cls.door_auth(ep=ep, dh_face_card=dh_face_card)
|
||||
dh_dchannels = cls.door_auth(ep=ep)
|
||||
return {'dh_id': dh_id, 'dh_photo': dh_photo, 'dh_face_card': dh_face_card, 'dh_dchannels': dh_dchannels}
|
||||
|
||||
@classmethod
|
||||
|
@ -120,8 +120,9 @@ class HrmService:
|
|||
"cardNumber": cardNumber,
|
||||
"startDate": startDate,
|
||||
"endDate": endDate,
|
||||
"departmentId": departmentId,
|
||||
}
|
||||
_, res = dhClient.request(**dhapis['card_update'])
|
||||
_, res = dhClient.request(**dhapis['card_update'], json=json_data)
|
||||
return cardNumber
|
||||
else:
|
||||
_, res = dhClient.request(**dhapis['card_gen_id'])
|
||||
|
@ -150,27 +151,31 @@ class HrmService:
|
|||
return cardNumber
|
||||
|
||||
@classmethod
|
||||
def door_auth(cls, ep: Employee, dh_face_card: str):
|
||||
def door_auth(cls, ep: Employee, dh_dchannels: list = []):
|
||||
"""授予门禁权限
|
||||
"""
|
||||
from apps.third.models import TDevice
|
||||
# 查找可授予的门禁
|
||||
dh_dchannels = list(TDevice.objects.filter(type=TDevice.DEVICE_DCHANNEL,
|
||||
access_list__contains=ep.type).values_list('code', flat=True))
|
||||
details = []
|
||||
for i in dh_dchannels:
|
||||
details.append({
|
||||
"privilegeType": 1,
|
||||
"resouceCode": i
|
||||
})
|
||||
|
||||
json_data = {
|
||||
"cardNumbers": [dh_face_card],
|
||||
"timeQuantumId": 1,
|
||||
"cardPrivilegeDetails": details
|
||||
}
|
||||
dhClient.request(**dhapis['card_door_authority'], json=json_data)
|
||||
cls.save(ep, data={'dh_dchannels': dh_dchannels})
|
||||
dh_face_card = ep.third_info.get('dh_face_card', None)
|
||||
if dh_dchannels:
|
||||
pass
|
||||
else:
|
||||
# 查找可授予的门禁
|
||||
dh_dchannels = list(TDevice.objects.filter(type=TDevice.DEVICE_DCHANNEL,
|
||||
access_list__contains=ep.type).values_list('code', flat=True))
|
||||
if dh_dchannels:
|
||||
details = []
|
||||
for i in dh_dchannels:
|
||||
details.append({
|
||||
"privilegeType": 1,
|
||||
"resouceCode": i
|
||||
})
|
||||
json_data = {
|
||||
"cardNumbers": [dh_face_card],
|
||||
"timeQuantumId": 1,
|
||||
"cardPrivilegeDetails": details
|
||||
}
|
||||
dhClient.request(**dhapis['card_door_authority'], json=json_data)
|
||||
cls.save(ep, data={'dh_dchannels': dh_dchannels})
|
||||
return dh_dchannels
|
||||
|
||||
@classmethod
|
||||
|
|
|
@ -39,10 +39,9 @@ def rpj_audit_end(ticket):
|
|||
rep.save()
|
||||
# 同步至大华人员库并下发人脸
|
||||
Thread(target=HrmService.sync_dahua_employee, args=(ep, '', rpj.come_time, rpj.leave_time)).start()
|
||||
# 更新入厂项目人员证书库
|
||||
for i in Rcertificate.objects.filter(rpj=rpj):
|
||||
Certificate.objects.get_or_create(
|
||||
# 更新入厂项目人员证书库
|
||||
for i in Rcertificate.objects.filter(rpj=rpj):
|
||||
Certificate.objects.get_or_create(
|
||||
|
||||
)
|
||||
|
||||
# 发送通知?
|
||||
)
|
||||
# 发送通知?
|
||||
|
|
|
@ -47,6 +47,3 @@ def custom_exception_hander(exc, context):
|
|||
return Response(data, status=status, headers=headers)
|
||||
args = (request_id, traceback.format_exc())
|
||||
myLogger.error(f"{args[0]}-{args[1]}")
|
||||
return Response(data={'err_code': 'server_error',
|
||||
'err_detail': '',
|
||||
'err_msg': '服务器错误', 'request_id': request_id}, status=500)
|
||||
|
|
|
@ -47,4 +47,4 @@ def visit_audit_end(ticket):
|
|||
visitor.save()
|
||||
# 同步至大华人员库并下发人脸
|
||||
Thread(target=HrmService.sync_dahua_employee, args=(ep, '', visit.visit_time, visit.leave_time)).start()
|
||||
# 发送通知?
|
||||
# 发送通知?
|
||||
|
|
|
@ -1,3 +1,14 @@
|
|||
from django.test import TestCase
|
||||
from apps.hrm.models import Employee
|
||||
from apps.hrm.services import HrmService
|
||||
|
||||
from apps.vm.models import Visit
|
||||
|
||||
# Create your tests here.
|
||||
|
||||
|
||||
class VisitTest(TestCase):
|
||||
def test_audit_end(self):
|
||||
v = Visit.objects.get(id='1547401054033940480')
|
||||
ep = Employee.objects.get(id='1547406632055607296')
|
||||
HrmService.sync_dahua_employee(ep, '', v.visit_time, v.leave_time)
|
||||
|
|
|
@ -1,35 +1,36 @@
|
|||
from apps.system.models import Dept, User
|
||||
from apps.system.serializers import UserSimpleSerializer
|
||||
from rest_framework import serializers
|
||||
from apps.utils.serializers import CustomModelSerializer
|
||||
|
||||
from .models import State, Ticket, TicketFlow, Workflow, Transition, CustomField
|
||||
|
||||
|
||||
class WorkflowSerializer(serializers.ModelSerializer):
|
||||
class WorkflowSerializer(CustomModelSerializer):
|
||||
class Meta:
|
||||
model = Workflow
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class StateSerializer(serializers.ModelSerializer):
|
||||
class StateSerializer(CustomModelSerializer):
|
||||
class Meta:
|
||||
model = State
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class WorkflowSimpleSerializer(serializers.ModelSerializer):
|
||||
class WorkflowSimpleSerializer(CustomModelSerializer):
|
||||
class Meta:
|
||||
model = Workflow
|
||||
fields = ['id', 'name', 'key']
|
||||
|
||||
|
||||
class StateSimpleSerializer(serializers.ModelSerializer):
|
||||
class StateSimpleSerializer(CustomModelSerializer):
|
||||
class Meta:
|
||||
model = State
|
||||
fields = ['id', 'name', 'type', 'distribute_type', 'enable_retreat', 'enable_deliver']
|
||||
|
||||
|
||||
class TransitionSerializer(serializers.ModelSerializer):
|
||||
class TransitionSerializer(CustomModelSerializer):
|
||||
source_state_ = StateSimpleSerializer(source='source_state', read_only=True)
|
||||
destination_state_ = StateSimpleSerializer(source='destination_state', read_only=True)
|
||||
|
||||
|
@ -57,13 +58,13 @@ class FieldChoiceSerializer(serializers.Serializer):
|
|||
name = serializers.CharField(label='名称')
|
||||
|
||||
|
||||
class CustomFieldSerializer(serializers.ModelSerializer):
|
||||
class CustomFieldSerializer(CustomModelSerializer):
|
||||
class Meta:
|
||||
model = CustomField
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class CustomFieldCreateUpdateSerializer(serializers.ModelSerializer):
|
||||
class CustomFieldCreateUpdateSerializer(CustomModelSerializer):
|
||||
|
||||
field_choice = FieldChoiceSerializer(label='选项列表', many=True, required=False)
|
||||
|
||||
|
@ -74,13 +75,13 @@ class CustomFieldCreateUpdateSerializer(serializers.ModelSerializer):
|
|||
'boolean_field_display', 'field_choice', 'label', 'is_hidden']
|
||||
|
||||
|
||||
class TicketSimpleSerializer(serializers.ModelSerializer):
|
||||
class TicketSimpleSerializer(CustomModelSerializer):
|
||||
class Meta:
|
||||
model = Ticket
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class TicketCreateSerializer(serializers.ModelSerializer):
|
||||
class TicketCreateSerializer(CustomModelSerializer):
|
||||
transition = serializers.PrimaryKeyRelatedField(queryset=Transition.objects.all(), write_only=True)
|
||||
title = serializers.CharField(allow_blank=True, required=False)
|
||||
|
||||
|
@ -92,7 +93,7 @@ class TicketCreateSerializer(serializers.ModelSerializer):
|
|||
return super().create(validated_data)
|
||||
|
||||
|
||||
class TicketSerializer(serializers.ModelSerializer):
|
||||
class TicketSerializer(CustomModelSerializer):
|
||||
workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True)
|
||||
state_ = StateSimpleSerializer(source='state', read_only=True)
|
||||
|
||||
|
@ -106,7 +107,7 @@ class TicketSerializer(serializers.ModelSerializer):
|
|||
return queryset
|
||||
|
||||
|
||||
class TicketListSerializer(serializers.ModelSerializer):
|
||||
class TicketListSerializer(CustomModelSerializer):
|
||||
workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True)
|
||||
state_ = StateSimpleSerializer(source='state', read_only=True)
|
||||
|
||||
|
@ -121,7 +122,7 @@ class TicketListSerializer(serializers.ModelSerializer):
|
|||
return queryset
|
||||
|
||||
|
||||
class TicketDetailSerializer(serializers.ModelSerializer):
|
||||
class TicketDetailSerializer(CustomModelSerializer):
|
||||
workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True)
|
||||
state_ = StateSimpleSerializer(source='state', read_only=True)
|
||||
ticket_data_ = serializers.SerializerMethodField()
|
||||
|
@ -175,7 +176,7 @@ class TicketDetailSerializer(serializers.ModelSerializer):
|
|||
return
|
||||
|
||||
|
||||
class TicketFlowSerializer(serializers.ModelSerializer):
|
||||
class TicketFlowSerializer(CustomModelSerializer):
|
||||
participant_ = UserSimpleSerializer(source='participant', read_only=True)
|
||||
state_ = StateSimpleSerializer(source='state', read_only=True)
|
||||
|
||||
|
@ -184,7 +185,7 @@ class TicketFlowSerializer(serializers.ModelSerializer):
|
|||
fields = '__all__'
|
||||
|
||||
|
||||
class TicketFlowSimpleSerializer(serializers.ModelSerializer):
|
||||
class TicketFlowSimpleSerializer(CustomModelSerializer):
|
||||
participant_ = UserSimpleSerializer(source='participant', read_only=True)
|
||||
state_ = StateSimpleSerializer(source='state', read_only=True)
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ from django.utils import timezone
|
|||
from django.db import transaction
|
||||
from rest_framework.views import APIView
|
||||
from apps.system.models import User
|
||||
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
|
||||
from apps.wf.filters import TicketFilterSet
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, \
|
||||
|
@ -61,7 +62,7 @@ class WorkflowKeyInitView(APIView):
|
|||
return Response(ret)
|
||||
|
||||
|
||||
class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
||||
class WorkflowViewSet(CustomModelViewSet):
|
||||
perms_map = {'get': '*', 'post': 'workflow:create',
|
||||
'put': 'workflow:update', 'delete': 'workflow:delete'}
|
||||
queryset = Workflow.objects.all()
|
||||
|
@ -125,7 +126,7 @@ class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
|||
return Response(ret)
|
||||
|
||||
|
||||
class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet):
|
||||
class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, CustomGenericViewSet):
|
||||
perms_map = {'get': '*', 'post': 'workflow:update',
|
||||
'put': 'workflow:update', 'delete': 'workflow:update'}
|
||||
queryset = State.objects.all()
|
||||
|
@ -135,7 +136,7 @@ class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, Destr
|
|||
ordering = ['sort']
|
||||
|
||||
|
||||
class TransitionViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet):
|
||||
class TransitionViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, CustomGenericViewSet):
|
||||
perms_map = {'get': '*', 'post': 'workflow:update',
|
||||
'put': 'workflow:update', 'delete': 'workflow:update'}
|
||||
queryset = Transition.objects.all()
|
||||
|
@ -145,7 +146,7 @@ class TransitionViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin,
|
|||
ordering = ['id']
|
||||
|
||||
|
||||
class CustomFieldViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet):
|
||||
class CustomFieldViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, CustomGenericViewSet):
|
||||
perms_map = {'get': '*', 'post': 'workflow:update',
|
||||
'put': 'workflow:update', 'delete': 'workflow:update'}
|
||||
queryset = CustomField.objects.all()
|
||||
|
@ -160,7 +161,7 @@ class CustomFieldViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin,
|
|||
return super().get_serializer_class()
|
||||
|
||||
|
||||
class TicketViewSet(CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||
class TicketViewSet(CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, RetrieveModelMixin, CustomGenericViewSet):
|
||||
perms_map = {'get': '*', 'post': '*'}
|
||||
queryset = Ticket.objects.all()
|
||||
serializer_class = TicketSerializer
|
||||
|
@ -437,7 +438,7 @@ class TicketViewSet(CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, R
|
|||
return Response()
|
||||
|
||||
|
||||
class TicketFlowViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||
class TicketFlowViewSet(ListModelMixin, RetrieveModelMixin, CustomGenericViewSet):
|
||||
"""
|
||||
工单日志
|
||||
"""
|
||||
|
|
Loading…
Reference in New Issue