staff_assess_content.go 3.9 KB
package domain

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

// 填写的评估内容
type StaffAssessContent struct {
	Id            int                   `json:"id"`            //id
	StaffAssessId int                   `json:"staffAssessId"` //用户需要的评估项id
	SortBy        int                   `json:"sortBy"`        //排序
	Category      string                `json:"category"`      //类别
	Name          string                `json:"name"`          //名称
	PromptTitle   string                `json:"promptTitle"`   //提示项标题
	PromptText    string                `json:"promptText"`    //提示项正文
	Remark        []AssessContemtRemark `json:"remark"`        //填写的反馈
	Value         string                `json:"value"`         //评估填写的值
	ScoreValue    float64               `json:"scoreValue"`    // 填写值按规则Rule转换为相应的量化值
	LevelValue    string                `json:"levelValue"`    // 填写值按规则Rule转换为相应的等级值
	ReteResult    string                `json:"reteResult"`    //评估的结果
	Rule          EvaluationRule        `json:"rule"`          //评估的选项规则
	Weight        float64               `json:"weight" `       //"权重"
	Required      int                   `json:"required"`      // 必填项
	CreatedAt     time.Time             `json:"createdAt"`     //数据创建时间
	UpdatedAt     time.Time             `json:"updatedAt"`     //数据更新时间
	DeletedAt     *time.Time            `json:"deletedAt"`
}

type AssessContemtRemark struct {
	Title      string `json:"title"`      //comment:"填写标题"
	HintText   string `json:"hintText"`   // comment:"文本内容提示"
	Definition string `json:"definition"` //comment:"定义"
	RemarkText string `json:"remarkText"` // comment:"填写文本内容"
}

// TransformValue
// 根据规则 rule 转换评填写的值
func (content *StaffAssessContent) TransformValue() error {
	switch content.Rule.Type {
	case EvaluationTypeRating:
		return content.ratingValue()
	case EvaluationTypeScore:
		return content.scoreValue()
	}
	return nil
}

// 规则是评级方式
func (content *StaffAssessContent) ratingValue() error {
	levels := content.Rule.Rating.Levels
	for _, v := range levels {
		if v.Code != content.Value {
			continue
		}
		content.LevelValue = v.Code
		content.ScoreValue = v.QuantizedValue
		content.ReteResult = v.Name
		return nil
	}
	return errors.New("评级填写的值错误")
}

// 规则是评分方式
func (content *StaffAssessContent) scoreValue() error {
	valueFloat, err := strconv.ParseFloat(content.Value, 64)
	if err != nil {
		return errors.New("评分填写的值错误")
	}
	rule := &content.Rule
	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)
	content.Value = valueStr
	//if rule.Score.IntervalState == 0 {
	// 未开启按分数子区间匹配等级
	//	return nil
	//}
	for _, v := range rule.Score.Levels {
		if valueFloat < v.Start || valueFloat > v.End {
			continue
		}
		content.LevelValue = v.Code
		content.ScoreValue = valueFloat
		content.ReteResult = v.Name
		return nil
	}
	return nil
}

//type StaffAssessContentSort []*StaffAssessContent
//
//func (a StaffAssessContentSort) Len() int           { return len(a) }
//func (a StaffAssessContentSort) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
//func (a StaffAssessContentSort) Less(i, j int) bool { return a[i].SortBy < a[j].SortBy }

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