vm service bug

This commit is contained in:
曹前明 2022-07-14 13:29:50 +08:00
parent 83f6039499
commit 99543ed413
7 changed files with 67 additions and 53 deletions

View File

@ -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,27 +151,31 @@ 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)
dh_dchannels = list(TDevice.objects.filter(type=TDevice.DEVICE_DCHANNEL, if dh_dchannels:
access_list__contains=ep.type).values_list('code', flat=True)) pass
details = [] else:
for i in dh_dchannels: # 查找可授予的门禁
details.append({ dh_dchannels = list(TDevice.objects.filter(type=TDevice.DEVICE_DCHANNEL,
"privilegeType": 1, access_list__contains=ep.type).values_list('code', flat=True))
"resouceCode": i if dh_dchannels:
}) details = []
for i in dh_dchannels:
json_data = { details.append({
"cardNumbers": [dh_face_card], "privilegeType": 1,
"timeQuantumId": 1, "resouceCode": i
"cardPrivilegeDetails": details })
} json_data = {
dhClient.request(**dhapis['card_door_authority'], json=json_data) "cardNumbers": [dh_face_card],
cls.save(ep, data={'dh_dchannels': dh_dchannels}) "timeQuantumId": 1,
"cardPrivilegeDetails": details
}
dhClient.request(**dhapis['card_door_authority'], json=json_data)
cls.save(ep, data={'dh_dchannels': dh_dchannels})
return dh_dchannels return dh_dchannels
@classmethod @classmethod

View File

@ -39,10 +39,9 @@ def rpj_audit_end(ticket):
rep.save() rep.save()
# 同步至大华人员库并下发人脸 # 同步至大华人员库并下发人脸
Thread(target=HrmService.sync_dahua_employee, args=(ep, '', rpj.come_time, rpj.leave_time)).start() Thread(target=HrmService.sync_dahua_employee, args=(ep, '', rpj.come_time, rpj.leave_time)).start()
# 更新入厂项目人员证书库 # 更新入厂项目人员证书库
for i in Rcertificate.objects.filter(rpj=rpj): for i in Rcertificate.objects.filter(rpj=rpj):
Certificate.objects.get_or_create( Certificate.objects.get_or_create(
) )
# 发送通知?
# 发送通知?

View File

@ -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)

View File

@ -47,4 +47,4 @@ def visit_audit_end(ticket):
visitor.save() visitor.save()
# 同步至大华人员库并下发人脸 # 同步至大华人员库并下发人脸
Thread(target=HrmService.sync_dahua_employee, args=(ep, '', visit.visit_time, visit.leave_time)).start() Thread(target=HrmService.sync_dahua_employee, args=(ep, '', visit.visit_time, visit.leave_time)).start()
# 发送通知? # 发送通知?

View File

@ -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)

View File

@ -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)

View File

@ -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):
""" """
工单日志 工单日志
""" """