LaiTool/src/main/Service/taskManage.ts

309 lines
10 KiB
TypeScript
Raw Normal View History

2024-08-03 12:46:12 +08:00
import { BookBackTaskListService } from '../../define/db/service/Book/bookBackTaskListService'
import { BookBackTaskStatus, BookBackTaskType, TaskExecuteType } from '../../define/enum/bookEnum'
import { SoftwareService } from '../../define/db/service/SoftWare/softwareService'
import { errorMessage, successMessage } from '../Public/generalTools'
import { BasicReverse } from './Book/basicReverse'
import { ReverseBook } from './Book/ReverseBook'
import { GeneralResponse } from '../../model/generalResponse'
import { DEFINE_STRING } from '../../define/define_string'
import { MJOpt } from './MJ/mj'
import { AsyncQueue } from '../../main/quene'
export class TaskManager {
isExecuting: boolean = false;
currentTaskList: TaskModal.Task[] = [];
globalConfig: any;
reverseBook: ReverseBook = new ReverseBook();
basicReverse: BasicReverse = new BasicReverse();
softwareService!: SoftwareService;
bookBackTaskListService!: BookBackTaskListService;
eventListeners: Record<string | number, Function[]> = {};
spaceTime: number = 5000;
count = 0;
isListening = false;
intervalId: any; // 用于存储 setInterval 的 ID
mjOpt: MJOpt
constructor() {
this.isExecuting = false;
this.currentTaskList = [];
this.globalConfig = global.config;
this.basicReverse = new BasicReverse();
this.reverseBook = new ReverseBook();
this.mjOpt = new MJOpt();
}
2024-08-12 16:26:08 +08:00
async InitService(getMJsetting = false) {
2024-08-03 12:46:12 +08:00
if (!this.softwareService) {
this.softwareService = await SoftwareService.getInstance();
}
if (!this.bookBackTaskListService) {
this.bookBackTaskListService = await BookBackTaskListService.getInstance();
}
2024-08-12 16:26:08 +08:00
if (getMJsetting) {
await this.mjOpt.InitService();
}
2024-08-03 12:46:12 +08:00
}
async GetGlobalConfig() {
try {
await this.InitService();
let softData = this.softwareService.GetSoftwareData();
if (softData.data.length <= 0) {
throw new Error('获取软件数据失败');
}
let config = softData.data[0];
global.config = JSON.parse(config.globalSetting);
this.globalConfig = global.config;
return successMessage(global.config, '获取全局配置完成', 'TaskManager_GetGlobalConfig');
} catch (error) {
console.error('GetGlobalConfig Error:', error);
return errorMessage(`获取全局配置失败,失败信息如下:${error.message}`, 'TaskManager_GetGlobalConfig');
}
}
// 初始化事件监听方法
InitListeners() {
if (this.isListening) return; // 如果已经在监听,直接返回
this.isListening = true; // 标记为已开始监听
const executeWithDynamicInterval = async () => {
await this.ExecuteAutoTask();
this.count++;
console.log("等待时间--" + this.spaceTime, this.count);
// 动态调整等待时间
clearInterval(this.intervalId);
this.intervalId = setInterval(executeWithDynamicInterval, this.spaceTime);
};
this.intervalId = setInterval(executeWithDynamicInterval, this.spaceTime);
}
// 停止监听的方法
StopListeners() {
this.isListening = false; // 标记为停止监听
clearInterval(this.intervalId); // 清除定时器
}
async ExecuteAutoTask() {
await this.InitService();
// 加之前先判断是不是还能执行任务
let waitTask = global.requestQuene.getWaitingQueue();
if (waitTask > 20) // 最懂同时等待二十个
{
console.log('等待中的任务太多,等待中的任务数量:', waitTask);
this.spaceTime = 20000;
return;
}
// 判断MJ队列是不是存在
if (!global.mjQueue) {
// MJ 队列不存在,创建
global.mjQueue = new AsyncQueue(global, 1);
}
// 开始添加
// 查任务
const tasks = this.bookBackTaskListService.GetWaitTaskAndSlice(TaskExecuteType.AUTO, 20 - waitTask);
if (tasks.code == 0) {
return errorMessage(`获取等待中的任务失败,失败信息如下:${tasks.message}`, 'TaskManager_ExecuteAutoTask');
}
if (!tasks.data || tasks.data.length <= 0) {
console.log('没有等待中的任务');
this.spaceTime = 20000;
return;
}
this.spaceTime = 5000;
2024-08-12 16:26:08 +08:00
await this.InitService(true);
2024-08-03 12:46:12 +08:00
//循环添加任务
for (let index = 0; index < tasks.data.length; index++) {
const element = tasks.data[index];
if (element.type == BookBackTaskType.MJ_IMAGE || element.type == BookBackTaskType.MJ_REVERSE) {
if (global.mjQueue.getWaitingQueue() > 10) {
console.log('MJ等待中的任务太多等待中的任务数量', global.mjQueue.getWaitingQueue());
this.spaceTime = 20000;
return;
}
// MJ任务
let res = await this.AddQueue(element);
continue;
} else {
// 其他任务
let res = await this.AddQueue(element);
}
// 添加完成,修改一下提交时间 // 要判断是否超时
}
}
//#region 添加任务到内存任务中
/**
*
* @param task
*/
AddGetFrameDataTask(task: TaskModal.Task): void {
let batch = DEFINE_STRING.BOOK.GET_FRAME_DATA;
global.requestQuene.enqueue(async () => {
await this.basicReverse.GetFrameData(task);
}, `${batch}_${task.id}`, batch);
}
/**
*
* @param task
*/
AddCutVideoData(task: TaskModal.Task): void {
let batch = DEFINE_STRING.BOOK.FRAMING;
global.requestQuene.enqueue(async () => {
await this.basicReverse.CutVideoData(task);
}, `${batch}_${task.id}`, batch)
}
/**
*
* @param task
*/
AddSplitAudioData(task: TaskModal.Task): void {
let batch = DEFINE_STRING.BOOK.SPLI_TAUDIO;
global.requestQuene.enqueue(async () => {
await this.basicReverse.SplitAudioData(task);
}, `${batch}_${task.id}`, batch)
}
/**
*
* @param task
*/
AddGetFrame(task: TaskModal.Task): void {
let batch = DEFINE_STRING.BOOK.GET_FRAME;
global.requestQuene.enqueue(async () => {
await this.basicReverse.GetFrame(task);
}, `${batch}_${task.id}`, batch)
}
/**
*
* @param task
*/
AddExtractSubtitlesData(task: TaskModal.Task): void {
let batch = DEFINE_STRING.BOOK.GET_COPYWRITING;
global.requestQuene.enqueue(async () => {
await this.basicReverse.ExtractSubtitlesData(task);
}, `${batch}_${task.id}`, batch)
}
/**
*
* @param task
*/
AddSingleReversePrompt(task: TaskModal.Task): void {
let batch = DEFINE_STRING.BOOK.ADD_REVERSE_PROMPT;
global.requestQuene.enqueue(async () => {
await this.reverseBook.SingleReversePrompt(task);
}, `${batch}_${task.id}`, batch)
}
/**
*
* @param task
* @returns
*/
async AddQueue(task: TaskModal.Task) {
let _bookBackTaskListService = await BookBackTaskListService.getInstance();
try {
switch (task.type) {
case BookBackTaskType.STORYBOARD:
this.AddGetFrameDataTask(task);
break;
case BookBackTaskType.SPLIT:
this.AddCutVideoData(task);
break;
case BookBackTaskType.AUDIO:
this.AddSplitAudioData(task);
break;
case BookBackTaskType.FRAME:
this.AddGetFrame(task);
break;
case BookBackTaskType.RECOGNIZE:
this.AddExtractSubtitlesData(task);
break;
case BookBackTaskType.MJ_REVERSE || BookBackTaskType.SD_REVERSE:
this.AddSingleReversePrompt(task);
break;
case BookBackTaskType.MJ_IMAGE:
this.AddImageMJImage(task);
break;
default:
throw new Error('未知的任务类型');
}
// 是不是要添加自动任务
// await this.AddTaskHandle(task, true);
// 添加成功后,更新任务状态
let updateRes = _bookBackTaskListService.UpdateTaskStatus({
id: task.id,
status: BookBackTaskStatus.RUNNING
});
if (updateRes.code == 0) {
throw new Error(updateRes.message);
}
return successMessage(null, `${task.name}_${task.id} 任务添加调度完成`, 'TaskManager_AddQueue');
} catch (error) {
let updateRes = _bookBackTaskListService.UpdateTaskStatus({
id: task.id,
status: BookBackTaskStatus.FAIL,
errorMessage: "任务调度失败,请手动重试"
});
if (updateRes.code == 0) {
return errorMessage(`处理 ${task.type} 类型任务 ${task.name} 失败,失败信息如下:${error.message}`, 'TaskManager_handleTask');
}
return errorMessage(`处理 ${task.type} 类型任务 ${task.name} 失败,失败信息如下:${error.message}`, 'TaskManager_handleTask');
}
}
/**
* MJ生图生成
* @param task
*/
async AddImageMJImage(task: TaskModal.Task) {
// 判断任务数量是不是又修改
let taskNumber = global.mjQueue.getConcurrencyLimit();
if (taskNumber != this.mjOpt.mjSetting.taskCount) {
global.mjQueue.concurrencyLimit = this.mjOpt.mjSetting.taskCount // 重置并发执行的数量
}
// 判断是不是MJ的任务
let batch = DEFINE_STRING.MJ.MJ_IMAGE;
global.mjQueue.enqueue(async () => {
await this.mjOpt.MJImagine(task);
}, `${batch}_${task.id}`, batch, `${batch}_${task.id}_${new Date().getTime()}`);
}
//#endregion
async AddTaskHandle(task: TaskModal.Task, isAdd = false) {
if (!isAdd) {
return;
}
if (task.type == BookBackTaskType.STORYBOARD) {
await this.basicReverse.AddCutVideoDataTask(task.bookId);
} else if (task.type == BookBackTaskType.SPLIT) {
await this.basicReverse.AddSplitAudioDataTask(task.bookId, task.bookTaskId);
} else if (task.type == BookBackTaskType.AUDIO) {
await this.basicReverse.AddGetFrameTask(task.bookId, task.bookTaskId);
} else if (task.type == BookBackTaskType.FRAME) {
await this.basicReverse.AddExtractSubtitlesDataTask(task.bookId, task.bookTaskId);
} else {
throw new Error('不支持的任务类型');
}
}
}