LaiTool/src/main/Task/taskManage.js

201 lines
6.8 KiB
JavaScript
Raw Normal View History

2024-06-27 16:24:41 +08:00
import { BookBackTaskListService } from '../../define/db/service/Book/bookBackTaskListService'
import { BookService } from '../../define/db/service/Book/bookService'
import { BookTaskDetailService } from '../../define/db/service/Book/bookTaskDetailService'
import { BookTaskService } from '../../define/db/service/Book/bookTaskService'
import { OtherData } from '../../define/enum/softwareEnum'
2024-07-13 15:44:13 +08:00
import { BookBackTaskStatus, BookBackTaskType, TaskExecuteType } from '../../define/enum/bookEnum'
import { isEmpty } from 'lodash'
import { SoftwareService } from '../../define/db/service/SoftWare/softwareService'
import { errorMessage, successMessage } from '../generalTools'
import { BasicReverse } from './basicReverse'
export class TaskManager {
constructor() {
this.isExecuting = false
this.currentTaskList = []
this.globalConfig = global.config
// this.taskExecute = new TaskExecute()
this.basicReverse = new BasicReverse()
}
2024-06-27 16:24:41 +08:00
/**
2024-07-13 15:44:13 +08:00
* 初始化服务
2024-06-27 16:24:41 +08:00
*/
2024-07-13 15:44:13 +08:00
async InitService() {
if (!this.softwareService) {
this.softwareService = await SoftwareService.getInstance()
}
if (!this.bookBackTaskListService) {
this.bookBackTaskListService = await BookBackTaskListService.getInstance()
2024-06-27 16:24:41 +08:00
}
}
/**
2024-07-13 15:44:13 +08:00
* 加载数据库中的配置到全局变量中
2024-06-27 16:24:41 +08:00
*/
2024-07-13 15:44:13 +08:00
async GetGlobalConfig() {
2024-06-27 16:24:41 +08:00
try {
2024-07-13 15:44:13 +08:00
await this.InitService()
let softData = this.softwareService.GetSoftwareData(null)
if (softData.data.length <= 0) {
throw new Error('获取软件数据失败')
2024-06-27 16:24:41 +08:00
}
2024-07-13 15:44:13 +08:00
let config = softData.data[0]
global.config = JSON.parse(config.globalSetting)
this.globalConfig = global.config
return successMessage(global.config, '获取全局配置完成', 'TaskManager_GetGlobalConfig')
2024-06-27 16:24:41 +08:00
} catch (error) {
2024-07-13 15:44:13 +08:00
return errorMessage(
`获取全局配置失败,失败信息如下:` + error.message,
'TaskManager_GetGlobalConfig'
2024-06-27 16:24:41 +08:00
)
2024-07-13 15:44:13 +08:00
}
2024-06-27 16:24:41 +08:00
}
2024-07-13 15:44:13 +08:00
/**
* 执行自动任务
* @returns
*/
async ExecuteAutoTask() {
await this.InitService()
if (this.isExecuting && this.currentTaskList.length > this.globalConfig.task_number) {
2024-06-27 16:24:41 +08:00
console.log('任务正在执行,跳过此次执行')
return
}
this.isExecuting = true
try {
2024-07-13 15:44:13 +08:00
while (this.currentTaskList.length < this.globalConfig.task_number) {
// 获取正在等待中第一个任务
const tasks = this.bookBackTaskListService.GetWaitTaskAndSlice(TaskExecuteType.AUTO, 1)
if (!tasks.data || tasks.data.length <= 0) {
console.log('没有等待中的任务')
break
2024-06-27 16:24:41 +08:00
}
2024-07-13 15:44:13 +08:00
let task = tasks.data[0]
this.currentTaskList.push(task)
this.handleTask(task)
.then((data) => {
if (data.code == 0) {
this.bookBackTaskListService.UpdateTaskStatus({
id: task.id,
status: BookBackTaskStatus.FAIL,
errorMessage: data.message
})
return Promise.reject(new Error(data.message))
} else if (data.code == 1) {
this.bookBackTaskListService.UpdateTaskStatus({
id: task.id,
status: BookBackTaskStatus.DONE
})
} else {
return Promise.reject(new Error(`${task.type} 返回的数据结构不对`))
}
})
.catch((error) => {
// 失败修改当前task的状态为fail
this.bookBackTaskListService.UpdateTaskStatus({
id: task.id,
status: BookBackTaskStatus.FAIL,
errorMessage: error.message
})
throw error
})
.finally(() => {
this.currentTaskList = this.currentTaskList.filter((t) => t.id != task.id)
this.ExecuteAutoTask()
})
2024-06-27 16:24:41 +08:00
}
} catch (err) {
2024-07-13 15:44:13 +08:00
return errorMessage(
`执行任务失败,失败信息如下:${err.message}`,
'TaskManager_ExecuteAutoTask'
)
2024-06-27 16:24:41 +08:00
} finally {
2024-07-13 15:44:13 +08:00
// 判断是不是还有任务没有则设置任务执行状态为false
if (this.currentTaskList.length <= 0) {
this.isExecuting = false
}
2024-06-27 16:24:41 +08:00
}
}
async handleTask(task) {
2024-07-13 15:44:13 +08:00
try {
let _bookBackTaskListService = await BookBackTaskListService.getInstance()
let res
// 调用分镜头任务
if (task.type == BookBackTaskType.STORYBOARD) {
res = await this.basicReverse.GetFrameData(task)
} else if (task.type == BookBackTaskType.SPLIT) {
// 调用分割视频任务
res = await this.basicReverse.CutVideoData(task)
} else if (task.type == BookBackTaskType.AUDIO) {
// 提取音频任务
res = await this.basicReverse.SplitAudioData(task)
} else if (task.type == BookBackTaskType.FRAME) {
// 抽取视频帧任务
res = await this.basicReverse.GetFrame(task)
} else if (task.type == BookBackTaskType.RECOGNIZE) {
// 识别识别字幕任务
res = await this.basicReverse.ExtractSubtitlesData(task)
}
// 未知的任务类型
else {
throw new Error('未知的任务类型')
}
if (res.code == 0) {
// 修改当前队列的任务状态
let updateRes = _bookBackTaskListService.UpdateTaskStatus({
id: task.id,
status: BookBackTaskStatus.FAIL,
errorMessage: res.message
})
if (updateRes.code == 0) {
throw new Error(updateRes.message)
}
throw new Error(res.message)
}
// 判断是不是要添加后续任务
await this.AddTaskHandle(task, true)
// 修改当前队列的任务状态
let updateRes = _bookBackTaskListService.UpdateTaskStatus({
id: task.id,
status: BookBackTaskStatus.DONE
})
if (updateRes.code == 0) {
throw new Error(updateRes.message)
}
return successMessage(null, '任务执行成功', 'TaskManager_handleTask')
} catch (error) {
return errorMessage(
`处理 ${task.type} 类型任务 ${task.name} 失败,失败信息如下:${error.message}`,
'TaskManager_handleTask'
)
2024-06-27 16:24:41 +08:00
}
}
2024-07-13 15:44:13 +08:00
/**
* 是否添加后续任务
* @param {*} task
* @param {*} isAdd
*/
async AddTaskHandle(task, isAdd = false) {
if (!isAdd) {
return
}
2024-06-27 16:24:41 +08:00
2024-07-13 15:44:13 +08:00
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)
2024-06-27 16:24:41 +08:00
} else {
2024-07-13 15:44:13 +08:00
throw new Error('不支持的任务类型')
2024-06-27 16:24:41 +08:00
}
2024-07-13 15:44:13 +08:00
}
}