工作流修改

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

View File

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

View File

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

View File

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

View File

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

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

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

View File

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