| 
					
				 | 
			
			
				@@ -9,6 +9,8 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"strings" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"time" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"gorm.io/gorm" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"gitee.com/xuyiping_admin/pkg/logger/zaplog" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"go.uber.org/zap" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -32,21 +34,27 @@ func (e *Entry) ProcessMilkOriginal(pastureId int64) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		zaplog.Error("MilkOriginal", zap.Any("pastureId", pastureId), zap.Any("err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	shifts := make([]int32, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	milkClassConfig := &MilkClassConfig{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, v := range milkConfigList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		switch v.Name { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		case model.FirstClassMilkTime: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			milkClassConfig.FirstClassMilkTime = v.Value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			shifts = append(shifts, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		case model.SecondClassMilkTime: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			milkClassConfig.SecondClassMilkTime = v.Value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			shifts = append(shifts, 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		case model.ThirdClassMilkTime: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			milkClassConfig.ThirdClassMilkTime = v.Value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			shifts = append(shifts, 3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		case model.FourthClassMilkTime: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			milkClassConfig.FourthClassMilkTime = v.Value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			shifts = append(shifts, 4) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		case model.UpdateMilkOriginalMaxId: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			maxId, _ := strconv.ParseInt(v.Value, 10, 64) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			milkClassConfig.OldUpdateMaxId = maxId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	xDBeg, xBeg1, xBeg2, xBeg3, xBeg4 := parseXBeg(milkClassConfig) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	e.UpdateShifts(pastureId, xBeg1, xBeg2, xBeg3, xBeg4) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -86,11 +94,13 @@ func (e *Entry) ProcessMilkOriginal(pastureId int64) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	milkHallList := e.FindMilkHallList(pastureId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	e.DeleteRepeatMilkData(pastureId, deleteModel, milkClassConfig, milkOriginalList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	e.MilkHallData(pastureId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	e.UpdateRecognitionTime(pastureId, milkHallList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	e.UpdateRepeatCupSet1(milkOriginalList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	e.UpdateMilkOriginCowInfo(milkOriginalList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	e.UpdateMilkOriginCowInfo(milkOriginalList, milkHallList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	e.UpdateRepeatCupSet2(milkOriginalList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	e.UpdateMilkOriginalInitialTimesAndAttachAdjustTime(shifts, milkOriginalList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // UpdateShifts 更新班次 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -219,44 +229,38 @@ func (e *Entry) DeleteRepeatMilkData(pastureId int64, deleteModel *DeleteMilkOri 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (e *Entry) MilkHallData(pastureId int64) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	milkHallList := e.FindMilkHallList(pastureId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// UpdateRecognitionTime 识别时间超过40分钟未套杯牛只,识别改为未识别 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (e *Entry) UpdateRecognitionTime(pastureId int64, milkHallList []*model.MilkHall) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(milkHallList) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, hall := range milkHallList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		milkOriginalList := make([]*model.MilkOriginal, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err := e.DB.Model(new(model.MilkOriginal)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Where("pasture_id = ?", pastureId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Where("milk_hall_number = ?", hall.Name). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Where("milk_hall_brand = ?", hall.Brand). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Where("load = ?", 0). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Find(&milkOriginalList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			zaplog.Error("MilkHallData", zap.Any("err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, v := range milkHallList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		e.UpdateRecognitionTime(pastureId, v) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// UpdateRecognitionTime 识别时间超过40分钟未套杯牛只,识别改为未识别 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (e *Entry) UpdateRecognitionTime(pastureId int64, hall *model.MilkHall) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	milkOriginalList := make([]*model.MilkOriginal, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err := e.DB.Model(new(model.MilkOriginal)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("pasture_id = ?", pastureId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("milk_hall_number = ?", hall.Name). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("milk_hall_brand = ?", hall.Brand). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("load = ?", 0). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Find(&milkOriginalList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		zaplog.Error("MilkHallData", zap.Any("err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, v := range milkOriginalList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		t1, _ := util.TimeParseLocal(model.LayoutTime, v.AttachTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		t2, _ := util.TimeParseLocal(model.LayoutTime, v.RecognitionTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		diff := t1.Sub(t2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		minute := int(diff.Minutes()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, v := range milkOriginalList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			t1, _ := util.TimeParseLocal(model.LayoutTime, v.AttachTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			t2, _ := util.TimeParseLocal(model.LayoutTime, v.RecognitionTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			diff := t1.Sub(t2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			minute := int(diff.Minutes()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if util.Substr(v.RecognitionTime, -1, 8) != "00:00:00" && minute > 40 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err := e.DB.Model(new(model.MilkOriginal)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				Where("id = ?", v.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				Updates(map[string]interface{}{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					"cow_id":           0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					"ele_ear_number":   "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					"recognition_time": fmt.Sprintf("%s 00:00:00", util.Substr(v.RecognitionTime, 0, 10)), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				zaplog.Error("MilkHallData", zap.Any("err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if util.Substr(v.RecognitionTime, -1, 8) != "00:00:00" && minute > 40 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if err := e.DB.Model(new(model.MilkOriginal)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Where("id = ?", v.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Updates(map[string]interface{}{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						"cow_id":           0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						"ele_ear_number":   "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						"recognition_time": fmt.Sprintf("%s 00:00:00", util.Substr(v.RecognitionTime, 0, 10)), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					zaplog.Error("MilkHallData", zap.Any("err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -298,8 +302,186 @@ func (e *Entry) UpdateRepeatCupSet1(milkOriginalList []*model.MilkOriginal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (e *Entry) UpdateMilkOriginCowInfo(milkOriginalList []*model.MilkOriginal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// UpdateMilkOriginCowInfo 更新牛只信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (e *Entry) UpdateMilkOriginCowInfo(milkOriginalList []*model.MilkOriginal, milkHallList []*model.MilkHall) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	milkHallMap := make(map[string][]*model.MilkOriginal) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, v := range milkOriginalList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		key := fmt.Sprintf("%s", v.MilkHallNumber) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		milkHallMap[key] = append(milkHallMap[key], v) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, v := range milkHallList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		dataList, ok := milkHallMap[v.Name] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if !ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		switch v.IsExtraUpdate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		case model.IsExtra0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		case model.IsExtra1, model.IsExtra3: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			for _, d := range dataList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if d.EarNumber == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				cowInfo, err := e.GetCowByEarNumber(d.PastureId, d.EarNumber) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					zaplog.Error("UpdateMilkOriginCowInfo", zap.Any("err", err), zap.Any("data", d)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 更新牛只信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				d.UpdateCowInfo(cowInfo) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if err = e.DB.Model(new(model.MilkOriginal)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Select("cow_id", "pen_id", "pen_name"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Where("id = ?", d.Id).Updates(d).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					zaplog.Error("UpdateMilkOriginCowInfo", zap.Any("err", err), zap.Any("data", d)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		case model.IsExtra2: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (e *Entry) UpdateMilkOriginalInitialTimesAndAttachAdjustTime(shifts []int32, milkOriginalList []*model.MilkOriginal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, shift := range shifts { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		shiftMinDetachTimes := "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 按脱杯地址分组处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		addressMap := make(map[int64][]*model.MilkOriginal) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, m := range milkOriginalList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if m.Shifts != shift || m.DetacherTime == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if shiftMinDetachTimes == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				shiftMinDetachTimes = m.DetacherTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				t1, _ := util.TimeParseLocal(model.LayoutTime, m.DetacherTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				t2, _ := util.TimeParseLocal(model.LayoutTime, shiftMinDetachTimes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if t2.Before(t1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					shiftMinDetachTimes = m.DetacherTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			addressMap[m.DetacherAddress] = append(addressMap[m.DetacherAddress], m) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if shiftMinDetachTimes == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		bt, _ := util.TimeParseLocal(model.LayoutTime, shiftMinDetachTimes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		b5 := bt.Add(-5*time.Minute).Format(model.LayoutHour) + "00:00" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, list := range addressMap { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 对当前地址的记录按时间排序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			sort.Slice(list, func(i, j int) bool { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if list[i].MilkDate != list[j].MilkDate { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return list[i].MilkDate < list[j].MilkDate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if list[i].Shifts != list[j].Shifts { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return list[i].Shifts < list[j].Shifts 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if list[i].DetacherAddress != list[j].DetacherAddress { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return list[i].DetacherAddress < list[j].DetacherAddress 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return list[i].Id < list[j].Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 初始化变量,模拟SQL中的@address和@det 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var lastAddress int64 = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var lastDetachTime string = "2001-01-01 06:00:00" // 默认初始值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 批量更新参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var updateParams []struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ID           int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				InitialTimes string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				AttachAdjust string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			for _, m := range list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var initialTimeStr string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var attachAdjust string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 如果当前记录的脱杯地址与上一条不同,则使用基准时间b5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if m.DetacherAddress != lastAddress { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					initialTimeStr = b5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 否则使用上一条记录的脱杯时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					initialTimeStr = lastDetachTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 更新最后记录的地址和时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				lastAddress = m.DetacherAddress 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				lastDetachTime = m.DetacherTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 只有当initialTime不为空且与原有值不同时才需要更新 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if initialTimeStr != "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					initialTime, _ := util.TimeParseLocal(model.LayoutTime, initialTimeStr) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					attachTime, _ := util.TimeParseLocal(model.LayoutTime, m.AttachTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					detachTime, _ := util.TimeParseLocal(model.LayoutTime, m.DetacherTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 条件1:attachtimes以'00:00:00'结尾或attachtimes <= initialtimes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if strings.HasSuffix(m.AttachTime, "00:00:00") || attachTime.Before(initialTime) || attachTime.Equal(initialTime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// 计算 detachtimes - (1.5 + duration)*60 秒 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						adjustTime1 := detachTime.Add(-time.Duration((90 + m.Duration*60)) * time.Second) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// 取三者中的最大值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						maxTime := util.FindMaxTime(attachTime, initialTime, adjustTime1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						attachAdjust = maxTime.Format(model.LayoutTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// 计算 detachtimes - duration*60 秒 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						adjustTime2 := detachTime.Add(-time.Duration(m.Duration*60) * time.Second) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// 取 attachtimes 和 adjustTime2 中的较小值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						minTime := util.FindMinTime(attachTime, adjustTime2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// 再与 initialtimes 取较大值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						maxTime := util.FindMaxTime(minTime, initialTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						attachAdjust = maxTime.Format(model.LayoutTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 记录需要更新的字段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					updateParams = append(updateParams, struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						ID           int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						InitialTimes string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						AttachAdjust string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						ID:           m.Id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						InitialTimes: initialTimeStr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						AttachAdjust: attachAdjust, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					/*if err := e.DB.Model(new(model.MilkOriginal)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						Select("initial_time"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						Where("id = ?", m.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						Update("initial_time", initialTime).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						zaplog.Error("UpdateMilkOriginalInitialTimesAndAttachAdjustTime", zap.Any("err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if len(updateParams) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 批量更新数据库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if err := e.DB.Transaction(func(tx *gorm.DB) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					for _, param := range updateParams { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						updates := map[string]interface{}{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							"initial_times":      param.InitialTimes, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							"attach_adjust_time": param.AttachAdjust, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if err := tx.Model(new(model.MilkOriginal)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							Select("initial_time", "attach_adjust_time"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							Where("id = ? ", param.ID). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							Updates(updates).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					zaplog.Error("UpdateMilkOriginalInitialTimesAndAttachAdjustTime", zap.Any("err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // UpdateRepeatCupSet2  非标准重复套杯 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -308,9 +490,9 @@ func (e *Entry) UpdateRepeatCupSet2(milkOriginalList []*model.MilkOriginal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if v.AttachTime == "" || v.InitialTime == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		attchTime, _ := util.TimeParseLocal(model.LayoutTime, v.AttachTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		nattchTime, _ := util.TimeParseLocal(model.LayoutTime, v.AttachTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		initialTime, _ := util.TimeParseLocal(model.LayoutTime, v.InitialTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if util.Substr(v.InitialTime, -1, 5) != "00:00" && v.Nattach == 0 && attchTime.Sub(initialTime).Minutes() <= 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if util.Substr(v.InitialTime, -1, 5) != "00:00" && v.Nattach == 0 && nattchTime.Sub(initialTime).Minutes() <= 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if err := e.DB.Model(new(model.MilkOriginal)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				Select("nattach"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				Where("id = ?", v.Id). 
			 |