package service
|
|
import (
|
"github.com/shopspring/decimal"
|
"silkserver/constvar"
|
"silkserver/extend/code"
|
"silkserver/models"
|
"sort"
|
)
|
|
type Standard struct {
|
CheckItem constvar.CheckItem
|
StartFineness decimal.Decimal
|
EndFineness decimal.Decimal
|
GradeMap map[string]struct{}
|
ValueList []*Pair
|
SortType SortType
|
GradeRank map[string]int
|
}
|
|
type Pair struct {
|
RankName string
|
RankValue decimal.Decimal
|
}
|
|
type SortType int
|
|
const (
|
SortTypeAsc SortType = 0
|
SortTypeDesc SortType = 1
|
)
|
|
var sortTypeMap = map[constvar.CheckItem]SortType{
|
constvar.CheckItemDeviation: SortTypeAsc,
|
constvar.CheckItemTwiceChange: SortTypeAsc,
|
constvar.CheckItemCleanliness: SortTypeDesc,
|
constvar.CheckItemPurity: SortTypeDesc,
|
constvar.CheckItemMaxDeviation: SortTypeAsc,
|
}
|
|
func GetSilkRankStandard(startFineness, endFineness decimal.Decimal) (map[string]*Standard, error) {
|
rankStandards, err := models.NewRawSilkRankStandardSearch().SetFineness(startFineness, endFineness).FindNotTotal()
|
if err != nil {
|
return nil, err
|
}
|
if len(rankStandards) == 0 {
|
return nil, code.SilkRankStandardNotSetError
|
}
|
standardMap := make(map[string]*Standard)
|
for _, v := range rankStandards {
|
if standardMap[v.LineId] == nil {
|
standardMap[v.LineId] = &Standard{
|
CheckItem: v.CheckItem,
|
StartFineness: v.StartFineness,
|
EndFineness: v.EndFineness,
|
GradeMap: make(map[string]struct{}),
|
ValueList: make([]*Pair, 0),
|
}
|
}
|
if _, ok := standardMap[v.LineId].GradeMap[constvar.BadFinenessGradeA]; !ok {
|
standardMap[v.LineId].ValueList = append(standardMap[v.LineId].ValueList, &Pair{
|
RankName: constvar.BadFinenessGradeA,
|
RankValue: v.RankA,
|
})
|
standardMap[v.LineId].GradeMap[constvar.BadFinenessGradeA] = struct{}{}
|
}
|
if _, ok := standardMap[v.LineId].GradeMap[constvar.BadFinenessGradeB]; !ok {
|
standardMap[v.LineId].ValueList = append(standardMap[v.LineId].ValueList, &Pair{
|
RankName: constvar.BadFinenessGradeB,
|
RankValue: v.RankB,
|
})
|
standardMap[v.LineId].GradeMap[constvar.BadFinenessGradeB] = struct{}{}
|
}
|
if _, ok := standardMap[v.LineId].GradeMap[constvar.BadFinenessGradeC]; !ok {
|
standardMap[v.LineId].ValueList = append(standardMap[v.LineId].ValueList, &Pair{
|
RankName: constvar.BadFinenessGradeC,
|
RankValue: v.RankC,
|
})
|
standardMap[v.LineId].GradeMap[constvar.BadFinenessGradeC] = struct{}{}
|
}
|
if _, ok := standardMap[v.LineId].GradeMap[v.RankName]; !ok {
|
standardMap[v.LineId].ValueList = append(standardMap[v.LineId].ValueList, &Pair{
|
RankName: v.RankName,
|
RankValue: v.RankValue,
|
})
|
standardMap[v.LineId].GradeMap[v.RankName] = struct{}{}
|
}
|
}
|
//value排序
|
for k := range standardMap {
|
sort.Slice(standardMap[k].ValueList, func(i, j int) bool {
|
sortType := sortTypeMap[standardMap[k].CheckItem]
|
standardMap[k].SortType = sortType
|
if sortType == SortTypeAsc {
|
return standardMap[k].ValueList[i].RankValue.LessThan(standardMap[k].ValueList[j].RankValue)
|
} else {
|
return standardMap[k].ValueList[i].RankValue.GreaterThan(standardMap[k].ValueList[j].RankValue)
|
}
|
})
|
}
|
//等级排名
|
for lineId, standard := range standardMap {
|
for k, pair := range standard.ValueList {
|
if standardMap[lineId].GradeRank == nil {
|
standardMap[lineId].GradeRank = make(map[string]int, 0)
|
}
|
if standard.SortType == SortTypeAsc {
|
standardMap[lineId].GradeRank[pair.RankName] = k + 1
|
} else {
|
standardMap[lineId].GradeRank[pair.RankName] = len(standard.ValueList) - k
|
}
|
}
|
}
|
return standardMap, nil
|
}
|