pg_node_task_repository.go 4.2 KB
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["lessNextSentAt"].(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
}