Browse Source

add:数据编辑

zoie 2 years ago
parent
commit
5546d01859
5 changed files with 665 additions and 18 deletions
  1. 19 7
      Nats/Nats.go
  2. 474 6
      controllers/TaskData.go
  3. 12 2
      lib/libString.go
  4. 152 3
      models/Task/TaskData.go
  5. 8 0
      routers/TaskData.go

+ 19 - 7
Nats/Nats.go

@@ -36,7 +36,7 @@ type Up_TaskData_Back struct {
 func NatsInit() {
 
 	// 打包本地数据
-	_, _ = lib.Nats.Subscribe("ColdVerify_Local_Import_TaskData", func(m *nats.Msg) {
+	_, _ = lib.Nats.QueueSubscribe("ColdVerify_Local_Import_TaskData", "Import_TaskData", func(m *nats.Msg) {
 		logs.Debug("ColdVerify_Local_Import_TaskData message: ", string(m.Data))
 		logs.Info(lib.FuncName(), "任务数据-打包本地数据 开始打包数据...!")
 
@@ -56,12 +56,13 @@ func NatsInit() {
 		Task_r, err := NatsServer.Read_Task(T_task_id)
 		if err != nil {
 			logs.Error(lib.FuncName(), err)
+			return
 		}
 
 		if t_r.TaskData_Num == 0 {
 			// 已采集 无数据
 			Task.CREATE_TaskData(conf.Local_AliasName, T_task_id)
-			Task.Truncate_TaskData(conf.Local_AliasName, T_task_id)
+			//Task.Truncate_TaskData(conf.Local_AliasName, T_task_id)
 			Task_r.T_collection_state = 3
 			err = NatsServer.Update_Task(Task_r)
 			if err != nil {
@@ -91,7 +92,7 @@ func NatsInit() {
 			i++
 		}
 
-		logs.Info("--------开始导入数据到本地---------")
+		logs.Info("--------开始导入数据到本地---------")
 		j := 0
 		flag := false
 		Task.CREATE_TaskData(conf.Local_AliasName, T_task_id)
@@ -112,6 +113,7 @@ func NatsInit() {
 		// 重试10次后仍然没有成功导入数据
 
 		if !flag {
+			// 清空本地数据
 			Task.Truncate_TaskData(conf.Local_AliasName, T_task_id)
 			Task_r.T_collection_state = 0
 			err = NatsServer.Update_Task(Task_r)
@@ -129,10 +131,10 @@ func NatsInit() {
 		err = NatsServer.Update_Task(Task_r)
 		if err != nil {
 			logs.Error(lib.FuncName(), err)
+			return
 		}
 		System.Add_UserLogs_T(T_uuid, "任务数据-打包本地数据", "z_task_data_"+T_task_id, "成功")
-
-		logs.Info(lib.FuncName(), "任务数据-打包本地数据 成功!")
+		logs.Info("--------导入数据到本地【成功】!---------")
 
 	})
 
@@ -184,7 +186,7 @@ func NatsInit() {
 	//})
 
 	// 更新线上数据
-	_, _ = lib.Nats.Subscribe("ColdVerify_Local_Up_TaskData", func(m *nats.Msg) {
+	_, _ = lib.Nats.QueueSubscribe("ColdVerify_Local_Up_TaskData", "Up_TaskData", func(m *nats.Msg) {
 		logs.Debug("ColdVerify_Local_Up_TaskData message: ", string(m.Data))
 		logs.Info(lib.FuncName(), "任务数据-打包本地数据 更新线上数据...!")
 
@@ -204,9 +206,11 @@ func NatsInit() {
 		org, err := Task.Dump_TaskData(T_task_id, conf.MysqlServer_Username, conf.MysqlServer_Password, conf.MysqlServer_UrlPort, conf.MysqlServer_Database, sql_file)
 		if err != nil {
 			logs.Error(lib.FuncName(), "导出本地数据失败")
+			return
 		}
 		System.Add_UserLogs_T(T_uuid, "任务数据-更新线上数据", "z_task_data_"+T_task_id, org)
 
+		logs.Info("--------开始导入数据到【线上】---------")
 		i := 0
 		flag := false
 		for i < 10 {
@@ -247,8 +251,16 @@ func NatsInit() {
 		}
 
 		System.Add_UserLogs_T(T_uuid, "任务数据-更新线上数据", "z_task_data_"+T_task_id, "成功")
+		logs.Info("--------导入数据到【线上】成功!---------")
+
+	})
+
+	// 创建本地任务表
+	_, _ = lib.Nats.QueueSubscribe("ColdVerify_Local_Create_Table", "Create_Table", func(m *nats.Msg) {
+		logs.Debug("ColdVerify_Local_Up_TaskData message: ", string(m.Data))
+		logs.Info(lib.FuncName(), "任务数据-创建数据库表 更新线上数据...!")
 
-		logs.Info(lib.FuncName(), "任务数据-更新线上数据 成功!")
+		Task.CREATE_TaskData(conf.Local_AliasName, string(m.Data))
 
 	})
 

+ 474 - 6
controllers/TaskData.go

@@ -14,7 +14,6 @@ import (
 	"github.com/xuri/excelize/v2"
 	"math"
 	"os"
-	"sort"
 	"strconv"
 	"strings"
 	"sync"
@@ -551,7 +550,7 @@ func (c *TaskDataController) Check_Asyn() {
 
 	List := Task.Read_TaskData_ById_ClassList(Task_r.T_task_id)
 
-	r_jsons := make([]R_JSONS, 0)
+	r_jsons := make([]R_JSONS, len(List))
 	var limitMaxNum = 10
 	var chData = make(chan int, limitMaxNum)
 	var jobGroup sync.WaitGroup
@@ -625,12 +624,18 @@ func (c *TaskDataController) Check_Asyn() {
 	}
 	//使用Wait等待所有任务执行完毕
 	jobGroup.Wait()
+	jsonsMap := map[string]R_JSONS{}
+	resp := make([]R_JSONS, 0)
 
-	sort.Slice(r_jsons, func(i, j int) bool {
-		return r_jsons[i].T_id < r_jsons[j].T_id
-	})
+	for _, json := range r_jsons {
+		jsonsMap[json.T_id] = json
+	}
 
-	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	for _, v := range List {
+		resp = append(resp, jsonsMap[v.T_id])
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: resp}
 	c.ServeJSON()
 	return
 }
@@ -772,6 +777,13 @@ func (c *TaskDataController) TaskData_Up_TaskData_Back() {
 		c.ServeJSON()
 		return
 	}
+
+	if Task_r.T_delivery_state == 2 {
+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+		c.ServeJSON()
+		return
+	}
+
 	// 采集中
 	Task_r.T_delivery_state = 2
 	err = NatsServer.Update_Task(Task_r)
@@ -790,5 +802,461 @@ func (c *TaskDataController) TaskData_Up_TaskData_Back() {
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
+	return
+
+}
+
+// CopyFromPosition 数据拷贝
+func (c *TaskDataController) CopyFromPosition() {
+	T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	//if !b_ {
+	//	c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+	//	c.ServeJSON()
+	//	return
+	//}
+	StartTime := c.GetString("StartTime")
+	startTime, ok := lib.TimeStrToTime(StartTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	EndTime := c.GetString("EndTime")
+	endTime, ok := lib.TimeStrToTime(EndTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	CopyTime := c.GetString("CopyTime")
+	copyTime, ok := lib.TimeStrToTime(CopyTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	CopyEndTime := copyTime.Add(endTime.Sub(startTime)).Format("2006-01-02 15:04:05")
+	// 时间间隔 分钟
+	T_saveT, _ := c.GetInt("T_saveT")
+
+	SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
+
+	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
+	}
+	if Task_r.T_collection_state == 2 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
+		c.ServeJSON()
+		return
+	}
+
+	for _, v := range SN_List {
+		sn_id := strings.Split(v, ",")
+		if len(sn_id) != 2 {
+			continue
+		}
+		sn, id_str := sn_id[0], sn_id[1]
+		id, _ := strconv.Atoi(id_str)
+		Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, sn, id, CopyTime, CopyEndTime)
+		List, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id, StartTime, EndTime, 0, 9999)
+		ct := copyTime
+		go func(TaskDataList []Task.TaskData_, task_id string, T_saveT int) {
+			for _, taskData := range TaskDataList {
+				taskData.T_time = ct.Format("2006-01-02 15:04:05")
+				Task.InsertTaskData(task_id, taskData)
+				ct = ct.Add(time.Second * time.Duration(T_saveT))
+			}
+		}(List, Task_r.T_task_id, T_saveT)
+	}
+	System.Add_UserLogs_T(T_uuid, "数据复制", fmt.Sprintf("数据复制(%s)[%s|%s],复制时间:%s,,时间间隔:%d", T_task_id, StartTime, EndTime, CopyTime, T_saveT), SN_List)
+
+	c.Data["json"] = lib.JSONS{200, "数据复制已提交后台处理!", nil}
+	c.ServeJSON()
+	return
+}
+
+// RepairSensorData 数据补漏
+func (c *TaskDataController) RepairSensorData() {
+	T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	//if !b_ {
+	//	c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+	//	c.ServeJSON()
+	//	return
+	//}
+	StartTime := c.GetString("StartTime")
+	_, ok := lib.TimeStrToTime(StartTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	EndTime := c.GetString("EndTime")
+	_, ok = lib.TimeStrToTime(EndTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	// 时间间隔 秒
+	saveTime, _ := c.GetInt("T_saveT")
+
+	SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
+
+	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
+	}
+	if Task_r.T_collection_state == 2 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
+		c.ServeJSON()
+		return
+	}
+
+	num := 0
+	for _, v := range SN_List {
+		sn_id := strings.Split(v, ",")
+		if len(sn_id) != 2 {
+			continue
+		}
+		sn, id_str := sn_id[0], sn_id[1]
+		id, _ := strconv.Atoi(id_str)
+		list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id, StartTime, EndTime, 0, 9999)
+		for i := 0; i < len(list)-1; i++ {
+			current := list[i].T_time
+			next := list[i+1].T_time
+			c, _ := time.Parse("2006-01-02 15:04:05", current)
+			n, _ := time.Parse("2006-01-02 15:04:05", next)
+			interval := n.Unix() - c.Unix()
+			logs.Debug("时间间隔:", interval, "保存时间:", saveTime)
+			fmt.Println("当前:", current, "下一个:", next)
+			if int(interval) > saveTime {
+				ttInterval := list[i+1].T_t - list[i].T_t
+				ttt := list[i].T_t // 温度临时变量
+				trhInterval := list[i+1].T_rh - list[i].T_rh
+				trht := list[i].T_rh //湿度临时变量
+				count := (int(interval) - saveTime) / saveTime
+				if int(interval)%saveTime != 0 {
+					count++
+				}
+				num += count
+				for k := 0; k < count; k++ {
+					t := c.Add(time.Second * time.Duration(saveTime)).Format("2006-01-02 15:04:05") //时间临时变量
+					ttt += ttInterval / float32(count)
+					trht += trhInterval / float32(count)
+					Task.InsertTaskData(Task_r.T_task_id, Task.TaskData_{
+						T_sn:   list[i].T_sn,
+						T_id:   list[i].T_id,
+						T_t:    ttt,
+						T_rh:   trht,
+						T_time: t,
+					})
+					c = c.Add(time.Second * time.Duration(saveTime))
+				}
+			}
+		}
+	}
+	System.Add_UserLogs_T(T_uuid, "数据补漏", fmt.Sprintf("数据补漏(%s)[%s|%s],时间间隔:%d", T_task_id, StartTime, EndTime, saveTime), SN_List)
+
+	c.Data["json"] = lib.JSONS{200, fmt.Sprintf("补漏完成!共补漏%d条数据", num), nil}
+	c.ServeJSON()
+	return
+}
+
+// DataSensorDataTrend 数据趋势
+func (c *TaskDataController) DataSensorDataTrend() {
+	T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	//if !b_ {
+	//	c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+	//	c.ServeJSON()
+	//	return
+	//}
+
+	StartTime := c.GetString("StartTime")
+	_, ok := lib.TimeStrToTime(StartTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	EndTime := c.GetString("EndTime")
+	_, ok = lib.TimeStrToTime(EndTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	// 时间间隔 秒
+	saveTime, _ := c.GetInt("T_saveT")
+
+	SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
 
+	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
+	}
+	if Task_r.T_collection_state == 2 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
+		c.ServeJSON()
+		return
+	}
+
+	for _, v := range SN_List {
+		sn_id := strings.Split(v, ",")
+		if len(sn_id) != 2 {
+			continue
+		}
+		sn, id_str := sn_id[0], sn_id[1]
+		id, _ := strconv.Atoi(id_str)
+		list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id, StartTime, EndTime, 0, 9999)
+		if len(list) == 0 {
+			continue
+		}
+
+		Task.DeleteTaskDataByTimeRange(Task_r.T_task_id, sn, id, StartTime, EndTime)
+		first := list[0]
+		last := list[len(list)-1]
+
+		current, _ := time.Parse("2006-01-02 15:04:05", first.T_time)
+		next, _ := time.Parse("2006-01-02 15:04:05", 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)
+		tt := first.T_t
+		ttrh := first.T_rh
+
+		for current.Unix() < next.Unix() {
+			tt += ttInterval
+			ttrh += trhInterval
+			ttime := current.Format("2006-01-02 15:04:05")
+
+			Task.InsertTaskData(Task_r.T_task_id, Task.TaskData_{
+				//加保存时间
+				T_sn:   first.T_sn,
+				T_id:   strconv.Itoa(id),
+				T_t:    tt,
+				T_rh:   ttrh,
+				T_time: ttime,
+			})
+			current = current.Add(time.Second * time.Duration(saveTime))
+		}
+
+	}
+	System.Add_UserLogs_T(T_uuid, "数据趋势", fmt.Sprintf("数据趋势(%s)[%s|%s],时间间隔:%d", T_task_id, StartTime, EndTime, saveTime), SN_List)
+
+	c.Data["json"] = lib.JSONS{200, "设置趋势操作成功", nil}
+	c.ServeJSON()
+	return
+}
+
+// UpdateRand 数据随机
+func (c *TaskDataController) UpdateRand() {
+	T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	//if !b_ {
+	//	c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+	//	c.ServeJSON()
+	//	return
+	//}
+	StartTime := c.GetString("StartTime")
+	_, ok := lib.TimeStrToTime(StartTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	EndTime := c.GetString("EndTime")
+	_, ok = lib.TimeStrToTime(EndTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	TemperatureMin, _ := c.GetInt("TemperatureMin") // 温度
+	TemperatureMax, _ := c.GetInt("TemperatureMax")
+	HumidityMax, _ := c.GetInt("HumidityMax") // 湿度
+	HumidityMin, _ := c.GetInt("HumidityMin")
+
+	SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
+
+	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
+	}
+	if Task_r.T_collection_state == 2 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
+		c.ServeJSON()
+		return
+	}
+
+	for _, v := range SN_List {
+		sn_id := strings.Split(v, ",")
+		if len(sn_id) != 2 {
+			continue
+		}
+		sn, id := sn_id[0], sn_id[1]
+		Task.UpdateTaskDataTemperatureAndHumidityRandom(Task_r.T_task_id, sn, id, StartTime, EndTime, TemperatureMax, TemperatureMin, HumidityMax, HumidityMin)
+	}
+	System.Add_UserLogs_T(T_uuid, "数据随机", fmt.Sprintf("数据随机(%s)[%s|%s],温度[%d-%d],湿度[%d-%d]", T_task_id, StartTime, EndTime, TemperatureMin, TemperatureMax, HumidityMax, HumidityMin), SN_List)
+
+	//反馈成功
+	c.Data["json"] = lib.JSONS{200, "调整随机偏移值成功!", nil}
+	c.ServeJSON()
+	return
+}
+
+// UpdateFix 更新固定值
+func (c *TaskDataController) UpdateFix() {
+	T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	//if !b_ {
+	//	c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+	//	c.ServeJSON()
+	//	return
+	//}
+	StartTime := c.GetString("StartTime")
+	_, ok := lib.TimeStrToTime(StartTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	EndTime := c.GetString("EndTime")
+	_, ok = lib.TimeStrToTime(EndTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	FixTemperature := c.GetString("FixTemperature")
+	FixHumidity := c.GetString("FixHumidity")
+	//2.得到数据进行统一设置访问修改
+	humidity, _ := strconv.ParseFloat(FixHumidity, 64)
+	temperature, _ := strconv.ParseFloat(FixTemperature, 64)
+
+	SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
+
+	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
+	}
+	if Task_r.T_collection_state == 2 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
+		c.ServeJSON()
+		return
+	}
+
+	//3.循环更新数据
+	for _, v := range SN_List {
+		sn_id := strings.Split(v, ",")
+		if len(sn_id) != 2 {
+			continue
+		}
+		sn, id := sn_id[0], sn_id[1]
+		Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, sn, id, StartTime, EndTime, temperature, humidity)
+	}
+	System.Add_UserLogs_T(T_uuid, "更新固定值", fmt.Sprintf("更新固定值(%s)[%s|%s],温度[%f],湿度[%f]", T_task_id, StartTime, EndTime, temperature, humidity), SN_List)
+
+	//4.反馈成功
+	c.Data["json"] = lib.JSONS{200, "调整固定偏移值成功!", nil}
+	c.ServeJSON()
+}
+
+// DataSensorDataSmooth 数据平滑
+func (c *TaskDataController) DataSensorDataSmooth() {
+	T_uuid, _ := lib.GetAdminT_Uuid(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	//if !b_ {
+	//	c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+	//	c.ServeJSON()
+	//	return
+	//}
+	StartTime := c.GetString("StartTime")
+	_, ok := lib.TimeStrToTime(StartTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	EndTime := c.GetString("EndTime")
+	_, ok = lib.TimeStrToTime(EndTime)
+	if !ok {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	tRange, _ := c.GetFloat("tRange")
+	hRange, _ := c.GetFloat("hRange")
+
+	SN_List := strings.Split(strings.Trim(c.GetString("SN_List"), "|"), "|")
+
+	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
+	}
+	if Task_r.T_collection_state == 2 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "数据采集中,请稍后!"}
+		c.ServeJSON()
+		return
+	}
+
+	var count int
+	for _, v := range SN_List {
+		sn_id := strings.Split(v, ",")
+		if len(sn_id) != 2 {
+			continue
+		}
+		sn := sn_id[0]
+		id_str := sn_id[1]
+		id, _ := strconv.Atoi(id_str)
+		list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, sn, id, StartTime, EndTime, 0, 9999)
+		for i := 1; i < len(list); i++ {
+			n := list[i-1]
+			old := list[i]
+			newO := list[i]
+			//变化差
+			var tInterval = old.T_t - n.T_t
+			var hInterval = old.T_rh - n.T_rh
+			fmt.Println("温度:", n.T_t, "温度next:", old.T_t, "差值:", n.T_t-old.T_t)
+			if tRange != 0 {
+				if tInterval > float32(tRange) {
+					newO.T_t = n.T_t + float32(tRange)
+				} else if tInterval < -float32(tRange) {
+					newO.T_t = n.T_t - float32(tRange)
+				}
+			}
+			if hRange != 0 {
+				if hInterval > float32(hRange) {
+					newO.T_rh = n.T_rh + float32(hRange)
+				} else if hInterval < -float32(hRange) {
+					newO.T_rh = n.T_rh - float32(hRange)
+				}
+			}
+			if old.T_rh != newO.T_rh || old.T_t != newO.T_t {
+				fmt.Println("原始数据:", old, "新数据:", newO)
+				list[i] = newO
+				Task.UpdateTaskData(Task_r.T_task_id, sn, id_str, old, newO)
+				count++
+			}
+		}
+	}
+	System.Add_UserLogs_T(T_uuid, "数据平滑", fmt.Sprintf("数据平滑(%s)[%s|%s],温度[%f],湿度[%f]", T_task_id, StartTime, EndTime, tRange, hRange), SN_List)
+
+	c.Data["json"] = lib.JSONS{200, "操作成功处理" + fmt.Sprint(count) + "条数据", nil}
+	c.ServeJSON()
 }

+ 12 - 2
lib/libString.go

@@ -6,7 +6,7 @@ import (
 	"time"
 )
 
-//#取得随机字符串:通过打乱slice来操作
+// #取得随机字符串:通过打乱slice来操作
 func GetRandstring(length int, char string, rand_x int64) string {
 	if length < 1 {
 		return ""
@@ -34,4 +34,14 @@ func IsDateStr(date string) bool {
 		return false
 	}
 	return true
-}
+}
+
+// 转化
+func TimeStrToTime(T_time string) (time.Time, bool) {
+	stamp, err := time.ParseInLocation("2006-01-02 15:04:05", T_time, time.Local) // +8
+	if err != nil {
+		return time.Time{}, false
+	}
+
+	return stamp, true
+}

+ 152 - 3
models/Task/TaskData.go

@@ -31,6 +31,7 @@ func (t *TaskData) TableName() string {
 }
 
 func init() {
+	orm2.Debug = true
 }
 
 // 创建数据库  Device.CREATE_TaskData("")
@@ -117,7 +118,7 @@ func Read_TaskData_ById_List(T_task_id string, SN string, T_id int, Time_start_
 	}
 
 	if T_id != -1 {
-		sql_condition += " AND t_id = " + strconv.Itoa(T_id)
+		sql_condition += " AND t_id = '" + strconv.Itoa(T_id) + "'"
 	}
 	if len(SN) > 0 {
 		sql_condition += " AND t_sn = '" + SN + "'"
@@ -153,6 +154,66 @@ func Read_TaskData_ById_List(T_task_id string, SN string, T_id int, Time_start_
 	key, _ := strconv.Atoi(maps_z[0][0].(string))
 	return maps, int64(key)
 }
+func Read_TaskData_ById_List_AES(T_task_id string, SN string, T_id int, Time_start_ string, Time_end_ string, page int, page_z int) ([]TaskData_, int64) {
+	o := orm.NewOrm()
+	var maps []TaskData_
+	var maps_z []orm2.ParamsList
+	pagez := page_z
+
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		page -= 1
+		offset = page * pagez
+	}
+
+	sql_condition := ""
+	if len(Time_start_) > 1 {
+		sql_condition += " AND t_time >= '" + Time_start_ + "'"
+	}
+
+	if len(Time_end_) > 1 {
+		sql_condition += " AND t_time <= '" + Time_end_ + "'"
+	}
+
+	if T_id != -1 {
+		sql_condition += " AND t_id = '" + strconv.Itoa(T_id) + "'"
+	}
+	if len(SN) > 0 {
+		sql_condition += " AND t_sn = '" + SN + "'"
+	}
+	if len(sql_condition) > 0 {
+		sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
+	}
+
+	sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id + sql_condition
+
+	fmt.Println(sql)
+	_, err := o.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		return maps, 0
+	}
+	if len(maps_z) == 0 {
+		return maps, 0
+	}
+
+	//fmt.Println("maps_z;",maps_z[0][0])
+	sql = "SELECT ID,t_sn,t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_times,t_time FROM z_task_data_" + T_task_id + sql_condition + " ORDER BY t_time"
+	if page_z != 9999 {
+		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(pagez)
+	}
+
+	fmt.Println(sql)
+	_, err = o.Raw(sql).QueryRows(&maps)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+
+	//value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
+	key, _ := strconv.Atoi(maps_z[0][0].(string))
+	return maps, int64(key)
+}
 
 func Read_TaskData_ById_List_(T_task_id string, SN string) []TaskData_ {
 	o := orm.NewOrm()
@@ -182,7 +243,7 @@ func Read_TaskData_ById_ClassList(T_task_id string) []TaskDataClass_ {
 	//fmt.Println("maps_z;",maps_z[0][0])
 	//sql := "SELECT DISTINCT t_sn,t_id FROM z_task_data_" + T_task_id + " ORDER BY t_id "
 	//sql := "SELECT DISTINCT t_sn FROM z_task_data_" + T_task_id + " ORDER BY t_id "
-	sql := "SELECT t_sn,t_id FROM z_task_data_" + T_task_id + "  GROUP BY t_sn ORDER BY t_id "
+	sql := "SELECT t_sn,t_id FROM z_task_data_" + T_task_id + "  GROUP BY t_sn ORDER BY t_id+0 "
 
 	fmt.Println(sql)
 	_, err := o.Raw(sql).QueryRows(&maps)
@@ -407,7 +468,11 @@ func Dump_TaskData(T_task_id, root, password, url_port, database, sql_file strin
 		org += "--column-statistics=0 "
 	}
 	//--no-create-info 只导出数据,而不添加 CREATE TABLE 语句。
-	org = org + fmt.Sprintf("-u%s -p%s -h%s -P%s --no-create-info --set-gtid-purged=OFF --quick %s %s > %s ",
+	//--single-transaction 在备份库的时候并不锁定数据表
+	//--add-locks:在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(默认为打开状态,使用--skip-add-locks取消选项)
+	//--compact:压缩模式,产生更少的输出;
+
+	org = org + fmt.Sprintf("-u%s -p%s -h%s -P%s --no-create-info --set-gtid-purged=OFF --skip-add-locks --compact --quick %s %s > %s ",
 		root, password, host_port[0], host_port[1], database, table_name, sql_file)
 
 	logs.Println(org)
@@ -473,3 +538,87 @@ func Import_TaskData(T_task_id string, offset, pagez int) bool {
 
 	return true
 }
+
+// InsertTaskData 添加设备数据
+func InsertTaskData(T_task_id string, d TaskData_) {
+
+	o := orm.NewOrm()
+	var maps TaskData_
+	sql := fmt.Sprintf("SELECT * FROM z_task_data_%s where t_time='%s' and t_id = '%s' and t_sn = '%s'", T_task_id, d.T_time, d.T_id, d.T_sn)
+	err := o.Raw(sql).QueryRow(&maps)
+	if err != nil && err.Error() != orm.ErrNoRows.Error() {
+		logs.Error(lib.FuncName(), err)
+	}
+	// 添加
+	if maps.ID == 0 {
+		sqlStatement := fmt.Sprintf("insert into z_task_data_%s(t_sn, t_id, t_t, t_rh, t_time) value('%s','%s',%f,%f,'%s')", T_task_id, d.T_sn, d.T_id, d.T_t, d.T_rh, d.T_time)
+		_, err = o.Raw(sqlStatement).Exec()
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+		}
+		return
+	}
+
+	//已经存在该条目,更新
+	sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = %f,t_rh = %f where t_time= '%s' and t_id = '%s' and t_sn = '%s'", T_task_id, d.T_t, d.T_rh, d.T_time, d.T_id, d.T_sn)
+	_, err = o.Raw(sqlStatement).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+
+}
+
+// DeleteTaskDataByTimeRange 删除时间范围内的数据
+func DeleteTaskDataByTimeRange(T_task_id, sn string, id int, start, end string) {
+	sqlStatement := fmt.Sprintf("delete from z_task_data_%s where t_time between '%s' and '%s' and t_id = '%d' and t_sn = '%s'", T_task_id, start, end, id, sn)
+	o := orm.NewOrm()
+	exec, err := o.Raw(sqlStatement).Exec()
+	if err != nil {
+		fmt.Println(err.Error())
+	}
+	affected, _ := exec.RowsAffected()
+	fmt.Printf("从%s~%s时间段删除了%d条数据", start, end, affected)
+}
+
+// UpdateTaskDataTemperatureAndHumidityRandom 随机更新
+func UpdateTaskDataTemperatureAndHumidityRandom(T_task_id, sn, id, startTime, endTime string, ttMax, ttMin, trhMax, trhMin int) {
+
+	//sql语句
+	sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = t_t + FLOOR(%d + RAND() * (%d - %d + 1)) /100.0, t_rh = t_rh + FLOOR(%d + RAND() * (%d - %d + 1)) /100.0 where t_time BETWEEN '%s' AND '%s' and t_id = '%s' and t_sn = '%s'", T_task_id, ttMin, ttMax, ttMin, trhMin, trhMax, trhMin, startTime, endTime, id, sn)
+	o := orm.NewOrm()
+	exec, err := o.Raw(sqlStatement).Exec()
+	if err != nil {
+		fmt.Println("执行错误:", sqlStatement)
+	}
+	affected, _ := exec.RowsAffected()
+	fmt.Println("执行更新行数:", affected)
+}
+
+// UpdateTaskDataTemperatureAndHumidity 更新设备探头数据温湿度
+func UpdateTaskDataTemperatureAndHumidity(T_task_id, sn, id, startTime, endTime string, temperature, humidity float64) {
+	sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = t_t + %f , t_rh = t_rh + %f where t_id = '%s' and  t_sn = '%s' and t_time BETWEEN '%s' and '%s'", T_task_id, temperature, humidity, id, sn, startTime, endTime)
+	o := orm.NewOrm()
+
+	exec, err := o.Raw(sqlStatement).Exec()
+	if err != nil {
+		fmt.Println(err.Error())
+	}
+	affected, err := exec.RowsAffected()
+	if err != nil {
+		fmt.Println(err.Error())
+	}
+	fmt.Printf("影响了%d行\n", affected)
+}
+
+// UpdateTaskData 更新设备探头数据
+func UpdateTaskData(T_task_id, sn, id string, old, newO TaskData_) {
+	sqlStatement := fmt.Sprintf("update z_task_data_%s set t_t = %f , t_rh = %f where t_sn = '%s' and t_id = '%s' and t_t = %f and t_rh = %f and t_time= '%s'", T_task_id, newO.T_t, newO.T_rh, sn, id, old.T_t, old.T_rh, old.T_time)
+	fmt.Println("执行SQL:", sqlStatement)
+	o := orm.NewOrm()
+	exec, err := o.Raw(sqlStatement).Exec()
+	if err != nil {
+		fmt.Println("执行错误:", sqlStatement, err.Error())
+	}
+	affected, _ := exec.RowsAffected()
+	fmt.Println("执行更新行数:", affected)
+}

+ 8 - 0
routers/TaskData.go

@@ -27,4 +27,12 @@ func init() {
 	beego.Router("/TaskData/Import_TaskData", &controllers.TaskDataController{}, "*:TaskData_Import_TaskData") // 打包本地数据
 	beego.Router("/TaskData/Up_TaskData", &controllers.TaskDataController{}, "*:TaskData_Up_TaskData_Back")    // 更新线上数据
 	//beego.Router("/TaskData/Up_TaskData_Back", &controllers.TaskDataController{}, "*:TaskData_Up_TaskData_Back") // 更新线上数据
+
+	// 数据处理
+	beego.Router("/TaskData/CopyFromPosition", &controllers.TaskDataController{}, "*:CopyFromPosition")         // 数据复制
+	beego.Router("/TaskData/RepairSensorData", &controllers.TaskDataController{}, "*:RepairSensorData")         // 数据补漏
+	beego.Router("/TaskData/DataSensorDataTrend", &controllers.TaskDataController{}, "*:DataSensorDataTrend")   // 数据趋势
+	beego.Router("/TaskData/UpdateRand", &controllers.TaskDataController{}, "*:UpdateRand")                     // 数据随机
+	beego.Router("/TaskData/UpdateFix", &controllers.TaskDataController{}, "*:UpdateFix")                       // 更新固定值
+	beego.Router("/TaskData/DataSensorDataSmooth", &controllers.TaskDataController{}, "*:DataSensorDataSmooth") // 数据平滑
 }