summary_evaluation_value.go 3.5 KB
package domain

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

// 周期综合评估填写的内容
type SummaryEvaluationValue struct {
	Id                  int            `json:"id"`                  //
	EvaluationItemId    int            `json:"evaluationItemId"`    //评估条目的id
	SummaryEvaluationId int            `json:"summaryEvaluationId"` //综合评估任务(SummaryEvaluation)的id
	Value               string         `json:"value"`               //评估填写的评分
	Score               string         `json:"score"`               //评定得分
	Types               EvaluationType `json:"types"`               //评估类型
	Remark              string         `json:"remark"`              //填写的内容反馈
	Weight              float64        `json:"weight"`              //"权重"
	Rating              RatingLevel    `json:"rating"`              //评级时的填写值
	CreatedAt           time.Time      `json:"createdAt"`           //数据创建时间
	UpdatedAt           time.Time      `json:"updatedAt"`           //数据更新时间
	IsTemporary         int            `json:"IsTemporary"`         // 0-正式数据 1-临时提交的数据
}

type SummaryEvaluationValueRepository interface {
	Save(param *SummaryEvaluationValue) error
	Remove(id int) error
	FindOne(queryOptions map[string]interface{}) (*SummaryEvaluationValue, error)
	Find(queryOptions map[string]interface{}) (int, []*SummaryEvaluationValue, error)
}

// 计算周期评估
// 当指标项没有权重的时候,还是进行评级操作,不计算分数
// 分数保留2位小数
func (itemValue *SummaryEvaluationValue) SummaryEvaluationScore() error {
	//计算方式
	score, err := itemValue.SumScore()
	if err != nil {
		return err
	}
	itemValue.Score = fmt.Sprintf("%.2f", score)
	return nil
}

func (itemValue *SummaryEvaluationValue) SumScore() (float64, error) {
	if len(itemValue.Value) == 0 {
		return 0, nil
	}
	if itemValue.Weight == 0 {
		//使用评级
		return 0, nil
	}
	if itemValue.Types == EvaluationHrbp {
		//hrbp 填写值就是得分
		valueFloat, err := strconv.ParseFloat(itemValue.Value, 64)
		if err != nil {
			return 0, fmt.Errorf("条目%d系数值异常,%s", itemValue.Id, itemValue.Value)
		}
		return valueFloat, nil
	}
	valueFloat, err := strconv.ParseFloat(itemValue.Value, 64)
	if err != nil {
		return 0, fmt.Errorf("条目%d系数值异常,%s", itemValue.Id, itemValue.Value)
	}
	//得分计算方式
	score := itemValue.Weight * valueFloat
	return score, nil
}

// 初始化一个空的value
func (itemValue *SummaryEvaluationValue) SetBlankValue(evaluation *SummaryEvaluation, item *EvaluationItemUsed) {
	itemValue.Types = evaluation.Types
	itemValue.EvaluationItemId = item.Id
	itemValue.SummaryEvaluationId = evaluation.Id
	itemValue.Value = ""
	itemValue.Score = ""
	itemValue.Remark = ""
	itemValue.Weight = item.Weight
	itemValue.CreatedAt = time.Now()
	itemValue.UpdatedAt = time.Now()
}

// 填充评估的内容
func (itemValue *SummaryEvaluationValue) FillValue(item *EvaluationItemUsed, value string, remark string) error {
	itemValue.Remark = remark
	itemValue.Value = value
	if item.Weight == 0 {
		//使用评级
		if len(value) == 0 {
			return nil
		}
		var ratingValue *RatingLevel
		for _, v := range item.Rule.Rating.Levels {
			if v.Code == value {
				ratingValue = v
			}
		}
		if (ratingValue == nil) && len(value) > 0 {
			return fmt.Errorf("条目%d系评级值异常", itemValue.EvaluationItemId)
		}
		itemValue.Rating = *ratingValue
		return nil
	}
	//使用评分的形式
	err := itemValue.SummaryEvaluationScore()
	return err
}