新增 异常任务界面

This commit is contained in:
小肥羊 2025-11-06 18:14:30 +08:00
parent a31352b8f5
commit 037ec9dc3c
6 changed files with 116 additions and 15 deletions

View File

@ -65,3 +65,11 @@ export const RunningTaskList = (data: any) => {
data
});
};
/** 展示数据 */
export const ErrorTaskList = (data: any) => {
return http.request<any>("post", "/api/VideoTask/ErrorTaskList", {
data
});
};

View File

@ -38,6 +38,15 @@ export default {
title: "进行中任务",
showLink: true
}
},
{
path: "/welcome/errorTask",
name: "runningTask",
component: () => import("@/views/welcome/errorTask.vue"),
meta: {
title: "错误任务",
showLink: true
}
}
]
} satisfies RouteConfigsTable;

View File

@ -0,0 +1,41 @@
<script setup lang="ts">
import ahTable from "@/components/hTable/index.vue";
import {
ComboModel,
ConditionalType,
intTableData,
SearchConditions,
TableColumnSearch,
TableConfig,
} from "@/components/hTable/hTable";
import { onMounted, ref } from "vue";
import { getenum } from "@/api/enum";
import { ElMessage } from "element-plus";
import { ReStart, RowRload, RunningTaskList, ErrorTaskList } from "@/api/videoTask";
import { Refresh } from "@element-plus/icons-vue";
import { message } from "@/utils/message";
import videoTask from "./index.vue";
defineOptions({
name: `errorTask`,
});
async function searchCallback(s: SearchConditions, tv: TableConfig): Promise<boolean> {
//
let res = await ErrorTaskList(s);
tv.data = res.data.map((s, i) => {
return { ...s, customId: i };
});
tv.pageData = res;
return true;
//trueAPI
}
onMounted(async () => {
//
});
</script>
<template>
<div>
<videoTask :searchCallback="searchCallback"></videoTask>
</div>
</template>

View File

@ -211,12 +211,30 @@ const stepData = ref<StepData[]>([
<div class="expanded-content expandSlot">
<h3>任务详情</h3>
<div class="InfoEx" v-if="props.row.TaskInfo != null">
<div>
<div
class="bg-red-50"
v-if="props.row?.errorMessage != null && props.row?.errorMessage.length > 0"
>
<span class="text-red-700"
>错误信息
<span style="padding-left: 2rem"
>{{ props.row.TaskInfo.lastEnum }}
{{ props.row.TaskInfo.progress }}</span
></span
>
<div class="content">
<div v-for="value in props.row?.errorMessage.split(' at ')">
{{ value }}
</div>
</div>
</div>
<div v-else>
<span>进度</span>
<div class="content">
{{ props.row.TaskInfo.lastEnum }} {{ props.row.TaskInfo.progress }}
</div>
</div>
<div>
<span>操作</span>
<div class="content">
@ -247,15 +265,6 @@ const stepData = ref<StepData[]>([
/>
</el-steps>
</div>
<div
v-if="
props.row.TaskInfo?.errorMessage != null &&
props.row.TaskInfo?.errorMessage.length > 0
"
>
<span>错误信息</span>
<div class="content">{{ props.row.TaskInfo?.errorMessage }}</div>
</div>
</div>
</div>
</template>
@ -312,8 +321,11 @@ const stepData = ref<StepData[]>([
margin-right: 10px;
}
.InfoEx .content {
line-height: 16px;
padding: 5px;
}
.InfoEx .content div {
}
/* 关键:让某个网格项占满一行(跨所有列) */
.grid_item_full_width {
grid-column: 1 / -1; /* 从第1列跨到最后一列 */

View File

@ -363,12 +363,13 @@ namespace VideoAnalysisCore.Common
var oldTaskCount = Redis.LLen(RedisExpandKey.IDTask);
//重试任务并发过多可能会导致程序崩溃
// 未能重新分析的中断任务 则单独开一个网页来处理
if (oldTaskCount > 0 && oldTaskCount < 10)
if (oldTaskCount > 0 )
{
var oldTaskArr = Redis.LRange(RedisExpandKey.IDTask, 0, oldTaskCount);
//不自动清理未完成任务 等待执行完毕/失败后自动清理
//Redis.LTrim(RedisExpandKey.IDTask, 1, 0);//删除 redis 列表
foreach (var oldTask in oldTaskArr)
//最多执行5个上次中断/或者未完成的任务
foreach (var oldTask in oldTaskArr.Take(5))
{
_ = Task.Run(async () =>
{

View File

@ -251,6 +251,7 @@ namespace VideoAnalysisCore.Controllers
ComeFrom = s.ComeFrom,
MediaUrl = s.MediaUrl,
CreateTime = s.CreateTime,
ErrorMessage = s.ErrorMessage,
});
RefAsync<int> total = 0;
var data = await sqlquery.ToPageListAsync(model.PageIndex + 1, model.PageSize, total);
@ -357,7 +358,7 @@ namespace VideoAnalysisCore.Controllers
/// <summary>
/// 预览任务结果
/// 执行中的任务
/// </summary>
/// <param name="model">查询模型</param>
/// <returns></returns>
@ -383,5 +384,34 @@ namespace VideoAnalysisCore.Controllers
return new PageResult<VideoTask>() { Data = data, Total = total };
}
/// <summary>
/// 错误的任务
/// </summary>
/// <param name="model">查询模型</param>
/// <returns></returns>
[HttpPost]
public async Task<object> ErrorTaskList([FromBody] QueryRequestBase model)
{
var sqlquery = base.BaseQuery(model)
.Where(s => s.ErrorMessage!=null && s.ErrorMessage !="")
.Select(s => new VideoTask
{
Id = s.Id,
TagId = s.TagId,
VideoType = s.VideoType,
LastEnum = s.LastEnum,
Subject = s.Subject,
ComeFrom = s.ComeFrom,
MediaUrl = s.MediaUrl,
ErrorMessage = s.ErrorMessage,
CreateTime = s.CreateTime,
});
RefAsync<int> total = 0;
var data = await sqlquery.ToPageListAsync(model.PageIndex + 1, model.PageSize, total);
return new PageResult<VideoTask>() { Data = data, Total = total };
}
}
}