package repository import ( "errors" "fmt" "time" "github.com/go-pg/pg/v10" pgTransaction "github.com/linmadan/egglib-go/transaction/pg" "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain" "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/pg/models" "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/utils" ) type NodeTaskRepository struct { transactionContext *pgTransaction.TransactionContext } func NewNodeTaskRepository(transactionContext *pgTransaction.TransactionContext) *NodeTaskRepository { return &NodeTaskRepository{transactionContext: transactionContext} } func (repo *NodeTaskRepository) TransformToDomain(m *models.NodeTask) domain.NodeTask { return domain.NodeTask{ Id: m.Id, CompanyId: m.CompanyId, CycleId: m.CycleId, ProjectId: m.ProjectId, NodeId: m.NodeId, NodeType: m.NodeType, NodeName: m.NodeName, NodeDescribe: m.NodeDescribe, NodeSort: m.NodeSort, TimeStart: m.TimeStart, TimeEnd: m.TimeEnd, KpiCycle: m.KpiCycle, NextSentAt: m.NextSentAt, LastSentAt: m.LastSentAt, CreatedAt: m.CreatedAt.Local(), UpdatedAt: m.UpdatedAt.Local(), DeletedAt: m.DeletedAt, } } func (repo *NodeTaskRepository) TransformToModel(d *domain.NodeTask) models.NodeTask { return models.NodeTask{ Id: d.Id, CompanyId: d.CompanyId, CycleId: d.CycleId, ProjectId: d.ProjectId, NodeId: d.NodeId, NodeType: d.NodeType, NodeName: d.NodeName, NodeDescribe: d.NodeDescribe, NodeSort: d.NodeSort, TimeStart: d.TimeStart, TimeEnd: d.TimeEnd, KpiCycle: d.KpiCycle, NextSentAt: d.NextSentAt, LastSentAt: d.LastSentAt, CreatedAt: d.CreatedAt, UpdatedAt: d.UpdatedAt, DeletedAt: d.DeletedAt, } } func (repo *NodeTaskRepository) nextIdentify() (int64, error) { return utils.NewSnowflakeId() } func (repo *NodeTaskRepository) Insert(d *domain.NodeTask) (*domain.NodeTask, error) { var isCreate = d.Id == 0 if isCreate { id, err := repo.nextIdentify() if err != nil { return d, err } d.Id = id d.CreatedAt = time.Now() d.UpdatedAt = d.CreatedAt } else { d.UpdatedAt = time.Now() } m := repo.TransformToModel(d) tx := repo.transactionContext.PgTx var err error if isCreate { _, err = tx.Model(&m).Returning("id").Insert() } else { _, err = tx.Model(&m).Returning("id").WherePK().Update() // 更新和删除必须增加条件 } if err != nil { return nil, err } d.Id = m.Id return d, nil } func (repo *NodeTaskRepository) Remove(d *domain.NodeTask) (*domain.NodeTask, error) { tx := repo.transactionContext.PgTx nowTime := time.Now() m := repo.TransformToModel(d) m.DeletedAt = &nowTime if _, err := tx.Model(&m).WherePK().Update(); err != nil { return d, err } return d, nil } func (repo *NodeTaskRepository) FindOne(queryOptions map[string]interface{}) (*domain.NodeTask, error) { tx := repo.transactionContext.PgTx m := new(models.NodeTask) query := tx.Model(m) query.Where("deleted_at isnull") if id, ok := queryOptions["id"]; ok { query.Where("id=?", id) } if err := query.First(); err != nil { if errors.Is(err, pg.ErrNoRows) { return nil, fmt.Errorf("没有此资源") } else { return nil, err } } u := repo.TransformToDomain(m) return &u, nil } func (repo *NodeTaskRepository) Find(queryOptions map[string]interface{}) ([]*domain.NodeTask, error) { tx := repo.transactionContext.PgTx var m []*models.NodeTask query := tx.Model(&m).Where("deleted_at isnull") if v, ok := queryOptions["now"].(time.Time); ok { query.Where("next_sent_at <= ?", v) } if v, ok := queryOptions["ids"]; ok { query.Where("id in(?)", pg.In(v)) } if v, ok := queryOptions["companyId"]; ok { query.Where("company_id = ?", v) } if v, ok := queryOptions["cycleId"]; ok { query.Where("cycle_id = ?", v) } if v, ok := queryOptions["projectId"]; ok { query.Where("project_id = ?", v) } if v, ok := queryOptions["nodeId"]; ok { query.Where("node_id = ?", v) } err := query.Select() if err != nil { return nil, err } var arrays []*domain.NodeTask for _, v := range m { d := repo.TransformToDomain(v) arrays = append(arrays, &d) } return arrays, nil }