2025-12-10 18:33:37 +08:00
|
|
|
package service
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
2025-12-18 12:39:50 +08:00
|
|
|
"fmt"
|
2025-12-10 18:33:37 +08:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"gitea.com/bitwsd/document_ai/internal/model/task"
|
|
|
|
|
"gitea.com/bitwsd/document_ai/internal/storage/dao"
|
2025-12-18 12:39:50 +08:00
|
|
|
"gitea.com/bitwsd/document_ai/pkg/log"
|
2025-12-18 15:14:42 +08:00
|
|
|
"gitea.com/bitwsd/document_ai/pkg/oss"
|
2025-12-10 18:33:37 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type TaskService struct {
|
2025-12-18 12:39:50 +08:00
|
|
|
recognitionTaskDao *dao.RecognitionTaskDao
|
|
|
|
|
evaluateTaskDao *dao.EvaluateTaskDao
|
|
|
|
|
recognitionResultDao *dao.RecognitionResultDao
|
2025-12-10 18:33:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewTaskService() *TaskService {
|
2025-12-18 12:39:50 +08:00
|
|
|
return &TaskService{
|
|
|
|
|
recognitionTaskDao: dao.NewRecognitionTaskDao(),
|
|
|
|
|
evaluateTaskDao: dao.NewEvaluateTaskDao(),
|
|
|
|
|
recognitionResultDao: dao.NewRecognitionResultDao(),
|
|
|
|
|
}
|
2025-12-10 18:33:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (svc *TaskService) EvaluateTask(ctx context.Context, req *task.EvaluateTaskRequest) error {
|
2025-12-18 12:39:50 +08:00
|
|
|
task, err := svc.recognitionTaskDao.GetByTaskNo(dao.DB.WithContext(ctx), req.TaskNo)
|
2025-12-10 18:33:37 +08:00
|
|
|
if err != nil {
|
|
|
|
|
log.Error(ctx, "func", "EvaluateTask", "msg", "get task by task no failed", "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if task == nil {
|
|
|
|
|
log.Error(ctx, "func", "EvaluateTask", "msg", "task not found")
|
|
|
|
|
return errors.New("task not found")
|
|
|
|
|
}
|
|
|
|
|
if task.Status != dao.TaskStatusCompleted {
|
|
|
|
|
log.Error(ctx, "func", "EvaluateTask", "msg", "task not finished")
|
|
|
|
|
return errors.New("task not finished")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
evaluateTask := &dao.EvaluateTask{
|
|
|
|
|
TaskID: task.ID,
|
|
|
|
|
Satisfied: req.Satisfied,
|
|
|
|
|
Feedback: req.Feedback,
|
|
|
|
|
Comment: strings.Join(req.Suggestion, ","),
|
|
|
|
|
}
|
2025-12-18 12:39:50 +08:00
|
|
|
err = svc.evaluateTaskDao.Create(dao.DB.WithContext(ctx), evaluateTask)
|
2025-12-10 18:33:37 +08:00
|
|
|
if err != nil {
|
|
|
|
|
log.Error(ctx, "func", "EvaluateTask", "msg", "create evaluate task failed", "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (svc *TaskService) GetTaskList(ctx context.Context, req *task.TaskListRequest) (*task.TaskListResponse, error) {
|
2025-12-18 12:39:50 +08:00
|
|
|
tasks, total, err := svc.recognitionTaskDao.GetTaskList(dao.DB.WithContext(ctx), req.UserID, dao.TaskType(req.TaskType), req.Page, req.PageSize)
|
2025-12-10 18:33:37 +08:00
|
|
|
if err != nil {
|
|
|
|
|
log.Error(ctx, "func", "GetTaskList", "msg", "get task list failed", "error", err)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2025-12-18 12:39:50 +08:00
|
|
|
|
|
|
|
|
taskIDs := make([]int64, 0, len(tasks))
|
|
|
|
|
for _, item := range tasks {
|
|
|
|
|
taskIDs = append(taskIDs, item.ID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
recognitionResults, err := svc.recognitionResultDao.GetByTaskIDs(dao.DB.WithContext(ctx), taskIDs)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error(ctx, "func", "GetTaskList", "msg", "get recognition results failed", "error", err)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
recognitionResultMap := make(map[int64]*dao.RecognitionResult)
|
|
|
|
|
for _, item := range recognitionResults {
|
|
|
|
|
recognitionResultMap[item.TaskID] = item
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-10 18:33:37 +08:00
|
|
|
resp := &task.TaskListResponse{
|
|
|
|
|
TaskList: make([]*task.TaskListDTO, 0, len(tasks)),
|
2025-12-18 12:39:50 +08:00
|
|
|
Total: total,
|
2025-12-10 18:33:37 +08:00
|
|
|
}
|
|
|
|
|
for _, item := range tasks {
|
2025-12-18 12:39:50 +08:00
|
|
|
var latex string
|
|
|
|
|
var markdown string
|
|
|
|
|
recognitionResult := recognitionResultMap[item.ID]
|
|
|
|
|
if recognitionResult != nil {
|
|
|
|
|
latex = recognitionResult.NewContentCodec().GetContent().(string)
|
|
|
|
|
markdown = fmt.Sprintf("$$%s$$", latex)
|
|
|
|
|
}
|
2025-12-18 15:14:42 +08:00
|
|
|
originURL, err := oss.GetDownloadURL(ctx, item.FileURL)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error(ctx, "func", "GetTaskList", "msg", "get origin url failed", "error", err)
|
|
|
|
|
}
|
2025-12-10 18:33:37 +08:00
|
|
|
resp.TaskList = append(resp.TaskList, &task.TaskListDTO{
|
2025-12-18 12:39:50 +08:00
|
|
|
Latex: latex,
|
|
|
|
|
Markdown: markdown,
|
2025-12-10 18:33:37 +08:00
|
|
|
TaskID: item.TaskUUID,
|
|
|
|
|
FileName: item.FileName,
|
2025-12-18 15:14:42 +08:00
|
|
|
Status: int(item.Status),
|
|
|
|
|
OriginURL: originURL,
|
2025-12-10 18:33:37 +08:00
|
|
|
TaskType: item.TaskType.String(),
|
|
|
|
|
CreatedAt: item.CreatedAt.Format("2006-01-02 15:04:05"),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
return resp, nil
|
|
|
|
|
}
|