zhangqian
2024-04-29 8b6e1e99dfbfe9c5324ba161cfbd742cd5dd5499
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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
}