Browse Source

add:验证工具统计

zoie 2 weeks ago
parent
commit
8b327fd80d

+ 79 - 43
controllers/DeviceClass.go

@@ -550,55 +550,44 @@ func (c *DeviceClassController) List_Copy() {
 		c.ServeJSON()
 		return
 	}
+	errList := []string{}
+	pasteList, cnt := Device.Read_DeviceClassList_OrderList(paste_task.T_class, "", "", "", 0, 9999)
+	for _, ds := range pasteList {
+		if !Device.Delete_DeviceClassList_(ds) {
+			errList = append(errList, ds.T_id)
+			continue
+		}
+	}
+
+	// 删除旧的设备列表
 
 	copyList, cnt := Device.Read_DeviceClassList_OrderList(copy_task.T_class, "", "", "", 0, 9999)
 	var successNum int // 成功数量
-	errList := []string{}
+
 	for _, v := range copyList {
-		ds, is2 := Device.Read_DeviceClassList_T_class_T_id(paste_task.T_class, v.T_id)
-		// id存在 更新
-		if is2 {
-			ds.T_sn = v.T_sn
-			ds.T_remark = v.T_remark
-			ds.T_terminal = v.T_terminal
-			if !Device.Update_DeviceClassList(ds, "T_sn", "T_remark", "T_terminal") {
-				errList = append(errList, v.T_id)
-				continue
-			}
-		} else {
-			// 判断是否已存在sn
-			_, is3 := Device.Read_DeviceClassList_T_class_T_sn(paste_task.T_class, v.T_sn)
-			// 删除要粘贴的任务里重复的sn
-			if is3 {
-				if !Device.Delete_DeviceClassList_(ds) {
-					errList = append(errList, v.T_id)
-					continue
-				}
-			}
-			// 不存在则添加
-			var pdf Certificate.CertificatePdf
-			pdfList, _ := Certificate.Read_CertificatePdf_T_layout_no(v.T_id, "")
-			if len(pdfList) > 0 {
-				pdf = pdfList[0]
-			}
+		// 不存在则添加
+		var pdf Certificate.CertificatePdf
+		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_Certificate_sn: pdf.T_Certificate_sn,
-				T_remark:         v.T_remark,
-				T_terminal:       v.T_terminal,
-				T_State:          1,
-			}
+		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_Certificate_sn: pdf.T_Certificate_sn,
+			T_remark:         v.T_remark,
+			T_terminal:       v.T_terminal,
+			T_State:          1,
+		}
 
-			_, is = Device.Add_DeviceClassList(var_)
-			if !is {
-				errList = append(errList, v.T_id)
-				continue
-			}
+		_, is = Device.Add_DeviceClassList(var_)
+		if !is {
+			errList = append(errList, v.T_id)
+			continue
 		}
 
 	}
@@ -946,3 +935,50 @@ func FilterByRange(data []Device.DeviceClassList, condition string) []Device.Dev
 
 	return result
 }
+
+// 验证工具统计
+func (c *DeviceClassController) Stat() {
+	// 验证登录 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
+	}
+
+	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_company := c.GetString("T_company") // 公司名称
+	var T_company_list []string
+	if len(T_company) > 0 {
+		T_company_list = Account.Read_User_T_uuid_ListByT_name(T_company)
+	}
+
+	Time_start := c.GetString("Time_start")
+	Time_end := c.GetString("Time_end")
+	T_name := c.GetString("T_name")
+	T_sn := c.GetString("T_sn")
+	T_distinct, _ := c.GetBool("T_distinct")
+	UserMap := Account.UserListToMap(Account.Read_User_List_ALL_1())
+
+	var cnt int64
+	List, cnt := Device.Read_DeviceClass_Stat(T_company_list, T_name, T_sn, Time_start, Time_end, T_distinct, UserMap, 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 = int(cnt)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}

+ 15 - 0
controllers/Task.go

@@ -2950,3 +2950,18 @@ func (c *TaskController) TaskData_Stat() {
 	c.ServeJSON()
 	return
 }
+
+// SyncPDFWatermark 同步水印
+func (c *TaskController) SyncPDFWatermark() {
+	//List, _ := Task.Read_Task_List_For_Watermark("pdf1")
+	//for _, task := range List {
+	//	GetWatermarkPdf(task, task.T_pdf1, "T_pdf1")
+	//}
+	//List2, _ := Task.Read_Task_List_For_Watermark("pdf2")
+	//for _, task := range List2 {
+	//	GetWatermarkPdf(task, task.T_pdf2, "T_pdf2")
+	//}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}

+ 0 - 1
controllers/VerifyTemplate.go

@@ -181,7 +181,6 @@ func (c *VerifyTemplateController) Up() {
 	}
 	if len(T_scheme) > 0 {
 		r.T_scheme = T_scheme
-
 	}
 	if len(T_reporting) > 0 {
 		r.T_reporting = T_reporting

+ 109 - 3
models/Device/DeviceClassList.go

@@ -6,13 +6,12 @@ import (
 	"ColdVerify_server/logs"
 	"encoding/json"
 	"fmt"
-	orm2 "github.com/beego/beego/v2/client/orm"
-	"strconv"
-
 	"github.com/astaxie/beego/cache"
 	_ "github.com/astaxie/beego/cache/redis"
 	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
+	"strconv"
 	"time"
 )
 
@@ -34,6 +33,31 @@ type DeviceClassList struct {
 	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
 }
 
+type DeviceClassStat 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_terminal int    `orm:"size(2);default(1)"` // 1-测点 2-终端
+	T_State    int    `orm:"size(2);default(1)"` // 0 删除   1 正常
+
+	T_task_id   string `orm:"size(256);null"`      // 任务ID
+	T_uuid      string `orm:"size(256);null"`      // 用户 UUID
+	T_user_name string `orm:"size(256);null"`      // 用户 UUID
+	T_name      string `orm:"size(256);null"`      // 标题
+	CreateTime  string `orm:"column(create_time)"` //auto_now_add 第一次保存时才设置时间
+}
+
+func DeviceClassStatToDeviceClassStat(T DeviceClassStat, userMap map[string]string) (T_ DeviceClassStat) {
+	T_ = T
+	T_.T_user_name = userMap[T.T_uuid]
+	if len(T.CreateTime) > 19 {
+		T_.CreateTime = T.CreateTime[0:19]
+	}
+	return T_
+}
+
 func (t *DeviceClassList) TableName() string {
 	return "device_class_list" // 数据库名称   // ************** 替换 FormulaList **************
 }
@@ -381,3 +405,85 @@ func Read_DeviceClassList_List_id_By_Terminal(T_class_Id int, T_Terminal bool) (
 	return r
 
 }
+
+func Read_DeviceClass_Stat(T_company_list []string, T_name, T_sn, Time_start, Time_end string, T_distinct bool, userMap map[string]string, page int, page_z int) (r []DeviceClassStat, cnt int64) {
+
+	o := orm.NewOrm()
+	var maps_z []orm2.ParamsList
+	pagez := page_z
+
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		page -= 1
+		offset = page * pagez
+	}
+
+	sqlWhere := "dcl.t__state = 1 AND dcl.t_terminal < 2 AND dcl.t_sn IS NOT NULL AND dcl.t_sn != ''"
+
+	if len(Time_start) > 1 {
+		sqlWhere += " AND dcl.create_time >= '" + Time_start + "'"
+	}
+
+	if len(Time_end) > 1 {
+		sqlWhere += " AND dcl.create_time <= '" + Time_end + "'"
+	}
+	if len(T_sn) > 1 {
+		sqlWhere += " AND dcl.t_sn like \"%" + T_sn + "%\""
+	}
+	if len(T_name) > 1 {
+		sqlWhere += " AND task.t_name like \"%" + T_name + "%\""
+	}
+	if len(T_company_list) > 0 {
+
+		// 构建 SQL 查询
+		query := " AND task.T_uuid IN ("
+		// 动态添加每个 id
+		for i, id := range T_company_list {
+			query += "'" + id + "'"
+			if i < len(T_company_list)-1 {
+				query += ", " // 添加逗号分隔
+			}
+		}
+		query += ") " // 结束 SQL 查询
+		sqlWhere += query
+	}
+
+	sql := "SELECT COUNT(*) FROM device_class_list dcl LEFT JOIN task ON dcl.t_class = task.t_class WHERE " + sqlWhere
+	if T_distinct {
+		sql = "SELECT COUNT(DISTINCT dcl.t_sn) FROM device_class_list dcl LEFT JOIN task ON dcl.t_class = task.t_class WHERE " + sqlWhere
+	}
+	logs.Println(sql)
+	_, err := o.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		return r, 0
+	}
+	if len(maps_z) == 0 {
+		return r, 0
+	}
+	//logs.Println("maps_z;",maps_z[0][0])
+	sql = "SELECT dcl.*,task.t_task_id,task.t_uuid,task.t_name FROM device_class_list dcl LEFT JOIN task ON dcl.t_class = task.t_class WHERE " + sqlWhere + " ORDER BY dcl.create_time DESC "
+	if T_distinct {
+		sql = "SELECT * FROM (SELECT dcl.*,task.t_task_id,task.t_uuid,task.t_name,ROW_NUMBER() OVER (PARTITION BY dcl.t_sn ORDER BY dcl.create_time ASC) AS rn FROM device_class_list dcl LEFT JOIN task ON dcl.t_class=task.t_class WHERE " + sqlWhere + ") AS ranked WHERE rn=1 ORDER BY ranked.create_time DESC "
+	}
+	if page_z != 9999 {
+		sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(pagez)
+	}
+
+	logs.Println(sql)
+	_, err = o.Raw(sql).QueryRows(&r)
+	if err != nil {
+		logs.Println(lib.FuncName(), err)
+		return r, 0
+	}
+
+	var list []DeviceClassStat
+	for _, v := range r {
+		list = append(list, DeviceClassStatToDeviceClassStat(v, userMap))
+	}
+
+	//value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
+	key, _ := strconv.Atoi(maps_z[0][0].(string))
+	return list, int64(key)
+}

+ 24 - 0
models/Task/Task.go

@@ -1227,3 +1227,27 @@ func Read_TaskbyT_report_number(T_report_number string) (r Task, is bool) {
 
 	return r, true
 }
+
+func Read_Task_List_For_Watermark(pdfType string) ([]Task, int) {
+
+	o := orm.NewOrm()
+
+	qs := o.QueryTable(new(Task))
+	var r []Task
+
+	cond := orm.NewCondition()
+	if pdfType == "pdf1" {
+
+		cond = cond.And("T_State", 1).And("T_pdf1__icontains", ".pdf")
+	}
+
+	if pdfType == "pdf2" {
+
+		cond = cond.And("T_State", 1).And("T_pdf2__icontains", ".pdf")
+	}
+
+	qs.SetCond((*orm2.Condition)(cond)).OrderBy("-Id").All(&r)
+	cnt, _ := qs.SetCond((*orm2.Condition)(cond)).Count()
+
+	return r, int(cnt)
+}

+ 1 - 0
routers/Device.go

@@ -13,6 +13,7 @@ func init() {
 	beego.Router("/DeviceClass/Add", &controllers.DeviceClassController{}, "*:Add")   // 添加设备分类
 	beego.Router("/DeviceClass/Up", &controllers.DeviceClassController{}, "*:Up")     // 编辑设备分类
 	beego.Router("/DeviceClass/Del", &controllers.DeviceClassController{}, "*:Del")   // 删除设备分类
+	beego.Router("/DeviceClass/Stat", &controllers.DeviceClassController{}, "*:Stat") // 设备统计
 
 	// 设备分类 - 设备列表
 	beego.Router("/DeviceClassList/List", &controllers.DeviceClassController{}, "*:List_List")                                        // 设备分类列表

+ 1 - 0
routers/Task.go

@@ -30,6 +30,7 @@ func init() {
 	beego.Router("/Task/Stat_Excel", &controllers.TaskController{}, "*:Stat_Excel")                       // 报告统计-excel
 	beego.Router("/Task/StatisticalRanking", &controllers.TaskController{}, "*:StatisticalRanking")       // 报告统计-excel
 	beego.Router("/Task/GenT_report_number", &controllers.TaskController{}, "*:GenT_report_number")       // 生成报告编号
+	beego.Router("/Task/SyncPDFWatermark", &controllers.TaskController{}, "*:SyncPDFWatermark")           // 生成报告编号
 
 	// 日志
 	beego.Router("/TaskLogs/List", &controllers.TaskController{}, "*:Logs_List")

+ 1 - 1
script/add_watermark.py

@@ -36,7 +36,7 @@ def add_watermark(url, pdf_file_in, pdf_file_mark, pdf_file_out):
 if __name__ == '__main__':
    
     if len(sys.argv) < 3:
-        print("Usage: add_watermark.py <pdf_file_in>  <pdf_file_out>  <pdf_file_mark>")
+        print("Usage: add_watermark.py <url> <pdf_file_in>  <pdf_file_out>  <pdf_file_mark>")
         sys.exit(1)
 
     pdf_file_url = sys.argv[1]

BIN
script/watermark.pdf


BIN
角色菜单.xlsx