Browse Source

add:19个自动填写标签

zoie 2 months ago
parent
commit
11942caa02
7 changed files with 1117 additions and 92 deletions
  1. 4 4
      conf/app.conf
  2. 911 85
      controllers/TaskData.go
  3. 2 2
      controllers/TaskHandle.go
  4. 9 0
      lib/libString.go
  5. 2 0
      models/Task/Task.go
  6. 170 1
      models/Task/TaskData.go
  7. 19 0
      routers/TaskData.go

+ 4 - 4
conf/app.conf

@@ -6,14 +6,14 @@ EnableDocs = true
 copyrequestbody = true
 
 # Nats
-NatsServer_Url = "127.0.0.1:43422"
+NatsServer_Url = "203.34.49.130:4222"
 
 # 存放sql临时文件目录
 Sql_Temp_Dir = "./temp/"
 
 # Redis
 Redis_address = "182.44.114.34:6379"
-Redis_password = "redis_KJNswd"
+Redis_password = "redis_F2tj7p"
 Redis_dbNum = "2"
 
 # Mysql 本地
@@ -36,8 +36,8 @@ MysqlServer2_MaxOpenConnections = 200
 
 # Mysql 1.0
 Verify1_AliasName = "Verify1"
-MysqlVerify_UrlPort = "172.18.0.1:3300"
-MysqlVerify_Database = "cold_verify"
+MysqlVerify_UrlPort = "182.44.114.34:3306"
+MysqlVerify_Database = "coldverify"
 MysqlVerify_Username = "root"
 MysqlVerify_Password = "mysql_Ks7WAX"
 MysqlVerify_MaxIdleConnections = 100

+ 911 - 85
controllers/TaskData.go

@@ -2867,6 +2867,9 @@ func (c *TaskDataController) ListJson() {
 		"动态第一次开箱注释",
 		"动态第二次开箱注释",
 		"动态第三次开箱注释",
+		"第一次开箱注释",
+		"第二次开箱注释",
+		"第三次开箱注释",
 		"保温箱温度设定值",
 		"风机温度设定值",
 		"保温箱准备开始时间",
@@ -2889,6 +2892,8 @@ func (c *TaskDataController) ListJson() {
 		"(空载)温度偏差均匀度波动度分析时间区间",
 		"运行确认及偏差处理(满载)开始时间",
 		"运行确认及偏差处理(空载)开始时间",
+		"运行确认及偏差处理(满载)结束时间",
+		"运行确认及偏差处理(空载)结束时间",
 		"满载风机启动时间点注释",
 		"满载风机停止时间点注释",
 		"满载测试结束风机停止时间注释",
@@ -2917,6 +2922,20 @@ func (c *TaskDataController) ListJson() {
 		"冷藏车外部环境测点最低温",
 		"冷藏车内部最高温",
 		"冷藏车内部最低温",
+		"验证测试期间当地天气情况曲线图",
+		"当地历史气温数据查询曲线图",
+		"报告编号",
+		"数据分析时间",
+		"实施计划月份",
+		"计划验证实施时间",
+		"监测终端01",
+		"监测终端安装编号01",
+		"监测终端02",
+		"监测终端安装编号02",
+		"监测系统配置的测点终端参数及安装位置确认(满载)开始时间",
+		"监测系统配置的测点终端参数及安装位置确认(满载)结束时间",
+		"监测系统配置的测点终端参数及安装位置确认(空载)开始时间",
+		"监测系统配置的测点终端参数及安装位置确认(空载)结束时间",
 	}
 
 	c.Data["json"] = mySlice
@@ -2966,15 +2985,19 @@ func (c *TaskDataController) A满载测试结束风机停止时间() {
 	fmt.Println("list:", list)
 	CalculateHumps_list := Task.CalculateHumps(list)
 
-	if len(CalculateHumps_list) < 7 {
+	if len(CalculateHumps_list) < 5 {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没找到连续5个循环 !"})
 		return
 	}
 	fmt.Println("CalculateHumps_list:", CalculateHumps_list)
 	//start := CalculateHumps_list[6].Start // 驼峰开始
 	//peak := CalculateHumps_list[0]["peak"].(Task.TaskData) // 驼峰最高
-	end := CalculateHumps_list[4].End // 驼峰结束
-	// .Format("2006-01-02 15:04:05")
+	var end Task.TaskData_AVG
+	if len(CalculateHumps_list) == 5 {
+		end = CalculateHumps_list[4].End
+	} else {
+		end = CalculateHumps_list[5].End // 驼峰结束
+	}
 
 	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: end.T_time})
 
@@ -3511,13 +3534,79 @@ func (c *TaskDataController) A运行确认及偏差处理空载开始时间() {
 	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
 	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
 
-	时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(时间) == 0 || 时间 == "null" {
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+
+	柜内所有测点 := c.GetString("柜内所有测点") //  v26nplogbwt1
+	if len(柜内所有测点) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 柜内所有测点 失败!"})
+		return
+	}
+	温度控制范围最高值_ := c.GetString("温度控制范围最高值") //  v26nplogbwt1
+	if len(温度控制范围最高值_) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度控制范围最高值 失败!"})
+		return
+	}
+	温度控制范围最高值 := lib.To_float32(温度控制范围最高值_)
+
+	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
+	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
+		return
+	}
 
-	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间})
+	list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, 柜内所有测点, "", 现场测试开始时间, 现场测试结束时间, 0, 9999)
+	if len(list) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 柜内所有测点|现场测试开始时间-现场测试结束时间 当前 温度数据 失败!"})
+		return
+	}
+
+	//情况1 现场测试开始时间的温度低于温度控制范围最高值,直接取现场测试开始时间
+	firstTimeData := Task.GetFirstTimeData(list)
+	超过温度控制范围最高值 := false
+	for _, v := range firstTimeData {
+		if v.T_t > 温度控制范围最高值 {
+			超过温度控制范围最高值 = true
+		}
+	}
+	if !超过温度控制范围最高值 {
+		// 当发现数字开始上升时,结束递减状态
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: firstTimeData[0].T_time})
+		return
+	}
+
+	// 情况2 现场测试开开始时间温度高于温度控制范围最高值,取温度下降至“温度控制范围最高值”以下的第一个终端,该终端下降至最低点,并出现上升0.2℃的时间点
+
+	groupMap := make(map[string][]Task.TaskData_)
+	for _, r := range list {
+		groupMap[r.T_id] = append(groupMap[r.T_id], r)
+	}
+
+	var earliest *Task.TaskData_
+
+	// Step 2: 对每个组调用 FindFirstDecreasingToNumber
+	for _, group := range groupMap {
+		candidate := Task.FindFirstDecreasingToNumber(group, 温度控制范围最高值)
+		if candidate != nil {
+			if earliest == nil || lib.ParseTime(candidate.T_time).Before(lib.ParseTime(earliest.T_time)) {
+				earliest = candidate
+			}
+		}
+	}
+	if earliest == nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没有找到 温度下降至“温度控制范围最高值”以下 数据!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: earliest.T_time})
 	// Close the connection
 	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
 }
@@ -3529,16 +3618,293 @@ func (c *TaskDataController) A运行确认及偏差处理满载开始时间() {
 	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
 	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
 
-	时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(时间) == 0 || 时间 == "null" {
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+
+	柜内所有测点 := c.GetString("柜内所有测点") //  v26nplogbwt1
+	if len(柜内所有测点) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 柜内所有测点 失败!"})
+		return
+	}
+	温度控制范围最高值_ := c.GetString("温度控制范围最高值") //  v26nplogbwt1
+	if len(温度控制范围最高值_) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度控制范围最高值 失败!"})
+		return
+	}
+	温度控制范围最高值 := lib.To_float32(温度控制范围最高值_)
+
+	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
+	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
+		return
+	}
 
-	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间})
+	list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, 柜内所有测点, "", 现场测试开始时间, 现场测试结束时间, 0, 9999)
+	if len(list) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 柜内所有测点|现场测试开始时间-现场测试结束时间 温度数据列表 失败!"})
+		return
+	}
+
+	//情况1 现场测试开始时间的温度低于温度控制范围最高值,直接取现场测试开始时间
+	firstTimeData := Task.GetFirstTimeData(list)
+	超过温度控制范围最高值 := false
+	for _, v := range firstTimeData {
+		if v.T_t > 温度控制范围最高值 {
+			超过温度控制范围最高值 = true
+		}
+	}
+	if !超过温度控制范围最高值 {
+		// 当发现数字开始上升时,结束递减状态
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: firstTimeData[0].T_time})
+		return
+	}
+
+	// 情况2 现场测试开开始时间温度高于温度控制范围最高值,取温度下降至“温度控制范围最高值”以下的第一个终端,该终端下降至最低点,并出现上升0.2℃的时间点
+	groupMap := make(map[string][]Task.TaskData_)
+	for _, r := range list {
+		groupMap[r.T_id] = append(groupMap[r.T_id], r)
+	}
+
+	var earliest *Task.TaskData_
+
+	// Step 2: 对每个组调用 FindFirstDecreasingToNumber
+	for _, group := range groupMap {
+		candidate := Task.FindFirstDecreasingToNumber(group, 温度控制范围最高值)
+		if candidate != nil {
+			if earliest == nil || lib.ParseTime(candidate.T_time).Before(lib.ParseTime(earliest.T_time)) {
+				earliest = candidate
+			}
+		}
+	}
+	if earliest == nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没有找到 温度下降至“温度控制范围最高值”以下的第一个终端,该终端下降至最低点,并出现上升0.2℃的时间点 数据!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: earliest.T_time})
 	// Close the connection
 	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
 }
+func (c *TaskDataController) A运行确认及偏差处理空载结束时间() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+
+	柜内所有测点 := c.GetString("柜内所有测点") //  v26nplogbwt1
+	if len(柜内所有测点) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 柜内所有测点 失败!"})
+		return
+	}
+	温度控制范围最高值_ := c.GetString("温度控制范围最高值") //  v26nplogbwt1
+	if len(温度控制范围最高值_) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度控制范围最高值 失败!"})
+		return
+	}
+	温度控制范围最高值 := lib.To_float32(温度控制范围最高值_)
+
+	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
+		return
+	}
+	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
+		return
+	}
+
+	list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, 柜内所有测点, "", 现场测试开始时间, 现场测试结束时间, 0, 9999)
+	if len(list) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 柜内所有测点|现场测试开始时间-现场测试结束时间 当前 温度数据 失败!"})
+		return
+	}
+	var startTimeData *Task.TaskData_
+	//情况1 现场测试开始时间的温度低于温度控制范围最高值,直接取现场测试开始时间
+	firstTimeData := Task.GetFirstTimeData(list)
+	超过温度控制范围最高值 := false
+	for _, v := range firstTimeData {
+		if v.T_t > 温度控制范围最高值 {
+			超过温度控制范围最高值 = true
+		}
+	}
+	if !超过温度控制范围最高值 {
+		startTimeData = &firstTimeData[0]
+	} else {
+		// 情况2 现场测试开开始时间温度高于温度控制范围最高值,取温度下降至“温度控制范围最高值”以下的第一个终端,该终端下降至最低点,并出现上升0.2℃的时间点
+
+		groupMap := make(map[string][]Task.TaskData_)
+		for _, r := range list {
+			groupMap[r.T_id] = append(groupMap[r.T_id], r)
+		}
+
+		var earliest *Task.TaskData_
+
+		// Step 2: 对每个组调用 FindFirstDecreasingToNumber
+		for _, group := range groupMap {
+			candidate := Task.FindFirstDecreasingToNumber(group, 温度控制范围最高值)
+			if candidate != nil {
+				if earliest == nil || lib.ParseTime(candidate.T_time).Before(lib.ParseTime(earliest.T_time)) {
+					earliest = candidate
+				}
+			}
+		}
+		startTimeData = earliest
+	}
+
+	if startTimeData == nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没有找到 运行确认及偏差处理空载开始时间 数据!"})
+		return
+	}
+
+	list2 := Task.Read_TaskData_ById_AVG(Task_r.T_task_id, startTimeData.T_id, startTimeData.T_time, 现场测试结束时间)
+	CalculateHumps_list := Task.CalculateHumps(list2)
+
+	if len(CalculateHumps_list) < 4 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没找到连续2个循环 !"})
+		return
+	}
+
+	end := CalculateHumps_list[1].End // 驼峰结束
+	endIndex := 0
+	for i := 0; i < len(list2); i++ {
+		if list2[i].T_time == end.T_time {
+			endIndex = i
+		}
+	}
+	list3 := list2[endIndex:]
+	for i := 0; i < len(list3); i++ {
+		if list3[i].T_t >= end.T_t+0.2 {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: list3[i].T_time})
+			return
+
+		}
+	}
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没找到 开始时间过后出现第二个循环温度再次上升0.2℃的拐点时间点  数据!"})
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+func (c *TaskDataController) A运行确认及偏差处理满载结束时间() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+
+	柜内所有测点 := c.GetString("柜内所有测点") //  v26nplogbwt1
+	if len(柜内所有测点) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 柜内所有测点 失败!"})
+		return
+	}
+	温度控制范围最高值_ := c.GetString("温度控制范围最高值") //  v26nplogbwt1
+	if len(温度控制范围最高值_) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度控制范围最高值 失败!"})
+		return
+	}
+	温度控制范围最高值 := lib.To_float32(温度控制范围最高值_)
+
+	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
+		return
+	}
+	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
+		return
+	}
+
+	list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, 柜内所有测点, "", 现场测试开始时间, 现场测试结束时间, 0, 9999)
+	if len(list) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 柜内所有测点|现场测试开始时间-现场测试结束时间 温度数据列表 失败!"})
+		return
+	}
+	var startTimeData *Task.TaskData_
+	//情况1 现场测试开始时间的温度低于温度控制范围最高值,直接取现场测试开始时间
+	firstTimeData := Task.GetFirstTimeData(list)
+	超过温度控制范围最高值 := false
+	for _, v := range firstTimeData {
+		if v.T_t > 温度控制范围最高值 {
+			超过温度控制范围最高值 = true
+		}
+	}
+	if !超过温度控制范围最高值 {
+		startTimeData = &firstTimeData[0]
+	} else {
+		// 情况2 现场测试开开始时间温度高于温度控制范围最高值,取温度下降至“温度控制范围最高值”以下的第一个终端,该终端下降至最低点,并出现上升0.2℃的时间点
+
+		groupMap := make(map[string][]Task.TaskData_)
+		for _, r := range list {
+			groupMap[r.T_id] = append(groupMap[r.T_id], r)
+		}
+
+		var earliest *Task.TaskData_
+
+		// Step 2: 对每个组调用 FindFirstDecreasingToNumber
+		for _, group := range groupMap {
+			candidate := Task.FindFirstDecreasingToNumber(group, 温度控制范围最高值)
+			if candidate != nil {
+				if earliest == nil || lib.ParseTime(candidate.T_time).Before(lib.ParseTime(earliest.T_time)) {
+					earliest = candidate
+				}
+			}
+		}
+		startTimeData = earliest
+	}
+
+	if startTimeData == nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没有找到 运行确认及偏差处理空载开始时间 数据!"})
+		return
+	}
+
+	list2 := Task.Read_TaskData_ById_AVG(Task_r.T_task_id, startTimeData.T_sn, startTimeData.T_time, 现场测试结束时间)
+	CalculateHumps_list := Task.CalculateHumps(list2)
+
+	if len(CalculateHumps_list) < 4 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没找到连续2个循环 !"})
+		return
+	}
+
+	end := CalculateHumps_list[1].End // 驼峰结束
+	endIndex := 0
+	for i := 0; i < len(list2); i++ {
+		if list2[i].T_time == end.T_time {
+			endIndex = i
+		}
+	}
+	list3 := list2[endIndex:]
+	for i := 0; i < len(list3); i++ {
+		if list3[i].T_t >= end.T_t+0.2 {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: list3[i].T_time})
+			return
+		}
+	}
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没找到 开始时间过后出现第二个循环温度再次上升0.2℃的拐点时间点  数据!"})
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+
+}
 func (c *TaskDataController) A空载温度偏差均匀度波动度分析时间区间() {
 
 	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
@@ -3548,12 +3914,12 @@ func (c *TaskDataController) A空载温度偏差均匀度波动度分析时间
 	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
 
 	时间1 := c.GetString("监测系统配置的测点终端参数及安装位置确认(空载)开始时间") //  v26nplogbwt1
-	if len(时间1) == 0 {
+	if len(时间1) == 0 || 时间1 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(空载)开始时间 失败!"})
 		return
 	}
 	时间2 := c.GetString("监测系统配置的测点终端参数及安装位置确认(空载)结束时间") //  v26nplogbwt1
-	if len(时间2) == 0 {
+	if len(时间2) == 0 || 时间2 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(空载)结束时间 失败!"})
 		return
 	}
@@ -3571,12 +3937,12 @@ func (c *TaskDataController) A满载温度偏差均匀度波动度分析时间
 	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
 
 	时间1 := c.GetString("监测系统配置的测点终端参数及安装位置确认(满载)开始时间") //  v26nplogbwt1
-	if len(时间1) == 0 {
+	if len(时间1) == 0 || 时间1 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(满载)开始时间 失败!"})
 		return
 	}
 	时间2 := c.GetString("监测系统配置的测点终端参数及安装位置确认(满载)结束时间") //  v26nplogbwt1
-	if len(时间2) == 0 {
+	if len(时间2) == 0 || 时间2 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(满载)结束时间 失败!"})
 		return
 	}
@@ -3665,13 +4031,20 @@ func (c *TaskDataController) A温度分布特性的测试与分析空载结束
 	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
 	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
 
-	时间 := c.GetString("监测系统配置的测点终端参数及安装位置确认(空载)结束时间") //  v26nplogbwt1
-	if len(时间) == 0 || 时间 == "null" {
-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(空载)结束时间 失败!"})
-		return
+	时间1 := c.GetString("监测系统配置的测点终端参数及安装位置确认(空载)结束时间") //  v26nplogbwt1
+	时间2 := c.GetString("温度自动监测设备放置位置结束时间")
+
+	if len(时间1) == 0 || 时间1 == "null" {
+		if len(时间2) == 0 || 时间2 == "null" {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(空载)结束时间 或 温度自动监测设备放置位置结束时间 失败!"})
+			return
+		} else {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间2})
+			return
+		}
 	}
 
-	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间})
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间1})
 	// Close the connection
 	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
 }
@@ -3683,13 +4056,20 @@ func (c *TaskDataController) A温度分布特性的测试与分析满载结束
 	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
 	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
 
-	时间 := c.GetString("监测系统配置的测点终端参数及安装位置确认(满载)结束时间") //  v26nplogbwt1
-	if len(时间) == 0 || 时间 == "null" {
-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(满载)结束时间 失败!"})
-		return
+	时间1 := c.GetString("监测系统配置的测点终端参数及安装位置确认(满载)结束时间") //  v26nplogbwt1
+	时间2 := c.GetString("温度自动监测设备放置位置结束时间")
+
+	if len(时间1) == 0 || 时间1 == "null" {
+		if len(时间2) == 0 || 时间2 == "null" {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(满载)结束时间 或 温度自动监测设备放置位置结束时间 失败!"})
+			return
+		} else {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间2})
+			return
+		}
 	}
 
-	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间})
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间1})
 	// Close the connection
 	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
 }
@@ -3701,13 +4081,20 @@ func (c *TaskDataController) A温度分布特性的测试与分析空载开始
 	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
 	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
 
-	时间 := c.GetString("监测系统配置的测点终端参数及安装位置确认(空载)开始时间") //  v26nplogbwt1
-	if len(时间) == 0 || 时间 == "null" {
-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(空载)开始时间 失败!"})
-		return
+	时间1 := c.GetString("监测系统配置的测点终端参数及安装位置确认(空载)开始时间") //  v26nplogbwt1
+	时间2 := c.GetString("温度自动监测设备放置位置开始时间")
+
+	if len(时间1) == 0 || 时间1 == "null" {
+		if len(时间2) == 0 || 时间2 == "null" {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(空载)开始时间 或 温度自动监测设备放置位置开始时间 失败!"})
+			return
+		} else {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间2})
+			return
+		}
 	}
 
-	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间})
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间1})
 	// Close the connection
 	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
 }
@@ -3720,13 +4107,20 @@ func (c *TaskDataController) A温度分布特性的测试与分析满载开始
 	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
 	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
 
-	时间 := c.GetString("监测系统配置的测点终端参数及安装位置确认(满载)开始时间") //  v26nplogbwt1
-	if len(时间) == 0 || 时间 == "null" {
-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(满载)开始时间 失败!"})
-		return
-	}
+	时间1 := c.GetString("监测系统配置的测点终端参数及安装位置确认(满载)开始时间") //  v26nplogbwt1
+	时间2 := c.GetString("温度自动监测设备放置位置开始时间")
 
-	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间})
+	if len(时间1) == 0 || 时间1 == "null" {
+		if len(时间2) == 0 || 时间2 == "null" {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测系统配置的测点终端参数及安装位置确认(满载)开始时间 或 温度自动监测设备放置位置开始时间 失败!"})
+			return
+		} else {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间2})
+			return
+		}
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间1})
 	// Close the connection
 	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
 }
@@ -3828,7 +4222,7 @@ func (c *TaskDataController) A温度自动监测设备放置位置结束时间()
 		return
 	}
 	温度自动监测设备放置位置开始时间 := c.GetString("温度自动监测设备放置位置开始时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置开始时间) == 0 {
+	if len(温度自动监测设备放置位置开始时间) == 0 || 温度自动监测设备放置位置开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度自动监测设备放置位置开始时间 失败!"})
 		return
 	}
@@ -3879,13 +4273,13 @@ func (c *TaskDataController) A温度自动监测设备放置位置开始时间()
 		return
 	}
 
-	温湿度系统测点 := c.GetString("温湿度系统测点") //  v26nplogbwt1
-	if len(温湿度系统测点) == 0 {
-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温湿度系统测点 失败!"})
+	监测终端01 := c.GetString("监测终端01") //  v26nplogbwt1
+	if len(监测终端01) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 监测终端01 失败!"})
 		return
 	}
 
-	list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, 温湿度系统测点, "", "", "", 0, 1)
+	list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, 监测终端01, "", "", "", 0, 1)
 	if len(list) == 0 {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没找到 温湿度系统测点 数据!"})
 		return
@@ -3937,15 +4331,15 @@ func (c *TaskDataController) A冰排预冷保温箱准备结束时间() {
 		return
 	}
 	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
-	温度自动监测设备放置位置开始时间 := c.GetString("温度自动监测设备放置位置开始时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置开始时间) == 0 {
-		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度自动监测设备放置位置开始时间 失败!"})
-		return
-	}
+	//温度自动监测设备放置位置开始时间 := c.GetString("温度自动监测设备放置位置开始时间") //  v26nplogbwt1
+	//if len(温度自动监测设备放置位置开始时间) == 0 {
+	//	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度自动监测设备放置位置开始时间 失败!"})
+	//	return
+	//}
 	温度范围最高值_ := c.GetString("温度范围最高值") //  v26nplogbwt1
 	if len(温度范围最高值_) == 0 {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度范围最高值 失败!"})
@@ -4144,6 +4538,81 @@ func (c *TaskDataController) A静态第一次开箱注释() {
 	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
 }
 
+func (c *TaskDataController) A第三次开箱注释() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	时间1 := c.GetString("静态第三次开箱开始时间")
+	时间2 := c.GetString("动态第三次开箱开始时间")
+	if len(时间1) == 0 || 时间1 == "null" {
+		if len(时间2) == 0 || 时间2 == "null" {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 静/动态第三次开箱开始时间 失败!"})
+			return
+		} else {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间2 + "/" + 时间2})
+			return
+		}
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间1 + "/" + 时间1})
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+
+func (c *TaskDataController) A第二次开箱注释() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	时间1 := c.GetString("静态第二次开箱开始时间")
+	时间2 := c.GetString("动态第二次开箱开始时间")
+	if len(时间1) == 0 || 时间1 == "null" {
+		if len(时间2) == 0 || 时间2 == "null" {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 静/动态第二次开箱开始时间 失败!"})
+			return
+		} else {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间2 + "/" + 时间2})
+			return
+		}
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间1 + "/" + 时间1})
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+
+func (c *TaskDataController) A第一次开箱注释() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	时间1 := c.GetString("静态第一次开箱开始时间") //  v26nplogbwt1
+	时间2 := c.GetString("动态第一次开箱开始时间") //  v26nplogbwt1
+	if len(时间1) == 0 || 时间1 == "null" {
+		if len(时间2) == 0 || 时间2 == "null" {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 静/动态第一次开箱开始时间 失败!"})
+			return
+		} else {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间2 + "/" + 时间2})
+			return
+		}
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 时间1 + "/" + 时间1})
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+
 // 冰排释冷监测设备|冰排释冷开始时间  当前 温度数据
 func (c *TaskDataController) A冰排释冷分割线最低温() {
 
@@ -4166,7 +4635,7 @@ func (c *TaskDataController) A冰排释冷分割线最低温() {
 	}
 
 	冰排释冷开始时间 := c.GetString("冰排释冷开始时间") //  v26nplogbwt1
-	if len(冰排释冷开始时间) == 0 {
+	if len(冰排释冷开始时间) == 0 || 冰排释冷开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 冰排释冷开始时间 失败!"})
 		return
 	}
@@ -4204,7 +4673,7 @@ func (c *TaskDataController) A冰排释冷分割线最高温() {
 	}
 
 	冰排释冷结束时间 := c.GetString("冰排释冷结束时间") //  v26nplogbwt1
-	if len(冰排释冷结束时间) == 0 {
+	if len(冰排释冷结束时间) == 0 || 冰排释冷结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 冰排释冷结束时间 失败!"})
 		return
 	}
@@ -4247,12 +4716,12 @@ func (c *TaskDataController) A冰排释冷结束时间() {
 		return
 	}
 	冰排释冷开始时间 := c.GetString("冰排释冷开始时间") //  v26nplogbwt1
-	if len(冰排释冷开始时间) == 0 {
+	if len(冰排释冷开始时间) == 0 || 冰排释冷开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 冰排释冷开始时间 失败!"})
 		return
 	}
 	温度自动监测设备放置位置开始时间 := c.GetString("温度自动监测设备放置位置开始时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置开始时间) == 0 {
+	if len(温度自动监测设备放置位置开始时间) == 0 || 温度自动监测设备放置位置开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度自动监测设备放置位置开始时间 失败!"})
 		return
 	}
@@ -4293,12 +4762,12 @@ func (c *TaskDataController) A冰排释冷开始时间() {
 		return
 	}
 	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
 	温度自动监测设备放置位置开始时间 := c.GetString("温度自动监测设备放置位置开始时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置开始时间) == 0 {
+	if len(温度自动监测设备放置位置开始时间) == 0 || 温度自动监测设备放置位置开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度自动监测设备放置位置开始时间 失败!"})
 		return
 	}
@@ -4338,12 +4807,12 @@ func (c *TaskDataController) A外部环境分割线最高温() {
 		return
 	}
 	温度自动监测设备放置位置开始时间 := c.GetString("温度自动监测设备放置位置开始时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置开始时间) == 0 {
+	if len(温度自动监测设备放置位置开始时间) == 0 || 温度自动监测设备放置位置开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度自动监测设备放置位置开始时间 失败!"})
 		return
 	}
 	温度自动监测设备放置位置结束时间 := c.GetString("温度自动监测设备放置位置结束时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置结束时间) == 0 {
+	if len(温度自动监测设备放置位置结束时间) == 0 || 温度自动监测设备放置位置结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度自动监测设备放置位置结束时间 失败!"})
 		return
 	}
@@ -4377,12 +4846,12 @@ func (c *TaskDataController) A外部环境分割线最低温() {
 		return
 	}
 	温度自动监测设备放置位置开始时间 := c.GetString("温度自动监测设备放置位置开始时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置开始时间) == 0 {
+	if len(温度自动监测设备放置位置开始时间) == 0 || 温度自动监测设备放置位置开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度自动监测设备放置位置开始时间 失败!"})
 		return
 	}
 	温度自动监测设备放置位置结束时间 := c.GetString("温度自动监测设备放置位置结束时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置结束时间) == 0 {
+	if len(温度自动监测设备放置位置结束时间) == 0 || 温度自动监测设备放置位置结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 温度自动监测设备放置位置结束时间 失败!"})
 		return
 	}
@@ -4416,20 +4885,20 @@ func (c *TaskDataController) A冷藏柜外部环境测点最高温() {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 冷藏柜外部环境测点 失败!"})
 		return
 	}
-	温度自动监测设备放置位置开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置开始时间) == 0 {
+	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
-	温度自动监测设备放置位置结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置结束时间) == 0 {
+	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
 		return
 	}
 
-	_, maxT := Task.Read_TaskData_T_Min_Max(Task_r.T_task_id, 保温箱外环境测点, "", 温度自动监测设备放置位置开始时间, 温度自动监测设备放置位置结束时间)
+	_, maxT := Task.Read_TaskData_T_Min_Max(Task_r.T_task_id, 保温箱外环境测点, "", 现场测试开始时间, 现场测试结束时间)
 
-	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: fmt.Sprintf("%.1f", math.Ceil(float64(maxT*10))/10)})
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: fmt.Sprintf("%.1f", math.Ceil(float64(maxT*10))/10+0.5)})
 
 	// Close the connection
 	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
@@ -4455,20 +4924,20 @@ func (c *TaskDataController) A冷藏柜外部环境测点最低温() {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 冷藏柜外部环境测点 失败!"})
 		return
 	}
-	温度自动监测设备放置位置开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置开始时间) == 0 {
+	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
-	温度自动监测设备放置位置结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
-	if len(温度自动监测设备放置位置结束时间) == 0 {
+	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
 		return
 	}
 
-	minT, _ := Task.Read_TaskData_T_Min_Max(Task_r.T_task_id, 保温箱外环境测点, "", 温度自动监测设备放置位置开始时间, 温度自动监测设备放置位置结束时间)
+	minT, _ := Task.Read_TaskData_T_Min_Max(Task_r.T_task_id, 保温箱外环境测点, "", 现场测试开始时间, 现场测试结束时间)
 
-	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: fmt.Sprintf("%.1f", math.Ceil(float64(minT*10))/10)})
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: fmt.Sprintf("%.1f", math.Ceil(float64(minT*10))/10-0.5)})
 
 	// Close the connection
 	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
@@ -4545,7 +5014,7 @@ func (c *TaskDataController) A满载第一次关门温度恢复时间() {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 第一次开门结束时间 失败!"})
 		return
 	}
-	第一次开门结束时间_a, err := time.Parse("2006-01-02 15:04:05", 第一次开门结束时间)
+	第一次开门结束时间_a, err := time.Parse("2006-01-02 15:04", 第一次开门结束时间)
 	第一次开门结束时间_b := 第一次开门结束时间_a
 
 	for x := 0; x < 60; x++ {
@@ -4631,7 +5100,7 @@ func (c *TaskDataController) A空载第一次关门温度恢复时间() {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 第一次开门结束时间 失败!"})
 		return
 	}
-	第一次开门结束时间_a, err := time.Parse("2006-01-02 15:04:05", 第一次开门结束时间)
+	第一次开门结束时间_a, err := time.Parse("2006-01-02 15:04", 第一次开门结束时间)
 	第一次开门结束时间_b := 第一次开门结束时间_a
 
 	for x := 0; x < 60; x++ {
@@ -4695,14 +5164,14 @@ func (c *TaskDataController) A满载开门最长需要多少分钟恢复() {
 	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
 
 	恢复时间_ := c.GetString("满载第一次关门温度恢复时间") //  v26nplogbwt1
-	恢复时间, err := time.Parse("2006-01-02 15:04:05", 恢复时间_)
+	恢复时间, err := time.Parse("2006-01-02 15:04", 恢复时间_)
 	if err != nil {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 满载第一次关门温度恢复时间 失败!"})
 		return
 	}
 
 	结束时间_ := c.GetString("第一次开门结束时间") //  v26nplogbwt1
-	结束时间, err := time.Parse("2006-01-02 15:04:05", 结束时间_)
+	结束时间, err := time.Parse("2006-01-02 15:04", 结束时间_)
 	if err != nil {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 第一次开门结束时间 失败!"})
 		return
@@ -4723,14 +5192,14 @@ func (c *TaskDataController) A空载开门最长需要多少分钟恢复() {
 	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
 
 	恢复时间_ := c.GetString("空载第一次关门温度恢复时间") //  v26nplogbwt1
-	恢复时间, err := time.Parse("2006-01-02 15:04:05", 恢复时间_)
+	恢复时间, err := time.Parse("2006-01-02 15:04", 恢复时间_)
 	if err != nil {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 空载第一次关门温度恢复时间 失败!"})
 		return
 	}
 
 	结束时间_ := c.GetString("第一次开门结束时间") //  v26nplogbwt1
-	结束时间, err := time.Parse("2006-01-02 15:04:05", 结束时间_)
+	结束时间, err := time.Parse("2006-01-02 15:04", 结束时间_)
 	if err != nil {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 第一次开门结束时间 失败!"})
 		return
@@ -4762,12 +5231,12 @@ func (c *TaskDataController) A冷藏库作业口外部环境分割线最低温()
 	}
 
 	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
 	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
 		return
 	}
@@ -4800,12 +5269,12 @@ func (c *TaskDataController) A冷藏库作业口外部环境分割线最高温()
 	}
 
 	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
 	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
 		return
 	}
@@ -4838,12 +5307,12 @@ func (c *TaskDataController) A冷藏库外部环境测点最高温() {
 	}
 
 	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
 	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
 		return
 	}
@@ -4876,12 +5345,12 @@ func (c *TaskDataController) A冷藏库外部环境测点最低温() {
 	}
 
 	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
 	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
 		return
 	}
@@ -4955,12 +5424,12 @@ func (c *TaskDataController) A冷藏车外部环境测点最高温() {
 	}
 
 	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
 	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
 		return
 	}
@@ -4993,12 +5462,12 @@ func (c *TaskDataController) A冷藏车外部环境测点最低温() {
 	}
 
 	现场测试开始时间 := c.GetString("现场测试开始时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试开始时间) == 0 || 现场测试开始时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
 		return
 	}
 	现场测试结束时间 := c.GetString("现场测试结束时间") //  v26nplogbwt1
-	if len(现场测试开始时间) == 0 {
+	if len(现场测试结束时间) == 0 || 现场测试结束时间 == "null" {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试结束时间 失败!"})
 		return
 	}
@@ -5050,3 +5519,360 @@ func (c *TaskDataController) A冷藏车内部最高温() {
 	// Close the connection
 	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
 }
+
+func (c *TaskDataController) A验证测试期间当地天气情况曲线图() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	验证测试期间当地天气情况图 := c.GetString("验证测试期间当地天气情况图") //  v26nplogbwt1
+	if len(验证测试期间当地天气情况图) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 验证测试期间当地天气情况图 失败!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: strings.Replace(验证测试期间当地天气情况图, "1.png", "2.png", 1)})
+
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+func (c *TaskDataController) A当地历史气温数据查询曲线图() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	验证测试期间当地天气情况图 := c.GetString("验证测试期间当地天气情况图") //  v26nplogbwt1
+	if len(验证测试期间当地天气情况图) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 验证测试期间当地天气情况图 失败!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: strings.Replace(验证测试期间当地天气情况图, "1.png", "3.png", 1)})
+
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+
+func (c *TaskDataController) A报告编号() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: Task_r.T_report_number})
+
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+
+func (c *TaskDataController) A数据分析时间() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	报告日期 := c.GetString("报告日期") //  v26nplogbwt1
+	if len(报告日期) == 0 || 报告日期 == "null" {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 报告日期 失败!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 报告日期})
+
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+func (c *TaskDataController) A实施计划月份() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	现场测试开始时间_ := c.GetString("现场测试开始时间") //  v26nplogbwt1
+	现场测试开始时间, err := time.Parse("2006-01-02 15:04", 现场测试开始时间_)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 现场测试开始时间.Format("2006年01月")})
+
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+func (c *TaskDataController) A计划验证实施时间() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	现场测试开始时间_ := c.GetString("现场测试开始时间") //  v26nplogbwt1
+	现场测试开始时间, err := time.Parse("2006-01-02 15:04", 现场测试开始时间_)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 现场测试开始时间 失败!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 现场测试开始时间.Format("2006年01月")})
+
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+func (c *TaskDataController) A监测终端01() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+
+	DeviceClassList_r := Device.Read_DeviceClassList_List_id(Task_r.T_class)
+	for _, v := range DeviceClassList_r {
+		if strings.Contains(v.T_sn, "-1") {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: v.T_sn})
+
+			// Close the connection
+			c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+			return
+		}
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没有找到 SN-1 终端!"})
+	return
+
+}
+func (c *TaskDataController) A监测终端安装编号01() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+
+	DeviceClassList_r := Device.Read_DeviceClassList_List_id(Task_r.T_class)
+	for _, v := range DeviceClassList_r {
+		if strings.Contains(v.T_sn, "-1") {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: v.T_sn})
+
+			// Close the connection
+			c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+			return
+		}
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没有找到 SN-1 终端!"})
+	return
+}
+func (c *TaskDataController) A监测终端02() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+
+	DeviceClassList_r := Device.Read_DeviceClassList_List_id(Task_r.T_class)
+	for _, v := range DeviceClassList_r {
+		if strings.Contains(v.T_sn, "-2") {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: v.T_sn})
+
+			// Close the connection
+			c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+			return
+		}
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没有找到 SN-2 终端!"})
+	return
+
+}
+func (c *TaskDataController) A监测终端安装编号02() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+
+	DeviceClassList_r := Device.Read_DeviceClassList_List_id(Task_r.T_class)
+	for _, v := range DeviceClassList_r {
+		if strings.Contains(v.T_sn, "-2") {
+			lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: v.T_sn})
+
+			// Close the connection
+			c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+			return
+		}
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "没有找到 SN-2 终端!"})
+	return
+}
+
+func (c *TaskDataController) A监测系统配置的测点终端参数及安装位置确认满载开始时间() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	运行确认及偏差处理满载结束时间 := c.GetString("运行确认及偏差处理满载结束时间") //  v26nplogbwt1
+	if len(运行确认及偏差处理满载结束时间) == 0 || 运行确认及偏差处理满载结束时间 == "null" {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 运行确认及偏差处理满载结束时间 失败!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 运行确认及偏差处理满载结束时间})
+
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+func (c *TaskDataController) A监测系统配置的测点终端参数及安装位置确认满载结束时间() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	开满开 := c.GetString("开满开")
+	if len(开满开) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 开满开 失败!"})
+		return
+	}
+
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+
+	DeviceClassList_r := Device.Read_DeviceClassList_List_id(Task_r.T_class)
+	var T_sn string
+	for _, v := range DeviceClassList_r {
+		if strings.Contains(v.T_id, "-") {
+			T_sn = v.T_sn
+			break
+		}
+	}
+	if len(T_sn) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 终端 失败!"})
+		return
+	}
+	list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, T_sn, "", "", 开满开, 0, 9999)
+
+	if len(list) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 终端数据 失败!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: list[len(list)-1].T_time})
+
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+func (c *TaskDataController) A监测系统配置的测点终端参数及安装位置确认空载开始时间() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	运行确认及偏差处理空载结束时间 := c.GetString("运行确认及偏差处理空载结束时间") //  v26nplogbwt1
+	if len(运行确认及偏差处理空载结束时间) == 0 || 运行确认及偏差处理空载结束时间 == "null" {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 运行确认及偏差处理空载结束时间 失败!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: 运行确认及偏差处理空载结束时间})
+
+	// Close the connection
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}
+func (c *TaskDataController) A监测系统配置的测点终端参数及安装位置确认空载结束时间() {
+
+	T_task_id := c.GetString("T_task_id") //  v26nplogbwt1
+	println("T_task_id:", T_task_id)
+	c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
+	c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
+	c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
+
+	开满开 := c.GetString("开满开")
+	if len(开满开) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 开满开 失败!"})
+		return
+	}
+
+	Task_r, err := Task.Read_Task(T_task_id)
+	if err != nil {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取任务信息失败!"})
+		return
+	}
+
+	DeviceClassList_r := Device.Read_DeviceClassList_List_id(Task_r.T_class)
+	var T_sn string
+	for _, v := range DeviceClassList_r {
+		if strings.Contains(v.T_id, "-") {
+			T_sn = v.T_sn
+			break
+		}
+	}
+	if len(T_sn) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 终端 失败!"})
+		return
+	}
+	list, _ := Task.Read_TaskData_ById_List_AES(Task_r.T_task_id, T_sn, "", "", 开满开, 0, 9999)
+
+	if len(list) == 0 {
+		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "获取 终端数据 失败!"})
+		return
+	}
+
+	lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 1, Msg: list[len(list)-1].T_time})
+
+	c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
+}

+ 2 - 2
controllers/TaskHandle.go

@@ -867,9 +867,9 @@ func (c *TaskDataHandleController) SSE_Interval_data_correction() {
 	//List_data, _ := Task.Read_TaskData_ById_List(Task_r.T_task_id, 部点终端_list[0].T_sn, 部点终端_list[0].T_id, "", "", 0, 9999)
 	//开始时间 := List_data[len(List_data) - 1].T_time
 
-	开始时间 := VerifyTemplate.Read_VerifyTemplateMapData_T_name(Task_r.T_task_id, Task_r.T_VerifyTemplate_id, "温度分布特性的测试与分析(空载)开始时间")
+	开始时间 := VerifyTemplate.Read_VerifyTemplateMapData_T_name(Task_r.T_task_id, Task_r.T_VerifyTemplate_id, "运行确认及偏差处理(空载)开始时间")
 	if len(开始时间) == 0 {
-		开始时间 = VerifyTemplate.Read_VerifyTemplateMapData_T_name(Task_r.T_task_id, Task_r.T_VerifyTemplate_id, "温度分布特性的测试与分析(满载)开始时间")
+		开始时间 = VerifyTemplate.Read_VerifyTemplateMapData_T_name(Task_r.T_task_id, Task_r.T_VerifyTemplate_id, "运行确认及偏差处理(满载)开始时间")
 	}
 	if len(开始时间) == 0 {
 		lib.SseWriteJSON(c.Ctx.ResponseWriter, lib.JSONSSE{State: 2, Msg: "未找到开始时间 标签!"})

+ 9 - 0
lib/libString.go

@@ -48,6 +48,15 @@ func TimeStrToTime(T_time string) (time.Time, bool) {
 	return stamp, true
 }
 
+func ParseTime(T_time string) time.Time {
+	stamp, err := time.ParseInLocation("2006-01-02 15:04:05", T_time, time.Local) // +8
+	if err != nil {
+		return time.Time{}
+	}
+
+	return stamp
+}
+
 func ReplaceSeconds(timeStr string) (string, error) {
 	length := len(timeStr)
 	if length < 2 {

+ 2 - 0
models/Task/Task.go

@@ -112,6 +112,8 @@ type Task struct {
 	T_reporting_audit_record  string  `orm:"type(text);null"` // 验证报告审核记录
 	T_reporting_pass_time     string  `orm:"size(256);null"`  // 验证报告负责人通过时间
 
+	T_device_quantity int `orm:"size(20);default(0)"` //  终端数量 T_device_type=WZ 必填
+
 	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 保存时都会对时间自动更新
 }

+ 170 - 1
models/Task/TaskData.go

@@ -274,6 +274,7 @@ func Read_TaskData_ById_List_AES(T_task_id string, SN string, T_id string, Time_
 				}
 			}
 			query += ") " // 结束 SQL 查询
+			sql_condition += query
 
 		} else {
 			sql_condition += " AND t_sn = '" + SN + "'"
@@ -355,6 +356,7 @@ func Read_TaskData_ById_List_SQL(T_task_id string, SQL, SN string, T_id string,
 				}
 			}
 			query += ") " // 结束 SQL 查询
+			sql_condition += query
 
 		} else {
 			sql_condition += " AND t_sn = '" + SN + "'"
@@ -441,7 +443,7 @@ func Read_TaskData_ById_AVG(T_task_id string, SN string, Time_start_ string, Tim
 				}
 			}
 			query += ") " // 结束 SQL 查询
-
+			sql_condition += query
 		} else {
 			sql_condition += " AND t_sn = '" + SN + "'"
 		}
@@ -1247,6 +1249,7 @@ func Read_TaskData_T_Min_Max_Time_Min_Max_ListGROUP(T_task_id string, SN string,
 					}
 				}
 				query += ") " // 结束 SQL 查询
+				sql_condition += query
 
 			} else {
 				sql_condition += " AND t_sn = '" + SN + "'"
@@ -1550,3 +1553,169 @@ func CalculateHumps(data []TaskData_AVG) []CalculateHumps_R {
 
 	return humps
 }
+
+// 根据温度获取列表
+func Read_TaskData_ByT_t_List_AES(T_task_id string, SN string, T_t float32, Time_start_ string, Time_end_ string) ([]TaskData_, int64) {
+	o := orm.NewOrm()
+	var maps []TaskData_
+	var maps_z []orm2.ParamsList
+
+	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_t > 0 {
+		sql_condition += fmt.Sprintf(" AND t_t = %f", T_t)
+	}
+	if len(SN) > 0 {
+		if strings.Contains(SN, "|") {
+			// 将字符串按 | 分割
+			ids := strings.Split(strings.TrimSuffix(SN, "|"), "|")
+
+			// 构建 SQL 查询
+			query := " AND t_sn IN ("
+			// 动态添加每个 id
+			for i, id := range ids {
+				query += "'" + id + "'"
+				if i < len(ids)-1 {
+					query += ", " // 添加逗号分隔
+				}
+			}
+			query += ") " // 结束 SQL 查询
+			sql_condition += query
+
+		} else {
+			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"
+
+	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 GetFirstTimeData(data []TaskData_) (list []TaskData_) {
+	if len(data) == 0 {
+		return list
+	}
+	for i := 0; i < len(data); i++ {
+		if data[i].T_time == data[0].T_time {
+			list = append(list, data[i])
+		}
+	}
+	return list
+
+}
+
+func FindFirstDecreasingToNumber(data []TaskData_, number float32) *TaskData_ {
+	if len(data) < 2 {
+		return nil
+	}
+
+	startIndex := -1
+	for i := 0; i < len(data); i++ {
+		if data[i].T_t > number {
+			startIndex = i
+			break
+		}
+	}
+	if startIndex == -1 {
+		return nil
+	}
+
+	inDecreasing := false
+	record := data[startIndex:]
+	prev := record[0]
+
+	for i := 1; i < len(record); i++ {
+		curr := record[i]
+		if curr.T_t < prev.T_t {
+			// 下降趋势
+			if !inDecreasing {
+				inDecreasing = true
+			}
+			// 判断是否到达 8
+			if curr.T_t <= number {
+				return &curr
+			}
+		} else {
+			// 趋势中断,重置
+			inDecreasing = false
+		}
+		prev = curr
+	}
+
+	var dropStartIndex = -1
+	var dropEndIndex = -1
+
+	// 阶段 1: 识别首次下降趋势
+	for i := 1; i < len(record); i++ {
+		if record[i].T_t < record[i-1].T_t {
+			if dropStartIndex == -1 {
+				dropStartIndex = i - 1
+			}
+			dropEndIndex = i
+		} else if dropStartIndex != -1 {
+			break
+		}
+	}
+
+	// 如果没找到下降段
+	if dropStartIndex == -1 || dropEndIndex == -1 {
+		return nil
+	}
+
+	// 找最低点
+	minRecord := record[dropStartIndex]
+	for i := dropStartIndex + 1; i <= dropEndIndex; i++ {
+		if record[i].T_t < minRecord.T_t {
+			minRecord = record[i]
+		}
+	}
+
+	// 阶段 2: 从最低点开始向后找 ≥ min + 0.2℃ 的记录
+	minTemp := minRecord.T_t
+	minIndex := -1
+	for i, r := range record {
+		if r.ID == minRecord.ID {
+			minIndex = i
+			break
+		}
+	}
+
+	for i := minIndex + 1; i < len(record); i++ {
+		if record[i].T_t >= minTemp+0.2 {
+			return &record[i]
+		}
+	}
+
+	return nil
+}

+ 19 - 0
routers/TaskData.go

@@ -86,6 +86,9 @@ func init() {
 	beego.Router("/TaskDataContent/SSE_动态第一次开箱注释", &controllers.TaskDataController{}, "*:A动态第一次开箱注释")
 	beego.Router("/TaskDataContent/SSE_动态第二次开箱注释", &controllers.TaskDataController{}, "*:A动态第二次开箱注释")
 	beego.Router("/TaskDataContent/SSE_动态第三次开箱注释", &controllers.TaskDataController{}, "*:A动态第三次开箱注释")
+	beego.Router("/TaskDataContent/SSE_第一次开箱注释", &controllers.TaskDataController{}, "*:A第一次开箱注释")
+	beego.Router("/TaskDataContent/SSE_第二次开箱注释", &controllers.TaskDataController{}, "*:A第二次开箱注释")
+	beego.Router("/TaskDataContent/SSE_第三次开箱注释", &controllers.TaskDataController{}, "*:A第三次开箱注释")
 	beego.Router("/TaskDataContent/SSE_保温箱温度设定值", &controllers.TaskDataController{}, "*:A保温箱温度设定值")
 	beego.Router("/TaskDataContent/SSE_风机温度设定值", &controllers.TaskDataController{}, "*:A风机温度设定值")
 	beego.Router("/TaskDataContent/SSE_保温箱准备开始时间", &controllers.TaskDataController{}, "*:A保温箱准备开始时间")
@@ -108,6 +111,8 @@ func init() {
 	beego.Router("/TaskDataContent/SSE_空载温度偏差均匀度波动度分析时间区间", &controllers.TaskDataController{}, "*:A空载温度偏差均匀度波动度分析时间区间")
 	beego.Router("/TaskDataContent/SSE_运行确认及偏差处理满载开始时间", &controllers.TaskDataController{}, "*:A运行确认及偏差处理满载开始时间")
 	beego.Router("/TaskDataContent/SSE_运行确认及偏差处理空载开始时间", &controllers.TaskDataController{}, "*:A运行确认及偏差处理空载开始时间")
+	beego.Router("/TaskDataContent/SSE_运行确认及偏差处理满载结束时间", &controllers.TaskDataController{}, "*:A运行确认及偏差处理满载结束时间")
+	beego.Router("/TaskDataContent/SSE_运行确认及偏差处理空载结束时间", &controllers.TaskDataController{}, "*:A运行确认及偏差处理空载结束时间")
 	beego.Router("/TaskDataContent/SSE_满载风机启动时间点注释", &controllers.TaskDataController{}, "*:A满载风机启动时间点注释")
 	beego.Router("/TaskDataContent/SSE_满载风机停止时间点注释", &controllers.TaskDataController{}, "*:A满载风机停止时间点注释")
 	beego.Router("/TaskDataContent/SSE_满载测试结束风机停止时间注释", &controllers.TaskDataController{}, "*:A满载测试结束风机停止时间注释")
@@ -136,5 +141,19 @@ func init() {
 	beego.Router("/TaskDataContent/SSE_冷藏车外部环境测点最低温", &controllers.TaskDataController{}, "*:A冷藏车外部环境测点最低温")
 	beego.Router("/TaskDataContent/SSE_冷藏车内部最高温", &controllers.TaskDataController{}, "*:A冷藏车内部最高温")
 	beego.Router("/TaskDataContent/SSE_冷藏车内部最低温", &controllers.TaskDataController{}, "*:A冷藏车内部最低温")
+	beego.Router("/TaskDataContent/SSE_验证测试期间当地天气情况曲线图", &controllers.TaskDataController{}, "*:A验证测试期间当地天气情况曲线图")
+	beego.Router("/TaskDataContent/SSE_当地历史气温数据查询曲线图", &controllers.TaskDataController{}, "*:A当地历史气温数据查询曲线图")
+	beego.Router("/TaskDataContent/SSE_报告编号", &controllers.TaskDataController{}, "*:A报告编号")
+	beego.Router("/TaskDataContent/SSE_数据分析时间", &controllers.TaskDataController{}, "*:A数据分析时间")
+	beego.Router("/TaskDataContent/SSE_实施计划月份", &controllers.TaskDataController{}, "*:A实施计划月份")
+	beego.Router("/TaskDataContent/SSE_计划验证实施时间", &controllers.TaskDataController{}, "*:A计划验证实施时间")
+	beego.Router("/TaskDataContent/SSE_监测终端01", &controllers.TaskDataController{}, "*:A监测终端01")
+	beego.Router("/TaskDataContent/SSE_监测终端安装编号01", &controllers.TaskDataController{}, "*:A监测终端安装编号01")
+	beego.Router("/TaskDataContent/SSE_监测终端02", &controllers.TaskDataController{}, "*:A监测终端02")
+	beego.Router("/TaskDataContent/SSE_监测终端安装编号02", &controllers.TaskDataController{}, "*:A监测终端安装编号02")
+	beego.Router("/TaskDataContent/SSE_监测系统配置的测点终端参数及安装位置确认满载开始时间", &controllers.TaskDataController{}, "*:A监测系统配置的测点终端参数及安装位置确认满载开始时间")
+	beego.Router("/TaskDataContent/SSE_监测系统配置的测点终端参数及安装位置确认满载结束时间", &controllers.TaskDataController{}, "*:A监测系统配置的测点终端参数及安装位置确认满载结束时间")
+	beego.Router("/TaskDataContent/SSE_监测系统配置的测点终端参数及安装位置确认空载开始时间", &controllers.TaskDataController{}, "*:A监测系统配置的测点终端参数及安装位置确认空载开始时间")
+	beego.Router("/TaskDataContent/SSE_监测系统配置的测点终端参数及安装位置确认空载结束时间", &controllers.TaskDataController{}, "*:A监测系统配置的测点终端参数及安装位置确认空载结束时间")
 
 }