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() (map[string]*Standard, error) { rankStandards, err := models.NewRawSilkRankStandardSearch().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 }