diff --git a/apps/vm/services.py b/apps/vm/services.py index 4b1822b3..addefab2 100644 --- a/apps/vm/services.py +++ b/apps/vm/services.py @@ -17,3 +17,33 @@ def get_receptionist(state, ticket, new_ticket_data, handler): visit = Visit.objects.filter(ticket=ticket).first() if visit: return [visit.receptionist.id] + + +def visit_audit_end(ticket): + visit = Visit.objects.get(ticket=ticket) + visit.state = Visit.V_ENTER + visit.save() + # 更新企业访客人员库 + for i in Vpeople.objects.filter(visit=visit): + visitor = i.visitor + if visitor.id_number and visitor.photo: + ep = Employee.objects.filter(id_number=visitor.id_number).first() + else: + ep = Employee.objects.filter(name=visitor.name, id_number=None).first() + if ep: + pass + else: + ep = Employee() + ep.id_number = visitor.id_number + ep.name = visitor.name + ep.phone = visitor.phone + ep.photo = visitor.photo + ep.type = 'visitor' + ep.belong_dept = visit.receptionist.belong_dept + ep.save() + visitor.employee = ep + visitor.visit = visit # 更新当前所属访客项目 + visitor.save() + # 同步至大华人员库并下发人脸 + HrmService.sync_dahua_employee(ep, '', visit.visit_time, visit.leave_time) + # 发送通知? diff --git a/apps/vm/tasks.py b/apps/vm/tasks.py index 9c08b51c..7a0f44d6 100644 --- a/apps/vm/tasks.py +++ b/apps/vm/tasks.py @@ -8,41 +8,3 @@ from celery import shared_task from apps.hrm.services import HrmService from apps.wf.services import WfService - -@shared_task(base=CustomTask) -def visit_exec(ticket_id, script_str): - ticket = Ticket.objects.get(id=ticket_id) - ticket.script_run_last_result = False - ticket.save() - visit = Visit.objects.get(ticket=ticket) - visit.state = Visit.V_ENTER - visit.save() - # 更新企业访客人员库 - for i in Vpeople.objects.filter(visit=visit): - visitor = i.visitor - if visitor.id_number and visitor.photo: - ep = Employee.objects.filter(id_number=visitor.id_number).first() - else: - ep = Employee.objects.filter(name=visitor.name, id_number=None).first() - if ep: - pass - else: - ep = Employee() - ep.id_number = visitor.id_number - ep.name = visitor.name - ep.phone = visitor.phone - ep.photo = visitor.photo - ep.type = 'visitor' - ep.belong_dept = visit.receptionist.belong_dept - ep.save() - visitor.employee = ep - visitor.visit = visit # 更新当前所属访客项目 - visitor.save() - # 同步至大华人员库并下发人脸 - HrmService.sync_dahua_employee(ep, '', visit.visit_time, visit.leave_time) - # 发送通知? - # 务必调用自动流转 - ticket.script_run_last_result = True - ticket.save() - if ticket.script_run_last_result: - WfService.auto_next(ticket, script_str) diff --git a/apps/wf/services.py b/apps/wf/services.py index ebc840a4..f28714df 100755 --- a/apps/wf/services.py +++ b/apps/wf/services.py @@ -7,6 +7,7 @@ from django.utils import timezone from datetime import timedelta import random from apps.utils.queryset import get_parent_queryset +from apps.wf.tasks import run_task class WfService(object): @@ -386,21 +387,6 @@ class WfService(object): return ticket - @classmethod - def auto_next(cls, ticket: Ticket, script_str: str): - # 获取信息 - transition_obj = Transition.objects.filter(source_state=ticket.state, is_deleted=False).first() - - TicketFlow.objects.create(ticket=ticket, state=ticket.state, - participant_type=State.PARTICIPANT_TYPE_ROBOT, - participant_str='func:{}'.format(script_str), - transition=transition_obj) - # 自动执行流转 - cls.handle_ticket(ticket=ticket, transition=transition_obj, - new_ticket_data=ticket.ticket_data, by_task=True) - - return ticket - @classmethod def task_ticket(cls, ticket: Ticket): """ @@ -425,7 +411,4 @@ class WfService(object): # 如果目标状态是脚本则异步执行 if state.participant_type == State.PARTICIPANT_TYPE_ROBOT: - module, func = state.participant.rsplit(".", 1) - m = importlib.import_module(module) - f = getattr(m, func) - f.delay(ticket_id=ticket.id, script_str=state.participant) # 里面要加入回调才能继续流转 + run_task.delay(ticket_id=ticket.id, script_str=state.participant) diff --git a/apps/wf/tasks.py b/apps/wf/tasks.py index 4f528ecd..a822dbd5 100644 --- a/apps/wf/tasks.py +++ b/apps/wf/tasks.py @@ -1,9 +1,10 @@ # Create your tasks here from __future__ import absolute_import, unicode_literals +import importlib +from sre_parse import State from apps.utils.task import CustomTask from celery import shared_task - -from apps.wf.serializers import TicketDetailSerializer +from apps.wf.models import Ticket, TicketFlow, Transition @shared_task(base=CustomTask) @@ -12,4 +13,34 @@ def send_ticket_notice(ticket_id): 发送通知 """ pass - \ No newline at end of file + + +@shared_task(base=CustomTask) +def run_task(ticket_id: str): + ticket = Ticket.objects.get(id=ticket_id) + script_result = True + script_result_msg = '' + script_str = ticket.participant + try: + module, func = script_str.rsplit(".", 1) + m = importlib.import_module(module) + f = getattr(m, func) + f(ticket) + except Exception as e: + script_result = False + script_result_msg = e.__str__() + ticket = Ticket.objects.filter(id=ticket_id).first() + if not script_result: + ticket.script_run_last_result = False + ticket.save() + # 记录日志 + transition_obj = Transition.objects.filter(source_state=ticket.state, is_deleted=False).first() + TicketFlow.objects.create(ticket=ticket, state=ticket.state, + participant_type=State.PARTICIPANT_TYPE_ROBOT, + participant_str='func:{}'.format(script_str), + transition=transition_obj, + suggestion=script_result_msg) + # 自动流转 + from apps.wf.services import WfService + WfService.handle_ticket(ticket=ticket, transition=transition_obj, + new_ticket_data=ticket.ticket_data, by_task=True) diff --git a/apps/wf/views.py b/apps/wf/views.py index 4be732f5..bd939237 100755 --- a/apps/wf/views.py +++ b/apps/wf/views.py @@ -21,6 +21,9 @@ from apps.wf.services import WfService from rest_framework.exceptions import ParseError, NotFound from rest_framework import status from django.db.models import Count +from rest_framework.serializers import Serializer + +from apps.wf.tasks import run_task # Create your views here. @@ -428,6 +431,19 @@ class TicketViewSet(CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, R Ticket.objects.filter(id__in=request.data.get('ids', [])).delete(soft=False) return Response() + @action(methods=['post'], detail=True, perms_map={'post': '*'}, + serializer_class=Serializer) + def retry_script(self, request, pk=None): + """重试脚本 + + 重试脚本 + """ + ticket = self.get_object() + if not ticket.script_run_last_result: + ticket.script_run_last_result = True + run_task(ticket.id) + return Response() + class TicketFlowViewSet(ListModelMixin, RetrieveModelMixin, CustomGenericViewSet): """