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