summary_evaluation_value.go 3.7 KB
package domain

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
	"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"`              //填写的内容反馈
	Executor            StaffDesc      `json:"executor"`            //填写评估的用户,执行人
	Weight              float64        `json:"weight"`              //"权重"
	Rating              RatingLevel    `json:"rating"`              //评级时的填写值
	CreatedAt           time.Time      `json:"createdAt"`           //数据创建时间
	UpdatedAt           time.Time      `json:"updatedAt"`           //数据更新时间
}

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)
}

// 初始化一个空的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 = "0"
	itemValue.Remark = ""
	itemValue.Weight = item.Weight
	itemValue.CreatedAt = time.Now()
	itemValue.UpdatedAt = time.Now()
	itemValue.Executor = evaluation.Executor
}

// 填充评估的内容
func (itemValue *SummaryEvaluationValue) FillValue(item *EvaluationItemUsed, value string, remark string) error {
	itemValue.Remark = remark
	if item.Weight == 0 {
		//使用评级的形式
		err := itemValue.valueTypeRating(item, value)
		return err
	}
	//使用评分的形式
	err := itemValue.valueTypeScore(item, value)

	return err
}

// 填写的值是 评级
func (itemValue *SummaryEvaluationValue) valueTypeRating(item *EvaluationItemUsed, value string) error {
	if item.Weight != 0 {
		return errors.New("评级方式错误")
	}
	value = strings.TrimSpace(value)
	itemValue.Value = value
	itemValue.Score = "0"
	// 使用评级
	if len(value) == 0 {
		itemValue.Rating = RatingLevel{}
		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:%s-%s评级值异常", item.Id, item.Category, item.Name)
	}
	itemValue.Rating = *ratingValue
	return nil
}

// 填写的值是 评分
func (itemValue *SummaryEvaluationValue) valueTypeScore(item *EvaluationItemUsed, value string) error {
	if item.Weight <= 0 {
		return errors.New("评分方式错误")
	}
	value = strings.TrimSpace(value)
	itemValue.Value = value
	//处理空值
	if len(value) == 0 {
		itemValue.Score = "0"
		return nil
	}
	valueNumber, err := strconv.ParseFloat(value, 64)
	if err != nil {
		return fmt.Errorf("条目%d:%s-%s评分值异常", item.Id, item.Category, item.Name)
	}
	if item.EvaluatorId < 0 {
		//hrbp 的评分方式
		itemValue.Score = value
		return nil
	} else {
		// 非hrbp的评分方式
		// 分数保留2位小数
		score := valueNumber * item.Weight
		itemValue.Score = fmt.Sprintf("%.2f", score)
	}
	return nil
}