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.models import TDevice
|
||||||
from apps.third.tapis import dhapis
|
from apps.third.tapis import dhapis
|
||||||
from apps.third.clients import dhClient
|
from apps.third.clients import dhClient
|
||||||
from apps.utils.tools import rannum
|
from apps.utils.tools import rannum, ranstr
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ class HrmService:
|
||||||
"service": "ehs",
|
"service": "ehs",
|
||||||
"id": dh_id,
|
"id": dh_id,
|
||||||
"name": ep.name,
|
"name": ep.name,
|
||||||
"code": ep.number,
|
"code": ep.number if ep.number else ranstr(6),
|
||||||
"paperType": 111,
|
"paperType": 111,
|
||||||
"paperNumber": ep.id_number,
|
"paperNumber": ep.id_number,
|
||||||
"paperAddress": "default",
|
"paperAddress": "default",
|
||||||
|
@ -74,7 +74,7 @@ class HrmService:
|
||||||
"service": "ehs",
|
"service": "ehs",
|
||||||
"id": dh_id,
|
"id": dh_id,
|
||||||
"name": ep.name,
|
"name": ep.name,
|
||||||
"code": ep.number,
|
"code": ep.number if ep.number else ranstr(6),
|
||||||
"paperType": 111,
|
"paperType": 111,
|
||||||
"paperNumber": ep.id_number,
|
"paperNumber": ep.id_number,
|
||||||
"paperAddress": "default",
|
"paperAddress": "default",
|
||||||
|
@ -101,7 +101,7 @@ class HrmService:
|
||||||
dh_face_card = cls.open_face_card(
|
dh_face_card = cls.open_face_card(
|
||||||
ep=ep, dh_id=dh_id, departmentId=departmentId, start_time=start_time, end_time=end_time)
|
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}
|
return {'dh_id': dh_id, 'dh_photo': dh_photo, 'dh_face_card': dh_face_card, 'dh_dchannels': dh_dchannels}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -120,8 +120,9 @@ class HrmService:
|
||||||
"cardNumber": cardNumber,
|
"cardNumber": cardNumber,
|
||||||
"startDate": startDate,
|
"startDate": startDate,
|
||||||
"endDate": endDate,
|
"endDate": endDate,
|
||||||
|
"departmentId": departmentId,
|
||||||
}
|
}
|
||||||
_, res = dhClient.request(**dhapis['card_update'])
|
_, res = dhClient.request(**dhapis['card_update'], json=json_data)
|
||||||
return cardNumber
|
return cardNumber
|
||||||
else:
|
else:
|
||||||
_, res = dhClient.request(**dhapis['card_gen_id'])
|
_, res = dhClient.request(**dhapis['card_gen_id'])
|
||||||
|
@ -150,20 +151,24 @@ class HrmService:
|
||||||
return cardNumber
|
return cardNumber
|
||||||
|
|
||||||
@classmethod
|
@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
|
from apps.third.models import TDevice
|
||||||
|
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,
|
dh_dchannels = list(TDevice.objects.filter(type=TDevice.DEVICE_DCHANNEL,
|
||||||
access_list__contains=ep.type).values_list('code', flat=True))
|
access_list__contains=ep.type).values_list('code', flat=True))
|
||||||
|
if dh_dchannels:
|
||||||
details = []
|
details = []
|
||||||
for i in dh_dchannels:
|
for i in dh_dchannels:
|
||||||
details.append({
|
details.append({
|
||||||
"privilegeType": 1,
|
"privilegeType": 1,
|
||||||
"resouceCode": i
|
"resouceCode": i
|
||||||
})
|
})
|
||||||
|
|
||||||
json_data = {
|
json_data = {
|
||||||
"cardNumbers": [dh_face_card],
|
"cardNumbers": [dh_face_card],
|
||||||
"timeQuantumId": 1,
|
"timeQuantumId": 1,
|
||||||
|
|
|
@ -44,5 +44,4 @@ def rpj_audit_end(ticket):
|
||||||
Certificate.objects.get_or_create(
|
Certificate.objects.get_or_create(
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# 发送通知?
|
# 发送通知?
|
||||||
|
|
|
@ -47,6 +47,3 @@ def custom_exception_hander(exc, context):
|
||||||
return Response(data, status=status, headers=headers)
|
return Response(data, status=status, headers=headers)
|
||||||
args = (request_id, traceback.format_exc())
|
args = (request_id, traceback.format_exc())
|
||||||
myLogger.error(f"{args[0]}-{args[1]}")
|
myLogger.error(f"{args[0]}-{args[1]}")
|
||||||
return Response(data={'err_code': 'server_error',
|
|
||||||
'err_detail': '',
|
|
||||||
'err_msg': '服务器错误', 'request_id': request_id}, status=500)
|
|
||||||
|
|
|
@ -1,3 +1,14 @@
|
||||||
from django.test import TestCase
|
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.
|
# 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.models import Dept, User
|
||||||
from apps.system.serializers import UserSimpleSerializer
|
from apps.system.serializers import UserSimpleSerializer
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from apps.utils.serializers import CustomModelSerializer
|
||||||
|
|
||||||
from .models import State, Ticket, TicketFlow, Workflow, Transition, CustomField
|
from .models import State, Ticket, TicketFlow, Workflow, Transition, CustomField
|
||||||
|
|
||||||
|
|
||||||
class WorkflowSerializer(serializers.ModelSerializer):
|
class WorkflowSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Workflow
|
model = Workflow
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class StateSerializer(serializers.ModelSerializer):
|
class StateSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = State
|
model = State
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class WorkflowSimpleSerializer(serializers.ModelSerializer):
|
class WorkflowSimpleSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Workflow
|
model = Workflow
|
||||||
fields = ['id', 'name', 'key']
|
fields = ['id', 'name', 'key']
|
||||||
|
|
||||||
|
|
||||||
class StateSimpleSerializer(serializers.ModelSerializer):
|
class StateSimpleSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = State
|
model = State
|
||||||
fields = ['id', 'name', 'type', 'distribute_type', 'enable_retreat', 'enable_deliver']
|
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)
|
source_state_ = StateSimpleSerializer(source='source_state', read_only=True)
|
||||||
destination_state_ = StateSimpleSerializer(source='destination_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='名称')
|
name = serializers.CharField(label='名称')
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldSerializer(serializers.ModelSerializer):
|
class CustomFieldSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = CustomField
|
model = CustomField
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldCreateUpdateSerializer(serializers.ModelSerializer):
|
class CustomFieldCreateUpdateSerializer(CustomModelSerializer):
|
||||||
|
|
||||||
field_choice = FieldChoiceSerializer(label='选项列表', many=True, required=False)
|
field_choice = FieldChoiceSerializer(label='选项列表', many=True, required=False)
|
||||||
|
|
||||||
|
@ -74,13 +75,13 @@ class CustomFieldCreateUpdateSerializer(serializers.ModelSerializer):
|
||||||
'boolean_field_display', 'field_choice', 'label', 'is_hidden']
|
'boolean_field_display', 'field_choice', 'label', 'is_hidden']
|
||||||
|
|
||||||
|
|
||||||
class TicketSimpleSerializer(serializers.ModelSerializer):
|
class TicketSimpleSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Ticket
|
model = Ticket
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class TicketCreateSerializer(serializers.ModelSerializer):
|
class TicketCreateSerializer(CustomModelSerializer):
|
||||||
transition = serializers.PrimaryKeyRelatedField(queryset=Transition.objects.all(), write_only=True)
|
transition = serializers.PrimaryKeyRelatedField(queryset=Transition.objects.all(), write_only=True)
|
||||||
title = serializers.CharField(allow_blank=True, required=False)
|
title = serializers.CharField(allow_blank=True, required=False)
|
||||||
|
|
||||||
|
@ -92,7 +93,7 @@ class TicketCreateSerializer(serializers.ModelSerializer):
|
||||||
return super().create(validated_data)
|
return super().create(validated_data)
|
||||||
|
|
||||||
|
|
||||||
class TicketSerializer(serializers.ModelSerializer):
|
class TicketSerializer(CustomModelSerializer):
|
||||||
workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True)
|
workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True)
|
||||||
state_ = StateSimpleSerializer(source='state', read_only=True)
|
state_ = StateSimpleSerializer(source='state', read_only=True)
|
||||||
|
|
||||||
|
@ -106,7 +107,7 @@ class TicketSerializer(serializers.ModelSerializer):
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class TicketListSerializer(serializers.ModelSerializer):
|
class TicketListSerializer(CustomModelSerializer):
|
||||||
workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True)
|
workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True)
|
||||||
state_ = StateSimpleSerializer(source='state', read_only=True)
|
state_ = StateSimpleSerializer(source='state', read_only=True)
|
||||||
|
|
||||||
|
@ -121,7 +122,7 @@ class TicketListSerializer(serializers.ModelSerializer):
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class TicketDetailSerializer(serializers.ModelSerializer):
|
class TicketDetailSerializer(CustomModelSerializer):
|
||||||
workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True)
|
workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True)
|
||||||
state_ = StateSimpleSerializer(source='state', read_only=True)
|
state_ = StateSimpleSerializer(source='state', read_only=True)
|
||||||
ticket_data_ = serializers.SerializerMethodField()
|
ticket_data_ = serializers.SerializerMethodField()
|
||||||
|
@ -175,7 +176,7 @@ class TicketDetailSerializer(serializers.ModelSerializer):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
class TicketFlowSerializer(serializers.ModelSerializer):
|
class TicketFlowSerializer(CustomModelSerializer):
|
||||||
participant_ = UserSimpleSerializer(source='participant', read_only=True)
|
participant_ = UserSimpleSerializer(source='participant', read_only=True)
|
||||||
state_ = StateSimpleSerializer(source='state', read_only=True)
|
state_ = StateSimpleSerializer(source='state', read_only=True)
|
||||||
|
|
||||||
|
@ -184,7 +185,7 @@ class TicketFlowSerializer(serializers.ModelSerializer):
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class TicketFlowSimpleSerializer(serializers.ModelSerializer):
|
class TicketFlowSimpleSerializer(CustomModelSerializer):
|
||||||
participant_ = UserSimpleSerializer(source='participant', read_only=True)
|
participant_ = UserSimpleSerializer(source='participant', read_only=True)
|
||||||
state_ = StateSimpleSerializer(source='state', 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 django.db import transaction
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from apps.system.models import User
|
from apps.system.models import User
|
||||||
|
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
|
||||||
from apps.wf.filters import TicketFilterSet
|
from apps.wf.filters import TicketFilterSet
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, \
|
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, \
|
||||||
|
@ -61,7 +62,7 @@ class WorkflowKeyInitView(APIView):
|
||||||
return Response(ret)
|
return Response(ret)
|
||||||
|
|
||||||
|
|
||||||
class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
class WorkflowViewSet(CustomModelViewSet):
|
||||||
perms_map = {'get': '*', 'post': 'workflow:create',
|
perms_map = {'get': '*', 'post': 'workflow:create',
|
||||||
'put': 'workflow:update', 'delete': 'workflow:delete'}
|
'put': 'workflow:update', 'delete': 'workflow:delete'}
|
||||||
queryset = Workflow.objects.all()
|
queryset = Workflow.objects.all()
|
||||||
|
@ -125,7 +126,7 @@ class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
||||||
return Response(ret)
|
return Response(ret)
|
||||||
|
|
||||||
|
|
||||||
class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet):
|
class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, CustomGenericViewSet):
|
||||||
perms_map = {'get': '*', 'post': 'workflow:update',
|
perms_map = {'get': '*', 'post': 'workflow:update',
|
||||||
'put': 'workflow:update', 'delete': 'workflow:update'}
|
'put': 'workflow:update', 'delete': 'workflow:update'}
|
||||||
queryset = State.objects.all()
|
queryset = State.objects.all()
|
||||||
|
@ -135,7 +136,7 @@ class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, Destr
|
||||||
ordering = ['sort']
|
ordering = ['sort']
|
||||||
|
|
||||||
|
|
||||||
class TransitionViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet):
|
class TransitionViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, CustomGenericViewSet):
|
||||||
perms_map = {'get': '*', 'post': 'workflow:update',
|
perms_map = {'get': '*', 'post': 'workflow:update',
|
||||||
'put': 'workflow:update', 'delete': 'workflow:update'}
|
'put': 'workflow:update', 'delete': 'workflow:update'}
|
||||||
queryset = Transition.objects.all()
|
queryset = Transition.objects.all()
|
||||||
|
@ -145,7 +146,7 @@ class TransitionViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin,
|
||||||
ordering = ['id']
|
ordering = ['id']
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet):
|
class CustomFieldViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, CustomGenericViewSet):
|
||||||
perms_map = {'get': '*', 'post': 'workflow:update',
|
perms_map = {'get': '*', 'post': 'workflow:update',
|
||||||
'put': 'workflow:update', 'delete': 'workflow:update'}
|
'put': 'workflow:update', 'delete': 'workflow:update'}
|
||||||
queryset = CustomField.objects.all()
|
queryset = CustomField.objects.all()
|
||||||
|
@ -160,7 +161,7 @@ class CustomFieldViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin,
|
||||||
return super().get_serializer_class()
|
return super().get_serializer_class()
|
||||||
|
|
||||||
|
|
||||||
class TicketViewSet(CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
class TicketViewSet(CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, RetrieveModelMixin, CustomGenericViewSet):
|
||||||
perms_map = {'get': '*', 'post': '*'}
|
perms_map = {'get': '*', 'post': '*'}
|
||||||
queryset = Ticket.objects.all()
|
queryset = Ticket.objects.all()
|
||||||
serializer_class = TicketSerializer
|
serializer_class = TicketSerializer
|
||||||
|
@ -437,7 +438,7 @@ class TicketViewSet(CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, R
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
class TicketFlowViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
class TicketFlowViewSet(ListModelMixin, RetrieveModelMixin, CustomGenericViewSet):
|
||||||
"""
|
"""
|
||||||
工单日志
|
工单日志
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue