脚本重试

This commit is contained in:
曹前明 2022-07-15 10:14:02 +08:00
parent 9ce68c02df
commit d02b4c3313
5 changed files with 82 additions and 60 deletions

View File

@ -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)
# 发送通知?

View File

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

View File

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

View File

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

View File

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