From e732f79fb39ca207464705308c9ee2deb3a79307 Mon Sep 17 00:00:00 2001 From: hcong <1050828145@qq.com> Date: 星期二, 03 十二月 2024 11:21:41 +0800 Subject: [PATCH] 后台任务状态实时刷新同步后台更改 1. startTime和endTime对象结构修改 2. runTime根据后端逻辑生成runTime --- src/components/bg-task/FYBgTaskCard.vue | 273 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 235 insertions(+), 38 deletions(-) diff --git a/src/components/bg-task/FYBgTaskCard.vue b/src/components/bg-task/FYBgTaskCard.vue index 877c4b7..2113c19 100644 --- a/src/components/bg-task/FYBgTaskCard.vue +++ b/src/components/bg-task/FYBgTaskCard.vue @@ -1,52 +1,249 @@ <template> - <el-card class="bg-task-card" shadow="hover" :body-style="{ padding: '8px' }"> - <!-- <template #header> --> - <el-row> - <el-space> - <el-tag>{{ nameToLabel(model.type) }}</el-tag> - <el-text tag="b" size="large" truncated>{{ model.name }}鍟婂疄鎵撳疄澶ц嫃鎵撳晩瀹炴墦瀹炲ぇ鑻忔墦闃垮ぇ鎾掑ぇ鎾�</el-text> - </el-space> - </el-row> - - <!-- </template> --> - <el-text type="info" size="small">鐘舵�侊細{{ nameToLabel(model.status) }}</el-text> - <el-text type="info" size="small">寮�濮嬶細{{ model.startTime }}</el-text> - <el-text type="info" size="small">缁撴潫锛歿{ model.endTime }}</el-text> - <!-- <template #footer> --> - <el-button type="primary" size="small" :loading="false" @click="$emit('start', model)" - >寮�濮嬩换鍔�</el-button - > - <el-button type="danger" size="small" :loading="false" @click="$emit('shutDown', model)" - >寮哄埗缁撴潫</el-button - > - <el-button type="danger" size="small" :loading="false" @click="$emit('remove', model)" - >绉婚櫎浠诲姟</el-button - > - <el-button type="danger" size="small" :loading="false" @click="$emit('gotoResult', model)" - >鏌ョ湅缁撴灉</el-button - > - <el-text type="info" size="small">ID锛歿{ model.id }}</el-text> - <!-- </template> --> + <el-card shadow="never" :body-style="{ padding: 0 }"> + <template #header> + <el-row justify="space-between"> + <div> + <div><el-text tag="b" size="large">鍚庡彴浠诲姟</el-text></div> + <el-text size="small" type="info">鏄剧ず褰撳墠姝e湪杩涜鐨勫悗鍙拌�楁椂浠诲姟鐘舵��</el-text> + </div> + <el-button + icon="Refresh" + type="primary" + size="default" + :loading="loading" + @click="fetchTask" + >鍒锋柊浠诲姟</el-button + > + </el-row> + <!-- <el-row> + <el-button type="default" size="default" @click="newTestTask">鏂板娴嬭瘯浠诲姟</el-button> + <el-button type="default" size="default" @click="startNewTestTask" + >鏂板缓骞惰繍琛屼竴涓祴璇曚换鍔�</el-button + > + <el-button type="default" size="default" @click="shutDownTask" + >寮哄埗鍏抽棴鎵�鏈夋祴璇曚换鍔�</el-button + > + </el-row> --> + </template> + <el-scrollbar height="70vh" class="scrollbar"> + <template v-for="(v, i) in taskList" :key="i"> + <FYBgTaskItem + :model="v" + :index="i" + @start="startTask" + @shutDown="shutDownTask" + @remove="removeTask" + @gotoResult="gotoResult" + ></FYBgTaskItem> + </template> + </el-scrollbar> </el-card> </template> <script> -import { nTlBgTask } from '@/enum/bgTask'; +/** + * 鑷姩璇勪及浠诲姟绠$悊 + */ +import { useFetchData } from '@/composables/fetchData'; +import bgtaskApi from '@/api/fysp/bgtaskApi'; +import { enumBgTask, BG_TASK_TYPE, BG_TASK_STATUS } from '@/enum/bgTask'; +import { SOCKET_MESSAGE_TYPE } from '@/enum/socketMessage'; +import MessageManager from '@/socket/MessageManager.js'; export default { - props: { - model: Object + setup() { + const { loading, fetchData } = useFetchData(); + return { loading, fetchData }; }, - emits: ['start', 'shutDown', 'remove', 'gotoResult'], - methods: { - nameToLabel(name) { - const t = nTlBgTask(name); - return t.label; + props: { + modelValue: Number + }, + emits: ['update:modelValue'], + data() { + return { + taskList: [], + taskIndex: 0 + }; + }, + watch: { + taskList: { + handler(nV) { + let count = 0; + for (const e of nV) { + if (e.status == BG_TASK_STATUS.RUNNING.name) { + count++; + } + } + this.$emit('update:modelValue', count); + }, + deep: true } + }, + methods: { + registerBgTaskMessage() { + MessageManager.register(SOCKET_MESSAGE_TYPE.BACKGROUND_TASK.name, (data) => { + this.refreshTaskById(data) + }) + }, + computeRunTime(data) { + const taskStatus = data.status + const startTime = new Date(data.startTime).getTime() + const endTime = new Date(data.endTime).getTime() + const now = (new Date()).getTime(); + switch (taskStatus) { + case BG_TASK_STATUS.WAITING.name: + return 0; + case BG_TASK_STATUS.RUNNING.name: + return (now - startTime) / 1000; // 杞崲涓虹 + case BG_TASK_STATUS.SUCCESS.name: + case BG_TASK_STATUS.FAIL.name: + case BG_TASK_STATUS.SHUTDOWN.name: + return (endTime - startTime) / 1000; // 杞崲涓虹 + } + }, + /** + * 鍒锋柊涓�涓换鍔¢�氳繃id锛屽鏋滄槸鏂扮殑浠诲姟鍒欐坊鍔犲埌浠诲姟鍒楄〃taskList涓� + * @param data + */ + refreshTaskById(data) { + if (!data || data == {}) { + return; + } + let isNewTask = true + for (let index = 0; index < this.taskList.length; index++) { + const task = this.taskList[index]; + if (task.id == data.id) { + this.taskList[index] = data + // 鏃堕棿杞崲 + const hasStartTime = 'startTime' in data && data.startTime != {} + const hasEndTime = 'endTime' in data && data.endTime != {} + if (hasEndTime) { + this.taskList[index].endTime = this.formatDate(data.endTime) + } + if (hasStartTime) { + this.taskList[index].startTime = this.formatDate(data.startTime) + } + if (hasStartTime && hasEndTime) { + this.taskList[index].runTime = this.computeRunTime(this.taskList[index]) + } + isNewTask = false + break + } + } + if (isNewTask) { + this.taskList.push(data) + } + }, + /** + * 鎷疯礉灞炴�� + * @param from + * @param to + */ + copyProperties(from, to) { + for (const prop in to) { + if (prop in from) { + to[prop] = from[prop] + } + } + }, + formatDate(date) { + const dateObj = date.date + const timeObj = date.time + let year = dateObj.year; + let month = dateObj.month < 10 ? '0' + dateObj.month : dateObj.month; + let day = dateObj.day < 10 ? '0' + dateObj.day : dateObj.day; + let hour = timeObj.hour < 10 ? '0' + timeObj.hour : timeObj.hour; + let minute = timeObj.minute < 10 ? '0' + timeObj.minute : timeObj.minute; + let second = timeObj.second < 10 ? '0' + timeObj.second : timeObj.second; + + return `${year}-${month}-${day} ${hour}:${minute}:${second}`; + }, + addTask() {}, + newTestTask() { + this.fetchData((page, pageSize) => { + return bgtaskApi.newTestTask(`Test-Task-${++this.taskIndex}`).then((res) => { + this.taskList.push(res.data); + }); + }); + }, + startNewTestTask() { + this.fetchData((page, pageSize) => { + return bgtaskApi.startNewTestTask(`Test-Task-${++this.taskIndex}`).then((res) => { + this.taskList.push(res.data); + }); + }); + }, + + _getParam(taskStatus) { + return { + type: taskStatus.type, + id: taskStatus.id + }; + }, + fetchTask() { + this.fetchData((page, pageSize) => { + return bgtaskApi + .fetchTaskStatus({ + // type: BG_TASK_TYPE.AUTO_SCORE.name + }) + .then((res) => { + this.taskList = res.data; + }); + }); + }, + startTask(index, callback) { + this.fetchData((page, pageSize) => { + const param = this._getParam(this.taskList[index]); + return bgtaskApi.startTask(param).then((res) => { + this.taskList[index] = res.data; + callback(true); + }); + }); + }, + shutDownTask(index, callback) { + this.fetchData((page, pageSize) => { + const param = this._getParam(this.taskList[index]); + return bgtaskApi.shutDownTask(param).then((res) => { + if (index && res.data && res.data.length == 1) { + this.taskList[index] = res.data[0]; + } else { + res.data.forEach((e) => { + let v = this.taskList.find((value) => { + return value.id == e.id; + }); + const i = this.taskList.indexOf(v); + this.taskList[i] = e; + }); + } + callback(true); + }); + }); + }, + removeTask(index, callback) { + this.fetchData((page, pageSize) => { + const param = this._getParam(this.taskList[index]); + return bgtaskApi.removeTask(param).then((res) => { + if (res.data) { + this.taskList.splice(index, 1); + callback(true); + } + }); + }); + }, + gotoResult(index) {} + }, + created() { + this.registerBgTaskMessage() + }, + mounted() { + this.fetchTask(); + // setInterval(() => { + // this.fetchTask(); + // }, 10000); } }; </script> <style scoped> -.bg-task-card { - margin-bottom: 8px; +.scrollbar { + padding: 8px; } </style> -- Gitblit v1.9.3