Date: Wed, 29 Nov 2023 14:35:07 +0800
Subject: [PATCH 13/26] =?UTF-8?q?optimization:=20=E4=BB=BB=E5=8A=A1?=
=?UTF-8?q?=E7=8A=B6=E6=80=81=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=E4=BF=AE?=
=?UTF-8?q?=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../TemplateCanvas/NodeTemplate/Subflow.vue | 22 +++++++++
.../TemplateCanvas/NodeTemplate/index.vue | 6 +++
.../pages/task/TaskExecute/ExecuteInfo.vue | 2 +-
.../pages/task/TaskExecute/TaskOperation.vue | 48 ++++++++-----------
.../task/TaskExecute/TaskOperationHeader.vue | 14 ++++--
5 files changed, 61 insertions(+), 31 deletions(-)
diff --git a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/Subflow.vue b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/Subflow.vue
index e53296c922..03d3b6e4fd 100755
--- a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/Subflow.vue
+++ b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/Subflow.vue
@@ -36,6 +36,28 @@
@change="onNodeCheckClick">
+
+
+
+ {{ node.loop > 99 ? '99+' : node.loop }}
+
+
+
+
+ MR
+ {{ node.retry - node.auto_skip }}
+
+
+ AR
+ {{ node.auto_skip }}
+
+
+
+ AS
+ MS
+ MR
+ AR
+
diff --git a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/index.vue b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/index.vue
index f1ca5f36c5..5416973ffa 100755
--- a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/index.vue
+++ b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/index.vue
@@ -486,6 +486,12 @@
&:first-child {
margin-left: -4px;
}
+ &:nth-of-type(3) {
+ margin-left: -3px;
+ }
+ &:nth-of-type(4) {
+ margin-left: -2px;
+ }
}
}
.state-icon {
diff --git a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue
index 65e15daea4..55107b1afa 100644
--- a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue
+++ b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue
@@ -118,7 +118,7 @@
{{$t('次执行')}}
-
+
{{ $t('已自动重试 m 次 (最多 c 次),手动重试 n 次', autoRetryInfo)}}
diff --git a/frontend/desktop/src/pages/task/TaskExecute/TaskOperation.vue b/frontend/desktop/src/pages/task/TaskExecute/TaskOperation.vue
index 91961e5468..9d6ae513f5 100644
--- a/frontend/desktop/src/pages/task/TaskExecute/TaskOperation.vue
+++ b/frontend/desktop/src/pages/task/TaskExecute/TaskOperation.vue
@@ -336,7 +336,6 @@
sidebarWidth: 960,
nodeInfoType: '',
state: '', // 当前流程状态,画布切换时会更新
- rootState: '', // 根流程状态
selectedNodeId: '',
selectedFlowPath: path, // 选择面包屑路径
cacheStatus: undefined, // 总任务缓存状态信息;只有总任务完成、终止时才存在
@@ -461,10 +460,6 @@
nodeNav () {
return this.selectedFlowPath.filter(item => item.type !== 'ServiceActivity')
},
- // 当前画布是否为最外层
- isTopTask () {
- return this.nodeNav.length === 1
- },
taskOperationBtns () {
const operationBtns = []
const operationType = STATE_OPERATIONS[this.state]
@@ -483,7 +478,6 @@
if (
this.state === 'CREATED'
&& this.unclaimFuncTask
- && this.isTopTask
&& this.creatorName !== this.username
) {
executePauseBtn.disabled = true
@@ -508,7 +502,7 @@
},
pendingNodes () {
const { children = {} } = this.instanceStatus
- const pendingStatus = ['PENDING_PROCESSING', 'PENDING_APPROVAL', 'PENDING_CONFIRMATION']
+ const pendingStatus = ['FAILED', 'PENDING_PROCESSING', 'PENDING_APPROVAL', 'PENDING_CONFIRMATION']
return Object.values(children).reduce((acc, cur) => {
if (pendingStatus.includes(cur.state)) {
acc.push({
@@ -523,11 +517,11 @@
}
},
watch: {
- instanceStatus: {
- handler (val) {
- const { state, children = {} } = val
+ 'instanceStatus.state': {
+ handler (val, oldVal) {
+ const { children = {} } = this.instanceStatus
const { activities, gateways, flows, start_event, end_event } = tools.deepClone(this.pipelineData)
- if (state === 'SUSPENDED') {
+ if (val !== oldVal && [val, oldVal].includes('SUSPENDED')) {
Object.values(children).forEach(node => {
// 非任务节点/网关节点
if ([start_event.id, end_event.id].includes(node.id)) return
@@ -538,7 +532,7 @@
}
outgoing.forEach(outLine => {
const targetNode = flows[outLine].target
- const isExecuted = targetNode in children
+ const isExecuted = val === 'SUSPENDED' ? targetNode in children : true
// 输出节点未被执行则表明任务暂停后该分支在当前节点停止往下继续执行
this.setLineSuspendState(node.id, outLine, isExecuted)
})
@@ -620,10 +614,6 @@
project_id: this.project_id,
cancelToken: source.token
}
- if (!this.isTopTask) {
- data.instance_id = this.instance_id
- data.subprocess_id = this.taskId
- }
instanceStatus = await this.getInstanceStatus(data)
}
// 处理返回数据
@@ -631,9 +621,6 @@
this.state = instanceStatus.data.state
this.instanceStatus = instanceStatus.data
this.pollErrorTimes = 0
- if (this.isTopTask) {
- this.rootState = this.state
- }
if (
!this.cacheStatus
&& ['FINISHED', 'REVOKED'].includes(this.state)
@@ -641,10 +628,16 @@
) { // save cacheStatus
this.cacheStatus = instanceStatus.data
}
+ let continueRunning = false
// 任务暂停时如果有节点正在执行,需轮询节点状态
- let suspendedRunning = false
if (this.state === 'SUSPENDED') {
- suspendedRunning = Object.values(instanceStatus.data.children).some(item => item.state === 'RUNNING')
+ const pendingStatus = ['RUNNING', 'PENDING_PROCESSING', 'PENDING_APPROVAL', 'PENDING_CONFIRMATION']
+ continueRunning = Object.values(instanceStatus.data.children).some(item => pendingStatus.includes(item.state))
+ }
+ // 任务失败时如果又节点还没自动重试完,需轮询节点状态
+ if (this.state === 'FAILED') {
+ const { auto_retry_infos: retryInfos = {} } = instanceStatus.data
+ continueRunning = Object.values(retryInfos).some(item => item.max_auto_retry_times > item.auto_retry_times)
}
// 节点执行记录显示时,重新计算当前执行时间/判断是否还在执行中
if (this.isExecRecordOpen) {
@@ -662,7 +655,7 @@
this.nodeExecRecordInfo.state = execNodeConfig.state
}
}
- if (this.state === 'RUNNING' || (!this.isTopTask && this.state === 'FINISHED' && !['FINISHED', 'REVOKED', 'FAILED'].includes(this.rootState)) || suspendedRunning) {
+ if (['RUNNING', 'PENDING_PROCESSING'].includes(this.state) || continueRunning) {
if (this.isExecRecordOpen && this.nodeExecRecordInfo.state) { // 节点执行中一秒查一次
this.setTaskStatusTimer(1000)
} else {
@@ -1419,9 +1412,9 @@
return
}
+ this.approval.pending = true
this.$refs.approvalForm.validate().then(async () => {
try {
- this.approval.pending = true
const { id, is_passed, message } = this.approval
const params = {
is_passed,
@@ -1448,6 +1441,8 @@
} finally {
this.approval.pending = false
}
+ }, () => {
+ this.approval.pending = false
})
},
onApprovalCancel () {
@@ -1512,13 +1507,13 @@
case 'reExecute':
return true
case 'execute':
- return this.state === 'CREATED' && this.isTopTask
+ return this.state === 'CREATED'
case 'pause':
return ['RUNNING', 'NODE_SUSPENDED'].includes(this.state)
case 'resume':
return this.state === 'SUSPENDED'
case 'revoke':
- return this.isTopTask && ['RUNNING', 'SUSPENDED', 'PENDING_PROCESSING', 'FAILED'].includes(this.state)
+ return ['RUNNING', 'SUSPENDED', 'PENDING_PROCESSING', 'FAILED'].includes(this.state)
default:
break
}
@@ -2102,7 +2097,6 @@
if (
action === 'execute'
&& this.unclaimFuncTask
- && this.isTopTask
&& this.creatorName === this.username
) {
const h = this.$createElement
@@ -2484,7 +2478,7 @@
},
unclickableOperation (type) {
// 失败时不允许点击暂停按钮,创建是不允许点击终止按钮,操作执行过程不允许点击
- return (this.state === 'FAILED' && type !== 'revoke') || (this.state === 'CREATED' && type === 'revoke') || this.operateLoading || !this.isTopTask
+ return (this.state === 'FAILED' && type !== 'revoke') || (this.state === 'CREATED' && type === 'revoke') || this.operateLoading
},
packUp () {
this.isNodeInfoPanelShow = false
diff --git a/frontend/desktop/src/pages/task/TaskExecute/TaskOperationHeader.vue b/frontend/desktop/src/pages/task/TaskExecute/TaskOperationHeader.vue
index 92b0efa32c..97188c2094 100644
--- a/frontend/desktop/src/pages/task/TaskExecute/TaskOperationHeader.vue
+++ b/frontend/desktop/src/pages/task/TaskExecute/TaskOperationHeader.vue
@@ -15,9 +15,9 @@
{{ stateStr }}
-
+
-
+
- {{$t('状态明细')}}
- state.view_mode
- })
+ }),
+ isStateDetailShow () {
+ return ['FAILED', 'PENDING_PROCESSING'].includes(this.state)
+ }
},
watch: {
nodeNav (val) {
@@ -269,6 +272,7 @@
}
}
.task-state {
+ flex-shrink: 0;
display: inline-block;
margin: 0 8px;
padding: 0 8px;
@@ -305,6 +309,10 @@
&.FAILED {
background-color: #f2d0d3;
color: #ea3636;
+ i {
+ font-size: 14px;
+ color: #ea3636;
+ }
}
&.REVOKED {
background-color: #f2d0d3;
From 5a4d9abd8b5971fa0711c011d6c3c70fa3ed4e4e Mon Sep 17 00:00:00 2001
From: hanshuaikang <1758504262@qq.com>
Date: Mon, 4 Dec 2023 16:41:12 +0800
Subject: [PATCH 14/26] =?UTF-8?q?bugfix:=20=E4=BF=AE=E5=A4=8D=E8=8A=82?=
=?UTF-8?q?=E7=82=B9=E7=8A=B6=E6=80=81=E8=81=94=E8=B0=83=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
gcloud/core/apis/drf/viewsets/taskflow.py | 13 +++++++++----
gcloud/taskflow3/domains/dispatchers/task.py | 4 ++--
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/gcloud/core/apis/drf/viewsets/taskflow.py b/gcloud/core/apis/drf/viewsets/taskflow.py
index 67aafb3d29..9c421418f3 100644
--- a/gcloud/core/apis/drf/viewsets/taskflow.py
+++ b/gcloud/core/apis/drf/viewsets/taskflow.py
@@ -179,9 +179,11 @@ def _filter_pipeline_pause(self):
获取所有暂停的任务,当任务暂停时,pipeline 的状态会变成暂停,
return:
"""
- return self.queryset.filter(
- pipeline_instance_id__in=self._fetch_pipeline_instance_ids(statuses=[states.SUSPENDED], by_root=False)
- )
+
+ pause_pipeline_instance_ids = set(
+ self._fetch_pipeline_instance_ids(statuses=[states.SUSPENDED], by_root=True)
+ ) - set(self._fetch_pipeline_instance_ids(statuses=[states.FAILED]))
+ return self.queryset.filter(pipeline_instance_id__in=pause_pipeline_instance_ids)
def _filter_running(self):
"""
@@ -189,9 +191,12 @@ def _filter_running(self):
@return:
"""
- return self.queryset.exclude(
+
+ running_task_queryset = self.queryset.exclude(
pipeline_instance_id__in=self._fetch_pipeline_instance_ids(statuses=[states.FAILED, states.SUSPENDED])
)
+ pending_process_taskflow_ids: typing.List[int] = self._fetch_pending_process_taskflow_ids(running_task_queryset)
+ return running_task_queryset.exclude(id__in=pending_process_taskflow_ids)
def _filter_pending_process(self):
"""
diff --git a/gcloud/taskflow3/domains/dispatchers/task.py b/gcloud/taskflow3/domains/dispatchers/task.py
index baab0b613c..326ff0f9e4 100644
--- a/gcloud/taskflow3/domains/dispatchers/task.py
+++ b/gcloud/taskflow3/domains/dispatchers/task.py
@@ -608,7 +608,7 @@ def get_subprocess_status(task_status: dict, subprocess_id: str) -> dict:
] = fetch_node_id__auto_retry_info_map(root_pipeline_id, extract_nodes_by_statuses(status_tree))
self.format_bamboo_engine_status(
- task_status, node_ids_gby_code, code__status_map, node_id__auto_retry_info, is_subquery
+ task_status, node_ids_gby_code, code__status_map, node_id__auto_retry_info, False, is_subquery
)
else:
format_bamboo_engine_status_legacy(task_status)
@@ -793,7 +793,7 @@ def format_bamboo_engine_status(
if AutoRetryNodeStrategy.objects.filter(root_pipeline_id=status_tree["id"]).exists():
self.handle_subprocess_node_status(status_tree)
else:
- if is_subquery or is_child:
+ if is_subquery:
# 只有在「子查询」(独立子流程)或子递归(非独立子流程)的情况下,才需要校验
auto_retry_info: typing.Optional[typing.Dict[str, typing.Any]] = node_id__auto_retry_info.get(
status_tree["id"]
From 4fe6479ed7cfd36cf318fd36fe72f1e4f9c6f795 Mon Sep 17 00:00:00 2001
From: v_xugzhou <941071842@qq.com>
Date: Fri, 1 Dec 2023 14:25:10 +0800
Subject: [PATCH 15/26] =?UTF-8?q?bugfix:=20=E4=BB=BB=E5=8A=A1=E7=8A=B6?=
=?UTF-8?q?=E6=80=81=E4=BD=93=E9=AA=8C=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pages/task/TaskExecute/ExecuteInfo.vue | 81 ++++++++++++-------
.../desktop/src/pages/task/TaskList/index.vue | 6 +-
2 files changed, 55 insertions(+), 32 deletions(-)
diff --git a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue
index 55107b1afa..4e305b6388 100644
--- a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue
+++ b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue
@@ -169,7 +169,7 @@