Browse Source

2023-07-14 数据存档

zoie 1 year ago
parent
commit
f0b90bd888
5 changed files with 540 additions and 4 deletions
  1. 295 2
      controllers/TaskData.go
  2. 23 1
      lib/libString.go
  3. 164 0
      models/Task/TaskCopy.go
  4. 51 1
      models/Task/TaskData.go
  5. 7 0
      routers/TaskData.go

+ 295 - 2
controllers/TaskData.go

@@ -178,13 +178,14 @@ func (c *TaskDataController) TaskData_AddS() {
 	println(len(T_Data_list), "len(T_Data_list)")
 	var T_Data_list_x = 0
 	for _, v := range T_Data_list {
-		// 2022-08-09 14:25:00|27.7|55.2
+		// 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, "|")
-		is := Task.Add_TaskData(Task_r.T_task_id, v_list[0], v_list[1], v_list[2], v_list[3], v_list[4])
+		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
 		}
@@ -1444,3 +1445,295 @@ func (c *TaskDataController) CopyFromPositionSN() {
 	c.ServeJSON()
 	return
 }
+
+// 数据偏移到区间内
+func (c *TaskDataController) DataSkewingInterval() {
+	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.GetFloat("TemperatureMin") // 温度
+	TemperatureMax, _ := c.GetFloat("TemperatureMax")
+	Tmin, Tmax := TemperatureMin, TemperatureMax
+
+	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
+	}
+	errMsg := []string{}
+
+	for _, v := range SN_List {
+		sn_id := strings.Split(v, ",")
+		if len(sn_id) != 2 {
+			continue
+		}
+		sn, id := sn_id[0], sn_id[1]
+		min, max := Task.Read_TaskData_T_Min_Max(Task_r.T_task_id, sn, id, StartTime, EndTime)
+		if min < Tmin && max > Tmax {
+			errMsg = append(errMsg, fmt.Sprintf("【%s】最低温度[%.2f]低于给定的最低温度[%.2f],并且最高温度[%.2f]高于给定的最高温度[%.2f],无法偏移!", id, min, Tmin, max, Tmax))
+			continue
+		}
+		if min > Tmin && max < Tmax {
+			continue
+			//errMsg = append(errMsg, fmt.Sprintf("【%s】最低温度[%.2f]高于给定最低温度[%.2f],并且最高温度[%.2f]低于给定最高温度[%.2f],无须偏移!", id, min, Tmin, max, Tmax))
+		}
+
+		// 判断是否能向上偏移
+		if min < Tmin && max < Tmax && (Tmin-min+max) > Tmax {
+			errMsg = append(errMsg, fmt.Sprintf("【%s】偏移后最高温度[%.2f]将高于给定的最高温度[%.2f],无法偏移!", id, Tmin-min+max, Tmax))
+			continue
+		}
+
+		if max > Tmax && min > Tmin && (min-(max-Tmax)) < Tmin {
+			errMsg = append(errMsg, fmt.Sprintf("【%s】偏移后最低温度[%.2f]将低于给定的最低温度[%.2f],无法偏移!", id, min-(max-Tmax), Tmin))
+			continue
+		}
+		// 向上偏移
+		if min < Tmin && max < Tmax && (Tmin-min+max) <= Tmax {
+			Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, sn, id, StartTime, EndTime, Tmin-min, 0)
+			continue
+		}
+		// 向下偏移
+		if max > Tmax && min > Tmin && (min-(max-Tmax)) >= Tmin {
+			Task.UpdateTaskDataTemperatureAndHumidity(Task_r.T_task_id, sn, id, StartTime, EndTime, -(max - Tmax), 0)
+			continue
+		}
+
+	}
+	System.Add_UserLogs_T(T_uuid, "数据偏移到给定范围", fmt.Sprintf("数据偏移到给定范围(%s)[%s|%s],温度[%f-%f]", T_task_id, StartTime, EndTime, TemperatureMin, TemperatureMax), SN_List)
+	if len(errMsg) > 0 {
+		c.Data["json"] = lib.JSONS{202, "", errMsg}
+		c.ServeJSON()
+		return
+	}
+	//反馈成功
+	c.Data["json"] = lib.JSONS{200, "调整区间偏移值成功!", nil}
+	c.ServeJSON()
+	return
+}
+
+// 等比缩放
+func (c *TaskDataController) DataGeometricScale() {
+	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
+	}
+	Temperature, _ := c.GetFloat("Temperature") // 温度比列
+	Humidity, _ := c.GetFloat("Humidity")       // 适度比列
+
+	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
+	}
+	errMsg := []string{}
+
+	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.UpdateTaskDataTemperatureAndHumidityByGeometric(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)
+	if len(errMsg) > 0 {
+		c.Data["json"] = lib.JSONS{202, "", errMsg}
+		c.ServeJSON()
+		return
+	}
+	//反馈成功
+	c.Data["json"] = lib.JSONS{200, "数据等比缩放成功!", nil}
+	c.ServeJSON()
+	return
+}
+
+// 存档列表
+func (c *TaskDataController) TaskDataCopy_List() {
+
+	var r_jsons lib.R_JSONS
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	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 cnt int64
+	List, cnt := Task.Read_TaskCopy_List(Task_r.T_task_id, page, page_z)
+	page_size := math.Ceil(float64(cnt) / float64(page_z))
+	r_jsons.List = List
+	r_jsons.Page = page
+	r_jsons.Page_size = int(page_size)
+	r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
+	r_jsons.Num = int(cnt)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+// 添加存档
+func (c *TaskDataController) TaskDataCopy_Add() {
+
+	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_ := Task.TaskCopy{
+		T_task_id: T_task_id,
+		T_time:    time.Now().Format("2006-01-02 15:04:05"),
+		T_State:   1,
+	}
+
+	T_copy_id, is := Task.Add_TaskCopy(var_)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
+		c.ServeJSON()
+		return
+	}
+	// 创建数据表
+	Task.CREATE_TaskDataCopy(conf.Local_AliasName, T_copy_id)
+	// 将数据表存档
+	Task.TaskData_Arhiving(T_task_id, T_copy_id)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_copy_id}
+	c.ServeJSON()
+	return
+
+}
+
+// 删除存档
+func (c *TaskDataController) TaskDataCopy_Del() {
+
+	T_copy_id := c.GetString("T_copy_id")
+	r, err := Task.Read_TaskCopy(T_copy_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_copy_id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	is := Task.Delete_TaskCopy(r)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_copy_id}
+	c.ServeJSON()
+	return
+
+}
+
+// 存档恢复
+func (c *TaskDataController) TaskDataCopy_Recover() {
+	T_task_id := c.GetString("T_task_id")
+	T_copy_id := c.GetString("T_copy_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
+	}
+	_, err = Task.Read_TaskCopy(T_copy_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_copy_id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	is := Task.TaskData_Recover(T_task_id, T_copy_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_copy_id}
+	c.ServeJSON()
+	return
+
+}

+ 23 - 1
lib/libString.go

@@ -1,6 +1,7 @@
 package lib
 
 import (
+	"errors"
 	"math/rand"
 	"strings"
 	"time"
@@ -17,7 +18,7 @@ func GetRandstring(length int, char string, rand_x int64) string {
 	}
 
 	charArr := strings.Split(char, "")
-	ran := rand.New(rand.NewSource(time.Now().Unix() + rand_x))
+	ran := rand.New(rand.NewSource(time.Now().UnixMilli() + rand_x))
 
 	l := len(charArr)
 	for i := l - 1; i > 0; i-- {
@@ -45,3 +46,24 @@ func TimeStrToTime(T_time string) (time.Time, bool) {
 
 	return stamp, true
 }
+
+func ReplaceSeconds(timeStr string) (string, error) {
+	length := len(timeStr)
+	if length < 2 {
+		return "", errors.New("时间格式不正确")
+	}
+
+	lastTwoDigits := timeStr[length-2:]
+	if lastTwoDigits == "00" {
+		return timeStr, nil
+	}
+	t, err := time.Parse("2006-01-02 15:04:05", timeStr)
+	if err != nil {
+		return "", err
+	}
+
+	roundedTime := t.Truncate(time.Minute) // 将时间截断到分钟级别
+	roundedTimeString := roundedTime.Format("2006-01-02 15:04:00")
+
+	return roundedTimeString, nil
+}

+ 164 - 0
models/Task/TaskCopy.go

@@ -0,0 +1,164 @@
+package Task
+
+import (
+	"ColdVerify_local/conf"
+	"ColdVerify_local/lib"
+	"ColdVerify_local/logs"
+	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// 创建数据库  Device.CREATE_TaskData("")
+func CREATE_TaskDataCopy(alias_name, T_copy_id string) bool {
+	o := orm2.NewOrmUsingDB(alias_name)
+
+	sql := "DROP TABLE IF EXISTS `z_task_data_copy_" + T_copy_id + "`"
+	o.Raw(sql).Exec()
+
+	sql = "CREATE TABLE IF NOT EXISTS `z_task_data_copy_" + T_copy_id + "` ( " +
+		"  `ID` int(11) NOT NULL AUTO_INCREMENT," +
+		"	`t_sn` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL," +
+		"	`t_id` varchar(256) DEFAULT NULL," +
+		"	`t_t` float(6, 1) NULL DEFAULT NULL," +
+		"	`t_rh` float(6, 1) NULL DEFAULT NULL," +
+		"	`t_time` datetime(0) NULL DEFAULT NULL," +
+		"	PRIMARY KEY (`ID`) USING BTREE," +
+		"   KEY `t_sn` (`t_sn`)," +
+		"   KEY `t_id` (`t_id`)," +
+		"   KEY `t_time` (`t_time`)" +
+		") ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;"
+
+	_, err := o.Raw(sql).Exec()
+	if err != nil {
+		return false
+	}
+
+	//sqlIndex := "ALTER TABLE `z_task_data_" + T_task_id + "` add unique index(`t_sn`,`t_id`,`t_time`);"
+	//logs.Debug(sqlIndex)
+	//o.Raw(sqlIndex).Exec()
+	return true
+}
+
+type TaskCopy struct {
+	Id         int       `orm:"column(ID);size(11);auto;pk"`
+	T_task_id  string    `orm:"size(256);null"`                                        // 任务ID
+	T_copy_id  string    `orm:"size(256);null"`                                        // 复制id
+	T_time     string    `orm:"size(256);null"`                                        // 存档时间
+	T_State    int       `orm:"size(2);default(1)"`                                    // 0 删除   1 正常
+	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
+	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
+}
+
+func (t *Task) TableName() string {
+	return "task_copy" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+func init() {
+
+	//注册模型
+	orm.RegisterModel(new(TaskCopy))
+}
+
+// 获取 By
+func Read_TaskCopy(T_copy_id string) (r TaskCopy, err error) {
+
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(TaskCopy))
+	err = qs.Filter("T_copy_id", T_copy_id).Filter("T_State", 1).One(&r)
+	if err != nil {
+		return r, err
+	}
+	return r, nil
+}
+
+// 添加
+func Add_TaskCopy(r TaskCopy) (string, bool) {
+	o := orm.NewOrm()
+	// 生成编号
+	rand_x := 0
+	for true {
+		r.T_copy_id = lib.GetRandstring(12, "abcdefghijklmnopqrstuvwxyz0123456789", int64(rand_x)) // 1,336,336
+		err := o.Read(&r, "T_copy_id")                                                             // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
+		if err != nil {
+			break
+		}
+		rand_x += 1
+	}
+
+	_, err := o.Insert(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return "", false
+	}
+
+	return r.T_copy_id, true
+}
+
+// 删除
+func Delete_TaskCopy(v TaskCopy) bool {
+	o := orm.NewOrm()
+
+	v.T_State = 0
+	num, err := o.Update(&v, "T_State")
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return false
+	}
+
+	sql := "DROP TABLE IF EXISTS `z_task_data_copy_" + v.T_copy_id + "`"
+	o.Raw(sql).Exec()
+
+	logs.Println("Number of records deleted in database:", num)
+	return true
+}
+func Read_TaskCopy_List(T_task_id string, page int, page_z int) ([]TaskCopy, int64) {
+	o := orm.NewOrm()
+
+	qs := o.QueryTable(new(TaskCopy))
+	var r []TaskCopy
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_task_id", T_task_id).And("T_State", 1)
+
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_time").All(&r)
+	cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	return r, cnt
+}
+
+// 数据存档
+func TaskData_Arhiving(T_task_id, T_copy_id string) bool {
+
+	o := orm.NewOrm()
+
+	sql := "INSERT INTO `z_task_data_copy_" + T_copy_id + "`(`t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`)" +
+		" SELECT `t_sn`, `t_id`, `t_t`, `t_rh`, `t_time` FROM `z_task_data_" + T_task_id + "`"
+	_, err := o.Raw(sql).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return false
+	}
+	return true
+}
+
+// 数据恢复
+func TaskData_Recover(T_task_id, T_copy_id string) bool {
+
+	o := orm.NewOrm()
+	Truncate_TaskData(conf.Local_AliasName, T_task_id)
+
+	sql := "INSERT INTO `z_task_data_" + T_task_id + "`(`t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`)" +
+		" SELECT `t_sn`, `t_id`, `t_t`, `t_rh`, `t_time` FROM z_task_data_copy_" + T_copy_id
+	_, err := o.Raw(sql).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return false
+	}
+	return true
+}

+ 51 - 1
models/Task/TaskData.go

@@ -326,7 +326,7 @@ func Add_TaskData(T_task_id string, T_sn string, T_id string, T_t string, T_rh s
 	res.RowsAffected()
 
 	sql = "INSERT INTO z_task_data_" + T_task_id + " (`t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`) " +
-		"VALUES ('" + T_sn + "', " + T_id + ", " + T_t + "," + T_rh + ", '" + T_time + "')"
+		"VALUES ('" + T_sn + "', '" + T_id + "', " + T_t + "," + T_rh + ", '" + T_time + "')"
 
 	// 更新数据
 	//sql := "INSERT  INTO z_task_data_" + T_task_id + " (`t_sn`, `t_id`, `t_t`, `t_rh`, `t_time`) " +
@@ -676,3 +676,53 @@ func UpdateTaskData(T_task_id, sn, id string, old, newO TaskData_) {
 	affected, _ := exec.RowsAffected()
 	fmt.Println("执行更新行数:", affected)
 }
+
+// 查询温度最小值 最大值
+func Read_TaskData_T_Min_Max(T_task_id string, SN string, T_id string, Time_start_ string, Time_end_ string) (minT, maxT float64) {
+	o := orm.NewOrm()
+
+	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 len(T_id) > 0 {
+		sql_condition += " AND t_id = '" + 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 ")
+	}
+	//fmt.Println("maps_z;",maps_z[0][0])
+	sql := "SELECT MIN(t_t) AS min_t, MAX(t_t) AS max_t FROM z_task_data_" + T_task_id + sql_condition
+
+	fmt.Println(sql)
+	err := o.Raw(sql).QueryRow(&minT, &maxT)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return
+
+}
+
+// UpdateTaskDataTemperatureAndHumidityByGeometric 更新设备探头数据温湿度 等比缩放
+func UpdateTaskDataTemperatureAndHumidityByGeometric(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)
+}

+ 7 - 0
routers/TaskData.go

@@ -37,4 +37,11 @@ func init() {
 	beego.Router("/TaskData/DataSensorDataSmooth", &controllers.TaskDataController{}, "*:DataSensorDataSmooth")           // 数据平滑
 	beego.Router("/TaskData/CopyFromPositionAverageSN", &controllers.TaskDataController{}, "*:CopyFromPositionAverageSN") // 平均复制到
 	beego.Router("/TaskData/CopyFromPositionSN", &controllers.TaskDataController{}, "*:CopyFromPositionSN")               // 增加复制到某测点
+	beego.Router("/TaskData/DataSkewingInterval", &controllers.TaskDataController{}, "*:DataSkewingInterval")             // 数据偏移到给定区间内
+	beego.Router("/TaskData/DataGeometricScale", &controllers.TaskDataController{}, "*:DataGeometricScale")               // 数据等比咧缩放
+
+	beego.Router("/TaskDataCopy/List", &controllers.TaskDataController{}, "*:TaskDataCopy_List")       // 数据存档列表
+	beego.Router("/TaskDataCopy/Add", &controllers.TaskDataController{}, "*:TaskDataCopy_Add")         // 添加数据存档
+	beego.Router("/TaskDataCopy/Del", &controllers.TaskDataController{}, "*:TaskDataCopy_Del")         // 删除数据存档
+	beego.Router("/TaskDataCopy/Recover", &controllers.TaskDataController{}, "*:TaskDataCopy_Recover") // 数据存档恢复
 }