LaiTool/src/main/Task/taskManage.js

201 lines
6.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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'
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()
}
/**
* 初始化服务
*/
async InitService() {
if (!this.softwareService) {
this.softwareService = await SoftwareService.getInstance()
}
if (!this.bookBackTaskListService) {
this.bookBackTaskListService = await BookBackTaskListService.getInstance()
}
}
/**
* 加载数据库中的配置到全局变量中
*/
async GetGlobalConfig() {
try {
await this.InitService()
let softData = this.softwareService.GetSoftwareData(null)
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) {
return errorMessage(
`获取全局配置失败,失败信息如下:` + error.message,
'TaskManager_GetGlobalConfig'
)
}
}
/**
* 执行自动任务
* @returns
*/
async ExecuteAutoTask() {
await this.InitService()
if (this.isExecuting && this.currentTaskList.length > this.globalConfig.task_number) {
console.log('任务正在执行,跳过此次执行')
return
}
this.isExecuting = true
try {
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
}
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()
})
}
} catch (err) {
return errorMessage(
`执行任务失败,失败信息如下:${err.message}`,
'TaskManager_ExecuteAutoTask'
)
} finally {
// 判断是不是还有任务没有则设置任务执行状态为false
if (this.currentTaskList.length <= 0) {
this.isExecuting = false
}
}
}
async handleTask(task) {
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'
)
}
}
/**
* 是否添加后续任务
* @param {*} task
* @param {*} isAdd
*/
async AddTaskHandle(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('不支持的任务类型')
}
}
}