-
Notifications
You must be signed in to change notification settings - Fork 681
/
workflow_state_service.py
183 lines (167 loc) · 9.5 KB
/
workflow_state_service.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# import json
import json
from django.db.models import QuerySet
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from apps.ticket.models import TicketCustomField
from apps.workflow.models import State
from service.base_service import BaseService
from service.common.constant_service import CONSTANT_SERVICE
from service.common.log_service import auto_log
from service.workflow.workflow_custom_field_service import WorkflowCustomFieldService
from service.workflow.workflow_transition_service import WorkflowTransitionService
class WorkflowStateService(BaseService):
def __init__(self):
pass
@staticmethod
@auto_log
def get_workflow_states(workflow_id):
"""
获取流程的状态列表,每个流程的state不会很多,所以不分页
:param self:
:param workflow_id:
:return:
"""
if not workflow_id:
return False, 'except workflow_id but not provided'
else:
workflow_states = State.objects.filter(workflow_id=workflow_id, is_deleted=False).order_by('order_id')
return workflow_states, ''
@staticmethod
@auto_log
def get_workflow_states_serialize(workflow_id, per_page=10, page=1):
"""
获取序列化工作流状态记录
:param workflow_id:
:param per_page:
:param page:
:return:
"""
if not workflow_id:
return False, 'except workflow_id but not provided'
workflow_states = State.objects.filter(workflow_id=workflow_id, is_deleted=False).order_by('order_id')
paginator = Paginator(workflow_states, per_page)
try:
workflow_states_result_paginator = paginator.page(page)
except PageNotAnInteger:
workflow_states_result_paginator = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results
workflow_states_result_paginator = paginator.page(paginator.num_pages)
workflow_states_object_list = workflow_states_result_paginator.object_list
workflow_states_restful_list = []
for workflow_states_object in workflow_states_object_list:
result_dict = dict(id=id, name=workflow_states_object.name, workflow_id=workflow_states_object.workflow_id,
sub_workflow_id=workflow_states_object.sub_workflow_id, is_hidden=workflow_states_object.is_hidden,
order_id=workflow_states_object.order_id, type_id=workflow_states_object.type_id,
participant_type_id=workflow_states_object.participant_type_id, participant=workflow_states_object.participant,
distribute_type_id=workflow_states_object.distribute_type_id,
state_field_str=json.loads(workflow_states_object.state_field_str), label=json.loads(workflow_states_object.label),
creator=workflow_states_object.creator,
gmt_created=str(workflow_states_object.gmt_created)[:19])
workflow_states_restful_list.append(result_dict)
return workflow_states_restful_list, dict(per_page=per_page, page=page, total=paginator.count)
@staticmethod
@auto_log
def get_workflow_state_by_id(state_id):
"""
获取state详情
:param self:
:param state_id:
:return:
"""
if not state_id:
return False, 'except state_id but not provided'
else:
workflow_state = State.objects.filter(id=state_id, is_deleted=False).first()
if not workflow_state:
return False, '工单状态不存在或已被删除'
return workflow_state, ''
@classmethod
@auto_log
def get_restful_state_info_by_id(cls, state_id):
if not state_id:
return False, 'except state_id but not provided'
else:
workflow_state = State.objects.filter(id=state_id, is_deleted=False).first()
if not workflow_state:
return False, '工单状态不存在或已被删除'
state_info_dict = dict(id=workflow_state.id, name=workflow_state.name, workflow_id=workflow_state.workflow_id,
sub_workflow_id=workflow_state.sub_workflow_id, distribute_type_id=workflow_state.distribute_type_id,
is_hidden=workflow_state.is_hidden, order_id=workflow_state.order_id, type_id=workflow_state.type_id,
participant_type_id=workflow_state.participant_type_id, participant=workflow_state.participant,
state_field=json.loads(workflow_state.state_field_str), label=json.loads(workflow_state.label),
creator=workflow_state.creator, gmt_created=str(workflow_state.gmt_created)[:19]
)
return state_info_dict, ''
@classmethod
@auto_log
def get_workflow_start_state(cls, workflow_id):
"""
获取工作流初始状态
:param workflow_id:
:return:
"""
workflow_state_queryset = State.objects.filter(is_deleted=0, workflow_id=workflow_id).all()
for workflow_state in workflow_state_queryset:
if workflow_state.type_id == CONSTANT_SERVICE.STATE_TYPE_START:
return workflow_state, ''
return False, '该工作流未配置初始状态,请检查工作流配置'
@classmethod
@auto_log
def get_states_info_by_state_id_list(cls, state_id_list):
state_queryset = State.objects.filter(is_deleted=0, id__in=state_id_list).all()
state_info_dict = {}
for state in state_queryset:
state_info_dict[state.id] = state.name
return state_info_dict, ''
@classmethod
@auto_log
def get_workflow_init_state(cls, workflow_id):
"""
获取工作的初始状态信息,包括允许的transition
:param workflow_id:
:return:
"""
init_state_obj = State.objects.filter(workflow_id=workflow_id, is_deleted=False, type_id=CONSTANT_SERVICE.STATE_TYPE_START).first()
if not init_state_obj:
return False, '该工作流尚未配置初始状态'
transition_queryset, msg = WorkflowTransitionService.get_state_transition_queryset(init_state_obj.id)
transition_info_list = []
for transition in transition_queryset:
transition_info_list.append(dict(transition_id=transition.id, transition_name=transition.name))
# 工单基础字段及属性
field_list = []
field_list.append(dict(field_key='title', field_name=u'标题', field_value=None, order_id=20,
field_type_id=CONSTANT_SERVICE.FIELD_TYPE_STR,
field_attribute=CONSTANT_SERVICE.FIELD_ATTRIBUTE_RO, description='工单的标题',
field_choice={}, boolean_field_display={}, default_value=None, field_template='', label={}))
custom_field_dict, msg = WorkflowCustomFieldService.get_workflow_custom_field(workflow_id)
for key, value in custom_field_dict.items():
field_list.append(dict(field_key=key, field_name=custom_field_dict[key]['field_name'], field_value=None, order_id=custom_field_dict[key]['order_id'],
field_type_id=custom_field_dict[key]['field_type_id'],
field_attribute=CONSTANT_SERVICE.FIELD_ATTRIBUTE_RO,
default_value=custom_field_dict[key]['default_value'],
description=custom_field_dict[key]['description'],
field_template=custom_field_dict[key]['field_template'],
boolean_field_display=json.loads(custom_field_dict[key]['boolean_field_display']) if custom_field_dict[key]['boolean_field_display'] else {}, # 之前model允许为空了,为了兼容先这么写,
field_choice=json.loads(custom_field_dict[key]['field_choice']),
label=json.loads(custom_field_dict[key]['label'])
))
state_field_dict = json.loads(init_state_obj.state_field_str)
state_field_key_list = state_field_dict.keys()
new_field_list = []
for field0 in field_list:
if field0['field_key'] in state_field_key_list:
field0['field_attribute'] = state_field_dict[field0['field_key']]
new_field_list.append(field0)
# 字段排序
new_field_list = sorted(new_field_list, key=lambda r: r['order_id'])
state_info_dict = dict(id=init_state_obj.id, name=init_state_obj.name, workflow_id=init_state_obj.workflow_id,
sub_workflow_id=init_state_obj.sub_workflow_id, distribute_type_id=init_state_obj.distribute_type_id,
is_hidden=init_state_obj.is_hidden, order_id=init_state_obj.order_id, type_id=init_state_obj.type_id,
participant_type_id=init_state_obj.participant_type_id, participant=init_state_obj.participant,
field_list=new_field_list, label=json.loads(init_state_obj.label),
creator=init_state_obj.creator, gmt_created=str(init_state_obj.gmt_created)[:19],
transition=transition_info_list
)
return state_info_dict, ''