Files
media/dao/audio/transcribe_task_dao.go
2026-05-20 11:32:39 +08:00

189 lines
5.6 KiB
Go
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.
package audio
import (
"context"
consts "media/consts/audio"
dto "media/model/dto/audio"
entity "media/model/entity/audio"
"gitea.com/red-future/common/db/gfdb"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
)
var TranscribeTask = new(transcribeTaskDao)
type transcribeTaskDao struct{}
// Insert 创建任务
func (d *transcribeTaskDao) Insert(ctx context.Context, data *entity.TranscribeTask) (id int64, err error) {
// FieldsEx 排除空 result 字段JSONB 列不支持空串 ''
r, err := gfdb.DB(ctx).Model(ctx, consts.TranscribeTaskTable).
Data(data).
FieldsEx(entity.TranscribeTaskCols.Result).
Insert()
if err != nil {
return 0, err
}
return r.LastInsertId()
}
// GetByTaskID 根据taskId获取任务
func (d *transcribeTaskDao) GetByTaskID(ctx context.Context, taskID string) (res *entity.TranscribeTask, err error) {
r, err := gfdb.DB(ctx).Model(ctx, consts.TranscribeTaskTable).
Where(entity.TranscribeTaskCols.TaskID, taskID).
One()
if err != nil {
return nil, err
}
if r == nil {
return nil, nil
}
err = r.Struct(&res)
return
}
// UpdateProgress 更新任务进度
func (d *transcribeTaskDao) UpdateProgress(ctx context.Context, taskID string, progress int) (rows int64, err error) {
r, err := gfdb.DB(ctx).Model(ctx, consts.TranscribeTaskTable).
Data(g.Map{
entity.TranscribeTaskCols.Progress: progress,
}).
Where(entity.TranscribeTaskCols.TaskID, taskID).
Update()
if err != nil {
return 0, err
}
return r.RowsAffected()
}
// UpdateTaskRunning 将任务更新为运行中
func (d *transcribeTaskDao) UpdateTaskRunning(ctx context.Context, taskID string, progress int) (rows int64, err error) {
r, err := gfdb.DB(ctx).Model(ctx, consts.TranscribeTaskTable).
Data(g.Map{
entity.TranscribeTaskCols.Status: consts.TaskStatusRunning,
entity.TranscribeTaskCols.Progress: progress,
}).
Where(entity.TranscribeTaskCols.TaskID, taskID).
Update()
if err != nil {
return 0, err
}
return r.RowsAffected()
}
// UpdateResult 更新任务成功状态(result: 完整结果JSON)
func (d *transcribeTaskDao) UpdateResult(ctx context.Context, taskID, result string, successCount, failCount int) (rows int64, err error) {
r, err := gfdb.DB(ctx).Model(ctx, consts.TranscribeTaskTable).
Data(g.Map{
entity.TranscribeTaskCols.Status: consts.TaskStatusSuccess,
entity.TranscribeTaskCols.Progress: 100,
entity.TranscribeTaskCols.Result: result,
entity.TranscribeTaskCols.SuccessFiles: successCount,
entity.TranscribeTaskCols.FailFiles: failCount,
entity.TranscribeTaskCols.ErrorMessage: "",
}).
Where(entity.TranscribeTaskCols.TaskID, taskID).
Update()
if err != nil {
return 0, err
}
return r.RowsAffected()
}
// UpdateError 更新任务错误(失败后)
func (d *transcribeTaskDao) UpdateError(ctx context.Context, taskID string, errMsg string) (rows int64, err error) {
r, err := gfdb.DB(ctx).Model(ctx, consts.TranscribeTaskTable).
Data(g.Map{
entity.TranscribeTaskCols.Status: consts.TaskStatusFailed,
entity.TranscribeTaskCols.ErrorMessage: errMsg,
}).
Where(entity.TranscribeTaskCols.TaskID, taskID).
Update()
if err != nil {
return 0, err
}
return r.RowsAffected()
}
// List 获取任务列表
func (d *transcribeTaskDao) List(ctx context.Context, req *dto.ListTaskReq) (res []entity.TranscribeTask, total int, err error) {
model := d.buildListFilter(ctx, req)
model.OrderDesc(entity.TranscribeTaskCols.CreatedAt)
if req.Page != nil {
model.Page(int(req.Page.PageNum), int(req.Page.PageSize))
}
r, total, err := model.AllAndCount(false)
if err != nil {
return
}
err = r.Structs(&res)
return
}
// buildListFilter 构建列表过滤
func (d *transcribeTaskDao) buildListFilter(ctx context.Context, req *dto.ListTaskReq) *gdb.Model {
model := gfdb.DB(ctx).Model(ctx, consts.TranscribeTaskTable).Model
model.Where(entity.TranscribeTaskCols.Status, req.Status)
model.OmitEmptyWhere()
return model
}
// EntityToItem 将实体转为DTO项
// 注意: 不返回 result 字段(数据在 detailList 结构化返回中,避免与 result JSON 重复)
//
// result 仅在回调通知时直接使用 task.Result
func EntityToItem(e *entity.TranscribeTask) dto.TranscribeTaskItem {
item := dto.TranscribeTaskItem{
ID: e.Id,
TaskID: e.TaskID,
Status: e.Status,
Progress: e.Progress,
TotalFiles: e.TotalFiles,
SuccessFiles: e.SuccessFiles,
FailFiles: e.FailFiles,
Model: e.Model,
Language: e.Language,
Threshold: e.Threshold,
InputType: e.InputType,
InputData: e.InputData,
FileNames: e.FileNames,
CallbackURL: e.CallbackURL,
ErrorMessage: e.ErrorMessage,
}
if e.CreatedAt != nil {
item.CreatedAt = gconv.Int64(e.CreatedAt.Timestamp())
}
if e.UpdatedAt != nil {
item.UpdatedAt = gconv.Int64(e.UpdatedAt.Timestamp())
}
return item
}
// EntityToProgress 将实体转为进度DTO
func EntityToProgress(e *entity.TranscribeTask) dto.GetProgressRes {
return dto.GetProgressRes{
TaskID: e.TaskID,
Status: e.Status,
Progress: e.Progress,
}
}
// DetailEntityToItem 将明细实体转为DTO项
func DetailEntityToItem(e *entity.TranscribeTaskDetail) dto.TranscribeTaskDetailItem {
return dto.TranscribeTaskDetailItem{
ID: e.Id,
TaskID: e.TaskID,
FileIndex: e.FileIndex,
FileName: e.FileName,
TranscribedText: e.TranscribedText,
Scenes: e.Scenes,
AudioSize: e.AudioSize,
AudioDuration: e.AudioDuration,
Model: e.Model,
Language: e.Language,
ErrorMessage: e.ErrorMessage,
}
}