|
@@ -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)]
|
|
|
+}
|