| 
					
				 | 
			
			
				@@ -6,6 +6,7 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"ColdVerify_local/models/Device" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"ColdVerify_local/models/Task" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"ColdVerify_local/models/VerifyTemplate" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"errors" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"fmt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	beego "github.com/beego/beego/v2/server/web" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"math" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -321,7 +322,7 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var 开始时间, 结束时间, 趋势时间 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	开始时间, 结束时间, 趋势时间 = c.GetStartTimeAndEndTime(Task_r, 部点终端_sn_list, 温度控制范围最高值) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if 开始时间 == "" || 结束时间 == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 开始时间 或 结束时间 结束时间!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 开始时间 或 结束时间!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -349,10 +350,13 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// ----------获取保留数据------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var valueStrings1, valueStrings2, BWXValueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//var 开空开, 保空开 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//var 开空开驼峰, 保空开驼峰 Task.CalculateHumps_R 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//var valueStrings1, valueStrings2 []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var BWXValueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if Task_r.T_device_type != "X" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		valueStrings1, valueStrings2, 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间 = c.GetRetainData(Task_r, 部点终端_sn_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//valueStrings1, valueStrings2, 开空开, 保空开, 开空开驼峰, 保空开驼峰 = c.GetRetainData(Task_r, 部点终端_list, false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		BWXValueStrings = c.GetBWXRetainData(Task_r, 部点终端_sn_list, 结束时间, 趋势时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -389,6 +393,38 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			T_min_compress := RoundToDecimal(AVGClassList_i.T_min*compress, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 判断压缩后是否在 温度控制范围最小值-温度控制范围最高值范围内 不做处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if T_max_compress <= RoundToDecimal(温度控制范围最高值-0.1, 1) && T_min_compress >= RoundToDecimal(温度控制范围最小值+0.1, 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				参考值 := RoundToDecimal((温度控制范围最高值+温度控制范围最小值)/2, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				中间值 := RoundToDecimal((AVGClassList_i.T_max+AVGClassList_i.T_min)/2, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if 参考值 > 中间值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 向上偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					vgaca = 参考值 - 中间值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", vgaca, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					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(compress) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						" 压缩后最大值:" + lib.To_string(T_max_compress) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						" 压缩后最小值:" + lib.To_string(T_min_compress) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						" 向上偏移:" + lib.To_string(vgaca) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if 参考值 < 中间值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 向下偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					vgaca = 中间值 - 参考值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, AVGClassList_i.T_sn, AVGClassList_i.T_id, "", "", -vgaca, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					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(compress) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						" 压缩后最大值:" + lib.To_string(T_max_compress) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						" 压缩后最小值:" + lib.To_string(T_min_compress) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						" 向下偏移:" + lib.To_string(vgaca) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					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) + "℃  " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -399,7 +435,8 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 压缩后仍高于 温度控制范围最高值,向下偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if T_max_compress >= 温度控制范围最高值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				vgaca = RoundToDecimal(T_max_compress-温度控制范围最高值+0.1, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				vgaca = RoundToDecimal((T_max_compress+T_min_compress)/2-(温度控制范围最高值+温度控制范围最小值)/2, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//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) + "℃  " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -415,7 +452,9 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 压缩后仍低于 温度控制范围最小值,向上偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if T_min_compress <= 温度控制范围最小值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				// 向上偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				vgaca = RoundToDecimal(温度控制范围最小值-AVGClassList_i.T_min*compress+0.1, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				vgaca = RoundToDecimal((温度控制范围最高值+温度控制范围最小值)/2-(T_max_compress+T_min_compress)/2, 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) + "℃  " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -433,7 +472,8 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 向下偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if AVGClassList_i.T_max >= 温度控制范围最高值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				vgaca = RoundToDecimal(AVGClassList_i.T_max-温度控制范围最高值+0.1, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				vgaca = RoundToDecimal(AVGClassList_i.T_max-温度控制范围最高值+0.2, 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) + "℃  " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -444,7 +484,7 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if AVGClassList_i.T_min <= 温度控制范围最小值 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				vgaca = RoundToDecimal(温度控制范围最小值-AVGClassList_i.T_min+0.1, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				vgaca = RoundToDecimal(温度控制范围最小值-AVGClassList_i.T_min+0.2, 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) + "℃  " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -458,7 +498,8 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// ----------恢复保留数据------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if Task_r.T_device_type != "X" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		c.SaveRetainData(Task_r, 部点终端_list, valueStrings1, valueStrings2, 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//c.SaveRetainData(Task_r, 部点终端_list, valueStrings1, valueStrings2, 开空开, 保空开, 开空开驼峰, 保空开驼峰, 温度控制范围最高值, 60) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.SaveBWXRetainData(Task_r, 部点终端_list, BWXValueStrings, 结束时间, 趋势时间, 60) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -515,15 +556,18 @@ func (c *TaskDataHandleController) SSE_Comparison_between_binding_points_and_ter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var 开始时间, 结束时间, 趋势时间 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	开始时间, 结束时间, 趋势时间 = c.GetStartTimeAndEndTime(Task_r, 部点终端_sn_list, 温度控制范围最高值) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if 开始时间 == "" || 结束时间 == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 开始时间 或 结束时间 结束时间!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 开始时间 或 结束时间!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// ----------获取保留数据------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var valueStrings1, valueStrings2, BWXValueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var 开空开, 保空开 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var 开空开驼峰, 保空开驼峰 Task.CalculateHumps_R 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var BWXValueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var valueStrings1, valueStrings2 []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if Task_r.T_device_type != "X" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		valueStrings1, valueStrings2, 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间 = c.GetRetainData(Task_r, 部点终端_sn_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		valueStrings1, valueStrings2, 开空开, 保空开, 开空开驼峰, 保空开驼峰 = c.GetRetainData(Task_r, 部点终端_list, true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		BWXValueStrings = c.GetBWXRetainData(Task_r, 部点终端_sn_list, 结束时间, 趋势时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -618,8 +662,12 @@ func (c *TaskDataHandleController) SSE_Comparison_between_binding_points_and_ter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 获取监测终端和绑定点的平均值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		目标温湿度绑定点vga, 目标温湿度绑定点2vga, isExist := findBindingPointsOptimalAdjustment(监测终端vga, 监测终端2vga, 温湿度绑定点vga, 温湿度绑定点2vga, T_deviation) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		目标温湿度绑定点vga = RoundToDecimal(目标温湿度绑定点vga, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		目标温湿度绑定点2vga = RoundToDecimal(目标温湿度绑定点2vga, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if !isExist { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 最优 温湿度绑定点1|温湿度绑定点2| 调整值!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "监测终端01 平均值" + lib.To_string(监测终端vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				"监测终端02 平均值" + lib.To_string(监测终端2vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				"未找到 最优 温湿度绑定点1、温湿度绑定点2 调整值!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "监测终端01 平均值" + lib.To_string(监测终端vga) + "℃ " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -649,13 +697,13 @@ func (c *TaskDataHandleController) SSE_Comparison_between_binding_points_and_ter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			T_min := Task.Read_TaskData_min(T_task_id, 温湿度绑定点2.T_sn, 温湿度绑定点2.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 平均值向下偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if 温湿度绑定点vga > RoundToDecimal(目标温湿度绑定点vga, 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				c.SetAverageShiftedDownward(T_task_id, 温湿度绑定点2.T_id, 0, 目标温湿度绑定点vga, 温湿度绑定点vga, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if 温湿度绑定点2vga > RoundToDecimal(目标温湿度绑定点2vga, 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				c.SetAverageShiftedDownward(T_task_id, 温湿度绑定点2.T_id, 0, 目标温湿度绑定点2vga, 温湿度绑定点2vga, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 平均值向上偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if 温湿度绑定点vga < RoundToDecimal(目标温湿度绑定点vga, 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				c.SetAverageShiftedUpward(T_task_id, 温湿度绑定点2.T_id, 0, 目标温湿度绑定点vga, 温湿度绑定点vga, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if 温湿度绑定点2vga < RoundToDecimal(目标温湿度绑定点2vga, 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				c.SetAverageShiftedUpward(T_task_id, 温湿度绑定点2.T_id, 0, 目标温湿度绑定点2vga, 温湿度绑定点2vga, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -663,7 +711,7 @@ func (c *TaskDataHandleController) SSE_Comparison_between_binding_points_and_ter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// ----------恢复保留数据------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if Task_r.T_device_type != "X" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		c.SaveRetainData(Task_r, 部点终端_list, valueStrings1, valueStrings2, 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.SaveRetainData(Task_r, 部点终端_list, valueStrings1, valueStrings2, 开空开, 保空开, 开空开驼峰, 保空开驼峰, 温度控制范围最高值, 60) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.SaveBWXRetainData(Task_r, 部点终端_list, BWXValueStrings, 结束时间, 趋势时间, 60) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -734,15 +782,18 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_cold_and_hot_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var 开始时间, 结束时间, 趋势时间 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	开始时间, 结束时间, 趋势时间 = c.GetStartTimeAndEndTime(Task_r, 部点终端_sn_list, 温度控制范围最高值) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if 开始时间 == "" || 结束时间 == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 开始时间 或 结束时间 结束时间!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 开始时间 或 结束时间!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// ----------获取保留数据------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var valueStrings1, valueStrings2, BWXValueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var 开空开, 保空开 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var 开空开驼峰, 保空开驼峰 Task.CalculateHumps_R 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var BWXValueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var valueStrings1, valueStrings2 []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if Task_r.T_device_type != "X" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		valueStrings1, valueStrings2, 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间 = c.GetRetainData(Task_r, 部点终端_sn_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		valueStrings1, valueStrings2, 开空开, 保空开, 开空开驼峰, 保空开驼峰 = c.GetRetainData(Task_r, 部点终端_list, true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		BWXValueStrings = c.GetBWXRetainData(Task_r, 部点终端_sn_list, 结束时间, 趋势时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -869,7 +920,7 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_cold_and_hot_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// ----------恢复保留数据------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if Task_r.T_device_type != "X" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		c.SaveRetainData(Task_r, 部点终端_list, valueStrings1, valueStrings2, 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.SaveRetainData(Task_r, 部点终端_list, valueStrings1, valueStrings2, 开空开, 保空开, 开空开驼峰, 保空开驼峰, 温度控制范围最高值, 60) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.SaveBWXRetainData(Task_r, 部点终端_list, BWXValueStrings, 结束时间, 趋势时间, 60) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1026,15 +1077,18 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var 开始时间, 结束时间, 趋势时间 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	开始时间, 结束时间, 趋势时间 = c.GetStartTimeAndEndTime(Task_r, 部点终端_sn_list, 温度控制范围最高值) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if 开始时间 == "" || 结束时间 == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 开始时间 或 结束时间 结束时间!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 开始时间 或 结束时间!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// ----------获取保留数据------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var valueStrings1, valueStrings2, BWXValueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var 开空开, 保空开 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var 开空开驼峰, 保空开驼峰 Task.CalculateHumps_R 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var BWXValueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var valueStrings1, valueStrings2 []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if Task_r.T_device_type != "X" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		valueStrings1, valueStrings2, 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间 = c.GetRetainData(Task_r, 部点终端_sn_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		valueStrings1, valueStrings2, 开空开, 保空开, 开空开驼峰, 保空开驼峰 = c.GetRetainData(Task_r, 部点终端_list, true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		BWXValueStrings = c.GetBWXRetainData(Task_r, 部点终端_sn_list, 结束时间, 趋势时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1067,6 +1121,7 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	温湿度绑定点vga := Task.Read_TaskData_AVG(T_task_id, 温湿度绑定点1.T_sn, 温湿度绑定点1.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	温湿度绑定点vga = RoundToDecimal(温湿度绑定点vga, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if 温湿度绑定点vga == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "温湿度绑定点1 无数据!请先处理数据!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1075,6 +1130,11 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		温湿度绑定点vga = RoundToDecimal(温湿度绑定点vga, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "------ 进行 柜内所有测点|箱内所有测点|均匀性布点|产品存放区域测点 平均值处理 ------"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"测点 平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"数据偏差: " + lib.To_string(RoundToDecimal(math.Abs(originalAvg-温湿度绑定点vga), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"设置:" + lib.To_string(T_deviation) + "℃"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (originalAvg >= 温湿度绑定点vga && originalAvg <= 温湿度绑定点vga+T_deviation) || (originalAvg <= 温湿度绑定点vga && originalAvg >= 温湿度绑定点vga-T_deviation) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				"温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1085,8 +1145,13 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 平均值最低点向上偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if originalAvg < 温湿度绑定点vga-T_deviation { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				k := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				for originalAvg < 温湿度绑定点vga-T_deviation { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if k == len(部点终端_sn_list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// 调整所有平均值都不符合要求,直接停止 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "调整所有测点平均值后均不符合要求!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					TaskData_Average_GroupBySnId := Task.Read_TaskData_Average_GroupBySnId(Task_r.T_task_id, snList, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					if len(TaskData_Average_GroupBySnId) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						break 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1094,29 +1159,35 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					Average_L := TaskData_Average_GroupBySnId[len(TaskData_Average_GroupBySnId)-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					T_max := Task.Read_TaskData_max(T_task_id, Average_L.T_sn, Average_L.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					T_min := Task.Read_TaskData_min(T_task_id, Average_L.T_sn, Average_L.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					c.SetAverageShiftedUpward(T_task_id, Average_L.T_id, T_deviation, RoundToDecimal(Average_L.Average+0.1, 1), Average_L.Average, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					c.SetAverageShiftedUpward(T_task_id, Average_L.T_id, T_deviation, RoundToDecimal(温湿度绑定点vga-T_deviation, 1), RoundToDecimal(Average_L.Average, 1), T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						"温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						"测点 平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"数据偏差: " + lib.To_string(math.Abs(originalAvg-温湿度绑定点vga)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						"数据偏差: " + lib.To_string(RoundToDecimal(温湿度绑定点vga-T_deviation-originalAvg, 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						"设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"向上偏移0.1℃"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						"平均值向上偏移0.1℃"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					originalAvg = Task.Read_TaskData_Average(Task_r.T_task_id, snList, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					originalAvg = RoundToDecimal(originalAvg, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					k++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"测点 平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					"数据偏差: " + lib.To_string(RoundToDecimal(math.Abs(originalAvg-温湿度绑定点vga), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					"数据偏差: " + lib.To_string(RoundToDecimal(温湿度绑定点vga-T_deviation-originalAvg, 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"符合要求!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 向下偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if originalAvg > 温湿度绑定点vga+T_deviation { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				l := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				for originalAvg > 温湿度绑定点vga+T_deviation { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if l == len(部点终端_sn_list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// 调整所有平均值都不符合要求,直接停止 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "调整所有测点平均值后均不符合要求!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					// 热点向下偏移到高点范围 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					TaskData_Average_GroupBySnId := Task.Read_TaskData_Average_GroupBySnId(Task_r.T_task_id, snList, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					if len(TaskData_Average_GroupBySnId) == 0 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1127,31 +1198,30 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					T_max := Task.Read_TaskData_max(T_task_id, Average_H.T_sn, Average_H.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					T_min := Task.Read_TaskData_min(T_task_id, Average_H.T_sn, Average_H.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					c.SetAverageShiftedDownward(T_task_id, Average_H.T_id, T_deviation, RoundToDecimal(Average_H.Average-0.1, 1), Average_H.Average, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					c.SetAverageShiftedDownward(T_task_id, Average_H.T_id, T_deviation, RoundToDecimal(温湿度绑定点vga+T_deviation, 1), Average_H.Average, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						"温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						"测点 平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"数据偏差: " + lib.To_string(RoundToDecimal(math.Abs(originalAvg-温湿度绑定点vga), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"向下偏移0.1℃"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						"数据偏差: " + lib.To_string(RoundToDecimal(originalAvg-(温湿度绑定点vga+T_deviation), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						"设置:" + lib.To_string(T_deviation) + "℃"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					originalAvg = Task.Read_TaskData_Average(Task_r.T_task_id, snList, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					originalAvg = RoundToDecimal(originalAvg, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					l++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"测点 平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					"数据偏差: " + lib.To_string(RoundToDecimal(math.Abs(originalAvg-温湿度绑定点vga), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					"数据偏差: " + lib.To_string(RoundToDecimal(originalAvg-(温湿度绑定点vga+T_deviation), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"符合要求!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else if len(温湿度绑定点_list) == 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		温湿度绑定点2vga := Task.Read_TaskData_AVG(T_task_id, 温湿度绑定点2.T_sn, 温湿度绑定点2.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		温湿度绑定点2vga = RoundToDecimal(温湿度绑定点2vga, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if 温湿度绑定点2vga == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "温湿度绑定点2 无数据!请先处理数据!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1160,11 +1230,26 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 获取最优平均值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		目标originalAvg := findAverageOptimalAdjustment(温湿度绑定点vga, 温湿度绑定点2vga, originalAvg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		目标originalAvg = RoundToDecimal(目标originalAvg, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			" 温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			" 温湿度绑定点2 平均值:" + lib.To_string(温湿度绑定点2vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			" 测点 平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			" 最优 平均值" + lib.To_string(目标originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			" 数据偏差: " + lib.To_string(RoundToDecimal(RoundToDecimal(originalAvg-目标originalAvg, 1), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			" 设置:" + lib.To_string(T_deviation) + "℃"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if 目标originalAvg != originalAvg { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 平均值最低点向上偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if originalAvg < 目标originalAvg { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if originalAvg < 目标originalAvg { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				j := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				for originalAvg < 目标originalAvg { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if j == len(部点终端_sn_list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// 调整所有平均值都不符合要求,直接停止 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "调整所有测点平均值后均不符合要求!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					TaskData_Average_GroupBySnId := Task.Read_TaskData_Average_GroupBySnId(Task_r.T_task_id, snList, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					if len(TaskData_Average_GroupBySnId) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						break 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1172,7 +1257,7 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					Average_L := TaskData_Average_GroupBySnId[len(TaskData_Average_GroupBySnId)-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					T_max := Task.Read_TaskData_max(T_task_id, Average_L.T_sn, Average_L.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					T_min := Task.Read_TaskData_min(T_task_id, Average_L.T_sn, Average_L.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					c.SetAverageShiftedUpward(T_task_id, Average_L.T_id, T_deviation, RoundToDecimal(Average_L.Average+0.1, 1), Average_L.Average, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					c.SetAverageShiftedUpward(T_task_id, Average_L.T_id, T_deviation, 目标originalAvg, RoundToDecimal(Average_L.Average, 1), T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						" 温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						" 温湿度绑定点2 平均值:" + lib.To_string(温湿度绑定点2vga) + "℃ " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1180,10 +1265,10 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						" 测点 最优平均值" + lib.To_string(目标originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						" 数据偏差: " + lib.To_string(math.Abs(originalAvg-目标originalAvg)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						" 设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						" 冷点:" + Average_L.T_id + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						" 向上偏移0.1℃"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						" 冷点:" + Average_L.T_id}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					originalAvg = Task.Read_TaskData_Average(Task_r.T_task_id, snList, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					originalAvg = RoundToDecimal(originalAvg, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					j++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1193,12 +1278,20 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 数据偏差: " + lib.To_string(RoundToDecimal(math.Abs(originalAvg-温湿度绑定点vga), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 符合要求!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 向下偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if originalAvg > 目标originalAvg { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				i := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				for originalAvg > 目标originalAvg { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if i == len(部点终端_sn_list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						// 调整所有平均值都不符合要求,直接停止 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "调整所有测点平均值后均不符合要求!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					// 热点向下偏移到高点范围 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					TaskData_Average_GroupBySnId := Task.Read_TaskData_Average_GroupBySnId(Task_r.T_task_id, snList, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					if len(TaskData_Average_GroupBySnId) == 0 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1209,24 +1302,24 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					T_max := Task.Read_TaskData_max(T_task_id, Average_H.T_sn, Average_H.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					T_min := Task.Read_TaskData_min(T_task_id, Average_H.T_sn, Average_H.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					c.SetAverageShiftedDownward(T_task_id, Average_H.T_id, T_deviation, RoundToDecimal(Average_H.Average-0.1, 1), Average_H.Average, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					c.SetAverageShiftedDownward(T_task_id, Average_H.T_id, T_deviation, 目标originalAvg, RoundToDecimal(Average_H.Average, 1), T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						" 温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						" 温湿度绑定点2 平均值:" + lib.To_string(温湿度绑定点2vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						" 测点 平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						" 测点 最优平均值" + lib.To_string(目标originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						" 数据偏差: " + lib.To_string(math.Abs(originalAvg-目标originalAvg)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						" 数据偏差: " + lib.To_string(RoundToDecimal(originalAvg-目标originalAvg, 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						" 设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						" 冷点:" + Average_H.T_id + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						" 向下偏移0.1℃"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						" 冷点:" + Average_H.T_id}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					originalAvg = Task.Read_TaskData_Average(Task_r.T_task_id, snList, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					originalAvg = RoundToDecimal(originalAvg, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					i++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 温湿度绑定点1 平均值:" + lib.To_string(温湿度绑定点vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 温湿度绑定点2 平均值:" + lib.To_string(温湿度绑定点2vga) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 测点 平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					" 数据偏差: " + lib.To_string(RoundToDecimal(math.Abs(originalAvg-目标originalAvg), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 数据偏差: " + lib.To_string(RoundToDecimal(RoundToDecimal(originalAvg-目标originalAvg, 1), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					" 符合要求!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1240,7 +1333,6 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	温控传感器绑定点_list := Device.Read_DeviceClassList_List_id_T_remark(Task_r.T_class, "温控传感器绑定点1|温控传感器绑定点2") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(温控传感器绑定点_list) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "没有找到温控传感器绑定点!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for i, classList := range 温控传感器绑定点_list { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1258,26 +1350,16 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 平均值最低点向上偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if 温控传感器绑定点OriginalAvg < originalAvg-T_deviation { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				for 温控传感器绑定点OriginalAvg < originalAvg-T_deviation { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					T_max := Task.Read_TaskData_max(T_task_id, classList.T_sn, classList.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					T_min := Task.Read_TaskData_min(T_task_id, classList.T_sn, classList.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					c.SetAverageShiftedUpward(T_task_id, classList.T_id, T_deviation, RoundToDecimal(温控传感器绑定点OriginalAvg+0.1, 1), 温控传感器绑定点OriginalAvg, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_max := Task.Read_TaskData_max(T_task_id, classList.T_sn, classList.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_min := Task.Read_TaskData_min(T_task_id, classList.T_sn, classList.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				c.SetAverageShiftedUpward(T_task_id, classList.T_id, T_deviation, RoundToDecimal(originalAvg-T_deviation, 1), 温控传感器绑定点OriginalAvg, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "温控传感器绑定点" + lib.To_string(i+1) + " 平均值:" + lib.To_string(温控传感器绑定点OriginalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"测点平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"数据偏差: " + lib.To_string(RoundToDecimal(math.Abs(温控传感器绑定点OriginalAvg-originalAvg), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"平均值向上偏移:0.1℃"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					温控传感器绑定点OriginalAvg = Task.Read_TaskData_Average(Task_r.T_task_id, classList.T_sn, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					温控传感器绑定点OriginalAvg = RoundToDecimal(温控传感器绑定点OriginalAvg, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "温控传感器绑定点" + lib.To_string(i+1) + " 平均值:" + lib.To_string(温控传感器绑定点OriginalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "温控传感器绑定点" + lib.To_string(i+1) + "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 平均值:" + lib.To_string(温控传感器绑定点OriginalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"测点平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					"数据偏差: " + lib.To_string(RoundToDecimal(math.Abs(温控传感器绑定点OriginalAvg-originalAvg), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					"数据偏差: " + lib.To_string(RoundToDecimal(温控传感器绑定点OriginalAvg-(originalAvg-T_deviation), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					"符合要求"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					"温控传感器绑定点平均值向上偏移"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1285,27 +1367,18 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 向下偏移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if 温控传感器绑定点OriginalAvg > originalAvg+T_deviation { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				for 温控传感器绑定点OriginalAvg > originalAvg+T_deviation { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					// 热点向下偏移到高点范围 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					T_max := Task.Read_TaskData_max(T_task_id, classList.T_sn, classList.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					T_min := Task.Read_TaskData_min(T_task_id, classList.T_sn, classList.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					c.SetAverageShiftedDownward(T_task_id, classList.T_id, T_deviation, RoundToDecimal(温控传感器绑定点OriginalAvg-0.1, 1), 温控传感器绑定点OriginalAvg, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 热点向下偏移到高点范围 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_max := Task.Read_TaskData_max(T_task_id, classList.T_sn, classList.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				T_min := Task.Read_TaskData_min(T_task_id, classList.T_sn, classList.T_id, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "温控传感器绑定点" + lib.To_string(i+1) + " 平均值:" + lib.To_string(温控传感器绑定点OriginalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"测点平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"数据偏差: " + lib.To_string(RoundToDecimal(math.Abs(温控传感器绑定点OriginalAvg-originalAvg), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						"平均值向下偏移:0.1℃"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					温控传感器绑定点OriginalAvg = Task.Read_TaskData_Average(Task_r.T_task_id, classList.T_sn, 开始时间, 结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					温控传感器绑定点OriginalAvg = RoundToDecimal(温控传感器绑定点OriginalAvg, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				c.SetAverageShiftedDownward(T_task_id, classList.T_id, T_deviation, RoundToDecimal(originalAvg+T_deviation, 1), 温控传感器绑定点OriginalAvg, T_min, T_max, 温度控制范围最小值, 温度控制范围最高值, "", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "温控传感器绑定点" + lib.To_string(i+1) + " 平均值:" + lib.To_string(温控传感器绑定点OriginalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "温控传感器绑定点" + lib.To_string(i+1) + "" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					" 平均值:" + lib.To_string(温控传感器绑定点OriginalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"测点平均值" + lib.To_string(originalAvg) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					"数据偏差: " + lib.To_string(RoundToDecimal(math.Abs(温控传感器绑定点OriginalAvg-originalAvg), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					"数据偏差: " + lib.To_string(RoundToDecimal(温控传感器绑定点OriginalAvg-(originalAvg+T_deviation), 1)) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					"设置:" + lib.To_string(T_deviation) + "℃" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					"符合要求"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					"温控传感器绑定点平均值向下偏移"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1314,7 +1387,7 @@ func (c *TaskDataHandleController) SSE_Compare_binding_points_with_Average() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// ----------恢复保留数据------------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if Task_r.T_device_type != "X" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		c.SaveRetainData(Task_r, 部点终端_list, valueStrings1, valueStrings2, 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.SaveRetainData(Task_r, 部点终端_list, valueStrings1, valueStrings2, 开空开, 保空开, 开空开驼峰, 保空开驼峰, 温度控制范围最高值, 60) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.SaveBWXRetainData(Task_r, 部点终端_list, BWXValueStrings, 结束时间, 趋势时间, 60) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1353,14 +1426,20 @@ func (c *TaskDataHandleController) SetAverageShiftedDownward(T_task_id, T_id str 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			" 数据偏差:" + lib.To_string(vgaca) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			" 向下偏移:" + lib.To_string(vgaca) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		compress1 := RoundToDecimal((minLimit+0.3-目标avg)/(T_min-originalAvg), 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		compress2 := RoundToDecimal((maxLimit-0.3-目标avg)/(T_max-originalAvg), 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		compress := math.Min(compress1, compress2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if RoundToDecimal(T_max*compress, 1) < maxLimit && RoundToDecimal(T_min*compress, 1) > minLimit { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			vgaca = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			vgaca = RoundToDecimal(目标avg-compress*originalAvg, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var compress float64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		compress, vgaca, err = GetLinearTransformationValue(目标avg, originalAvg, T_min, T_max, minLimit, maxLimit) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "进行处理 数据!" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 测点" + lib.To_string(T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 最大值:" + lib.To_string(T_max) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 最小值:" + lib.To_string(T_min) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 参考平均值:" + lib.To_string(RoundToDecimal(targetAvg, 1)) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 原始平均值:" + lib.To_string(RoundToDecimal(originalAvg, 1)) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 无合法解: 无法满足所有约束条件!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "进行处理 数据!" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			" 测点" + lib.To_string(T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			" 最大值:" + lib.To_string(T_max) + "℃  " + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1382,6 +1461,68 @@ func (c *TaskDataHandleController) SetAverageShiftedDownward(T_task_id, T_id str 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func GetLinearTransformationValue(targetAvg, originalAvg, T_min, T_max, minLimit, maxLimit float64) (float64, float64, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//var vgaca float64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//compress1 := RoundToDecimal((minLimit+0.3-targetAvg)/(T_min-originalAvg), 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//compress2 := RoundToDecimal((maxLimit-0.3-targetAvg)/(T_max-originalAvg), 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//compress := math.Min(compress1, compress2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//if RoundToDecimal(T_max*compress, 1) < RoundToDecimal(maxLimit, 1) && RoundToDecimal(T_min*compress, 1) > RoundToDecimal(minLimit, 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	vgaca = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	vgaca = RoundToDecimal(targetAvg-compress*originalAvg, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//for _, x := range []float64{T_min, T_max} { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	newVal := RoundToDecimal(compress*x+vgaca, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	if newVal < minLimit || newVal > maxLimit { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//		return 0, 0, errors.New("无合法解: 无法满足所有约束条件") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//return compress, vgaca, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	minLimit = RoundToDecimal(minLimit+0.2, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	maxLimit = RoundToDecimal(maxLimit-0.2, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 策略1: 使用最小边界值 (使变换后最小值 = minBound) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	k1 := (targetAvg - minLimit) / (originalAvg - T_min) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	b1 := minLimit - k1*T_min 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	valid1 := true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, x := range []float64{T_min, T_max} { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		newVal := RoundToDecimal(k1*x+b1, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if newVal < minLimit || newVal > maxLimit { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			valid1 = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 策略2: 使用最大边界值 (使变换后最大值 = maxBound),策略1失败时使用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	k2 := float64(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	b2 := float64(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	valid2 := false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if !valid1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		k2 = (maxLimit - targetAvg) / (T_max - originalAvg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		b2 = targetAvg - k2*originalAvg 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		valid2 = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, x := range []float64{T_min, T_max} { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			newVal := RoundToDecimal(k2*x+b2, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if newVal < minLimit || newVal > maxLimit { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				valid2 = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 根据结果选择有效策略 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	switch { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	case valid1: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return k1, b1, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	case valid2: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return k2, b2, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 0, 0, errors.New("无合法解: 无法满足所有约束条件") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 平均值上移 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 targetAvg 参考平均值 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1406,13 +1547,18 @@ func (c *TaskDataHandleController) SetAverageShiftedUpward(T_task_id, T_id strin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			" 数据偏差:" + lib.To_string(vgaca) + "℃ " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			" 向上偏移:" + lib.To_string(vgaca) + "℃ "}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		compress1 := RoundToDecimal((minLimit+0.3-目标avg)/(T_min-originalAvg), 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		compress2 := RoundToDecimal((maxLimit-0.3-目标avg)/(T_max-originalAvg), 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		compress := math.Min(compress1, compress2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if RoundToDecimal(T_max*compress, 1) < maxLimit && RoundToDecimal(T_min*compress, 1) > minLimit { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			vgaca = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			vgaca = RoundToDecimal(目标avg-compress*originalAvg, 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var compress float64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		compress, vgaca, err = GetLinearTransformationValue(目标avg, originalAvg, T_min, T_max, minLimit, maxLimit) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "进行处理 数据!" + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 测点" + lib.To_string(T_id) + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 最大值:" + lib.To_string(T_max) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 最小值:" + lib.To_string(T_min) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 参考平均值:" + lib.To_string(RoundToDecimal(targetAvg, 1)) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 原始平均值:" + lib.To_string(RoundToDecimal(originalAvg, 1)) + "℃  " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				" 无合法解: 无法满足所有约束条件!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "进行处理 数据!" + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1436,26 +1582,82 @@ func (c *TaskDataHandleController) SetAverageShiftedUpward(T_task_id, T_id strin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (c *TaskDataHandleController) GetMetadata(T_task_id, SN, startTime string) (valueStrings []string, endTime string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	list := Task.Read_TaskData_ById_AVG(T_task_id, SN, startTime, "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 获取第一个驼峰结束时间点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	CalculateHumps_list := Task.CalculateHumpsByThreeDots(list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if len(CalculateHumps_list) < 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (c *TaskDataHandleController) GetCalculateHumps(T_task_id string, SN_list []Device.DeviceClassList, startTime, types string) (calculateHumps Task.CalculateHumps_R) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	SN := Device.JoinDeviceClassListSnToString(SN_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var is bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	calculateHumps, is = Task.Redis_CalculateHumps_Get(T_task_id + types) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if !is { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		list := Task.Read_TaskData_ById_AVG(T_task_id, SN, startTime, "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 获取第一个驼峰结束时间点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		CalculateHumps_list := Task.CalculateHumpsByThreeDots(list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(CalculateHumps_list) < 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		calculateHumps = CalculateHumps_list[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Task.Redis_CalculateHumps_Set(T_task_id+types, calculateHumps) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return calculateHumps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (c *TaskDataHandleController) GetMetadata(T_task_id string, SN_list []Device.DeviceClassList, startTime, types string) (valueStrings []string, calculateHumps Task.CalculateHumps_R) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	SN := Device.JoinDeviceClassListSnToString(SN_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var is bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	calculateHumps, is = Task.Redis_CalculateHumps_Get(T_task_id + types) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if !is { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	endTime = CalculateHumps_list[0].End.T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	endTime := calculateHumps.End.T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	data1, _ := Task.Read_TaskData_ById_List_AES(T_task_id, SN, "", startTime, endTime, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, v := range data1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		valueStrings = append(valueStrings, fmt.Sprintf("('%s','%s',%v,%v,'%s')", v.T_sn, v.T_id, v.T_t, v.T_rh, v.T_time)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return valueStrings, endTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return valueStrings, calculateHumps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (c *TaskDataHandleController) GetCalculateHumpsMaps(T_task_id string, SN_list []Device.DeviceClassList, startTime string) map[string]Task.CalculateHumps_R { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var CalculateHumpsMaps = make(map[string]Task.CalculateHumps_R) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	SN := Device.JoinDeviceClassListSnToString(SN_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	allList := Task.Read_TaskData_ById_AVG(T_task_id, SN, startTime, "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 获取第一个驼峰结束时间点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	CalculateHumps_list := Task.CalculateHumpsByThreeDots(allList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(CalculateHumps_list) < 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return CalculateHumpsMaps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, device := range SN_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		list := Task.Read_TaskData_ById_AVG(T_task_id, device.T_sn, startTime, "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//获取第一个驼峰结束时间点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		CalculateHumps := Task.CalculateHumpsByThreeDots(list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(CalculateHumps) < 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			CalculateHumpsMaps[device.T_sn] = CalculateHumps_list[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if CalculateHumps[0].Peak.T_time != CalculateHumps_list[0].Peak.T_time { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			CalculateHumps[0].Peak.T_time = CalculateHumps_list[0].Peak.T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		et1, _ := lib.TimeStrToTime(CalculateHumps_list[0].End.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		et2, _ := lib.TimeStrToTime(CalculateHumps[0].End.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if et1.Before(et2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			CalculateHumps[0].End.T_time = CalculateHumps_list[0].End.T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		CalculateHumpsMaps[device.T_sn] = CalculateHumps[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return CalculateHumpsMaps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 获取保留数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (c *TaskDataHandleController) GetRetainData(Task_r Task.Task, SN string) (valueStrings1, valueStrings2 []string, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	kkkStartTime, kkkEndTime, bkkStartTime, bkkEndTime string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var 开空开, 保空开, 开空开驼峰结束时间, 保空开驼峰结束时间 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (c *TaskDataHandleController) GetRetainData(Task_r Task.Task, SN_list []Device.DeviceClassList, useCache bool) (valueStrings1, valueStrings2 []string, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	kkkStartTime, bkkStartTime string, kkkCalculateHumps, bkkCalculateHumps Task.CalculateHumps_R) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var 开空开, 保空开 string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var 开空开驼峰, 保空开驼峰 Task.CalculateHumps_R 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if Task_r.T_device_type != "X" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		开空开 = VerifyTemplate.Read_VerifyTemplateMapData_T_name(Task_r.T_task_id, Task_r.T_VerifyTemplate_id, "开空开") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if len(开空开) == 0 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1465,48 +1667,191 @@ func (c *TaskDataHandleController) GetRetainData(Task_r Task.Task, SN string) (v 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 开空开/开满开 时间 标签!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		保空开 = VerifyTemplate.Read_VerifyTemplateMapData_T_name(Task_r.T_task_id, Task_r.T_VerifyTemplate_id, "保空开") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if len(保空开) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			保空开 = VerifyTemplate.Read_VerifyTemplateMapData_T_name(Task_r.T_task_id, Task_r.T_VerifyTemplate_id, "保满开") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if len(保空开) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 保空开/保满开 时间 标签!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//保空开 = VerifyTemplate.Read_VerifyTemplateMapData_T_name(Task_r.T_task_id, Task_r.T_VerifyTemplate_id, "保空开") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//if len(保空开) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//	保空开 = VerifyTemplate.Read_VerifyTemplateMapData_T_name(Task_r.T_task_id, Task_r.T_VerifyTemplate_id, "保满开") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//if len(保空开) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到 保空开/保满开 时间 标签!"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//if !useCache { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//	开空开驼峰 = c.GetCalculateHumps(Task_r.T_task_id, SN_list, 开空开, "kkk") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//	保空开驼峰 = c.GetCalculateHumps(Task_r.T_task_id, SN_list, 保空开, "bkk") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//valueStrings1, 开空开驼峰 = c.GetMetadata(Task_r.T_task_id, SN_list, 开空开, "kkk") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//valueStrings2, 保空开驼峰 = c.GetMetadata(Task_r.T_task_id, SN_list, 保空开, "bkk") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		SN := Device.JoinDeviceClassListSnToString(SN_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		data1, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, SN, "", 开空开, "", 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, v := range data1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			valueStrings1 = append(valueStrings1, fmt.Sprintf("('%s','%s',%v,%v,'%s')", v.T_sn, v.T_id, v.T_t, v.T_rh, v.T_time)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		valueStrings1, 开空开驼峰结束时间 = c.GetMetadata(Task_r.T_task_id, SN, 开空开) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		valueStrings2, 保空开驼峰结束时间 = c.GetMetadata(Task_r.T_task_id, SN, 保空开) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return valueStrings1, valueStrings2, 开空开, 开空开驼峰结束时间, 保空开, 保空开驼峰结束时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return valueStrings1, valueStrings2, 开空开, 保空开, 开空开驼峰, 保空开驼峰 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 获取保留数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (c *TaskDataHandleController) SaveRetainData(Task_r Task.Task, SN_list []Device.DeviceClassList, valueStrings1, valueStrings2 []string, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	kkkStartTime, kkkEndTime, bkkStartTime, bkkEndTime string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	kkkStartTime, bkkStartTime string, kkkCalculateHumps, bkkCalculateHumps Task.CalculateHumps_R, maxLimit float64, saveTime int) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(valueStrings1) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		//将开空开/开满开时间开始第一个驼峰 写入原始数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		for _, device := range SN_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, device.T_sn, device.T_id, kkkStartTime, kkkEndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//将开空开/开满开时间开始第一个驼峰 写入原始数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//将 开空开/开满开时间 后时间写入原始数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		SN := Device.JoinDeviceClassListSnToString(SN_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Task.DeleteTaskAllDataByTimeRange(Task_r.T_task_id, SN, kkkStartTime, kkkCalculateHumps.End.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		err = Task.Batch_Adds_TaskData(Task_r.T_task_id, valueStrings1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: fmt.Sprintf("恢复开空开/开满开时间点后驼峰 %s ~ %s 数据 %d/%d", kkkStartTime, kkkEndTime, len(valueStrings1), len(valueStrings1))}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: fmt.Sprintf("恢复 开空开/开满开 时间点后驼峰 %s ~ %s 数据 %d/%d", kkkStartTime, kkkCalculateHumps.End.T_time, len(valueStrings1), len(valueStrings1))}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(valueStrings2) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		//将开空开/开满开时间开始第一个驼峰 写入原始数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		for _, device := range SN_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, device.T_sn, device.T_id, bkkStartTime, bkkEndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		SN := Device.JoinDeviceClassListSnToString(SN_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Task.DeleteTaskAllDataByTimeRange(Task_r.T_task_id, SN, bkkStartTime, bkkCalculateHumps.End.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		err = Task.Batch_Adds_TaskData(Task_r.T_task_id, valueStrings2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: fmt.Sprintf("恢复保空开/保满开时间点后驼峰 %s ~ %s 数据 %d/%d", bkkStartTime, bkkEndTime, len(valueStrings2), len(valueStrings2))}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: fmt.Sprintf("恢复 保空开/保满开 时间点后驼峰 %s ~ %s 数据 %d/%d", kkkStartTime, kkkCalculateHumps.End.T_time, len(valueStrings1), len(valueStrings1))}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//c.SaveRetainDataAndTrend(Task_r, SN_list, valueStrings1, kkkStartTime, kkkCalculateHumps, maxLimit, saveTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//c.SaveRetainDataAndTrend(Task_r, SN_list, valueStrings2, bkkStartTime, bkkCalculateHumps, maxLimit, saveTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 获取保留数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (c *TaskDataHandleController) SaveRetainDataTrend(Task_r Task.Task, SN_list []Device.DeviceClassList, valueStrings1, valueStrings2 []string, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	kkkStartTime, bkkStartTime string, kkkCalculateHumps, bkkCalculateHumps Task.CalculateHumps_R, maxLimit float64, saveTime int) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	c.SaveRetainDataAndTrend(Task_r, SN_list, valueStrings1, kkkStartTime, kkkCalculateHumps, maxLimit, saveTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	c.SaveRetainDataAndTrend(Task_r, SN_list, valueStrings2, bkkStartTime, bkkCalculateHumps, maxLimit, saveTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (c *TaskDataHandleController) SaveRetainDataAndTrend(Task_r Task.Task, SN_list []Device.DeviceClassList, valueStrings1 []string, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	kkkStartTime string, kkkCalculateHumps Task.CalculateHumps_R, maxLimit float64, saveTime int) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(valueStrings1) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//将开空开/开满开时间开始第一个驼峰 写入原始数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		SN := Device.JoinDeviceClassListSnToString(SN_list) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Task.DeleteTaskAllDataByTimeRange(Task_r.T_task_id, SN, kkkStartTime, kkkCalculateHumps.End.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = Task.Batch_Adds_TaskData(Task_r.T_task_id, valueStrings1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: fmt.Sprintf("恢复 开空开/开满开 保空开/保满开 时间点后驼峰 %s ~ %s 数据 %d/%d", kkkStartTime, kkkCalculateHumps.End.T_time, len(valueStrings1), len(valueStrings1))}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		startTimeT, _ := lib.TimeStrToTime(kkkStartTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		startTime := startTimeT.Add(-time.Minute).Format("2006-01-02 15:04") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		endTimeT, _ := lib.TimeStrToTime(kkkCalculateHumps.End.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		endTime := endTimeT.Add(time.Minute).Format("2006-01-02 15:04") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 执行数据平滑 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, v := range SN_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			sn := v.T_sn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			id_str := v.T_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//AllList, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id_str, startTime, kkkCalculateHumps.End.T_time, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var trendTime, declineTrendTime string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			trendTime = kkkCalculateHumps.Peak.T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			declineTrendTime = kkkCalculateHumps.Peak.T_time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "执行数据上升趋势"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if len(trendTime) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id_str, startTime, trendTime, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if len(list) <= 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				first := list[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var last Task.TaskData_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if len(list) > 10 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					last = list[len(list)-2] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					last = list[len(list)-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				current, _ := time.Parse("2006-01-02 15:04", first.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				next, _ := time.Parse("2006-01-02 15:04", last.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				interval := next.Sub(current).Seconds() / float64(saveTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//ttInterval := (last.T_t - first.T_t) / float32(interval) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				trhInterval := (last.T_rh - first.T_rh) / float32(interval) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ttList := generateRisingCurve(float64(first.T_t), float64(last.T_t), int(interval+1)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//tt := first.T_t 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ttrh := first.T_rh 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var valueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				for i := 0; i <= int(interval); i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					//tt += ttInterval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					ttrh += trhInterval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					ttime := current.Format("2006-01-02 15:04") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					valueStrings = append(valueStrings, fmt.Sprintf("('%s','%s',%v,%v,'%s')", first.T_sn, id_str, ttList[i], ttrh, ttime)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					current = current.Add(time.Second * time.Duration(saveTime)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//for current.Unix() <= next.Unix() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//	tt += ttInterval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//	ttrh += trhInterval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//	ttime := current.Format("2006-01-02 15:04") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//	valueStrings = append(valueStrings, fmt.Sprintf("('%s','%s',%v,%v,'%s')", first.T_sn, id_str, tt, ttrh, ttime)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//	current = current.Add(time.Second * time.Duration(saveTime)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, sn, id_str, first.T_time, last.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Task.Batch_Adds_TaskData(Task_r.T_task_id, valueStrings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 0, Msg: "执行数据下降趋势"}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if len(declineTrendTime) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id_str, declineTrendTime, endTime, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if len(list) <= 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if list[len(list)-1].T_t > list[len(list)-2].T_t { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var first Task.TaskData_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if len(list) > 10 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					first = list[1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					first = list[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				last := list[len(list)-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				current, _ := time.Parse("2006-01-02 15:04", first.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				next, _ := time.Parse("2006-01-02 15:04", last.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				interval := next.Sub(current).Seconds() / float64(saveTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//ttInterval := (last.T_t - first.T_t) / float32(interval) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				trhInterval := (last.T_rh - first.T_rh) / float32(interval) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ttList := generateTemperatureCurve(float64(first.T_t), float64(last.T_t), int(interval+1)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//tt := first.T_t 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ttrh := first.T_rh 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var valueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				for i := 0; i <= int(interval); i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					//tt += ttInterval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					ttrh += trhInterval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					ttime := current.Format("2006-01-02 15:04") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					valueStrings = append(valueStrings, fmt.Sprintf("('%s','%s',%v,%v,'%s')", first.T_sn, id_str, ttList[i], ttrh, ttime)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					current = current.Add(time.Second * time.Duration(saveTime)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, sn, id_str, first.T_time, last.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Task.Batch_Adds_TaskData(Task_r.T_task_id, valueStrings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 获取保留数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (c *TaskDataHandleController) GetBWXRetainData(Task_r Task.Task, SN string, endTime, trendTime string) (BWXValueStrings []string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if endTime != trendTime { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		data1, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, SN, "", trendTime, "", 0, 9999) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1517,7 +1862,8 @@ func (c *TaskDataHandleController) GetBWXRetainData(Task_r Task.Task, SN string, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (c *TaskDataHandleController) SaveBWXRetainData(Task_r Task.Task, SN_list []Device.DeviceClassList, BWXValueStrings []string, endTime, trendTime string, saveTime int) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (c *TaskDataHandleController) SaveBWXRetainData(Task_r Task.Task, SN_list []Device.DeviceClassList, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	BWXValueStrings []string, endTime, trendTime string, saveTime int) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if endTime != trendTime && len(BWXValueStrings) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		//将开空开/开满开时间开始第一个驼峰 写入原始数据 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1561,7 +1907,7 @@ func (c *TaskDataHandleController) SaveBWXRetainData(Task_r Task.Task, SN_list [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ttrh := first.T_rh 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			var valueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			for current.Unix() < next.Unix() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			for current.Unix() <= next.Unix() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				tt += ttInterval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				ttrh += trhInterval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				ttime := current.Format("2006-01-02 15:04") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1725,3 +2071,68 @@ func findAverageOptimalAdjustment(A, B, C float64) float64 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return optimalC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func generateTemperatureCurve(startTemp, minTemp float64, steps int) []float64 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if steps <= 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return []float64{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 计算动态参数确保严格递减且高于最低温度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	base := minTemp + 0.1 // 确保所有值高于minTemp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	decayFactor := math.Log((startTemp-base)/(minTemp+0.5-base)) / float64(steps-1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	temperatures := make([]float64, steps) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	prevTemp := startTemp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for i := 0; i < steps; i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 使用指数衰减模型确保严格单调递减 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		temp := base + (startTemp-base)*math.Exp(-decayFactor*float64(i)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 确保严格递减且高于最低温度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if temp >= prevTemp { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			temp = prevTemp - 0.1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if temp <= minTemp { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			temp = minTemp + 0.01 + 0.05*float64(steps-i)/float64(steps) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 保持精度并确保唯一性 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		temp = math.Round(temp*100) / 100 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		temperatures[i] = temp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		prevTemp = temp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return temperatures 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func generateRisingCurve(minTemp, maxTemp float64, steps int) []float64 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if steps <= 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return []float64{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 计算动态参数确保严格递增且低于最高温度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	growthFactor := math.Log((maxTemp-minTemp-0.1)/0.1) / float64(steps-1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	temperatures := make([]float64, steps) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	prevTemp := minTemp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for i := 0; i < steps; i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 使用指数增长模型确保严格单调递增 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		temp := minTemp + (maxTemp-minTemp)*(1-math.Exp(-growthFactor*float64(i))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 确保严格递增且低于最高温度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if temp <= prevTemp { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			temp = prevTemp + 0.1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if temp >= maxTemp { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			temp = maxTemp - 0.01 - 0.05*float64(steps-i-1)/float64(steps) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 保持精度并确保唯一性 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		temp = math.Round(temp*100) / 100 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		temperatures[i] = temp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		prevTemp = temp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return temperatures 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |