分布式调度框架。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

248 lines
6.7 KiB

<template>
<div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="$t('树形图')">
<template slot="conditions"></template>
<template slot="content">
<div class="tree-view-index-model">
<div class="tree-limit-select">
<x-select v-model="limit" style="width: 70px;" @on-change="_onChangeSelect">
<x-option
v-for="city in [{value:25},{value:50},{value:75},{value:100}]"
:key="city.value"
:value="city.value"
:label="city.value">
</x-option>
</x-select>
<x-button
@click="_rtTasksDag"
v-if="$route.query.subProcessIds"
type="primary"
size="default"
icon="fa fa-reply">
返回上一节点
</x-button>
</div>
<div class="tasks-color">
<div class="toolbar-color-sp">
<a href="javascript:">
<span>节点类型</span>
</a>
<a href="javascript:" v-for="(k,v) in tasksType">
<i class="fa fa-circle" :style="{color:k.color}"></i>
<span>{{v}}</span>
</a>
</div>
<div class="state-tasks-color-sp">
<a href="javascript:">
<span>任务状态</span>
</a>
<a href="javascript:" v-for="(item) in tasksState">
<i class="fa fa-square" :style="{color:item.color}"></i>
<span>{{item.desc}}</span>
</a>
</div>
</div>
<div class="tree-model" v-show="!isNodata">
<div class="d3-tree">
<svg class='tree' width="100%"></svg>
</div>
</div>
<m-no-data v-if="isNodata"></m-no-data>
</div>
<m-spin :is-spin="isLoading"></m-spin>
</template>
</m-list-construction>
</div>
</template>
<script>
import _ from 'lodash'
import { mapActions } from 'vuex'
import Tree from './_source/tree'
import { uuid } from '@/module/util'
import mSpin from '@/module/components/spin/spin'
import mNoData from '@/module/components/noData/noData'
import { tasksType, tasksState } from '@/conf/home/pages/dag/_source/config'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction'
export default {
name: 'tree-view-index-index',
data () {
return {
// limit
limit: 25,
// loading
isLoading: true,
// node type
tasksType: tasksType,
// node state
tasksState: tasksState,
// tree data
treeData: {},
// is data
isNodata: false
}
},
props: {},
methods: {
...mapActions('dag', ['getViewTree']),
/**
* get tree data
*/
_getViewTree () {
this.isLoading = true
Tree.reset()
this.getViewTree({
processId: this.$route.params.id,
limit: this.limit
}).then(res => {
let data = _.cloneDeep(res)
this.treeData = data
if (!this.treeData.children) {
this.isLoading = false
this.isNodata = true
return
}
let recursiveChildren = (children) => {
if (children.length) {
_.map(children, v => {
v.uuid = `${uuid('uuid_')}${uuid() + uuid()}`
if (v.children.length) {
recursiveChildren(v.children)
}
})
}
}
recursiveChildren(data.children)
// init tree
Tree.init({
data: _.cloneDeep(data),
limit: this.limit,
selfTree: this
}).then(() => {
setTimeout(() => {
// this.isLoading = false
}, 100)
})
}).catch(e => {
this.isLoading = false
if (!e.data) {
this.isNodata = true
}
})
},
/**
* Return to the previous child node
*/
_rtTasksDag () {
let getIds = this.$route.query.subProcessIds
let idsArr = getIds.split(',')
let ids = idsArr.slice(0, idsArr.length - 1)
let id = idsArr[idsArr.length - 1]
let query = {}
if (id !== idsArr[0]) {
query = { subProcessIds: ids.join(',') }
}
this.$router.push({ path: `/projects/definition/tree/${id}`, query: query })
},
/**
* Subprocess processing
* @param subProcessId 子流程Id
*/
_subProcessHandle (subProcessId) {
let subProcessIds = []
let getIds = this.$route.query.subProcessIds
if (getIds) {
let newId = getIds.split(',')
newId.push(this.$route.params.id)
subProcessIds = newId
} else {
subProcessIds.push(this.$route.params.id)
}
this.$router.push({ path: `/projects/definition/tree/${subProcessId}`, query: { subProcessIds: subProcessIds.join(',') } })
},
_onChangeSelect (o) {
this.limit = o.value
this._getViewTree()
}
},
watch: {
'$route.params.id' () {
this._getViewTree()
}
},
created () {
this._getViewTree()
},
mounted () {
},
components: { mSpin, mSecondaryMenu, mListConstruction, mNoData }
}
</script>
<style lang="scss" rel="stylesheet/scss">
.tree-view-index-model {
background: url('img/dag_bg.png');
position: relative;
.tree-limit-select {
position: absolute;
right: 20px;
top: 22px;
z-index: 1;
}
.tasks-color {
min-height: 76px;
background: #fff;
padding-left: 20px;
position: relative;
padding-bottom: 10px;
.toolbar-color-sp {
padding: 12px 0;
}
}
.tree-model {
width: calc(100%);
height: calc(100vh - 224px);
overflow-x: scroll;
}
.d3-tree {
padding-left: 30px;
.node {
text {
font: 11px sans-serif;
pointer-events: none;
}
}
rect {
cursor: pointer;
&.state {
stroke: #666;
shape-rendering: crispEdges;
}
}
path {
&.link{
fill: none;
stroke: #666;
stroke-width: 2px;
}
}
circle {
stroke: #666;
fill: #0097e0;
stroke-width: 1.5px;
cursor: pointer;
}
}
}
</style>