From 9e864a183115ba2420797a8bda661187b1069e00 Mon Sep 17 00:00:00 2001 From: liujiandao <274878379@qq.com> Date: 星期二, 23 四月 2024 11:46:41 +0800 Subject: [PATCH] 考勤统计与车间修改 --- service/fineness.go | 159 ++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 115 insertions(+), 44 deletions(-) diff --git a/service/fineness.go b/service/fineness.go index fc3635b..52ea7f8 100644 --- a/service/fineness.go +++ b/service/fineness.go @@ -10,59 +10,72 @@ "sort" ) -func FinenessCheck(finenessRegister *models.FinenessRegister) (err error) { +func FinenessCheck(finenessRegister *models.FinenessRegister, isNew bool) (err error) { standardMap, err := GetSilkRankStandard() if err != nil { return err } - //鏁寸悊鎴愭楠岃〃鐨勬暟鎹粨鏋� - finenessRoundingItemMap := make(map[int]map[float32]*models.FinenessRoundingItem) - for _, item := range finenessRegister.FinenessList { - if finenessRoundingItemMap[item.Position] == nil { - finenessRoundingItemMap[item.Position] = make(map[float32]*models.FinenessRoundingItem, 0) + finenessCheckItems := make([]*models.FinenessCheckItem, 0) + var lastCarNo int + var allFinenessList []decimal.Decimal + var personFinenessList []decimal.Decimal + var carCheckNumber = 0 //鍗曚釜car宸叉鏌ユ牱鏈暟 + endCarMap, err := GetWorkshopEndCarMap(finenessRegister.Workshop, finenessRegister.WorkshopGroup) + if err != nil { + return err + } + var item *models.FinenessCheckItem + var deviation decimal.Decimal + var finenessGrade string + var roundingItemMap = make(map[float32]*models.FinenessRoundingItem, 0) + for _, finenessItem := range finenessRegister.FinenessList { + roundedHalfFineness := ToRoundedHalfFineness(finenessItem.Fineness) + fineness := decimal.NewFromFloat32(roundedHalfFineness) + for i := 0; i < finenessItem.Quantity; i++ { + allFinenessList = append(allFinenessList, fineness) } - roundedHalfFineness := ToRoundedHalfFineness(item.Fineness) - if finenessRoundingItemMap[item.Position][roundedHalfFineness] == nil { - finenessRoundingItemMap[item.Position][roundedHalfFineness] = &models.FinenessRoundingItem{ - Fineness: decimal.NewFromFloat32(roundedHalfFineness), - Quantity: 1, + personFinenessList = append(personFinenessList, fineness) + carCheckNumber++ + if carCheckNumber == constvar.EveryPersonCarCheckNumber { + carCheckNumber = 0 + if endCarMap[finenessItem.Position] { //璧板埌浜嗘煇涓汉鏈�鍚庣殑杞﹀彿,姣忎汉绠椾竴娆″亸宸拰绛夌骇 + deviation = utils.Deviation(personFinenessList) + finenessGrade = CalcFinenessGrade(item.Deviation, item.TotalDeviation, item.Cleanliness, item.Purity, item.TwiceChange, standardMap) + personFinenessList = personFinenessList[:0] + } + } + if lastCarNo != finenessItem.Position { //姣忎釜杞﹀彿瀛樹竴涓猰odels.FinenessCheckItem + roundingItems := make([]*models.FinenessRoundingItem, 0, len(roundingItemMap)) + for _, v := range roundingItemMap { + roundingItems = append(roundingItems, &models.FinenessRoundingItem{ + Fineness: v.Fineness, + Quantity: v.Quantity, + }) + } + item = &models.FinenessCheckItem{ + FinenessRegisterID: finenessRegister.ID, + Position: lastCarNo, + FinenessRoundingItems: roundingItems, + Deviation: deviation, + FinenessGrade: finenessGrade, + Remark: "", + } + + finenessCheckItems = append(finenessCheckItems, item) + lastCarNo = finenessItem.Position + roundingItemMap = make(map[float32]*models.FinenessRoundingItem, 0) + } + + if roundingItemMap[roundedHalfFineness] == nil { + roundingItemMap[roundedHalfFineness] = &models.FinenessRoundingItem{ + Fineness: fineness, + Quantity: finenessItem.Quantity, } } else { - finenessRoundingItemMap[item.Position][roundedHalfFineness].Quantity++ + roundingItemMap[roundedHalfFineness].Quantity += finenessItem.Quantity } } - finenessCheckItems := make([]*models.FinenessCheckItem, 0) - var allFinenessList []decimal.Decimal - var personEndFlag bool //璧板埌浜嗘煇涓汉鏈�鍚庣殑杞﹀彿 - var finenessList []decimal.Decimal - var step = 3 //涓存椂鎸変竴涓汉涓変釜杞﹀彿绠椼�� - for pos, roundingItemMap := range finenessRoundingItemMap { - roundingItems := make([]*models.FinenessRoundingItem, 0, len(roundingItemMap)) - for _, v := range roundingItemMap { - roundingItems = append(roundingItems, v) - finenessList = append(finenessList, v.Fineness) - allFinenessList = append(allFinenessList, v.Fineness) - } - item := &models.FinenessCheckItem{ - FinenessRegisterID: finenessRegister.ID, - Position: pos, - FinenessRoundingItem: roundingItems, - Remark: "", - } - if pos%step == 0 { - personEndFlag = true - } else { - personEndFlag = false - } - if personEndFlag { - item.Deviation = utils.Deviation(finenessList) - item.FinenessGrade = CalcFinenessGrade(item.Deviation, item.TotalDeviation, item.Cleanliness, item.Purity, item.TwiceChange, standardMap) - finenessList = finenessList[:0] - } - - finenessCheckItems = append(finenessCheckItems, item) - } finenessCheck := models.FinenessCheck{ FinenessRegisterID: finenessRegister.ID, AverageFineness: utils.Average(allFinenessList), @@ -74,14 +87,35 @@ MarketProcessOrderNumber: "", Inspector: "", } + finenessCheck.TotalDeviation = 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 { + if !isNew { + err = models.NewFinenessCheckSearch().SetOrm(db).SetFinenessRegisterID(finenessRegister.ID).Delete() + if err != nil { + return err + } + err = models.NewFinenessCheckItemSearch().SetOrm(db).SetFinenessRegisterID(finenessRegister.ID).Delete() + if err != nil { + return err + } + } err := models.NewFinenessCheckSearch().SetOrm(db).Create(&finenessCheck) if err != nil { return err } - return models.NewFinenessCheckItemSearch().SetOrm(db).CreateBatch(finenessCheckItems) + if len(finenessCheckItems) > 0 { + for _, v := range finenessCheckItems { + v.FinenessCheckID = finenessCheck.ID + } + err = models.NewFinenessCheckItemSearch().SetOrm(db).CreateBatch(finenessCheckItems) + if err != nil { + return err + } + } + + return models.NewFinenessRegisterSearch().SetOrm(db).SetID(finenessRegister.ID).UpdateByMap(map[string]interface{}{"fineness_check_id": finenessCheck.ID}) }) return err } @@ -191,3 +225,40 @@ result = float32(math.Round(float64(result)*10) / 10) return result } + +func FinenessReCheck(finenessCheck *models.FinenessCheck) (err error) { + standardMap, err := GetSilkRankStandard() + 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 { + 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) +} -- Gitblit v1.8.0