evaluation_rule.go 5.3 KB
package domain

import (
	"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 "", fmt.Errorf("评分填写的值超出限制,>=%f且<=%f", rule.Score.Min, rule.Score.Max)
// 	}
// 	//保留小数处理
// 	fStr := fmt.Sprintf("%%.%df", rule.Score.DecimalPlaces)
// 	valueStr := fmt.Sprintf(fStr, valueFloat)
// 	*value = valueStr
// 	if rule.Score.IntervalState == 0 {
// 		// 未开启按分数子区间匹配等级
// 		return "", nil
// 	}
// 	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)
}