pg_task_repository.go 10.3 KB
package repository

import (
	"fmt"
	"github.com/go-pg/pg"
	pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
	"github.com/linmadan/egglib-go/utils/snowflake"
	"gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain"
	"gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/pg/models"
)

type TaskRepository struct {
	transactionContext *pgTransaction.TransactionContext
}

func (repository *TaskRepository) nextIdentify() (int64, error) {
	IdWorker, err := snowflake.NewIdWorker(1)
	if err != nil {
		return 0, err
	}
	id, err := IdWorker.NextId()
	return id, err
}
func (repository *TaskRepository) Save(task *domain.Task) (*domain.Task, error) {
	tx := repository.transactionContext.PgTx
	if task.Identify() == nil {
		takeId, err := repository.nextIdentify()
		if err != nil {
			return task, err
		}
		if _, err := tx.QueryOne(
			pg.Scan(&task.TaskId, &task.CompanyId, &task.TaskName, &task.TaskType, &task.Sponsor, &task.TaskStatus, &task.ReferenceResource, pg.Array(&task.CustomerValue), &task.TaskNature, &task.SuMoney, &task.AcceptanceStandard, &task.TaskDescription, pg.Array(&task.TaskPictureUrls), &task.IsRewardTake, &task.CreateTime, &task.ReleaseTime, &task.Participators, &task.TaskPercentage, &task.SolveReport, pg.Array(&task.SolvePictureUrls)),
			"INSERT INTO tasks (id, company_id, task_name, task_type, sponsor, task_status, reference_resource, customer_value, task_nature, su_money, acceptance_standard, task_description, task_picture_urls, is_reward_take, create_time, release_time, participators, task_percentage, solve_report, solve_picture_urls) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING id, company_id, task_name, task_type, sponsor, task_status, reference_resource, customer_value, task_nature, su_money, acceptance_standard, task_description, task_picture_urls, is_reward_take, create_time, release_time, participators, task_percentage, solve_report, solve_picture_urls",
			takeId, task.CompanyId, task.TaskName, task.TaskType, task.Sponsor, task.TaskStatus, task.ReferenceResource, pg.Array(task.CustomerValue), task.TaskNature, task.SuMoney, task.AcceptanceStandard, task.TaskDescription, pg.Array(task.TaskPictureUrls), task.IsRewardTake, task.CreateTime, task.ReleaseTime, task.Participators, task.TaskPercentage, task.SolveReport, pg.Array(task.SolvePictureUrls)); err != nil {
			return task, err
		}
	} else {
		if _, err := tx.QueryOne(
			pg.Scan(&task.TaskId, &task.CompanyId, &task.TaskName, &task.TaskType, &task.Sponsor, &task.TaskStatus, &task.ReferenceResource, pg.Array(&task.CustomerValue), &task.TaskNature, &task.SuMoney, &task.AcceptanceStandard, &task.TaskDescription, pg.Array(&task.TaskPictureUrls), &task.IsRewardTake, &task.CreateTime, &task.ReleaseTime,&task.Participators, &task.TaskPercentage, &task.SolveReport, pg.Array(&task.SolvePictureUrls)),
			"UPDATE tasks SET company_id=?, task_name=?, task_type=?, sponsor=?, task_status=?, reference_resource=?, customer_value=?, task_nature=?, su_money=?, acceptance_standard=?, task_description=?, task_picture_urls=?, is_reward_take=?, create_time=?, release_time=?, participators=?, task_percentage=?, solve_report=?, solve_picture_urls=? WHERE id=? RETURNING id, company_id, task_name, task_type, sponsor, task_status, reference_resource, customer_value, task_nature, su_money, acceptance_standard, task_description, task_picture_urls, is_reward_take, create_time, release_time, participators, task_percentage, solve_report, solve_picture_urls",
			task.CompanyId, task.TaskName, task.TaskType, task.Sponsor, task.TaskStatus, task.ReferenceResource, pg.Array(task.CustomerValue), task.TaskNature, task.SuMoney, task.AcceptanceStandard, task.TaskDescription, pg.Array(task.TaskPictureUrls), task.IsRewardTake, task.CreateTime, task.ReleaseTime, task.Participators, task.TaskPercentage, task.SolveReport, pg.Array(task.SolvePictureUrls), task.Identify()); err != nil {
			return task, err
		}
	}
	return task, nil
}
func (repository *TaskRepository) Remove(task *domain.Task) (*domain.Task, error) {
	tx := repository.transactionContext.PgTx
	taskModel := new(models.Task)
	taskModel.Id = task.Identify().(int64)
	if _, err := tx.Model(taskModel).WherePK().Delete(); err != nil {
		return task, err
	}
	return task, nil
}
func (repository *TaskRepository) FindOne(queryOptions map[string]interface{}) (*domain.Task, error) {
	tx := repository.transactionContext.PgTx
	taskModel := new(models.Task)
	query := tx.Model(taskModel).Relation("RobInfo").Relation("BidInfo")
	if taskId, ok := queryOptions["taskId"]; ok {
		query = query.Where("task.id = ?", taskId)
	}
	if err := query.Limit(1).Select(); err != nil {
		return nil, err
	}
	if taskModel.Id == 0 {
		return nil, nil
	} else {
		//robInfo := &domain.RobInfo{
		//	Receiver:    taskModel.RobInfo.Receiver,
		//	ReceiveTime: taskModel.RobInfo.ReceiveTime,
		//}
		//bidderInfos := make([]*domain.BidderInfo, len(taskModel.BidInfo.BidderInfos))
		//for _, bidderInfo := range taskModel.BidInfo.BidderInfos {
		//	bidderInfos = append(bidderInfos, &domain.BidderInfo{
		//		Bidder:  bidderInfo.Bidder,
		//		BidTime: bidderInfo.BidTime,
		//	})
		//}
		//bidInfo := &domain.BidInfo{
		//	BidderInfos:      bidderInfos,
		//	BidStartTime:     taskModel.BidInfo.BidStartTime,
		//	BidEndTime:       taskModel.BidInfo.BidEndTime,
		//	SuccessfulBidder: taskModel.BidInfo.SuccessfulBidder,
		//	WinBidTime:       taskModel.BidInfo.WinBidTime,
		//}
		var currentStatus domain.TaskStatus
		switch taskModel.TaskStatus {
		case domain.TASK_STATUS_UNRELEASED:
			currentStatus = &domain.UnReleasedStatus{}
			break
		case domain.TASK_STATUS_UNCLAIMED:
			currentStatus = &domain.UnClaimedStatus{}
			break
		case domain.TASK_STATUS_UNDERWAY:
			currentStatus = &domain.UnderwayStatus{}
			break
		case domain.TASK_STATUS_UNACCEPTANCE:
			currentStatus = &domain.UnAcceptanceStatus{}
			break
		case domain.TASK_STATUS_COMPLETED:
			currentStatus = &domain.CompletedStatus{}
			break
		case domain.TASK_STATUS_CLOSED:
			currentStatus = &domain.ClosedStatus{}
			break
		}
		return &domain.Task{
			TaskId:             taskModel.Id,
			CompanyId:          taskModel.CompanyId,
			TaskName:           taskModel.TaskName,
			TaskType:           taskModel.TaskType,
			Sponsor:            taskModel.Sponsor,
			TaskStatus:         taskModel.TaskStatus,
			ReferenceResource:  taskModel.ReferenceResource,
			CustomerValue:      taskModel.CustomerValue,
			TaskNature:         taskModel.TaskNature,
			SuMoney:            taskModel.SuMoney,
			AcceptanceStandard: taskModel.AcceptanceStandard,
			TaskDescription:    taskModel.TaskDescription,
			TaskPictureUrls:    taskModel.TaskPictureUrls,
			IsRewardTake:       taskModel.IsRewardTake,
			CreateTime:         taskModel.CreateTime,
			//RobInfo:            robInfo,
			//BidInfo:            bidInfo,
			Participators:      taskModel.Participators,
			TaskPercentage:     taskModel.TaskPercentage,
			SolveReport:        taskModel.SolveReport,
			SolvePictureUrls:   taskModel.SolvePictureUrls,
			CurrentStatus:      currentStatus,
		}, nil
	}
}
func (repository *TaskRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.Task, error) {
	tx := repository.transactionContext.PgTx
	var taskModels []*models.Task
	var tasks []*domain.Task
	query := tx.Model(&taskModels).Relation("RobInfo").Relation("BidInfo")
	if offset, ok := queryOptions["offset"]; ok {
		offset := offset.(int)
		if offset > -1 {
			query = query.Offset(offset)
		}
	} else {
		query = query.Offset(0)
	}
	if limit, ok := queryOptions["limit"]; ok {
		limit := limit.(int)
		if limit > -1 {
			query = query.Limit(limit)
		}
	} else {
		query = query.Limit(20)
	}
	if count, err := query.Order("id DESC").SelectAndCount(); err != nil {
		return 0, nil, err
	} else {
		for _, taskModel := range taskModels {
			robInfo := &domain.RobInfo{
				Receiver:    taskModel.RobInfo.Receiver,
				ReceiveTime: taskModel.RobInfo.ReceiveTime,
			}
			bidderInfos := make([]*domain.BidderInfo, len(taskModel.BidInfo.BidderInfos))
			for _, bidderInfo := range taskModel.BidInfo.BidderInfos {
				bidderInfos = append(bidderInfos, &domain.BidderInfo{
					Bidder:  bidderInfo.Bidder,
					BidTime: bidderInfo.BidTime,
				})
			}
			bidInfo := &domain.BidInfo{
				BidderInfos:      bidderInfos,
				BidStartTime:     taskModel.BidInfo.BidStartTime,
				BidEndTime:       taskModel.BidInfo.BidEndTime,
				SuccessfulBidder: taskModel.BidInfo.SuccessfulBidder,
				WinBidTime:       taskModel.BidInfo.WinBidTime,
			}
			var currentStatus domain.TaskStatus
			switch taskModel.TaskStatus {
			case domain.TASK_STATUS_UNRELEASED:
				currentStatus = &domain.UnReleasedStatus{}
				break
			case domain.TASK_STATUS_UNCLAIMED:
				currentStatus = &domain.UnClaimedStatus{}
				break
			case domain.TASK_STATUS_UNDERWAY:
				currentStatus = &domain.UnderwayStatus{}
				break
			case domain.TASK_STATUS_UNACCEPTANCE:
				currentStatus = &domain.UnAcceptanceStatus{}
				break
			case domain.TASK_STATUS_COMPLETED:
				currentStatus = &domain.CompletedStatus{}
				break
			case domain.TASK_STATUS_CLOSED:
				currentStatus = &domain.ClosedStatus{}
				break
			}
			tasks = append(tasks, &domain.Task{
				TaskId:             taskModel.Id,
				CompanyId:          taskModel.CompanyId,
				TaskName:           taskModel.TaskName,
				TaskType:           taskModel.TaskType,
				Sponsor:            taskModel.Sponsor,
				TaskStatus:         taskModel.TaskStatus,
				ReferenceResource:  taskModel.ReferenceResource,
				CustomerValue:      taskModel.CustomerValue,
				TaskNature:         taskModel.TaskNature,
				SuMoney:            taskModel.SuMoney,
				AcceptanceStandard: taskModel.AcceptanceStandard,
				TaskDescription:    taskModel.TaskDescription,
				TaskPictureUrls:    taskModel.TaskPictureUrls,
				IsRewardTake:       taskModel.IsRewardTake,
				CreateTime:         taskModel.CreateTime,
				RobInfo:            robInfo,
				BidInfo:            bidInfo,
				Participators:      taskModel.Participators,
				TaskPercentage:     taskModel.TaskPercentage,
				SolveReport:        taskModel.SolveReport,
				SolvePictureUrls:   taskModel.SolvePictureUrls,
				CurrentStatus:      currentStatus,
			})
		}
		return int64(count), tasks, nil
	}
}
func NewTaskRepository(transactionContext *pgTransaction.TransactionContext) (*TaskRepository, error) {
	if transactionContext == nil {
		return nil, fmt.Errorf("transactionContext参数不能为nil")
	} else {
		return &TaskRepository{
			transactionContext: transactionContext,
		}, nil
	}
}