feature:前端页面

This commit is contained in:
charlesxie
2022-03-29 19:23:46 +08:00
parent 32efbce2e6
commit eb4bfa1923
16 changed files with 1788 additions and 2106 deletions

View File

@@ -14,6 +14,7 @@
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/lib" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/web/node_modules" />
</content>
<content url="file://$MODULE_DIR$/web/node_modules" />

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
from datetime import datetime
from django.db import models
from django.forms import BooleanField
from django_mysql.models import JSONField
from applications.flow.constants import FAIL_OFFSET_UNIT_CHOICE, NodeTemplateType

View File

@@ -106,14 +106,26 @@ class ProcessViewSetsSerializer(serializers.Serializer):
class ListProcessViewSetsSerializer(serializers.ModelSerializer):
class Meta:
model = Process
fields = "__all__"
# fields = "__all__"
exclude = ("dag",)
class ListProcessRunViewSetsSerializer(serializers.ModelSerializer):
state = serializers.SerializerMethodField()
class Meta:
model = ProcessRun
fields = "__all__"
def get_state(self, obj):
runtime = BambooDjangoRuntime()
process_info = api.get_pipeline_states(runtime, root_id=obj.root_id)
try:
process_state = PIPELINE_STATE_TO_FLOW_STATE.get(process_info.data[obj.root_id]["state"])
except Exception:
process_state = "error"
return process_state
class RetrieveProcessViewSetsSerializer(serializers.ModelSerializer):
pipeline_tree = serializers.SerializerMethodField()
@@ -133,7 +145,13 @@ class RetrieveProcessViewSetsSerializer(serializers.ModelSerializer):
"to": _to
})
node_list = Node.objects.filter(process_id=obj.id).values()
node_content_id = [node["content"] for node in node_list if node.get("content", 0)]
content_map = NodeTemplate.objects.filter(id__in=node_content_id).in_bulk()
for node in node_list:
node_template = content_map.get(node.get("content", 0), "")
inputs_component = ""
if node_template:
inputs_component = json.dumps(node_template.inputs_component)
nodes.append({"show": node["show"],
"top": node["top"],
"left": node["left"],
@@ -142,7 +160,8 @@ class RetrieveProcessViewSetsSerializer(serializers.ModelSerializer):
"name": node["name"],
"content": node["content"],
"node_data": {
"inputs": node["inputs"],
"inputs": json.dumps(node["inputs"]),
"inputs_component": inputs_component,
"run_mark": 0,
"node_name": node["name"],
"description": node["description"],
@@ -180,9 +199,13 @@ class RetrieveProcessRunViewSetsSerializer(serializers.ModelSerializer):
pipeline_state = state_map.get(node["uuid"], {}).get("state", "READY")
flow_state = PIPELINE_STATE_TO_FLOW_STATE[pipeline_state]
outputs = ""
if node["node_type"] not in [0, 1] and flow_state == "success":
print(flow_state)
if node["node_type"] not in [0, 1] and flow_state not in ["wait"]:
output_data = api.get_execution_data_outputs(runtime, node_id=node["uuid"])
outputs = json.dumps(output_data.data["outputs"])
outputs = output_data.data.get("outputs", "")
# todo先简单判断node有failprocess就为fail
if flow_state == "fail":
process_state = "fail"
nodes.append({"show": node["show"],
"top": node["top"],
"left": node["left"],

View File

@@ -1,3 +1,7 @@
from datetime import datetime
from django.db.models import F
from bamboo_engine import api
from bamboo_engine.builder import *
from django.http import JsonResponse
@@ -70,6 +74,7 @@ class ProcessViewSets(mixins.ListModelMixin,
_node["uuid"] = process_run_uuid[pipeline_id]
node_run_bulk.append(NodeRun(process_run=process_run, **_node))
NodeRun.objects.bulk_create(node_run_bulk, batch_size=500)
Process.objects.filter(id=process_id).update(total_run_count=F("total_run_count") + 1)
return Response({})
@@ -91,6 +96,7 @@ class NodeTemplateViewSet(mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.RetrieveModelMixin,
GenericViewSet):
queryset = NodeTemplate.objects.order_by("-id")
serializer_class = NodeTemplateSerializer

View File

@@ -21,11 +21,15 @@ class HttpRequestService(Service):
res = requests.request(inputs["method"], url=inputs["url"], headers=headers, timeout=inputs["timeout"],
**req_data).content
print("执行了", res)
res = json.loads(res)
try:
res = json.loads(res)
except Exception:
res = res
data.outputs.outputs = res
time.sleep(5)
return True
except Exception:
except Exception as e:
data.outputs.outputs = str(e)
return False
def parse_headers(self, headers):

View File

@@ -117,33 +117,28 @@
overflowTooltip: true,
sortable: false
}, {
id: 'total_job_count',
label: '作业数量',
overflowTooltip: false,
sortable: false
}, {
id: 'type',
id: 'run_type',
label: '调度方式',
overflowTooltip: false,
sortable: true
}, {
id: 'category',
label: '跑批系统',
label: '分类',
overflowTooltip: false,
sortable: false
}, {
id: 'creator',
label: '创建',
id: 'create_by',
label: '创建',
overflowTooltip: false,
sortable: false
}, {
id: 'edit_time',
label: '上次修改时间',
id: 'create_time',
label: '创建时间',
overflowTooltip: true,
sortable: true
}, {
id: 'last_run_at',
label: '上次执行时间',
id: 'update_time',
label: '更新时间',
overflowTooltip: true,
sortable: true
}, {
@@ -156,11 +151,6 @@
label: '作业流描述',
overflowTooltip: true,
sortable: false
}, {
id: 'cross_day_dependence',
label: '跨日依赖',
overflowTooltip: true,
sortable: false
}]
return {
maxTableHeight: '',

View File

@@ -1,165 +1,72 @@
<template>
<div id="jobDialog">
<div class="form">
<div class="form-item">
<span>作业名</span>
<p>{{form.name}}</p>
</div>
<div class="form-item">
<span>所属作业流</span>
<p :title="form.process">{{checkFormValue(form.process)}}</p>
</div>
<div class="form-item">
<span>Agent</span>
<p>{{form.station}}</p>
</div>
<div class="form-item">
<span>IP</span>
<p>{{form.ip}}</p>
</div>
<div class="form-item">
<span>操作系统</span>
<p>{{form.os}}</p>
</div>
<div class="form-item">
<span>作业描述</span>
<p :title="form.description">{{checkFormValue(form.description)}}</p>
</div>
<div class="form-item">
<span>执行账号</span>
<p>{{form.account}}</p>
</div>
<div class="form-item">
<span>脚本类型</span>
<p>{{scriptTypeList.find(item => item.key === form.script_type).label}}</p>
</div>
<template v-if="form.script_type === 6">
<div class="form-item">
<span>请求方式</span>
<p>{{checkFormValue(form.request_type)}}</p>
<bk-form ref="form" :label-width="144" :model="form">
<bk-form-item label="节点名称:" :required="true" :error-display-type="'normal'" :property="'node_name'">
<bk-input v-model="form.name" type="text" style="width: 350px;margin-right: 9px;" :disabled="disabled"></bk-input>
</bk-form-item>
<bk-form-item label="运行标志:" :required="true" :error-display-type="'normal'" :property="'run_mark'">
<bk-radio-group v-model="form.run_mark">
<bk-radio :value="item.value" v-for="(item, index) in reviewList" :key="index" style="margin-right: 24px;" :disabled="disabled">
{{ item.label }}
</bk-radio>
</bk-radio-group>
</bk-form-item>
<bk-form-item label="描述:">
<bk-input v-model="form.description" type="textarea" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</bk-form-item>
<bk-form-item label="失败重试次数:" :required="true" :error-display-type="'normal'" :property="'fail_retry_count'">
<bk-input v-model="form.fail_retry_count" type="number" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</bk-form-item>
<bk-form-item label="失败重试间隔:">
<bk-compose-form-item>
<bk-input v-model="form.fail_offset" type="number" style="width: 139px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
<bk-select :clearable="true" style="background-color: #fff;width: 138px;margin-right: 14px;" v-model="form.fail_offset_unit" placeholder="请选择" :disabled="disabled">
<bk-option v-for="(item, index) in timeTypeList" :key="index" :id="item.value" :name="item.label">
</bk-option>
</bk-select>
<span>产生重试</span>
</bk-compose-form-item>
</bk-form-item>
<bk-form-item label="忽略失败:">
<bk-switcher v-model="form.is_skip_fail" :disabled="disabled"></bk-switcher>
</bk-form-item>
<bk-form-item label="超时告警:">
<bk-switcher v-model="form.is_timeout_alarm" :disabled="disabled"></bk-switcher>
</bk-form-item>
<bk-divider style="width: 540px;position: relative;right: 20px;border-color: #dcdee5;"></bk-divider>
<p class="title">输入参数</p>
<bk-form-item v-for="(item,index) in form.inputs_component" :label="item.label" :key="index">
<div v-if="item.type === 'textarea'">
<bk-input v-model="form.inputs[item.key]" type="textarea" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</div>
<div class="form-item">
<span>URL</span>
<p>{{checkFormValue(form.request_url)}}</p>
<div v-else-if="item.type === 'select'">
<bk-select :clearable="true" style="background-color: #fff;width: 130px;margin-right: 14px;" v-model="form.inputs[item.key]" placeholder="请选择" :disabled="disabled">
<bk-option v-for="(item2, index2) in item.choices || []" :key="index2" :id="item2.value" :name="item2.label">
</bk-option>
</bk-select>
</div>
<div class="form-item">
<span>请求头</span>
<p>{{checkFormValue(form.headers)}}</p>
<div v-else-if="item.type === 'dict_map'">
<div v-for="(item3, index3) in form.inputs[item.key]" class="pre-commands" :key="index3" style="margin-bottom: 12px;">
<bk-compose-form-item>
<bk-input v-model="item3.key" type="text" style="width: 130px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
<bk-input v-model="item3.value" type="text" style="width: 130px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</bk-compose-form-item>
<i class="iconfont icon-changyongtubiao-chahao btn" style="margin-left: 8px;" v-if="!disabled && form.inputs[item.key].length > 1"></i>
<i class="iconfont icon-changyongtubiao-jiahao btn" v-if="!disabled"></i>
</div>
</div>
<div class="form-item">
<span>请求体</span>
<p :title="form.params">{{JSON.parse(JSON.stringify(checkFormValue(form.params)))}}</p>
<div v-else-if="item.type === 'number'">
<bk-input v-model="form.inputs[item.key]" type="number" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</div>
<div v-else-if="item.type === 'text'">
<bk-input v-model="form.inputs[item.key]" type="text" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</div>
<div v-else>
<div style="color: red">ERROR:不支持的类型</div>
</div>
</template>
<div class="form-item" v-if="form.script_type !== 6">
<span>脚本内容</span>
<p :title="form.script_content">{{form.script_content}}</p>
</div>
<div class="form-item">
<span>超时时间</span>
<p>{{checkFormValue(form.script_timeout)}}</p>
</div>
<div class="form-item">
<span>退出码</span>
<p>{{checkFormValue(form.exit_code)}}</p>
</div>
<div class="form-item">
<span>上一次执行时间</span>
<p>{{checkFormValue(form.last_run_at)}}</p>
</div>
<div class="form-item">
<span>执行次数</span>
<p>{{checkFormValue(form.total_run_count)}}</p>
</div>
<div class="form-item">
<span>创建人</span>
<p>{{form.creator}}</p>
</div>
<div class="form-item">
<span>创建时间</span>
<p>{{form.create_time}}</p>
</div>
<div class="form-item">
<span>修改人</span>
<p>{{checkFormValue(form.editor)}}</p>
</div>
<div class="form-item">
<span>上一次修改时间</span>
<p>{{checkFormValue(form.edit_time)}}</p>
</div>
</div>
<!-- <bk-form ref="form">
<bk-form-item label="作业名:">
<bk-input v-model="form.name" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="所属作业流:">
<bk-input v-model="form.process" :disabled="true" :title="form.process"></bk-input>
</bk-form-item>
<bk-form-item label="Agent:">
<bk-input v-model="form.station" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="IP:">
<bk-input v-model="form.ip" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="系统:">
<bk-input v-model="form.os" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="作业描述:">
<bk-input v-model="form.description" :disabled="true" :title="form.description"></bk-input>
</bk-form-item>
<bk-form-item label="执行账号:">
<bk-input v-model="form.account" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="脚本类型:">
<bk-select v-model="form.script_type"
placeholder="请选择" :disabled="true">
<bk-option v-for="(item, index) in scriptTypeList" :key="index" :id="item.key"
:name="item.label">
</bk-option>
</bk-select>
</bk-form-item>
<template v-if="form.script_type === 6">
<bk-form-item label="请求方式">
<bk-input :disabled="true" v-model="form.request_type"></bk-input>
</bk-form-item>
<bk-form-item label="URL">
<bk-input :disabled="true" v-model="form.request_url"></bk-input>
</bk-form-item>
<bk-form-item label="请求头">
<bk-input :disabled="true" v-model="form.headers" :title="form.headers"></bk-input>
</bk-form-item>
<bk-form-item label="请求体">
<bk-input :disabled="true" v-model="form.params" :type="'textarea'" :rows="4" :title="form.params"></bk-input>
</bk-form-item>
</template>
<bk-form-item label="脚本内容:" v-if="form.script_type !== 6">
<bk-input v-model="form.script_content" :disabled="true" :title="form.script_content"></bk-input>
</bk-form-item>
<bk-form-item label="超时时间:">
<bk-input v-model="form.script_timeout" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="退出码:">
<bk-input v-model="form.exit_code" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="上一次执行时间:">
<bk-input v-model="form.last_run_at" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="执行次数:">
<bk-input v-model="form.total_run_count" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="创建人:">
<bk-input v-model="form.creator" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="创建时间:">
<bk-input v-model="form.create_time" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="修改人:">
<bk-input v-model="form.editor" :disabled="true"></bk-input>
</bk-form-item>
<bk-form-item label="上一次修改时间:">
<bk-input v-model="form.edit_time" :disabled="true"></bk-input>
</bk-form-item>
</bk-form> -->
<bk-divider style="width: 540px;position: relative;right: 20px;border-color: #dcdee5;"></bk-divider>
</bk-form>
</div>
</template>
@@ -176,6 +83,28 @@
return {
formLoading: false,
form: {},
disabled: true,
timeTypeList: [{ // 执行时长告警时间类型下拉列表
value: 'hours',
label: '时'
},
{
value: 'minutes',
label: '分'
},
{
value: 'seconds',
label: '秒'
}
],
reviewList: [{ // 执行前人工复核单选列表
label: '正常运行',
value: 0
}, {
label: '禁止运行',
value: 1
}],
scriptTypeList: [{
key: 1,
label: 'Shell(Linux)',

View File

@@ -124,55 +124,10 @@
overflowTooltip: true,
sortable: false
}, {
id: 'process',
label: '所属作业流',
id: 'template_type',
label: '模板类型',
overflowTooltip: true,
sortable: false
}, {
id: 'station',
label: 'Agent',
overflowTooltip: false,
sortable: false
}, {
id: 'ip',
label: 'IP',
overflowTooltip: false,
sortable: false
}, {
id: 'category',
label: '跑批系统',
overflowTooltip: false,
sortable: false
}, {
id: 'account',
label: '执行账号',
overflowTooltip: false,
sortable: false
}, {
id: 'script_content',
label: '脚本',
overflowTooltip: true,
sortable: false
}, {
id: 'creator',
label: '创建人',
overflowTooltip: false,
sortable: false
}, {
id: 'edit_time',
label: '上一次修改时间',
overflowTooltip: true,
sortable: true
}, {
id: 'total_run_count',
label: '执行次数',
overflowTooltip: false,
sortable: true
}, {
id: 'last_run_at',
label: '上一次执行时间',
overflowTooltip: true,
sortable: true
}, {
id: 'description',
label: '作业描述',

View File

@@ -1,128 +1,131 @@
<template>
<div id="singleJob" v-bkloading="{ isLoading: formLoading, zIndex: 10 }">
<div class="content">
<bk-container :margin="0">
<bk-form ref="form" :label-width="120" :rules="rules" :model="form">
<bk-form-item label="作业名称:" :error-display-type="'normal'" :required="true" :property="'name'">
<bk-input placeholder="作业名称" v-model="form.name" clearable></bk-input>
</bk-form-item>
<bk-form-item label="作业描述:" :error-display-type="'normal'" :required="true"
:property="'description'">
<bk-input placeholder="作业描述" v-model="form.description" clearable></bk-input>
</bk-form-item>
<bk-form-item label="选择跑批系统:" :error-display-type="'normal'" :required="true"
:property="'category'">
<bk-select :clearable="false" style="background-color: #fff;" v-model="form.category"
placeholder="请选择" @change="handleRunIdChange">
<bk-option v-for="(item, index) in runSysList" :key="index" :id="item.id" :name="item.name">
</bk-option>
</bk-select>
</bk-form-item>
<bk-form-item label="选择Agent:" :error-display-type="'normal'" :required="true"
:property="'station'">
<bk-select :clearable="false" style="background-color: #fff;" v-model="form.station"
placeholder="请选择" @change="handleAgentIdChange">
<bk-option v-for="(item, index) in agentList" :key="index" :id="item.id" :name="item.name"
v-if="agnetListShow">
</bk-option>
</bk-select>
</bk-form-item>
<bk-form-item label="系统类型:">
<span v-show="form.os">{{form.os}}</span>
</bk-form-item>
<bk-form-item label="执行账号:" :error-display-type="'normal'" :required="true"
:property="'data.account'">
<bk-select :clearable="false" style="background-color: #fff;" v-model="form.data.account"
placeholder="请选择">
<bk-option v-for="(item, index) in accountList" :key="index" :id="item.account"
:name="item.account" v-if="accountListShow">
</bk-option>
</bk-select>
</bk-form-item>
<bk-form-item label="脚本类型:" :error-display-type="'normal'" :required="true"
:property="'data.script_type'">
<bk-select :clearable="false" style="background-color: #fff;" v-model="form.data.script_type"
placeholder="请选择" @change="handleScriptTypeChange">
<bk-option v-for="(item, index) in scriptTypeList" :key="index" :id="item.key"
:name="item.label">
</bk-option>
</bk-select>
</bk-form-item>
<!-- HTTP作业 -->
<template v-if="form.data.script_type === 6">
<bk-form-item label="请求方式:" :error-display-type="'normal'" :required="true"
:property="'data.request_type'">
<bk-select :clearable="false" style="background-color: #fff;" placeholder="请选择"
v-model="form.data.request_type">
<bk-option v-for="(item, index) in httpReqTypeList" :key="index" :id="item.key"
:name="item.label">
</bk-option>
</bk-select>
</bk-form-item>
<bk-form-item label="URL:" :error-display-type="'normal'" :required="true"
:property="'data.request_url'">
<bk-input placeholder="URL" v-model="form.data.request_url"></bk-input>
</bk-form-item>
<bk-form-item label="请求头:" :property="'data.headers'" :error-display-type="'normal'">
<bk-input :placeholder="headerHolder" v-model="form.data.headers"></bk-input>
</bk-form-item>
<bk-form-item label="请求体:" :property="'data.params'" :error-display-type="'normal'">
<bk-input :placeholder="paramsHolder" v-model="form.data.params" :type="'textarea'" :rows="4">
</bk-input>
</bk-form-item>
</template>
<!-- java作业 -->
<template v-if="form.data.script_type === 7">
<bk-form-item label="jar包路径:" :error-display-type="'normal'" :required="true">
<bk-input placeholder="jar包路径"></bk-input>
</bk-form-item>
</template>
<!-- sql作业 -->
<template v-if="form.data.script_type === 8">
<bk-form-item label="数据库类型:" :error-display-type="'normal'" :required="true">
<bk-select :clearable="false" style="background-color: #fff;" placeholder="请选择">
<bk-option v-for="(item, index) in sqlTypeList" :key="index" :id="item.key"
:name="item.label">
</bk-option>
</bk-select>
</bk-form-item>
<bk-form-item label="数据库:" :error-display-type="'normal'" :required="true">
<bk-input placeholder="数据库"></bk-input>
</bk-form-item>
<bk-form-item label="主机:">
<bk-input placeholder="主机" style="width: 360px;"></bk-input>
<span style="margin: 0 12px 0 16px;">端口号:</span>
<bk-input placeholder="端口号" style="width: 122px;"></bk-input>
</bk-form-item>
<bk-row style="margin-top: 20px;margin-bottom: 20px;">
<bk-col :span="12">
<bk-form-item label="数据库用户:" :error-display-type="'normal'" :required="true">
<bk-input placeholder="数据库用户" style="width: 290px;"></bk-input>
</bk-form-item>
</bk-col>
<bk-col :span="11" style="margin-left: 16px;">
<bk-form-item label="密码:" :error-display-type="'normal'" :required="true">
<bk-input placeholder="密码" :type="'password'" style="width: 194px;"></bk-input>
</bk-form-item>
</bk-col>
</bk-row>
</template>
<bk-form-item label="脚本内容:" :error-display-type="'normal'" :required="true" :property="'data.script_content'" v-show="!(form.data.script_type === 6) && !(form.data.script_type === 7)">
<bk-input :type="'textarea'" style="width: 720px;" :rows="10" ext-cls="custom-textarea" v-model="form.data.script_content">
</bk-input>
</bk-form-item>
<bk-form-item label="作业退出码:">
<bk-input placeholder="作业退出码" v-model="form.exit_code"></bk-input>
</bk-form-item>
<bk-form-item label="超时时间(s):" :error-display-type="'normal'" :required="true"
:property="'data.script_timeout'">
<bk-input placeholder="超时时间" type="number" v-model="form.data.script_timeout"></bk-input>
</bk-form-item>
<bk-form-item style="font-size: 0px;" v-if="!overScreenFlag">
<bk-button theme="primary" style="margin-right: 8px;" @click="handleConfim">确定</bk-button>
<bk-button @click="handleCancel">取消</bk-button>
</bk-form-item>
</bk-form>
<div class="wrapper">
<bk-container :col="12" :gutter="4">
<bk-row>
<bk-col :span="7"><div class="content">自定义节点</div></bk-col>
<bk-col :span="5"><div class="content">实时预览</div></bk-col>
</bk-row>
<bk-row>
<bk-col :span="7"><div class="content">
<bk-form ref="form" :label-width="144" :model="form">
<bk-form-item label="节点名称:" :required="true" :error-display-type="'normal'" :property="'node_name'">
<bk-input v-model="form.name" type="text" style="width: 350px;margin-right: 9px;" :disabled="disabled"></bk-input>
</bk-form-item>
<bk-form-item label="运行标志:" :required="true" :error-display-type="'normal'" :property="'run_mark'">
<bk-radio-group v-model="form.run_mark">
<bk-radio :value="item.value" v-for="(item, index) in reviewList" :key="index" style="margin-right: 24px;" :disabled="disabled">
{{ item.label }}
</bk-radio>
</bk-radio-group>
</bk-form-item>
<bk-form-item label="描述:">
<bk-input v-model="form.description" type="textarea" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</bk-form-item>
<bk-form-item label="失败重试次数:" :required="true" :error-display-type="'normal'" :property="'fail_retry_count'">
<bk-input v-model="form.fail_retry_count" type="number" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</bk-form-item>
<bk-form-item label="失败重试间隔:">
<bk-compose-form-item>
<bk-input v-model="form.fail_offset" type="number" style="width: 139px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
<bk-select :clearable="true" style="background-color: #fff;width: 138px;margin-right: 14px;" v-model="form.fail_offset_unit" placeholder="请选择" :disabled="disabled">
<bk-option v-for="(item, index) in timeTypeList" :key="index" :id="item.value" :name="item.label">
</bk-option>
</bk-select>
<span>产生重试</span>
</bk-compose-form-item>
</bk-form-item>
<bk-form-item label="忽略失败:">
<bk-switcher v-model="form.is_skip_fail" :disabled="disabled"></bk-switcher>
</bk-form-item>
<bk-form-item label="超时告警:">
<bk-switcher v-model="form.is_timeout_alarm" :disabled="disabled"></bk-switcher>
</bk-form-item>
<bk-divider
style="width: 540px;position: relative;right: 20px;border-color: #dcdee5;"></bk-divider>
<p class="title">输入参数</p>
<bk-form-item label="输入参数组件">
<editor :height="'200px'" ref="editor1" :codes="JSON.stringify(form.inputs_component)" :read-only="false" :language="'shell'"></editor>
</bk-form-item>
<bk-form-item label="输入参数组件默认值">
<editor :height="'200px'" ref="editor2" :codes="JSON.stringify(form.inputs)" :read-only="false" :language="'shell'"></editor>
</bk-form-item>
<bk-divider
style="width: 540px;position: relative;right: 20px;border-color: #dcdee5;"></bk-divider>
</bk-form>
</div></bk-col>
<bk-col :span="5"><div class="content">
<bk-form ref="form" :label-width="144" :model="form" style="border: 1px solid;">
<bk-form-item label="节点名称:" :required="true" :error-display-type="'normal'" :property="'node_name'">
<bk-input v-model="form.name" type="text" style="width: 350px;margin-right: 9px;" :disabled="disabled"></bk-input>
</bk-form-item>
<bk-form-item label="运行标志:" :required="true" :error-display-type="'normal'" :property="'run_mark'">
<bk-radio-group v-model="form.run_mark">
<bk-radio :value="item.value" v-for="(item, index) in reviewList" :key="index" style="margin-right: 24px;" :disabled="disabled">
{{ item.label }}
</bk-radio>
</bk-radio-group>
</bk-form-item>
<bk-form-item label="描述:">
<bk-input v-model="form.description" type="textarea" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</bk-form-item>
<bk-form-item label="失败重试次数:" :required="true" :error-display-type="'normal'" :property="'fail_retry_count'">
<bk-input v-model="form.fail_retry_count" type="number" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</bk-form-item>
<bk-form-item label="失败重试间隔:">
<bk-compose-form-item>
<bk-input v-model="form.fail_offset" type="number" style="width: 139px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
<bk-select :clearable="true" style="background-color: #fff;width: 138px;margin-right: 14px;" v-model="form.fail_offset_unit" placeholder="请选择" :disabled="disabled">
<bk-option v-for="(item, index) in timeTypeList" :key="index" :id="item.value" :name="item.label">
</bk-option>
</bk-select>
<span>产生重试</span>
</bk-compose-form-item>
</bk-form-item>
<bk-form-item label="忽略失败:">
<bk-switcher v-model="form.is_skip_fail" :disabled="disabled"></bk-switcher>
</bk-form-item>
<bk-form-item label="超时告警:">
<bk-switcher v-model="form.is_timeout_alarm" :disabled="disabled"></bk-switcher>
</bk-form-item>
<bk-divider
style="width: 540px;position: relative;right: 20px;border-color: #dcdee5;"></bk-divider>
<p class="title">输入参数</p>
<bk-form-item v-for="(item,index) in form.inputs_component" :label="item.label" :key="index">
<div v-if="item.type === 'textarea'">
<bk-input v-model="form.inputs[item.key]" type="textarea" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</div>
<div v-else-if="item.type === 'select'">
<bk-select :clearable="true" style="background-color: #fff;width: 130px;margin-right: 14px;" v-model="form.inputs[item.key]" placeholder="请选择" :disabled="disabled">
<bk-option v-for="(item2, index2) in item.choices || []" :key="index2" :id="item2.value" :name="item2.label">
</bk-option>
</bk-select>
</div>
<div v-else-if="item.type === 'dict_map'">
<div v-for="(item3, index3) in form.inputs[item.key]" class="pre-commands" :key="index3" style="margin-bottom: 12px;">
<bk-compose-form-item>
<bk-input v-model="item3.key" type="text" style="width: 130px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
<bk-input v-model="item3.value" type="text" style="width: 130px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</bk-compose-form-item>
<i class="iconfont icon-changyongtubiao-chahao btn" style="margin-left: 8px;" v-if="!disabled && form.inputs[item.key].length > 1"></i>
<i class="iconfont icon-changyongtubiao-jiahao btn" v-if="!disabled"></i>
</div>
</div>
<div v-else-if="item.type === 'number'">
<bk-input v-model="form.inputs[item.key]" type="number" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</div>
<div v-else-if="item.type === 'text'">
<bk-input v-model="form.inputs[item.key]" type="text" style="width: 350px;margin-right: 9px;" :disabled="disabled" :min="0"></bk-input>
</div>
<div v-else>
<div style="color: red">ERROR:不支持的类型</div>
</div>
</bk-form-item>
<bk-divider
style="width: 540px;position: relative;right: 20px;border-color: #dcdee5;"></bk-divider>
</bk-form>
</div></bk-col>
</bk-row>
</bk-container>
</div>
<template v-if="overScreenFlag">
@@ -140,8 +143,10 @@
deepClone, isJson
} from '../../common/util.js'
import { validateURL } from '../../common/validate.js'
import editor from '@/components/monacoEditor'
export default {
components: {
editor
},
data() {
return {
@@ -153,13 +158,36 @@
agnetListShow: true,
accountListShow: true,
formLoading: false,
disabled: false,
timeTypeList: [{ // 执行时长告警时间类型下拉列表
value: 'hours',
label: '时'
},
{
value: 'minutes',
label: '分'
},
{
value: 'seconds',
label: '秒'
}
],
reviewList: [{ // 执行前人工复核单选列表
label: '正常运行',
value: 0
}, {
label: '禁止运行',
value: 1
}],
scriptMap: {
1: 'shell',
2: 'bat',
3: 'perl',
4: 'python',
5: 'powershell',
8: 'sql'
8: 'sql',
9: 'json'
},
sqlTypeList: [{
key: 'MySQL',
@@ -484,12 +512,6 @@
},
// 非http类型的作业以下属性不传
deleteProp(params) {
if (this.form.data.script_type !== 6) {
delete params.data.request_type
delete params.data.request_url
delete params.data.headers
delete params.data.params
}
},
// 处理克隆作业
handleCloneJob() {
@@ -510,12 +532,12 @@
},
// 处理确定
handleConfim() {
if (this.form.data.script_type !== 6) {
// 只有非http类型的节点才获取脚本内容
this.form.data.script_content = this.$refs.editor.monacoEditor.getValue()
} else {
this.form.data.script_content = '' // 加个else清空脚本内容是为了防止原本非http类型的节点切换为http保存之后原来的脚本内容还在。
}
// if (this.form.data.script_type !== 6) {
// // 只有非http类型的节点才获取脚本内容
// this.form.data.script_content = this.$refs.editor.monacoEditor.getValue()
// } else {
// this.form.data.script_content = '' // 加个else清空脚本内容是为了防止原本非http类型的节点切换为http保存之后原来的脚本内容还在。
// }
this.$refs.form.validate().then(validator => {
if (this.$route.query.type === 'add') {
this.handleAddJob()
@@ -584,8 +606,9 @@
this.runSysList = []
},
// 设置默认编辑器
setDefaultEditor(e, str) {
this.$refs.editor.changeModel(this.scriptMap[e], str)
setDefaultEditor(e, str1, str2) {
this.$refs.editor1.changeModel(this.scriptMap[e], str1)
this.$refs.editor2.changeModel(this.scriptMap[e], str2)
},
// 当前为修改,初始化作业
initJobData() {
@@ -595,13 +618,13 @@
if (res.result) {
this.form = res.data
// 非http类型的节点是没有http节点属性的上面的赋值会将其覆盖。这里将其重新获取。
if (this.form.data.script_type !== 6) {
this.$set(this.form.data, 'request_type', '')
this.$set(this.form.data, 'request_url', '')
this.$set(this.form.data, 'headers', '')
this.$set(this.form.data, 'params', '')
}
this.setDefaultEditor(this.form.data.script_type, this.form.data.script_content)
// if (this.form.data.script_type !== 6) {
// this.$set(this.form.data, 'request_type', '')
// this.$set(this.form.data, 'request_url', '')
// this.$set(this.form.data, 'headers', '')
// this.$set(this.form.data, 'params', '')
// }
this.setDefaultEditor(1, JSON.stringify(this.form.inputs_component), JSON.stringify(this.form.inputs))
} else {
this.$cwMessage(res.message, 'error')
}
@@ -656,4 +679,33 @@
z-index: 999;
}
}
.demo-grid {
.wrapper {
overflow: hidden;
border: 1px solid #ddd;
border-radius: 2px;
padding: 20px 0;
}
.content {
background-color: #e1ecff;
height: 100%;
line-height: 60px;
border-radius: 2px;
font-size: 12px;
}
.bk-grid-row {
text-align: center;
}
.bk-grid-row + .bk-grid-row {
margin-top: 30px;
}
.flex {
.bk-grid-row + .bk-grid-row {
margin-top: 10px;
}
}
}
</style>

View File

@@ -155,9 +155,9 @@
overflowTooltip: true,
sortable: false
}, {
id: 'category_name',
label: '跑批系统',
overflowTooltip: true,
id: 'run_type',
label: '调度方式',
overflowTooltip: false,
sortable: false
}, {
id: 'state',
@@ -165,15 +165,10 @@
overflowTooltip: false,
sortable: false
}, {
id: 'total_job_count',
label: '作业总数',
id: 'create_time',
label: '创建时间',
overflowTooltip: false,
sortable: true
}, {
id: 'type',
label: '调度方式',
overflowTooltip: false,
sortable: false
}, {
id: 'total_not_execute_job_count',
label: '未执行作业数',
@@ -205,7 +200,7 @@
setting: {
size: 'small', // 表格大小
fields: fields, // 表格所有列
selectedFields: fields.slice(0, 1) // 表格当前显示列
selectedFields: fields.slice(0, 4) // 表格当前显示列
},
opreateFlag: false,
midSearchForm: {},

View File

@@ -13,14 +13,11 @@
export default {
data() {
return {
panels: [{
name: 'jobflowview',
label: '作业流视图'
},
{
name: 'jobview',
label: '作业视图'
}
panels: [
{
name: 'jobflowview',
label: '作业流视图'
}
]
}
},

View File

@@ -46,36 +46,6 @@
</div>
</div>
</div>
<div class="box">
<p class="title">前置命令检测</p>
<!-- <bk-input :type="'textarea'" :rows="8" ext-cls="custom-textarea" :disabled="true" v-model="form.pre_commands"></bk-input> -->
<editor :height="'200px'" ref="editor" :codes="form.pre_commands" :read-only="true" :language="'shell'">
</editor>
</div>
<div class="box">
<p class="title">先行作业/作业流</p>
<bk-table :data="form.upstream_nodes" ext-cls="customTable">
<bk-table-column prop="type" label="类型"></bk-table-column>
<bk-table-column prop="name" label="名称"></bk-table-column>
<bk-table-column prop="station" label="Agent"></bk-table-column>
<bk-table-column prop="state" label="状态"></bk-table-column>
<bk-table-column prop="eta" label="计划开始时间"></bk-table-column>
<bk-table-column prop="start_time" label="实际开始时间"></bk-table-column>
<bk-table-column prop="end_time" label="实际完成时间"></bk-table-column>
</bk-table>
</div>
<div class="box">
<p class="title">后续作业/作业流</p>
<bk-table :data="form.downstream_nodes" ext-cls="customTable">
<bk-table-column prop="type" label="类型"></bk-table-column>
<bk-table-column prop="name" label="名称"></bk-table-column>
<bk-table-column prop="station" label="Agent"></bk-table-column>
<bk-table-column prop="state" label="状态"></bk-table-column>
<bk-table-column prop="eta" label="计划开始时间"></bk-table-column>
<bk-table-column prop="start_time" label="实际开始时间"></bk-table-column>
<bk-table-column prop="end_time" label="实际完成时间"></bk-table-column>
</bk-table>
</div>
<div class="node-drawer">
<bk-sideslider :is-show.sync="nodeDrawer.show" :quick-close="true" :title="nodeDrawer.title"
:width="nodeDrawer.width" ext-cls="custom-sidelider">
@@ -94,12 +64,10 @@
import G6 from '@antv/g6'
import statusList from './job_flow_view_detail/statusList.vue'
import nodeInfo from './job_flow_view_detail/nodeInfo.vue'
import editor from '@/components/monacoEditor'
export default {
components: {
statusList,
nodeInfo,
editor
nodeInfo
},
data() {
return {
@@ -596,7 +564,7 @@
// this.nodeDrawer.show = false
this.renderCanvas(true, first)
const processState = res.data.pipeline_tree.process_state
if (processState === 'success') {
if (processState === 'success' || processState === 'fail') {
clearInterval(this.timer)
}
} else {