service/fineness.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service/silk_rank.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
utils/mathx.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
service/fineness.go
@@ -44,11 +44,11 @@ } carCheckNumber++ if carCheckNumber == constvar.EveryPersonCarCheckNumber { if carCheckNumber == constvar.EveryPersonCarCheckNumber { //每人每车号取两个丝,所以每两个等于一个车号,存一行 models.FinenessCheckItem carCheckNumber = 0 if endCarMap[finenessItem.Position] { //走到了某个人最后的车号,每人算一次偏差和等级 deviation = utils.Deviation(personFinenessList) totalDeviation = TotalDeviation(personFinenessList, utils.Average(personFinenessList)) totalDeviation = utils.TotalDeviation(personFinenessList, utils.Average(personFinenessList)) finenessGrade = CalcFinenessGrade(deviation, totalDeviation, decimal.Zero, decimal.Zero, decimal.Zero, standardMap) personFinenessList = personFinenessList[:0] } else { @@ -73,7 +73,7 @@ MarketProcessOrderNumber: "", Inspector: "", } finenessCheck.TotalDeviation = TotalDeviation(allFinenessList, finenessCheck.AverageFineness) finenessCheck.TotalDeviation = utils.TotalDeviation(allFinenessList, finenessCheck.AverageFineness) finenessCheck.FinenessGrade = CalcFinenessGrade(finenessCheck.Deviation, finenessCheck.TotalDeviation, finenessCheck.Cleanliness, finenessCheck.Purity, finenessCheck.TwiceChange, standardMap) err = models.WithTransaction(func(db *gorm.DB) error { @@ -229,32 +229,4 @@ // 保留一位小数,并在整数情况下在小数点后加一个零 result = float32(math.Round(float64(result)*10) / 10) return result } func TotalDeviation(numbers []decimal.Decimal, average decimal.Decimal) decimal.Decimal { if len(numbers) < 2 { return decimal.Zero } n := len(numbers) ratio := decimal.NewFromFloat(0.02) length := decimal.NewFromInt(int64(n)).Mul(ratio).Ceil().IntPart() if length >= int64(n) { return decimal.Zero } sort.Slice(numbers, func(i, j int) bool { return numbers[i].LessThan(numbers[j]) }) minPart := numbers[:length-1] maxPart := numbers[length:] minAverage := utils.Average(minPart) maxAverage := utils.Average(maxPart) minDiff := minAverage.Sub(average).Abs() maxDiff := maxAverage.Sub(average).Abs() return decimal.Max(minDiff, maxDiff) } service/silk_rank.go
@@ -26,8 +26,8 @@ type ValueType int const ( ValueTypeSmallerBetter ValueType = 0 //值按升序排名(值越大,等级越高) ValueTypeGreaterBetter ValueType = 1 //值按降序排名(值越小,等级越低) ValueTypeSmallerBetter ValueType = 0 //值按升序排名(值越小,等级越高) ValueTypeGreaterBetter ValueType = 1 //值按降序排名(值越大,等级越高) ) var sortTypeMap = map[constvar.CheckItem]ValueType{ utils/mathx.go
@@ -1,7 +1,11 @@ package utils import "github.com/shopspring/decimal" import ( "github.com/shopspring/decimal" "sort" ) // Average 取平均值 func Average(numbers []decimal.Decimal) decimal.Decimal { if len(numbers) == 0 { return decimal.Decimal{} @@ -16,6 +20,7 @@ return sum.Div(decimal.NewFromInt(int64(len(numbers)))) } // Deviation 偏差 func Deviation(numbers []decimal.Decimal) decimal.Decimal { if len(numbers) == 0 || len(numbers) == 1 { return decimal.Decimal{} @@ -28,3 +33,32 @@ } return diffSquaredSum.Div(decimal.NewFromInt(int64(len(numbers)))) } // TotalDeviation 总差 func TotalDeviation(numbers []decimal.Decimal, average decimal.Decimal) decimal.Decimal { if len(numbers) < 2 { return decimal.Zero } n := len(numbers) ratio := decimal.NewFromFloat(0.02) length := decimal.NewFromInt(int64(n)).Mul(ratio).Ceil().IntPart() if length >= int64(n) { return decimal.Zero } sort.Slice(numbers, func(i, j int) bool { return numbers[i].LessThan(numbers[j]) }) minPart := numbers[:length-1] maxPart := numbers[length:] minAverage := Average(minPart) maxAverage := Average(maxPart) minDiff := minAverage.Sub(average).Abs() maxDiff := maxAverage.Sub(average).Abs() return decimal.Max(minDiff, maxDiff) }