Browse Source

UPDATE:更新校准证书与布局编号逻辑

zoie 9 tháng trước cách đây
mục cha
commit
ece527b20a

+ 24 - 0
Nats/Nats.go

@@ -167,4 +167,28 @@ func NatsInit() {
 
 	})
 
+	_, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Device_Class_List", "Device_Class_List", func(m *nats.Msg) {
+		logs.Println("ColdVerify_Server_Device_Class_List 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
+		}
+		List, _ := Device.Read_DeviceClassList_OrderList(task.T_class, "", "", 0, 9999)
+
+		t_R.Code = 200
+		t_R.Msg = "ok"
+		t_R.Data = List
+
+		b, _ := msgpack.Marshal(&t_R)
+		_ = lib.Nats.Publish(m.Reply, b)
+
+	})
+
 }

+ 32 - 19
controllers/Certificate.go

@@ -34,12 +34,14 @@ func (c *CertificateController) List() {
 		page_z = conf.Page_size
 	}
 
-	T_sn := c.GetString("T_sn")
+	//T_sn := c.GetString("T_sn")
+	T_Certificate_sn := c.GetString("T_Certificate_sn")
 	T_layout_no := c.GetString("T_layout_no")
 	Time_start := c.GetString("Time_start")
 	Time_end := c.GetString("Time_end")
 	T_release_time_sort, _ := c.GetInt("T_release_time_sort") // 1 升序 2 降序
 	T_failure_time_sort, _ := c.GetInt("T_failure_time_sort") // 1 升序 2 降序
+	T_layout_no_sort, _ := c.GetInt("T_layout_no_sort")       // 1 升序 2 降序
 
 	if len(Time_start) > 0 && !lib.IsDateStr(Time_start) {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
@@ -54,7 +56,7 @@ func (c *CertificateController) List() {
 	}
 
 	var cnt int
-	List, cnt := Certificate.Read_Certificate_List(T_sn, T_layout_no, Time_start, Time_end, T_release_time_sort, T_failure_time_sort, page, page_z)
+	List, cnt := Certificate.Read_Certificate_List(T_Certificate_sn, T_layout_no, Time_start, Time_end, T_release_time_sort, T_failure_time_sort, T_layout_no_sort, page, page_z)
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.List = List
 	r_jsons.Page = page
@@ -77,14 +79,14 @@ func (c *CertificateController) Get() {
 		return
 	}
 
-	T_sn := c.GetString("T_sn")
-	if _, is := Certificate.Read_Certificate(T_sn); !is {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "证书不存在!"}
+	T_layout_no := c.GetString("T_layout_no")
+	if _, is := Certificate.Read_Certificate(T_layout_no); !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "布局编号不存在!"}
 		c.ServeJSON()
 		return
 	}
 
-	r, err := Certificate.Read_CertificatePdf_Newest(T_sn)
+	r, err := Certificate.Read_CertificatePdf_Newest(T_layout_no)
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
 		c.ServeJSON()
@@ -111,14 +113,14 @@ func (c *CertificateController) Add() {
 		return
 	}
 
-	T_sn := c.GetString("T_sn")
+	T_layout_no := c.GetString("T_layout_no")
 
 	var_ := Certificate.Certificate{
-		T_sn:    T_sn,
-		T_State: 1,
+		T_layout_no: T_layout_no,
+		T_State:     1,
 	}
 
-	if _, is := Certificate.Read_Certificate(T_sn); is {
+	if _, is := Certificate.Read_Certificate(T_layout_no); is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "设备编号重复!"}
 		c.ServeJSON()
 		return
@@ -161,15 +163,15 @@ func (c *CertificateController) Edit() {
 		return
 	}
 
-	T_sn := c.GetString("T_sn")
+	T_layout_no := c.GetString("T_layout_no")
 
-	if _, is = Certificate.Read_Certificate(T_sn); is && r.T_sn != T_sn {
+	if _, is = Certificate.Read_Certificate(T_layout_no); is && r.T_layout_no != T_layout_no {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "设备编号重复!"}
 		c.ServeJSON()
 		return
 	}
-	r.T_sn = T_sn
-	is = Certificate.Update_Certificate(r, "T_sn")
+	r.T_layout_no = T_layout_no
+	is = Certificate.Update_Certificate(r, "T_layout_no")
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
 		c.ServeJSON()
@@ -235,10 +237,11 @@ func (c *CertificateController) Pdf_List() {
 		page_z = conf.Page_size
 	}
 
-	T_Certificate_sn := c.GetString("T_Certificate_sn")
+	//T_Certificate_sn := c.GetString("T_Certificate_sn")
+	T_layout_no := c.GetString("T_layout_no")
 
 	var cnt int64
-	List, cnt := Certificate.Read_CertificatePdf_List(T_Certificate_sn, page, page_z)
+	List, cnt := Certificate.Read_CertificatePdf_List(T_layout_no, page, page_z)
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.List = List
 	r_jsons.Page = page
@@ -261,10 +264,16 @@ func (c *CertificateController) Pdf_Add() {
 		return
 	}
 
-	T_Certificate_sn := c.GetString("T_Certificate_sn")
+	T_layout_no := c.GetString("T_layout_no")           // 布局编号
+	T_Certificate_sn := c.GetString("T_Certificate_sn") // 证书编号
 	T_release_time := c.GetString("T_release_time")
 	T_failure_time := c.GetString("T_failure_time")
 	T_pdf := c.GetString("T_pdf")
+	if len(T_layout_no) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "布局编号不能为空"}
+		c.ServeJSON()
+		return
+	}
 
 	if !lib.IsDateStr(T_release_time) {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误!"}
@@ -279,6 +288,7 @@ func (c *CertificateController) Pdf_Add() {
 	}
 
 	var_ := Certificate.CertificatePdf{
+		T_layout_no:      T_layout_no,
 		T_Certificate_sn: T_Certificate_sn,
 		T_release_time:   T_release_time,
 		T_failure_time:   T_failure_time,
@@ -287,7 +297,7 @@ func (c *CertificateController) Pdf_Add() {
 	}
 
 	if _, err := Certificate.Read_CertificatePdf(T_Certificate_sn, T_release_time, T_failure_time); err == nil {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "重复添加!"}
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "证书编号重复!"}
 		c.ServeJSON()
 		return
 	}
@@ -352,6 +362,9 @@ func (c *CertificateController) Pdf_Up() {
 		return
 	}
 
+	if len(T_Certificate_sn) > 0 {
+		r.T_Certificate_sn = T_Certificate_sn
+	}
 	if len(T_release_time) > 0 {
 		r.T_release_time = T_release_time
 	}
@@ -361,7 +374,7 @@ func (c *CertificateController) Pdf_Up() {
 	if len(T_pdf) > 0 {
 		r.T_pdf = T_pdf
 	}
-	if !Certificate.Update_CertificatePdf(r, "T_release_time", "T_failure_time", "T_pdf") {
+	if !Certificate.Update_CertificatePdf(r, "T_Certificate_sn", "T_release_time", "T_failure_time", "T_pdf") {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
 		c.ServeJSON()
 		return

+ 36 - 17
controllers/DeviceClass.go

@@ -331,7 +331,7 @@ func (c *DeviceClassController) List_Add1() {
 		}
 
 		var pdf Certificate.CertificatePdf
-		pdfList, _ := Certificate.Read_CertificatePdf_Newest(T_sn)
+		pdfList, _ := Certificate.Read_CertificatePdf_Newest(T_id)
 		if len(pdfList) > 0 {
 			pdf = pdfList[0]
 		}
@@ -441,19 +441,21 @@ func (c *DeviceClassController) List_Add() {
 		}
 
 		var pdf Certificate.CertificatePdf
-		pdfList, _ := Certificate.Read_CertificatePdf_Newest(T_sn)
+		//pdfList, _ := Certificate.Read_CertificatePdf_Newest(T_sn)
+		pdfList, _ := Certificate.Read_CertificatePdf_T_layout_no(T_id, "")
 		if len(pdfList) > 0 {
 			pdf = pdfList[0]
 		}
 
 		var_ := Device.DeviceClassList{
-			T_class:        T_class,
-			T_id:           T_id,
-			T_sn:           T_sn,
-			T_failure_time: pdf.T_failure_time,
-			T_pdf:          pdf.T_pdf,
-			T_remark:       T_remark,
-			T_State:        1,
+			T_class:          T_class,
+			T_id:             T_id,
+			T_sn:             T_sn,
+			T_failure_time:   pdf.T_failure_time,
+			T_pdf:            pdf.T_pdf,
+			T_Certificate_sn: pdf.T_Certificate_sn,
+			T_remark:         T_remark,
+			T_State:          1,
 		}
 
 		_, is = Device.Add_DeviceClassList(var_)
@@ -535,19 +537,20 @@ func (c *DeviceClassController) List_Copy() {
 			}
 			// 不存在则添加
 			var pdf Certificate.CertificatePdf
-			pdfList, _ := Certificate.Read_CertificatePdf_Newest(v.T_sn)
+			pdfList, _ := Certificate.Read_CertificatePdf_T_layout_no(v.T_id, "")
 			if len(pdfList) > 0 {
 				pdf = pdfList[0]
 			}
 
 			var_ := Device.DeviceClassList{
-				T_class:        paste_task.T_class,
-				T_id:           v.T_id,
-				T_sn:           v.T_sn,
-				T_failure_time: pdf.T_failure_time,
-				T_pdf:          pdf.T_pdf,
-				T_remark:       v.T_remark,
-				T_State:        1,
+				T_class:          paste_task.T_class,
+				T_id:             v.T_id,
+				T_sn:             v.T_sn,
+				T_failure_time:   pdf.T_failure_time,
+				T_pdf:            pdf.T_pdf,
+				T_Certificate_sn: pdf.T_Certificate_sn,
+				T_remark:         v.T_remark,
+				T_State:          1,
 			}
 
 			_, is = Device.Add_DeviceClassList(var_)
@@ -620,6 +623,15 @@ func (c *DeviceClassController) List_Up() {
 
 	if len(T_id) > 0 {
 		r.T_id = T_id
+		// 修改布局编号对应的证书
+		var pdf Certificate.CertificatePdf
+		pdfList, _ := Certificate.Read_CertificatePdf_T_layout_no(T_id, r.CreateTime.Format("2006-01-02"))
+		if len(pdfList) > 0 {
+			pdf = pdfList[0]
+		}
+		r.T_failure_time = pdf.T_failure_time
+		r.T_pdf = pdf.T_pdf
+		r.T_Certificate_sn = pdf.T_Certificate_sn
 	}
 	if len(T_remark) > 0 {
 		r.T_remark = T_remark
@@ -678,3 +690,10 @@ func (c *DeviceClassController) List_Del() {
 	c.ServeJSON()
 	return
 }
+
+// 添加设备列表。模板下载
+func (c *DeviceClassController) List_Template_Download() {
+
+	// 返回生成的 Excel 文件
+	c.Ctx.Output.Download("ofile/添加设备列表模板.xlsx")
+}

+ 2 - 1
controllers/Task.go

@@ -17,6 +17,7 @@ import (
 	"gonum.org/v1/plot/vg/draw"
 	"image/color"
 	"math"
+	"os"
 	"sync"
 	"time"
 )
@@ -696,7 +697,7 @@ func DeviceDataJPG(StartTime, EndTime, T_task_id, T_remark string, deviceList []
 		return
 	}
 	//删除目录
-	//os.Remove("ofile/" + filename + ".jpg")
+	os.Remove("ofile/" + filename + ".jpg")
 
 	msg = "图片生成成功"
 	url = "https://bzdcoldverifyoss.baozhida.cn/" + "ofile/" + filename + ".jpg"

+ 23 - 2
controllers/TaskData.go

@@ -175,9 +175,19 @@ func (c *TaskDataController) TaskData_List() {
 		c.ServeJSON()
 		return
 	}
+	// 查询设备列表
+	dcList, _ := Device.Read_DeviceClassList_OrderList(Task_r.T_class, T_sn, "", page, 9999)
+	// 保存布局编号和校准证书对应关系
+	var deviceCertificateMap = make(map[string]string) // t_id, T_Certificate_sn
+	for _, v := range dcList {
+		deviceCertificateMap[v.T_id] = v.T_Certificate_sn
+	}
 
 	var cnt int64
 	List, cnt := Task.Read_TaskData_ById_List(Task_r.T_task_id, T_sn, T_id, Time_start, Time_end, page, page_z)
+	for i := 0; i < len(List); i++ {
+		List[i].T_Certificate_sn = deviceCertificateMap[List[i].T_id]
+	}
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.List = List
 	r_jsons.Page = page
@@ -239,8 +249,19 @@ func (c *TaskDataController) UserTaskData_List() {
 		return
 	}
 
+	// 查询设备列表
+	dcList, _ := Device.Read_DeviceClassList_OrderList(Task_r.T_class, T_sn, "", page, 9999)
+	// 保存布局编号和校准证书对应关系
+	var deviceCertificateMap = make(map[string]string) // t_id, T_Certificate_sn
+	for _, v := range dcList {
+		deviceCertificateMap[v.T_id] = v.T_Certificate_sn
+	}
+
 	var cnt int64
 	List, cnt := Task.Read_TaskData_ById_List(Task_r.T_task_id, T_sn, T_id, Time_start, Time_end, page, page_z)
+	for i := 0; i < len(List); i++ {
+		List[i].T_Certificate_sn = deviceCertificateMap[List[i].T_id]
+	}
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.List = List
 	r_jsons.Page = page
@@ -714,7 +735,7 @@ func (c *TaskDataController) Export_Data_PDF() {
 		T_rh := fmt.Sprintf(" %.1f ", v.T_rh)
 		T_time := fmt.Sprintf("%s", v.T_time)
 
-		lib.RectFillColor(pdf, strconv.Itoa(v.T_id), 10, 22, y, 80, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		lib.RectFillColor(pdf, v.T_id, 10, 22, y, 80, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 		lib.RectFillColor(pdf, v.T_sn, 10, 92, y, 150, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 		lib.RectFillColor(pdf, T_t, 10, 242, y, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
 		lib.RectFillColor(pdf, T_rh, 10, 342, y, 100, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
@@ -767,7 +788,7 @@ func (c *TaskDataController) Check() {
 	}
 	type R_JSONS struct {
 		T_sn               string // SN
-		T_id               int    // 编号
+		T_id               string // 编号
 		T_unm              int    // 数据量
 		T_time_interval    int64  // 时间间隔
 		Time_start         string // 开始

+ 21 - 13
models/Certificate/Certificate.go

@@ -50,11 +50,11 @@ func Read_Certificate_ById(id int) (r Certificate, is bool) {
 }
 
 // 获取 By
-func Read_Certificate(T_sn string) (r Certificate, is bool) {
+func Read_Certificate(T_layout_no string) (r Certificate, is bool) {
 
 	o := orm.NewOrm()
 	qs := o.QueryTable(new(Certificate))
-	err := qs.Filter("T_sn", T_sn).Filter("T_State", 1).One(&r)
+	err := qs.Filter("T_layout_no", T_layout_no).Filter("T_State", 1).One(&r)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 		return r, false
@@ -128,15 +128,17 @@ func Update_Certificate(m Certificate, cols ...string) bool {
 }
 
 type Certificate_ struct {
-	Id             int    `orm:"column(ID)"`
-	T_sn           string // 编号
-	T_release_time string `orm:"column(t_release_time)"` // 发布时间
-	T_failure_time string `orm:"column(t_failure_time)"` // 失效时间
-	T_pdf          string // pdf链接
+	Id int `orm:"column(ID)"`
+	//T_sn             string // 编号
+	T_Certificate_sn string // 编号
+	T_layout_no      string // 布局编号
+	T_release_time   string `orm:"column(t_release_time)"` // 发布时间
+	T_failure_time   string `orm:"column(t_failure_time)"` // 失效时间
+	T_pdf            string // pdf链接
 }
 
 // 获取列表
-func Read_Certificate_List(T_sn, T_layout_no, Time_start, Time_end string, T_release_time_sort, T_failure_time_sort, page int, page_z int) ([]Certificate_, int) {
+func Read_Certificate_List(T_Certificate_sn, T_layout_no, Time_start, Time_end string, T_release_time_sort, T_failure_time_sort, T_layout_no_sort, page int, page_z int) ([]Certificate_, int) {
 
 	o := orm.NewOrm()
 	var offset int
@@ -150,11 +152,11 @@ func Read_Certificate_List(T_sn, T_layout_no, Time_start, Time_end string, T_rel
 	var maps []Certificate_
 
 	sqlWhere := ""
-	if len(T_sn) > 0 {
-		sqlWhere += " AND t_sn like \"%" + T_sn + "%\""
+	if len(T_Certificate_sn) > 0 {
+		sqlWhere += " AND pdf.t__certificate_sn like \"%" + T_Certificate_sn + "%\""
 	}
 	if len(T_layout_no) > 0 {
-		sqlWhere += " AND t_layout_no like \"%" + T_layout_no + "%\""
+		sqlWhere += " AND c.t_layout_no like \"%" + T_layout_no + "%\""
 	}
 	if len(Time_start) > 0 {
 		sqlWhere += " AND t_failure_time >= \"" + Time_start + "\""
@@ -164,7 +166,7 @@ func Read_Certificate_List(T_sn, T_layout_no, Time_start, Time_end string, T_rel
 	}
 
 	// 获取总条数
-	sql := "SELECT COUNT(ID) FROM certificate WHERE t__state=1"
+	sql := "SELECT COUNT(ID) FROM certificate AS c LEFT JOIN (SELECT t_release_time,t_failure_time,t_pdf,t__certificate_sn,t_layout_no FROM (SELECT DISTINCT * FROM `certificate_pdf` WHERE t__state=1 ORDER BY id DESC) f GROUP BY t_layout_no) AS pdf ON pdf.t_layout_no=c.t_layout_no WHERE t__state=1"
 	sql = sql + sqlWhere
 	fmt.Println(sql)
 	_, err := o.Raw(sql).ValuesList(&maps_z)
@@ -175,7 +177,7 @@ func Read_Certificate_List(T_sn, T_layout_no, Time_start, Time_end string, T_rel
 		return maps, 0
 	}
 	//sql = "SELECT * FROM Certificate AS c LEFT JOIN (SELECT any_value(t_release_time) t_release_time,any_value(t_failure_time) t_failure_time,any_value(t_pdf) t_pdf,t__certificate_sn FROM (SELECT DISTINCT * FROM `CertificatePdf` WHERE t__state=1 ORDER BY id DESC) f GROUP BY t__certificate_sn) AS pdf ON pdf.t__certificate_sn=c.t_sn WHERE t__state=1"
-	sql = "SELECT * FROM certificate AS c LEFT JOIN (SELECT t_release_time,t_failure_time,t_pdf,t__certificate_sn FROM (SELECT DISTINCT * FROM `certificate_pdf` WHERE t__state=1 ORDER BY id DESC) f GROUP BY t__certificate_sn) AS pdf ON pdf.t__certificate_sn=c.t_sn WHERE t__state=1"
+	sql = "SELECT *,c.t_layout_no as t_layout_no FROM certificate AS c LEFT JOIN (SELECT t_release_time,t_failure_time,t_pdf,t__certificate_sn,t_layout_no FROM (SELECT DISTINCT * FROM `certificate_pdf` WHERE t__state=1 ORDER BY id DESC) f GROUP BY t_layout_no) AS pdf ON pdf.t_layout_no=c.t_layout_no WHERE t__state=1"
 
 	sql = sql + sqlWhere
 	sqlOrder := make([]string, 0)
@@ -191,6 +193,12 @@ func Read_Certificate_List(T_sn, T_layout_no, Time_start, Time_end string, T_rel
 	} else if T_failure_time_sort == 2 {
 		sqlOrder = append(sqlOrder, "pdf.t_failure_time DESC")
 	}
+	if T_layout_no_sort == 1 {
+		sqlOrder = append(sqlOrder, "c.t_layout_no ASC")
+	} else if T_layout_no_sort == 2 {
+		sqlOrder = append(sqlOrder, "c.t_layout_no DESC")
+	}
+
 	if len(sqlOrder) > 0 {
 		sql += " ORDER BY " + strings.Join(sqlOrder, ", ")
 	}

+ 26 - 5
models/Certificate/CertificatePdf.go

@@ -12,6 +12,7 @@ import (
 
 type CertificatePdf struct {
 	Id               int    `orm:"column(ID);size(11);auto;pk"`
+	T_layout_no      string `orm:"size(256);null"`                               // 布局编号
 	T_Certificate_sn string `orm:"size(256);null"`                               // 证书编号
 	T_release_time   string `orm:"column(t_release_time);type(timestamp);null;"` // 发布时间
 	T_failure_time   string `orm:"column(t_failure_time);type(timestamp);null;"` // 失效时间
@@ -23,7 +24,8 @@ type CertificatePdf struct {
 }
 type CertificatePdf_R struct {
 	Id               int
-	T_Certificate_sn string // 证书编号
+	T_layout_no      string // 布局编号
+	T_Certificate_sn string // 证书编号 TODO后期删除
 	T_release_time   string // 发布时间
 	T_failure_time   string // 失效时间
 	T_pdf            string // pdf链接
@@ -42,6 +44,7 @@ func init() {
 // -------------------------------------------------------------
 func CertificatePdfToCertificatePdf_R(T CertificatePdf) (T_r CertificatePdf_R) {
 	T_r.Id = T.Id
+	T_r.T_layout_no = T.T_layout_no
 	T_r.T_Certificate_sn = T.T_Certificate_sn
 	T_r.T_release_time = T.T_release_time
 	T_r.T_failure_time = T.T_failure_time
@@ -76,11 +79,29 @@ func Read_CertificatePdf(T_Certificate_sn, T_release_time, T_failure_time string
 }
 
 // 获取最新的校准证书
-func Read_CertificatePdf_Newest(T_Certificate_sn string) (r []CertificatePdf, err error) {
+func Read_CertificatePdf_Newest(T_layout_no string) (r []CertificatePdf, err error) {
 
 	o := orm.NewOrm()
 	qs := o.QueryTable(new(CertificatePdf))
-	_, err = qs.Limit(1, 0).Filter("T_Certificate_sn", T_Certificate_sn).Filter("T_State", 1).OrderBy("-T_failure_time").All(&r)
+	_, err = qs.Limit(1, 0).Filter("T_layout_no", T_layout_no).Filter("T_State", 1).OrderBy("-T_failure_time").All(&r)
+	if err != nil {
+		logs.Println(lib.FuncName(), err)
+	}
+	return r, err
+}
+
+// 通过T_layout_no获取对应时间的证书
+func Read_CertificatePdf_T_layout_no(T_layout_no, operation_time string) (r []CertificatePdf, err error) {
+	if len(operation_time) == 0 {
+		operation_time = time.Now().Format("2006-01-02")
+	}
+
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(CertificatePdf))
+	_, err = qs.Limit(1, 0).Filter("T_layout_no", T_layout_no).
+		Filter("T_release_time__lte", operation_time).
+		Filter("T_failure_time__gte", operation_time).
+		Filter("T_State", 1).OrderBy("-T_failure_time").All(&r)
 	if err != nil {
 		logs.Println(lib.FuncName(), err)
 	}
@@ -145,7 +166,7 @@ func Update_CertificatePdf(m CertificatePdf, cols ...string) bool {
 }
 
 // 获取列表
-func Read_CertificatePdf_List(T_Certificate_sn string, page int, page_z int) ([]CertificatePdf_R, int64) {
+func Read_CertificatePdf_List(T_layout_no string, page int, page_z int) ([]CertificatePdf_R, int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -158,7 +179,7 @@ func Read_CertificatePdf_List(T_Certificate_sn string, page int, page_z int) ([]
 		offset = int64((page - 1) * page_z)
 	}
 	cond := orm.NewCondition()
-	cond1 := cond.And("T_Certificate_sn", T_Certificate_sn).And("T_State", 1)
+	cond1 := cond.And("T_layout_no", T_layout_no).And("T_State", 1)
 	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
 	cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
 	// 转换

+ 7 - 6
models/Device/DeviceClassList.go

@@ -20,12 +20,13 @@ import (
 type DeviceClassList struct {
 	Id int `orm:"column(ID);size(11);auto;pk"`
 
-	T_class        int    `orm:"size(200);null"`  // 分类
-	T_id           string `orm:"size(20);null"`   // 设备id
-	T_sn           string `orm:"size(256);null"`  // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
-	T_failure_time string `orm:"size(256);null"`  // 失效时间
-	T_pdf          string `orm:"size(256);null"`  // pdf链接
-	T_remark       string `orm:"size(1024);null"` // 备注
+	T_class          int    `orm:"size(200);null"`  // 分类
+	T_id             string `orm:"size(20);null"`   // 设备id
+	T_sn             string `orm:"size(256);null"`  // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
+	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_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 第一次保存时才设置时间

+ 8 - 6
models/Task/TaskData.go

@@ -164,12 +164,14 @@ func Read_TaskData_Count(T_task_id string) int {
 }
 
 type TaskData_ struct {
-	ID     int     `orm:"column(ID);size(100);null"`   // ID
-	T_sn   string  `orm:"column(t_sn);size(256);null"` // 标题
-	T_id   int     `orm:"column(t_id);size(10);null"`  // ID
-	T_t    float32 `orm:"column(t_t);size(10);null"`   // 温度
-	T_rh   float32 `orm:"column(t_rh);size(10);null"`  // 湿度
-	T_time string  `orm:"column(t_times);null;"`       // 采集时间
+	ID               int     `orm:"column(ID);size(100);null"`   // ID
+	T_sn             string  `orm:"column(t_sn);size(256);null"` // 标题
+	T_id             string  `orm:"column(t_id);size(256);null"` // ID
+	T_t              float32 `orm:"column(t_t);size(10);null"`   // 温度
+	T_rh             float32 `orm:"column(t_rh);size(10);null"`  // 湿度
+	T_time           string  `orm:"column(t_times);null;"`       // 采集时间
+	T_Certificate_sn string  `orm:"size(256);null"`              // 证书编号
+
 }
 type TaskDataClass_ struct {
 	T_sn string `orm:"column(t_sn);size(256);null"` // 标题

+ 6 - 5
routers/Device.go

@@ -15,11 +15,12 @@ func init() {
 	beego.Router("/DeviceClass/Del", &controllers.DeviceClassController{}, "*:Del")   // 删除设备分类
 
 	// 设备分类 - 设备列表
-	beego.Router("/DeviceClassList/List", &controllers.DeviceClassController{}, "*:List_List") // 设备分类列表
-	beego.Router("/DeviceClassList/Add", &controllers.DeviceClassController{}, "*:List_Add")   // 添加设备分类列表
-	beego.Router("/DeviceClassList/Up", &controllers.DeviceClassController{}, "*:List_Up")     // 编辑设备分类列表
-	beego.Router("/DeviceClassList/Del", &controllers.DeviceClassController{}, "*:List_Del")   // 删除设备分类列表
-	beego.Router("/DeviceClassList/Copy", &controllers.DeviceClassController{}, "*:List_Copy") // 复制
+	beego.Router("/DeviceClassList/List", &controllers.DeviceClassController{}, "*:List_List")                           // 设备分类列表
+	beego.Router("/DeviceClassList/Add", &controllers.DeviceClassController{}, "*:List_Add")                             // 添加设备分类列表
+	beego.Router("/DeviceClassList/Up", &controllers.DeviceClassController{}, "*:List_Up")                               // 编辑设备分类列表
+	beego.Router("/DeviceClassList/Del", &controllers.DeviceClassController{}, "*:List_Del")                             // 删除设备分类列表
+	beego.Router("/DeviceClassList/Copy", &controllers.DeviceClassController{}, "*:List_Copy")                           // 复制
+	beego.Router("/DeviceClassList/Template_Download", &controllers.DeviceClassController{}, "*:List_Template_Download") // 添加设备列表模板
 
 	// - 设备管理
 	beego.Router("/Device/List", &controllers.DeviceController{}, "*:List") // 设别列表