evaluation_rule.go 4.9 KB
package domain

import (
	"errors"
	"time"
)

const (
	EvaluationTypeRating int = 0 // 评估方式-评级
	EvaluationTypeScore  int = 1 // 评估方式-评分
)

const (
	EvaluationSysTypeCommon int = 0 // 系统类型-系统添加
	EvaluationSysTypeSystem int = 1 // 系统类型-系统预制(不可删除、编辑)
)

type Rating struct {
	Levels []*RatingLevel `json:"levels" comment:"配置等级"`
}

type RatingLevel struct {
	Code           string  `json:"code" comment:"等级代号"`
	Name           string  `json:"name" comment:"等级名称"`
	Color          int     `json:"color" comment:"等级颜色"`
	QuantizedValue float64 `json:"quantizedValue" comment:"等级量化值"`
}

type Score struct {
	Min           float64       `json:"min" comment:"评分下限"`
	Max           float64       `json:"max" comment:"评分上限"`
	IntervalState int           `json:"intervalState" comment:"按分数子区间匹配等级(0关闭、1开启)"`
	DecimalPlaces int           `json:"decimalPlaces" comment:"保留小数点(0不保留、1保留一位、以此类推)"`
	Levels        []*ScoreLevel `json:"levels" comment:"配置等级区间"`
}

type ScoreLevel struct {
	Code  string  `json:"code" comment:"等级代号"`
	Name  string  `json:"name" comment:"等级名称"`
	Start float64 `json:"start" comment:"分数区间开始值"`
	End   float64 `json:"end" comment:"分数区间结束值"`
}

type EvaluationRule struct {
	Id        int64      `json:"id,string" comment:"ID"`
	Name      string     `json:"name" comment:"名称"`
	Remark    string     `json:"remark" comment:"备注"`
	CompanyId int64      `json:"companyId,string" comment:"公司ID"`
	CreatorId int64      `json:"creatorId,string" comment:"创建人ID"`
	Type      int        `json:"type" comment:"评估方式(0评级、1评分)"`
	SysType   int        `json:"sysType" comment:"系统类型(0普通、1系统固定)" pg:",use_zero"`
	Rating    Rating     `json:"rating" comment:"评级"`
	Score     Score      `json:"score" comment:"评分"`
	CreatedAt time.Time  `json:"createdAt" comment:"创建时间"`
	UpdatedAt time.Time  `json:"updatedAt" comment:"更新时间"`
	DeletedAt *time.Time `json:"deletedAt" comment:"删除时间"`
}

//根据评估填写的值,得出等级名称,
//如果 评估方式是评分,对评估填写的值 的小数点进行处理
//value 根据评估填写的值
func (rule *EvaluationRule) ScoreOrRating(value *string) (string, error) {
	switch rule.Type {
	case EvaluationTypeRating:
		return rule.RatingValue(value)
	case EvaluationTypeScore:
		return rule.ScoreValue(value)
	}
	return "", errors.New("rule.Type 错误")
}

//根据评估填写的值,得出等级名称,
func (rule *EvaluationRule) ScoreValue(value *string) (string, error) {
	// valueFloat, err := strconv.ParseFloat(*value, 64)
	// if err != nil {
	// 	return "", errors.New("评分填写的值错误")
	// }
	// if valueFloat < rule.Score.Min || valueFloat > rule.Score.Max {
	// 	return "", errors.New("评分填写的值超出限制")
	// }

	valueDescrip := ""
	// for _, v := range rule.Score.Levels {
	// 	if valueFloat >= v.Start && valueFloat <= v.End {
	// 		valueDescrip = v.Name
	// 	}
	// }
	return valueDescrip, nil
}

//根据评估填写的值,得出等级名称,
func (rule *EvaluationRule) RatingValue(value *string) (string, error) {
	for _, v := range rule.Rating.Levels {
		if v.Code == *value {
			return v.Name, nil
		}
	}
	return "", errors.New("评估填写的值错误")
}

// GenerateSysRule 当前公司下的生成默认规则
func GenerateSysRule(companyId int64) *EvaluationRule {
	levels := make([]*RatingLevel, 0)
	levels = append(levels, &RatingLevel{
		Code:           "S",
		Name:           "SS",
		Color:          1,
		QuantizedValue: 90,
	})
	levels = append(levels, &RatingLevel{
		Code:           "A",
		Name:           "AA",
		Color:          2,
		QuantizedValue: 80,
	})
	levels = append(levels, &RatingLevel{
		Code:           "B",
		Name:           "BB",
		Color:          3,
		QuantizedValue: 70,
	})

	levels = append(levels, &RatingLevel{
		Code:           "C",
		Name:           "CC",
		Color:          4,
		QuantizedValue: 60,
	})

	levels = append(levels, &RatingLevel{
		Code:           "D",
		Name:           "DD",
		Color:          5,
		QuantizedValue: 50,
	})

	newRule := &EvaluationRule{
		Id:        0,
		Name:      "评级(默认)",
		Remark:    "",
		CompanyId: companyId,
		CreatorId: 0,
		Type:      EvaluationTypeRating,
		SysType:   EvaluationSysTypeSystem,
		Rating: Rating{
			Levels: levels,
		},
		Score: Score{},
	}
	return newRule
}

type EvaluationRuleRepository interface {
	Insert(rule *EvaluationRule) (*EvaluationRule, error)
	Remove(rule *EvaluationRule) (*EvaluationRule, error)
	FindOne(queryOptions map[string]interface{}) (*EvaluationRule, error)
	Find(queryOptions map[string]interface{}) (int64, []*EvaluationRule, error)
	Count(queryOptions map[string]interface{}) (int64, error)
}