工作流修改
This commit is contained in:
parent
69b9cb57cd
commit
343e9e0434
|
@ -1,3 +1,4 @@
|
||||||
|
import json
|
||||||
import time
|
import time
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
import uuid
|
import uuid
|
||||||
|
@ -93,7 +94,7 @@ class DhClient:
|
||||||
if raise_exception:
|
if raise_exception:
|
||||||
raise ParseError(**err_detail)
|
raise ParseError(**err_detail)
|
||||||
return 'fail', dict(detail=detail, code='dh_'+str(ret['code']))
|
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
|
return 'success', ret['data'] if 'data' in ret else None
|
||||||
|
|
||||||
self.handle_log(result='error', response=None)
|
self.handle_log(result='error', response=None)
|
||||||
|
@ -128,9 +129,14 @@ class DhClient:
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
code (str): 视频通道编号
|
code (str): 视频通道编号
|
||||||
|
|
||||||
|
返回完整访问地址
|
||||||
"""
|
"""
|
||||||
json_data = {
|
json_data = {
|
||||||
"deviceCode": "1000038",
|
"deviceCode": "1000038",
|
||||||
"operation": "generalJsonTransport",
|
"operation": "generalJsonTransport",
|
||||||
"params": "{\"method\":\"dev.snap\",\"id\":123,\"params\":{\"DevID\":\"1000038\",\"DevChannel\":0,\"PicNum\":1,\"SnapType\":1,\"CmdSrc\":0}}",
|
"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:
|
if raise_exception:
|
||||||
raise ParseError(**err_detail)
|
raise ParseError(**err_detail)
|
||||||
return 'fail', dict(detail=detail, code='sp_'+str(ret['code']))
|
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
|
return 'success', ret
|
||||||
self.handle_log(result='error', response=None)
|
self.handle_log(result='error', response=None)
|
||||||
if raise_exception:
|
if raise_exception:
|
||||||
|
|
|
@ -96,7 +96,7 @@ class XxClient:
|
||||||
if raise_exception:
|
if raise_exception:
|
||||||
raise ParseError(**err_detail)
|
raise ParseError(**err_detail)
|
||||||
return 'fail', err_detail
|
return 'fail', err_detail
|
||||||
self.handle_log(result='success', response=None)
|
# self.handle_log(result='success', response=None)
|
||||||
return 'success', ret['data']
|
return 'success', ret['data']
|
||||||
self.handle_log(result='error', response=None)
|
self.handle_log(result='error', response=None)
|
||||||
if raise_exception:
|
if raise_exception:
|
||||||
|
|
|
@ -17,34 +17,3 @@ def get_receptionist(state, ticket, new_ticket_data, handler):
|
||||||
visit = Visit.objects.filter(ticket=ticket).first()
|
visit = Visit.objects.filter(ticket=ticket).first()
|
||||||
if visit:
|
if visit:
|
||||||
return [visit.receptionist.id]
|
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.hrm.models import Employee
|
||||||
from apps.utils.task import CustomTask
|
from apps.utils.task import CustomTask
|
||||||
from apps.vm.models import Visit, Vpeople
|
from apps.vm.models import Visit, Vpeople
|
||||||
|
from apps.wf.models import Ticket
|
||||||
from celery import shared_task
|
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 django.utils import timezone
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import random
|
import random
|
||||||
from .scripts import GetParticipants, HandleScripts
|
|
||||||
from apps.utils.queryset import get_parent_queryset
|
from apps.utils.queryset import get_parent_queryset
|
||||||
|
|
||||||
|
|
||||||
|
@ -387,6 +386,21 @@ class WfService(object):
|
||||||
|
|
||||||
return ticket
|
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
|
@classmethod
|
||||||
def task_ticket(cls, ticket: Ticket):
|
def task_ticket(cls, ticket: Ticket):
|
||||||
"""
|
"""
|
||||||
|
@ -414,6 +428,4 @@ class WfService(object):
|
||||||
module, func = state.participant.rsplit(".", 1)
|
module, func = state.participant.rsplit(".", 1)
|
||||||
m = importlib.import_module(module)
|
m = importlib.import_module(module)
|
||||||
f = getattr(m, func)
|
f = getattr(m, func)
|
||||||
ticket.script_run_last_result = False
|
f.delay(ticket=ticket, script_str=state.participant) # 里面要加入回调才能继续流转
|
||||||
ticket.save()
|
|
||||||
f.delay(ticket_id=ticket.id, 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
|
TicketViewSet, TransitionViewSet, WorkflowKeyInitView, WorkflowViewSet
|
||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from rest_framework.routers import DefaultRouter
|
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('ticket', TicketViewSet, basename='wf_ticket')
|
||||||
router.register('ticketflow', TicketFlowViewSet, basename='wf_ticketflow')
|
router.register('ticketflow', TicketFlowViewSet, basename='wf_ticketflow')
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path(API_BASE_URL + 'participant_from_code', FromCodeListView.as_view()),
|
|
||||||
path(API_BASE_URL, include(router.urls)),
|
path(API_BASE_URL, include(router.urls)),
|
||||||
path(API_BASE_URL + 'workflow/<str:key>/init_key/', WorkflowKeyInitView.as_view())
|
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.exceptions import ParseError, NotFound
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from django.db.models import Count
|
from django.db.models import Count
|
||||||
from .scripts import GetParticipants
|
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
||||||
|
|
||||||
class FromCodeListView(APIView):
|
|
||||||
def get(self, request, format=None):
|
|
||||||
"""
|
|
||||||
获取处理人代码列表
|
|
||||||
"""
|
|
||||||
return Response(GetParticipants.all_funcs)
|
|
||||||
|
|
||||||
|
|
||||||
class WorkflowKeyInitView(APIView):
|
class WorkflowKeyInitView(APIView):
|
||||||
perms_map = {'get': '*'}
|
perms_map = {'get': '*'}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue