summary_evaluation.go 5.7 KB
package domain

import (
	"fmt"
	"strconv"
	"time"
)

// 周综合评估
type SummaryEvaluation struct {
	Id                    int                   `json:"id"`
	CompanyId             int                   `json:"companyId"`             //公司id
	EvaluationProjectId   int                   `json:"evaluationProjectId"`   //对应的项目id
	EvaluationProjectName string                `json:"evaluationProjectName"` //对应的项目名称
	CycleId               int64                 `json:"cycleId"`               //对应的周期id
	CycleName             string                `json:"cycleName"`             //对应的周期名称
	NodeId                int                   `json:"nodeId"`                //对应的节点id
	TargetUser            StaffDesc             `json:"targetUser"`            //被评估的目标用户,被执行的
	TargetDepartment      []StaffDepartment     `json:"targetDepartment"`      //被评估的目标用户所在的部门
	Executor              StaffDesc             `json:"executor"`              //填写评估的用户,执行人
	Types                 EvaluationType        `json:"types"`                 //评估类型
	Status                EvaluationStatus      `json:"status"`                //评估的填写状态
	CheckResult           EvaluationCheckResult `json:"checkResult"`           //被执行的人确认评估结果
	BeginTime             time.Time             `json:"beginTime"`             //开始时间
	EndTime               time.Time             `json:"endTime"`               //截止时间
	TotalScore            string                `json:"totalScore"`            //最终上级评估得分.
	TotalRating           []RatingCodeNumber    `json:"totalRating"`           //汇总各个评级的数量
	Version               EvaluationVersion     `json:"version"`               //填写评估值的规则版本 v1,v2 ,填写方式对应方法 SummaryEvaluation.FillItemValue
	CreatedAt             time.Time             `json:"createdAt"`             //数据创建时间
	UpdatedAt             time.Time             `json:"updatedAt"`             //数据更新时间
	DeletedAt             *time.Time            `json:"deletedAt"`             //数据删除时间
}

type EvaluationVersion string

const (
	EvaluationV1 EvaluationVersion = "v1"
	EvaluationV2 EvaluationVersion = "v2"
)

// 各个评级的数量
type RatingCodeNumber struct {
	Code   string `json:"code"`
	Number int    `json:"number"`
}

type EvaluationType int //综合评估类型

const (
	EvaluationSelf   EvaluationType = 1 //自评
	Evaluation360    EvaluationType = 2 //360评估
	EvaluationSuper  EvaluationType = 3 //上级评估
	EvaluationHrbp   EvaluationType = 4 //人资评估
	EvaluationFinish EvaluationType = 5 //考核结果
)

// 评估的填写状态
type EvaluationStatus string

const (
	// EvaluationEditTotalScore EvaluationStatus = "completed_by_edit_score" //通过超级管理员直接修改分数完成的
	EvaluationUncompleted EvaluationStatus = "uncompleted" //未提交填写的内容
	EvaluationCompleted   EvaluationStatus = "completed"   //已提交填写的内容
)

// 被执行的人确认评估结果
type EvaluationCheckResult string

const (
	EvaluationCheckUncompleted EvaluationCheckResult = "uncompleted" //未确认结果
	EvaluationCheckCompleted   EvaluationCheckResult = "completed"   //已确认结果
)

type SummaryEvaluationRepository interface {
	Save(param *SummaryEvaluation) error
	Remove(id int) error
	FindOne(queryOptions map[string]interface{}) (*SummaryEvaluation, error)
	Find(queryOptions map[string]interface{}) (int, []*SummaryEvaluation, error)
	RemoveByProjectId(id int) error
	RemoveByCycleId(id int64) error
}

// 计算总分。TotalScore 保留2位小数
func (evaluation *SummaryEvaluation) EvaluationTotalScore(valueList []*SummaryEvaluationValue) error {
	//重置计数
	evaluation.TotalScore = "0"
	//汇总评估填写值
	var totalScore float64
	for _, v := range valueList {
		if v.Weight == 0 {
			evaluation.SumRatingCode(v.Rating.Code)
		}
		score, _ := strconv.ParseFloat(v.Score, 64)
		totalScore += score
	}

	evaluation.TotalScore = fmt.Sprintf("%.2f", totalScore)
	return nil
}

// 重置评级统计数量
func (evaluation *SummaryEvaluation) ResetTotalRating(param *EvaluationItemUsed) {
	if param.Weight > 0 {
		return
	}
	if len(evaluation.TotalRating) == 0 {
		evaluation.TotalRating = make([]RatingCodeNumber, 0)
	}
	for _, v := range param.Rule.Rating.Levels {
		isExist := false
		for i2, v2 := range evaluation.TotalRating {
			if v.Code == v2.Code {
				isExist = true
				evaluation.TotalRating[i2].Number = 0
			}
		}
		if !isExist {
			evaluation.TotalRating = append(evaluation.TotalRating, RatingCodeNumber{
				Code:   v.Code,
				Number: 0,
			})
		}
	}
}

// 增加对应评级的数量
func (evaluation *SummaryEvaluation) SumRatingCode(code string) {
	if len(code) == 0 {
		return
	}
	codeNotFound := true
	for i := range evaluation.TotalRating {
		if evaluation.TotalRating[i].Code == code {
			evaluation.TotalRating[i].Number += 1
			codeNotFound = false
			break
		}
	}
	if codeNotFound {
		evaluation.TotalRating = append(evaluation.TotalRating, RatingCodeNumber{
			Code:   code,
			Number: 1,
		})
	}
}

// 更新填写的评估值
func (evaluation *SummaryEvaluation) FillItemValue(item *EvaluationItemUsed, itemValue *SummaryEvaluationValue, value string) error {
	evaluation.ResetTotalRating(item) //重置计数
	//自评
	if evaluation.Types == EvaluationSelf {
		return itemValue.FillValue(item, value, "")
	}
	// 非自评的情况
	// 按照版本使用不同的填写规则
	switch evaluation.Version {
	case EvaluationV1:
		itemValue.FillValue(item, value, "")
	case EvaluationV2:
		itemValue.FillValueV2(item, value)
	default:
		itemValue.FillValue(item, value, "")
	}
	return nil
}