Browse Source

add:用户添加签名管理,app提交添加消息通知,生成报告后app提交在方案和报告页面显示是否同步

zoie 1 month ago
parent
commit
e3b33d6785

+ 5 - 1
conf/app.conf

@@ -43,4 +43,8 @@ VdelUuid = "1c13436c-4511-4030-8b26-baadad88445a"
 OpenApi_Key = "coldverify"
 OpenApi_Secret = "H3L9OPQR2VX8ZZYN7STKFG5JMWB1CV4D"
 
-PdfProcessingHost = "https://coldverify-u.coldbaozhida.com/PdfProcessing"
+PdfProcessingHost = "https://coldverify-u.coldbaozhida.com/PdfProcessing"
+
+UseVerifyTemplateMapDataHistoryTime = "2025-09-25 23:59:59"
+
+DeviceListMaximum = 600

+ 5 - 1
conf/app_prod.conf

@@ -23,6 +23,8 @@ Redis_password = "redis_F2tj7p"
 Redis_dbNum = "2"
 
 
+UseVerifyTemplateMapDataHistoryTime = "2025-08-25 23:59:59"
+
 
 # 静态资源
 Qiniu_AccessKey = "-8ezB_d-8-eUFTMvhOGbGzgeQRPeKQnaQ3DBcUxo"
@@ -43,4 +45,6 @@ VdelUuid = "1c13436c-4511-4030-8b26-baadad88445a"
 OpenApi_Key = "coldverify"
 OpenApi_Secret = "H3L9OPQR2VX8ZZYN7STKFG5JMWB1CV4D"
 
-PdfProcessingHost = "https://coldverify-u.coldbaozhida.com/PdfProcessing"
+PdfProcessingHost = "https://coldverify-u.coldbaozhida.com/PdfProcessing"
+
+UseVerifyTemplateMapDataHistoryTime = "2025-08-25 23:59:59"

+ 3 - 1
conf/app_test.conf

@@ -43,4 +43,6 @@ VdelUuid = "1c13436c-4511-4030-8b26-baadad88445a"
 OpenApi_Key = "coldverify"
 OpenApi_Secret = "H3L9OPQR2VX8ZZYN7STKFG5JMWB1CV4D"
 
-PdfProcessingHost = "https://coldverify-u.coldbaozhida.com/PdfProcessing"
+PdfProcessingHost = "https://coldverify-u.coldbaozhida.com/PdfProcessing"
+
+UseVerifyTemplateMapDataHistoryTime = "2025-08-25 23:59:59"

+ 3 - 0
conf/config.go

@@ -45,3 +45,6 @@ var OpenApi_Key, _ = beego.AppConfig.String("OpenApi_Key")
 var OpenApi_Secret, _ = beego.AppConfig.String("OpenApi_Secret")
 
 var PdfProcessingHost, _ = beego.AppConfig.String("PdfProcessingHost")
+
+var UseVerifyTemplateMapDataHistoryTime, _ = beego.AppConfig.String("UseVerifyTemplateMapDataHistoryTime")
+var DeviceListMaximum, _ = beego.AppConfig.String("DeviceListMaximum")

+ 7 - 0
controllers/DeviceClass.go

@@ -884,6 +884,13 @@ func (c *DeviceClassController) Auto_fill_Remark() {
 	return
 }
 
+func (c *DeviceClassController) List_Maximum() {
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: conf.DeviceListMaximum}
+	c.ServeJSON()
+	return
+}
+
 func FilterByRange(data []Device.DeviceClassList, condition string) []Device.DeviceClassList {
 	var result []Device.DeviceClassList
 	parts := strings.Split(condition, ",")

+ 1 - 1
controllers/Distributor.go

@@ -179,7 +179,7 @@ func (c *DistributorController) List_All() {
 		return
 	}
 
-	if User_r.T_power > 2 || len(User_r.T_Distributor_id) > 0 {
+	if len(User_r.T_Distributor_id) > 0 {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "无权操作!"}
 		c.ServeJSON()
 		return

+ 2 - 1
controllers/News.go

@@ -35,7 +35,8 @@ func (c *NewsController) List() {
 	// 查询
 	T_title := c.GetString("T_title")
 	T_Tag, _ := c.GetInt("T_Tag")
-	List, cnt := System.Read_News_List(User_r.T_uuid, T_title, T_Tag, page, page_z)
+	T_app, _ := c.GetInt("T_app") // 1-app 0-系统
+	List, cnt := System.Read_News_List(User_r.T_uuid, T_title, T_Tag, T_app, page, page_z)
 	var r_jsons lib.R_JSONS
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.List = List

+ 5 - 5
controllers/Task.go

@@ -1023,10 +1023,10 @@ func (c *TaskController) Up() {
 	T_record := c.GetString("T_record")
 
 	T_doc1 := c.GetString("T_doc1")
-	T_pdf1 := c.GetString("T_pdf1") // 方案
+	T_pdf1 := c.GetString("T_pdf1")              // 方案
 	T_pdf1_stamp, _ := c.GetBool("T_pdf1_stamp") // 方案加盖公章
 	T_doc2 := c.GetString("T_doc2")
-	T_pdf2 := c.GetString("T_pdf2") // 证书
+	T_pdf2 := c.GetString("T_pdf2")              // 证书
 	T_pdf2_stamp, _ := c.GetBool("T_pdf2_stamp") // 报告加盖公章
 
 	T_doc3 := c.GetString("T_doc3")
@@ -3072,7 +3072,7 @@ func (c *TaskController) Copy() {
 		}
 		MapDataList = append(MapDataList, val)
 	}
-	_, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "")
+	_, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "复制", 0, 0, 1)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
 		c.ServeJSON()
@@ -3187,7 +3187,7 @@ func (c *TaskController) Auto_fill_deploy() {
 		}
 	}
 
-	ids, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, T_source, User_r.T_uuid)
+	ids, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, T_source, User_r.T_uuid, 0, 0, 0)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
 		c.ServeJSON()
@@ -3254,7 +3254,7 @@ func (c *TaskController) SyncVerifyTemplateMapData() {
 		MapDataList = append(MapDataList, val)
 	}
 	var ids []int64
-	ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "")
+	ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "", 0, 0, 0)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
 		c.ServeJSON()

+ 14 - 0
controllers/TaskData.go

@@ -183,7 +183,21 @@ func (c *TaskDataController) Extract_TaskData_Back() {
 			return
 		}
 
+		err := Task.CorrectionSecond(T_task_id)
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return
+		}
+
+		// 删除重复数据
+		_, err = Task.DeleteDeduplicate(T_task_id)
+		if err != nil {
+			logs.Error(lib.FuncName(), "sql 删除重复数据失败")
+			return
+		}
+
 	}(resp, Task_r)
+
 	System.Add_UserLogs_T(resp.T_uuid, "任务", "修改", Task_r)
 	System.Add_UserLogs(resp.T_uuid, "提取数据", "提取数据"+Task_r.T_name, Task_r.T_task_id+"|"+resp.Time_start+"|"+resp.Time_end)
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}

+ 159 - 0
controllers/User.go

@@ -259,3 +259,162 @@ func (c *UserController) UpPassword() {
 	c.ServeJSON()
 	return
 }
+
+// 列表 -
+func (c *UserController) Signature_List() {
+	// 验证登录 User_is, User_r
+	user_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !User_is {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
+		c.ServeJSON()
+		return
+	}
+
+	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_name := c.GetString("T_name")
+
+	var cnt int64
+	var distributorMap map[string]string
+	//distributorList := Distributor.Read_Distributor_List_ALL("")
+	//distributorMap := Distributor.DistributorListToMap(distributorList)
+	List, cnt := Account.Read_UserSignature_List(user_r.T_uuid, T_name, page, page_z, distributorMap)
+	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 *UserController) Signature_Add() {
+	// 验证登录 User_is, User_r
+	user_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !User_is {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
+		c.ServeJSON()
+		return
+	}
+
+	T_name := c.GetString("T_name")
+	T_signature := c.GetString("T_signature")
+
+	var_ := Account.UserSignature{
+		T_name:           T_name,
+		T_signature:      T_signature,
+		T_State:          1,
+		T_uuid:           user_r.T_uuid,           // 用户uuid
+		T_Distributor_id: user_r.T_Distributor_id, // 经销商id
+	}
+
+	if _, is := Account.Read_UserSignatureByT_name(user_r.T_uuid, T_name); is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "名称重复!"}
+		c.ServeJSON()
+		return
+	}
+
+	Id, is := Account.Add_UserSignature(var_)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
+		c.ServeJSON()
+		return
+	}
+	System.Add_UserLogs_T(user_r.T_uuid, "用户管理", "添加签名", var_)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Id}
+	c.ServeJSON()
+	return
+}
+
+// 修改-
+func (c *UserController) Signature_Up() {
+	// 验证登录 User_is, User_r
+	user_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !User_is {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
+		c.ServeJSON()
+		return
+	}
+
+	Id, _ := c.GetInt("Id")
+	T_name := c.GetString("T_name")
+	T_signature := c.GetString("T_signature")
+
+	r, is := Account.Read_UserSignature_ById(Id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
+		c.ServeJSON()
+		return
+	}
+	if r2, is := Account.Read_UserSignatureByT_name(user_r.T_uuid, T_name); is && r2.Id != r.Id {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "名称重复!"}
+		c.ServeJSON()
+		return
+	}
+
+	// .......
+	//if T_power_err == nil {
+	//	r.T_power = T_power
+	//}
+	if len(T_name) > 0 {
+		r.T_name = T_name
+	}
+	if len(T_signature) > 0 {
+		r.T_signature = T_signature
+	}
+
+	// .......
+	if !Account.Update_UserSignature(r, "T_name", "T_signature") {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
+		c.ServeJSON()
+		return
+	}
+	System.Add_UserLogs_T(user_r.T_uuid, "用户管理", "修改签名", r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
+// 删除-
+func (c *UserController) Signature_Del() {
+	user_r, User_is := Account.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !User_is {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
+		c.ServeJSON()
+		return
+	}
+
+	Id, _ := c.GetInt("Id")
+
+	r, is := Account.Read_UserSignature_ById(Id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	if !Account.Delete_UserSignature(r) {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+	System.Add_UserLogs_T(user_r.T_uuid, "用户管理", "删除签名", r)
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+
+	return
+}

+ 142 - 7
controllers/VerifyTemplate.go

@@ -656,6 +656,8 @@ func (c *VerifyTemplateController) Map_Data_Pu() {
 		T_task_id             string
 		T_VerifyTemplate_id   string
 		T_step                int // 进行步骤下标
+		T_submit              int // 1-app 2-报告生成
+		T_history             int // 0不保存历史 1保存历史
 		VerifyTemplateMapData []VerifyTemplate.VerifyTemplateMapData_R
 	}
 
@@ -667,6 +669,8 @@ func (c *VerifyTemplateController) Map_Data_Pu() {
 		c.ServeJSON()
 	}
 
+	logs.Println(fmt.Sprintf("%+v", body))
+
 	User_r, User_is := Account.Verification_Admin(body.User_tokey, "")
 	if !User_is {
 		System.Add_UserLogs_T(User_r.T_uuid, "验证模版标签数据", "未登录-保存", body)
@@ -682,9 +686,12 @@ func (c *VerifyTemplateController) Map_Data_Pu() {
 		c.ServeJSON()
 		return
 	}
-
+	T_reporting_state := task.T_reporting_state
 	task.T_step = body.T_step
-	if !Task.Update_Task(task, "T_step") {
+	if body.T_submit == 2 && T_reporting_state == 0 {
+		task.T_reporting_state = 6
+	}
+	if !Task.Update_Task(task, "T_step", "T_reporting_state") {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改任务步骤失败!"}
 		c.ServeJSON()
 		return
@@ -731,12 +738,46 @@ func (c *VerifyTemplateController) Map_Data_Pu() {
 			}
 		}
 	}
-	ids, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, body.T_source, User_r.T_uuid)
+	var T_cover int
+	if body.T_submit == 1 && T_reporting_state > 0 {
+		T_cover = 1
+	}
+	ids, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, body.T_source, User_r.T_uuid, body.T_submit, T_cover, body.T_history)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
 		c.ServeJSON()
 		return
 	}
+
+	// 手机app提交,发送消息通知
+	if body.T_submit == 1 {
+		_, company_r := Account.Read_User_ByT_uuid(task.T_uuid)
+		_, admin_r := Account.Read_Admin_ByT_uuid(task.T_collection)
+		System.Add_App_News(conf.VdelUuid, fmt.Sprintf("【%s-%s】数据采集工程师 %s 已提交", company_r.T_name, task.T_name, admin_r.T_name), "")
+
+	}
+
+	// 报告生成,备份数据
+	if body.T_submit == 2 {
+		var_ := Task.TaskCopy{
+			T_task_id: task.T_task_id,
+			T_time:    "报告生成数据",
+			T_State:   2,
+		}
+
+		T_copy_id, is2 := Task.Add_TaskCopy(var_)
+		if !is2 {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
+			c.ServeJSON()
+			return
+		}
+		// 创建数据表
+		Task.CREATE_TaskDataCopy("default", T_copy_id)
+		// 将数据表存档
+		Task.TaskData_Arhiving(task.T_task_id, T_copy_id)
+
+	}
+
 	System.Add_UserLogs_T(User_r.T_uuid, "验证模版标签数据", "保存", body)
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: ids}
@@ -806,7 +847,7 @@ func (c *VerifyTemplateController) Map_Data_Copy2() {
 		MapDataList = append(MapDataList, val)
 	}
 	var ids []int64
-	ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, T_source, User_r.T_uuid)
+	ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, T_source, User_r.T_uuid, 0, 0, 0)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
 		c.ServeJSON()
@@ -891,7 +932,7 @@ func (c *VerifyTemplateController) Map_Data_Copy() {
 		MapDataList = append(MapDataList, val)
 	}
 	var ids []int64
-	ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "")
+	ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "", 0, 0, 0)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
 		c.ServeJSON()
@@ -915,7 +956,7 @@ func (c *VerifyTemplateController) Map_Data_History_List() {
 	}
 	T_task_id := c.GetString("T_task_id")
 	T_source, _ := c.GetInt("T_source")
-	_, is := Task.Read_Task(T_task_id)
+	task, is := Task.Read_Task(T_task_id)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
 		c.ServeJSON()
@@ -924,7 +965,15 @@ func (c *VerifyTemplateController) Map_Data_History_List() {
 
 	AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
 
-	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: VerifyTemplate.Read_VerifyTemplateMapDataHistory_History_List(T_task_id, T_source, AdminMap)}
+	UseVerifyTemplateMapDataHistoryTime, _ := lib.TimeStrToTime(conf.UseVerifyTemplateMapDataHistoryTime)
+	var Data []VerifyTemplate.VerifyTemplateMapDataHistory_History_List_Res
+	if len(conf.UseVerifyTemplateMapDataHistoryTime) > 0 && task.CreateTime.After(UseVerifyTemplateMapDataHistoryTime) {
+		Data = VerifyTemplate.Read_VerifyTemplateMapDataHistory_History_List2(T_task_id, T_source, AdminMap)
+	} else {
+		Data = VerifyTemplate.Read_VerifyTemplateMapDataHistory_History_List(T_task_id, T_source, AdminMap)
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Data}
 	c.ServeJSON()
 	return
 }
@@ -1085,6 +1134,92 @@ func (c *VerifyTemplateController) Map_Data_History_Recover() {
 	return
 }
 
+// 覆盖数据
+func (c *VerifyTemplateController) Map_Data_Cover() {
+	// 验证登录 User_is, User_r
+	User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !User_is {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
+		c.ServeJSON()
+		return
+	}
+
+	T_cover, _ := c.GetInt("T_cover") // 1覆盖 0不覆盖
+
+	T_time := c.GetString("T_time")
+	if len(T_time) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "请选择时间点!"}
+		c.ServeJSON()
+		return
+	}
+	T_source, _ := c.GetInt("T_source")
+
+	if T_source == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_source Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	T_task_id := c.GetString("T_task_id")
+	task, is := Task.Read_Task(T_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
+		c.ServeJSON()
+		return
+	}
+	var ids []int64
+	if T_cover == 1 {
+		HistoryList := VerifyTemplate.Read_MapDataHistory_List(T_source, T_task_id, task.T_VerifyTemplate_id, T_time)
+
+		list := VerifyTemplate.Read_MapData_List(T_source, T_task_id, task.T_VerifyTemplate_id)
+		HistoryListMap := make(map[string]VerifyTemplate.VerifyTemplateMapDataHistory)
+		for _, data := range HistoryList {
+			HistoryListMap[data.T_VerifyTemplateMap_id] = data
+		}
+
+		MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
+		for _, v := range list {
+			if len(v.T_value) > 0 {
+				continue
+			}
+			if HistoryListMap[v.T_VerifyTemplateMap_id].T_value == "" {
+				continue
+			}
+			val := VerifyTemplate.VerifyTemplateMapData{
+				T_source:               T_source,
+				T_task_id:              task.T_task_id,
+				T_VerifyTemplate_id:    task.T_VerifyTemplate_id,
+				T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
+				T_Required:             v.T_Required,
+				T_Construction:         v.T_Construction,
+
+				T_flow_sort: v.T_flow_sort,
+				T_max_time:  v.T_max_time,
+				T_min_time:  v.T_min_time,
+
+				T_value: HistoryListMap[v.T_VerifyTemplateMap_id].T_value,
+			}
+			MapDataList = append(MapDataList, val)
+		}
+
+		ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData(MapDataList)
+		if !is {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
+			c.ServeJSON()
+			return
+		}
+		System.Add_UserLogs_T(User_r.T_uuid, "验证模版标签数据", "覆盖", MapDataList)
+	}
+
+	task.T_cover = 0
+	task.T_backup = ""
+	Task.Update_Task(task, "T_cover", "T_backup")
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: ids}
+	c.ServeJSON()
+	return
+}
+
 func (c *VerifyTemplateController) Class_List() {
 	// 验证登录 User_is, User_r
 	User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))

+ 126 - 5
controllers/infoCollection.go

@@ -1,14 +1,17 @@
 package controllers
 
 import (
+	"ColdVerify_server/Nats/NatsServer"
 	"ColdVerify_server/conf"
 	"ColdVerify_server/lib"
 	"ColdVerify_server/lib/wx"
 	"ColdVerify_server/logs"
 	"ColdVerify_server/models/Account"
+	"ColdVerify_server/models/Device"
 	"ColdVerify_server/models/InfoCollection"
 	"ColdVerify_server/models/System"
 	"ColdVerify_server/models/Task"
+	"ColdVerify_server/models/VerifyTemplate"
 	"encoding/json"
 	"fmt"
 	beego "github.com/beego/beego/v2/server/web"
@@ -456,7 +459,7 @@ func (c *InfoCollectionController) Copy() {
 
 	T_name := c.GetString("T_name")
 	T_InfoCollection_id := c.GetString("T_InfoCollection_id") // 信息采集id
-	r, is := InfoCollection.Read_InfoCollection(T_InfoCollection_id)
+	info, is := InfoCollection.Read_InfoCollection(T_InfoCollection_id)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
 		c.ServeJSON()
@@ -464,13 +467,14 @@ func (c *InfoCollectionController) Copy() {
 	}
 
 	var_ := InfoCollection.InfoCollection{
-		T_uuid:               r.T_uuid,
+		T_uuid:               info.T_uuid,
 		T_name:               T_name,
-		T_InfoTemplate_class: r.T_InfoTemplate_class,
-		T_InfoTemplate_id:    r.T_InfoTemplate_id,
+		T_InfoTemplate_class: info.T_InfoTemplate_class,
+		T_InfoTemplate_id:    info.T_InfoTemplate_id,
 		T_status:             1,
 		T_State:              1,
 		T_submit_uuid:        User_r.T_uuid,
+		T_start_time:         time.Now().Format("2006-01-02 15:04:05"),
 	}
 
 	T_InfoCollection_id, err := InfoCollection.Add_InfoCollection(var_)
@@ -479,7 +483,124 @@ func (c *InfoCollectionController) Copy() {
 		c.ServeJSON()
 		return
 	}
-	System.Add_UserLogs_T(User_r.T_uuid, "信息采集管理", "复制", r)
+
+	// 查询信息采集下的任务列表
+	taskList, _ := Task.Read_Task_List_By_T_InfoCollection_id(info.T_InfoCollection_id)
+	for _, r := range taskList {
+		dc := Device.DeviceClass{
+			T_uuid:  User_r.T_uuid,
+			T_State: 1,
+		}
+		T_class_id, is2 := Device.Add_DeviceClass(dc)
+		if !is2 {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加分类失败!"}
+			c.ServeJSON()
+			return
+		}
+		System.Add_UserLogs_T(User_r.T_uuid, "分类管理", "添加", dc)
+
+		ta := Task.Task{
+			T_Distributor_id:       r.T_Distributor_id,
+			T_InfoCollection_id:    T_InfoCollection_id,
+			T_InfoTemplate_id:      info.T_InfoTemplate_id,
+			T_start_time:           time.Now().Format("2006-01-02 15:04:05"), // 项目开始时间使用信息采集开始时间
+			T_class:                int(T_class_id),
+			T_uuid:                 r.T_uuid,
+			T_name:                 r.T_name,
+			T_VerifyTemplate_class: r.T_VerifyTemplate_class,
+			T_VerifyTemplate_id:    r.T_VerifyTemplate_id,
+			T_deadline:             r.T_deadline,
+			T_scheme:               r.T_scheme,
+			T_collection:           r.T_collection,
+			T_reporting:            r.T_reporting,
+			T_delivery:             r.T_delivery,
+			T_Show:                 1,
+			T_State:                1,
+
+			T_project:         r.T_project,
+			T_province:        r.T_province,
+			T_city:            r.T_city,
+			T_district:        r.T_district,
+			T_province_code:   r.T_province_code,
+			T_city_code:       r.T_city_code,
+			T_district_code:   r.T_district_code,
+			T_category:        r.T_category,
+			T_device_type:     r.T_device_type,
+			T_volume:          r.T_volume,
+			T_verify_type:     r.T_verify_type,
+			T_subject_matter:  r.T_subject_matter,
+			T_temp_range:      r.T_temp_range,
+			T_report_type:     r.T_report_type,
+			T_device_quantity: r.T_device_quantity,
+			T_cnas:            r.T_cnas,
+		}
+		ta.T_report_number, _ = Task.GenerateNextT_report_number(ta.T_device_type)
+		T_paste_task_id, is := Task.Add_Task(ta)
+		if !is {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
+			c.ServeJSON()
+			return
+		}
+		NatsServer.Create_Local_Table(T_paste_task_id)
+		Task.Redis_Task_T_report_number_DelK(ta.T_report_number) // 删除redis内的任务编号
+
+		// 复制验证模版数据
+		Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(r.T_VerifyTemplate_id, 0, 0)
+		copy_task_Data := VerifyTemplate.Read_VerifyTemplateMapData_List(0, r.T_task_id, r.T_VerifyTemplate_id, Map_List)
+
+		Data := VerifyTemplate.Read_VerifyTemplateMapData_List(0, T_paste_task_id, r.T_VerifyTemplate_id, Map_List)
+
+		copyDataMap := make(map[string]string)
+		for _, data := range copy_task_Data {
+			copyDataMap[data.T_name] = data.T_value
+		}
+
+		MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
+		for _, v := range Data {
+			// 已有值则不复制
+			if len(v.T_value) > 0 {
+				continue
+			}
+			if copyDataMap[v.T_name] == "" {
+				continue
+			}
+			val := VerifyTemplate.VerifyTemplateMapData{
+				T_source:               v.T_source,
+				T_task_id:              T_paste_task_id,
+				T_VerifyTemplate_id:    r.T_VerifyTemplate_id,
+				T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
+				T_Required:             v.T_Required,
+				T_Construction:         v.T_Construction,
+
+				T_flow_sort: v.T_flow_sort,
+				T_max_time:  v.T_max_time,
+				T_min_time:  v.T_min_time,
+
+				T_value: copyDataMap[v.T_name],
+			}
+			MapDataList = append(MapDataList, val)
+		}
+		_, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "复制", 0, 0, 1)
+		if !is {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
+			c.ServeJSON()
+			return
+		}
+		System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "复制标签数据", MapDataList)
+
+		// 通知
+		_, company_r := Account.Read_User_ByT_uuid(var_.T_uuid)
+		go wx.WxSend(ta.T_scheme, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
+		go wx.WxSend(ta.T_collection, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
+		go wx.WxSend(ta.T_reporting, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
+		go wx.WxSend(ta.T_delivery, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
+
+		// 添加任务操作日志
+		Task.Add_TaskLogs_T(User_r.T_uuid, T_paste_task_id, "任务管理", "复制", var_)
+		System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "复制", var_)
+	}
+
+	System.Add_UserLogs_T(User_r.T_uuid, "信息采集管理", "复制", info)
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
 	return

+ 144 - 0
models/Account/UserSignature.go

@@ -0,0 +1,144 @@
+package Account
+
+import (
+	"ColdVerify_server/lib"
+	"ColdVerify_server/logs"
+	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	_ "github.com/go-sql-driver/mysql"
+	"log"
+	"time"
+)
+
+type UserSignature struct {
+	Id               int       `orm:"column(ID);size(11);auto;pk"`
+	T_Distributor_id string    `orm:"size(256);null"`                                        // 分销商id
+	T_uuid           string    `orm:"size(256);null"`                                        // 公司uuid
+	T_name           string    `orm:"size(256);null"`                                        // 姓名
+	T_signature      string    `orm:"size(256);null"`                                        // 签名
+	T_State          int       `orm:"size(200);default(1)"`                                  // 0删除  1正常
+	CreateTime       time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now 每次 model 保存时都会对时间自动更新
+	UpdateTime       time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now_add 第一次保存时才设置时间
+}
+type UserSignature_R struct {
+	Id                 int
+	T_Distributor_id   string
+	T_Distributor_name string
+	T_uuid             string
+	T_name             string
+	T_signature        string
+}
+
+func (t *UserSignature) TableName() string {
+	return "user_signature" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(UserSignature))
+
+}
+
+// -------------------------------------------------------------
+func UserSignatureToUserSignature_R(T UserSignature, distributorMap map[string]string) (T_r UserSignature_R) {
+	T_r.Id = T.Id
+	T_r.T_uuid = T.T_uuid
+	T_r.T_Distributor_id = T.T_Distributor_id
+	T_Distributor_name, ok := distributorMap[T.T_Distributor_id]
+	if !ok {
+		T_Distributor_name = ""
+	}
+	T_r.T_Distributor_name = T_Distributor_name
+	T_r.T_name = T.T_name
+	T_r.T_signature = T.T_signature
+
+	return T_r
+}
+
+// 获取 ById
+func Read_UserSignature_ById(id int) (r UserSignature, is bool) {
+	o := orm.NewOrm()
+	r = UserSignature{Id: id, T_State: 1}
+	err := o.Read(&r, "T_State", "Id") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return r, false
+	}
+	return r, true
+}
+
+// 获取 By T_name
+func Read_UserSignatureByT_name(T_uuid, T_name string) (r UserSignature, is bool) {
+
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(UserSignature))
+	err := qs.Filter("T_uuid", T_uuid).Filter("T_name", T_name).Filter("T_State", 1).One(&r)
+	if err != nil {
+		return r, false
+	}
+
+	return r, true
+}
+
+// 添加
+func Add_UserSignature(r UserSignature) (id int64, is bool) {
+	o := orm.NewOrm()
+	id, err := o.Insert(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return 0, false
+	}
+
+	return id, true
+}
+
+// 删除
+func Delete_UserSignature(v UserSignature) bool {
+	o := orm.NewOrm()
+	v.T_State = 0
+	if num, err := o.Update(&v, "T_State"); err == nil {
+		log.Println("Number of records updated in database:", num)
+	} else {
+		return false
+	}
+
+	return true
+}
+
+// 修改
+func Update_UserSignature(m UserSignature, cols ...string) bool {
+	o := orm.NewOrm()
+	if num, err := o.Update(&m, cols...); err == nil {
+		log.Println("Number of records updated in database:", num)
+
+		return true
+	}
+	return false
+}
+
+// 获取列表
+func Read_UserSignature_List(T_uuid string, T_name string, page int, page_z int, distributorMap map[string]string) ([]UserSignature_R, int64) {
+	o := orm.NewOrm()
+
+	// 也可以直接使用 Model 结构体作为表名
+	var r []UserSignature
+	qs := o.QueryTable(new(UserSignature))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_State", 1).And("T_uuid", T_uuid).AndCond(cond.Or("T_name__icontains", T_name))
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
+	cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	// 转换
+	var UserSignature_r []UserSignature_R
+	for _, v := range r {
+		UserSignature_r = append(UserSignature_r, UserSignatureToUserSignature_R(v, distributorMap))
+	}
+
+	return UserSignature_r, cnt
+}

+ 20 - 4
models/System/News.go

@@ -15,6 +15,7 @@ type News struct {
 	T_Title    string    `orm:"size(256);null"`                                        // 标题
 	T_Url      string    `orm:"size(256);null"`                                        // 地址
 	T_Tag      int       `orm:"size(2);null"`                                          // 标记   0未阅读   1 已阅读
+	T_app      int       `orm:"size(2);null"`                                          // app提交   0 其他   1 app
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now 每次 model 保存时都会对时间自动更新
 }
 type News_R struct {
@@ -58,6 +59,19 @@ func Add_News(T_uuid, T_Title, T_Url string) {
 	//}
 	//return id, err
 }
+func Add_App_News(T_uuid, T_Title, T_Url string) {
+	r := News{T_uuid: T_uuid, T_Title: T_Title, T_Url: T_Url, T_app: 1}
+
+	o := orm.NewOrm()
+
+	r.T_Tag = 0
+	o.Insert(&r)
+	//id, err = o.Insert(&r)
+	//if err != nil {
+	//	fmt.Println(err)
+	//}
+	//return id, err
+}
 
 // 发送微信通知
 func Send_Weichat_News(T_admin_name, T_Title, T_Url string) {
@@ -70,13 +84,10 @@ func Send_Weichat_News(T_admin_name, T_Title, T_Url string) {
 		}).
 		Post(conf.WechatNews_Url)
 
-
-
-
 }
 
 // 获取列表
-func Read_News_List(T_uuid string, T_Title string, T_Tag int, page int, page_z int) (r_ []News_R, cnt int64) {
+func Read_News_List(T_uuid string, T_Title string, T_Tag, T_app int, page int, page_z int) (r_ []News_R, cnt int64) {
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 	qs := o.QueryTable(new(News))
@@ -90,6 +101,11 @@ func Read_News_List(T_uuid string, T_Title string, T_Tag int, page int, page_z i
 	// 过滤
 	cond := orm.NewCondition()
 	cond1 := cond.And("T_uuid", T_uuid) //  .AndNot("status__in", 1).Or("profile__age__gt", 2000)
+	if T_app == 1 {
+		cond1 = cond1.And("T_app", 1)
+	} else {
+		cond1 = cond1.AndNot("T_app", 1)
+	}
 
 	if len(T_Title) > 0 {
 		//cond1.AndCond(cond.And("T_class", class))

+ 74 - 0
models/Task/Task.go

@@ -286,6 +286,9 @@ type Task struct {
 	T_device_quantity int `orm:"size(20);default(0)"`  //  终端数量 T_device_type=WZ 必填
 	T_cnas            int `orm:"size(256);default(0)"` // 0-否 1-是
 
+	T_cover  int    `orm:"size(20);default(0)"` // 是否覆盖询问
+	T_backup string `orm:"size(256);null"`      // 历史数据记录
+
 	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 保存时都会对时间自动更新
 }
@@ -360,6 +363,9 @@ type Task_ struct {
 	T_device_quantity int
 	T_cnas            int // cnas实验室
 
+	T_cover  int    // 是否覆盖询问
+	T_backup string // 历史数据记录
+
 }
 
 type Task_Stat struct {
@@ -469,6 +475,9 @@ type Task_Stat struct {
 	T_device_quantity int
 	T_cnas            int // cnas实验室
 
+	T_cover  int    // 是否覆盖询问
+	T_backup string // 历史数据记录
+
 }
 
 func (t *Task) TableName() string {
@@ -570,6 +579,9 @@ func TaskToTask_(T Task, userMap, adminMap map[string]string) (T_ Task_) {
 	T_.T_device_quantity = T.T_device_quantity
 	T_.T_cnas = T.T_cnas
 
+	T_.T_cover = T.T_cover
+	T_.T_backup = T.T_backup
+
 	return T_
 }
 func TaskToTask_Stat(T Task, userMap, adminMap map[string]string) (T_ Task_Stat) {
@@ -704,6 +716,9 @@ func TaskToTask_Stat(T Task, userMap, adminMap map[string]string) (T_ Task_Stat)
 	T_.T_device_quantity = T.T_device_quantity
 	T_.T_cnas = T.T_cnas
 
+	T_.T_cover = T.T_cover
+	T_.T_backup = T.T_backup
+
 	return T_
 }
 
@@ -1328,3 +1343,62 @@ func Read_Task_List_For_Watermark(pdfType string) ([]Task, int) {
 
 	return r, int(cnt)
 }
+
+func Read_Task_List_By_T_InfoCollection_id(T_InfoCollection_id string) ([]Task, int) {
+
+	o := orm.NewOrm()
+
+	qs := o.QueryTable(new(Task))
+	var r []Task
+
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_InfoCollection_id", T_InfoCollection_id).And("T_State", 1)
+
+	qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
+	cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	return r, int(cnt)
+}
+
+// 删除的重复数据
+func DeleteDeduplicate(T_task_id string) (int64, error) {
+	localOrm := orm.NewOrm()
+	tb_name := "z_task_data_" + T_task_id
+	var cnt int64
+	// 创建临时表
+	sqlCreate := "CREATE TABLE `tmp_table_" + T_task_id + "` AS (SELECT MIN(`ID`) AS `min_id` FROM " + tb_name + " GROUP BY `t_sn`,`t_id`,`t_time`);"
+	_, err := localOrm.Raw(sqlCreate).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return cnt, err
+	}
+	sqlDelete := "DELETE FROM " + tb_name + "  WHERE `ID` NOT IN (SELECT `min_id` FROM `tmp_table_" + T_task_id + "`);"
+	res, err := localOrm.Raw(sqlDelete).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return cnt, err
+	}
+	cnt, _ = res.RowsAffected()
+	sqlDrop := "DROP TABLE `tmp_table_" + T_task_id + "`;"
+	_, err = localOrm.Raw(sqlDrop).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return cnt, err
+	}
+	return cnt, nil
+}
+
+// 修正秒数
+func CorrectionSecond(T_task_id string) error {
+	o := orm.NewOrm()
+	tb_name := "z_task_data_" + T_task_id
+	// 创建临时表
+	sqlCreate := "UPDATE " + tb_name + " SET t_time = t_time - INTERVAL SECOND(t_time) SECOND WHERE SECOND(t_time) != 0"
+	_, err := o.Raw(sqlCreate).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+
+	return nil
+}

+ 111 - 0
models/Task/TaskCopy.go

@@ -0,0 +1,111 @@
+package Task
+
+import (
+	"ColdVerify_server/lib"
+	"ColdVerify_server/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
+	}
+
+	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 正常 2报告生成(只能存在一份)
+	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 init() {
+	orm.RegisterModel(new(TaskCopy))
+}
+
+// 添加
+func Add_TaskCopy(r TaskCopy) (string, bool) {
+	o := orm.NewOrm()
+
+	var taskCopy TaskCopy
+	// 查询是否存在报告生成时的数据存档
+	qs := o.QueryTable(new(TaskCopy))
+	err := qs.Filter("T_task_id", r.T_task_id).Filter("T_State", 2).One(&taskCopy)
+	if err != nil && err.Error() != orm.ErrNoRows.Error() {
+		return "", false
+	}
+	// 删除之前的存档
+	if taskCopy.Id > 0 {
+		// 删除之前的存档记录和数据
+		taskCopy.T_State = 0
+		_, err = o.Update(&taskCopy, "T_State")
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			return "", false
+		}
+
+		sql := "DROP TABLE IF EXISTS `z_task_data_copy_" + taskCopy.T_copy_id + "`"
+		o.Raw(sql).Exec()
+	}
+
+	// 生成编号
+	rand_x := 0
+	for true {
+		r.T_copy_id = lib.GetRandstring(12, "abcdefghijklmnopqrstuvwxyz0123456789", int64(rand_x))
+		err = o.Read(&r, "T_copy_id")
+		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 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
+}

+ 4 - 1
models/VerifyTemplate/VerifyTemplateMap.go

@@ -240,7 +240,10 @@ func Read_VerifyTemplateMap_List_For_Data(T_VerifyTemplate_id string, T_source,
 		cond = cond.AndNot("T_flow_sort", 0).And("T_VerifyTemplate_id", T_VerifyTemplate_id)
 		qs.SetCond((*orm2.Condition)(cond)).OrderBy("T_flow_sort").All(&r)
 	} else {
-		cond = cond.And("T_source__in", source).And("T_VerifyTemplate_id", T_VerifyTemplate_id)
+		if len(source) > 0 {
+			cond = cond.And("T_source__in", source)
+		}
+		cond = cond.And("T_VerifyTemplate_id", T_VerifyTemplate_id)
 		qs.SetCond((*orm2.Condition)(cond)).OrderBy("T_sort").All(&r)
 	}
 

+ 101 - 37
models/VerifyTemplate/VerifyTemplateMapData.go

@@ -3,6 +3,7 @@ package VerifyTemplate
 import (
 	"ColdVerify_server/lib"
 	"ColdVerify_server/logs"
+	"ColdVerify_server/models/Task"
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
@@ -122,49 +123,60 @@ func DeleteDeduplicateValue(input string) (output string) {
 	return strings.Join(result, "|")
 }
 
+// T_submit  // 1-app 2-报告生成
+// T_cover   // 是否覆盖-app 0覆盖 1不覆盖
+// T_history // 保存历史数据
 // 添加或更新模版数据 并添加历史数据
-func AddOrUpdate_VerifyTemplateMapData_ADD_History(List []VerifyTemplateMapData, T_source int, T_uuid string) (ids []int64, is bool) {
+func AddOrUpdate_VerifyTemplateMapData_ADD_History(List []VerifyTemplateMapData, T_source int, T_uuid string, T_submit, T_cover, T_history int) (ids []int64, is bool) {
 	o := orm.NewOrm()
 	qs := o.QueryTable(new(VerifyTemplateMapData))
 	o.Begin()
 	T_time := time.Now().Format("2006-01-02 15:04:05")
+	var err error
+	var T_task_id string
 	for _, v := range List {
-		var r VerifyTemplateMapData
-		// 创建验证模版数据,有则更新,没有则创建
-		err := qs.Filter("T_task_id", v.T_task_id).Filter("T_VerifyTemplate_id", v.T_VerifyTemplate_id).Filter("T_VerifyTemplateMap_id", v.T_VerifyTemplateMap_id).One(&r)
-		if err != nil {
-			if err.Error() == orm.ErrNoRows.Error() {
-				id, err := o.Insert(&v)
-				if err != nil {
+		if len(T_task_id) == 0 {
+			T_task_id = v.T_task_id
+		}
+		// app 不覆盖,只保存历史记录
+		if !(T_submit == 1 && T_cover == 1) {
+			var r VerifyTemplateMapData
+			// 创建验证模版数据,有则更新,没有则创建
+			err = qs.Filter("T_task_id", v.T_task_id).Filter("T_VerifyTemplate_id", v.T_VerifyTemplate_id).Filter("T_VerifyTemplateMap_id", v.T_VerifyTemplateMap_id).One(&r)
+			if err != nil {
+				if err.Error() == orm.ErrNoRows.Error() {
+					id, err := o.Insert(&v)
+					if err != nil {
+						logs.Error(lib.FuncName(), err)
+						o.Rollback()
+						return ids, false
+					}
+					ids = append(ids, id)
+				} else {
 					logs.Error(lib.FuncName(), err)
 					o.Rollback()
 					return ids, false
 				}
-				ids = append(ids, id)
-			} else {
-				logs.Error(lib.FuncName(), err)
-				o.Rollback()
-				return ids, false
 			}
-		}
 
-		// 更新验证模版数据
-		if r.Id > 0 && (len(v.T_value) > 0 || v.T_start_time > 0) {
-			if v.T_start_time == 1 {
-				v.T_start_time = 0
-			}
-			v.Id = r.Id
-			//_, err = o.Update(&v, "T_flow_sort", "T_max_time", "T_min_time", "T_value")
-			_, err = o.QueryTable(new(VerifyTemplateMapData)).Filter("T_task_id", v.T_task_id).Filter("T_VerifyTemplate_id", v.T_VerifyTemplate_id).
-				Filter("T_VerifyTemplateMap_id", v.T_VerifyTemplateMap_id).Update(orm2.Params{
-				"T_flow_sort": v.T_flow_sort, "T_max_time": v.T_max_time, "T_min_time": v.T_min_time, "T_value": v.T_value, "T_start_time": v.T_start_time,
-			})
-			if err != nil {
-				logs.Error(lib.FuncName(), err)
-				o.Rollback()
-				return ids, false
+			// 更新验证模版数据
+			if r.Id > 0 && (len(v.T_value) > 0 || v.T_start_time > 0) {
+				if v.T_start_time == 1 {
+					v.T_start_time = 0
+				}
+				v.Id = r.Id
+				//_, err = o.Update(&v, "T_flow_sort", "T_max_time", "T_min_time", "T_value")
+				_, err = o.QueryTable(new(VerifyTemplateMapData)).Filter("T_task_id", v.T_task_id).Filter("T_VerifyTemplate_id", v.T_VerifyTemplate_id).
+					Filter("T_VerifyTemplateMap_id", v.T_VerifyTemplateMap_id).Update(orm2.Params{
+					"T_flow_sort": v.T_flow_sort, "T_max_time": v.T_max_time, "T_min_time": v.T_min_time, "T_value": v.T_value, "T_start_time": v.T_start_time,
+				})
+				if err != nil {
+					logs.Error(lib.FuncName(), err)
+					o.Rollback()
+					return ids, false
+				}
+				ids = append(ids, int64(r.Id))
 			}
-			ids = append(ids, int64(r.Id))
 		}
 
 		// 添加历史记录
@@ -188,6 +200,48 @@ func AddOrUpdate_VerifyTemplateMapData_ADD_History(List []VerifyTemplateMapData,
 			o.Rollback()
 			return ids, false
 		}
+
+	}
+
+	if T_history == 1 && len(T_task_id) > 0 {
+		// 添加历史记录
+		_, err = o.Insert(&VerifyDataHistoryRecord{
+			T_task_id:       T_task_id,
+			T_time:          T_time,
+			T_uuid:          T_uuid,
+			T_submit_source: T_source,
+		})
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			o.Rollback()
+			return ids, false
+		}
+	}
+
+	// 修改覆盖数据和备份信息
+	if T_cover == 1 {
+		_, err = o.QueryTable(new(Task.Task)).Filter("T_task_id", T_task_id).Update(orm2.Params{
+			"T_cover":  1,
+			"T_backup": T_time,
+		})
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			o.Rollback()
+			return ids, false
+		}
+		Task.Redis_Task_DelK(T_task_id)
+	} else {
+
+		_, err = o.QueryTable(new(Task.Task)).Filter("T_task_id", T_task_id).Update(orm2.Params{
+			"T_cover":  0,
+			"T_backup": "",
+		})
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			o.Rollback()
+			return ids, false
+		}
+		Task.Redis_Task_DelK(T_task_id)
 	}
 
 	o.Commit()
@@ -291,15 +345,25 @@ func Read_MapData_List(T_source int, T_task_id, T_VerifyTemplate_id string) []Ve
 	qs := o.QueryTable(new(VerifyTemplateMapData))
 	cond := orm.NewCondition()
 
-	source := []int{T_source}
-	if T_source == 2 {
-		source = append(source, 3)
-	}
-	if T_source != 3 {
-		source = append(source, 0)
+	var source []int
+	switch T_source {
+	case 1:
+		source = []int{0, 1, 7}
+	case 2:
+		source = []int{0, 2, 3, 7}
+	case 3:
+		source = []int{3}
+	case 4:
+		source = []int{0, 5, 8}
+	case 5:
+		source = []int{0, 6, 8}
 	}
 
-	cond1 := cond.And("T_source__in", source).And("T_task_id", T_task_id).And("T_VerifyTemplate_id", T_VerifyTemplate_id)
+	cond1 := cond.And("T_task_id", T_task_id).And("T_VerifyTemplate_id", T_VerifyTemplate_id)
+
+	if len(source) > 0 {
+		cond1 = cond1.And("T_source__in", source)
+	}
 
 	qs.SetCond((*orm2.Condition)(cond1)).All(&r)
 

+ 52 - 8
models/VerifyTemplate/VerifyTemplateMapDataHistory.go

@@ -32,6 +32,20 @@ type VerifyTemplateMapDataHistory struct {
 	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
 }
 
+// 历史记录
+type VerifyDataHistoryRecord struct {
+	Id        int    `orm:"column(ID);size(11);auto;pk"`
+	T_source  int    `orm:"size(4);"`             // 来源 0-所有 1-方案 2-报告 3-表单
+	T_task_id string `orm:"index,size(256);null"` // 任务id
+
+	T_uuid          string `orm:"index,size(256);null"` // 提交人
+	T_time          string `orm:"index,size(256);null"` // 提交时间
+	T_submit_source int    `orm:"size(4);"`             // 提交来源
+
+	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 保存时都会对时间自动更新
+}
+
 type VerifyTemplateMapDataHistory_R struct {
 	T_id                   int
 	T_VerifyTemplateMap_id string // 标签id
@@ -51,10 +65,14 @@ type VerifyTemplateMapDataHistory_R struct {
 func (t *VerifyTemplateMapDataHistory) TableName() string {
 	return "verify_template_map_data_history" // 数据库名称   // ************** 替换 FormulaList **************
 }
+func (t *VerifyDataHistoryRecord) TableName() string {
+	return "verify_data_history_record" // 数据库名称   // ************** 替换 FormulaList **************
+}
 
 func init() {
 	//注册模型
 	orm.RegisterModel(new(VerifyTemplateMapDataHistory))
+	orm.RegisterModel(new(VerifyDataHistoryRecord))
 
 }
 
@@ -141,16 +159,24 @@ func Read_MapDataHistory_List(T_source int, T_task_id, T_VerifyTemplate_id, T_ti
 	qs := o.QueryTable(new(VerifyTemplateMapDataHistory))
 	cond := orm.NewCondition()
 
-	source := []int{T_source}
-	if T_source == 2 {
-		source = append(source, 3)
+	var source []int
+	switch T_source {
+	case 1:
+		source = []int{0, 1, 7}
+	case 2:
+		source = []int{0, 2, 3, 7}
+	case 3:
+		source = []int{3}
+	case 4:
+		source = []int{0, 5, 8}
+	case 5:
+		source = []int{0, 6, 8}
 	}
-	if T_source != 3 {
-		source = append(source, 0)
-	}
-
-	cond1 := cond.And("T_source__in", source).And("T_task_id", T_task_id).And("T_VerifyTemplate_id", T_VerifyTemplate_id).And("T_time", T_time)
 
+	cond1 := cond.And("T_task_id", T_task_id).And("T_VerifyTemplate_id", T_VerifyTemplate_id).And("T_time", T_time)
+	if len(source) > 0 {
+		cond1 = cond1.And("T_source__in", source)
+	}
 	qs.SetCond((*orm2.Condition)(cond1)).All(&r)
 
 	return r
@@ -192,3 +218,21 @@ func Read_VerifyTemplateMapDataHistory_History_List(T_task_id string, T_source i
 
 	return pl_lists
 }
+func Read_VerifyTemplateMapDataHistory_History_List2(T_task_id string, T_source int, AdminMap map[string]string) (lists []VerifyTemplateMapDataHistory_History_List_Res) {
+	o := orm.NewOrm()
+
+	var pl_lists []VerifyTemplateMapDataHistory_History_List_Res
+	//_, err := o.Raw("SELECT DISTINCT t_uuid,t_time FROM verify_template_map_data_history where t_task_id = ? and t_source = ? order by t_time desc LIMIT 0,1000 ", T_task_id, T_source).
+	_, err := o.Raw("SELECT t_uuid,t_time FROM verify_data_history_record where t_task_id = ? order by t_time desc LIMIT 0,1000 ", T_task_id).
+		QueryRows(&pl_lists)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return pl_lists
+	}
+
+	for i := 0; i < len(pl_lists); i++ {
+		pl_lists[i].T_uuid_name = AdminMap[pl_lists[i].T_uuid]
+	}
+
+	return pl_lists
+}

+ 1 - 0
routers/Device.go

@@ -17,6 +17,7 @@ func init() {
 
 	// 设备分类 - 设备列表
 	beego.Router("/DeviceClassList/List", &controllers.DeviceClassController{}, "*:List_List")                                        // 设备分类列表
+	beego.Router("/DeviceClassList/Maximum", &controllers.DeviceClassController{}, "*:List_Maximum")                                  // 设备分类列表
 	beego.Router("/DeviceClassList/Add", &controllers.DeviceClassController{}, "*:List_Add")                                          // 添加设备分类列表
 	beego.Router("/DeviceClassList/Up", &controllers.DeviceClassController{}, "*:List_Up")                                            // 编辑设备分类列表
 	beego.Router("/DeviceClassList/Up_terminal", &controllers.DeviceClassController{}, "*:List_Up_terminal")                          // 编辑设备分类列表

+ 5 - 0
routers/User.go

@@ -12,4 +12,9 @@ func init() {
 	beego.Router("/User/Del", &controllers.UserController{}, "*:Del")                // 删除用户
 	beego.Router("/User/Up_Password", &controllers.UserController{}, "*:UpPassword") // 用户-修改密码
 
+	beego.Router("/UserSignature/List", &controllers.UserController{}, "*:Signature_List") // 用户签名列表
+	beego.Router("/UserSignature/Add", &controllers.UserController{}, "*:Signature_Add")   // 添加用户签名
+	beego.Router("/UserSignature/Up", &controllers.UserController{}, "*:Signature_Up")     // 编辑用户签名
+	beego.Router("/UserSignature/Del", &controllers.UserController{}, "*:Signature_Del")   // 删除用户签名
+
 }

+ 1 - 0
routers/VerifyTemplate.go

@@ -40,4 +40,5 @@ func init() {
 	beego.Router("/VerifyTemplateMapData/History_List", &controllers.VerifyTemplateController{}, "*:Map_Data_History_List")           // 历史提交列表
 	beego.Router("/VerifyTemplateMapData/History_Data_List", &controllers.VerifyTemplateController{}, "*:Map_Data_History_Data_List") // 历史提交列表
 	beego.Router("/VerifyTemplateMapData/History_Recover", &controllers.VerifyTemplateController{}, "*:Map_Data_History_Recover")     // 历史提交列表
+	beego.Router("/VerifyTemplateMapData/Map_Data_Cover", &controllers.VerifyTemplateController{}, "*:Map_Data_Cover")                // 覆盖数据
 }