diff --git a/apps/hrm/services.py b/apps/hrm/services.py index 6c98d41a..d672759f 100755 --- a/apps/hrm/services.py +++ b/apps/hrm/services.py @@ -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 diff --git a/apps/rpm/services.py b/apps/rpm/services.py index 989fc332..fa7b86d6 100644 --- a/apps/rpm/services.py +++ b/apps/rpm/services.py @@ -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( - ) - - # 发送通知? + ) + # 发送通知? diff --git a/apps/utils/exceptions.py b/apps/utils/exceptions.py index da5a6bc7..88fdedcb 100755 --- a/apps/utils/exceptions.py +++ b/apps/utils/exceptions.py @@ -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) diff --git a/apps/vm/services.py b/apps/vm/services.py index 61f7d42e..5c49c6ad 100644 --- a/apps/vm/services.py +++ b/apps/vm/services.py @@ -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() - # 发送通知? + # 发送通知? diff --git a/apps/vm/tests.py b/apps/vm/tests.py index 7ce503c2..7213426a 100644 --- a/apps/vm/tests.py +++ b/apps/vm/tests.py @@ -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) diff --git a/apps/wf/serializers.py b/apps/wf/serializers.py index 0e695719..f36cf1ba 100755 --- a/apps/wf/serializers.py +++ b/apps/wf/serializers.py @@ -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) diff --git a/apps/wf/views.py b/apps/wf/views.py index 5811e768..2f73641d 100755 --- a/apps/wf/views.py +++ b/apps/wf/views.py @@ -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): """ 工单日志 """