Browse Source

ADD:实施方案、报告生成新增历史提交记录与恢复功能

zoie 2 months ago
parent
commit
1608eacd3e

+ 35 - 0
controllers/Account.go

@@ -303,3 +303,38 @@ func (c *AccountController) List_All() {
 	c.ServeJSON()
 	return
 }
+
+// 修改密码
+func (c *AccountController) UpPassword() {
+	// 验证登录 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_oldpass := c.GetString("T_oldpass")
+	T_pass := c.GetString("T_pass")
+
+	if len(T_pass) > 0 {
+		user_r.T_pass = T_pass
+	}
+
+	if T_oldpass != user_r.T_pass {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "旧密码错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	if !Account.Update_Admin(user_r, "T_pass") {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
+		c.ServeJSON()
+		return
+	}
+	user_r.T_pass = "********"
+	System.Add_UserLogs_T(user_r.T_uuid, "管理员管理", "修改密码", user_r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}

+ 7 - 1
controllers/Task.go

@@ -47,18 +47,24 @@ func (c *TaskController) List() {
 	}
 
 	T_name := c.GetString("T_name")
+	T_company := c.GetString("T_company") // 公司名称
 	T_uuid := c.GetString("T_uuid")
 
 	UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
 	AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
 
+	var T_company_list []string
+	if len(T_company) > 0 {
+		T_company_list = Account.Read_User_T_uuid_ListByT_name(T_company)
+	}
+
 	var T_admin string
 	if User_r.T_power > 2 {
 		T_admin = User_r.T_uuid
 	}
 
 	var cnt int
-	List, cnt := Task.Read_Task_List(T_uuid, T_admin, T_name, UserMap, AdminMap, page, page_z)
+	List, cnt := Task.Read_Task_List(T_uuid, T_admin, T_name, T_company_list, UserMap, AdminMap, page, page_z)
 
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.List = List

+ 40 - 0
controllers/User.go

@@ -208,3 +208,43 @@ func (c *UserController) Del() {
 	c.ServeJSON()
 	return
 }
+
+// 修改-
+func (c *UserController) UpPassword() {
+	// 验证登录 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_oldpass := c.GetString("T_oldpass")
+	T_pass := c.GetString("T_pass")
+	T_passstr := c.GetString("T_passstr")
+
+	if T_oldpass != user_r.T_pass {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "旧密码错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	if len(T_pass) > 0 {
+		user_r.T_pass = T_pass
+	}
+	if len(T_passstr) > 0 {
+		user_r.T_passstr = T_passstr
+	}
+
+	// .......
+	if !Account.Update_User(user_r, "T_pass", "T_passstr") {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
+		c.ServeJSON()
+		return
+	}
+	System.Add_UserLogs_T(user_r.T_uuid, "用户管理", "修改密码", user_r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}

+ 201 - 6
controllers/VerifyTemplate.go

@@ -8,6 +8,7 @@ import (
 	"ColdVerify_server/models/Task"
 	"ColdVerify_server/models/VerifyTemplate"
 	"encoding/json"
+	"fmt"
 	beego "github.com/beego/beego/v2/server/web"
 	"math"
 	"strconv"
@@ -480,7 +481,7 @@ func (c *VerifyTemplateController) Map_Data_List() {
 	}
 
 	T_task_id := c.GetString("T_task_id")
-	_, 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()
@@ -490,7 +491,15 @@ func (c *VerifyTemplateController) Map_Data_List() {
 	Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(T_VerifyTemplate_id, T_source, T_flow)
 	Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_task_id, T_VerifyTemplate_id, Map_List)
 
-	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Data}
+	type JSONS struct {
+		//必须的大写开头
+		Code   int16
+		Msg    string
+		Data   interface{} // 泛型
+		T_step int
+	}
+
+	c.Data["json"] = JSONS{Code: 200, Msg: "ok!", Data: Data, T_step: task.T_step}
 	c.ServeJSON()
 	return
 }
@@ -512,6 +521,7 @@ func (c *VerifyTemplateController) Map_Data_Pu() {
 		T_source              int
 		T_task_id             string
 		T_VerifyTemplate_id   string
+		T_step                int // 进行步骤下标
 		VerifyTemplateMapData []VerifyTemplate.VerifyTemplateMapData_R
 	}
 
@@ -532,13 +542,20 @@ func (c *VerifyTemplateController) Map_Data_Pu() {
 		return
 	}
 
-	_, is := Task.Read_Task(body.T_task_id)
+	task, is := Task.Read_Task(body.T_task_id)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
 		c.ServeJSON()
 		return
 	}
 
+	task.T_step = body.T_step
+	if !Task.Update_Task(task, "T_step") {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改任务步骤失败!"}
+		c.ServeJSON()
+		return
+	}
+
 	MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
 	for _, v := range body.VerifyTemplateMapData {
 		val := VerifyTemplate.VerifyTemplateMapData{
@@ -551,11 +568,12 @@ func (c *VerifyTemplateController) Map_Data_Pu() {
 			T_max_time:  v.T_max_time,
 			T_min_time:  v.T_min_time,
 
-			T_value: v.T_value,
+			T_value:      v.T_value,
+			T_start_time: v.T_start_time,
 		}
 		MapDataList = append(MapDataList, val)
 	}
-	ids, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData(MapDataList)
+	ids, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, body.T_source)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
 		c.ServeJSON()
@@ -627,7 +645,7 @@ func (c *VerifyTemplateController) Map_Data_Copy() {
 		MapDataList = append(MapDataList, val)
 	}
 	var ids []int64
-	ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData(MapDataList)
+	ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, T_source)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
 		c.ServeJSON()
@@ -640,6 +658,183 @@ func (c *VerifyTemplateController) Map_Data_Copy() {
 	return
 }
 
+// 添加标签数据
+func (c *VerifyTemplateController) Map_Data_History_List() {
+	// 验证登录 User_is, 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_task_id := c.GetString("T_task_id")
+	T_source, _ := c.GetInt("T_source")
+	_, is := Task.Read_Task(T_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: VerifyTemplate.Read_VerifyTemplateMapDataHistory_History_List(T_task_id, T_source)}
+	c.ServeJSON()
+	return
+}
+
+// 标签数据列表 -
+func (c *VerifyTemplateController) Map_Data_History_Data_List() {
+	// 验证登录 User_is, 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_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
+	}
+
+	Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(task.T_VerifyTemplate_id, T_source, 0)
+	Data := VerifyTemplate.Read_VerifyTemplateMapDataHistory_List(T_source, T_task_id, task.T_VerifyTemplate_id, T_time, Map_List)
+
+	type JSONS struct {
+		//必须的大写开头
+		Code   int16
+		Msg    string
+		Data   interface{} // 泛型
+		T_step int
+	}
+
+	c.Data["json"] = JSONS{Code: 200, Msg: "ok!", Data: Data, T_step: task.T_step}
+	c.ServeJSON()
+	return
+}
+
+// 清除数据
+func (c *VerifyTemplateController) Map_Data_Clear_Value() {
+	// 验证登录 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_VerifyTemplate_id := c.GetString("T_VerifyTemplate_id")
+	T_VerifyTemplateMap_id := c.GetString("T_VerifyTemplateMap_id")
+
+	T_task_id := c.GetString("T_task_id")
+	_, is := Task.Read_Task(T_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	VerifyTemplate.Clear_VerifyTemplateMapData_T_value(T_task_id, T_VerifyTemplate_id, T_VerifyTemplateMap_id)
+
+	System.Add_UserLogs_T(User_r.T_uuid, "验证模版标签数据", "清除数据", fmt.Sprintf("T_task_id:%s T_VerifyTemplate_id:%s T_VerifyTemplateMap_id:%s", T_task_id, T_VerifyTemplate_id, T_VerifyTemplateMap_id))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
+// 历史数据恢复
+func (c *VerifyTemplateController) Map_Data_History_Recover() {
+	// 验证登录 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_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
+	}
+
+	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_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)
+	}
+	var ids []int64
+	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)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: ids}
+	c.ServeJSON()
+	return
+}
+
 func (c *VerifyTemplateController) Class_List() {
 	// 验证登录 User_is, User_r
 	_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))

+ 19 - 0
models/Account/User.go

@@ -227,3 +227,22 @@ func UserListToMap(T []User) map[string]string {
 	}
 	return maps
 }
+
+func Read_User_T_uuid_ListByT_name(T_name string) (list []string) {
+	o := orm.NewOrm()
+
+	// 也可以直接使用 Model 结构体作为表名
+	var r []User
+	qs := o.QueryTable(new(User))
+
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_State", 1).AndCond(cond.Or("T_name__icontains", T_name))
+	qs.SetCond((*orm2.Condition)(cond1)).All(&r)
+
+	// 转换
+	for _, v := range r {
+		list = append(list, v.T_uuid)
+	}
+
+	return list
+}

+ 10 - 4
models/Task/Task.go

@@ -44,9 +44,12 @@ type Task struct {
 	T_doc3 string `orm:"type(text);null"` // 证书
 	T_pdf3 string `orm:"type(text);null"` // 证书
 
-	T_Show     int       `orm:"size(2);default(1)"`                                    // 0 隐藏   1 公开
-	T_Visit    int       `orm:"size(200);default(0)"`                                  // 浏览量
-	T_State    int       `orm:"size(2);default(1)"`                                    // 0 删除   1 正常
+	T_Show  int `orm:"size(2);default(1)"`   // 0 隐藏   1 公开
+	T_Visit int `orm:"size(200);default(0)"` // 浏览量
+	T_State int `orm:"size(2);default(1)"`   // 0 删除   1 正常
+
+	T_step int `orm:"size(2);default(-1)"` // 验证步骤
+
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
 	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
 }
@@ -414,7 +417,7 @@ func Read_UserTask_List(T_uuid string, T_name string, userMap, adminMap map[stri
 }
 
 // 获取任务列表
-func Read_Task_List(T_uuid, T_admin string, T_name string, userMap, adminMap map[string]string, page int, page_z int) ([]Task_, int) {
+func Read_Task_List(T_uuid, T_admin string, T_name string, T_company_list []string, userMap, adminMap map[string]string, page int, page_z int) ([]Task_, int) {
 
 	o := orm.NewOrm()
 
@@ -437,6 +440,9 @@ func Read_Task_List(T_uuid, T_admin string, T_name string, userMap, adminMap map
 		cond1 = cond1.AndCond(cond.Or("T_scheme", T_admin).Or("T_collection", T_admin).
 			Or("T_reporting", T_admin).Or("T_delivery", T_admin))
 	}
+	if len(T_company_list) > 0 {
+		cond1 = cond1.And("T_uuid__in", T_company_list)
+	}
 
 	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
 	cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()

+ 11 - 10
models/VerifyTemplate/VerifyTemplateMap.go

@@ -17,7 +17,7 @@ type VerifyTemplateMap struct {
 	T_id                string `orm:"size(256);null"`     // 标题
 	T_VerifyTemplate_id string `orm:"size(256);null"`     // 标题
 	T_label             int    `orm:"size(2);default(1)"` // 数据类型
-	T_source            int    `orm:"size(2);default(0)"` // 来源 0-所有 1-方案 2-报告
+	T_source            int    `orm:"size(2);default(0)"` // 来源 0-所有 1-方案 2-报告 3-表单
 
 	//1:文本
 	//2:数值
@@ -41,15 +41,16 @@ type VerifyTemplateMap struct {
 }
 
 type VerifyTemplateMap_R struct {
-	T_id        string
-	T_source    int    // 数据类型
-	T_label     int    // 来源
-	T_name      string // 标签名称
-	T_text      string // 描述
-	T_sort      int    // 排序
-	T_flow_sort int    // 验证流程排序
-	T_max_time  int    // 验证流程最大时间
-	T_min_time  int    // 验证流程最小时间
+	T_id         string
+	T_source     int    // 数据类型
+	T_label      int    // 来源
+	T_name       string // 标签名称
+	T_text       string // 描述
+	T_sort       int    // 排序
+	T_flow_sort  int    // 验证流程排序
+	T_max_time   int    // 验证流程最大时间
+	T_min_time   int    // 验证流程最小时间
+	T_start_time int    // 任务开始时间 app
 }
 
 func (t *VerifyTemplateMap) TableName() string {

+ 102 - 8
models/VerifyTemplate/VerifyTemplateMapData.go

@@ -12,7 +12,7 @@ import (
 // 模板
 type VerifyTemplateMapData struct {
 	Id                     int    `orm:"column(ID);size(11);auto;pk"`
-	T_source               int    `orm:"size(2);"`             // 来源 1-方案 2-报告
+	T_source               int    `orm:"size(2);"`             // 来源 0-所有 1-方案 2-报告 3-表单
 	T_task_id              string `orm:"index,size(256);null"` // 任务id
 	T_VerifyTemplate_id    string `orm:"index,size(256);null"` // 模板id
 	T_VerifyTemplateMap_id string `orm:"index,size(256);null"` // 标签id
@@ -23,6 +23,8 @@ type VerifyTemplateMapData struct {
 	T_max_time  int `orm:"size(256);null"`     // 验证流程最大时间
 	T_min_time  int `orm:"size(256);null"`     // 验证流程最小时间
 
+	T_start_time int `orm:"size(256);null"` // 开始时间 app
+
 	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 保存时都会对时间自动更新
 }
@@ -39,6 +41,8 @@ type VerifyTemplateMapData_R struct {
 	T_flow_sort int // 验证流程排序
 	T_max_time  int // 验证流程最大时间
 	T_min_time  int // 验证流程最小时间
+
+	T_start_time int // 开始时间 app
 }
 
 func (t *VerifyTemplateMapData) TableName() string {
@@ -67,7 +71,7 @@ func VerifyTemplateMapToVerifyTemplateMapData_R(T VerifyTemplateMap) (T_r Verify
 	return T_r
 }
 
-func VerifyTemplateMapDataToVerifyTemplateMapData_R(T VerifyTemplateMap, VerifyTemplateMapData map[string]string) (T_r VerifyTemplateMapData_R) {
+func VerifyTemplateMapDataToVerifyTemplateMapData_R(T VerifyTemplateMap, VerifyTemplateMapData map[string]VerifyTemplateMapData) (T_r VerifyTemplateMapData_R) {
 	T_r.T_VerifyTemplateMap_id = T.T_id
 	T_r.T_source = T.T_source
 	T_r.T_label = T.T_label
@@ -80,11 +84,79 @@ func VerifyTemplateMapDataToVerifyTemplateMapData_R(T VerifyTemplateMap, VerifyT
 
 	T_r.T_value = ""
 	if v, ok := VerifyTemplateMapData[T.T_id]; ok {
-		T_r.T_value = v
+		T_r.T_value = v.T_value
+		T_r.T_start_time = v.T_start_time
 	}
 	return T_r
 }
 
+// 添加或更新模板数据 并添加历史数据
+func AddOrUpdate_VerifyTemplateMapData_ADD_History(List []VerifyTemplateMapData, T_source 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")
+	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 {
+					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) {
+			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))
+		}
+
+		// 添加历史记录
+		_, err = o.Insert(&VerifyTemplateMapDataHistory{
+			T_source:               v.T_source,
+			T_task_id:              v.T_task_id,
+			T_time:                 T_time,
+			T_submit_source:        T_source,
+			T_VerifyTemplate_id:    v.T_VerifyTemplate_id,
+			T_VerifyTemplateMap_id: v.T_VerifyTemplateMap_id,
+			T_value:                v.T_value,
+			T_flow_sort:            v.T_flow_sort,
+			T_max_time:             v.T_max_time,
+			T_min_time:             v.T_min_time,
+		})
+		if err != nil {
+			logs.Error(lib.FuncName(), err)
+			o.Rollback()
+			return ids, false
+		}
+	}
+
+	o.Commit()
+
+	return ids, true
+}
+
 // ---------------- 特殊方法 -------------------
 // 添加
 func AddOrUpdate_VerifyTemplateMapData(List []VerifyTemplateMapData) (ids []int64, is bool) {
@@ -112,12 +184,12 @@ func AddOrUpdate_VerifyTemplateMapData(List []VerifyTemplateMapData) (ids []int6
 		}
 
 		// 更新验证模版数据
-		if r.Id > 0 && len(v.T_value) > 0 {
+		if r.Id > 0 && (len(v.T_value) > 0 || 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_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)
@@ -128,6 +200,7 @@ func AddOrUpdate_VerifyTemplateMapData(List []VerifyTemplateMapData) (ids []int6
 		}
 
 	}
+
 	o.Commit()
 
 	return ids, true
@@ -192,13 +265,34 @@ func Read_MapData_List(T_source int, T_task_id, T_VerifyTemplate_id string) []Ve
 	return r
 }
 
-func VerifyTemplateMapDataToMap(T []VerifyTemplateMapData) map[string]string {
-	maps := make(map[string]string, len(T))
+func VerifyTemplateMapDataToMap(T []VerifyTemplateMapData) map[string]VerifyTemplateMapData {
+	maps := make(map[string]VerifyTemplateMapData, len(T))
 	for _, v := range T {
 		if _, ok := maps[v.T_VerifyTemplateMap_id]; ok {
 			continue
 		}
-		maps[v.T_VerifyTemplateMap_id] = v.T_value
+		maps[v.T_VerifyTemplateMap_id] = v
 	}
 	return maps
 }
+
+// 清除T_value数据
+func Clear_VerifyTemplateMapData_T_value(T_task_id, T_VerifyTemplate_id, T_VerifyTemplateMap_id string) (err error) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(VerifyTemplateMapData))
+
+	var r VerifyTemplateMapData
+	// 创建验证模版数据,有则更新,没有则创建
+	err = qs.Filter("T_task_id", T_task_id).Filter("T_VerifyTemplate_id", T_VerifyTemplate_id).Filter("T_VerifyTemplateMap_id", T_VerifyTemplateMap_id).One(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+	r.T_value = ""
+	_, err = o.Update(&r, "T_value")
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+	return nil
+}

+ 171 - 0
models/VerifyTemplate/VerifyTemplateMapDataHistory.go

@@ -0,0 +1,171 @@
+package VerifyTemplate
+
+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"
+	"time"
+)
+
+// 模板
+type VerifyTemplateMapDataHistory 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_VerifyTemplate_id    string `orm:"index,size(256);null"` // 模板id
+	T_VerifyTemplateMap_id string `orm:"index,size(256);null"` // 标签id
+	T_value                string `orm:"size(1024);null"`      // 内容
+
+	T_time          string `orm:"index,size(256);null"` // 提交时间
+	T_submit_source int    `orm:"size(4);"`             // 提交来源
+	// 验证流程
+	T_flow_sort int `orm:"size(2);default(0)"` // 验证流程排序
+	T_max_time  int `orm:"size(256);null"`     // 验证流程最大时间
+	T_min_time  int `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 保存时都会对时间自动更新
+}
+
+type VerifyTemplateMapDataHistory_R struct {
+	T_id                   int
+	T_VerifyTemplateMap_id string // 标签id
+	T_source               int
+	T_label                int    //
+	T_name                 string // 标题
+	T_text                 string // 标题
+	T_value                string //
+	// 验证流程
+	T_flow_sort int // 验证流程排序
+	T_max_time  int // 验证流程最大时间
+	T_min_time  int // 验证流程最小时间
+}
+
+func (t *VerifyTemplateMapDataHistory) TableName() string {
+	return "verify_template_map_data_history" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(VerifyTemplateMapDataHistory))
+
+}
+
+// -------------------------------------------------------------
+func VerifyTemplateMapToVerifyTemplateMapDataHistory_R(T VerifyTemplateMap) (T_r VerifyTemplateMapDataHistory_R) {
+	T_r.T_VerifyTemplateMap_id = T.T_id
+	T_r.T_source = T.T_source
+	T_r.T_label = T.T_label
+	T_r.T_name = T.T_name
+	T_r.T_text = T.T_text
+
+	T_r.T_flow_sort = T.T_flow_sort
+	T_r.T_max_time = T.T_max_time
+	T_r.T_min_time = T.T_min_time
+
+	T_r.T_value = ""
+	return T_r
+}
+
+func VerifyTemplateMapDataToVerifyTemplateMapDataHistory_R(T VerifyTemplateMap, VerifyTemplateMapDataHistory map[string]string) (T_r VerifyTemplateMapDataHistory_R) {
+	T_r.T_VerifyTemplateMap_id = T.T_id
+	T_r.T_source = T.T_source
+	T_r.T_label = T.T_label
+	T_r.T_name = T.T_name
+	T_r.T_text = T.T_text
+
+	T_r.T_flow_sort = T.T_flow_sort
+	T_r.T_max_time = T.T_max_time
+	T_r.T_min_time = T.T_min_time
+
+	T_r.T_value = ""
+	if v, ok := VerifyTemplateMapDataHistory[T.T_id]; ok {
+		T_r.T_value = v
+	}
+	return T_r
+}
+
+// 获取列表
+func Read_VerifyTemplateMapDataHistory_List(T_source int, T_task_id, T_VerifyTemplate_id, T_time string,
+	Map_List []VerifyTemplateMap) []VerifyTemplateMapDataHistory_R {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	var r []VerifyTemplateMapDataHistory
+	qs := o.QueryTable(new(VerifyTemplateMapDataHistory))
+	cond := orm.NewCondition()
+
+	cond1 := cond.And("T_task_id", T_task_id).And("T_VerifyTemplate_id", T_VerifyTemplate_id).And("T_time", T_time)
+
+	qs.SetCond((*orm2.Condition)(cond1)).All(&r)
+
+	if len(r) == 0 {
+		// 转换
+		var VerifyTemplateMapData_r []VerifyTemplateMapDataHistory_R
+		for k, v := range Map_List {
+			Data_r := VerifyTemplateMapToVerifyTemplateMapDataHistory_R(v)
+			Data_r.T_id = k
+			VerifyTemplateMapData_r = append(VerifyTemplateMapData_r, Data_r)
+		}
+
+		return VerifyTemplateMapData_r
+	}
+
+	// 转换
+	var VerifyTemplateMapDataHistory_r []VerifyTemplateMapDataHistory_R
+	for k, v := range Map_List {
+		Data_r := VerifyTemplateMapDataToVerifyTemplateMapDataHistory_R(v, VerifyTemplateMapDataHistoryToMap(r))
+		Data_r.T_id = k
+		VerifyTemplateMapDataHistory_r = append(VerifyTemplateMapDataHistory_r, Data_r)
+	}
+	return VerifyTemplateMapDataHistory_r
+}
+
+// 获取列表
+func Read_MapDataHistory_List(T_source int, T_task_id, T_VerifyTemplate_id, T_time string) []VerifyTemplateMapDataHistory {
+
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	var r []VerifyTemplateMapDataHistory
+	qs := o.QueryTable(new(VerifyTemplateMapDataHistory))
+	cond := orm.NewCondition()
+
+	source := []int{T_source}
+	if T_source == 2 {
+		source = append(source, 3)
+	}
+	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)
+
+	qs.SetCond((*orm2.Condition)(cond1)).All(&r)
+
+	return r
+}
+
+func VerifyTemplateMapDataHistoryToMap(T []VerifyTemplateMapDataHistory) map[string]string {
+	maps := make(map[string]string, len(T))
+	for _, v := range T {
+		if _, ok := maps[v.T_VerifyTemplateMap_id]; ok {
+			continue
+		}
+		maps[v.T_VerifyTemplateMap_id] = v.T_value
+	}
+	return maps
+}
+
+// 获取列表
+func Read_VerifyTemplateMapDataHistory_History_List(T_task_id string, T_source int) (lists orm2.ParamsList) {
+	o := orm.NewOrm()
+	var pl_lists orm2.ParamsList
+	_, err := o.Raw("SELECT DISTINCT t_time FROM verify_template_map_data_history where t_task_id = ? and t_submit_source = ? order by t_time desc LIMIT 0,1000 ", T_task_id, T_source).ValuesFlat(&pl_lists)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+
+	return pl_lists
+}

+ 6 - 5
routers/Account.go

@@ -21,11 +21,12 @@ func init() {
 	beego.Router("/Login_verification", &controllers.AccountController{}, "*:Login_verification") // 获取未读消息
 
 	// - 管理员
-	beego.Router("/Admin/List", &controllers.AccountController{}, "*:List")         // 管理员列表
-	beego.Router("/Admin/Add", &controllers.AccountController{}, "*:Add")           // 添加管理员
-	beego.Router("/Admin/Up", &controllers.AccountController{}, "*:Up")             // 编辑管理员
-	beego.Router("/Admin/Del", &controllers.AccountController{}, "*:Del")           // 删除管理员
-	beego.Router("/Admin/List_All", &controllers.AccountController{}, "*:List_All") // 管理员所有列表
+	beego.Router("/Admin/List", &controllers.AccountController{}, "*:List")              // 管理员列表
+	beego.Router("/Admin/Add", &controllers.AccountController{}, "*:Add")                // 添加管理员
+	beego.Router("/Admin/Up", &controllers.AccountController{}, "*:Up")                  // 编辑管理员
+	beego.Router("/Admin/Del", &controllers.AccountController{}, "*:Del")                // 删除管理员
+	beego.Router("/Admin/List_All", &controllers.AccountController{}, "*:List_All")      // 管理员所有列表
+	beego.Router("/Admin/Up_Password", &controllers.AccountController{}, "*:UpPassword") // 管理员修改密码
 
 	// - 用户权限
 	beego.Router("/UserPower/List_All", &controllers.AccountController{}, "*:UserPower_List_All") // 用户权限所有列表

+ 5 - 4
routers/User.go

@@ -6,9 +6,10 @@ import (
 )
 
 func init() {
-	beego.Router("/User/List", &controllers.UserController{}, "*:List") // 用户列表
-	beego.Router("/User/Add", &controllers.UserController{}, "*:Add")   // 添加用户
-	beego.Router("/User/Up", &controllers.UserController{}, "*:Up")     // 编辑用户
-	beego.Router("/User/Del", &controllers.UserController{}, "*:Del")   // 删除用户
+	beego.Router("/User/List", &controllers.UserController{}, "*:List")              // 用户列表
+	beego.Router("/User/Add", &controllers.UserController{}, "*:Add")                // 添加用户
+	beego.Router("/User/Up", &controllers.UserController{}, "*:Up")                  // 编辑用户
+	beego.Router("/User/Del", &controllers.UserController{}, "*:Del")                // 删除用户
+	beego.Router("/User/Up_Password", &controllers.UserController{}, "*:UpPassword") // 用户-修改密码
 
 }

+ 7 - 3
routers/router.go

@@ -23,7 +23,11 @@ func init() {
 	beego.Router("/VerifyTemplate/Map_Up", &controllers.VerifyTemplateController{}, "*:Map_Up")     // 标签修改
 	beego.Router("/VerifyTemplate/Map_Del", &controllers.VerifyTemplateController{}, "*:Map_Del")   // 标签删除
 
-	beego.Router("/VerifyTemplateMapData/List", &controllers.VerifyTemplateController{}, "*:Map_Data_List") // 标签数据列表
-	beego.Router("/VerifyTemplateMapData/Pu", &controllers.VerifyTemplateController{}, "*:Map_Data_Pu")     // 添加标签数据
-	beego.Router("/VerifyTemplateMapData/Copy", &controllers.VerifyTemplateController{}, "*:Map_Data_Copy") // 复制标签数据
+	beego.Router("/VerifyTemplateMapData/List", &controllers.VerifyTemplateController{}, "*:Map_Data_List")                           // 标签数据列表
+	beego.Router("/VerifyTemplateMapData/Pu", &controllers.VerifyTemplateController{}, "*:Map_Data_Pu")                               // 添加标签数据
+	beego.Router("/VerifyTemplateMapData/Copy", &controllers.VerifyTemplateController{}, "*:Map_Data_Copy")                           // 复制标签数据
+	beego.Router("/VerifyTemplateMapData/Clear_Value", &controllers.VerifyTemplateController{}, "*:Map_Data_Clear_Value")             // 复制标签数据
+	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")     // 历史提交列表
 }