| 
					
				 | 
			
			
				@@ -8,10 +8,17 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"ColdVerify_local/logs" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"ColdVerify_local/models/System" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"ColdVerify_local/models/Task" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"errors" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"fmt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"github.com/beego/beego/v2/client/orm" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	beego "github.com/beego/beego/v2/server/web" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/vmihailenco/msgpack/v5" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/xuri/excelize/v2" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"gonum.org/v1/plot" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"gonum.org/v1/plot/plotter" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"gonum.org/v1/plot/vg" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"gonum.org/v1/plot/vg/draw" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"image/color" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"math" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"os" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"strconv" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -112,6 +119,29 @@ func (c *TaskDataController) TaskDataClass_Edit() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	sn, err := Task.Read_TaskData_ByT_id(Task_r.T_task_id, T_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil && !errors.Is(err, orm.ErrNoRows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(sn) > 0 && sn != T_sn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", T_id, sn)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//id, err := Task.Read_TaskData_ByT_sn(Task_r.T_task_id, T_sn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//if err != nil && !errors.Is(err, orm.ErrNoRows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//if len(id) > 0 && id != T_id { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("sn[%s]已被编号[%s]关联,请修改后重试!", T_sn, id)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	err = Task.Update_TaskData_ByT_sn(Task_r.T_task_id, T_sn, T_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -145,7 +175,7 @@ func (c *TaskDataController) TaskDataClass_Del() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	System.Add_UserLogs_T(T_uuid, "本地版-任务分裂", "删除分类数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	System.Add_UserLogs_T(T_uuid, "本地版-任务分类", "删除分类数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	c.ServeJSON() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -177,6 +207,10 @@ func (c *TaskDataController) TaskData_AddS() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_Data_list := strings.Split(T_Data, "?") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	println(len(T_Data_list), "len(T_Data_list)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var T_Data_list_x = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	snMaps := make(map[string]string) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var valueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, v := range T_Data_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 132|132|23.9|72.1|2023-04-30 07:03:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if len(v) < 5 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -184,7 +218,54 @@ func (c *TaskDataController) TaskData_AddS() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		v_list := strings.Split(v, "|") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		id, sn := v_list[1], v_list[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sn1, ok := snMaps[id] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if !ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			snMaps[id] = sn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else if sn1 != sn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", id, sn1)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		t, _ := lib.ReplaceSeconds(v_list[4]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		valueStrings = append(valueStrings, fmt.Sprintf("('%s','%s',%v,%v,'%v')", v_list[0], v_list[1], v_list[2], v_list[3], t)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		T_Data_list_x += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for T_id, T_sn := range snMaps { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sn, err := Task.Read_TaskData_ByT_id(Task_r.T_task_id, T_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil && !errors.Is(err, orm.ErrNoRows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(sn) > 0 && sn != T_sn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", T_id, sn)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		id, err := Task.Read_TaskData_ByT_sn(Task_r.T_task_id, T_sn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil && !errors.Is(err, orm.ErrNoRows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(id) > 0 && id != T_id { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("sn[%s]已被编号[%s]关联,请修改后重试!", T_sn, id)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, v := range T_Data_list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 132|132|23.9|72.1|2023-04-30 07:03:00 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(v) < 5 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			println(v, "len(v) < 5") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		v_list := strings.Split(v, "|") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		t, _ := lib.ReplaceSeconds(v_list[4]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		is := Task.Add_TaskData(Task_r.T_task_id, v_list[0], v_list[1], v_list[2], v_list[3], t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if is { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			T_Data_list_x += 1 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -198,13 +279,113 @@ func (c *TaskDataController) TaskData_AddS() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (c *TaskDataController) TaskData_AddS_Excel() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 获取登录用户的uuid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	T_task_id := c.GetString("T_task_id") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Task_r, err := NatsServer.Read_Task(T_task_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 获取上传的文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	file, _, err := c.GetFile("file") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "文件上传失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 解析 Excel 文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	xlFile, err := excelize.OpenReader(file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "文件解析失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	rows, err := xlFile.GetRows(xlFile.GetSheetName(0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取工作表失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var T_Data_list_x = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	snMaps := make(map[string]string) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var valueStrings []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for k, val := range rows { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 跳过第一行 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if k == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(val) < 5 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			println(val, "len(v) < 5") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		fmt.Println(val) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		id, sn := val[1], val[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sn1, ok := snMaps[id] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if !ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			snMaps[id] = sn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else if sn1 != sn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", id, sn1)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		t, _ := lib.ReplaceSeconds(val[4]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		valueStrings = append(valueStrings, fmt.Sprintf("('%s','%s',%v,%v,'%v')", val[0], val[1], val[2], val[3], t)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		T_Data_list_x += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for T_id, T_sn := range snMaps { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sn, err := Task.Read_TaskData_ByT_id(Task_r.T_task_id, T_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil && !errors.Is(err, orm.ErrNoRows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(sn) > 0 && sn != T_sn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", T_id, sn)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		id, err := Task.Read_TaskData_ByT_sn(Task_r.T_task_id, T_sn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil && !errors.Is(err, orm.ErrNoRows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if len(id) > 0 && id != T_id { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("sn[%s]已被编号[%s]关联,请修改后重试!", T_sn, id)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	_, is := Task.Adds_TaskData(Task_r.T_task_id, valueStrings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if !is { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: 0} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "添加数据"+Task_r.T_name, Task_r.T_task_id+"结果:"+string(T_Data_list_x)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: strconv.Itoa(T_Data_list_x)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 添加- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (c *TaskDataController) TaskData_Add() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 获取登录用户的uuid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_sn := c.GetString("T_sn") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	T_id, _ := c.GetInt("T_id") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	T_id := c.GetString("T_id") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_t, _ := c.GetFloat("T_t") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_rh, _ := c.GetFloat("T_rh") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_time := c.GetString("T_time") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -217,14 +398,36 @@ func (c *TaskDataController) TaskData_Add() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	is := Task.Add_TaskData(Task_r.T_task_id, T_sn, strconv.Itoa(T_id), fmt.Sprintf("%.2f", T_t), fmt.Sprintf("%.2f", T_rh), T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	sn, err := Task.Read_TaskData_ByT_id(Task_r.T_task_id, T_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil && !errors.Is(err, orm.ErrNoRows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(sn) > 0 && sn != T_sn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("编号[%s]已被sn[%s]关联,请修改后重试!", T_id, sn)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	id, err := Task.Read_TaskData_ByT_sn(Task_r.T_task_id, T_sn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil && !errors.Is(err, orm.ErrNoRows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(id) > 0 && id != T_id { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("sn[%s]已被编号[%s]关联,请修改后重试!", T_sn, id)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	is := Task.Add_TaskData(Task_r.T_task_id, T_sn, T_id, fmt.Sprintf("%.2f", T_t), fmt.Sprintf("%.2f", T_rh), T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if !is { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "添加数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn+"|"+strconv.Itoa(T_id)+"|"+fmt.Sprintf("%.2f", T_t)+"|"+fmt.Sprintf("%.2f", T_rh)+T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "添加数据"+Task_r.T_name, Task_r.T_task_id+"|"+T_sn+"|"+T_id+"|"+fmt.Sprintf("%.2f", T_t)+"|"+fmt.Sprintf("%.2f", T_rh)+T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	c.ServeJSON() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -316,12 +519,7 @@ func (c *TaskDataController) TaskData_Del_t_id() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 获取登录用户的uuid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Id, err := c.GetInt("Id") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		c.Data["json"] = lib.JSONS{Code: 201, Msg: "Id 错误!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Id := c.GetString("Id") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_task_id := c.GetString("T_task_id") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Task_r, err := NatsServer.Read_Task(T_task_id) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -331,13 +529,13 @@ func (c *TaskDataController) TaskData_Del_t_id() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	is := Task.Del_TaskData_t_id(Task_r.T_task_id, strconv.Itoa(Id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	is := Task.Del_TaskData_t_id(Task_r.T_task_id, Id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if !is { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "删除"+Task_r.T_name, Task_r.T_task_id+"|"+strconv.Itoa(Id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	System.Add_UserLogs_T(T_uuid, "本地版-任务数据", "删除"+Task_r.T_name, Task_r.T_task_id+"|"+Id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	c.ServeJSON() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -419,10 +617,10 @@ func (c *TaskDataController) Export_Data_Excel() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	//删除目录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	//err = os.Remove("ofile/" + timeStr + ".xlsx") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	//if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	//	fmt.Println(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = os.Remove("ofile/" + timeStr + ".xlsx") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		fmt.Println(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + timeStr + ".xlsx"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	c.ServeJSON() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -454,6 +652,7 @@ func (c *TaskDataController) Check() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Result_Time_start  string //  2022-8-05 21:01 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Result_Time_defect int64  //  缺失时间间隔 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var r_jsons []R_JSONS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -545,7 +744,6 @@ func (c *TaskDataController) Check_Asyn() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Result_Time_start  string //  2022-8-05 21:01 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Result_Time_defect int64  //  缺失时间间隔 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	r_jsons := make([]R_JSONS, len(List)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1737,3 +1935,262 @@ func (c *TaskDataController) TaskDataCopy_Recover() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (c *TaskDataController) TaskData_JPG() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	StartTime := c.GetString("StartTime") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(StartTime) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		_, ok := lib.TimeStrToTime(StartTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if !ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	EndTime := c.GetString("EndTime") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(EndTime) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		_, ok := lib.TimeStrToTime(EndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if !ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	TemperatureMin, _ := c.GetFloat("TemperatureMin") // 最低温度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	TemperatureMax, _ := c.GetFloat("TemperatureMax") // 最高温度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if TemperatureMin == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TemperatureMin = 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if TemperatureMax == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TemperatureMax = 8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	T_task_id := c.GetString("T_task_id") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	SN_List := c.GetString("SN_List") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Task_r, err := NatsServer.Read_Task(T_task_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if Task_r.T_collection_state == 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	jpg, is := Task.Redis_TaskDataJPG_Get(T_task_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if !is { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 生成图片 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		go Gen_JPG(StartTime, EndTime, T_task_id, SN_List, TemperatureMin, TemperatureMax) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Task.TaskDataJPG{State: 1}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if jpg.State == 3 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Task.Redis_TaskDataJPG_Del(T_task_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: jpg} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: jpg} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	c.ServeJSON() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 存档生成图片 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func Gen_JPG(StartTime, EndTime, T_task_id, snList string, TemperatureMin, TemperatureMax float64) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Task.Redis_TaskDataJPG_Set(T_task_id, Task.TaskDataJPG{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		State: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Url:   "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	state := 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if TemperatureMin == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TemperatureMin = 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if TemperatureMax == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TemperatureMax = 8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	SN_List := strings.Split(strings.Trim(snList, "|"), "|") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(snList) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		List := Task.Read_TaskData_ById_ClassList(T_task_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, v := range List { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			SN_List = append(SN_List, fmt.Sprintf("%s,%s", v.T_sn, v.T_id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	id_List := []string{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	sn_List := []string{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(snList) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, v := range SN_List { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			sn_id := strings.Split(v, ",") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if len(sn_id) != 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			id_List = append(id_List, fmt.Sprintf("'%s'", sn_id[1])) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			sn_List = append(sn_List, fmt.Sprintf("'%s'", sn_id[0])) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ymin, ymax, minTime, maxTime := Task.Read_TaskData_T_Min_Max_Time_Min_Max(T_task_id, sn_List, id_List, StartTime, EndTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	xmin, xmax := float64(minTime.Unix()), float64(maxTime.Unix()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 创建一个新的绘图 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p := plot.New() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 设置绘图标题和标签 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.Title.Text = "温度折线图" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//p.Legend.ThumbnailWidth = 5 * vg.Inch 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.X.Label.Text = "时间" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.Y.Label.Text = "温度" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 添加最高,最低标准线 用红色虚线标识 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.Add(horizontalLine(xmin, xmax, TemperatureMin)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.Add(horizontalLine(xmin, xmax, TemperatureMax)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var chData = make(chan int, 10) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var jobGroup sync.WaitGroup 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 创建温度线 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for i := 0; i < len(SN_List); i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		chData <- 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		jobGroup.Add(1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		go func(index int) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//go func(index int, wg *sync.WaitGroup, p *plot.Plot) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			defer func() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				<-chData        // 完成时chan取出1个 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				jobGroup.Done() // 完成时将等待组值减1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			sn_id := strings.Split(SN_List[index], ",") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if len(sn_id) != 2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			sn, id := sn_id[0], sn_id[1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			list, _ := Task.Read_TaskData_ById_List_AES(T_task_id, sn, id, StartTime, EndTime, 0, 9999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if len(list) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			pts := make(plotter.XYs, len(list)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			for j, d := range list { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				t, _ := lib.TimeStrToTime(d.T_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				pts[j].X = float64(t.Unix()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				pts[j].Y = float64(d.T_t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			line, err := plotter.NewLine(pts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			line.Color = randomColor(index) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			p.Add(line) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}(i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	jobGroup.Wait() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ymax < 8 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ymax = 8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ymin > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ymin = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.Y.Min, p.Y.Max = ymin, ymax 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.X.Min, p.X.Max = xmin, xmax 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.Y.Tick.Marker = commaTicks{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//p.X.Tick.Marker = plot.TimeTicks{Format: "2006-01-02 15:04:05"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.X.Tick.Marker = timeTicks{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.X.Tick.Label.Rotation = math.Pi / 5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.X.Tick.Label.YAlign = draw.YCenter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	p.X.Tick.Label.XAlign = draw.XRight 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	filename := "jpg" + time.Now().Format("20060102150405") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 保存文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err := p.Save(10*vg.Inch, 4*vg.Inch, "ofile/"+filename+".jpg"); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		state = 3 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logs.Error(lib.FuncName(), "生成图片失败", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if !lib.Pload_qiniu("ofile/"+filename+".jpg", "ofile/"+filename+".jpg") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		state = 3 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logs.Error(lib.FuncName(), "上传七牛云失败") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//删除目录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	os.Remove("ofile/" + filename + ".jpg") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Task.Redis_TaskDataJPG_Set(T_task_id, Task.TaskDataJPG{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		State: state, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Url:   "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + filename + ".jpg", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func horizontalLine(xmin, xmax, y float64) *plotter.Line { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pts := make(plotter.XYs, 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pts[0].X = xmin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pts[0].Y = y 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pts[1].X = xmax 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pts[1].Y = y 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	line, err := plotter.NewLine(pts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	line.LineStyle.Dashes = []vg.Length{vg.Points(8), vg.Points(5), vg.Points(1), vg.Points(5)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	line.Color = color.RGBA{R: 255, A: 255} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return line 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+type timeTicks struct{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (timeTicks) Ticks(min, max float64) []plot.Tick { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	tks := plot.TimeTicks{}.Ticks(min, max) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for i, t := range tks { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//if t.Label == "" { // Skip minor ticks, they are fine. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//	continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		tks[i].Label = time.Unix(int64(t.Value), 0).Format("2006-01-02 15:04:05") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return tks 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+type commaTicks struct{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Ticks computes the default tick marks, but inserts commas 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// into the labels for the major tick marks. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (commaTicks) Ticks(min, max float64) []plot.Tick { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	tks := plot.DefaultTicks{}.Ticks(min, max) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for i, t := range tks { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//if t.Label == "" { // Skip minor ticks, they are fine. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//	continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		tks[i].Label = fmt.Sprintf("%.0f", t.Value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return tks 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 生成随机颜色的辅助函数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func randomColor(i int) color.RGBA { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var colors []color.RGBA 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	colors = append(colors, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 52, G: 152, B: 219, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 230, G: 126, B: 34, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 142, G: 68, B: 173, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 211, G: 84, B: 0, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 231, G: 76, B: 60, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 26, G: 188, B: 156, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 243, G: 156, B: 18, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 22, G: 160, B: 133, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 46, G: 204, B: 113, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 39, G: 174, B: 96, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 41, G: 128, B: 185, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 155, G: 89, B: 182, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 192, G: 57, B: 43, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		color.RGBA{R: 241, G: 196, B: 15, A: 255}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return colors[i%len(colors)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |