diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.eot b/frontend/desktop/src/assets/fonts/bksops-icon.eot
index 0ed6cf8ed2..faaccae3c9 100644
Binary files a/frontend/desktop/src/assets/fonts/bksops-icon.eot and b/frontend/desktop/src/assets/fonts/bksops-icon.eot differ
diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.svg b/frontend/desktop/src/assets/fonts/bksops-icon.svg
index e1c5106cd9..486d6bc6fe 100644
--- a/frontend/desktop/src/assets/fonts/bksops-icon.svg
+++ b/frontend/desktop/src/assets/fonts/bksops-icon.svg
@@ -449,9 +449,6 @@
-
-
-
@@ -464,9 +461,6 @@
-
-
-
@@ -590,6 +584,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.ttf b/frontend/desktop/src/assets/fonts/bksops-icon.ttf
index 59bf7604dd..f6789a785f 100644
Binary files a/frontend/desktop/src/assets/fonts/bksops-icon.ttf and b/frontend/desktop/src/assets/fonts/bksops-icon.ttf differ
diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.woff b/frontend/desktop/src/assets/fonts/bksops-icon.woff
index d89befc02a..67a2bfe364 100644
Binary files a/frontend/desktop/src/assets/fonts/bksops-icon.woff and b/frontend/desktop/src/assets/fonts/bksops-icon.woff differ
diff --git a/frontend/desktop/src/components/common/TableRenderHeader.vue b/frontend/desktop/src/components/common/TableRenderHeader.vue
index d51b419dd1..1eade8de02 100644
--- a/frontend/desktop/src/components/common/TableRenderHeader.vue
+++ b/frontend/desktop/src/components/common/TableRenderHeader.vue
@@ -339,17 +339,14 @@
}
.table-header-filter-popover {
.tippy-tooltip {
- padding: 4px 0 0 0;
- .tippy-content {
- background: #fff;
- }
+ padding: 4px 0;
+ background: #fff !important;
}
.option-list {
width: 200px;
max-height: 350px;
overflow: auto;
@include scrollbar;
- margin-bottom: 15px;
background: #fff;
.option-item {
height: 32px;
diff --git a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/NodeRightIconStatus.vue b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/NodeRightIconStatus.vue
index bd4288ecea..fa64da8322 100644
--- a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/NodeRightIconStatus.vue
+++ b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/NodeRightIconStatus.vue
@@ -4,18 +4,23 @@
-
-
{{ node.retry > 99 ? '100+' : node.retry }}
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
{{ node.loop > 99 ? '99+' : node.loop }}
+
+
+
@@ -38,6 +43,11 @@
name: 'NodeRightIconStatus',
props: {
node: Object
+ },
+ computed: {
+ isPendingState () {
+ return ['PENDING_PROCESSING', 'PENDING_APPROVAL', 'PENDING_CONFIRMATION'].includes(this.node.status)
+ }
}
}
diff --git a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/Subflow.vue b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/Subflow.vue
index e53296c922..81e74a9737 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
+
@@ -67,7 +89,7 @@
- {{ $t('继续') }}
+ {{ $t('确认继续') }}
diff --git a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/TaskNode.vue b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/TaskNode.vue
index a7b95a1e8d..53c1916ac9 100755
--- a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/TaskNode.vue
+++ b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/TaskNode.vue
@@ -41,10 +41,28 @@
@change="onNodeCheckClick">
-
AS
-
MS
-
MR
-
AR
+
+
+
+ {{ node.loop > 99 ? '99+' : node.loop }}
+
+
+
+
+ MR
+ {{ node.retry - node.auto_skip }}
+
+
+ AR
+ {{ node.auto_skip }}
+
+
+
+ AS
+ MS
+ MR
+ AR
+
@@ -58,10 +76,10 @@
{{ $t('跳过') }}
-
+
- {{ $t('继续') }}
+ {{ $t('确认继续') }}
diff --git a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/index.vue b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/index.vue
index 9c3fa894f8..5816e7cf8e 100755
--- a/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/index.vue
+++ b/frontend/desktop/src/components/common/TemplateCanvas/NodeTemplate/index.vue
@@ -366,6 +366,15 @@
@include nodeClick ($blueDark);
}
}
+ &.pending_task_continue,
+ &.pending_processing,
+ &.pending_approval,
+ &.pending_confirmation {
+ @include taskNodeStyle (#ffb848);
+ &.actived {
+ @include nodeClick (#ffb848);
+ }
+ }
&.running {
.node-name {
border-color: $blueDark;
@@ -406,6 +415,11 @@
.node-icon-font {
font-size: 16px;
color: #ffffff;
+ &.common-icon-bk-plugin-message,
+ &.common-icon-bk-plugin-confirm,
+ &.common-icon-bk-plugin-approval {
+ font-size: 14px;
+ }
}
.stage-name {
padding: 0 4px;
@@ -447,26 +461,43 @@
position: absolute;
top: -20px;
left: 0;
- overflow: hidden;
+ height: 20px;
.bk-form-checkbox,
.dark-circle {
- float: left;
- margin-right: 2px;
+ margin-bottom: 2px;
font-size: 14px;
color: #979ba5;
}
.error-handle-icon {
- float: left;
- margin-right: 2px;
- padding: 0 3px;
+ display: flex;
+ align-items: center;
+ margin-left: -4px;
line-height: 12px;
- color: #ffffff;
- background: #979ba5;
- border-radius: 2px;
+ font-size: 12px;
+ transform: scale(0.75) translateY(-1px);
.text {
- display: inline-block;
- font-size: 12px;
- transform: scale(0.8);
+ padding: 2px 3px;
+ color: #ffffff;
+ background: #979ba5;
+ border-radius: 1px 0 0 1px;
+ }
+ .count {
+ padding: 2px 3px;
+ color: #636568;
+ background: #dcdee5;
+ border-radius: 0px 1px 1px 0;
+ }
+ &:nth-of-type(2) {
+ margin-left: -1px;
+ }
+ &:last-child {
+ margin-left: -5px;
+ }
+ &:nth-of-type(4) {
+ margin-left: -5px;
+ }
+ &:nth-of-type(5) {
+ margin-left: -4px;
}
}
}
@@ -518,16 +549,16 @@
align-items: center;
justify-content: space-between;
top: -10px;
- right: -8px;
- height: 18px;
+ right: -10px;
+ height: 20px;
}
.task-status-icon {
display: flex;
justify-content: center;
align-items: center;
margin-left: 2px;
- width: 18px;
- height: 18px;
+ width: 20px;
+ height: 20px;
font-size: 14px;
border-radius: 50%;
background: #f8b53f;
@@ -541,37 +572,45 @@
.common-icon-clock {
display: inline-block;
}
+ .common-icon-pending-approval,
+ .common-icon-pending-confirm {
+ font-size: 12px;
+ color: #fff;
+ }
.common-icon-loading {
display: inline-block;
animation: loading 1.4s infinite linear;
}
- .icon-arrows-right-shape {
- font-size: 12px;
+ .common-icon-pause {
+ font-size: 20px;
+ transform: scale(0.5);
}
.retry-times {
font-size: 12px;
}
+ &.node-pending {
+ height: 20px;
+ width: 20px;
+ box-shadow: none;
+ }
&.task-node-loop {
- position: relative;
- height: 16px;
- width: 16px;
+ width: 24px;
+ margin: 0 4px 0 0;
+ transform: translateY(1px);
color: #3a84ff;
- background: #fff !important;
+ background: transparent !important;
+ box-shadow: none;
> i {
position: absolute;
font-size: 14px;
}
> span {
position: relative;
- top: -0.5px;
+ top: -1px;
+ left: 0px;
font-weight: 700;
font-size: 18px;
- transform: scale(.5);
- }
- &.loop-plural {
- width: 26px;
- height: 16px;
- border-radius: 8px;
+ transform: scale(.5) translateY(2px);
}
}
@keyframes loading {
@@ -583,13 +622,23 @@
}
}
}
- .node-subscript {
- font-size: 12px;
- background: #ea3636 !important;
+ .node-manual-skip,
+ .node-auto-skip {
+ display: flex;
+ height: 20px;
+ font-size: 20px;
+ border-radius: 50%;
+ color: #f0a0a0;
+ background: #fff;
+ i {
+ transform: translateY(1px);
+ }
}
.node-phase-icon {
+ transform: translateY(-2px);
+ margin-right: 4px;
i {
- font-size: 14px;
+ font-size: 16px;
&.phase-warn {
color: $yellowDark;
}
diff --git a/frontend/desktop/src/components/common/TemplateCanvas/ToolPanel/index.vue b/frontend/desktop/src/components/common/TemplateCanvas/ToolPanel/index.vue
index 1efc7007c1..0a49a26662 100644
--- a/frontend/desktop/src/components/common/TemplateCanvas/ToolPanel/index.vue
+++ b/frontend/desktop/src/components/common/TemplateCanvas/ToolPanel/index.vue
@@ -14,7 +14,7 @@
-
+
- {{ $t('继续执行') }}
+ {{ $t('确认继续') }}
{{ $t('暂停') }}
-
- {{ isSubProcessNode ? $t('重试子流程') : $t('重试') }}
-
+
+
+ {{ isSubProcessNode ? $t('重试子流程') : $t('重试') }}
+
+
- {{ $t('继续') }}
+ {{ $t('确认继续') }}
@@ -332,7 +345,6 @@
},
loop: 1,
theExecuteTime: undefined,
- isReadyStatus: true,
curActiveTab: 'record',
theExecuteRecord: 0,
executeRecord: {},
@@ -358,6 +370,16 @@
...mapState('project', {
project_id: state => state.project_id
}),
+ autoRetryInfo () {
+ const { auto_retry_infos: retryInfos } = this.nodeDisplayStatus
+ const retryInfo = retryInfos[this.nodeDetailConfig.node_id] || {}
+ return {
+ h: !!Object.keys(retryInfo).length,
+ m: retryInfo.auto_retry_times || 0,
+ c: retryInfo.max_auto_retry_times || 10,
+ n: this.realTimeState.retry - retryInfo.auto_retry_times || 0
+ }
+ },
// 节点实时状态
realTimeState () {
const { root_node, node_id, taskId } = this.nodeDetailConfig
@@ -377,21 +399,42 @@
}
return nodes[node_id] || { state: 'READY' }
},
+ // 子任务状态
+ subTaskStatus () {
+ const { taskId } = this.nodeDetailConfig
+ if (!taskId) return 'READY'
+ const stateInfo = this.subprocessNodeStatus[taskId]
+ return stateInfo.data.state
+ },
displayStatus () {
let state = ''
- if (this.realTimeState.state === 'RUNNING') {
- state = 'common-icon-dark-circle-ellipsis'
- } else if (this.realTimeState.state === 'SUSPENDED') {
- state = 'common-icon-dark-circle-pause'
- } else if (this.realTimeState.state === 'FINISHED') {
- const { skip, error_ignored } = this.realTimeState
- state = skip || error_ignored ? 'common-icon-fail-skip' : 'bk-icon icon-check-circle-shape'
- } else if (this.realTimeState.state === 'FAILED') {
- state = 'common-icon-dark-circle-close'
- } else if (this.realTimeState.state === 'CREATED') {
- state = 'common-icon-waitting'
- } else if (this.realTimeState.state === 'READY') {
- state = 'common-icon-waitting'
+ switch (this.realTimeState.state) {
+ case 'RUNNING':
+ state = 'common-icon-dark-circle-ellipsis'
+ break
+ case 'SUSPENDED':
+ state = 'common-icon-dark-circle-pause'
+ break
+ case 'PENDING_PROCESSING':
+ state = 'common-icon-dark-pending-process'
+ break
+ case 'PENDING_APPROVAL':
+ state = 'common-icon-dark-pending-approval'
+ break
+ case 'PENDING_CONFIRMATION':
+ state = 'common-icon-dark-pending-confirm'
+ break
+ case 'FINISHED':
+ const { skip, error_ignored } = this.realTimeState
+ state = skip || error_ignored ? 'common-icon-fail-skip' : 'bk-icon icon-check-circle-shape'
+ break
+ case 'FAILED':
+ state = 'common-icon-dark-circle-close'
+ break
+ case 'CREATED':
+ case 'READY':
+ state = 'common-icon-waitting'
+ break
}
return state
},
@@ -401,7 +444,7 @@
// 如果整体任务执行完毕但有的节点没执行的话不展示描述
if (['FAILED', 'FINISHED'].includes(this.state) && this.realTimeState.state === 'READY') return i18n.t('未执行')
const { state, skip, error_ignored } = this.realTimeState
- return skip || error_ignored ? i18n.t('失败后跳过') : state && TASK_STATE_DICT[state]
+ return skip ? i18n.t('失败后手动跳过') : error_ignored ? i18n.t('失败后自动跳过') : state && TASK_STATE_DICT[state]
},
location () {
const { node_id, subprocess_stack = [] } = this.nodeDetailConfig
@@ -435,7 +478,7 @@
return ['record', 'log'].includes(this.curActiveTab) && (this.loop > 1 || this.historyInfo.length > 1)
},
isShowContinueBtn () {
- return this.isLegacySubProcess && this.executeInfo.state === 'SUSPENDED'
+ return this.isLegacySubProcess && [this.realTimeState.state, this.executeInfo.state].includes('SUSPENDED')
},
isShowSkipBtn () {
let isShow = false
@@ -455,7 +498,7 @@
},
isShowActionWrap () {
// 任务终止时禁止节点操作
- if (this.state === 'REVOKED') return false
+ if ([this.state, this.subTaskStatus].includes('REVOKED')) return false
// 判断父级节点是否存在失败后跳过
if (this.nodeDetailConfig.taskId) {
const allNodeStatus = {
@@ -478,7 +521,8 @@
return false
}
}
- return this.realTimeState.state === 'RUNNING'
+ const executeState = ['RUNNING', 'PENDING_PROCESSING', 'PENDING_APPROVAL', 'PENDING_CONFIRMATION'].includes(this.realTimeState.state)
+ return executeState
|| this.isShowRetryBtn
|| this.isShowSkipBtn
|| this.isShowContinueBtn
@@ -563,11 +607,32 @@
nodeDisplayStatus: {
handler (val) {
// 设置节点树状态
- this.nodeAddStatus(this.nodeData, val.children)
+ this.nodeAddStatus(this.nodeData, val.children, false)
this.updateNodeInfo()
},
deep: true,
immediate: true
+ },
+ async 'realTimeState.state' (val, oldVal) {
+ if (val !== oldVal) {
+ await this.loadNodeInfo()
+ // 拉取独立子流程状态
+ const { root_node, component_code, taskId } = this.nodeDetailConfig
+ if (val === 'RUNNING' && taskId && component_code !== 'subprocess_plugin') {
+ const nodes = root_node.split('-')
+ const parentNode = nodes.slice(-1)[0]
+ const parentRoot = nodes.slice(0, -1).join('-')
+ // 获取最新节点树
+ const nodeInfo = this.getNodeInfo(this.nodeData, parentRoot, parentNode)
+ await this.getSubprocessData(taskId, nodeInfo, true)
+ this.subprocessTasks[taskId] = {
+ root_node: parentRoot,
+ node_id: parentNode
+ }
+ // 获取独立子流程任务状态
+ this.loadSubprocessStatus()
+ }
+ }
}
},
mounted () {
@@ -604,14 +669,12 @@
this.renderConfig = []
let respData = await this.getTaskNodeDetail()
if (!respData) {
- this.isReadyStatus = false
this.executeInfo = {}
this.theExecuteTime = undefined
this.historyInfo = []
return
}
respData = this.adminView && this.engineVer === 1 ? { ...respData, ...respData.execution_info } : respData
- this.isReadyStatus = ['RUNNING', 'SUSPENDED', 'FINISHED', 'FAILED'].indexOf(respData.state) > -1
await this.setFillRecordField(respData)
if (this.theExecuteTime === undefined) {
@@ -628,7 +691,7 @@
const nodeInfo = this.getNodeInfo(this.nodeData, root_node, node_id)
if (taskId) { // 子流程任务已执行才可以查详情和状态
// 获取子流程任务详情
- await this.getSubprocessData(taskId, nodeInfo)
+ await this.getSubprocessData(taskId, nodeInfo, true)
this.subprocessTasks[taskId] = {
root_node,
node_id
@@ -1144,16 +1207,21 @@
}
},
// 设置节点树状态
- nodeAddStatus (treeData = [], states) {
+ nodeAddStatus (treeData = [], states, independent) {
treeData.forEach(node => {
- const { id, conditionType, isSubProcess, children } = node
+ const { id, conditionType, isSubProcess, children, taskId } = node
if (conditionType) {
if (children?.length) {
- this.nodeAddStatus(children, states)
+ this.nodeAddStatus(children, states, independent)
+ }
+ return
+ }
+ if (!states[id]) {
+ if (independent && taskId) {
+ this.$set(node, 'state', 'READY')
}
return
}
- if (!states[id]) return
const nodeState = states[id].skip ? 'SKIP' : states[id].state
this.$set(node, 'state', nodeState)
if (this.subNodesExpanded.includes(node.id)) {
@@ -1163,17 +1231,9 @@
}
this.handleDynamicLoad(node, true)
}
- // 实时更新执行详情中的状态
- if (this.executeRecord.id === node.id) {
- this.executeRecord.state = nodeState
- }
- if (this.nodeDetailConfig.node_id === id && !this.executeRecord.finish_time) {
- this.executeRecord.finish_time = states[id].finish_time
- this.executeRecord.elapsed_time = states[id].elapsed_time
- }
if (children) {
const newStates = isSubProcess ? Object.assign({}, states, states[id].children) : states
- this.nodeAddStatus(children, newStates)
+ this.nodeAddStatus(children, newStates, independent)
}
})
},
@@ -1181,7 +1241,7 @@
* 更新子流程画布
* nodeStatus 独立子流程任务状态
*/
- updateNodeInfo (nodeStatus) {
+ updateNodeInfo (nodeStatus, retryInfo = {}) {
if (!this.subProcessPipeline) return
const { root_node, node_id } = this.nodeDetailConfig
const parentId = root_node?.split('-') || []
@@ -1217,6 +1277,7 @@
loop: currentNode.loop,
status: currentNode.state,
skip: currentNode.skip,
+ auto_skip: retryInfo[id]?.auto_retry_times || 0,
retry: currentNode.retry,
error_ignored: currentNode.error_ignored,
error_ignorable: errorIgnorable,
@@ -1419,9 +1480,10 @@
for (const [key, value] of Object.entries(resp.data)) {
const { root_node, node_id } = this.subprocessTasks[key]
const nodeInfo = this.getNodeInfo(this.nodeData, root_node, node_id)
- this.nodeAddStatus(nodeInfo.children, value.data.children)
- this.updateNodeInfo(value.data.children)
- if (!['CREATED', 'RUNNING'].includes(value.data.state)) {
+ const { auto_retry_infos: retryInfo, children, state } = value.data
+ this.nodeAddStatus(nodeInfo.children, children, true)
+ this.updateNodeInfo(children, retryInfo)
+ if (!['CREATED', 'RUNNING'].includes(state)) {
delete this.subprocessTasks[key]
}
}
@@ -1568,7 +1630,6 @@
.action-wrapper {
width: 100%;
padding-left: 20px;
- height: 48px;
line-height: 48px;
background: #fafbfd;
box-shadow: 0 -1px 0 0 #dcdee5;
@@ -1598,14 +1659,17 @@
display: flex;
align-items: center;
:first-child {
- margin: 2px 5px 0;
+ margin: 0 5px;
}
}
.common-icon-dark-circle-ellipsis {
font-size: 14px;
color: #3a84ff;
}
- .common-icon-dark-circle-pause {
+ .common-icon-dark-circle-pause,
+ .common-icon-dark-pending-process,
+ .common-icon-dark-pending-approval,
+ .common-icon-dark-pending-confirm {
font-size: 14px;
color: #f8B53f;
}
@@ -1776,6 +1840,10 @@
margin: 0 16px;
background: #dcdee5;
}
+ .retry-details-tips {
+ color: #979ba5;
+ margin-left: 16px;
+ }
}
.panel-title {
margin: 0;
diff --git a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo/ExecuteRecord.vue b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo/ExecuteRecord.vue
index f9bf8a19e8..14ea4238c1 100644
--- a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo/ExecuteRecord.vue
+++ b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo/ExecuteRecord.vue
@@ -1,7 +1,7 @@
-
+
-
+
-
{{ $t('执行结果') }}
{{ nodeState || '--' }}
-
{{ $t('开始时间') }}
- {{ executeInfo.start_time || '--' }}
+ {{ executeInfo.start_time || '--' }}
-
{{ $t('结束时间') }}
- {{ executeInfo.finish_time || '--' }}
+ {{ executeInfo.finish_time || '--' }}
-
{{ $t('耗时') }}
- {{ executeInfo.finish_time && getLastTime(executeInfo.elapsed_time) || '--' }}
+ {{ executeInfo.finish_time && getLastTime(executeInfo.elapsed_time) || '--' }}
@@ -42,7 +42,7 @@
:render-data="executeInfo.renderData">
@@ -79,10 +79,6 @@
type: Object,
default: () => ({})
},
- isReadyStatus: {
- type: Boolean,
- default: false
- },
executeInfo: {
type: Object,
default: () => ({})
@@ -107,13 +103,20 @@
}
},
computed: {
+ abnormalShow () {
+ const { state, skip, error_ignored } = this.executeInfo
+ return state === 'FAILED' || (state === 'FINISHED' && (skip || error_ignored))
+ },
nodeState () {
const { state, skip, error_ignored } = this.executeInfo
// 如果整体任务未执行的话不展示描述
if (state === 'CREATED') return this.$t('未执行')
// 如果整体任务执行完毕但有的节点没执行的话不展示描述
if (['FAILED', 'FINISHED'].includes(state) && state === 'READY') return this.$t('未执行')
- return skip || error_ignored ? this.$t('失败后跳过') : state && TASK_STATE_DICT[state]
+ return skip || error_ignored ? this.$t('失败') : state && TASK_STATE_DICT[state]
+ },
+ isExecuted () {
+ return ['RUNNING', 'SUSPENDED', 'FINISHED', 'FAILED'].includes(this.executeInfo.state)
}
},
mounted () {
@@ -199,6 +202,9 @@
}
.td {
color: #313238;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
&:first-child,
&:last-child {
diff --git a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo/OutputParams.vue b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo/OutputParams.vue
index ae00c116af..960651a30b 100644
--- a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo/OutputParams.vue
+++ b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo/OutputParams.vue
@@ -6,12 +6,12 @@
:class="{ 'is-expand': isExpand }"
@click="isExpand = !isExpand">
{{ $t('输出参数') }}
-
-
+
@@ -72,7 +72,7 @@
type: Object,
default: () => ({})
},
- isReadyStatus: {
+ isExecuted: {
type: Boolean,
default: false
}
diff --git a/frontend/desktop/src/pages/task/TaskExecute/ModifyParams.vue b/frontend/desktop/src/pages/task/TaskExecute/ModifyParams.vue
index 0631bc4f36..da6bc343f5 100644
--- a/frontend/desktop/src/pages/task/TaskExecute/ModifyParams.vue
+++ b/frontend/desktop/src/pages/task/TaskExecute/ModifyParams.vue
@@ -112,7 +112,7 @@
? ['SUSPENDED', 'RUNNING'].includes(this.rootTaskState)
? i18n.t('保存并继续')
: i18n.t('保存')
- : ['CREATED', 'SUSPENDED', 'FAILED'].includes(this.rootTaskState)
+ : ['CREATED', 'SUSPENDED', 'FAILED', 'PENDING_PROCESSING'].includes(this.rootTaskState)
? i18n.t('去修改')
: i18n.t('暂停去修改')
},
diff --git a/frontend/desktop/src/pages/task/TaskExecute/NodeTreeItem.vue b/frontend/desktop/src/pages/task/TaskExecute/NodeTreeItem.vue
index 55a703c8a0..e6325bdf2e 100644
--- a/frontend/desktop/src/pages/task/TaskExecute/NodeTreeItem.vue
+++ b/frontend/desktop/src/pages/task/TaskExecute/NodeTreeItem.vue
@@ -118,7 +118,10 @@
READY: 'ready',
RUNNING: 'running',
SKIP: 'skip',
- SUSPENDED: 'running'
+ SUSPENDED: 'running',
+ PENDING_PROCESSING: 'pending',
+ PENDING_APPROVAL: 'pending',
+ PENDING_CONFIRMATION: 'pending'
}
return {
nodeType,
@@ -239,6 +242,9 @@
&.skip {
color: #da635f;
}
+ &.pending {
+ color: #ffb848;
+ }
}
.common-icon-converge-node {
font-size: 12px;
@@ -271,6 +277,10 @@
background: #f8c4c1;
border-color: #da635f;
}
+ &.pending {
+ background: #fff;
+ border-color: #ffb848;
+ }
}
&.expanded {
.common-icon-next-triangle-shape {
diff --git a/frontend/desktop/src/pages/task/TaskExecute/TaskOperation.vue b/frontend/desktop/src/pages/task/TaskExecute/TaskOperation.vue
index 183bc8bd3a..229ea5f0f1 100644
--- a/frontend/desktop/src/pages/task/TaskExecute/TaskOperation.vue
+++ b/frontend/desktop/src/pages/task/TaskExecute/TaskOperation.vue
@@ -27,8 +27,9 @@
:state="state"
:is-breadcrumb-show="isBreadcrumbShow"
:is-show-view-process="isShowViewProcess"
- :is-task-operation-btns-show="isTaskOperationBtnsShow"
:params-can-be-modify="paramsCanBeModify"
+ :pending-nodes="pendingNodes"
+ @moveNodeToView="moveNodeToView"
@onSelectSubflow="onSelectSubflow"
@onOperationClick="onOperationClick"
@onTaskParamsClick="onTaskParamsClick"
@@ -218,7 +219,7 @@