| 
					
				 | 
			
			
				@@ -1,12 +1,9 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package crontab 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	"context" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"encoding/json" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	"errors" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"kpt-pasture/model" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"kpt-pasture/module/backend" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	"kpt-pasture/util" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"time" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"gorm.io/gorm" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -19,46 +16,23 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// GenerateAsynqWorkOrder 异步生成工作单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (e *Entry) GenerateAsynqWorkOrder() error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	workOrderList := make([]*model.WorkOrderMaster, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err := e.DB.Where("is_show = ?", pasturePb.IsShow_Ok).Find(&workOrderList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, workOrder := range workOrderList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		timeUnix, err := util.ConvertParseLocalUnix(workOrder.ExecTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if timeUnix <= 0 || err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			zaplog.Error("crontab", zap.Any("GenerateWorkOrder", err), zap.Any("execTime", workOrder.ExecTime)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		execTime := time.Now().Unix() - timeUnix 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		task := model.NewTaskWorkOrderPayload(workOrder.Id, time.Duration(execTime)*time.Second) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		zaplog.Info("GenerateWorkOrder", zap.Any("workOrder", workOrder), zap.Any("task", task)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if _, err = e.AsynqClient.CtxEnqueue(context.Background(), task); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			zaplog.Error("PushMessage CtxEnqueue", zap.Any("Err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// GenerateCalendarBySameTimePlan 生成同期计划工作单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (e *Entry) GenerateCalendarBySameTimePlan(cowList []*model.Cow, sameTime *model.SameTime) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// GenerateCalendarBySameTimePlan 生成同期计划的牛只 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (e *Entry) GenerateCalendarBySameTimePlan(cowList []*model.Cow, sameTime *model.SameTime) (int32, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(cowList) <= 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 0, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	cowSameTimeList := make([]*model.SameTimeCow, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	newCowList := make([]*model.Cow, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, cow := range cowList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		newCowSameTime, err := e.createNewCowSameTime(cow, sameTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			zaplog.Error("crontab", zap.Any("GenerateCalendarBySameTimePlan", err), zap.Any("cow", cow)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if ok := e.IsExistSameTimeCow(cow, sameTime); ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			zaplog.Info("GenerateCalendarBySameTimePlan", zap.Any("sameTime", sameTime), zap.Any("cow", cow)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		cowSameTimeList = append(cowSameTimeList, newCowSameTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		newCowList = append(newCowList, cow) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	calendarName := backend.CalendarTypeMap()[pasturePb.CalendarType_Immunisation] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	workOrderCalendarList := make([]*model.WorkOrderCalendar, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	calendarList := make([]*model.Calendar, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	newSameTimeCowDetailList := make([]*model.SameTimeCowDetail, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(sameTime.CollateNodes) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		collateNodes := make([]*pasturePb.CollateNode, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var _ = json.Unmarshal([]byte(sameTime.CollateNodes), &collateNodes) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -69,69 +43,59 @@ func (e *Entry) GenerateCalendarBySameTimePlan(cowList []*model.Cow, sameTime *m 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				showDay = nowTime.Add(time.Hour * 24 * time.Duration(collateNode.NextNodeDay)).Format(model.LayoutDate2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			histCount := e.GetTowardSameTimeCowSum(sameTime.Id, showDay) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			workOrderCalendarList = append(workOrderCalendarList, &model.WorkOrderCalendar{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			calendarName := backend.CalendarTypeMap()[pasturePb.CalendarType_PG] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			calendarType := pasturePb.CalendarType_PG 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if collateNode.SameTimeType == pasturePb.SameTimeType_RnGH { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				calendarName = backend.CalendarTypeMap()[pasturePb.CalendarType_RnGH] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				calendarType = pasturePb.CalendarType_RnGH 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if collateNode.SameTimeType == pasturePb.SameTimeType_TAI { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				calendarName = backend.CalendarTypeMap()[pasturePb.CalendarType_Mating] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				calendarType = pasturePb.CalendarType_Mating 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			histCount := e.GetTowardSameTimeCowSum(sameTime.Id, collateNode.SameTimeType) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			calendarList = append(calendarList, &model.Calendar{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				Name:         calendarName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				CalendarType: pasturePb.CalendarType_Immunisation, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				Count:        int32(len(cowSameTimeList)) + int32(histCount), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				CalendarType: calendarType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Count:        int32(len(newCowList)) + int32(histCount), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				ShowDay:      showDay, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				IsShow:       pasturePb.IsShow_Ok, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			newSameTimeCowDetailList = append( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				newSameTimeCowDetailList, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				model.NewSameTimeCowDetailList(newCowList, sameTime.Id, showDay, collateNode.SameTimeType)..., 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	newSameTimeCowList := model.NewSameTimeCowList(newCowList, sameTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err := e.DB.Transaction(func(tx *gorm.DB) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		// 创建新的牛只同期计划详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err := tx.Create(cowSameTimeList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 创建牛只同期日历表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err := tx.Create(calendarList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		for _, v := range workOrderCalendarList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err := tx.Model(&model.WorkOrderCalendar{}).Where(map[string]interface{}{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				"calendar_type": v.CalendarType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				"show_day":      v.ShowDay, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}).Assign(map[string]interface{}{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				"name":          v.Name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				"calendar_type": v.CalendarType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				"count":         v.Count, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				"show_day":      v.ShowDay, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				"is_show":       v.IsShow, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}).FirstOrCreate(&model.Pen{}).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 创建牛只同期总表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err := tx.Create(newSameTimeCowList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err := tx.Create(newSameTimeCowDetailList).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 0, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return int32(len(newCowList)), nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (e *Entry) createNewCowSameTime(cow *model.Cow, sameTime *model.SameTime) (*model.SameTimeCow, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	cowSameTime := &model.SameTimeCow{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err := e.DB.Where("cow_id = ?", cow.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("lact = ?", cow.Lact). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("same_time_id = ?", sameTime.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		First(cowSameTime).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return &model.SameTimeCow{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				CowId:      cow.Id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				SameTimeId: sameTime.Id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				Status:     pasturePb.SameTimeStatus_No_Start, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				StartAt:    time.Now().Unix(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				EndAt:      0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			zaplog.Error("crontab", zap.Error(err), zap.Any("GenerateCalendarBySameTimePlan", "error"), zap.Any("cow", cow.Id), zap.Any("lact", cow.Lact)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return nil, xerr.WithStack(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return cowSameTime, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (e *Entry) getWorkOrderCalendar(name string) []*model.WorkOrderCalendar { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	res := make([]*model.WorkOrderCalendar, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (e *Entry) getWorkOrderCalendar(name string) []*model.Calendar { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	res := make([]*model.Calendar, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err := e.DB.Where("name = ?", name). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Where("is_show = ?", pasturePb.IsShow_Ok). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Find(&res).Error; err != nil { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -141,20 +105,14 @@ func (e *Entry) getWorkOrderCalendar(name string) []*model.WorkOrderCalendar { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // GetTowardSameTimeCowSum 获取历史未打激素牛只总数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (e *Entry) GetTowardSameTimeCowSum(sameTimeId int64, showDay string) int64 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (e *Entry) GetTowardSameTimeCowSum(sameTimeId int64, sameTimeType pasturePb.SameTimeType_Kind) int64 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	res := int64(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err := e.DB.Model(&model.SameTimeCow{}). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("status = ?", pasturePb.IsShow_Ok). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err := e.DB.Model(&model.SameTimeCowDetail{}). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Where("status = ?", pasturePb.IsShow_No). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Where("same_time_id = ?", sameTimeId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("show_day = ?", showDay). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Where("same_time_type = ?", sameTimeType). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Count(&res).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		zaplog.Error("GetTowardSameTimeCowSum", zap.Any("err", err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return res 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// PregnancyCheck 妊娠期检查 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (e *Entry) PregnancyCheck() error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 |