Files
2026-09-11 09:50:06 +08:00

115 lines
3.4 KiB
Go

package dao
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"observer-server/biz/consts"
"observer-server/biz/model/entity"
"observer-server/common"
)
// AnnotateTask 标注众包任务表 DAO:管理端下发/停用,App 端只读 published。
type annotateTaskDao struct{}
var AnnotateTask = &annotateTaskDao{}
func init() {
ctx := context.Background()
_, err := g.DB().Exec(ctx, `CREATE TABLE IF NOT EXISTS annotate_task (
id BIGSERIAL PRIMARY KEY,
dataset_id BIGINT NOT NULL,
name VARCHAR(100) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'published',
created_at TIMESTAMP NOT NULL
)`)
if err != nil {
panic(err)
}
}
// InsertInTx 事务内下发任务(与批量占用同事务,service 编排多表一致性)
func (d *annotateTaskDao) InsertInTx(ctx context.Context, tx gdb.TX, m *entity.AnnotateTask) (int64, error) {
res, err := g.DB().Model(consts.TableAnnotateTask).Ctx(ctx).TX(tx).Data(g.Map{
"dataset_id": m.DatasetId,
"name": m.Name,
"status": m.Status,
"created_at": m.CreatedAt,
}).Insert()
if err != nil {
return 0, err
}
return res.LastInsertId()
}
// GetById 按主键取
func (d *annotateTaskDao) GetById(ctx context.Context, id int64) (*entity.AnnotateTask, error) {
var one *entity.AnnotateTask
err := g.DB().Model(consts.TableAnnotateTask).Ctx(ctx).Where("id", id).Scan(&one)
if err != nil {
return nil, err
}
return one, nil
}
// GetPublishedByDataset 某数据集当前 published 任务(下发查重:同数据集同时只允许一个开放任务)
func (d *annotateTaskDao) GetPublishedByDataset(ctx context.Context, datasetId int64) (*entity.AnnotateTask, error) {
var one *entity.AnnotateTask
err := g.DB().Model(consts.TableAnnotateTask).Ctx(ctx).
Where("dataset_id", datasetId).
Where("status", consts.AnnotateTaskPublished).
OrderDesc("id").Scan(&one)
if err != nil {
return nil, err
}
return one, nil
}
// ListPublished 全部开放任务(App 任务列表)
func (d *annotateTaskDao) ListPublished(ctx context.Context) ([]*entity.AnnotateTask, error) {
var list []*entity.AnnotateTask
err := g.DB().Model(consts.TableAnnotateTask).Ctx(ctx).
Where("status", consts.AnnotateTaskPublished).
OrderDesc("id").Scan(&list)
if err != nil {
if common.IsNoRows(err) {
return []*entity.AnnotateTask{}, nil
}
return nil, err
}
return list, nil
}
// Page 管理端任务分页(datasetId>0 按数据集过滤——详情页 tab 内嵌展示;id 倒序)
func (d *annotateTaskDao) Page(ctx context.Context, datasetId int64, page, size int) ([]*entity.AnnotateTask, int64, error) {
base := func() *gdb.Model {
m := g.DB().Model(consts.TableAnnotateTask).Ctx(ctx)
if datasetId > 0 {
m = m.Where("dataset_id", datasetId)
}
return m
}
total, err := base().Count()
if err != nil {
return nil, 0, err
}
var list []*entity.AnnotateTask
err = base().OrderDesc("id").Limit((page-1)*size, size).Scan(&list)
if err != nil {
if common.IsNoRows(err) {
return []*entity.AnnotateTask{}, int64(total), nil
}
return nil, 0, err
}
return list, int64(total), nil
}
// Stop 停用任务(整体不可再领取;已领取未提交的可继续提交)
func (d *annotateTaskDao) Stop(ctx context.Context, id int64) error {
_, err := g.DB().Model(consts.TableAnnotateTask).Ctx(ctx).Where("id", id).
Data(g.Map{"status": consts.AnnotateTaskStopped}).Update()
return err
}