160 lines
4.8 KiB
Go
160 lines
4.8 KiB
Go
package dao
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"model-gateway/consts/public"
|
||
"model-gateway/model/entity"
|
||
|
||
"gitea.redpowerfuture.com/red-future/common/db/gfdb"
|
||
"github.com/gogf/gf/v2/database/gdb"
|
||
"github.com/gogf/gf/v2/util/gconv"
|
||
)
|
||
|
||
var ModelGatewayTask = &modelGatewayTaskDao{}
|
||
|
||
type modelGatewayTaskDao struct{}
|
||
|
||
// Insert 插入
|
||
func (d *modelGatewayTaskDao) Insert(ctx context.Context, req *entity.ModelGatewayTask) (id int64, err error) {
|
||
m := new(entity.ModelGatewayTask)
|
||
err = gconv.Struct(req, &m)
|
||
if err != nil {
|
||
return
|
||
}
|
||
r, err := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameTask).Insert(m)
|
||
if err != nil {
|
||
return
|
||
}
|
||
return r.LastInsertId()
|
||
}
|
||
|
||
// Update 更新(按ID)
|
||
func (d *modelGatewayTaskDao) Update(ctx context.Context, req *entity.ModelGatewayTask) (rows int64, err error) {
|
||
r, err := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameTask).
|
||
OmitEmpty().
|
||
Data(req).
|
||
Where(entity.ModelGatewayTaskCol.Id, req.Id).
|
||
Update()
|
||
if err != nil {
|
||
return
|
||
}
|
||
return r.RowsAffected()
|
||
}
|
||
|
||
// Get 获取(按TaskID 或 ID)
|
||
func (d *modelGatewayTaskDao) Get(ctx context.Context, req *entity.ModelGatewayTask) (m *entity.ModelGatewayTask, err error) {
|
||
r, err := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameTask).
|
||
OmitEmpty().
|
||
Where(entity.ModelGatewayTaskCol.TaskID, req.TaskID).
|
||
Where(entity.ModelGatewayTaskCol.Id, req.Id).
|
||
One()
|
||
if err != nil {
|
||
return
|
||
}
|
||
err = r.Struct(&m)
|
||
return
|
||
}
|
||
|
||
// List 分页查询
|
||
func (d *modelGatewayTaskDao) List(ctx context.Context, pageNum, pageSize int, req *entity.ModelGatewayTask) (list []*entity.ModelGatewayTask, total int64, err error) {
|
||
model := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameTask).
|
||
OmitEmpty().
|
||
Where(entity.ModelGatewayTaskCol.Creator, req.Creator).
|
||
Where(entity.ModelGatewayTaskCol.ModelName, "%"+req.ModelName+"%").
|
||
Where(entity.ModelGatewayTaskCol.BizName, req.BizName).
|
||
Where(entity.ModelGatewayTaskCol.State, req.State).
|
||
Where(entity.ModelGatewayTaskCol.TaskID, req.TaskID).
|
||
OrderDesc(entity.ModelGatewayTaskCol.CreatedAt)
|
||
if pageNum > 0 && pageSize > 0 {
|
||
model = model.Page(pageNum, pageSize)
|
||
}
|
||
r, totalInt, err := model.AllAndCount(false)
|
||
if err != nil {
|
||
return nil, 0, err
|
||
}
|
||
total = gconv.Int64(totalInt)
|
||
err = r.Structs(&list)
|
||
return
|
||
}
|
||
|
||
// Delete 删除(软删,按ID)
|
||
func (d *modelGatewayTaskDao) Delete(ctx context.Context, req *entity.ModelGatewayTask) (rows int64, err error) {
|
||
r, err := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameTask).
|
||
Where(entity.ModelGatewayTaskCol.Id, req.Id).
|
||
Delete()
|
||
if err != nil {
|
||
return
|
||
}
|
||
return r.RowsAffected()
|
||
}
|
||
|
||
// ListByTaskIDs 批量查询
|
||
func (d *modelGatewayTaskDao) ListByTaskIDs(ctx context.Context, taskIDs []string) (list []*entity.ModelGatewayTask, err error) {
|
||
if len(taskIDs) == 0 {
|
||
return nil, nil
|
||
}
|
||
r, err := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameTask).
|
||
WhereIn(entity.ModelGatewayTaskCol.TaskID, taskIDs).
|
||
All()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
err = r.Structs(&list)
|
||
return
|
||
}
|
||
|
||
// MarkDownloadedByID 标记已下载
|
||
func (d *modelGatewayTaskDao) MarkDownloadedByID(ctx context.Context, id int64) error {
|
||
_, err := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameTask).
|
||
Where(entity.ModelGatewayTaskCol.Id, id).
|
||
Where(entity.ModelGatewayTaskCol.State, 2).
|
||
Data(map[string]any{entity.ModelGatewayTaskCol.State: 4}).
|
||
Update()
|
||
return err
|
||
}
|
||
|
||
// GetPendingAsyncTasks 获取进行中的异步任务
|
||
func (d *modelGatewayTaskDao) GetPendingAsyncTasks(ctx context.Context, limit int) ([]*entity.ModelGatewayTask, error) {
|
||
var tasks []*entity.ModelGatewayTask
|
||
err := gfdb.DB(ctx, public.DbNameModelGateway).Model(ctx, public.TableNameTask).
|
||
Where(entity.ModelGatewayTaskCol.State, 1).
|
||
Limit(limit).
|
||
Scan(&tasks)
|
||
return tasks, err
|
||
}
|
||
|
||
// ======================== 事务抢占 ========================
|
||
|
||
// ClaimByID 按主键抢占,返回抢占后的任务
|
||
func (d *modelGatewayTaskDao) ClaimByID(ctx context.Context, id int64) (*entity.ModelGatewayTask, error) {
|
||
var task entity.ModelGatewayTask
|
||
err := gfdb.DB(ctx, public.DbNameModelGateway).Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
||
r, err := tx.Model(public.TableNameTask).
|
||
Where(entity.ModelGatewayTaskCol.Id, id).
|
||
Where(entity.ModelGatewayTaskCol.State, public.TaskStatusPending).
|
||
Limit(1).
|
||
LockUpdate().
|
||
One()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if r.IsEmpty() {
|
||
return fmt.Errorf("任务已被抢占或不存在: id=%d", id)
|
||
}
|
||
if err := r.Struct(&task); err != nil {
|
||
return err
|
||
}
|
||
_, err = tx.Model(public.TableNameTask).
|
||
Data(&entity.ModelGatewayTask{State: public.TaskStatusRunning}).
|
||
Where(entity.ModelGatewayTaskCol.Id, id).
|
||
OmitEmpty().
|
||
Update()
|
||
return err
|
||
})
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &task, nil
|
||
}
|