summary_evaluation_dao.go 4.6 KB
package dao

import (
	"time"

	"github.com/go-pg/pg/v10"
	pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
)

type SummaryEvaluationDao struct {
	transactionContext *pgTransaction.TransactionContext
}

func NewSummaryEvaluationDao(options map[string]interface{}) *SummaryEvaluationDao {
	var transactionContext *pgTransaction.TransactionContext
	if value, ok := options["transactionContext"]; ok {
		transactionContext = value.(*pgTransaction.TransactionContext)
	}
	return &SummaryEvaluationDao{
		transactionContext: transactionContext,
	}
}

type ExecutorCycle struct {
	CycleId   string    `pg:"cycle_id" `  //周期id
	CycleName string    `pg:"cycle_name"` //周期名称
	CreatedAt time.Time `pg:"created_at"`
}

// GetExecutorCycleList 获取执行人拥有的周期列表
// executorId 执行人id
// offset,limit 分页
func (d *SummaryEvaluationDao) GetExecutorCycleList(companyId int, executorId int, offset int, limit int, isHrbp bool) ([]ExecutorCycle, error) {
	sqlStr := `select  
	distinct on(
		summary_evaluation.cycle_id ,
		summary_evaluation.cycle_name) 
	summary_evaluation.created_at ,
	summary_evaluation.cycle_id ,
	summary_evaluation.cycle_name 
	from summary_evaluation 
	where summary_evaluation.company_id=? 
	and summary_evaluation.begin_time <=now() 
	and summary_evaluation.deleted_at isnull
	`
	tx := d.transactionContext.PgTx
	condition := []interface{}{
		companyId, executorId,
	}
	if isHrbp {
		sqlStr += ` and (summary_evaluation.executor ->>'userId'='?' or summary_evaluation."types"=4 ) `
	} else {
		sqlStr += ` and (summary_evaluation.executor ->>'userId'='?') `
	}
	condition = append(condition, offset, limit)

	sqlStr1 := `with t1 as ( ` + sqlStr + ` ) select * from  t1 order by t1.created_at desc  offset ? limit ? `
	result := []ExecutorCycle{}
	_, err := tx.Query(&result, sqlStr1, condition...)
	return result, err
}

// CountExecutorCycleList 统计执行人拥有的周期列表
func (d *SummaryEvaluationDao) CountExecutorCycleList(companyId int, executorId int, isHrbp bool) (int, error) {
	sqlStr := `select count(
		distinct summary_evaluation.cycle_id
	  ) as cnt
	from  summary_evaluation 
	where  summary_evaluation.company_id=? and summary_evaluation.deleted_at isnull `

	tx := d.transactionContext.PgTx
	condition := []interface{}{
		companyId, executorId,
	}
	if isHrbp {
		sqlStr += ` and (summary_evaluation.executor ->>'userId'='?' or summary_evaluation."types"=4 ) `
	} else {
		sqlStr += ` and (summary_evaluation.executor ->>'userId'='?') `
	}
	var cnt int
	_, err := tx.QueryOne(pg.Scan(&cnt), sqlStr, condition...)
	return cnt, err
}

type TargetUserCycle struct {
	CycleId   string    `pg:"cycle_id" `  //周期id
	CycleName string    `pg:"cycle_name"` //周期名称
	BeginTime time.Time `pg:"begin_time"`
}

// GetExecutorCycleList 获取被评估目标人拥有的周期列表
// executorId 执行人id
// offset,limit 分页
func (d *SummaryEvaluationDao) GetTargetUserCycleList(executorId int, offset int, limit int, evaluationType int) ([]TargetUserCycle, error) {
	sqlStr := `select  
	distinct 
	summary_evaluation.cycle_id ,
	summary_evaluation.begin_time ,
	summary_evaluation.cycle_name 
	from summary_evaluation 
	where summary_evaluation.target_user ->>'userId'='?'
	`
	tx := d.transactionContext.PgTx
	condition := []interface{}{
		executorId,
	}

	if evaluationType > 0 {
		sqlStr += `	and summary_evaluation."types"=? `
		condition = append(condition, evaluationType)
	}

	condition = append(condition, offset, limit)
	sqlStr += ` order by summary_evaluation.begin_time desc offset ? limit ? `
	result := []TargetUserCycle{}
	_, err := tx.Query(&result, sqlStr, condition...)
	return result, err
}

// CountExecutorCycleList 统计 被评估目标人拥有的周期列表
func (d *SummaryEvaluationDao) CountTargetUserCycleList(executorId int, evaluationType int) (int, error) {
	sqlStr := `select count(
		distinct summary_evaluation.cycle_id
	  ) as cnt
	from  summary_evaluation 
	where summary_evaluation.target_user ->>'userId'='?' `

	condition := []interface{}{
		executorId,
	}
	if evaluationType > 0 {
		sqlStr += `	and summary_evaluation."types"=? `
		condition = append(condition, evaluationType)
	}
	tx := d.transactionContext.PgTx
	var cnt int
	_, err := tx.QueryOne(pg.Scan(&cnt), sqlStr, condition...)
	return cnt, err
}

func (d *SummaryEvaluationDao) UpdateBeginTime(ids []int, beginTime time.Time) error {
	if len(ids) == 0 {
		return nil
	}
	sqlStr := `update summary_evaluation set begin_time =? 
	where  summary_evaluation.id in(?) `
	condition := []interface{}{
		beginTime, pg.In(ids),
	}
	tx := d.transactionContext.PgTx
	_, err := tx.Exec(sqlStr, condition...)
	return err
}