工作流修改

This commit is contained in:
曹前明 2022-07-15 08:48:42 +08:00
parent 69b9cb57cd
commit 343e9e0434
9 changed files with 65 additions and 101 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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) # 里面要加入回调才能继续流转

View File

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

View File

@ -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': '*'}