deepfos 1.1.60__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- deepfos/__init__.py +6 -0
- deepfos/_version.py +21 -0
- deepfos/algo/__init__.py +0 -0
- deepfos/algo/graph.py +171 -0
- deepfos/algo/segtree.py +31 -0
- deepfos/api/V1_1/__init__.py +0 -0
- deepfos/api/V1_1/business_model.py +119 -0
- deepfos/api/V1_1/dimension.py +599 -0
- deepfos/api/V1_1/models/__init__.py +0 -0
- deepfos/api/V1_1/models/business_model.py +1033 -0
- deepfos/api/V1_1/models/dimension.py +2768 -0
- deepfos/api/V1_2/__init__.py +0 -0
- deepfos/api/V1_2/dimension.py +285 -0
- deepfos/api/V1_2/models/__init__.py +0 -0
- deepfos/api/V1_2/models/dimension.py +2923 -0
- deepfos/api/__init__.py +0 -0
- deepfos/api/account.py +167 -0
- deepfos/api/accounting_engines.py +147 -0
- deepfos/api/app.py +626 -0
- deepfos/api/approval_process.py +198 -0
- deepfos/api/base.py +983 -0
- deepfos/api/business_model.py +160 -0
- deepfos/api/consolidation.py +129 -0
- deepfos/api/consolidation_process.py +106 -0
- deepfos/api/datatable.py +341 -0
- deepfos/api/deep_pipeline.py +61 -0
- deepfos/api/deepconnector.py +36 -0
- deepfos/api/deepfos_task.py +92 -0
- deepfos/api/deepmodel.py +188 -0
- deepfos/api/dimension.py +486 -0
- deepfos/api/financial_model.py +319 -0
- deepfos/api/journal_model.py +119 -0
- deepfos/api/journal_template.py +132 -0
- deepfos/api/memory_financial_model.py +98 -0
- deepfos/api/models/__init__.py +3 -0
- deepfos/api/models/account.py +483 -0
- deepfos/api/models/accounting_engines.py +756 -0
- deepfos/api/models/app.py +1338 -0
- deepfos/api/models/approval_process.py +1043 -0
- deepfos/api/models/base.py +234 -0
- deepfos/api/models/business_model.py +805 -0
- deepfos/api/models/consolidation.py +711 -0
- deepfos/api/models/consolidation_process.py +248 -0
- deepfos/api/models/datatable_mysql.py +427 -0
- deepfos/api/models/deep_pipeline.py +55 -0
- deepfos/api/models/deepconnector.py +28 -0
- deepfos/api/models/deepfos_task.py +386 -0
- deepfos/api/models/deepmodel.py +308 -0
- deepfos/api/models/dimension.py +1576 -0
- deepfos/api/models/financial_model.py +1796 -0
- deepfos/api/models/journal_model.py +341 -0
- deepfos/api/models/journal_template.py +854 -0
- deepfos/api/models/memory_financial_model.py +478 -0
- deepfos/api/models/platform.py +178 -0
- deepfos/api/models/python.py +221 -0
- deepfos/api/models/reconciliation_engine.py +411 -0
- deepfos/api/models/reconciliation_report.py +161 -0
- deepfos/api/models/role_strategy.py +884 -0
- deepfos/api/models/smartlist.py +237 -0
- deepfos/api/models/space.py +1137 -0
- deepfos/api/models/system.py +1065 -0
- deepfos/api/models/variable.py +463 -0
- deepfos/api/models/workflow.py +946 -0
- deepfos/api/platform.py +199 -0
- deepfos/api/python.py +90 -0
- deepfos/api/reconciliation_engine.py +181 -0
- deepfos/api/reconciliation_report.py +64 -0
- deepfos/api/role_strategy.py +234 -0
- deepfos/api/smartlist.py +69 -0
- deepfos/api/space.py +582 -0
- deepfos/api/system.py +372 -0
- deepfos/api/variable.py +154 -0
- deepfos/api/workflow.py +264 -0
- deepfos/boost/__init__.py +6 -0
- deepfos/boost/py_jstream.py +89 -0
- deepfos/boost/py_pandas.py +20 -0
- deepfos/cache.py +121 -0
- deepfos/config.py +6 -0
- deepfos/core/__init__.py +27 -0
- deepfos/core/cube/__init__.py +10 -0
- deepfos/core/cube/_base.py +462 -0
- deepfos/core/cube/constants.py +21 -0
- deepfos/core/cube/cube.py +408 -0
- deepfos/core/cube/formula.py +707 -0
- deepfos/core/cube/syscube.py +532 -0
- deepfos/core/cube/typing.py +7 -0
- deepfos/core/cube/utils.py +238 -0
- deepfos/core/dimension/__init__.py +11 -0
- deepfos/core/dimension/_base.py +506 -0
- deepfos/core/dimension/dimcreator.py +184 -0
- deepfos/core/dimension/dimension.py +472 -0
- deepfos/core/dimension/dimexpr.py +271 -0
- deepfos/core/dimension/dimmember.py +155 -0
- deepfos/core/dimension/eledimension.py +22 -0
- deepfos/core/dimension/filters.py +99 -0
- deepfos/core/dimension/sysdimension.py +168 -0
- deepfos/core/logictable/__init__.py +5 -0
- deepfos/core/logictable/_cache.py +141 -0
- deepfos/core/logictable/_operator.py +663 -0
- deepfos/core/logictable/nodemixin.py +673 -0
- deepfos/core/logictable/sqlcondition.py +609 -0
- deepfos/core/logictable/tablemodel.py +497 -0
- deepfos/db/__init__.py +36 -0
- deepfos/db/cipher.py +660 -0
- deepfos/db/clickhouse.py +191 -0
- deepfos/db/connector.py +195 -0
- deepfos/db/daclickhouse.py +171 -0
- deepfos/db/dameng.py +101 -0
- deepfos/db/damysql.py +189 -0
- deepfos/db/dbkits.py +358 -0
- deepfos/db/deepengine.py +99 -0
- deepfos/db/deepmodel.py +82 -0
- deepfos/db/deepmodel_kingbase.py +83 -0
- deepfos/db/edb.py +214 -0
- deepfos/db/gauss.py +83 -0
- deepfos/db/kingbase.py +83 -0
- deepfos/db/mysql.py +184 -0
- deepfos/db/oracle.py +131 -0
- deepfos/db/postgresql.py +192 -0
- deepfos/db/sqlserver.py +99 -0
- deepfos/db/utils.py +135 -0
- deepfos/element/__init__.py +89 -0
- deepfos/element/accounting.py +348 -0
- deepfos/element/apvlprocess.py +215 -0
- deepfos/element/base.py +398 -0
- deepfos/element/bizmodel.py +1269 -0
- deepfos/element/datatable.py +2467 -0
- deepfos/element/deep_pipeline.py +186 -0
- deepfos/element/deepconnector.py +59 -0
- deepfos/element/deepmodel.py +1806 -0
- deepfos/element/dimension.py +1254 -0
- deepfos/element/fact_table.py +427 -0
- deepfos/element/finmodel.py +1485 -0
- deepfos/element/journal.py +840 -0
- deepfos/element/journal_template.py +943 -0
- deepfos/element/pyscript.py +412 -0
- deepfos/element/reconciliation.py +553 -0
- deepfos/element/rolestrategy.py +243 -0
- deepfos/element/smartlist.py +457 -0
- deepfos/element/variable.py +756 -0
- deepfos/element/workflow.py +560 -0
- deepfos/exceptions/__init__.py +239 -0
- deepfos/exceptions/hook.py +86 -0
- deepfos/lazy.py +104 -0
- deepfos/lazy_import.py +84 -0
- deepfos/lib/__init__.py +0 -0
- deepfos/lib/_javaobj.py +366 -0
- deepfos/lib/asynchronous.py +879 -0
- deepfos/lib/concurrency.py +107 -0
- deepfos/lib/constant.py +39 -0
- deepfos/lib/decorator.py +310 -0
- deepfos/lib/deepchart.py +778 -0
- deepfos/lib/deepux.py +477 -0
- deepfos/lib/discovery.py +273 -0
- deepfos/lib/edb_lexer.py +789 -0
- deepfos/lib/eureka.py +156 -0
- deepfos/lib/filterparser.py +751 -0
- deepfos/lib/httpcli.py +106 -0
- deepfos/lib/jsonstreamer.py +80 -0
- deepfos/lib/msg.py +394 -0
- deepfos/lib/nacos.py +225 -0
- deepfos/lib/patch.py +92 -0
- deepfos/lib/redis.py +241 -0
- deepfos/lib/serutils.py +181 -0
- deepfos/lib/stopwatch.py +99 -0
- deepfos/lib/subtask.py +572 -0
- deepfos/lib/sysutils.py +703 -0
- deepfos/lib/utils.py +1003 -0
- deepfos/local.py +160 -0
- deepfos/options.py +670 -0
- deepfos/translation.py +237 -0
- deepfos-1.1.60.dist-info/METADATA +33 -0
- deepfos-1.1.60.dist-info/RECORD +175 -0
- deepfos-1.1.60.dist-info/WHEEL +5 -0
- deepfos-1.1.60.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
from functools import partial
|
|
2
|
+
from typing import *
|
|
3
|
+
|
|
4
|
+
import pandas as pd
|
|
5
|
+
from pydantic import parse_obj_as
|
|
6
|
+
|
|
7
|
+
from deepfos.api.models.workflow import *
|
|
8
|
+
from deepfos.api.workflow import WorkFlowAPI
|
|
9
|
+
from deepfos.element.base import ElementBase, SyncMeta
|
|
10
|
+
from deepfos.lib.asynchronous import future_property
|
|
11
|
+
from deepfos.lib.utils import fetch_all_pages, CIEnum
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
'CompareType',
|
|
15
|
+
'StatusType',
|
|
16
|
+
'AsyncWorkFlow',
|
|
17
|
+
'WorkFlow',
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ScopeType(CIEnum):
|
|
22
|
+
all_subscriber = "ALL_SUBSCRIBER"
|
|
23
|
+
process_instance = "PROCESS_INSTANCE"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class CompareType(CIEnum):
|
|
27
|
+
equal = "EQUAL"
|
|
28
|
+
like = "LIKE"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class StatusType(CIEnum):
|
|
32
|
+
#: 进行中
|
|
33
|
+
in_progress = "InProgress"
|
|
34
|
+
#: 已完成
|
|
35
|
+
completed = "Completed"
|
|
36
|
+
#: 已终止
|
|
37
|
+
terminated = "Terminated"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _get_record_count(response: Union[UnderwayPageInfo, TodoPageInfo, PageInfo]):
|
|
41
|
+
if response.lists is None:
|
|
42
|
+
return 0
|
|
43
|
+
return len(response.lists)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# -----------------------------------------------------------------------------
|
|
47
|
+
# core
|
|
48
|
+
class AsyncWorkFlow(ElementBase[WorkFlowAPI]):
|
|
49
|
+
"""工作流"""
|
|
50
|
+
@future_property
|
|
51
|
+
async def all_version(self) -> List[ProcessVersionVO]:
|
|
52
|
+
"""所有版本信息"""
|
|
53
|
+
api = await self.wait_for('async_api')
|
|
54
|
+
ele_info = await self.wait_for('element_info')
|
|
55
|
+
return await api.version_control.list(
|
|
56
|
+
self.element_name,
|
|
57
|
+
ele_info.folderId
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
@future_property
|
|
61
|
+
async def msg_list(self) -> List[Message]:
|
|
62
|
+
"""消息列表"""
|
|
63
|
+
api = await self.wait_for('async_api')
|
|
64
|
+
ele_info = await self.wait_for('element_info')
|
|
65
|
+
return await api.message.list(ele_info)
|
|
66
|
+
|
|
67
|
+
@future_property
|
|
68
|
+
async def global_params(self) -> List[Value]:
|
|
69
|
+
"""全局变量"""
|
|
70
|
+
api = await self.wait_for('async_api')
|
|
71
|
+
ele_info = await self.wait_for('element_info')
|
|
72
|
+
return await api.instance.global_params(ele_info)
|
|
73
|
+
|
|
74
|
+
@future_property
|
|
75
|
+
async def launch_params(self) -> List[ProcessLaunchParamsVO]:
|
|
76
|
+
"""启动参数"""
|
|
77
|
+
api = await self.wait_for('async_api')
|
|
78
|
+
ele_info = await self.wait_for('element_info')
|
|
79
|
+
return await api.process.launch_params(
|
|
80
|
+
self.element_name, ele_info.folderId
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
async def _send_msg(
|
|
84
|
+
self,
|
|
85
|
+
msg_code: str,
|
|
86
|
+
msg_body: Dict[str, Any],
|
|
87
|
+
processes: List[str] = None,
|
|
88
|
+
scope: ScopeType = ScopeType.all_subscriber
|
|
89
|
+
):
|
|
90
|
+
scope_info = MessageScope(type=ScopeType.all_subscriber)
|
|
91
|
+
|
|
92
|
+
if scope == ScopeType.process_instance:
|
|
93
|
+
scope_info = MessageScope(
|
|
94
|
+
processInstanceIds=processes,
|
|
95
|
+
type=ScopeType.process_instance
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return await self.async_api.process.send_message(
|
|
99
|
+
SendMessageParam(
|
|
100
|
+
messageInfo=MessageInfo(
|
|
101
|
+
messageBody=msg_body,
|
|
102
|
+
messageCode=msg_code,
|
|
103
|
+
relateProcess=self.element_info
|
|
104
|
+
),
|
|
105
|
+
scope=scope_info
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
async def broadcast(self, msg_code: str, msg_body: Dict[str, Any]):
|
|
110
|
+
"""广播发送消息至所有订阅者
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
msg_code: 消息编码,消息编码全集信息来自消息列表
|
|
114
|
+
msg_body: 消息体,消息体格式信息来自消息列表
|
|
115
|
+
|
|
116
|
+
See Also:
|
|
117
|
+
:attr:`msg_list`, 用于查看当前工作流的消息列表
|
|
118
|
+
:func:`send_msg_to_processes`, 发送消息至流程实例列表
|
|
119
|
+
|
|
120
|
+
"""
|
|
121
|
+
if msg_code is None:
|
|
122
|
+
raise ValueError("msg_code不可为空")
|
|
123
|
+
|
|
124
|
+
return await self._send_msg(msg_code, msg_body)
|
|
125
|
+
|
|
126
|
+
async def send_msg_to_processes(
|
|
127
|
+
self,
|
|
128
|
+
msg_code: str,
|
|
129
|
+
msg_body: Dict[str, Any],
|
|
130
|
+
processes: List[str]
|
|
131
|
+
):
|
|
132
|
+
"""发送消息至流程实例列表
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
msg_code: 消息编码,消息编码全集信息来自消息列表
|
|
136
|
+
msg_body: 消息体,消息体格式信息来自消息列表
|
|
137
|
+
processes: 目标流程实例id列表
|
|
138
|
+
|
|
139
|
+
See Also:
|
|
140
|
+
:attr:`msg_list`, 用于查看当前工作流的消息列表
|
|
141
|
+
:func:`broadcast`, 广播发送消息至所有订阅者
|
|
142
|
+
|
|
143
|
+
"""
|
|
144
|
+
if msg_code is None:
|
|
145
|
+
raise ValueError("msg_code不可为空")
|
|
146
|
+
|
|
147
|
+
return await self._send_msg(msg_code, msg_body, processes, ScopeType.process_instance)
|
|
148
|
+
|
|
149
|
+
async def launch_process(
|
|
150
|
+
self,
|
|
151
|
+
param: Dict = None,
|
|
152
|
+
file_path: str = None,
|
|
153
|
+
comment: str = None
|
|
154
|
+
) -> LaunchReturnVO:
|
|
155
|
+
"""启动流程
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
param: 启动参数
|
|
159
|
+
file_path: 附件路径
|
|
160
|
+
comment: 备注
|
|
161
|
+
|
|
162
|
+
"""
|
|
163
|
+
return await self.async_api.process.launch(
|
|
164
|
+
ProcessLaunchDTO(
|
|
165
|
+
paramMap=param,
|
|
166
|
+
filePath=file_path,
|
|
167
|
+
comment=comment,
|
|
168
|
+
elementDetail=self.element_info
|
|
169
|
+
)
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
async def batch_launch_process(
|
|
173
|
+
self,
|
|
174
|
+
params: Union[
|
|
175
|
+
List[Dict[str, str]],
|
|
176
|
+
List[ProcessStartMultipleDTO]
|
|
177
|
+
] = None
|
|
178
|
+
) -> List[LaunchReturnForBatchVO]:
|
|
179
|
+
"""批量启动流程
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
params: 启动参数集合列表
|
|
183
|
+
|
|
184
|
+
"""
|
|
185
|
+
if params is not None and not isinstance(params, list):
|
|
186
|
+
raise TypeError('params参数应为List类型')
|
|
187
|
+
|
|
188
|
+
if isinstance(params, list):
|
|
189
|
+
params = parse_obj_as(List[ProcessStartMultipleDTO], params)
|
|
190
|
+
|
|
191
|
+
return await self.async_api.process.launch_batch(
|
|
192
|
+
ProcessLaunchMultipleDTO(
|
|
193
|
+
multipleParams=params,
|
|
194
|
+
elementDetail=self.element_info
|
|
195
|
+
)
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
async def get_process_by_param(
|
|
199
|
+
self,
|
|
200
|
+
param: Dict,
|
|
201
|
+
version: str = None
|
|
202
|
+
) -> List[ProcessInstanceVO]:
|
|
203
|
+
"""通过启动参数查询流程实例
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
param: 启动参数
|
|
207
|
+
version: 可选,工作流版本,默认为最新版本
|
|
208
|
+
|
|
209
|
+
See Also:
|
|
210
|
+
:func:`get_process_by_business_key`
|
|
211
|
+
|
|
212
|
+
"""
|
|
213
|
+
return await self.async_api.process.process_instance_get_by_launch_params(
|
|
214
|
+
LaunchParamsDTO(elementDetail=self.element_info, paramMap=param, version=version)
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
async def get_process_by_business_key(
|
|
218
|
+
self,
|
|
219
|
+
business_key: str,
|
|
220
|
+
compare_type: Union[CompareType, str] = CompareType.equal,
|
|
221
|
+
version: str = None
|
|
222
|
+
) -> List[ProcessInstanceVO]:
|
|
223
|
+
"""通过业务键查询流程实例
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
business_key: 业务键
|
|
227
|
+
compare_type: 业务键匹配方式为equal还是like,默认为equal
|
|
228
|
+
version: 可选,工作流版本,默认为最新版本
|
|
229
|
+
|
|
230
|
+
See Also:
|
|
231
|
+
:func:`get_process_by_param`
|
|
232
|
+
|
|
233
|
+
"""
|
|
234
|
+
if business_key is None:
|
|
235
|
+
raise ValueError("business_key不可为空")
|
|
236
|
+
|
|
237
|
+
return await self.async_api.process.process_instance_get_by_business_key(
|
|
238
|
+
BusinessKeyQueryDTO(
|
|
239
|
+
elementDetail=self.element_info,
|
|
240
|
+
businessKey=BusinessKey(compareType=CompareType[compare_type], key=business_key),
|
|
241
|
+
version=version
|
|
242
|
+
)
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
async def get_task_by_param(
|
|
246
|
+
self,
|
|
247
|
+
param: Dict,
|
|
248
|
+
version: str = None
|
|
249
|
+
) -> List[TaskInstanceVO]:
|
|
250
|
+
"""通过启动参数查询任务实例
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
param: 启动参数
|
|
254
|
+
version: 可选,工作流版本,默认为最新版本
|
|
255
|
+
|
|
256
|
+
See Also:
|
|
257
|
+
:func:`get_task_by_business_key`
|
|
258
|
+
|
|
259
|
+
"""
|
|
260
|
+
return await self.async_api.process.task_instance_get_by_launch_params(
|
|
261
|
+
LaunchParamsDTO(elementDetail=self.element_info, paramMap=param, version=version)
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
async def get_task_by_business_key(
|
|
265
|
+
self,
|
|
266
|
+
business_key: str,
|
|
267
|
+
compare_type: Union[CompareType, str] = CompareType.equal,
|
|
268
|
+
version: str = None
|
|
269
|
+
) -> List[TaskInstanceVO]:
|
|
270
|
+
"""通过业务键查询任务实例
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
business_key: 业务键
|
|
274
|
+
compare_type: 业务键匹配方式为equal还是like,默认为equal
|
|
275
|
+
version: 可选,工作流版本,默认为最新版本
|
|
276
|
+
|
|
277
|
+
See Also:
|
|
278
|
+
:func:`get_task_by_param`
|
|
279
|
+
|
|
280
|
+
"""
|
|
281
|
+
if business_key is None:
|
|
282
|
+
raise ValueError("business_key不可为空")
|
|
283
|
+
|
|
284
|
+
return await self.async_api.process.task_instance_get_by_business_key(
|
|
285
|
+
BusinessKeyQueryDTO(
|
|
286
|
+
elementDetail=self.element_info,
|
|
287
|
+
businessKey=BusinessKey(compareType=CompareType[compare_type], key=business_key),
|
|
288
|
+
version=version
|
|
289
|
+
)
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
async def complete_task_by_id(
|
|
293
|
+
self,
|
|
294
|
+
task_id: str,
|
|
295
|
+
comment: str = None,
|
|
296
|
+
file_path: str = None,
|
|
297
|
+
outcome: str = None,
|
|
298
|
+
) -> bool:
|
|
299
|
+
"""完成任务实例
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
task_id: 任务实例id
|
|
303
|
+
comment: 备注
|
|
304
|
+
file_path: 附件路径
|
|
305
|
+
outcome: 结果选项,在任务可选结果不唯一时,必须提供
|
|
306
|
+
|
|
307
|
+
Returns:
|
|
308
|
+
True: 成功
|
|
309
|
+
False: 失败
|
|
310
|
+
|
|
311
|
+
"""
|
|
312
|
+
return await self.async_api.task.express_complete(
|
|
313
|
+
TaskCompleteInstance(comment=comment, filePath=file_path, outcome=outcome, taskId=task_id)
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
async def list_process(
|
|
317
|
+
self,
|
|
318
|
+
status: List[Union[str, StatusType]] = None,
|
|
319
|
+
as_dataframe: bool = False
|
|
320
|
+
) -> Union[pd.DataFrame, List[Optional[FlowInstanceDto]]]:
|
|
321
|
+
"""查看流程
|
|
322
|
+
|
|
323
|
+
Args:
|
|
324
|
+
status: 筛选列表,默认筛选进行中
|
|
325
|
+
筛选可选值: 进行中: in_progress; 已完成: completed; 已终止: terminated
|
|
326
|
+
|
|
327
|
+
as_dataframe: 是否将结果处理为pd.DataFrame
|
|
328
|
+
|
|
329
|
+
Returns:
|
|
330
|
+
- 如果 ``as_dataframe == False``, 返回 :obj:`List[FlowInstanceDto]` 类型
|
|
331
|
+
- 如果 ``as_dataframe == True``,返回 :obj:`DataFrame` 类型
|
|
332
|
+
|
|
333
|
+
"""
|
|
334
|
+
if status is None:
|
|
335
|
+
status = [StatusType.in_progress]
|
|
336
|
+
else:
|
|
337
|
+
status = [StatusType[s] for s in status]
|
|
338
|
+
|
|
339
|
+
fn = partial(
|
|
340
|
+
self._query_process_impl,
|
|
341
|
+
status=','.join(status),
|
|
342
|
+
call_api=self.async_api.instance.monitor_page
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
pages = await fetch_all_pages(
|
|
346
|
+
fn,
|
|
347
|
+
count_getter=_get_record_count,
|
|
348
|
+
page_size=200,
|
|
349
|
+
page_no_key='page_no',
|
|
350
|
+
page_size_key='page_size'
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
raw_result = [record for page in pages if page.lists for record in page.lists]
|
|
354
|
+
|
|
355
|
+
if not as_dataframe:
|
|
356
|
+
return raw_result
|
|
357
|
+
|
|
358
|
+
if len(raw_result) == 0:
|
|
359
|
+
return pd.DataFrame(columns=FlowInstanceDto.__fields__)
|
|
360
|
+
|
|
361
|
+
return pd.DataFrame([dto.dict() for dto in raw_result])
|
|
362
|
+
|
|
363
|
+
@staticmethod
|
|
364
|
+
def _query_task_impl(status, call_api, page_no, page_size):
|
|
365
|
+
return call_api(UserTaskQueryDTO(status=status, pageNo=page_no, pageSize=page_size))
|
|
366
|
+
|
|
367
|
+
@staticmethod
|
|
368
|
+
def _query_process_impl(status, call_api, page_no, page_size):
|
|
369
|
+
return call_api(
|
|
370
|
+
processInstanceQueryDTO=FlowInstanceQueryDto(status=status, pageNo=page_no, pageSize=page_size)
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
async def list_my_task(
|
|
374
|
+
self,
|
|
375
|
+
status: List[Union[str, StatusType]] = None,
|
|
376
|
+
as_dataframe: bool = False
|
|
377
|
+
) -> Union[pd.DataFrame, List[UserTaskVO]]:
|
|
378
|
+
"""查看我的任务
|
|
379
|
+
|
|
380
|
+
Args:
|
|
381
|
+
status: 筛选列表,默认筛选进行中
|
|
382
|
+
筛选可选值: 进行中: in_progress; 已完成: completed; 已终止: terminated
|
|
383
|
+
|
|
384
|
+
as_dataframe: 是否将结果处理为pd.DataFrame
|
|
385
|
+
|
|
386
|
+
Returns:
|
|
387
|
+
- 如果 ``as_dataframe == False``, 返回 :obj:`List[UserTaskVO]` 类型
|
|
388
|
+
- 如果 ``as_dataframe == True``,返回 :obj:`DataFrame` 类型
|
|
389
|
+
|
|
390
|
+
"""
|
|
391
|
+
if status is None:
|
|
392
|
+
status = [StatusType.in_progress]
|
|
393
|
+
else:
|
|
394
|
+
status = [StatusType[s] for s in status]
|
|
395
|
+
|
|
396
|
+
fn = partial(
|
|
397
|
+
self._query_task_impl,
|
|
398
|
+
status=','.join(status),
|
|
399
|
+
call_api=self.async_api.task.myTask_list_page
|
|
400
|
+
)
|
|
401
|
+
|
|
402
|
+
pages = await fetch_all_pages(
|
|
403
|
+
fn,
|
|
404
|
+
count_getter=_get_record_count,
|
|
405
|
+
page_size=200,
|
|
406
|
+
page_no_key='page_no',
|
|
407
|
+
page_size_key='page_size'
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
raw_result = [record for page in pages if page.lists for record in page.lists]
|
|
411
|
+
|
|
412
|
+
if not as_dataframe:
|
|
413
|
+
return raw_result
|
|
414
|
+
|
|
415
|
+
if len(raw_result) == 0:
|
|
416
|
+
return pd.DataFrame(columns=UserTaskVO.__fields__)
|
|
417
|
+
|
|
418
|
+
return pd.DataFrame([dto.dict() for dto in raw_result])
|
|
419
|
+
|
|
420
|
+
async def list_claim_task(
|
|
421
|
+
self,
|
|
422
|
+
as_dataframe: bool = False
|
|
423
|
+
) -> Union[pd.DataFrame, List[UserTaskVO]]:
|
|
424
|
+
"""查看待认领任务
|
|
425
|
+
|
|
426
|
+
Args:
|
|
427
|
+
as_dataframe: 是否将结果处理为pd.DataFrame
|
|
428
|
+
|
|
429
|
+
Returns:
|
|
430
|
+
- 如果 ``as_dataframe == False``, 返回 :obj:`List[UserTaskVO]` 类型
|
|
431
|
+
- 如果 ``as_dataframe == True``,返回 :obj:`DataFrame` 类型
|
|
432
|
+
|
|
433
|
+
"""
|
|
434
|
+
fn = partial(
|
|
435
|
+
self._query_task_impl,
|
|
436
|
+
status='',
|
|
437
|
+
call_api=self.async_api.task.claim_list_page
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
pages = await fetch_all_pages(
|
|
441
|
+
fn,
|
|
442
|
+
count_getter=_get_record_count,
|
|
443
|
+
page_size=200,
|
|
444
|
+
page_no_key='page_no',
|
|
445
|
+
page_size_key='page_size'
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
raw_result = [record for page in pages if page.lists for record in page.lists]
|
|
449
|
+
|
|
450
|
+
if not as_dataframe:
|
|
451
|
+
return raw_result
|
|
452
|
+
|
|
453
|
+
if len(raw_result) == 0:
|
|
454
|
+
return pd.DataFrame(columns=UserTaskVO.__fields__)
|
|
455
|
+
|
|
456
|
+
return pd.DataFrame([dto.dict() for dto in raw_result])
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
class WorkFlow(AsyncWorkFlow, metaclass=SyncMeta):
|
|
460
|
+
synchronize = (
|
|
461
|
+
'broadcast',
|
|
462
|
+
'send_msg_to_processes',
|
|
463
|
+
'launch_process',
|
|
464
|
+
'batch_launch_process',
|
|
465
|
+
'get_process_by_param',
|
|
466
|
+
'get_process_by_business_key',
|
|
467
|
+
'get_task_by_param',
|
|
468
|
+
'get_task_by_business_key',
|
|
469
|
+
'complete_task_by_id',
|
|
470
|
+
'list_process',
|
|
471
|
+
'list_my_task',
|
|
472
|
+
'list_claim_task',
|
|
473
|
+
)
|
|
474
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
475
|
+
def broadcast(self, msg_code: str, msg_body: Dict[str, Any]):
|
|
476
|
+
...
|
|
477
|
+
|
|
478
|
+
def send_msg_to_processes(
|
|
479
|
+
self,
|
|
480
|
+
msg_code: str,
|
|
481
|
+
msg_body: Dict[str, Any],
|
|
482
|
+
processes: List[str]
|
|
483
|
+
):
|
|
484
|
+
...
|
|
485
|
+
|
|
486
|
+
def launch_process(
|
|
487
|
+
self,
|
|
488
|
+
param: Dict = None,
|
|
489
|
+
file_path: str = None,
|
|
490
|
+
comment: str = None
|
|
491
|
+
) -> LaunchReturnVO:
|
|
492
|
+
...
|
|
493
|
+
|
|
494
|
+
def batch_launch_process(
|
|
495
|
+
self,
|
|
496
|
+
params: Union[
|
|
497
|
+
List[Dict[str, str]],
|
|
498
|
+
List[ProcessStartMultipleDTO]
|
|
499
|
+
] = None
|
|
500
|
+
) -> List[LaunchReturnForBatchVO]:
|
|
501
|
+
...
|
|
502
|
+
|
|
503
|
+
def get_process_by_param(
|
|
504
|
+
self,
|
|
505
|
+
param: Dict,
|
|
506
|
+
version: str = None
|
|
507
|
+
) -> List[ProcessInstanceVO]:
|
|
508
|
+
...
|
|
509
|
+
|
|
510
|
+
def get_process_by_business_key(
|
|
511
|
+
self,
|
|
512
|
+
business_key: str,
|
|
513
|
+
compare_type: Union[CompareType, str] = CompareType.equal,
|
|
514
|
+
version: str = None
|
|
515
|
+
) -> List[ProcessInstanceVO]:
|
|
516
|
+
...
|
|
517
|
+
|
|
518
|
+
def get_task_by_param(
|
|
519
|
+
self,
|
|
520
|
+
param: Dict,
|
|
521
|
+
version: str = None
|
|
522
|
+
) -> List[TaskInstanceVO]:
|
|
523
|
+
...
|
|
524
|
+
|
|
525
|
+
def get_task_by_business_key(
|
|
526
|
+
self,
|
|
527
|
+
business_key: str,
|
|
528
|
+
compare_type: Union[CompareType, str] = CompareType.equal,
|
|
529
|
+
version: str = None
|
|
530
|
+
) -> List[TaskInstanceVO]:
|
|
531
|
+
...
|
|
532
|
+
|
|
533
|
+
def complete_task_by_id(
|
|
534
|
+
self,
|
|
535
|
+
task_id: str,
|
|
536
|
+
comment: str = None,
|
|
537
|
+
file_path: str = None,
|
|
538
|
+
outcome: str = None,
|
|
539
|
+
) -> bool:
|
|
540
|
+
...
|
|
541
|
+
|
|
542
|
+
def list_process(
|
|
543
|
+
self,
|
|
544
|
+
status: List[Union[str, StatusType]] = None,
|
|
545
|
+
as_dataframe: bool = False
|
|
546
|
+
) -> Union[pd.DataFrame, List[Optional[FlowInstanceDto]]]:
|
|
547
|
+
...
|
|
548
|
+
|
|
549
|
+
def list_my_task(
|
|
550
|
+
self,
|
|
551
|
+
status: List[Union[str, StatusType]] = None,
|
|
552
|
+
as_dataframe: bool = False
|
|
553
|
+
) -> Union[pd.DataFrame, List[UserTaskVO]]:
|
|
554
|
+
...
|
|
555
|
+
|
|
556
|
+
def list_claim_task(
|
|
557
|
+
self,
|
|
558
|
+
as_dataframe: bool = False
|
|
559
|
+
) -> Union[pd.DataFrame, List[UserTaskVO]]:
|
|
560
|
+
...
|