Browse Source

update: 修改打包本地数据,更新线上数据为后台运行

zoie 2 years ago
parent
commit
257ec03d00

+ 152 - 0
Nats/Nats.go

@@ -0,0 +1,152 @@
+package Nats
+
+import (
+	"ColdVerify_server/Nats/NatsServer"
+	"ColdVerify_server/conf"
+	"ColdVerify_server/lib"
+	"ColdVerify_server/logs"
+	"ColdVerify_server/models/Device"
+	"ColdVerify_server/models/System"
+	"ColdVerify_server/models/Task"
+	"fmt"
+	"github.com/nats-io/nats.go"
+	"github.com/vmihailenco/msgpack/v5"
+	"sync"
+)
+
+func init() {
+
+	logs.Println("============Nats init============")
+	var err error
+	// 连接Nats服务器
+	lib.Nats, err = nats.Connect("nats://" + conf.NatsServer_Url)
+	if err != nil {
+		fmt.Println("nats 连接失败!")
+		panic(err)
+	}
+	logs.Println("nats OK!")
+
+	go NatsInit()
+}
+
+type Extract_TaskData_Back struct {
+	T_uuid          string                   `xml:"T_uuid"` // 任务主键id
+	Time_start      string                   `xml:"Time_start"`
+	Time_end        string                   `xml:"Time_end"`
+	DeviceClassList []Device.DeviceClassList `xml:"DeviceClassList"` // 泛型
+	Task            Task.Task                `xml:"Task"`            // 泛型
+}
+
+func NatsInit() {
+
+	// 发布-订阅 模式,打包数据
+	_, _ = lib.Nats.Subscribe("ColdVerify_Server_Extract_TaskData_Back", func(m *nats.Msg) {
+		logs.Debug("Extract_TaskData_Back message: %v\n", string(m.Data))
+
+		var resp Extract_TaskData_Back
+
+		err := msgpack.Unmarshal(m.Data, &resp)
+		if err != nil {
+			System.Add_Logs("Nats", "msgpack Unmarshal err", string(m.Data))
+			return
+		}
+
+		Task_r := resp.Task
+		// 清空表
+		Task.Truncate_TaskData(Task_r.T_task_id)
+
+		DeviceClassList := new(sync.Map)
+		for _, v := range resp.DeviceClassList {
+			DeviceClassList.Store(v.Id, v)
+		}
+
+		DeviceClassList.Range(func(k, v any) bool {
+			c := v.(Device.DeviceClassList)
+			logs.Println("DeviceClass ---- ", c.T_sn, resp.Task.T_task_id, resp.Time_start, resp.Time_end)
+			err = Task.Import_TaskData_Back(c.T_sn, c.T_id, resp.Task.T_task_id, resp.Time_start, resp.Time_end)
+			if err == nil {
+				DeviceClassList.Delete(k)
+			}
+			return true
+		})
+
+		TaskData_Num := Task.Read_TaskData_Count(Task_r.T_task_id)
+
+		if TaskData_Num == 0 {
+			Task_r.T_collection_state = 0
+			if !Task.Update_Task(Task_r, "T_collection_state") {
+				logs.Error(lib.FuncName(), "后台执行修改任务数据失败")
+			}
+			return
+		}
+
+		// 导入到本地数据
+		NatsServer.Import_TaskData(resp.T_uuid, Task_r.T_task_id, TaskData_Num)
+
+		System.Add_UserLogs_T(resp.T_uuid, "任务", "修改", Task_r)
+
+		System.Add_UserLogs(resp.T_uuid, "提取数据", "提取数据"+Task_r.T_name, Task_r.T_task_id+"|"+resp.Time_start+"|"+resp.Time_end)
+
+	})
+
+	_, _ = lib.Nats.Subscribe("ColdVerify_Server_Update_Task", func(m *nats.Msg) {
+
+		var t_Req Task.Task
+		var t_R lib.JSONS
+		err := msgpack.Unmarshal(m.Data, &t_Req)
+		if err != nil {
+			logs.Error("Mats", lib.FuncName(), err)
+			t_R.Code = 202
+			t_R.Msg = err.Error()
+			b, _ := msgpack.Marshal(&t_R)
+			_ = lib.Nats.Publish(m.Reply, b)
+			return
+		}
+		fmt.Printf("ColdVerify_Server_Update_Task message: %+v\n", t_Req)
+
+		col := []string{}
+		if t_Req.T_delivery_state > 0 {
+			col = append(col, "T_delivery_state")
+		}
+
+		if !Task.Update_Task(t_Req, "T_collection_state", "T_delivery_state") {
+			logs.Error("Mats", lib.FuncName(), err)
+			t_R.Code = 202
+			t_R.Msg = err.Error()
+			b, _ := msgpack.Marshal(&t_R)
+			_ = lib.Nats.Publish(m.Reply, b)
+			return
+		}
+
+		t_R.Code = 200
+		t_R.Msg = "ok"
+
+		b, _ := msgpack.Marshal(&t_R)
+		_ = lib.Nats.Publish(m.Reply, b)
+
+	})
+
+	_, _ = lib.Nats.Subscribe("ColdVerify_Server_Read_Task", func(m *nats.Msg) {
+		fmt.Printf("ColdVerify_Server_Read_Task message: %+v\n", string(m.Data))
+
+		var t_R lib.JSONS
+		task, is := Task.Read_Task(string(m.Data))
+		if !is {
+			logs.Error("Mats", lib.FuncName())
+			t_R.Code = 202
+			t_R.Msg = "查询失败"
+			b, _ := msgpack.Marshal(&t_R)
+			_ = lib.Nats.Publish(m.Reply, b)
+			return
+		}
+
+		t_R.Code = 200
+		t_R.Msg = "ok"
+		t_R.Data = task
+
+		b, _ := msgpack.Marshal(&t_R)
+		_ = lib.Nats.Publish(m.Reply, b)
+
+	})
+
+}

+ 32 - 0
Nats/NatsServer/NatsLocal.go

@@ -0,0 +1,32 @@
+package NatsServer
+
+import (
+	"ColdVerify_server/lib"
+	"ColdVerify_server/logs"
+	"github.com/vmihailenco/msgpack/v5"
+)
+
+func Import_TaskData(T_uuid, T_task_id string, TaskData_Num int) {
+	logs.Println("Nats =>", lib.FuncName(), T_uuid, T_uuid)
+
+	type T_R struct {
+		T_uuid       string `xml:"T_uuid"`
+		T_task_id    string `xml:"T_task_id"`
+		TaskData_Num int    `xml:"TaskData_Num"`
+	}
+	t_r := T_R{
+		T_uuid:       T_uuid,
+		T_task_id:    T_task_id,
+		TaskData_Num: TaskData_Num,
+	}
+
+	b, err := msgpack.Marshal(&t_r)
+	if err != nil {
+		logs.Error("Nats =>", "msgpack Marshal err", err)
+	}
+
+	err = lib.Nats.Publish("ColdVerify_Local_Import_TaskData", b)
+	if err != nil {
+		logs.Error("Nats =>", lib.FuncName(), err)
+	}
+}

+ 2 - 3
conf/app.conf

@@ -5,9 +5,8 @@ Graceful = true
 EnableDocs = true
 copyrequestbody = true
 
-
-
-
+# Nats
+NatsServer_Url = "127.0.0.1:43422"
 
 # Mysql
 # MysqlServer_UrlPort = "47.111.15.17:3306"

+ 3 - 2
conf/config.go

@@ -4,6 +4,9 @@ import (
 	beego "github.com/beego/beego/v2/server/web"
 )
 
+// Nats
+var NatsServer_Url, _ = beego.AppConfig.String("NatsServer_Url")
+
 var HTTPPort, _ = beego.AppConfig.String("HTTPPort")
 var AppName, _ = beego.AppConfig.String("appname")
 var RunMode, _ = beego.AppConfig.String("runmode")
@@ -23,7 +26,6 @@ var Redis_address, _ = beego.AppConfig.String("Redis_address")
 var Redis_password, _ = beego.AppConfig.String("Redis_password")
 var Redis_dbNum, _ = beego.AppConfig.String("Redis_dbNum")
 
-
 // Qiniu
 var Qiniu_AccessKey, _ = beego.AppConfig.String("Qiniu_AccessKey")
 var Qiniu_SecretKey, _ = beego.AppConfig.String("Qiniu_SecretKey")
@@ -31,4 +33,3 @@ var Qiniu_BUCKET, _ = beego.AppConfig.String("Qiniu_BUCKET")
 var OssQiniu = "https://bzdcoldverifyoss.baozhida.cn"
 var Oss, _ = beego.AppConfig.String("Oss")
 var Oss_file, _ = beego.AppConfig.String("Oss_file")
-

+ 52 - 2
controllers/TaskData.go

@@ -1,6 +1,7 @@
 package controllers
 
 import (
+	"ColdVerify_server/Nats"
 	"ColdVerify_server/conf"
 	"ColdVerify_server/lib"
 	"ColdVerify_server/logs"
@@ -11,6 +12,7 @@ import (
 	"fmt"
 	beego "github.com/beego/beego/v2/server/web"
 	"github.com/signintech/gopdf"
+	"github.com/vmihailenco/msgpack/v5"
 	"github.com/xuri/excelize/v2"
 	"math"
 	"os"
@@ -34,7 +36,6 @@ func (c *TaskDataController) Extract_TaskData() {
 	}
 	Time_start := c.GetString("Time_start")
 	Time_end := c.GetString("Time_end")
-
 	T_task_id := c.GetString("T_task_id")
 	Task_r, is := Task.Read_Task(T_task_id)
 	if !is {
@@ -61,7 +62,6 @@ func (c *TaskDataController) Extract_TaskData() {
 
 	// 提取数据后 将 当前任务 数据采集 标志 为 1
 	Task_r.T_collection_state = 1
-	Task.Update_Task(Task_r, "T_collection_state")
 	if !Task.Update_Task(Task_r, "T_collection_state") {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
 		c.ServeJSON()
@@ -76,6 +76,56 @@ func (c *TaskDataController) Extract_TaskData() {
 	return
 }
 
+// 后台导出数据
+func (c *TaskDataController) Extract_TaskData_Back() {
+	// 验证登录 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
+	}
+	Time_start := c.GetString("Time_start")
+	Time_end := c.GetString("Time_end")
+	T_task_id := c.GetString("T_task_id")
+
+	Task_r, is := Task.Read_Task(T_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_task_id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	DeviceClass_List := Device.Read_DeviceClassList_List_id(Task_r.T_class)
+	if len(DeviceClass_List) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_Class_id 分类设备列表 为空!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 采集中
+	Task_r.T_collection_state = 2
+	if !Task.Update_Task(Task_r, "T_collection_state") {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "导出数据失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	data := Nats.Extract_TaskData_Back{
+		T_uuid:          user_r.T_uuid,
+		Time_start:      Time_start,
+		Time_end:        Time_end,
+		DeviceClassList: DeviceClass_List,
+		Task:            Task_r,
+	}
+	b, _ := msgpack.Marshal(&data)
+	_ = lib.Nats.Publish("ColdVerify_Server_Extract_TaskData_Back", b)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
 // 列表 -
 func (c *TaskDataController) TaskData_List() {
 	// 验证登录 User_is, User_r

+ 5 - 0
go.mod

@@ -21,6 +21,9 @@ require (
 	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
+	github.com/nats-io/nats.go v1.24.0 // indirect
+	github.com/nats-io/nkeys v0.3.0 // indirect
+	github.com/nats-io/nuid v1.0.1 // indirect
 	github.com/phpdave11/gofpdi v1.0.11 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/prometheus/client_golang v1.14.0 // indirect
@@ -30,6 +33,8 @@ require (
 	github.com/richardlehane/mscfb v1.0.4 // indirect
 	github.com/richardlehane/msoleps v1.0.3 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
+	github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
+	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
 	github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
 	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
 	golang.org/x/crypto v0.5.0 // indirect

+ 11 - 0
go.sum

@@ -207,6 +207,12 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nats-io/nats.go v1.24.0 h1:CRiD8L5GOQu/DcfkmgBcTTIQORMwizF+rPk6T0RaHVQ=
+github.com/nats-io/nats.go v1.24.0/go.mod h1:dVQF+BK3SzUZpwyzHedXsvH3EO38aVKuOPkkHlv5hXA=
+github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8=
+github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4=
+github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
@@ -290,6 +296,10 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
 github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
+github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=
+github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
+github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
+github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
 github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
@@ -313,6 +323,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=

+ 3 - 0
lib/lib.go

@@ -3,6 +3,7 @@ package lib
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/nats-io/nats.go"
 	"github.com/signintech/gopdf"
 	"math/rand"
 	"os"
@@ -13,6 +14,8 @@ import (
 	"time"
 )
 
+var Nats *nats.Conn
+
 type JSONS struct {
 	//必须的大写开头
 	Code int16

+ 53 - 0
models/Device/DeviceData.go

@@ -221,6 +221,59 @@ func Read_DeviceSensorData_ById_List(SN string, T_id int, Time_start_ string, Ti
 	return maps, key
 }
 
+func Read_DeviceData_By_snid(SN string, T_id int, Time_start_ string, Time_end_ string, offset, limit int) ([]DeviceData_, int) {
+	o := orm.NewOrm()
+	var maps []DeviceData_
+
+	sql_time := ""
+
+	if len(Time_start_) > 1 {
+		sql_time += " t_time >= '" + Time_start_ + "' AND "
+	}
+
+	if len(Time_end_) > 1 {
+		sql_time += " t_time <= '" + Time_end_ + "' AND "
+	}
+
+	sql := "SELECT t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%c-%d %H:%i:%s') AS t_time  FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id) + " ORDER BY t_time DESC "
+	sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(limit)
+	fmt.Println(sql)
+	_, err := o.Raw(sql).QueryRows(&maps)
+	if err != nil {
+		logs.Println(lib.FuncName(), err)
+		return maps, 0
+	}
+
+	return maps, 0
+}
+
+func Read_DeviceData_Count_By_snid(SN string, T_id int, Time_start_ string, Time_end_ string) int {
+	o := orm.NewOrm()
+	var maps_z []orm2.ParamsList
+
+	sql_time := ""
+
+	if len(Time_start_) > 1 {
+		sql_time += " t_time >= '" + Time_start_ + "' AND "
+	}
+
+	if len(Time_end_) > 1 {
+		sql_time += " t_time <= '" + Time_end_ + "' AND "
+	}
+
+	sql := "SELECT COUNT(ID) FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id)
+	fmt.Println(sql)
+	_, err := o.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		return 0
+	}
+	if len(maps_z) == 0 {
+		return 0
+	}
+	key, _ := strconv.Atoi(maps_z[0][0].(string))
+	return key
+}
+
 func Read_DeviceSensorData_List(SN string, Time_start_ string, Time_end_ string, page int, page_z int) ([]DeviceData_, int) {
 	o := orm.NewOrm()
 	var maps []DeviceData_

+ 3 - 3
models/Task/Task.go

@@ -27,9 +27,9 @@ 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 已完成
-	T_collection_state  int    `orm:"size(2);default(0)"`   // 数据采集 状态 0 未完成 1 已完成
+	T_collection_state  int    `orm:"size(2);default(0)"`   // 数据采集 状态 0 未完成 1 已完成 2 处理中
 	T_reporting_state   int    `orm:"size(2);default(0)"`   // 报告编写 状态 0 未完成 1 已完成
-	T_delivery_state    int    `orm:"size(2);default(0)"`   // 交付审核 状态 0 未完成 1 已完成
+	T_delivery_state    int    `orm:"size(2);default(0)"`   // 交付审核 状态 0 未完成 1 已完成 2 处理中
 
 	T_doc1 string `orm:"type(text);null"` // 封面
 	T_pdf1 string `orm:"type(text);null"` // 封面
@@ -309,7 +309,7 @@ func Update_Task(m Task, cols ...string) bool {
 func Add_Task_Visit(m Task) bool {
 	o := orm.NewOrm()
 	m.T_Visit += 1
-	if num, err := o.Update(&m); err == nil {
+	if num, err := o.Update(&m, "T_Visit"); err == nil {
 		fmt.Println("Number of records updated in database:", num)
 		Redis_Task_Set(m.T_task_id, m)
 		return true

+ 56 - 2
models/Task/TaskData.go

@@ -9,6 +9,7 @@ import (
 	orm2 "github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -47,11 +48,16 @@ func CREATE_TaskData(T_task_id string) bool {
 		"	`t_rh` float(6, 1) NULL DEFAULT NULL," +
 		"	`t_time` datetime(0) NULL DEFAULT NULL," +
 		"	PRIMARY KEY (`ID`) USING BTREE" +
+		"   KEY `t_sn` (`t_sn`)," +
+		"   KEY `t_id` (`t_id`)" +
+		"   KEY `t_time` (`t_time`)" +
 		") ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;"
+
 	_, err := o.Raw(sql).Exec()
 	if err != nil {
 		return false
 	}
+
 	return true
 }
 
@@ -112,6 +118,50 @@ func Import_TaskData(Sn string, T_id int, T_task_id string, Time_start string, T
 	return true
 }
 
+func Import_TaskData_Back(Sn string, T_id int, T_task_id string, Time_start string, Time_end string) error {
+	o := orm.NewOrm()
+	// 开始插入数据
+	sql := "insert into z_task_data_" + T_task_id + "(t_id,t_t,t_rh,t_time) select t_id,t_t,t_rh,t_time from z_device_data_" + Sn
+	sql = sql + " WHERE t_time >= '" + Time_start + "' AND t_time <= '" + Time_end + "'"
+	logs.Println(sql)
+	_, err := o.Raw(sql).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+	// 强行替换  ID
+	sql = "UPDATE z_task_data_" + T_task_id + " SET `t_sn` = '" + Sn + "',`t_id` = " + strconv.Itoa(T_id) + " WHERE `t_sn` IS NULL"
+	logs.Println(sql)
+	_, err = o.Raw(sql).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+
+	return nil
+}
+
+func Read_TaskData_Count(T_task_id string) int {
+
+	var maps_z []orm2.ParamsList
+
+	o := orm.NewOrm()
+
+	sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id
+
+	fmt.Println(sql)
+	_, err := o.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return 0
+	}
+	if len(maps_z) == 0 {
+		return 0
+	}
+	key, _ := strconv.Atoi(maps_z[0][0].(string))
+	return key
+}
+
 type TaskData_ struct {
 	ID     int     `orm:"column(ID);size(100);null"`   // ID
 	T_sn   string  `orm:"column(t_sn);size(256);null"` // 标题
@@ -155,7 +205,11 @@ func Read_TaskData_ById_List(T_task_id string, SN string, T_id int, Time_start_
 		sql_condition += " AND t_sn = '" + SN + "'"
 	}
 
-	sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id + " WHERE 1=1" + sql_condition
+	if len(sql_condition) > 0 {
+		sql_condition = " WHERE " + strings.TrimLeft(sql_condition, " AND ")
+	}
+
+	sql := "SELECT COUNT(ID) FROM z_task_data_" + T_task_id + sql_condition
 
 	fmt.Println(sql)
 	_, err := o.Raw(sql).ValuesList(&maps_z)
@@ -168,7 +222,7 @@ func Read_TaskData_ById_List(T_task_id string, SN string, T_id int, Time_start_
 	}
 
 	//fmt.Println("maps_z;",maps_z[0][0])
-	sql = "SELECT ID,t_sn,t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%c-%d %H:%i:%s') AS t_times,t_time FROM z_task_data_" + T_task_id + " WHERE 1=1" + sql_condition + " ORDER BY t_time DESC "
+	sql = "SELECT ID,t_sn,t_id,t_t,t_rh,DATE_FORMAT(t_time,'%Y-%c-%d %H:%i:%s') AS t_times,t_time FROM z_task_data_" + T_task_id + sql_condition + " ORDER BY t_time DESC "
 	if page_z != 9999 {
 		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(pagez)
 	}

+ 4 - 1
models/VerifyTemplate/VerifyTemplateMap.go

@@ -195,7 +195,10 @@ func Read_VerifyTemplateMap_List_For_Data(T_VerifyTemplate_id string, T_source i
 	// 也可以直接使用 Model 结构体作为表名
 	var r []VerifyTemplateMap
 	qs := o.QueryTable(new(VerifyTemplateMap))
-	source := []int{0, T_source}
+	source := []int{T_source}
+	if T_source != 3 {
+		source = append(source, 0)
+	}
 	cond := orm.NewCondition()
 	cond1 := cond.And("T_source__in", source).And("T_VerifyTemplate_id", T_VerifyTemplate_id) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
 

+ 2 - 1
routers/Task.go

@@ -19,7 +19,8 @@ func init() {
 	beego.Router("/TaskLogs/List", &controllers.TaskController{}, "*:Logs_List")
 
 	// 提取数据
-	beego.Router("/TaskData/Extract_TaskData", &controllers.TaskDataController{}, "*:Extract_TaskData")
+	beego.Router("/TaskData/Extract_TaskData", &controllers.TaskDataController{}, "*:Extract_TaskData_Back")
+	//beego.Router("/TaskData/Extract_TaskData_Back", &controllers.TaskDataController{}, "*:Extract_TaskData_Back")
 	beego.Router("/TaskData/TaskDataClass_List", &controllers.TaskDataController{}, "*:TaskDataClass_List") // 任务数据分类列表
 	beego.Router("/TaskData/List", &controllers.TaskDataController{}, "*:TaskData_List")                    // 任务数据列表
 	beego.Router("/TaskData/Add", &controllers.TaskDataController{}, "*:TaskData_Add")                      // 添加任务数据