| 
					
				 | 
			
			
				@@ -8,7 +8,6 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"ColdVerify_local/models/VerifyTemplate" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"fmt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	beego "github.com/beego/beego/v2/server/web" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	"github.com/beego/beego/v2/server/web/context" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"math" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"net/http" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"sort" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -46,114 +45,18 @@ func (c *TaskDataHandleController) SSE_Automatically_add_missing_terminal() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, class_ := range DeviceClassList_r { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		_, cnt := Task.Read_TaskData_ById_List(Task_r.T_task_id, class_.T_sn, class_.T_id, "", "", 0, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if cnt == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "找到" + class_.T_id + class_.T_remark + " 自检探头"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// 获取 备注 下面关联设备,数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			var DeviceClassListT_remark_r_list_MAX int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			DeviceClassListT_remark_r_list_MAX = 0 //最大值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			DeviceClassListT_remark_r := Device.Read_DeviceClassList_List_id_T_remark(class_.T_class, class_.T_remark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			for _, DeviceClassListT_remark_r_list := range DeviceClassListT_remark_r { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				_, cnt = Task.Read_TaskData_ById_List(Task_r.T_task_id, DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, "", "", 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				logs.Println(DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, "数量:", cnt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if DeviceClassListT_remark_r_list_MAX < cnt { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					DeviceClassListT_remark_r_list_MAX = cnt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// 筛选 符合的数量 终端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			SN_List_sn := 9 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			SN_List_s := "" // 2023282551724643,003|2023282534778895,004| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			SN_List_xn := 9 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			SN_List_x := "" // 2023282551724643,003|2023282534778895,004| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			SN_List := "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			//SN_List_num := 0 // 数量  只能两个 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			CopyTime := ""  //复制的起点 2025-01-07 15:18:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			StartTime := "" // 2025-01-07 15:18:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			EndTime := ""   //2025-01-07 21:17:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			for _, DeviceClassListT_remark_r_list := range DeviceClassListT_remark_r { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				List_data, cnt := Task.Read_TaskData_ById_List(Task_r.T_task_id, DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, "", "", 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if len(List_data) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					//lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: DeviceClassListT_remark_r_list.T_id+"没有找到对应数据!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if DeviceClassListT_remark_r_list_MAX == cnt { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					logs.Println(DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, "数量:", cnt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					CopyTime = List_data[len(List_data)-1].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					StartTime = List_data[len(List_data)-1].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					EndTime = List_data[0].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					absc := int(math.Abs(float64(lib.To_int(DeviceClassListT_remark_r_list.T_id) - lib.To_int(class_.T_id)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if absc < SN_List_sn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						SN_List_s = DeviceClassListT_remark_r_list.T_sn + "," + DeviceClassListT_remark_r_list.T_id + "|" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						SN_List_sn = absc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if absc < SN_List_xn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						SN_List_x = DeviceClassListT_remark_r_list.T_sn + "," + DeviceClassListT_remark_r_list.T_id + "|" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						SN_List_xn = absc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					//SN_List_num++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					//if SN_List_num >= 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					//	break // 数量  只能两个 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			logs.Println("复制参数:", SN_List, CopyTime, StartTime, EndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if len(SN_List_x) == 0 || len(SN_List_s) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "[" + class_.T_remark + "]中没有找到 至少2条 完整可用数据"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			SN_List = SN_List_s + SN_List_x 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: class_.T_sn + "|" + class_.T_id + "开始平均复制到" + SN_List}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// 开始平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			CopySN := class_.T_sn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			CopyID := class_.T_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			copyTime, _ := lib.TimeStrToTime(CopyTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			endTime, _ := lib.TimeStrToTime(EndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			startTime, _ := lib.TimeStrToTime(StartTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// 时间间隔 s 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			T_saveT := 60 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			CopyEndTime := copyTime.Add(endTime.Sub(startTime)).Format("2006-01-02 15:04:05") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			SN_List_Split := strings.Split(strings.Trim(SN_List, "|"), "|") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			sn_id1 := strings.Split(SN_List_Split[0], ",") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			sn1, id_str1 := sn_id1[0], sn_id1[1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			sn_id2 := strings.Split(SN_List_Split[1], ",") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			sn2, id_str2 := sn_id2[0], sn_id2[1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			List1, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn1, id_str1, StartTime, EndTime, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			List2, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn2, id_str2, StartTime, EndTime, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			num := len(List1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if len(List2) < len(List1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				num = len(List2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			ct := copyTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			var valueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			for i := 0; i < num; i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if List1[i].T_time != List2[i].T_time { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: fmt.Sprintf("%s【%s】、%s【%s】时间不一致", List1[i].T_id, List1[i].T_time, List2[i].T_id, List2[i].T_time)}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				T_t := (List1[i].T_t + List2[i].T_t) / 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				T_rh := (List1[i].T_rh + List2[i].T_rh) / 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				valueStrings = append(valueStrings, fmt.Sprintf("('%s','%s',%v,%v,'%s')", CopySN, CopyID, T_t, T_rh, ct.Format("2006-01-02 15:04:05"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				ct = ct.Add(time.Second * time.Duration(T_saveT)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, CopySN, CopyID, CopyTime, CopyEndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			err = Task.Batch_Adds_TaskData(T_task_id, valueStrings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: fmt.Sprintf("%d/%d", len(valueStrings), len(valueStrings))}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "找到" + class_.T_id + " " + class_.T_remark + " 自检探头"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// -----------开始平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			device := Device.DeviceClassList{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_class:  class_.T_class, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_id:     class_.T_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_sn:     class_.T_sn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_remark: class_.T_remark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.SetAdjacentDeviceAVGTaskData(T_task_id, device, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// -----------开始平均复制到结束 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -182,106 +85,103 @@ func (c *TaskDataHandleController) SSE_Automatically_add_missing_data() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 时间间隔 s 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_saveT := 60 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 获取 备注 下面关联设备,数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var Devicedata_list_MAX int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Devicedata_list_MAX = 0 //最大值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	DeviceClassList_list := Device.Read_DeviceClassList_List_id_By_Terminal(Task_r.T_class, false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, DeviceClassListT_remark_r_list := range DeviceClassList_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		_, cnt := Task.Read_TaskData_ById_List(Task_r.T_task_id, DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, "", "", 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if Devicedata_list_MAX < cnt { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Devicedata_list_MAX = cnt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 分组统计每个sn的数据数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	snList := Device.JoinDeviceClassListSnToString(DeviceClassList_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	TaskData_Total_GroupBySnId := Task.Read_TaskData_Total_GroupBySnId(Task_r.T_task_id, snList, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(TaskData_Total_GroupBySnId) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: "暂无测点需要自检!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Devicedata_list_MAX := TaskData_Total_GroupBySnId[0].Total 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	TaskData_Total_GroupBySnId_Map := make(map[string]int64) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, v := range TaskData_Total_GroupBySnId { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TaskData_Total_GroupBySnId_Map[v.T_sn] = v.Total 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	startTime, endTime := Task.Read_TaskData_T_time_T_Min_Max(Task_r.T_task_id, TaskData_Total_GroupBySnId[0].T_sn, TaskData_Total_GroupBySnId[0].T_id, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	logs.Println("数据标准数量:", Devicedata_list_MAX) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 选择 数据缺失的终端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, DeviceClassList_r := range DeviceClassList_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		total, ok := TaskData_Total_GroupBySnId_Map[DeviceClassList_r.T_sn] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if !ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 测点自检事再处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: DeviceClassList_r.T_id + " 终端自检数据 , 测点缺失,跳过"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if Devicedata_list_MAX == total { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		list, cnt := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, DeviceClassList_r.T_sn, DeviceClassList_r.T_id, "", "", 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if Devicedata_list_MAX != cnt { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: DeviceClassList_r.T_id + " 终端自检数据 ,自检:" + lib.To_string(Devicedata_list_MAX-cnt) + " "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			for i := 0; i < len(list)-1; i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				current := list[i].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				next := list[i+1].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				ct, _ := time.Parse("2006-01-02 15:04:05", current) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				nt, _ := time.Parse("2006-01-02 15:04:05", next) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				interval := nt.Unix() - ct.Unix() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				//logs.Debug("时间间隔:", interval, "保存时间:", saveTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				//fmt.Println("当前:", current, "下一个:", next) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				// 缺一个时间点 补漏 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if int(interval) == 2*T_saveT { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "找到自检点 " + current + " ~ " + next + " 开始自检"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					t := ct.Add(time.Second * time.Duration(T_saveT)).Format("2006-01-02 15:04:05") //时间临时变量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					ttt := (list[i].T_t + list[i+1].T_t) / 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					trht := (list[i].T_rh + list[i+1].T_rh) / 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					Task.InsertTaskData(Task_r.T_task_id, Task.TaskData_{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						T_sn:   list[i].T_sn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						T_id:   list[i].T_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						T_t:    ttt, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						T_rh:   trht, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						T_time: t, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				// 缺的数据大于一个时间点,执行平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if int(interval) > T_saveT { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "找到自检点 " + current + " ~ " + next + " 开始自检"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					// -------------------- 开始 平均复制到  -------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					// 获取 备注 下面关联设备,数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					var DeviceClassListT_remark_r_list_MAX int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					DeviceClassListT_remark_r_list_MAX = 0 //最大值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					DeviceClassListT_remark_r := Device.Read_DeviceClassList_List_id_T_remark(DeviceClassList_r.T_class, DeviceClassList_r.T_remark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					for _, DeviceClassListT_remark_r_list := range DeviceClassListT_remark_r { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						_, cnt = Task.Read_TaskData_ById_List(Task_r.T_task_id, DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, "", "", 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						logs.Println(DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, "数量:", cnt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						if DeviceClassListT_remark_r_list_MAX < cnt { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							DeviceClassListT_remark_r_list_MAX = cnt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					// 筛选 符合的数量 终端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					//SN_List_sn := 9 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					//SN_List_s := "" // 2023282551724643,003|2023282534778895,004| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					//SN_List_xn := 9 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					//SN_List_x := "" // 2023282551724643,003|2023282534778895,004| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					SN_List := "" // 2023282551724643,003|2023282534778895,004| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					//SN_List_num := 0     // 数量  只能两个 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					CopyTime := current  //复制的起点 2025-01-07 15:18:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					StartTime := current // 2025-01-07 15:18:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					EndTime := next      //2025-01-07 21:17:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					var completeDataDeviceClassList []Device.DeviceClassList 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					for _, DeviceClassList := range DeviceClassListT_remark_r { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						List_data, count := Task.Read_TaskData_ById_List(Task_r.T_task_id, DeviceClassList.T_sn, DeviceClassList.T_id, "", "", 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						if DeviceClassListT_remark_r_list_MAX == count { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							logs.Println(DeviceClassList.T_sn, DeviceClassList.T_id, "数量:", cnt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							EndTime = List_data[0].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							completeDataDeviceClassList = append(completeDataDeviceClassList, DeviceClassList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					logs.Println("复制参数:", SN_List, CopyTime, StartTime, EndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if len(completeDataDeviceClassList) < 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "[" + DeviceClassList_r.T_remark + "] 中没有找到 至少2条 完整可用数据,【请手动处理!】"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					// -----------开始平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					device := Device.DeviceClassList{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						T_id: DeviceClassList_r.T_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						T_sn: DeviceClassList_r.T_sn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					c.SetAdjacentDeviceAVGTaskData(T_task_id, device, completeDataDeviceClassList, StartTime, EndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					// -----------开始平均复制到结束 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: DeviceClassList_r.T_id + " 终端自检数据 ,数据差值:" + lib.To_string(Devicedata_list_MAX-cnt) + " "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 开始结束时间不同,直接执行平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if startTime != list[0].T_time || endTime != list[len(list)-1].T_time { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// -----------开始平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			device := Device.DeviceClassList{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_class:  DeviceClassList_r.T_class, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_id:     DeviceClassList_r.T_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_sn:     DeviceClassList_r.T_sn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_remark: DeviceClassList_r.T_remark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.SetAdjacentDeviceAVGTaskData(T_task_id, device, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// -----------开始平均复制到结束 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for i := 0; i < len(list)-1; i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			current := list[i].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			next := list[i+1].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			ct, _ := time.Parse("2006-01-02 15:04:05", current) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			nt, _ := time.Parse("2006-01-02 15:04:05", next) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			interval := nt.Unix() - ct.Unix() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//logs.Debug("时间间隔:", interval, "保存时间:", saveTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//fmt.Println("当前:", current, "下一个:", next) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 缺一个时间点 补漏 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if int(interval) == 2*T_saveT { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "找到自检时间点 " + current + " ~ " + next + " 开始自检"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				t := ct.Add(time.Second * time.Duration(T_saveT)).Format("2006-01-02 15:04") //时间临时变量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ttt := (list[i].T_t + list[i+1].T_t) / 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				trht := (list[i].T_rh + list[i+1].T_rh) / 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Task.InsertTaskData(Task_r.T_task_id, Task.TaskData_{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					T_sn:   list[i].T_sn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					T_id:   list[i].T_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					T_t:    ttt, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					T_rh:   trht, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					T_time: t, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 缺的数据大于一个时间点,执行平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if int(interval) > T_saveT { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "找到自检时间点 " + current + " ~ " + next + " 开始自检"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// -----------开始平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				device := Device.DeviceClassList{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					T_class:  DeviceClassList_r.T_class, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					T_id:     DeviceClassList_r.T_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					T_sn:     DeviceClassList_r.T_sn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					T_remark: DeviceClassList_r.T_remark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				c.SetAdjacentDeviceAVGTaskData(T_task_id, device, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// -----------开始平均复制到结束 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 平均复制结束,跳出循环 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: "完成!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -308,150 +208,49 @@ func (c *TaskDataHandleController) SSE_Continuously_unchanged_data() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 获取 备注 下面关联设备,数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var Devicedata_list_MAX int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Devicedata_list_MAX = 0 //最大值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	DeviceClassList_list := Device.Read_DeviceClassList_List_id(Task_r.T_class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, DeviceClassListT_remark_r_list := range DeviceClassList_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		_, cnt := Task.Read_TaskData_ById_List(Task_r.T_task_id, DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, "", "", 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if Devicedata_list_MAX < cnt { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Devicedata_list_MAX = cnt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	logs.Println("数据标准数量:", Devicedata_list_MAX) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	DeviceClassList_list := Device.Read_DeviceClassList_List_id_By_Terminal(Task_r.T_class, false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 选择 数据缺失的终端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var DeleteDeviceClassList []Device.DeviceClassList 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, DeviceClassList_r := range DeviceClassList_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		TaskData_list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, DeviceClassList_r.T_sn, DeviceClassList_r.T_id, "", "", 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var t_data float32 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		t_data = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		t_data_num := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		current := "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		next := "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		for i := 0; i < len(TaskData_list)-1; i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if t_data == TaskData_list[i].T_t { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if t_data_num == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					current = TaskData_list[i].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				t_data_num += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if t_data_num > T_timeout { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					next = TaskData_list[i].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					CopyFromPositionAverage(c.Ctx.ResponseWriter, Task_r.T_task_id, DeviceClassList_r.T_class, DeviceClassList_r.T_remark, DeviceClassList_r.T_sn, DeviceClassList_r.T_id, current, next) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				// 清空标致 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				t_data = TaskData_list[i].T_t 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				t_data_num = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(TaskData_list) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: "完成!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// Close the connection 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		maxCount, start, end := Task.FindUnchangedInterval(TaskData_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if maxCount > T_timeout { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func CopyFromPositionAverage(c *context.Response, T_task_id string, T_class int, T_remark, T_sn, T_id, current, next string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	fmt.Println("平均复制到 CopyFromPositionAverage:", T_task_id, T_class, T_remark, T_sn, T_id, current, next) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Task.DeleteTaskDataByTimeRange(T_task_id, DeviceClassList_r.T_sn, DeviceClassList_r.T_id, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			DeleteDeviceClassList = append(DeleteDeviceClassList, DeviceClassList_r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	lib.SseWriteJSON(c, lib.JSONSSE{State: 0, Msg: "找到 " + T_id + " 无数据变化, 时间 " + current + " ~ " + next}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "找到" + DeviceClassList_r.T_id + "  探头, " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				"最多连续 " + lib.To_string(maxCount) + " 分钟没有变化," + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				"开始时间:" + start + " 结束时间:" + end + "," + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				"开始自检"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// -------------------- 开始 平均复制到  -------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 时间间隔 s 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	T_saveT := 60 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 获取 备注 下面关联设备,数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var DeviceClassListT_remark_r_list_MAX int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	DeviceClassListT_remark_r_list_MAX = 0 //最大值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	DeviceClassListT_remark_r := Device.Read_DeviceClassList_List_id_T_remark(T_class, T_remark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, DeviceClassListT_remark_r_list := range DeviceClassListT_remark_r { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		_, cnt := Task.Read_TaskData_ById_List(T_task_id, DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, current, next, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		logs.Println(DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, "数量:", cnt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if DeviceClassListT_remark_r_list_MAX < cnt { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			DeviceClassListT_remark_r_list_MAX = cnt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 筛选 符合的数量 终端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	SN_List := ""        // 2023282551724643,003|2023282534778895,004| 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	SN_List_num := 0     // 数量  只能两个 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	CopyTime := current  //复制的起点 2025-01-07 15:18:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	StartTime := current // 2025-01-07 15:18:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	EndTime := next      //2025-01-07 21:17:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, DeviceClassListT_remark_r_list := range DeviceClassListT_remark_r { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		_, cnt := Task.Read_TaskData_ById_List(T_task_id, DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, current, next, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if DeviceClassListT_remark_r_list_MAX == cnt { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			logs.Println(DeviceClassListT_remark_r_list.T_sn, DeviceClassListT_remark_r_list.T_id, "数量:", cnt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			SN_List += DeviceClassListT_remark_r_list.T_sn + "," + DeviceClassListT_remark_r_list.T_id + "|" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			//CopyTime = List_data[len(List_data)-1].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			//StartTime = List_data[len(List_data)-1].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			//EndTime = List_data[0].T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			SN_List_num++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if SN_List_num >= 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				break // 数量  只能两个 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	logs.Println("复制参数:", SN_List, CopyTime, StartTime, EndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if SN_List_num != 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		lib.SseWriteJSON(c, lib.JSONSSE{State: 2, Msg: "[" + T_remark + "] 中没有找到 至少2条 完整可用数据"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	lib.SseWriteJSON(c, lib.JSONSSE{State: 0, Msg: T_sn + "|" + T_id + "开始平均复制到" + SN_List}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 开始平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	CopySN := T_sn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	CopyID := T_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	copyTime, _ := lib.TimeStrToTime(CopyTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	endTime, _ := lib.TimeStrToTime(EndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	startTime, _ := lib.TimeStrToTime(StartTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	CopyEndTime := copyTime.Add(endTime.Sub(startTime)).Format("2006-01-02 15:04:05") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	SN_List_Split := strings.Split(strings.Trim(SN_List, "|"), "|") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	sn_id1 := strings.Split(SN_List_Split[0], ",") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	sn1, id_str1 := sn_id1[0], sn_id1[1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	sn_id2 := strings.Split(SN_List_Split[1], ",") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	sn2, id_str2 := sn_id2[0], sn_id2[1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	List1, _ := Task.Read_TaskData_ById_List_AES(T_task_id, sn1, id_str1, StartTime, EndTime, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	List2, _ := Task.Read_TaskData_ById_List_AES(T_task_id, sn2, id_str2, StartTime, EndTime, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	num := len(List1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if len(List2) < len(List1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		num = len(List2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	fmt.Println("num:", num) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	ct := copyTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var valueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for TaskData_i := 0; TaskData_i < num; TaskData_i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if List1[TaskData_i].T_time != List2[TaskData_i].T_time { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c, lib.JSONSSE{State: 2, Msg: fmt.Sprintf("%s【%s】、%s【%s】时间不一致", List1[TaskData_i].T_id, List1[TaskData_i].T_time, List2[TaskData_i].T_id, List2[TaskData_i].T_time)}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, class_ := range DeleteDeviceClassList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// -----------开始平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		device := Device.DeviceClassList{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			T_class:  class_.T_class, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			T_id:     class_.T_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			T_sn:     class_.T_sn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			T_remark: class_.T_remark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		T_t := (List1[TaskData_i].T_t + List2[TaskData_i].T_t) / 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		T_rh := (List1[TaskData_i].T_rh + List2[TaskData_i].T_rh) / 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		valueStrings = append(valueStrings, fmt.Sprintf("('%s','%s',%v,%v,'%s')", CopySN, CopyID, T_t, T_rh, ct.Format("2006-01-02 15:04:05"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ct = ct.Add(time.Second * time.Duration(T_saveT)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Task.DeleteTaskDataByTimeRange(T_task_id, CopySN, CopyID, CopyTime, CopyEndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.SetAdjacentDeviceAVGTaskData(T_task_id, device, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// -----------开始平均复制到结束 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	err := Task.Batch_Adds_TaskData(T_task_id, valueStrings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		lib.SseWriteJSON(c, lib.JSONSSE{State: 0, Msg: fmt.Sprintf("%d/%d", len(valueStrings), len(valueStrings))}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: "完成!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// Close the connection 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 绑定点与终端比对  (绑定点数据自检) 终端数据为参照物,绑定点数据在终端偏差±1℃,保温箱为±0.5℃ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -487,6 +286,7 @@ func (c *TaskDataHandleController) SSE_Comparison_between_binding_points_and_ter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 均匀性布点   产品存放区域测点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	部点终端_list := Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "均匀性布点") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	部点终端_list = append(部点终端_list, Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "产品存放区域测点")...) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	部点终端_list = append(部点终端_list, Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "作业出入口总测点")...) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	部点终端_list = Device.DeduplicateById(部点终端_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(部点终端_list) <= 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "均匀性布点,产品存放区域测点 太少了,至少两条以上!"}) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -553,6 +353,11 @@ func (c *TaskDataHandleController) SSE_Comparison_between_binding_points_and_ter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "温湿度绑定点" + lib.To_string(i+1) + " 中找到 " + lib.To_string(len(温湿度绑定点_list)) + "条,只允许 一条数据!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TaskData_Total_GroupBySnId := Task.Read_TaskData_Total_GroupBySnId(Task_r.T_task_id, 温湿度绑定点_list[0].T_sn, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(TaskData_Total_GroupBySnId) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "温湿度绑定点" + lib.To_string(i+1) + " 无数据!请先处理数据!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		fmt.Println("温湿度绑定点"+lib.To_string(i+1)+"数据准备:", 温湿度绑定点_list[0].T_id, 监测终端.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var 温湿度绑定点vga, 监测终端vga, vgaca float64 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -630,6 +435,7 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_cold_and_hot_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 均匀性布点   产品存放区域测点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	部点终端_list := Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "均匀性布点") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	部点终端_list = append(部点终端_list, Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "产品存放区域测点")...) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	部点终端_list = append(部点终端_list, Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "作业出入口总测点")...) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	部点终端_list = Device.DeduplicateById(部点终端_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	开始时间 := "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 开始时间 获取温度下降到第二个低点时间 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -701,7 +507,7 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_cold_and_hot_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// -------  温湿度绑定点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	温湿度绑定点1_list := Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "温湿度绑定点1") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(温湿度绑定点1_list) != 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "温湿度绑定点1 中找到 " + lib.To_string(len(温湿度绑定点1_list)) + "条,布点终端异常!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: "温湿度绑定点1 中找到 " + lib.To_string(len(温湿度绑定点1_list)) + "条,布点终端异常!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	温湿度绑定点2_list_is := true 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -711,6 +517,20 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_cold_and_hot_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		温湿度绑定点2_list = 温湿度绑定点1_list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		温湿度绑定点2_list_is = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	TaskData_Total_GroupBySnId := Task.Read_TaskData_Total_GroupBySnId(T_task_id, fmt.Sprintf("%s|%s", 温湿度绑定点1_list[0].T_sn, 温湿度绑定点2_list[0].T_sn), 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(TaskData_Total_GroupBySnId) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "温湿度绑定点 无数据"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, v := range TaskData_Total_GroupBySnId { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if v.Total == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "温湿度绑定点[" + v.T_id + "] 无数据"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	温湿度绑定点1vga := Task.Read_TaskData_AVG(T_task_id, 温湿度绑定点1_list[0].T_sn, 温湿度绑定点1_list[0].T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	温湿度绑定点2vga := Task.Read_TaskData_AVG(T_task_id, 温湿度绑定点2_list[0].T_sn, 温湿度绑定点2_list[0].T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -895,6 +715,7 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 均匀性布点   产品存放区域测点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	部点终端_list := Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "均匀性布点") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	部点终端_list = append(部点终端_list, Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "产品存放区域测点")...) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	部点终端_list = append(部点终端_list, Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "作业出入口总测点")...) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	部点终端_list = Device.DeduplicateById(部点终端_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(部点终端_list) <= 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "均匀性布点,产品存放区域测点 太少了,至少两条以上!"}) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -940,13 +761,6 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		T_min  float64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		T_diff float64 // 最大最小值差异 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var AVGClassList_r []AVGClassList 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, i2 := range 部点终端_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		T_max := Task.Read_TaskData_max(T_task_id, i2.T_sn, i2.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		T_min := Task.Read_TaskData_min(T_task_id, i2.T_sn, i2.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		AVGClassList_r = append(AVGClassList_r, AVGClassList{T_sn: i2.T_sn, T_id: i2.T_id, T_max: T_max, T_min: T_min, T_diff: T_max - T_min}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	fmt.Println("AVGClassList_r:", AVGClassList_r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	fmt.Println("数据准备:", 开始时间, 结束时间, 温度控制范围最小值, 温度控制范围最高值) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -954,50 +768,44 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "--- 进行处理 数据!---"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: fmt.Sprintf("开始时间:%s 结束时间:%s", 开始时间, 结束时间)}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, AVGClassList_i := range AVGClassList_r { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var vgaca float64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if AVGClassList_i.T_max > 温度控制范围最高值 && AVGClassList_i.T_min < 温度控制范围最小值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var AVGClassList_r []AVGClassList 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, i2 := range 部点终端_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		T_max := Task.Read_TaskData_max(T_task_id, i2.T_sn, i2.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		T_min := Task.Read_TaskData_min(T_task_id, i2.T_sn, i2.T_id, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		AVGClassList_r = append(AVGClassList_r, AVGClassList{T_sn: i2.T_sn, T_id: i2.T_id, T_max: T_max, T_min: T_min, T_diff: T_max - T_min}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// 压缩 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			diff := RoundToDecimal(AVGClassList_i.T_max-AVGClassList_i.T_min, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// 获取压缩度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			compress := RoundToDecimal((温度控制范围最高值-温度控制范围最小值-0.4)/diff, 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// 压缩 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Task.UpdateTaskDataTemperatureAndHumidityByGeometric(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", compress, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// 向上偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			vgaca = RoundToDecimal(温度控制范围最小值-AVGClassList_i.T_min*compress, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, AVGClassList_i := range AVGClassList_r { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if AVGClassList_i.T_max < 温度控制范围最高值 && AVGClassList_i.T_min > 温度控制范围最小值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "进行处理 数据!" + lib.To_string(AVGClassList_i.T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 最大值:" + lib.To_string(AVGClassList_i.T_max) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 最小值:" + lib.To_string(AVGClassList_i.T_min) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 数据偏差:" + lib.To_string(vgaca) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 压缩:" + lib.To_string(compress) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 向上偏移:" + lib.To_string(RoundToDecimal(vgaca+0.1, 1)) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var vgaca float64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", RoundToDecimal(vgaca+0.1, 1), 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (AVGClassList_i.T_max - AVGClassList_i.T_min) > (温度控制范围最高值 - 温度控制范围最小值 - 0.2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (AVGClassList_i.T_max - AVGClassList_i.T_min) > (温度控制范围最高值 - 温度控制范围最小值 - 0.4) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 压缩 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			diff := RoundToDecimal(AVGClassList_i.T_max-AVGClassList_i.T_min, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 获取压缩度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			compress := RoundToDecimal((温度控制范围最高值-温度控制范围最小值-0.4)/diff, 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			compress := RoundToDecimal((温度控制范围最高值-温度控制范围最小值-0.6)/diff, 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 压缩 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Task.UpdateTaskDataTemperatureAndHumidityByGeometric(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", compress, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			T_max_compress := RoundToDecimal(AVGClassList_i.T_max*compress, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			T_min_compress := RoundToDecimal(AVGClassList_i.T_min*compress, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 判断压缩后是否在 温度控制范围最小值-温度控制范围最高值范围内 不做处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if AVGClassList_i.T_max*compress > 温度控制范围最高值 && AVGClassList_i.T_min*compress < 温度控制范围最小值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if T_max_compress <= RoundToDecimal(温度控制范围最高值-0.1, 1) && T_min_compress >= RoundToDecimal(温度控制范围最小值+0.1, 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "进行处理 数据!" + lib.To_string(AVGClassList_i.T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 最大值:" + lib.To_string(AVGClassList_i.T_max) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 最小值:" + lib.To_string(AVGClassList_i.T_min) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					" 压缩:" + lib.To_string(fmt.Sprintf("%.2f", compress)) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					" 压缩后最大值:" + lib.To_string(fmt.Sprintf("%.2f", AVGClassList_i.T_max*compress)) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					" 压缩后最小值:" + lib.To_string(fmt.Sprintf("%.2f", AVGClassList_i.T_min*compress)) + "℃  "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 压缩:" + lib.To_string(compress) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 压缩后最大值:" + lib.To_string(T_max_compress) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 压缩后最小值:" + lib.To_string(T_min_compress) + "℃  "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 压缩后仍高于 温度控制范围最高值,向下偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if AVGClassList_i.T_max*compress > 温度控制范围最高值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				vgaca = RoundToDecimal(AVGClassList_i.T_max*compress-温度控制范围最高值, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if T_max_compress >= 温度控制范围最高值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				vgaca = RoundToDecimal(T_max_compress-温度控制范围最高值+0.1, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "进行处理 数据!" + lib.To_string(AVGClassList_i.T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 最大值:" + lib.To_string(AVGClassList_i.T_max) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 最小值:" + lib.To_string(AVGClassList_i.T_min) + "℃  " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1005,15 +813,15 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 压缩后最大值:" + lib.To_string(AVGClassList_i.T_max*compress) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 压缩后最小值:" + lib.To_string(AVGClassList_i.T_min*compress) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 数据偏差:" + lib.To_string(vgaca) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					" 向下偏移:" + lib.To_string(RoundToDecimal(vgaca+0.1, 1)) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 向下偏移:" + lib.To_string(vgaca) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", -RoundToDecimal(vgaca+0.1, 1), 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", -vgaca, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 压缩后仍低于 温度控制范围最小值,向上偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if AVGClassList_i.T_min*compress < 温度控制范围最小值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if T_min_compress <= 温度控制范围最小值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				// 向上偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				vgaca = RoundToDecimal(温度控制范围最小值-AVGClassList_i.T_min*compress, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				vgaca = RoundToDecimal(温度控制范围最小值-AVGClassList_i.T_min*compress+0.1, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "进行处理 数据!" + lib.To_string(AVGClassList_i.T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 最大值:" + lib.To_string(AVGClassList_i.T_max) + "℃  " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1022,33 +830,34 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 压缩后最大值:" + lib.To_string(AVGClassList_i.T_max*compress) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 压缩后最小值:" + lib.To_string(AVGClassList_i.T_min*compress) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 数据偏差:" + lib.To_string(vgaca) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					" 向上偏移:" + lib.To_string(RoundToDecimal(vgaca+0.1, 1)) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 向上偏移:" + lib.To_string(vgaca) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", RoundToDecimal(vgaca+0.1, 1), 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", vgaca, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		// 向下偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if AVGClassList_i.T_max > 温度控制范围最高值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			vgaca = RoundToDecimal(AVGClassList_i.T_max-温度控制范围最高值, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "进行处理 数据!" + lib.To_string(AVGClassList_i.T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 最大值:" + lib.To_string(AVGClassList_i.T_max) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 最小值:" + lib.To_string(AVGClassList_i.T_min) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 数据偏差:" + lib.To_string(vgaca) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 向下偏移:" + lib.To_string(RoundToDecimal(vgaca+0.1, 1)) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// 偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", -RoundToDecimal(vgaca+0.1, 1), 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if AVGClassList_i.T_min < 温度控制范围最小值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			vgaca = RoundToDecimal(温度控制范围最小值-AVGClassList_i.T_min, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "进行处理 数据!" + lib.To_string(AVGClassList_i.T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 最大值:" + lib.To_string(AVGClassList_i.T_max) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 最小值:" + lib.To_string(AVGClassList_i.T_min) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 数据偏差: " + lib.To_string(vgaca) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				" 向上偏移:" + lib.To_string(RoundToDecimal(vgaca+0.1, 1)) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", RoundToDecimal(vgaca+0.1, 1), 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 向下偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if AVGClassList_i.T_max >= 温度控制范围最高值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				vgaca = RoundToDecimal(AVGClassList_i.T_max-温度控制范围最高值+0.1, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "进行处理 数据!" + lib.To_string(AVGClassList_i.T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 最大值:" + lib.To_string(AVGClassList_i.T_max) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 最小值:" + lib.To_string(AVGClassList_i.T_min) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 数据偏差:" + lib.To_string(vgaca) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 向下偏移:" + lib.To_string(vgaca) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", -vgaca, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if AVGClassList_i.T_min <= 温度控制范围最小值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				vgaca = RoundToDecimal(温度控制范围最小值-AVGClassList_i.T_min+0.1, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "进行处理 数据!" + lib.To_string(AVGClassList_i.T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 最大值:" + lib.To_string(AVGClassList_i.T_max) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 最小值:" + lib.To_string(AVGClassList_i.T_min) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 数据偏差: " + lib.To_string(vgaca) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 向上偏移:" + lib.To_string(vgaca) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", vgaca, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1060,9 +869,40 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 获取相邻2个终端值平均复制到 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (c *TaskDataHandleController) SetAdjacentDeviceAVGTaskData(T_task_id string, device Device.DeviceClassList, data []Device.DeviceClassList, StartTime, EndTime string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (c *TaskDataHandleController) SetAdjacentDeviceAVGTaskData(T_task_id string, device Device.DeviceClassList, StartTime, EndTime string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	DeviceClassListT_remark_r := Device.Read_DeviceClassList_List_id_T_remark(device.T_class, device.T_remark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 分组统计每个sn的数据数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	snList := Device.JoinDeviceClassListSnToString(DeviceClassListT_remark_r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	TaskData_Total_GroupBySnId := Task.Read_TaskData_Total_GroupBySnId(T_task_id, snList, StartTime, EndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(TaskData_Total_GroupBySnId) < 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "[" + device.T_remark + "]中没有找到 至少2条 可用数据"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	twoDevice := getBeforeAndAfter(device.T_id, data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 获取 备注 下面关联设备,数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	DeviceClassListT_remark_r_list_MAX := TaskData_Total_GroupBySnId[0].Total 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	TaskData_Total_GroupBySnId_Map := make(map[string]int64) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, v := range TaskData_Total_GroupBySnId { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TaskData_Total_GroupBySnId_Map[v.T_sn] = v.Total 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var completeDataDeviceClassList []Device.DeviceClassList 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, v := range DeviceClassListT_remark_r { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if TaskData_Total_GroupBySnId_Map[v.T_sn] == DeviceClassListT_remark_r_list_MAX || v.T_sn == device.T_sn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			completeDataDeviceClassList = append(completeDataDeviceClassList, v) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(completeDataDeviceClassList) < 3 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "[" + device.T_remark + "]中没有找到 至少2条 完整可用数据"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	twoDevice := getBeforeAndAfter(device.T_id, completeDataDeviceClassList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	sn1, id_str1 := twoDevice[0].T_sn, twoDevice[0].T_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	sn2, id_str2 := twoDevice[1].T_sn, twoDevice[1].T_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: device.T_sn + "|" + device.T_id + "开始平均复制到" + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1083,11 +923,9 @@ func (c *TaskDataHandleController) SetAdjacentDeviceAVGTaskData(T_task_id string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var valueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for i := 0; i < num; i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if List1[i].T_time != List2[i].T_time { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			c.Data["json"] = lib.JSONS{202, fmt.Sprintf("%s【%s】、%s【%s】时间不一致", List1[i].T_id, List1[i].T_time, List2[i].T_id, List2[i].T_time), nil} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: fmt.Sprintf("%s【%s】、%s【%s】时间不一致", List1[i].T_id, List1[i].T_time, List2[i].T_id, List2[i].T_time)}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			//ct = ct.Add(time.Second * time.Duration(T_saveT)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			//continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		T_t := (List1[i].T_t + List2[i].T_t) / 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		T_rh := (List1[i].T_rh + List2[i].T_rh) / 2 
			 |