This commit is contained in:
ann 2024-07-31 16:13:18 +08:00
parent 7882c60f4e
commit 2576a6ffc2
7 changed files with 124 additions and 38 deletions

View File

@ -559,6 +559,8 @@
"stop": "Stop",
"modelName": "Model Name",
"updateTime": "Update Time",
"inferCard": "Infer Card"
"inferCard": "Infer Card",
"operation": "Single Operation",
"allOperation": "All Operation"
}
}

View File

@ -559,6 +559,8 @@
"stop": "停止",
"modelName": "模型名称",
"updateTime": "更新时间",
"inferCard": "算力卡"
"inferCard": "算力卡",
"operation": "单独操作",
"allOperation": "全部操作"
}
}

View File

@ -16,6 +16,14 @@ export const stopDeployInstance = (params) => {
return request({ url: '/pcm/v1/inference/stopDeployInstance', method: 'post', params })
}
export const startAllInstance = (data) => {
return request({ url: '/pcm/v1/inference/startAll', method: 'post', data: data })
}
export const stopAllInstance = (data) => {
return request({ url: '/pcm/v1/inference/stopAll', method: 'post', data: data })
}
export const getDeployInstanceStat = () => {
return request({ url: '/pcm/v1/inference/deployInstanceStat', method: 'get' })
}

View File

@ -85,7 +85,7 @@
v-bind="$attrs"
:max-height="height"
:border="border"
:highlight-current-row="listColumns.length>0 && listColumns[0].type !== 'selection'"
:highlight-current-row="highlightCurrentRow !=='undefined' ? highlightCurrentRow : (listColumns.length>0 && listColumns[0].type !== 'selection')"
tooltip-effect="dark"
style="width: 100%"
:row-key="rowKey"
@ -168,6 +168,9 @@ export default {
type: Array,
default: () => []
},
highlightCurrentRow: {
type: Boolean
},
pagination: {
type: Boolean,
default: false

View File

@ -68,10 +68,11 @@
ref="deploymentList"
:key="$i18n.locale"
class="multipleTable"
:span-method="objectSpanMethod"
:columns="columns"
:filter-map="filterMap"
:get-list-action="getAiTaskList"
:default-sort="{prop: 'existTime', order: 'ascending'}"
:table-list-data="tableData"
:highlight-current-row="false"
:pagination="true"
page-key="pageNum"
limit-key="pageSize"
@ -90,7 +91,7 @@
<script>
import List from '@/components/list'
import { getAiTaskList, startDeployInstance, stopDeployInstance, getDeployInstanceStat, getTaskStat, getTrainingTaskStat } from '@/api/task/task'
import { getAiTaskList, startDeployInstance, stopDeployInstance, getDeployInstanceStat, getTaskStat, getTrainingTaskStat, startAllInstance, stopAllInstance } from '@/api/task/task'
import { mapGetters } from 'vuex'
export default {
components: { List },
@ -111,7 +112,8 @@ export default {
running: 0,
total: 0
},
freshList: null
freshList: null,
tableData: []
}
},
computed: {
@ -145,6 +147,7 @@ export default {
watch: {
},
mounted() {
this.getDeployInstanceList()
getDeployInstanceStat().then(e => {
this.deployInstance = e.data
})
@ -154,27 +157,68 @@ export default {
getTrainingTaskStat().then(e => {
this.trainingTask = e.data
})
this.freshList = setInterval(() => this.freshAllList(), 5000)
// this.freshList = setInterval(() => this.freshAllList(), 5000)
},
destroyed() {
clearInterval(this.freshList)
},
methods: {
getDeployInstanceList() {
getAiTaskList({ pageNum: 1, pageSize: 10 }).then(e => {
this.tableData = e.data.list
})
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2 || columnIndex === 9) {
// const currentValue = row[column.modelType]
// const preRow=this.tableData[rowIndex-1]
// const preValue = preRow ?preRow[column.modelType]: null;
// if(currentValue === preValue){
// return { rowspan:0,colspan:0};
// } else {
// let rowspan =1;
// for (let i=rowIndex + 1;i< this.tableData.length; i++){
// const nextRow = this.tableData[i]
// const nextValue = nextRow[column.modelType];
// if(nextValue === currentValue){
// rowspan++
// } else {
// break
// }
// }
// return{rowspan,colspan:1}
// }
// if (columnIndex !== 0 && columnIndex !== 1) {
// return { rowspan: 1, colspan: 1 };
// }
if (
rowIndex === 0 ||
row.deployTaskId !== this.tableData[rowIndex - 1].deployTaskId
) {
const rowCount = this.tableData.filter(
(i) => i.deployTaskId === row.deployTaskId
).length
return { rowspan: rowCount, colspan: 1 }
}
return { rowspan: 0, colspan: 0 }
}
},
setColumn() {
return [
{ prop: 'modelName', label: this.$t('page.modelName'), sortable: true, formatter: (row) => { return <a onClick={() => this.viewDetail(row)}>{row.modelName}</a> } },
{ prop: 'modelType', label: this.$t('page.modelType') },
{
prop: 'instanceName',
label: this.$t('page.instanceName')
},
{ prop: 'modelName', label: this.$t('page.modelName'), formatter: (row) => { return <a onClick={() => this.viewDetail(row)}>{row.modelName}</a> } },
{ prop: 'modelType', label: this.$t('page.modelType') },
{
prop: 'inferCard',
label: this.$t('page.inferCard')
},
{
prop: 'status',
label: this.$t('page.jobStatus')
prop: 'clusterName',
label: this.$t('page.clusterName')
},
// { prop: 'strategy', label: this.$t('page.policy'), formatter: row => {
// const res = this.dict.schedule_Strategy.filter(e => { return row.strategy.toString() === e.itemValue })[0][this.$i18n.locale === 'en' ? 'itemText' : 'description']
@ -183,34 +227,40 @@ export default {
// { prop: 'synergyStatus', label: this.$t('page.synergyStatus'), sortable: true, formatter: (row) => {
// return <div>{!row.synergyStatus ? this.$t('page.notSynergistic') : this.$t('page.synergistic')}</div>
// } },
{ prop: 'adapterName', label: this.$t('page.adapter'), sortable: true },
{ prop: 'adapterName', label: this.$t('page.adapter') },
// { prop: 'cluster', label: this.$t('page.cluster'), sortable: true },
{ prop: 'createTime', label: this.$t('page.createTime'), sortable: true, formatter: (row) => {
return <div>{row.createTime && new Date(row.createTime).toLocaleString() || '-'}</div>
} },
{ prop: 'updateTime', label: this.$t('page.updateTime'), sortable: true, formatter: row => {
// { prop: 'createTime', label: this.$t('page.createTime'), formatter: (row) => {
// return <div>{row.createTime && new Date(row.createTime).toLocaleString() || '-'}</div>
// } },
{ prop: 'updateTime', label: this.$t('page.updateTime'), formatter: row => {
return <div>{row.updateTime && new Date(row.updateTime).toLocaleString() || '-'}</div>
} },
{ prop: 'more', label: this.$t('page.more'), width: 200, formatter: (row) => {
const txt = this.$t('page.viewDetail')
{
prop: 'status',
label: this.$t('page.jobStatus')
},
{ prop: 'more', label: this.$t('page.operation'), formatter: (row) => {
const start = this.$t('page.start')
const stop = this.$t('page.stop')
return <div>
<el-dropdown>
<el-button className='el-dropdown-link' size='mini' icon='el-icon-more' circle>
</el-button>
<el-dropdown-menu slot='dropdown'>
<span onClick={() => this.viewDetail(row)}> <el-dropdown-item> {txt} </el-dropdown-item> </span>
{row.status === 'Stopped' ? <span onClick={() => this.handleDeploy(row, 1)}> <el-dropdown-item> {start} </el-dropdown-item> </span> : null}
{row.status === 'Running' ? <span onClick={() => this.handleDeploy(row, 2)}> <el-dropdown-item> {stop} </el-dropdown-item> </span> : null}
</el-dropdown-menu>
</el-dropdown>
</div>
} },
{
prop: 'more', label: this.$t('page.allOperation'), formatter: (row) => {
const start = this.$t('page.start')
const stop = this.$t('page.stop')
return <div>
<span style='cursor: pointer;' onClick={() => this.handleDeploy(row, 3)}>{start} </span>/
<span style='cursor: pointer;' onClick={() => this.handleDeploy(row, 4)}>{stop}</span>
</div>
} }
]
},
freshAllList() {
this.$refs.deploymentList.getList()
// this.$refs.deploymentList.getList()
this.getDeployInstanceList()
getDeployInstanceStat().then(e => {
this.deployInstance = e.data
})
@ -237,14 +287,20 @@ export default {
id: row.id,
instanceId: row.instanceId
}
if (type === 1) {
const allId = { deployTaskld: row.deployTaskId }
if (type === 1 || type === 3) {
this.$confirm('<p>确定要启动么?</p>', '温馨提示', {
dangerouslyUseHTMLString: true,
confirmButtonText: '确认',
center: true,
cancelButtonText: '取消'
}).then(() => {
startDeployInstance(data).then(e => {
type === 1 ? startDeployInstance(data).then(e => {
this.$message.success(this.$t('message.success'))
this.freshAllList()
})
: startAllInstance(allId).then(e => {
this.$message.success(this.$t('message.success'))
this.freshAllList()
})
@ -256,7 +312,11 @@ export default {
center: true,
cancelButtonText: '取消'
}).then(() => {
stopDeployInstance(data).then(e => {
type === 2 ? stopDeployInstance(data).then(e => {
this.$message.success(this.$t('message.success'))
this.freshAllList()
})
: stopAllInstance(allId).then(e => {
this.$message.success(this.$t('message.success'))
this.freshAllList()
})

View File

@ -29,7 +29,7 @@ import { chatApi } from '@/api/task/task'
export default {
name: 'BootChart',
props: {
url: {
id: {
type: String,
default: ''
}
@ -64,7 +64,7 @@ export default {
this.text = ''
this.inputDisabled = true
const chatData = {
'apiUrl': this.url,
'id': this.id,
'reqData': {
'prompt': dt.text
}

View File

@ -67,7 +67,18 @@
/>
</el-form-item>
<bootChart v-if="formData.taskTypeDict === '12'" :url="inferUrl" />
<el-form-item v-if="formData.taskTypeDict === '12'" :label="$t('page.selectCluster')">
<el-select v-if="formData.subTaskInfos" v-model="inferId" style="width:30%">
<el-option
v-for="item in formData.subTaskInfos"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<br>
<bootChart v-if="formData.taskTypeDict === '12'" :id="inferId" />
</el-form>
</el-tab-pane>
</el-tabs>
@ -110,7 +121,7 @@ export default {
activeName: '',
log: '',
taskResult: [],
inferUrl: ''
inferId: ''
}
},
computed: {
@ -155,7 +166,7 @@ export default {
})
}
if (this.formData.taskTypeDict === '12') {
this.inferUrl = this.formData.subTaskInfos[0].inferUrl
this.inferId = this.formData.subTaskInfos[0].id
}
}
})