工作流修改
This commit is contained in:
parent
69b9cb57cd
commit
343e9e0434
|
@ -1,3 +1,4 @@
|
|||
import json
|
||||
import time
|
||||
from threading import Thread
|
||||
import uuid
|
||||
|
@ -93,7 +94,7 @@ class DhClient:
|
|||
if raise_exception:
|
||||
raise ParseError(**err_detail)
|
||||
return 'fail', dict(detail=detail, code='dh_'+str(ret['code']))
|
||||
self.handle_log(result='success', response=ret)
|
||||
# self.handle_log(result='success', response=ret) # 成功的日志就不记录了
|
||||
return 'success', ret['data'] if 'data' in ret else None
|
||||
|
||||
self.handle_log(result='error', response=None)
|
||||
|
@ -128,9 +129,14 @@ class DhClient:
|
|||
|
||||
Args:
|
||||
code (str): 视频通道编号
|
||||
|
||||
返回完整访问地址
|
||||
"""
|
||||
json_data = {
|
||||
"deviceCode": "1000038",
|
||||
"operation": "generalJsonTransport",
|
||||
"params": "{\"method\":\"dev.snap\",\"id\":123,\"params\":{\"DevID\":\"1000038\",\"DevChannel\":0,\"PicNum\":1,\"SnapType\":1,\"CmdSrc\":0}}",
|
||||
}
|
||||
if '$' in code:
|
||||
d_code = code.split('$')[0]
|
||||
json_data['deviceCode'] = d_code
|
|
@ -102,7 +102,7 @@ class SpClient:
|
|||
if raise_exception:
|
||||
raise ParseError(**err_detail)
|
||||
return 'fail', dict(detail=detail, code='sp_'+str(ret['code']))
|
||||
self.handle_log(result='success', response=ret)
|
||||
# self.handle_log(result='success', response=ret)
|
||||
return 'success', ret
|
||||
self.handle_log(result='error', response=None)
|
||||
if raise_exception:
|
||||
|
|
|
@ -96,7 +96,7 @@ class XxClient:
|
|||
if raise_exception:
|
||||
raise ParseError(**err_detail)
|
||||
return 'fail', err_detail
|
||||
self.handle_log(result='success', response=None)
|
||||
# self.handle_log(result='success', response=None)
|
||||
return 'success', ret['data']
|
||||
self.handle_log(result='error', response=None)
|
||||
if raise_exception:
|
||||
|
|
|
@ -17,34 +17,3 @@ 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):
|
||||
if ticket.act_state == Ticket.TICKET_ACT_STATE_FINISH:
|
||||
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()
|
||||
# 同步至大华人员库并下发人脸
|
||||
Thread(target=HrmService.sync_dahua_employee, args=(ep, '', visit.visit_time, visit.leave_time)).start()
|
||||
# 发送通知?
|
||||
|
|
|
@ -3,6 +3,45 @@ from __future__ import absolute_import, unicode_literals
|
|||
from apps.hrm.models import Employee
|
||||
from apps.utils.task import CustomTask
|
||||
from apps.vm.models import Visit, Vpeople
|
||||
from apps.wf.models import Ticket
|
||||
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, script_str):
|
||||
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)
|
||||
|
|
|
@ -1,52 +0,0 @@
|
|||
from apps.system.models import User
|
||||
from apps.wf.models import State, Ticket, TicketFlow, Transition
|
||||
|
||||
|
||||
class GetParticipants:
|
||||
"""
|
||||
获取处理人脚本
|
||||
"""
|
||||
all_funcs = [
|
||||
{'func': 'get_create_by', 'name': '获取工单创建人'}
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def get_create_by(cls, state: dict = {}, ticket: dict = {}, new_ticket_data: dict = {}, handler: User = {}):
|
||||
"""工单创建人"""
|
||||
participant = ticket.create_by.id
|
||||
return participant
|
||||
|
||||
|
||||
class HandleScripts:
|
||||
"""
|
||||
任务处理脚本
|
||||
"""
|
||||
all_funcs = [
|
||||
{'func': 'handle_something', 'name': '处理一些工作'}
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def to_next(cls, ticket: Ticket, by_timer: bool = False,
|
||||
by_task: bool = False, by_hook: bool = False, 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)
|
||||
from .services import WfService
|
||||
|
||||
# 自动执行流转
|
||||
WfService.handle_ticket(ticket=ticket, transition=transition_obj,
|
||||
new_ticket_data=ticket.ticket_data, by_task=True)
|
||||
|
||||
return ticket
|
||||
|
||||
@classmethod
|
||||
def handle_something(cls, ticket: Ticket):
|
||||
"""处理一些工作"""
|
||||
# 任务处理代码区
|
||||
|
||||
# 调用自动流转
|
||||
ticket = cls.to_next(ticket=ticket, by_task=True, script_str='handle_something')
|
|
@ -6,7 +6,6 @@ from rest_framework.exceptions import APIException, PermissionDenied, Validation
|
|||
from django.utils import timezone
|
||||
from datetime import timedelta
|
||||
import random
|
||||
from .scripts import GetParticipants, HandleScripts
|
||||
from apps.utils.queryset import get_parent_queryset
|
||||
|
||||
|
||||
|
@ -387,6 +386,21 @@ 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):
|
||||
"""
|
||||
|
@ -414,6 +428,4 @@ class WfService(object):
|
|||
module, func = state.participant.rsplit(".", 1)
|
||||
m = importlib.import_module(module)
|
||||
f = getattr(m, func)
|
||||
ticket.script_run_last_result = False
|
||||
ticket.save()
|
||||
f.delay(ticket_id=ticket.id, script_str=state.participant) # 里面要加入回调才能继续流转
|
||||
f.delay(ticket=ticket, script_str=state.participant) # 里面要加入回调才能继续流转
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from apps.wf.views import CustomFieldViewSet, FromCodeListView, StateViewSet, TicketFlowViewSet, \
|
||||
from apps.wf.views import CustomFieldViewSet, StateViewSet, TicketFlowViewSet, \
|
||||
TicketViewSet, TransitionViewSet, WorkflowKeyInitView, WorkflowViewSet
|
||||
from django.urls import path, include
|
||||
from rest_framework.routers import DefaultRouter
|
||||
|
@ -14,7 +14,6 @@ router.register('customfield', CustomFieldViewSet, basename='wf_customfield')
|
|||
router.register('ticket', TicketViewSet, basename='wf_ticket')
|
||||
router.register('ticketflow', TicketFlowViewSet, basename='wf_ticketflow')
|
||||
urlpatterns = [
|
||||
path(API_BASE_URL + 'participant_from_code', FromCodeListView.as_view()),
|
||||
path(API_BASE_URL, include(router.urls)),
|
||||
path(API_BASE_URL + 'workflow/<str:key>/init_key/', WorkflowKeyInitView.as_view())
|
||||
]
|
||||
|
|
|
@ -21,19 +21,10 @@ 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 .scripts import GetParticipants
|
||||
|
||||
# Create your views here.
|
||||
|
||||
|
||||
class FromCodeListView(APIView):
|
||||
def get(self, request, format=None):
|
||||
"""
|
||||
获取处理人代码列表
|
||||
"""
|
||||
return Response(GetParticipants.all_funcs)
|
||||
|
||||
|
||||
class WorkflowKeyInitView(APIView):
|
||||
perms_map = {'get': '*'}
|
||||
|
||||
|
|
Loading…
Reference in New Issue