From b1a0d701cf898c8b7812e66a808a1c91f2bae6cc Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期二, 17 三月 2026 16:44:11 +0800
Subject: [PATCH] 2026.3.17
---
src/components/bg-task/FYBgTaskItem.vue | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 218 insertions(+), 0 deletions(-)
diff --git a/src/components/bg-task/FYBgTaskItem.vue b/src/components/bg-task/FYBgTaskItem.vue
new file mode 100644
index 0000000..be619e6
--- /dev/null
+++ b/src/components/bg-task/FYBgTaskItem.vue
@@ -0,0 +1,218 @@
+<template>
+ <el-card class="m-b-8" shadow="always" :body-style="{ padding: '8px' }">
+ <el-row>
+ <el-col :span="4">
+ <div class="status-btn">
+ <el-icon v-if="waiting" color="var(--el-color-info)" :size="50"><VideoPlay /></el-icon>
+ <el-icon v-else-if="running" color="var(--el-color-primary)" :size="50" class="is-loading"
+ ><Loading
+ /></el-icon>
+ <el-icon v-else-if="success" color="var(--el-color-success)" :size="50"
+ ><CircleCheck
+ /></el-icon>
+ <el-icon v-else-if="fail" color="var(--el-color-error)" :size="50"
+ ><CircleClose
+ /></el-icon>
+ <el-icon v-else color="var(--el-color-warning)" :size="50"><Warning /></el-icon>
+ <el-text type="info" size="small" style="position: absolute; bottom: 0">{{
+ nameToLabel(model.status)
+ }}</el-text>
+ </div>
+ </el-col>
+ <el-col :span="20" class="p-l-8">
+ <el-row justify="space-between">
+ <el-text class="m-l-4px w-300px" tag="b" size="large" truncated>{{ model.name }}</el-text>
+ <el-tag>{{ nameToLabel(model.type) }}</el-tag>
+ </el-row>
+ <el-row class="p-v-8" align="bottom">
+ <el-col :span="12">
+ <span class="timer">{{ time }}</span>
+ <el-text type="info" size="small" tag="div">杩愯鏃堕暱</el-text>
+ </el-col>
+ <el-col :span="12">
+ <el-text type="default" size="default" tag="div"
+ >寮�濮嬶細{{ $fm.formatYMDHMS(model.startTime) }}</el-text
+ >
+ <el-text type="default" size="default" tag="div"
+ >缁撴潫锛歿{ $fm.formatYMDHMS(model.endTime) }}</el-text
+ >
+ </el-col>
+ </el-row>
+ <el-row justify="end" align="bottom">
+ <!-- <span class="f-s color-i">ID锛歿{ model.id }}</span> -->
+ <el-row>
+ <FYReconfrimButton v-if="waiting" @confirm="startTask" v-model="startConfirm">
+ <el-button
+ plain
+ icon="VideoPlay"
+ type="primary"
+ size="small"
+ :loading="false"
+ @click="startConfirm = true"
+ >寮�濮嬩换鍔�</el-button
+ >
+ </FYReconfrimButton>
+ <FYReconfrimButton v-if="running" @confirm="stopTask" v-model="stopConfirm">
+ <el-button
+ icon="VideoPause"
+ plain
+ type="danger"
+ size="small"
+ :loading="false"
+ @click="stopConfirm = true"
+ >寮哄埗缁撴潫</el-button
+ >
+ </FYReconfrimButton>
+ <FYReconfrimButton v-if="!running" @confirm="removeTask" v-model="removeConfirm">
+ <el-button
+ icon="Delete"
+ plain
+ type="danger"
+ size="small"
+ :loading="false"
+ @click="removeConfirm = true"
+ >绉婚櫎浠诲姟</el-button
+ >
+ </FYReconfrimButton>
+ <template v-if="success">
+ <el-button
+ v-if="btnType"
+ plain
+ type="success"
+ size="small"
+ :loading="false"
+ @click="download"
+ >涓嬭浇鏂囦欢<el-icon class="m-l-4"><Right /></el-icon
+ ></el-button>
+ <el-button
+ v-else
+ plain
+ type="success"
+ size="small"
+ :loading="false"
+ @click="gotoResult"
+ >鏌ョ湅缁撴灉<el-icon class="m-l-4"><Right /></el-icon
+ ></el-button>
+ </template>
+ </el-row>
+ </el-row>
+ </el-col>
+ </el-row>
+ </el-card>
+</template>
+<script>
+import { nTlBgTask, BG_TASK_STATUS, BG_TASK_TYPE } from '@/enum/bgTask';
+import { useTimer } from '@/composables/timer';
+import downloadApi from '@/api/fysp/downloadApi';
+// import { useTimer } from '@/composables/timer2';
+
+export default {
+ setup() {
+ const { time, startTimer, pauseTimer, stopTimer, count } = useTimer();
+ return { time, startTimer, pauseTimer, stopTimer, count };
+ },
+ props: {
+ model: Object,
+ index: Number
+ },
+ emits: ['start', 'shutDown', 'remove', 'gotoResult'],
+ data() {
+ return {
+ startConfirm: false,
+ stopConfirm: false,
+ removeConfirm: false
+ };
+ },
+ watch: {
+ 'model.status': {
+ handler(nV) {
+ switch (nV) {
+ case BG_TASK_STATUS.WAITING.name:
+ this.stopTimer();
+ break;
+ case BG_TASK_STATUS.RUNNING.name:
+ this.startTimer();
+ break;
+ case BG_TASK_STATUS.SUCCESS.name:
+ case BG_TASK_STATUS.FAIL.name:
+ case BG_TASK_STATUS.SHUTDOWN.name:
+ this.pauseTimer();
+ break;
+ default:
+ this.stopTimer();
+ break;
+ }
+ this.count = this.model.runTime;
+ },
+ immediate: true
+ }
+ },
+ computed: {
+ btnType() {
+ return this.model.type == BG_TASK_TYPE.DOCUMENT.name;
+ },
+ waiting() {
+ return this.model.status == BG_TASK_STATUS.WAITING.name;
+ },
+ running() {
+ return this.model.status == BG_TASK_STATUS.RUNNING.name;
+ },
+ success() {
+ return this.model.status == BG_TASK_STATUS.SUCCESS.name;
+ },
+ fail() {
+ return this.model.status == BG_TASK_STATUS.FAIL.name;
+ },
+ shutdown() {
+ return this.model.status == BG_TASK_STATUS.SHUTDOWN.name;
+ }
+ },
+ methods: {
+ nameToLabel(name) {
+ const t = nTlBgTask(name);
+ return t.label;
+ },
+ startTask() {
+ this.$emit('start', this.index, (res) => {
+ if (res) {
+ this.startTimer();
+ }
+ });
+ },
+ stopTask() {
+ this.$emit('shutDown', this.index, (res) => {
+ if (res) {
+ this.stopTimer();
+ }
+ });
+ },
+ removeTask() {
+ this.$emit('remove', this.index, (res) => {
+ if (res) {
+ // this.stopTimer();
+ }
+ });
+ },
+ gotoResult() {
+ this.$emit('gotoResult', this.index);
+ },
+ download() {
+ downloadApi.downloadFile(this.model.extra);
+ }
+ }
+};
+</script>
+<style scoped>
+.status-btn {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border: var(--el-border);
+ border-radius: var(--el-border-radius-base);
+}
+.timer {
+ font-size: 30px;
+}
+</style>
--
Gitblit v1.9.3