| | |
| | | "silkserver/models" |
| | | "silkserver/utils" |
| | | "sort" |
| | | "strings" |
| | | ) |
| | | |
| | | func FinenessCheck(finenessRegister *models.FinenessRegister, standardMap map[string]*Standard, endCarMap map[int]bool, isNew bool) (err error) { |
| | |
| | | var carCheckNumber = 0 //单个car已检查样本数 |
| | | |
| | | var item *models.FinenessCheckItem |
| | | var deviation decimal.Decimal |
| | | var deviation, totalDeviation decimal.Decimal |
| | | var finenessGrade string |
| | | var roundingItemMap = make(map[float32]*models.FinenessRoundingItem, 0) |
| | | lastCarNo = finenessRegister.FinenessList[0].Position |
| | |
| | | fineness := decimal.NewFromFloat32(roundedHalfFineness) |
| | | for i := 0; i < finenessItem.Quantity; i++ { |
| | | allFinenessList = append(allFinenessList, fineness) |
| | | personFinenessList = append(personFinenessList, fineness) |
| | | } |
| | | personFinenessList = append(personFinenessList, fineness) |
| | | |
| | | if roundingItemMap[roundedHalfFineness] == nil { |
| | | roundingItemMap[roundedHalfFineness] = &models.FinenessRoundingItem{ |
| | | Fineness: fineness, |
| | |
| | | carCheckNumber = 0 |
| | | if endCarMap[finenessItem.Position] { //走到了某个人最后的车号,每人算一次偏差和等级 |
| | | deviation = utils.Deviation(personFinenessList) |
| | | finenessGrade = CalcFinenessGrade(item.Deviation, item.TotalDeviation, item.Cleanliness, item.Purity, item.TwiceChange, standardMap) |
| | | totalDeviation = TotalDeviation(personFinenessList, utils.Average(personFinenessList)) |
| | | finenessGrade = CalcFinenessGrade(deviation, totalDeviation, decimal.Zero, decimal.Zero, decimal.Zero, standardMap) |
| | | personFinenessList = personFinenessList[:0] |
| | | } else { |
| | | deviation = decimal.Zero |
| | | totalDeviation = decimal.Zero |
| | | finenessGrade = "" |
| | | } |
| | | item = MakeFinenessCheckItem(roundingItemMap, finenessRegister.ID, lastCarNo, deviation, finenessGrade) |
| | | item = MakeFinenessCheckItem(roundingItemMap, finenessRegister.ID, lastCarNo, deviation, totalDeviation, finenessGrade) |
| | | finenessCheckItems = append(finenessCheckItems, item) |
| | | roundingItemMap = make(map[float32]*models.FinenessRoundingItem, 0) //重置 |
| | | } |
| | |
| | | return err |
| | | } |
| | | |
| | | func MakeFinenessCheckItem(roundingItemMap map[float32]*models.FinenessRoundingItem, finenessRegisterID uint, position int, deviation decimal.Decimal, finenessGrade string) *models.FinenessCheckItem { |
| | | func MakeFinenessCheckItem(roundingItemMap map[float32]*models.FinenessRoundingItem, finenessRegisterID uint, position int, deviation, totalDeviation decimal.Decimal, finenessGrade string) *models.FinenessCheckItem { |
| | | roundingItems := make([]*models.FinenessRoundingItem, 0, len(roundingItemMap)) |
| | | for _, v := range roundingItemMap { |
| | | roundingItems = append(roundingItems, &models.FinenessRoundingItem{ |
| | |
| | | Position: position, |
| | | FinenessRoundingItems: roundingItems, |
| | | Deviation: deviation, |
| | | TotalDeviation: totalDeviation, |
| | | FinenessGrade: finenessGrade, |
| | | Remark: "", |
| | | } |
| | |
| | | for _, pair := range st.ValueList { |
| | | switch st.CheckItem { |
| | | case constvar.CheckItemDeviation: |
| | | if st.SortType == SortTypeAsc { |
| | | if st.SortType == ValueTypeSmallerBetter { |
| | | if deviation.LessThanOrEqual(pair.RankValue) { |
| | | grade = pair.RankName |
| | | } |
| | |
| | | } |
| | | } |
| | | case constvar.CheckItemMaxDeviation: |
| | | if st.SortType == SortTypeAsc { |
| | | if st.SortType == ValueTypeSmallerBetter { |
| | | if totalDeviation.LessThanOrEqual(pair.RankValue) { |
| | | grade = pair.RankName |
| | | } |
| | |
| | | } |
| | | } |
| | | case constvar.CheckItemTwiceChange: |
| | | if st.SortType == SortTypeAsc { |
| | | if st.SortType == ValueTypeSmallerBetter { |
| | | if twiceChange.LessThanOrEqual(pair.RankValue) { |
| | | grade = pair.RankName |
| | | } |
| | |
| | | } |
| | | } |
| | | case constvar.CheckItemCleanliness: |
| | | if st.SortType == SortTypeAsc { |
| | | if st.SortType == ValueTypeSmallerBetter { |
| | | if cleanliness.LessThanOrEqual(pair.RankValue) { |
| | | grade = pair.RankName |
| | | } |
| | |
| | | } |
| | | } |
| | | case constvar.CheckItemPurity: |
| | | if st.SortType == SortTypeAsc { |
| | | if st.SortType == ValueTypeSmallerBetter { |
| | | if purity.LessThanOrEqual(pair.RankValue) { |
| | | grade = pair.RankName |
| | | } |
| | |
| | | break |
| | | } |
| | | } |
| | | if grade != "" { |
| | | checkItemGradeMap[st.CheckItem] = grade |
| | | gradeRanks = append(gradeRanks, gradeRank{ |
| | | gradeName: grade, |
| | | gradeRank: st.GradeRank[grade], |
| | | }) |
| | | if grade == "" { |
| | | grade = constvar.BadFinenessGradeC |
| | | } |
| | | checkItemGradeMap[st.CheckItem] = grade |
| | | gradeRanks = append(gradeRanks, gradeRank{ |
| | | gradeName: grade, |
| | | gradeRank: st.GradeRank[grade], |
| | | }) |
| | | } |
| | | if len(gradeRanks) == 0 { |
| | | return "" |
| | |
| | | // 保留一位小数,并在整数情况下在小数点后加一个零 |
| | | result = float32(math.Round(float64(result)*10) / 10) |
| | | return result |
| | | } |
| | | |
| | | func FinenessReCheck(finenessCheck *models.FinenessCheck) (err error) { |
| | | finenessRegister, err := models.NewFinenessRegisterSearch().SetID(finenessCheck.FinenessRegisterID).First() |
| | | if err != nil { |
| | | return err |
| | | } |
| | | specArr := strings.Split(finenessRegister.Spec, "/") |
| | | start, _ := decimal.NewFromString(specArr[0]) |
| | | end, _ := decimal.NewFromString(specArr[1]) |
| | | standardMap, err := GetSilkRankStandard(start, end) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | finenessCheck.FinenessGrade = CalcFinenessGrade(finenessCheck.Deviation, finenessCheck.TotalDeviation, finenessCheck.Cleanliness, finenessCheck.Purity, finenessCheck.TwiceChange, standardMap) |
| | | return |
| | | } |
| | | |
| | | func TotalDeviation(numbers []decimal.Decimal, average decimal.Decimal) decimal.Decimal { |