Browse Source

add:指派任务

zoie 3 weeks ago
parent
commit
2d230842fd

+ 76 - 20
TimeTask/TaskList.go

@@ -5,72 +5,128 @@ import (
 	"ColdVerify_server/lib/wx"
 	"ColdVerify_server/logs"
 	"ColdVerify_server/models/Account"
+	"ColdVerify_server/models/AllotTask"
 	"ColdVerify_server/models/InfoCollection"
 	"ColdVerify_server/models/Task"
 	"fmt"
 
-	"github.com/robfig/cron/v3"
 	"time"
-)
 
+	"github.com/robfig/cron/v3"
+)
 
-func TaskList()  {
+func TaskList() {
 	crontab := cron.New(cron.WithSeconds())
-	ss := "0 10 * * *"
+
+	// 现有的任务回款检查 - 每天上午10点执行
+	ss := "0 10 * * * *"
 	_, err := crontab.AddFunc(ss, TaskList_return)
 	if err != nil {
-		fmt.Printf("err: %v\n", err)
+		fmt.Printf("TaskList_return cron err: %v\n", err)
 	}
+
+	// 新增的AllotTask超时检查 - 每30分钟执行一次
+	allotTaskCron := "0 */30 * * * *" // 每30分钟执行一次
+	_, err2 := crontab.AddFunc(allotTaskCron, AllotTask_Timeout_Check)
+	if err2 != nil {
+		fmt.Printf("AllotTask_Timeout_Check cron err: %v\n", err2)
+	}
+
 	crontab.Start()
 	defer crontab.Stop()
 	select {}
 }
 
 // 回款
-func TaskList_return()  {
+func TaskList_return() {
 
 	logs.Println("------- 任务回款 定时任务 --------")
 	List, _ := Task.Read_Task_List_All()
 
-	for _,T := range List{
+	for _, T := range List {
 
-		logs.Println("任务ID:",T.Id)
+		logs.Println("任务ID:", T.Id)
 
-		var InfoCollection_r  InfoCollection.InfoCollection //信息采集
+		var InfoCollection_r InfoCollection.InfoCollection //信息采集
 		if len(T.T_InfoCollection_id) == 0 {
 			logs.Println("信息采集表获取 为空!!")
-			continue;
+			continue
 		}
 		var is bool
 		InfoCollection_r, is = InfoCollection.Read_InfoCollection(T.T_InfoCollection_id)
 		if !is {
-			logs.Println("信息采集表获取错误 T_InfoCollection_id ",T.T_InfoCollection_id)
-			continue;
+			logs.Println("信息采集表获取错误 T_InfoCollection_id ", T.T_InfoCollection_id)
+			continue
 		}
 
 		if InfoCollection_r.T_State == 5 {
 			logs.Println("已经回款")
-			continue;
+			continue
 		}
-		if len(T.T_reporting_end_time) == 0{
+		if len(T.T_reporting_end_time) == 0 {
 			logs.Println("正在进行中")
-			continue;
+			continue
 		}
 
-		T_collection_time_interval, _ := lib.MinutesDifference(T.T_reporting_end_time, time.Now().Format("2006-01-02 15:04:05") )
+		T_collection_time_interval, _ := lib.MinutesDifference(T.T_reporting_end_time, time.Now().Format("2006-01-02 15:04:05"))
 		T_collection_time_interval = T_collection_time_interval / 60 / 24
-		logs.Println("用时 天:",T_collection_time_interval)
+		logs.Println("用时 天:", T_collection_time_interval)
 		if T_collection_time_interval <= 30 {
-			logs.Println("未超时!!!",)
-			continue;
+			logs.Println("未超时!!!")
+			continue
 		}
 		_, company_r := Account.Read_User_ByT_uuid(T.T_uuid)
 		//AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
 
 		//go System.Send_Weichat_News(AdminMap[T.T_scheme], fmt.Sprintf("【项目回款】项目回款已经超过%d天【%s-%s】", int(T_collection_time_interval) ,company_r.T_name, T.T_name), "")
-		go wx.WxSend(T.T_scheme, fmt.Sprintf("【项目回款】项目回款已经超过%d天【%s-%s】", int(T_collection_time_interval) ,company_r.T_name, T.T_name))
+		go wx.WxSend(T.T_scheme, fmt.Sprintf("【项目回款】项目回款已经超过%d天【%s-%s】", int(T_collection_time_interval), company_r.T_name, T.T_name))
+
+	}
+
+}
+
+// AllotTask超时检查 - 每30分钟执行一次
+func AllotTask_Timeout_Check() {
+	logs.Println("------- AllotTask超时检查 定时任务 --------")
+
+	// 获取超时的AllotTask列表
+	timeoutTasks, err := AllotTask.Read_AllotTask_Timeout_List()
+	if err != nil {
+		logs.Error("AllotTask_Timeout_Check 获取超时任务失败:", err)
+		return
+	}
 
+	if len(timeoutTasks) == 0 {
+		logs.Println("AllotTask_Timeout_Check: 没有超时的任务")
+		return
 	}
 
+	logs.Println(fmt.Sprintf("AllotTask_Timeout_Check: 找到 %d 个超过24小时未接收的任务", len(timeoutTasks)))
+
+	// 处理每个超时任务
+	for _, task := range timeoutTasks {
+		logs.Println(fmt.Sprintf("处理超时任务 ID: %s, 名称: %s, 创建时间: %s",
+			task.T_allot_task_id, task.T_name, task.CreateTime.Format("2006-01-02 15:04:05")))
+
+		// 更新状态为已拒绝并添加拒绝记录
+		reason := fmt.Sprintf("任务派发超过24小时未接收,系统自动拒绝 (创建时间: %s)",
+			task.CreateTime.Format("2006-01-02 15:04:05"))
+
+		if AllotTask.Update_AllotTask_To_Refused(task, reason) {
+			logs.Println(fmt.Sprintf("成功将任务 %s 更新为已拒绝状态", task.T_allot_task_id))
+
+			// 发送企业微信通知给实施方案负责人
+			if len(task.T_scheme) > 0 {
+				_, company_r := Account.Read_User_ByT_uuid(task.T_uuid)
+				notificationMsg := fmt.Sprintf("【任务超时拒绝】任务「%s-%s」已超过24小时未接收,系统已自动拒绝",
+					company_r.T_name, task.T_name)
+				go wx.WxSend(task.T_scheme, notificationMsg)
+				logs.Println(fmt.Sprintf("已发送企业微信通知给负责人: %s", task.T_scheme))
+			}
+		} else {
+			logs.Error(fmt.Sprintf("更新任务 %s 状态失败", task.T_allot_task_id))
+		}
+	}
 
+	logs.Println("------- AllotTask超时检查 定时任务完成 --------")
 }

+ 3 - 3
conf/app.conf

@@ -6,10 +6,10 @@ EnableDocs = true
 copyrequestbody = true
 
 # Nats
-NatsServer_Url = "203.34.49.130:4222"
+NatsServer_Url = "8.148.211.203:4222"
 NatsForbidden = true
 
-MysqlServer_UrlPort = "203.34.49.130:3306"
+MysqlServer_UrlPort = "8.148.211.203:3306"
 MysqlServer_Database = "coldverify"
 MysqlServer_Username = "coldverify"
 MysqlServer_Password = "Bd3d34yJ7aibiEi"
@@ -18,7 +18,7 @@ MysqlServer_MaxOpenConnections = 200
 
 
 # Redis
-Redis_address = "203.34.49.130:6379"
+Redis_address = "8.148.211.203:6379"
 Redis_password = "redis_JJ56d5"
 Redis_dbNum = "2"
 

+ 13 - 0
controllers/Account.go

@@ -147,6 +147,19 @@ func (c *AccountController) Get() {
 	c.ServeJSON()
 	return
 }
+func (c *AccountController) Delivery() {
+	// 验证登录 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
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: conf.VdelUuid}
+	c.ServeJSON()
+	return
+}
 
 // 管理员-添加-
 func (c *AccountController) Add() {

+ 676 - 0
controllers/AllotTask.go

@@ -0,0 +1,676 @@
+package controllers
+
+import (
+	"ColdVerify_server/conf"
+	"ColdVerify_server/lib"
+	"ColdVerify_server/lib/wx"
+	"ColdVerify_server/models/Account"
+	"ColdVerify_server/models/AllotTask"
+	"ColdVerify_server/models/InfoCollection"
+	"ColdVerify_server/models/System"
+	"encoding/json"
+	"fmt"
+	"math"
+	"time"
+
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+type AllotTaskController struct {
+	beego.Controller
+}
+
+// 列表 -
+func (c *AllotTaskController) List() {
+	// 验证登录 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
+	}
+
+	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")
+	T_company := c.GetString("T_company") // 公司名称
+	T_uuid := c.GetString("T_uuid")
+
+	T_scheme := c.GetString("T_scheme")         // 实施方案 负责人UUID
+	T_project := c.GetString("T_project")       // 实施方案 负责人UUID
+	T_collection := c.GetString("T_collection") // 数据采集 负责人UUID
+	T_reporting := c.GetString("T_reporting")   // 报告编写 负责人UUID
+	T_delivery := c.GetString("T_delivery")     // 交付审核 负责人UUID
+	T_status, _ := c.GetInt("T_status")
+
+	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
+	}
+	// 经销商下管理员可查看自己经销商下所有的任务
+	// 经销商下其他角色只能查看分配给自己的任务
+	if len(User_r.T_Distributor_id) > 0 && User_r.T_power <= 2 {
+		T_admin = ""
+	}
+
+	var cnt int
+
+	List, cnt := AllotTask.Read_AllotTask_List(User_r.T_Distributor_id, T_admin, T_uuid, T_name, T_project, T_scheme, T_collection, T_reporting, T_delivery,
+		T_status, T_company_list, UserMap, AdminMap, page, page_z)
+
+	page_size := math.Ceil(float64(cnt) / float64(page_z))
+	r_jsons.List = List
+	r_jsons.Page = page
+	r_jsons.Page_size = int(page_size)
+	r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
+	r_jsons.Num = cnt
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+// 获取-
+func (c *AllotTaskController) Get() {
+	// 验证登录 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_allot_task_id := c.GetString("T_allot_task_id")
+	r, is := AllotTask.Read_AllotTask(T_allot_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	userMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
+	adminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: AllotTask.AllotTaskToAllotTask_(r, userMap, adminMap)}
+	c.ServeJSON()
+	return
+}
+
+// 添加-
+func (c *AllotTaskController) Add() {
+
+	// 验证登录 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_name := c.GetString("T_name")
+	T_uuid := c.GetString("T_uuid")                   // 用户uuid
+	T_approach_time := c.GetString("T_approach_time") // 用户uuid
+	T_scheme := c.GetString("T_scheme")
+	T_collection := c.GetString("T_collection")
+	T_reporting := c.GetString("T_reporting")
+	T_delivery := c.GetString("T_delivery")
+
+	T_project := c.GetString("T_project")             // 项目 负责人UUID
+	T_province := c.GetString("T_province")           // 省
+	T_city := c.GetString("T_city")                   // 市
+	T_district := c.GetString("T_district")           // 区
+	T_province_code := c.GetString("T_province_code") // 省 code
+	T_city_code := c.GetString("T_city_code")         // 市 code
+	T_district_code := c.GetString("T_district_code") // 区 code
+	T_category := c.GetString("T_category")           // 类别
+	T_attachment := c.GetString("T_attachment")       // 合同附件
+
+	// 查询信息采集信息
+	user, is := Account.Read_User(T_uuid)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid 错误!"}
+		c.ServeJSON()
+		return
+	}
+	var_ := AllotTask.AllotTask{
+		T_Distributor_id: user.T_Distributor_id,
+		T_uuid:           T_uuid,
+		T_name:           T_name,
+		T_approach_time:  T_approach_time,
+		T_scheme:         T_scheme,
+		T_collection:     T_collection,
+		T_reporting:      T_reporting,
+		T_delivery:       T_delivery,
+
+		T_project:       T_project,
+		T_province:      T_province,
+		T_city:          T_city,
+		T_district:      T_district,
+		T_province_code: T_province_code,
+		T_city_code:     T_city_code,
+		T_district_code: T_district_code,
+		T_category:      T_category,
+		T_attachment:    T_attachment,
+
+		T_state:  1,
+		T_status: AllotTask.AllotTaskStatusWaitReceive,
+
+		T_allot_time: time.Now(),
+	}
+
+	T_sllot_task_id, is := AllotTask.Add_AllotTask(var_)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
+		c.ServeJSON()
+		return
+	}
+	// 通知
+	_, company_r := Account.Read_User_ByT_uuid(var_.T_uuid)
+	go wx.WxSend(var_.T_collection, fmt.Sprintf("【%s-%s】采集任务已派发,进场时间:%s,请及时接收并提交信息确认表", company_r.T_name, var_.T_name, T_approach_time))
+
+	System.Add_UserLogs_T(User_r.T_uuid, "采集任务管理", "添加", var_)
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_sllot_task_id}
+	c.ServeJSON()
+	return
+}
+
+// 修改-
+func (c *AllotTaskController) Up() {
+	// 验证登录 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_name := c.GetString("T_name")
+	T_approach_time := c.GetString("T_approach_time")
+	T_scheme := c.GetString("T_scheme")
+	T_collection := c.GetString("T_collection")
+	T_reporting := c.GetString("T_reporting")
+	T_delivery := c.GetString("T_delivery")
+	T_project := c.GetString("T_project")             // 项目 负责人UUID
+	T_province := c.GetString("T_province")           // 省
+	T_city := c.GetString("T_city")                   // 市
+	T_district := c.GetString("T_district")           // 区
+	T_province_code := c.GetString("T_province_code") // 省 code
+	T_city_code := c.GetString("T_city_code")         // 市 code
+	T_district_code := c.GetString("T_district_code") // 区 code
+	T_category := c.GetString("T_category")           // 类别
+	T_attachment := c.GetString("T_attachment")       // 合同附件
+
+	T_allot_task_id := c.GetString("T_allot_task_id")
+	r, is := AllotTask.Read_AllotTask(T_allot_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
+		c.ServeJSON()
+		return
+	}
+	old_collection := r.T_collection
+	// .......
+	clos := make([]string, 0)
+	r.T_attachment = T_attachment
+	if len(T_name) > 0 {
+		r.T_name = T_name
+		clos = append(clos, "T_name")
+	}
+	if len(T_approach_time) > 0 {
+		r.T_approach_time = T_approach_time
+		clos = append(clos, "T_approach_time")
+	}
+
+	if len(T_scheme) > 0 {
+		r.T_scheme = T_scheme
+		clos = append(clos, "T_scheme")
+
+	}
+	if len(T_collection) > 0 {
+		r.T_collection = T_collection
+		clos = append(clos, "T_collection")
+	}
+	if len(T_reporting) > 0 {
+		r.T_reporting = T_reporting
+		clos = append(clos, "T_reporting")
+	}
+	if len(T_delivery) > 0 {
+		r.T_delivery = T_delivery
+		clos = append(clos, "T_delivery")
+	}
+
+	if len(T_project) > 0 {
+		r.T_project = T_project
+		clos = append(clos, "T_project")
+	}
+	if len(T_province) > 0 {
+		r.T_province = T_province
+		clos = append(clos, "T_province")
+	}
+	if len(T_city) > 0 {
+		r.T_city = T_city
+		clos = append(clos, "T_city")
+	}
+	if len(T_district) > 0 {
+		r.T_district = T_district
+		clos = append(clos, "T_district")
+	}
+	if len(T_province_code) > 0 {
+		r.T_province_code = T_province_code
+		clos = append(clos, "T_province_code")
+	}
+	if len(T_city_code) > 0 {
+		r.T_city_code = T_city_code
+		clos = append(clos, "T_city_code")
+	}
+	if len(T_district_code) > 0 {
+		r.T_district_code = T_district_code
+		clos = append(clos, "T_district_code")
+	}
+	if len(T_category) > 0 {
+		r.T_category = T_category
+		clos = append(clos, "T_category")
+	}
+	if len(T_attachment) > 0 {
+		r.T_attachment = T_attachment
+		clos = append(clos, "T_attachment")
+	}
+
+	if r.T_status == AllotTask.AllotTaskStatusRefused {
+		r.T_status = AllotTask.AllotTaskStatusWaitReceive
+		r.T_allot_time = time.Now()
+		clos = append(clos, "T_status")
+		_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
+		go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】采集任务已派发,进场时间:%s,请及时接收并提交信息确认表", company_r.T_name, r.T_name, T_approach_time))
+
+	} else if r.T_collection != old_collection {
+		_, company_r := Account.Read_User_ByT_uuid(r.T_uuid)
+		go wx.WxSend(r.T_collection, fmt.Sprintf("【%s-%s】采集任务已派发,进场时间:%s,请及时接收并提交信息确认表", company_r.T_name, r.T_name, T_approach_time))
+
+	}
+
+	if !AllotTask.Update_AllotTask(r, clos...) {
+		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 *AllotTaskController) Del() {
+	// 验证登录 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_allot_task_id := c.GetString("T_allot_task_id")
+	if r, is := AllotTask.Read_AllotTask(T_allot_task_id); is {
+		if !AllotTask.Delete_AllotTask(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
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
+	c.ServeJSON()
+	return
+}
+
+// 复制-
+func (c *AllotTaskController) Copy() {
+
+	// 验证登录 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_name := c.GetString("T_name")
+	T_approach_time := c.GetString("T_approach_time")
+	T_allot_task_id := c.GetString("T_allot_task_id")
+	r, is := AllotTask.Read_AllotTask(T_allot_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	var_ := AllotTask.AllotTask{
+		T_Distributor_id: r.T_Distributor_id,
+		T_uuid:           r.T_uuid,
+		T_name:           T_name,
+		T_approach_time:  T_approach_time,
+		T_scheme:         r.T_scheme,
+		T_collection:     r.T_collection,
+		T_reporting:      r.T_reporting,
+		T_delivery:       r.T_delivery,
+		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_state:          1,
+		T_status:         AllotTask.AllotTaskStatusWaitReceive,
+		T_allot_time:     time.Now(),
+	}
+
+	// 通知
+	_, company_r := Account.Read_User_ByT_uuid(var_.T_uuid)
+	go wx.WxSend(var_.T_collection, fmt.Sprintf("【%s-%s】采集任务已派发,进场时间:%s,请及时接收并提交信息确认表", company_r.T_name, var_.T_name, T_approach_time))
+	T_sllot_task_id, is := AllotTask.Add_AllotTask(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: T_sllot_task_id}
+	c.ServeJSON()
+	return
+}
+
+// 接收
+func (c *AllotTaskController) Receive() {
+	// 验证登录 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_status, _ := c.GetInt("T_status") // 2-接收 3-拒绝
+	T_reason := c.GetString("T_reason")
+
+	T_allot_task_id := c.GetString("T_allot_task_id")
+	r, is := AllotTask.Read_AllotTask(T_allot_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 验证权限
+	if User_r.T_uuid != r.T_collection {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "您不是该任务单的接收人!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 获取r.T_record,转换为json,添加新的记录
+	var existingRecords = make([]AllotTask.AllotTaskRecord, 0)
+	if len(r.T_record) > 0 {
+		json.Unmarshal([]byte(r.T_record), &existingRecords)
+	}
+
+	// 创建新的记录条目
+	newRecord := AllotTask.AllotTaskRecord{
+		T_collection: User_r.T_uuid,
+		T_status:     T_status,
+		T_reason:     T_reason,
+		T_time:       time.Now().Format("2006-01-02 15:04:05"),
+	}
+
+	existingRecords = append(existingRecords, newRecord)
+
+	// 将更新后的记录数组转换为JSON字符串
+	updatedRecordsJSON, err := json.Marshal(existingRecords)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "记录更新失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 更新r.T_record字段
+	r.T_record = string(updatedRecordsJSON)
+	r.T_status = T_status
+	if r.T_status == AllotTask.AllotTaskStatusRefused && len(T_reason) > 0 {
+		r.T_reason = T_reason
+	}
+
+	// 更新数据库中的记录
+	if !AllotTask.Update_AllotTask(r, "T_record", "T_status", "T_reason") {
+		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 *AllotTaskController) UploadConfirmForm() {
+	// 验证登录 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_confirm_form := c.GetString("T_confirm_form")
+
+	T_allot_task_id := c.GetString("T_allot_task_id")
+	r, is := AllotTask.Read_AllotTask(T_allot_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	if len(T_confirm_form) > 0 {
+		r.T_confirm_form = T_confirm_form
+		if r.T_status == AllotTask.AllotTaskStatusReceived {
+			r.T_status = AllotTask.AllotTaskStatusSubmit // 修改为已提交
+		}
+		if len(r.T_submit_time) == 0 {
+			r.T_submit_time = time.Now().Format("2006-01-02 15:04:05") // 设置提交时间
+		}
+	}
+
+	// 获取r.T_record,转换为json,添加新的记录
+	var existingRecords = make([]AllotTask.AllotTaskRecord, 0)
+	if len(r.T_record) > 0 {
+		json.Unmarshal([]byte(r.T_record), &existingRecords)
+	}
+
+	// 创建新的记录条目
+	newRecord := AllotTask.AllotTaskRecord{
+		T_collection: User_r.T_uuid,
+		T_status:     AllotTask.AllotTaskStatusSubmit,
+		T_reason:     "",
+		T_time:       time.Now().Format("2006-01-02 15:04:05"),
+	}
+
+	existingRecords = append(existingRecords, newRecord)
+
+	// 将更新后的记录数组转换为JSON字符串
+	updatedRecordsJSON, err := json.Marshal(existingRecords)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "记录更新失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 更新r.T_record字段
+	r.T_record = string(updatedRecordsJSON)
+
+	if !AllotTask.Update_AllotTask(r, "T_confirm_form", "T_status", "T_submit_time", "T_record") {
+		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 *AllotTaskController) Statistics() {
+	// 验证登录 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
+	}
+
+	List, cnt := AllotTask.Read_AllotTask_List(User_r.T_Distributor_id, User_r.T_uuid, "", "", "", "", "", "", "",
+		0, []string{}, map[string]string{}, map[string]string{}, 0, 9999)
+
+	res := make(map[int]int)
+	for k, _ := range AllotTask.AllotTaskStateMap {
+		res[k] = 0
+	}
+	res[0] = cnt
+	for _, r := range List {
+		res[r.T_status] += 1
+	}
+
+	// 按指定格式返回统计结果
+	result := []map[string]interface{}{
+		{
+			"name":     "全部",
+			"num":      res[0],
+			"T_status": 0,
+		},
+		{
+			"name":     "待接收",
+			"num":      res[AllotTask.AllotTaskStatusWaitReceive],
+			"T_status": AllotTask.AllotTaskStatusWaitReceive,
+		},
+		{
+			"name":     "已接收",
+			"num":      res[AllotTask.AllotTaskStatusReceived],
+			"T_status": AllotTask.AllotTaskStatusReceived,
+		},
+		{
+			"name":     "已提交",
+			"num":      res[AllotTask.AllotTaskStatusSubmit],
+			"T_status": AllotTask.AllotTaskStatusSubmit,
+		},
+		{
+			"name":     "已拒绝",
+			"num":      res[AllotTask.AllotTaskStatusRefused],
+			"T_status": AllotTask.AllotTaskStatusRefused,
+		},
+	}
+
+	c.Data["json"] = lib.JSONS{Data: result, Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
+// 获取任务负责人列表
+func (c *AllotTaskController) GetAllotTaskUserList() {
+	// 验证登录 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_type := c.GetString("T_type") // T_project项目 T_scheme方案 T_collection数据采集 T_reporting报告
+
+	list := AllotTask.Get_AllotTask_UserList(T_type)
+	AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
+
+	var User_list []Account.Admin_R
+	for _, v := range list {
+		if len(v) == 0 {
+			continue
+		}
+		User_list = append(User_list, Account.Admin_R{T_uuid: v, T_name: AdminMap[v]})
+	}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: User_list}
+	c.ServeJSON()
+	return
+}
+
+// 通过信息采集ID获取指派任务详情
+func (c *AllotTaskController) GetByInfoCollectionId() {
+	// 验证登录
+	_, 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_InfoCollection_id := c.GetString("T_InfoCollection_id")
+	if len(T_InfoCollection_id) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "信息采集ID不能为空!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 先通过信息采集ID获取信息采集详情
+	infoCollection, is := InfoCollection.Read_InfoCollection(T_InfoCollection_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "信息采集ID错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 检查是否有关联的指派任务ID
+	if len(infoCollection.T_allot_task_id) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 200, Data: AllotTask.AllotTask_{}, Msg: "该信息采集没有关联的指派任务!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 通过指派任务ID获取指派任务详情
+	allotTask, is := AllotTask.Read_AllotTask(infoCollection.T_allot_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "指派任务不存在!"}
+		c.ServeJSON()
+		return
+	}
+
+	allotTaskDetail := AllotTask.AllotTaskToAllotTask_(allotTask, map[string]string{}, map[string]string{})
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: allotTaskDetail}
+	c.ServeJSON()
+	return
+}

+ 10 - 4
controllers/ERP.go

@@ -41,13 +41,19 @@ func (c *UserController) User_List_All_For_ERP() {
 
 func (c *TaskController) Task_List_All_For_ERP() {
 
-	T_reporting_pass_time := c.GetString("T_reporting_pass_time")
-	if len(T_reporting_pass_time) > 0 && !lib.IsDateStr(T_reporting_pass_time) {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
+	start_time := c.GetString("T_reporting_pass_start_time")
+	end_time := c.GetString("T_reporting_pass_end_time")
+	if _, is := lib.TimeStrToTime(start_time); !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "开始时间格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	if _, is := lib.TimeStrToTime(end_time); !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "结束时间格式错误!"}
 		c.ServeJSON()
 		return
 	}
-	List, _ := Task.Read_Task_List_For_ERP(T_reporting_pass_time)
+	List, _ := Task.Read_Task_List_For_ERP(start_time, end_time)
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: List}
 	c.ServeJSON()

+ 43 - 1
controllers/Task.go

@@ -735,6 +735,48 @@ func (c *TaskController) Add() {
 	go wx.WxSend(var_.T_reporting, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
 	go wx.WxSend(var_.T_delivery, fmt.Sprintf("【%s-%s】任务派发", company_r.T_name, var_.T_name))
 
+	// 同步信息采集表 --------
+	InfoCollection_Map_List := InfoCollection.Read_InfoTemplateMap_List_For_Data(var_.T_InfoTemplate_id)
+	InfoCollection_Data := InfoCollection.Read_InfoTemplateMapData_List(var_.T_InfoCollection_id, var_.T_InfoTemplate_id, InfoCollection_Map_List)
+
+	Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(var_.T_VerifyTemplate_id, 0, 0)
+	Data := VerifyTemplate.Read_VerifyTemplateMapData_List(0, T_task_id, var_.T_VerifyTemplate_id, Map_List)
+
+	InfoCollectionDataMap := make(map[string]string)
+	for _, data := range InfoCollection_Data {
+		InfoCollectionDataMap[data.T_name] = data.T_value
+	}
+
+	MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
+	for _, v := range Data {
+		if len(v.T_value) > 0 {
+			continue
+		}
+		if InfoCollectionDataMap[v.T_name] == "" {
+			continue
+		}
+		val := VerifyTemplate.VerifyTemplateMapData{
+			T_source:               v.T_source,
+			T_task_id:              T_task_id,
+			T_VerifyTemplate_id:    var_.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: InfoCollectionDataMap[v.T_name],
+		}
+		MapDataList = append(MapDataList, val)
+	}
+	_, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData(MapDataList)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "同步信息采集表失败"}
+		c.ServeJSON()
+		return
+	}
+	// 同步信息采集表结束 --------
+
 	// 添加任务操作日志
 	Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "添加", var_)
 	System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "添加", var_)
@@ -3020,7 +3062,7 @@ func (c *TaskController) Copy() {
 		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_subject_matter:  T_name,
 		T_temp_range:      r.T_temp_range,
 		T_report_type:     r.T_report_type,
 		T_device_quantity: r.T_device_quantity,

+ 69 - 44
controllers/VerifyTemplate.go

@@ -10,6 +10,7 @@ import (
 	"ColdVerify_server/models/Task"
 	"ColdVerify_server/models/VerifyTemplate"
 	"encoding/json"
+	"errors"
 	"fmt"
 	beego "github.com/beego/beego/v2/server/web"
 	"math"
@@ -689,14 +690,29 @@ func (c *VerifyTemplateController) Map_Data_Pu() {
 	T_reporting_state := task.T_reporting_state
 	task.T_step = body.T_step
 	if body.T_submit == 2 && T_reporting_state == 0 {
-		task.T_reporting_state = 6
+		task.T_reporting_state = Task.TaskExaminingReportStateClickGenerate
 	}
-	if !Task.Update_Task(task, "T_step", "T_reporting_state") {
+	if body.T_submit == 1 && task.T_collection_state == Task.TaskCollectionStateWaitSubmit {
+		// 手机app提交修改采集状态为已提交
+		task.T_collection_state = Task.TaskCollectionStateSubmitted
+	}
+	if !Task.Update_Task(task, "T_step", "T_reporting_state", "T_collection_state") {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改任务步骤失败!"}
 		c.ServeJSON()
 		return
 	}
 
+	// 判断旧的模版id与任务id的模版是否一致,如果不一致则复制旧模板数据到新模板
+	if task.T_VerifyTemplate_id != body.T_VerifyTemplate_id {
+		copy_task := task
+		copy_task.T_VerifyTemplate_id = body.T_VerifyTemplate_id
+		_, err = CopyMapData(copy_task, task, 0)
+		if err != nil {
+			logs.Error("复制旧模板数据到新模板失败", err)
+		}
+
+	}
+
 	MapDataList := make([]VerifyTemplate.VerifyTemplateMapData, 0)
 	for _, v := range body.VerifyTemplateMapData {
 		val := VerifyTemplate.VerifyTemplateMapData{
@@ -753,7 +769,7 @@ func (c *VerifyTemplateController) Map_Data_Pu() {
 	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), "")
+		System.Add_App_News(task.T_reporting, fmt.Sprintf("【%s-%s】数据采集工程师 %s 已提交", company_r.T_name, task.T_name, admin_r.T_name), "")
 
 	}
 
@@ -895,50 +911,14 @@ func (c *VerifyTemplateController) Map_Data_Copy() {
 		return
 	}
 
-	copy_task_Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(copy_task.T_VerifyTemplate_id, T_source, 0)
-	copy_task_Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_copy_task_id, copy_task.T_VerifyTemplate_id, copy_task_Map_List)
-
-	Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(paste_task.T_VerifyTemplate_id, T_source, 0)
-	Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, T_paste_task_id, paste_task.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:              paste_task.T_task_id,
-			T_VerifyTemplate_id:    paste_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: copyDataMap[v.T_name],
-		}
-		MapDataList = append(MapDataList, val)
-	}
-	var ids []int64
-	ids, is = VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "", 0, 0, 0)
-	if !is {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "保存失败"}
+	ids, err := CopyMapData(copy_task, paste_task, T_source)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
 		c.ServeJSON()
 		return
 	}
-	System.Add_UserLogs_T(User_r.T_uuid, "验证模版标签数据", "通过标签名称复制", MapDataList)
+
+	System.Add_UserLogs_T(User_r.T_uuid, "验证模版标签数据", "通过标签名称复制", fmt.Sprintf("copy_task_id:%s | paste_task_id:%s", T_copy_task_id, T_paste_task_id))
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: ids}
 	c.ServeJSON()
@@ -1375,3 +1355,48 @@ func (c *VerifyTemplateController) Class_Copy() {
 	c.ServeJSON()
 	return
 }
+
+func CopyMapData(copy_task, paste_task Task.Task, T_source int) (ids []int64, err error) {
+	copy_task_Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(copy_task.T_VerifyTemplate_id, T_source, 0)
+	copy_task_Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, copy_task.T_task_id, copy_task.T_VerifyTemplate_id, copy_task_Map_List)
+
+	Map_List := VerifyTemplate.Read_VerifyTemplateMap_List_For_Data(paste_task.T_VerifyTemplate_id, T_source, 0)
+	Data := VerifyTemplate.Read_VerifyTemplateMapData_List(T_source, paste_task.T_task_id, paste_task.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:              paste_task.T_task_id,
+			T_VerifyTemplate_id:    paste_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: copyDataMap[v.T_name],
+		}
+		MapDataList = append(MapDataList, val)
+	}
+
+	ids, is := VerifyTemplate.AddOrUpdate_VerifyTemplateMapData_ADD_History(MapDataList, 0, "", 0, 0, 0)
+	if !is {
+		return ids, errors.New("保存复制数据失败")
+	}
+	return nil, err
+}

+ 20 - 4
controllers/infoCollection.go

@@ -7,6 +7,7 @@ import (
 	"ColdVerify_server/lib/wx"
 	"ColdVerify_server/logs"
 	"ColdVerify_server/models/Account"
+	"ColdVerify_server/models/AllotTask"
 	"ColdVerify_server/models/Device"
 	"ColdVerify_server/models/InfoCollection"
 	"ColdVerify_server/models/System"
@@ -45,6 +46,7 @@ func (c *InfoCollectionController) List() {
 
 	T_name := c.GetString("T_name")
 	T_uuid := c.GetString("T_uuid")
+	T_allot_task_id := c.GetString("T_allot_task_id")
 	T_status, _ := c.GetInt("T_status")
 
 	UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
@@ -53,7 +55,7 @@ func (c *InfoCollectionController) List() {
 	InfoTemplateClassMap := InfoCollection.InfoTemplateClassListToMap(InfoCollection.Read_InfoTemplateClass_List_ALL())
 
 	var cnt int
-	List, cnt := InfoCollection.Read_InfoCollection_List(T_uuid, T_name, T_status, UserMap, AdminMap, InfoTemplateMap, InfoTemplateClassMap, page, page_z)
+	List, cnt := InfoCollection.Read_InfoCollection_List(T_uuid, T_allot_task_id, T_name, T_status, UserMap, AdminMap, InfoTemplateMap, InfoTemplateClassMap, page, page_z)
 
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.List = List
@@ -88,6 +90,7 @@ func (c *InfoCollectionController) UserList() {
 	}
 
 	T_name := c.GetString("T_name")
+	T_allot_task_id := c.GetString("T_allot_task_id")
 	T_status, _ := c.GetInt("T_status")
 	UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
 	AdminMap := Account.AdminListToMap(Account.Read_Admin_List_ALL_1())
@@ -95,7 +98,7 @@ func (c *InfoCollectionController) UserList() {
 	InfoTemplateClassMap := InfoCollection.InfoTemplateClassListToMap(InfoCollection.Read_InfoTemplateClass_List_ALL())
 
 	var cnt int
-	List, cnt := InfoCollection.Read_UserInfoCollection_List(User_r.T_uuid, T_name, T_status, UserMap, AdminMap, InfoTemplateMap, InfoTemplateClassMap, page, page_z)
+	List, cnt := InfoCollection.Read_UserInfoCollection_List(T_allot_task_id, User_r.T_uuid, T_name, T_status, UserMap, AdminMap, InfoTemplateMap, InfoTemplateClassMap, page, page_z)
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.List = List
 	r_jsons.Page = page
@@ -149,6 +152,17 @@ func (c *InfoCollectionController) Add() {
 	T_uuid := c.GetString("T_uuid") // 用户uuid
 	T_InfoTemplate_class := c.GetString("T_InfoTemplate_class")
 	T_InfoTemplate_id := c.GetString("T_InfoTemplate_id")
+	T_allot_task_id := c.GetString("T_allot_task_id")
+
+	if len(T_allot_task_id) > 0 {
+		allotTask, is := AllotTask.Read_AllotTask(T_allot_task_id)
+		if !is {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "获取采集任务信息失败!"}
+			c.ServeJSON()
+			return
+		}
+		T_uuid = allotTask.T_uuid
+	}
 
 	var_ := InfoCollection.InfoCollection{
 		T_uuid:               T_uuid,
@@ -158,6 +172,7 @@ func (c *InfoCollectionController) Add() {
 		T_status:             1,
 		T_State:              1,
 		T_submit_uuid:        User_r.T_uuid,
+		T_allot_task_id:      T_allot_task_id,
 	}
 
 	T_InfoCollection_id, err := InfoCollection.Add_InfoCollection(var_)
@@ -431,8 +446,8 @@ func (c *InfoCollectionController) Statistics() {
 		c.ServeJSON()
 		return
 	}
-
-	List, cnt := InfoCollection.Read_UserInfoCollection_List(User_r.T_uuid, "", 0, map[string]string{}, map[string]string{}, map[string]string{}, map[string]string{}, 0, 999)
+	T_allot_task_id := c.GetString("T_allot_task_id")
+	List, cnt := InfoCollection.Read_UserInfoCollection_List(T_allot_task_id, User_r.T_uuid, "", 0, map[string]string{}, map[string]string{}, map[string]string{}, map[string]string{}, 0, 9999)
 	res := make(map[int]int)
 	for k, _ := range InfoCollection.InfoCollectionStatusMap {
 		res[k] = 0
@@ -474,6 +489,7 @@ func (c *InfoCollectionController) Copy() {
 		T_status:             1,
 		T_State:              1,
 		T_submit_uuid:        User_r.T_uuid,
+		T_allot_task_id:      info.T_allot_task_id,
 		T_start_time:         time.Now().Format("2006-01-02 15:04:05"),
 	}
 

+ 1 - 1
lib/Qiniu.go

@@ -87,7 +87,7 @@ func UploadToken(T_suffix string) string {
 		ForceSaveKey: true,
 		SaveKey:      "UpImage/" + Tokey + "." + T_suffix,
 		FsizeLimit:   1024 * 1024 * 50,
-		MimeLimit:    "image/*;application/pdf",
+		MimeLimit:    "image/*;application/pdf;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/msword;application/vnd.ms-excel",
 	}
 
 	upToken := putPolicy.UploadToken(Qiniu)

+ 439 - 0
models/AllotTask/AllotTask.go

@@ -0,0 +1,439 @@
+package AllotTask
+
+import (
+	"ColdVerify_server/conf"
+	"ColdVerify_server/lib"
+	"ColdVerify_server/logs"
+	"encoding/json"
+	"fmt"
+	"time"
+
+	"github.com/astaxie/beego/cache"
+	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	_ "github.com/go-sql-driver/mysql"
+)
+
+var (
+	AllotTaskStatusWaitReceive = 1 // 待接收
+	AllotTaskStatusReceived    = 2 // 已接收
+	AllotTaskStatusRefused     = 3 // 已拒绝
+	AllotTaskStatusSubmit      = 4 // 已提交
+	AllotTaskStateMap          = map[int]string{
+		AllotTaskStatusWaitReceive: "待接收",
+		AllotTaskStatusReceived:    "已接收",
+		AllotTaskStatusRefused:     "已拒绝",
+		AllotTaskStatusSubmit:      "已提交",
+	}
+)
+
+// 模版
+type AllotTask struct {
+	Id               int    `orm:"column(ID);size(11);auto;pk"`
+	T_Distributor_id string `orm:"size(256);null"` // 分销商id
+	T_allot_task_id  string `orm:"size(256);null"` // 分配任务ID
+	T_uuid           string `orm:"size(256);null"` // 公司 UUID
+	T_name           string `orm:"size(256);null"` // 标题
+
+	T_approach_time string    `orm:"size(256);null"`        // 进场时间
+	T_scheme        string    `orm:"size(256);null"`        // 实施方案 负责人UUID
+	T_collection    string    `orm:"size(256);null"`        // 数据采集 负责人UUID
+	T_reporting     string    `orm:"size(256);null"`        // 报告编写 负责人UUID
+	T_delivery      string    `orm:"size(256);null"`        // 交付审核 负责人UUID
+	T_project       string    `orm:"size(256);null"`        // 项目 负责人UUID
+	T_province      string    `orm:"size(256);null"`        // 省
+	T_city          string    `orm:"size(256);null"`        // 市
+	T_district      string    `orm:"size(256);null"`        // 区
+	T_province_code string    `orm:"size(256);null"`        // 省 code
+	T_city_code     string    `orm:"size(256);null"`        // 市 code
+	T_district_code string    `orm:"size(256);null"`        // 区 code
+	T_category      string    `orm:"size(256);null"`        // 类别
+	T_attachment    string    `orm:"type(text);null"`       // 附件
+	T_confirm_form  string    `orm:"type(text);null"`       // 信息确认表
+	T_submit_time   string    `orm:"type(text);null"`       // 信息确认表提交时间
+	T_status        int       `orm:"size(2);default(0)"`    // 状态 1待接收 2已接收 3已拒绝 4已提交
+	T_state         int       `orm:"size(2);default(1)"`    // 0 删除  1 正常
+	T_record        string    `orm:"type(text);null"`       // 记录
+	T_reason        string    `orm:"type(text);null"`       // 拒绝原因
+	T_allot_time    time.Time `orm:"type(timestamp);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 AllotTask_ struct {
+	Id                int
+	T_Distributor_id  string   // 分销商id
+	T_allot_task_id   string   // 分配任务ID
+	T_uuid            string   // 公司 UUID
+	T_user_name       string   // 公司 名称
+	T_name            string   // 标题
+	T_approach_time   string   // 进场时间
+	T_scheme          string   // 实施方案 负责人UUID
+	T_collection      string   // 数据采集 负责人UUID
+	T_reporting       string   // 报告编写 负责人UUID
+	T_delivery        string   // 交付审核 负责人UUID
+	T_project         string   // 项目 负责人UUID
+	T_scheme_name     string   // 实施方案 负责人姓名
+	T_collection_name string   // 数据采集 负责人姓名
+	T_reporting_name  string   // 报告编写 负责人姓名
+	T_delivery_name   string   // 交付审核 负责人姓名
+	T_project_name    string   // 项目 负责人姓名
+	T_province        string   // 省
+	T_city            string   // 市
+	T_district        string   // 区
+	T_province_code   string   // 省 code
+	T_city_code       string   // 市 code
+	T_district_code   string   // 区 code
+	T_area            []string // 省市区
+	T_area_code       []string // 省市区
+	T_category        string   // 类别
+	T_attachment      []string // 合同附件
+	T_confirm_form    []string // 信息确认表图片
+	T_submit_time     string   // 信息确认表提交时间
+	T_status          int      // 状态 1待接收 2已接收 3已拒绝
+	T_state           int      // 0 删除  1 正常
+	T_record          []AllotTaskRecord
+	T_reason          string
+	T_allot_time      string //指派时间
+	CreateTime        string //auto_now_add 第一次保存时才设置时间
+	UpdateTime        string //auto_now 每次 model 保存时都会对时间自动更新
+}
+type AllotTaskRecord struct {
+	T_collection      string
+	T_collection_name string
+	T_status          int
+	T_reason          string
+	T_time            string
+}
+
+func AllotTaskToAllotTask_(T AllotTask, userMap, adminMap map[string]string) (T_ AllotTask_) {
+	T_.Id = T.Id
+	T_.T_Distributor_id = T.T_Distributor_id
+
+	T_.T_allot_task_id = T.T_allot_task_id
+	T_.T_uuid = T.T_uuid
+	T_.T_user_name = userMap[T.T_uuid]
+	T_.T_name = T.T_name
+	T_.T_approach_time = T.T_approach_time
+	T_.T_scheme = T.T_scheme
+	T_.T_collection = T.T_collection
+	T_.T_reporting = T.T_reporting
+	T_.T_delivery = T.T_delivery
+	T_.T_project = T.T_project
+	T_.T_scheme_name = adminMap[T.T_scheme]
+	T_.T_collection_name = adminMap[T.T_collection]
+	T_.T_reporting_name = adminMap[T.T_reporting]
+	T_.T_delivery_name = adminMap[T.T_delivery]
+	T_.T_project_name = adminMap[T.T_project]
+
+	T_.T_province = T.T_province
+	T_.T_city = T.T_city
+	T_.T_district = T.T_district
+	T_.T_area = []string{T.T_province, T.T_city, T.T_district}
+	T_.T_province_code = T.T_province_code
+	T_.T_city_code = T.T_city_code
+	T_.T_district_code = T.T_district_code
+	T_.T_area_code = []string{T.T_province_code, T.T_city_code, T.T_district_code}
+	T_.T_category = T.T_category
+	T_.T_reason = T.T_reason
+
+	T_.T_state = T.T_state
+	T_.T_status = T.T_status
+	T_.T_attachment = lib.SplitStringSeparator(T.T_attachment, "|")
+	T_.T_confirm_form = lib.SplitStringSeparator(T.T_confirm_form, "|")
+	T_.T_submit_time = T.T_submit_time
+	json.Unmarshal([]byte(T.T_record), &T_.T_record)
+	for i, record := range T_.T_record {
+		T_.T_record[i].T_collection_name = adminMap[record.T_collection]
+	}
+
+	if !T.T_allot_time.IsZero() {
+		T_.T_allot_time = T.T_allot_time.Format("2006-01-02 15:04")
+	}
+	if !T.CreateTime.IsZero() {
+		T_.CreateTime = T.CreateTime.Format("2006-01-02 15:04:05")
+	}
+	if !T.UpdateTime.IsZero() {
+		T_.UpdateTime = T.UpdateTime.Format("2006-01-02 15:04:05")
+	}
+	return T_
+}
+
+var redisCache_AllotTask cache.Cache
+
+func (t *AllotTask) TableName() string {
+	return "allot_task" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+func init() {
+
+	//注册模型
+	orm.RegisterModel(new(AllotTask))
+
+	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
+		"redis_"+"AllotTask", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
+	logs.Println(config)
+	var err error
+	redisCache_AllotTask, err = cache.NewCache("redis", config)
+	if err != nil || redisCache_AllotTask == nil {
+		errMsg := "failed to init redis"
+		logs.Println(errMsg, err)
+	}
+}
+
+func Redis_AllotTask_Set(key string, r AllotTask) (err error) {
+	//json序列化
+	str, err := json.Marshal(r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	err = redisCache_AllotTask.Put(key, str, 24*time.Hour)
+	if err != nil {
+		logs.Println("set key:", key, ",value:", str, err)
+	}
+	return
+}
+func Redis_AllotTask_Get(key string) (r AllotTask, is bool) {
+	if redisCache_AllotTask.IsExist(key) {
+		logs.Println("找到key:", key)
+		v := redisCache_AllotTask.Get(key)
+		json.Unmarshal(v.([]byte), &r)
+		return r, true
+	}
+	logs.Println("没有 找到key:", key)
+	return AllotTask{}, false
+}
+func Redis_AllotTask_DelK(key string) (err error) {
+	err = redisCache_AllotTask.Delete(key)
+	return
+}
+
+// 添加
+func Add_AllotTask(r AllotTask) (string, bool) {
+	o := orm.NewOrm()
+
+	// 生成编号
+	rand_x := 0
+	for true {
+		r.T_allot_task_id = lib.GetRandstring(12, "abcdefghijklmnopqrstuvwxyz0123456789", int64(rand_x)) // 1,336,336
+		err := o.Read(&r, "T_allot_task_id")                                                             // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
+		if err != nil {
+			break
+		}
+		rand_x += 1
+	}
+
+	_, err := o.Insert(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return "", false
+	}
+	Redis_AllotTask_Set(r.T_allot_task_id, r)
+	return r.T_allot_task_id, true
+}
+
+func Update_AllotTask(m AllotTask, cols ...string) bool {
+	o := orm.NewOrm()
+	if num, err := o.Update(&m, cols...); err == nil {
+		logs.Println("Number of records updated in database:", num)
+		Redis_AllotTask_Set(m.T_allot_task_id, m)
+		return true
+	} else {
+		logs.Error(lib.FuncName(), err)
+	}
+	return false
+}
+
+// 删除
+func Delete_AllotTask(v AllotTask) bool {
+	o := orm.NewOrm()
+	v.T_state = 0
+	if num, err := o.Update(&v, "T_state"); err == nil {
+		logs.Println("Number of records updated in database:", num)
+	} else {
+		logs.Error(lib.FuncName(), err)
+		return false
+	}
+
+	Redis_AllotTask_DelK(v.T_allot_task_id)
+	return true
+}
+
+// 获取 By
+func Read_AllotTask(T_allot_task_id string) (r AllotTask, is bool) {
+	if r, is = Redis_AllotTask_Get(T_allot_task_id); is == true {
+		return r, true
+	}
+
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(AllotTask))
+	//err := qs.Filter("T_allot_task_id", T_allot_task_id).Filter("T_State", 1).One(&r)
+	err := qs.Filter("T_allot_task_id", T_allot_task_id).Filter("T_state", 1).One(&r)
+	if err != nil {
+		return r, false
+	}
+
+	Redis_AllotTask_Set(T_allot_task_id, r)
+	return r, true
+}
+
+// 获取任务列表
+func Read_AllotTask_List(T_Distributor_id, T_admin, T_uuid, T_name, T_project, T_scheme, T_collection, T_reporting, T_delivery string, T_status int,
+	T_company_list []string, userMap, adminMap map[string]string, page int, page_z int) ([]AllotTask_, int) {
+
+	o := orm.NewOrm()
+
+	qs := o.QueryTable(new(AllotTask))
+	var r []AllotTask
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_state", 1)
+	if len(T_name) > 0 {
+		cond1 = cond1.And("T_name__icontains", T_name)
+	}
+	if len(T_Distributor_id) > 0 {
+		cond1 = cond1.And("T_Distributor_id", T_Distributor_id)
+	}
+	if len(T_uuid) > 0 {
+		cond1 = cond1.And("T_uuid", T_uuid)
+	}
+	if len(T_admin) > 0 {
+		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 T_status > 0 {
+		cond1 = cond1.And("T_status", T_status)
+	}
+
+	if len(T_company_list) > 0 {
+		cond1 = cond1.And("T_uuid__in", T_company_list)
+	}
+
+	if len(T_project) > 0 {
+		cond1 = cond1.And("T_project", T_project)
+	}
+	if len(T_scheme) > 0 {
+		cond1 = cond1.And("T_scheme", T_scheme)
+	}
+	if len(T_collection) > 0 {
+		cond1 = cond1.And("T_collection", T_collection)
+	}
+	if len(T_reporting) > 0 {
+		cond1 = cond1.And("T_reporting", T_reporting)
+	}
+	if len(T_delivery) > 0 {
+		cond1 = cond1.And("T_delivery", T_delivery)
+	}
+
+	if page_z == 9999 {
+		qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
+	} else {
+		qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
+	}
+	cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	// 转换
+	var AllotTaskList []AllotTask_
+	for _, v := range r {
+		AllotTaskList = append(AllotTaskList, AllotTaskToAllotTask_(v, userMap, adminMap))
+	}
+
+	return AllotTaskList, int(cnt)
+}
+
+// 获取超时未接收的任务列表 (超过24小时)
+func Read_AllotTask_Timeout_List() ([]AllotTask, error) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(AllotTask))
+	var r []AllotTask
+
+	// 计算24小时前的时间
+	timeout := time.Now().Add(-24 * time.Hour)
+
+	// 查询CreateTime超过24小时且状态为待接收的任务
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_state", 1). // 正常状态
+						And("T_status", AllotTaskStatusWaitReceive). // 待接收状态
+						And("T_allot_time__lt", timeout)             // 创建时间早于24小时前
+
+	_, err := qs.SetCond((*orm2.Condition)(cond1)).All(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return nil, err
+	}
+
+	return r, nil
+}
+
+// 更新任务为已拒绝状态并添加拒绝记录
+func Update_AllotTask_To_Refused(task AllotTask, reason string) bool {
+	o := orm.NewOrm()
+
+	// 获取现有记录
+	var existingRecords = make([]AllotTaskRecord, 0)
+	if len(task.T_record) > 0 {
+		json.Unmarshal([]byte(task.T_record), &existingRecords)
+	}
+
+	// 创建新的拒绝记录
+	newRecord := AllotTaskRecord{
+		T_collection: task.T_collection, // 系统自动拒绝
+		T_status:     AllotTaskStatusRefused,
+		T_reason:     reason,
+		T_time:       time.Now().Format("2006-01-02 15:04:05"),
+	}
+
+	existingRecords = append(existingRecords, newRecord)
+
+	// 转换为JSON字符串
+	updatedRecordsJSON, err := json.Marshal(existingRecords)
+	if err != nil {
+		logs.Error(lib.FuncName(), "JSON marshal error:", err)
+		return false
+	}
+
+	// 更新任务状态和记录
+	task.T_record = string(updatedRecordsJSON)
+	task.T_status = AllotTaskStatusRefused
+	task.T_reason = reason
+
+	if num, err := o.Update(&task, "T_record", "T_status", "T_reason"); err == nil {
+		logs.Println("Number of records updated in database:", num)
+		// 更新Redis缓存
+		Redis_AllotTask_Set(task.T_allot_task_id, task)
+		return true
+	} else {
+		logs.Error(lib.FuncName(), err)
+	}
+	return false
+}
+
+// 获取项目负责人列表
+func Get_AllotTask_UserList(T_type string) []string {
+	o := orm.NewOrm()
+	var err error
+	var pl_lists []string
+	switch T_type {
+	case "T_project":
+		_, err = o.Raw("SELECT DISTINCT t_project FROM allot_task LIMIT 0,1000").QueryRows(&pl_lists)
+	case "T_scheme":
+		_, err = o.Raw("SELECT DISTINCT t_scheme FROM allot_task LIMIT 0,1000").QueryRows(&pl_lists)
+	case "T_collection":
+		_, err = o.Raw("SELECT DISTINCT t_collection FROM allot_task LIMIT 0,1000").QueryRows(&pl_lists)
+	case "T_reporting":
+		_, err = o.Raw("SELECT DISTINCT t_reporting FROM allot_task LIMIT 0,1000").QueryRows(&pl_lists)
+
+	}
+	if err != nil {
+		logs.Error("获取项目负责人列表失败:", err)
+	}
+	return pl_lists
+}

+ 1 - 1
models/Device/DeviceClassList.go

@@ -26,7 +26,7 @@ type DeviceClassList struct {
 	T_failure_time   string `orm:"size(256);null"`     // 失效时间
 	T_pdf            string `orm:"size(256);null"`     // pdf链接
 	T_Certificate_sn string `orm:"size(256);null"`     // 证书编号
-	T_remark         string `orm:"size(1024);null"`    // 备注
+	T_remark         string `orm:"type(text);null"`    // 备注
 
 	T_State    int       `orm:"size(2);default(1)"`                                    // 0 删除   1 正常
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间

+ 12 - 2
models/InfoCollection/InfoCollection.go

@@ -41,6 +41,7 @@ type AuditRecord struct {
 // 模版
 type InfoCollection struct {
 	Id                   int     `orm:"column(ID);size(11);auto;pk"`
+	T_allot_task_id      string  `orm:"size(256);null"`     // 采集任务ID
 	T_InfoCollection_id  string  `orm:"size(256);null"`     // 信息采集ID
 	T_uuid               string  `orm:"size(256);null"`     // 公司 UUID
 	T_name               string  `orm:"size(256);null"`     // 标题
@@ -62,6 +63,7 @@ type InfoCollection struct {
 
 type InfoCollection_R struct {
 	Id                        int
+	T_allot_task_id           string  // 采集任务ID
 	T_InfoCollection_id       string  // 信息采集ID
 	T_uuid                    string  // 用户 UUID
 	T_uuid_name               string  // 用户姓名
@@ -109,6 +111,7 @@ func init() {
 // -------------------------------------------------------------
 func InfoCollectionToInfoCollection_R(T InfoCollection, userMap, adminMap, infoTemplateMap, infoTemplateClassMap map[string]string) (T_r InfoCollection_R) {
 	T_r.Id = T.Id
+	T_r.T_allot_task_id = T.T_allot_task_id
 	T_r.T_InfoCollection_id = T.T_InfoCollection_id
 	T_r.T_uuid = T.T_uuid
 	T_r.T_name = T.T_name
@@ -264,7 +267,7 @@ func Update_InfoCollection(m InfoCollection, cols ...string) bool {
 }
 
 // 获取用户信息采集列表
-func Read_UserInfoCollection_List(T_admin string, T_name string, T_status int, userMap, adminMap, infoTemplateMap, infoTemplateClassMap map[string]string, page int, page_z int) ([]InfoCollection_R, int) {
+func Read_UserInfoCollection_List(T_allot_task_id, T_admin string, T_name string, T_status int, userMap, adminMap, infoTemplateMap, infoTemplateClassMap map[string]string, page int, page_z int) ([]InfoCollection_R, int) {
 
 	o := orm.NewOrm()
 
@@ -279,6 +282,10 @@ func Read_UserInfoCollection_List(T_admin string, T_name string, T_status int, u
 	cond := orm.NewCondition()
 	cond1 := cond.And("T_name__icontains", T_name).And("T_State", 1).And("T_submit_uuid", T_admin)
 
+	if len(T_allot_task_id) > 0 {
+		cond1 = cond1.And("T_allot_task_id", T_allot_task_id)
+	}
+
 	if T_status > 0 {
 		cond1 = cond1.And("T_status", T_status)
 	}
@@ -300,7 +307,7 @@ func Read_UserInfoCollection_List(T_admin string, T_name string, T_status int, u
 }
 
 // 获取信息采集列表
-func Read_InfoCollection_List(T_uuid, T_name string, T_status int, userMap, adminMap, infoTemplateMap, infoTemplateClassMap map[string]string, page int, page_z int) ([]InfoCollection_R, int) {
+func Read_InfoCollection_List(T_uuid, T_allot_task_id, T_name string, T_status int, userMap, adminMap, infoTemplateMap, infoTemplateClassMap map[string]string, page int, page_z int) ([]InfoCollection_R, int) {
 
 	o := orm.NewOrm()
 
@@ -318,6 +325,9 @@ func Read_InfoCollection_List(T_uuid, T_name string, T_status int, userMap, admi
 	if len(T_uuid) > 0 {
 		cond1 = cond1.And("T_uuid", T_uuid)
 	}
+	if len(T_allot_task_id) > 0 {
+		cond1 = cond1.And("T_allot_task_id", T_allot_task_id)
+	}
 
 	if T_status > 0 {
 		cond1 = cond1.And("T_status", T_status)

+ 44 - 35
models/Task/Task.go

@@ -12,7 +12,6 @@ import (
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
-	"log"
 	"strconv"
 	"strings"
 	"time"
@@ -47,7 +46,7 @@ var (
 		TaskCollectionStateFinish:     "已完成",
 		TaskCollectionStateInProgress: "处理中",
 		TaskCollectionStateNoData:     "已采集-无数据",
-		TaskCollectionStateSubmitted:  "数据编辑已完成",
+		TaskCollectionStateSubmitted:  "APP已提交",
 		TaskCollectionStatePass:       "已通过",
 		TaskCollectionStateReturn:     "已退回",
 	}
@@ -67,19 +66,21 @@ var (
 		TaskReportingStateReturn:       "已退回",
 	}
 
-	TaskExaminingReportStateWaitSubmit   = 0 // 待提交
-	TaskExaminingReportStateSubmitted    = 5 // 已提交
-	TaskExaminingReportStateClientPass   = 1 // 已通过(客户)
-	TaskExaminingReportStateClientReturn = 2 // 已退回(客户)
-	TaskExaminingReportStatePass         = 3 // 已通过
-	TaskExaminingReportStateReturn       = 4 // 已退回
-	TaskExaminingReportStateMap          = map[int]string{
-		TaskExaminingReportStateWaitSubmit:   "待提交",
-		TaskExaminingReportStateSubmitted:    "已提交",
-		TaskExaminingReportStateClientPass:   "已通过(客户)",
-		TaskExaminingReportStateClientReturn: "已驳回(客户)",
-		TaskExaminingReportStatePass:         "已通过",
-		TaskExaminingReportStateReturn:       "已退回",
+	TaskExaminingReportStateWaitSubmit    = 0 // 待提交
+	TaskExaminingReportStateSubmitted     = 5 // 已提交
+	TaskExaminingReportStateClientPass    = 1 // 已通过(客户)
+	TaskExaminingReportStateClientReturn  = 2 // 已退回(客户)
+	TaskExaminingReportStatePass          = 3 // 已通过
+	TaskExaminingReportStateReturn        = 4 // 已退回
+	TaskExaminingReportStateClickGenerate = 6 // 已退回
+	TaskExaminingReportStateMap           = map[int]string{
+		TaskExaminingReportStateWaitSubmit:    "待提交",
+		TaskExaminingReportStateSubmitted:     "已提交",
+		TaskExaminingReportStateClientPass:    "已通过(客户)",
+		TaskExaminingReportStateClientReturn:  "已驳回(客户)",
+		TaskExaminingReportStatePass:          "已通过",
+		TaskExaminingReportStateReturn:        "已退回",
+		TaskExaminingReportStateClickGenerate: "已点击报告生成",
 	}
 
 	TaskOriginalRecordStateWaitSubmit = 0 // 待提交
@@ -179,8 +180,8 @@ type Task struct {
 	T_reporting              string `orm:"size(256);null"`     // 报告编写 负责人UUID
 	T_delivery               string `orm:"size(256);null"`     // 交付审核 负责人UUID
 	T_scheme_state           int    `orm:"size(2);default(0)"` // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
-	T_collection_state       int    `orm:"size(2);default(0)"` // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4-数据编辑已完成(已提交) 5已通过(负责人) 6已退回(负责人)
-	T_reporting_state        int    `orm:"size(2);default(0)"` // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
+	T_collection_state       int    `orm:"size(2);default(0)"` // 数据采集 状态 0 未完成 1 数据来源已完成 2 处理中 3 已采集-无数据 4 APP已提交 5已通过(负责人) 6已退回(负责人)
+	T_reporting_state        int    `orm:"size(2);default(0)"` // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交 6已点报告生成
 	T_delivery_state         int    `orm:"size(2);default(0)"` // 交付审核 状态 0 未完成 1 已完成 2 处理中
 	T_marking_state          int    `orm:"size(2);default(0)"` // 验证标识 状态 0 未完成 1 已完成
 	T_examining_report_state int    `orm:"size(2);default(0)"` // 检测报告 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
@@ -188,7 +189,7 @@ type Task struct {
 	T_record                 string `orm:"type(text)"`         // 领导备注
 
 	T_VerifyDeviceDataStartTime string `orm:"size(256);null"` // 验证设备数据开始时间
-	T_VerifyDeviceDataEndTime   string `orm:"size(256);null"` // 验证设备数据开始时间
+	T_VerifyDeviceDataEndTime   string `orm:"size(256);null"` // 验证设备数据结束时间
 	T_BindDeviceDataStartTime   string `orm:"size(256);null"` // 绑定设备数据开始时间
 	T_BindDeviceDataEndTime     string `orm:"size(256);null"` // 绑定设备数据结束时间
 
@@ -317,17 +318,19 @@ type Task_ struct {
 	T_examining_report_state int    // 检测报告 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
 	T_original_record_state  int    // 原始记录 状态 0 未完成 3 已通过(负责人) 4已退回(负责人) 5已提交
 
-	T_scheme_state_str           string    // 实施方案 状态 字符串
-	T_collection_state_str       string    // 数据采集 状态 字符串
-	T_reporting_state_str        string    // 报告编写 状态 字符串
-	T_delivery_state_str         string    // 交付审核 状态 字符串
-	T_marking_state_str          string    // 验证标识 状态 字符串
-	T_examining_report_state_str string    // 检测报告 状态 字符串
-	T_original_record_state_str  string    // 原始记录 状态 字符串
-	T_scheme_name                string    // 实施方案 负责人姓名
-	T_collection_name            string    // 数据采集 负责人姓名
-	T_reporting_name             string    // 报告编写 负责人姓名
-	T_delivery_name              string    // 交付审核 负责人姓名
+	T_scheme_state_str           string // 实施方案 状态 字符串
+	T_collection_state_str       string // 数据采集 状态 字符串
+	T_reporting_state_str        string // 报告编写 状态 字符串
+	T_delivery_state_str         string // 交付审核 状态 字符串
+	T_marking_state_str          string // 验证标识 状态 字符串
+	T_examining_report_state_str string // 检测报告 状态 字符串
+	T_original_record_state_str  string // 原始记录 状态 字符串
+	T_scheme_name                string // 实施方案 负责人姓名
+	T_collection_name            string // 数据采集 负责人姓名
+	T_reporting_name             string // 报告编写 负责人姓名
+	T_delivery_name              string // 交付审核 负责人姓名
+	T_VerifyDeviceDataStartTime  string
+	T_VerifyDeviceDataEndTime    string
 	T_VerifyDeviceDataTime       [2]string // 验证设备数据开始-结束时间
 	T_BindDeviceDataTime         [2]string // 绑定设备数据开始-结束时间
 	T_doc1                       string    // 封面
@@ -345,6 +348,8 @@ type Task_ struct {
 	T_sn                        string // sn
 	T_CalibrationExpirationTime string // 校准到期时间
 
+	T_project       string                        // 项目 负责人UUID
+	T_project_name  string                        // 项目 负责人姓名
 	T_province      string                        // 省
 	T_city          string                        // 市
 	T_district      string                        // 区
@@ -524,6 +529,7 @@ func TaskToTask_(T Task, userMap, adminMap map[string]string) (T_ Task_) {
 	T_.T_collection = T.T_collection
 	T_.T_reporting = T.T_reporting
 	T_.T_delivery = T.T_delivery
+	T_.T_project = T.T_project
 	T_.T_scheme_state = T.T_scheme_state
 	T_.T_collection_state = T.T_collection_state
 	T_.T_reporting_state = T.T_reporting_state
@@ -540,6 +546,9 @@ func TaskToTask_(T Task, userMap, adminMap map[string]string) (T_ Task_) {
 	T_.T_collection_name = adminMap[T.T_collection]
 	T_.T_reporting_name = adminMap[T.T_reporting]
 	T_.T_delivery_name = adminMap[T.T_delivery]
+	T_.T_project_name = adminMap[T.T_project]
+	T_.T_VerifyDeviceDataStartTime = T.T_VerifyDeviceDataStartTime
+	T_.T_VerifyDeviceDataEndTime = T.T_VerifyDeviceDataEndTime
 	T_.T_VerifyDeviceDataTime = [2]string{T.T_VerifyDeviceDataStartTime, T.T_VerifyDeviceDataEndTime}
 	T_.T_BindDeviceDataTime = [2]string{T.T_BindDeviceDataStartTime, T.T_BindDeviceDataEndTime}
 	T_.T_doc1 = T.T_doc1
@@ -1232,7 +1241,7 @@ func Read_UserTask_StatisticalRanking(T_uuid, T_scheme string) []Task {
 }
 
 // 获取任务列表
-func Read_Task_List_For_ERP(T_reporting_pass_time string) ([]Task_, int) {
+func Read_Task_List_For_ERP(start_time, end_time string) ([]Task_, int) {
 
 	o := orm.NewOrm()
 
@@ -1241,11 +1250,11 @@ func Read_Task_List_For_ERP(T_reporting_pass_time string) ([]Task_, int) {
 
 	cond := orm.NewCondition()
 	cond1 := cond.And("T_State", 1).And("T_reporting_state", TaskReportingStatePass)
-	if len(T_reporting_pass_time) > 0 {
-		start := T_reporting_pass_time + " 00:00:00"
-		end := T_reporting_pass_time + " 23:59:59"
-		log.Println("CreateTime_s:", start, end)
-		cond1 = cond1.And("T_reporting_pass_time__gte", start).And("T_reporting_pass_time__lte", end)
+	if len(start_time) > 0 {
+		cond1 = cond1.And("T_reporting_pass_time__gte", start_time)
+	}
+	if len(end_time) > 0 {
+		cond1 = cond1.And("T_reporting_pass_time__lte", end_time)
 	}
 
 	qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)

+ 33 - 14
models/VerifyTemplate/VerifyTemplateMapData.go

@@ -138,34 +138,53 @@ func AddOrUpdate_VerifyTemplateMapData_ADD_History(List []VerifyTemplateMapData,
 		if len(T_task_id) == 0 {
 			T_task_id = v.T_task_id
 		}
+		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
+			}
+		}
 		// 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 {
+			// 更新验证模版数据
+			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.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))
 			}
+		}
 
+		// 前端第一次上传本地地址,第二次上传http地址,需要更新数据为http地址
+		if strings.Contains(r.T_value, "file:///") && strings.Contains(v.T_value, "https://") {
 			// 更新验证模版数据
 			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,

+ 1 - 1
routers/Account.go

@@ -28,7 +28,7 @@ func init() {
 	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("/Admin/Delivery", &controllers.AccountController{}, "*:Delivery")      // 交付审核人
 	// - 用户权限
 	beego.Router("/UserPower/List_All", &controllers.AccountController{}, "*:UserPower_List_All") // 用户权限所有列表
 

+ 22 - 0
routers/AllotTask.go

@@ -0,0 +1,22 @@
+package routers
+
+import (
+	"ColdVerify_server/controllers"
+
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	beego.Router("/AllotTask/List", &controllers.AllotTaskController{}, "*:List")                                   // 列表
+	beego.Router("/AllotTask/Get", &controllers.AllotTaskController{}, "*:Get")                                     // 获取
+	beego.Router("/AllotTask/Add", &controllers.AllotTaskController{}, "*:Add")                                     // 添加
+	beego.Router("/AllotTask/Up", &controllers.AllotTaskController{}, "*:Up")                                       // 编辑
+	beego.Router("/AllotTask/Del", &controllers.AllotTaskController{}, "*:Del")                                     // 删除
+	beego.Router("/AllotTask/Receive", &controllers.AllotTaskController{}, "*:Receive")                             // 接收
+	beego.Router("/AllotTask/Stat", &controllers.AllotTaskController{}, "*:Statistics")                             // 统计
+	beego.Router("/AllotTask/GetUserList", &controllers.AllotTaskController{}, "*:GetAllotTaskUserList")            // 获取任务负责人列表
+	beego.Router("/AllotTask/UploadConfirmForm", &controllers.AllotTaskController{}, "*:UploadConfirmForm")         // 上传信息确认表
+	beego.Router("/AllotTask/Copy", &controllers.AllotTaskController{}, "*:Copy")                                   // 复制
+	beego.Router("/AllotTask/GetByInfoCollectionId", &controllers.AllotTaskController{}, "*:GetByInfoCollectionId") // 通过信息采集ID获取指派任务
+
+}