|
@@ -15,6 +15,7 @@ import (
|
|
"github.com/signintech/gopdf"
|
|
"github.com/signintech/gopdf"
|
|
"github.com/vmihailenco/msgpack/v5"
|
|
"github.com/vmihailenco/msgpack/v5"
|
|
"github.com/xuri/excelize/v2"
|
|
"github.com/xuri/excelize/v2"
|
|
|
|
+ "log"
|
|
"math"
|
|
"math"
|
|
"os"
|
|
"os"
|
|
"sort"
|
|
"sort"
|
|
@@ -991,25 +992,13 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
dataList, _ := Task.Read_TaskData_ById_List(Task_r.T_task_id, T_sn, T_id, Time_start, Time_end, 0, 9999)
|
|
dataList, _ := Task.Read_TaskData_ById_List(Task_r.T_task_id, T_sn, T_id, Time_start, Time_end, 0, 9999)
|
|
dataListMap := make(map[string][]Task.TaskData_)
|
|
dataListMap := make(map[string][]Task.TaskData_)
|
|
dcListMap := make(map[string]string)
|
|
dcListMap := make(map[string]string)
|
|
|
|
+ dataMap := make(map[string]string)
|
|
|
|
+ timeMap := make(map[string]bool)
|
|
for _, data := range dataList {
|
|
for _, data := range dataList {
|
|
dataListMap[data.T_id] = append(dataListMap[data.T_id], data)
|
|
dataListMap[data.T_id] = append(dataListMap[data.T_id], data)
|
|
if _, ok := dcListMap[data.T_id]; !ok {
|
|
if _, ok := dcListMap[data.T_id]; !ok {
|
|
dcListMap[data.T_id] = data.T_sn
|
|
dcListMap[data.T_id] = data.T_sn
|
|
}
|
|
}
|
|
- }
|
|
|
|
- for id, sn := range dcListMap {
|
|
|
|
- dcList = append(dcList, Device.DeviceClassList{T_id: id, T_sn: sn})
|
|
|
|
- }
|
|
|
|
- for id, list := range dataListMap {
|
|
|
|
- sort.Slice(list, func(i, j int) bool {
|
|
|
|
- return list[i].T_time < list[j].T_time
|
|
|
|
- })
|
|
|
|
- dataListMap[id] = list
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- dataMap := make(map[string]string)
|
|
|
|
- timeMap := make(map[string]bool)
|
|
|
|
- for _, data := range dataList {
|
|
|
|
k := fmt.Sprintf("%s,%s", data.T_time, data.T_id)
|
|
k := fmt.Sprintf("%s,%s", data.T_time, data.T_id)
|
|
if T_type == Task.Temperature {
|
|
if T_type == Task.Temperature {
|
|
dataMap[k] = fmt.Sprintf("%.1f", data.T_t)
|
|
dataMap[k] = fmt.Sprintf("%.1f", data.T_t)
|
|
@@ -1021,6 +1010,15 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
timeMap[data.T_time] = true
|
|
timeMap[data.T_time] = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ for id, sn := range dcListMap {
|
|
|
|
+ dcList = append(dcList, Device.DeviceClassList{T_id: id, T_sn: sn})
|
|
|
|
+ }
|
|
|
|
+ for id, list := range dataListMap {
|
|
|
|
+ sort.Slice(list, func(i, j int) bool {
|
|
|
|
+ return list[i].T_time < list[j].T_time
|
|
|
|
+ })
|
|
|
|
+ dataListMap[id] = list
|
|
|
|
+ }
|
|
|
|
|
|
var timeList []string
|
|
var timeList []string
|
|
for k, _ := range timeMap {
|
|
for k, _ := range timeMap {
|
|
@@ -1042,7 +1040,7 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
pdf.Text(timeStr)
|
|
pdf.Text(timeStr)
|
|
}
|
|
}
|
|
|
|
|
|
- y += 20
|
|
|
|
|
|
+ //y += 20
|
|
var x float64 = 10
|
|
var x float64 = 10
|
|
var w float64 = 120
|
|
var w float64 = 120
|
|
|
|
|
|
@@ -1066,7 +1064,28 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
sort.Slice(dcList1, func(i, j int) bool {
|
|
sort.Slice(dcList1, func(i, j int) bool {
|
|
return dcList1[i].T_id < dcList1[j].T_id
|
|
return dcList1[i].T_id < dcList1[j].T_id
|
|
})
|
|
})
|
|
- for _, dc := range dcList1 {
|
|
|
|
|
|
+ dcList2 := listSubtract(dcList, dcList1)
|
|
|
|
+ // 获取探头时间
|
|
|
|
+ var timeList2 []string
|
|
|
|
+ timeMap2 := make(map[string]struct{})
|
|
|
|
+ for _, list := range dcList2 {
|
|
|
|
+ dataList2, ok := dataListMap[list.T_id]
|
|
|
|
+ if ok {
|
|
|
|
+ for _, data := range dataList2 {
|
|
|
|
+ if _, ok = timeMap2[data.T_time]; !ok {
|
|
|
|
+ timeMap2[data.T_time] = struct{}{}
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for k, _ := range timeMap2 {
|
|
|
|
+ timeList2 = append(timeList2, k)
|
|
|
|
+ }
|
|
|
|
+ sort.Slice(timeList2, func(i, j int) bool {
|
|
|
|
+ return timeList2[i] < timeList2[j]
|
|
|
|
+ })
|
|
|
|
+ var temp int
|
|
|
|
+ for index, dc := range dcList1 {
|
|
|
|
|
|
dataList2, _ := dataListMap[dc.T_id]
|
|
dataList2, _ := dataListMap[dc.T_id]
|
|
|
|
|
|
@@ -1074,13 +1093,17 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
if err != nil {
|
|
if err != nil {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+ y += 30
|
|
|
|
+
|
|
var textH float64 = 20 // if text height is 25px.
|
|
var textH float64 = 20 // if text height is 25px.
|
|
- y += 20
|
|
|
|
- pdf.SetNewY(y, textH)
|
|
|
|
- y = pdf.GetY()
|
|
|
|
if y > 790 {
|
|
if y > 790 {
|
|
|
|
+ addStampImage(pdf, 455, y-150)
|
|
pdf.AddPage()
|
|
pdf.AddPage()
|
|
y = 30
|
|
y = 30
|
|
|
|
+ } else {
|
|
|
|
+ if index > 0 {
|
|
|
|
+ y += 10
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
textw, _ = pdf.MeasureTextWidth(dc.T_id)
|
|
textw, _ = pdf.MeasureTextWidth(dc.T_id)
|
|
@@ -1093,8 +1116,7 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
if err != nil {
|
|
if err != nil {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- pdf.SetNewY(y, textH)
|
|
|
|
- y = pdf.GetY()
|
|
|
|
|
|
+
|
|
if y < 790 {
|
|
if y < 790 {
|
|
x = 10
|
|
x = 10
|
|
for i := 0; i < 4; i++ {
|
|
for i := 0; i < 4; i++ {
|
|
@@ -1107,6 +1129,7 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
}
|
|
}
|
|
y += 20
|
|
y += 20
|
|
} else {
|
|
} else {
|
|
|
|
+ addStampImage(pdf, 455, y-150)
|
|
pdf.AddPage()
|
|
pdf.AddPage()
|
|
y = 20
|
|
y = 20
|
|
x = 10
|
|
x = 10
|
|
@@ -1120,8 +1143,39 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
}
|
|
}
|
|
y += 20
|
|
y += 20
|
|
}
|
|
}
|
|
|
|
+
|
|
for i := 0; i < len(dataList2); i++ {
|
|
for i := 0; i < len(dataList2); i++ {
|
|
- temp := i % 4
|
|
|
|
|
|
+ if y > 790 {
|
|
|
|
+ addStampImage(pdf, 455, y-130)
|
|
|
|
+ pdf.AddPage()
|
|
|
|
+ y = pdf.GetY()
|
|
|
|
+ x = 10
|
|
|
|
+ for k := 0; k < 4; k++ {
|
|
|
|
+ w = 113.8
|
|
|
|
+ lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
|
|
+ x += w
|
|
|
|
+ w = 30
|
|
|
|
+ lib.RectFillColor(pdf, T_type_name, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
|
|
+ x += w
|
|
|
|
+ }
|
|
|
|
+ y += 20
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ temp = i % 4
|
|
|
|
+ // 每页添加表头
|
|
|
|
+ if y == 20 && temp == 0 {
|
|
|
|
+ x = 10
|
|
|
|
+ for k := 0; k < 4; k++ {
|
|
|
|
+ w = 113.8
|
|
|
|
+ lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
|
|
+ x += w
|
|
|
|
+ w = 30
|
|
|
|
+ lib.RectFillColor(pdf, T_type_name, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
|
|
+ x += w
|
|
|
|
+ }
|
|
|
|
+ y += 20
|
|
|
|
+ }
|
|
|
|
+
|
|
x = 10 + 143.8*float64(temp)
|
|
x = 10 + 143.8*float64(temp)
|
|
w = 113.8
|
|
w = 113.8
|
|
|
|
|
|
@@ -1134,40 +1188,37 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
if T_type == Task.Humidity {
|
|
if T_type == Task.Humidity {
|
|
lib.RectFillColor(pdf, fmt.Sprintf("%.1f", dataList2[i].T_rh), 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
lib.RectFillColor(pdf, fmt.Sprintf("%.1f", dataList2[i].T_rh), 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
}
|
|
}
|
|
|
|
+ //if y > 760 {
|
|
|
|
+ // fmt.Println("=====y:", y)
|
|
|
|
+ //}
|
|
|
|
+ //if y > 790 {
|
|
|
|
+ // addStampImage(pdf, 455, y-130)
|
|
|
|
+ //}
|
|
if temp == 3 {
|
|
if temp == 3 {
|
|
y += 20
|
|
y += 20
|
|
pdf.SetNewY(y, textH)
|
|
pdf.SetNewY(y, textH)
|
|
y = pdf.GetY()
|
|
y = pdf.GetY()
|
|
- // 每页添加表头
|
|
|
|
- if y == 20 {
|
|
|
|
- x = 10
|
|
|
|
- for k := 0; k < 4; k++ {
|
|
|
|
- w = 113.8
|
|
|
|
- lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
|
|
- x += w
|
|
|
|
- w = 30
|
|
|
|
- lib.RectFillColor(pdf, T_type_name, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
|
|
- x += w
|
|
|
|
- }
|
|
|
|
- y += 20
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
- y += 25
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- //chunks := chunkBy(dcList, 15)
|
|
|
|
- y += 20
|
|
|
|
- dcList2 := listSubtract(dcList, dcList1)
|
|
|
|
|
|
+ if len(dcList2) > 0 {
|
|
|
|
+ if temp != 3 {
|
|
|
|
+ y += 20
|
|
|
|
+ }
|
|
|
|
+ y += 40
|
|
|
|
+ }
|
|
sort.Slice(dcList2, func(i, j int) bool {
|
|
sort.Slice(dcList2, func(i, j int) bool {
|
|
return dcList2[i].T_id < dcList2[j].T_id
|
|
return dcList2[i].T_id < dcList2[j].T_id
|
|
})
|
|
})
|
|
chunks := splitData(dcList2, 454.5, idWidthMap)
|
|
chunks := splitData(dcList2, 454.5, idWidthMap)
|
|
- for _, list := range chunks {
|
|
|
|
- var textH float64 = 20 // if text height is 25px.
|
|
|
|
- pdf.SetNewY(y, textH)
|
|
|
|
- y = pdf.GetY()
|
|
|
|
|
|
+ for i, list := range chunks {
|
|
|
|
+
|
|
|
|
+ if i > 0 {
|
|
|
|
+ y += 40
|
|
|
|
+ }
|
|
if y < 790 {
|
|
if y < 790 {
|
|
x = 10
|
|
x = 10
|
|
w = 120.7
|
|
w = 120.7
|
|
@@ -1181,15 +1232,34 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
}
|
|
}
|
|
y += 20
|
|
y += 20
|
|
} else {
|
|
} else {
|
|
|
|
+ addStampImage(pdf, 455, y-150)
|
|
pdf.AddPage()
|
|
pdf.AddPage()
|
|
y = 20
|
|
y = 20
|
|
}
|
|
}
|
|
|
|
|
|
- for _, t := range timeList {
|
|
|
|
|
|
+ var StampImageX float64
|
|
|
|
+ for j, t := range timeList2 {
|
|
|
|
+ if j > 0 {
|
|
|
|
+ y += 20
|
|
|
|
+ }
|
|
x = 10
|
|
x = 10
|
|
- textH = 20 // if text height is 25px.
|
|
|
|
- pdf.SetNewY(y, textH)
|
|
|
|
- y = pdf.GetY()
|
|
|
|
|
|
+ if y > 790 {
|
|
|
|
+ addStampImage(pdf, StampImageX-130, y-130)
|
|
|
|
+ pdf.AddPage()
|
|
|
|
+ y = pdf.GetY()
|
|
|
|
+ x = 10
|
|
|
|
+ w = 120.7
|
|
|
|
+ lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
|
|
+ x += w
|
|
|
|
+ w = 30.3
|
|
|
|
+ for _, v2 := range list {
|
|
|
|
+ w = idWidthMap[v2.T_id]
|
|
|
|
+ lib.RectFillColor(pdf, v2.T_id, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
|
|
+ x += w
|
|
|
|
+ }
|
|
|
|
+ y += 20
|
|
|
|
+ x = 10
|
|
|
|
+ }
|
|
if y == 20 {
|
|
if y == 20 {
|
|
w = 120.7
|
|
w = 120.7
|
|
lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
lib.RectFillColor(pdf, "时间", 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
@@ -1213,10 +1283,29 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
lib.RectFillColor(pdf, t_t, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
lib.RectFillColor(pdf, t_t, 12, x, y, w, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
|
|
x += w
|
|
x += w
|
|
}
|
|
}
|
|
- y += 20
|
|
|
|
|
|
+ StampImageX = x
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ if y <= 790 {
|
|
|
|
+ if y < 150 {
|
|
|
|
+ y = 20
|
|
|
|
+ } else {
|
|
|
|
+ y = y - 145
|
|
}
|
|
}
|
|
- y += 20
|
|
|
|
|
|
+ x = x - 135
|
|
|
|
+ if len(dcList2) == 0 {
|
|
|
|
+ x = 455
|
|
|
|
+ }
|
|
|
|
+ addStampImage(pdf, x, y)
|
|
|
|
+ } else if y > 790 && len(dcList2) == 0 {
|
|
|
|
+ if y < 150 {
|
|
|
|
+ y = 20
|
|
|
|
+ } else {
|
|
|
|
+ y = y - 145
|
|
|
|
+ }
|
|
|
|
+ addStampImage(pdf, 455, y)
|
|
|
|
+
|
|
}
|
|
}
|
|
filename := time.Now().Format("20060102150405") + ".pdf"
|
|
filename := time.Now().Format("20060102150405") + ".pdf"
|
|
timeStr := "ofile/" + T_type_name + filename
|
|
timeStr := "ofile/" + T_type_name + filename
|
|
@@ -1248,7 +1337,13 @@ func (c *TaskDataController) TaskData_Pdf(Time_start, Time_end, T_task_id, T_sn,
|
|
return nil
|
|
return nil
|
|
|
|
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+func addStampImage(pdf *gopdf.GoPdf, x, y float64) {
|
|
|
|
+ imagePath := "./static/commonSeal.jpg"
|
|
|
|
+ err := pdf.Image(imagePath, x, y, &gopdf.Rect{W: 123, H: 128.6})
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Print(err.Error())
|
|
|
|
+ }
|
|
|
|
+}
|
|
func listSubtract(sliceA, sliceB []Device.DeviceClassList) []Device.DeviceClassList {
|
|
func listSubtract(sliceA, sliceB []Device.DeviceClassList) []Device.DeviceClassList {
|
|
// 创建一个集合用于存储 sliceB 的元素
|
|
// 创建一个集合用于存储 sliceB 的元素
|
|
elementsToRemove := make(map[string]Device.DeviceClassList)
|
|
elementsToRemove := make(map[string]Device.DeviceClassList)
|