kpi-api/report.go

3559 lines
95 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"bufio"
"bytes"
"encoding/csv"
// "bytes"
"database/sql"
"fmt"
"io"
"net/http"
"os"
// "strconv"
"strings"
"encoding/json"
"io/ioutil"
"time"
_ "github.com/mattn/go-adodb"
_ "github.com/LukeMauldin/lodbc"
"github.com/astaxie/beego/logs"
_ "github.com/mattn/go-sqlite3"
"github.com/signintech/gopdf"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
// "golang.org/x/text/encoding/charmap"
)
var (
g_report_data chan report_multi_template
g_ibase_op_ch chan ibase_op_history
g_inspection_op_ch chan ibase_op_history
)
func init() {
g_report_data = make(chan report_multi_template, 100)
g_ibase_op_ch = make(chan ibase_op_history, 100)
g_inspection_op_ch = make(chan ibase_op_history, 100)
go create_pdf_g()
go do_ibase_op_history_g()
go do_inspection_op_history_g()
}
func get_now_string() (t string) {
t = time.Now().Format("2006-01-02 15:04:05")
return t
}
func postimn(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("postimn recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var sqlstr string
var resp CommonResp
var id int
var row *sql.Rows
reqdata, _ := ioutil.ReadAll(request.Body)
var req postimn_req
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
row, err = sqlConn.Query(fmt.Sprintf(`select ID from [imn] where [imn_cn] = '%s'`, req.Data.Imn_cn))
if err != nil {
logs.Error(fmt.Sprintf("postimn get user cnt err:%v", err.Error()))
resp.Ret = -1
goto exit
}
for row.Next() {
if err = row.Scan(&id); err == nil {
}
}
row.Close()
if id == 0 { //add
sqlstr = fmt.Sprintf(`INSERT INTO [imn] ([imn_cn],[imn_en]) VALUES ('%s','%s')`,
req.Data.Imn_cn, req.Data.Imn_en)
} else if id > 0 { //update
sqlstr = fmt.Sprintf(`UPDATE [imn] SET [imn_cn] = '%s',[imn_en] = '%s' WHERE ID=%d`,
req.Data.Imn_cn, req.Data.Imn_en, req.Data.ID)
}
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("postimn Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("postimn recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_imn(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_imn recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_imn_req
var resp get_imn_resp
var sqlstr string
var rcnt int
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
var where_sql string
var if_where bool
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.F_name != "" {
likeStr := "%" + req.F_name + "%"
where_sql += fmt.Sprintf(`[imn_cn] like '%s'`, likeStr)
if_where = true
}
if !if_where {
sqlstr = "select count(ID) from [imn]"
} else {
sqlstr = fmt.Sprintf("select count(ID) from [imn] where %s", where_sql)
}
fmt.Println(sqlstr)
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_imn query %s err:%v", sqlstr, err.Error()))
goto exit
}
defer cntRow.Close()
for cntRow.Next() {
if err = cntRow.Scan(&rcnt); err != nil {
logs.Error(fmt.Sprintf("get_imn scan %s err:%v", sqlstr, err.Error()))
goto exit
}
}
resp.Total = rcnt
if !if_where {
sqlstr = fmt.Sprintf("select top %v [ID],[imn_cn],[imn_en] from [imn] where ID not in (select top %v ID from [imn] order by ID asc) order by ID asc", req.Count, (req.Index-1)*req.Count)
} else {
sqlstr = fmt.Sprintf("select top %v [ID],[imn_cn],[imn_en] from [imn] where %s and ID not in (select top %v ID from [imn] where %s order by ID asc) order by ID asc", req.Count, where_sql, (req.Index-1)*req.Count, where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_imn Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d imn
if err := rdRow.Scan(&d.ID, &d.Imn_cn, &d.Imn_en); err == nil {
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_imn scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_imn recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func del_imn(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("del_imn recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
var req del_imn_req
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Ids); i++ {
sqlstr := fmt.Sprintf(`DELETE FROM [imn] where ID=%d`, req.Ids[i].ID)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("del_imn Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("del_imn recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
//导出检测项目
func export_inspection(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("export_inspection recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var res export_file_resp
var csv_data [][]string
var filename string
filename = fmt.Sprintf(`./file/%v.csv`, beginTime)
f, err := os.Create(filename)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
var req get_ibase_req
var data []Inspection_info
var sqlstr string
var rdRow *sql.Rows
var where_sql string
var if_where bool
var size int
t_data := []string{}
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.P_name != "" {
where_sql += fmt.Sprintf(`[p_name] = '%s'`, req.P_name)
if_where = true
} else {
goto exit
}
if !if_where {
sqlstr = fmt.Sprintf("select [data] from [inspection_template]")
} else {
sqlstr = fmt.Sprintf("select [data] from [inspection_template] where %s ", where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("export_inspection Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var s string
if err := rdRow.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &data)
} else {
logs.Error("export_inspection scan Error", err.Error())
}
}
for i := 0; i < len(data); i++ {
if len(data[i].Result_contain) > size {
size = len(data[i].Result_contain)
}
}
t_data = []string{"检验项目中", "检验项目英", "检验要求中", "检验要求英", "检验方法中", "检验方法英", "结果类型"}
for i := 0; i < size; i++ {
t_data = append(t_data, []string{"结果(中)", "结果(英)"}...)
}
csv_data = append(csv_data, t_data)
for i := 0; i < len(data); i++ {
v := data[i]
t_data = []string{}
t_data = append(t_data, []string{v.Inspection_items_cn, v.Inspection_items_en, v.Inspection_rs_cn, v.Inspection_rs_en, v.Inspection_scheme_cn,
v.Inspection_scheme_en, v.Inspection_type}...)
for j := 0; j < len(v.Result_contain); j++ {
t_data = append(t_data, []string{v.Result_contain[j].Result_cn, v.Result_contain[j].Result_en}...)
}
csv_data = append(csv_data, t_data)
}
exit:
f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码
w := csv.NewWriter(f) //创建一个新的写入文件流
w.WriteAll(csv_data)
w.Flush()
res.FileId = fmt.Sprintf(`%v.csv`, beginTime)
jdata, _ := json.Marshal(res)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("export_inspection recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_inspection_op_history(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_inspection_op_history recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_ibase_req
var resp get_ibase_op_history_resp
var sqlstr string
var rdRow *sql.Rows
var err error
var where_sql string
var if_where bool
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.P_name != "" {
where_sql += fmt.Sprintf(`[p_name] = '%s'`, req.P_name)
if_where = true
}
if !if_where {
sqlstr = fmt.Sprintf("select [username],[p_name],[context],[op_time] from [inspection_op_history] order by ID desc")
} else {
sqlstr = fmt.Sprintf("select [username],[p_name],[context],[op_time] from [inspection_op_history] where %s order by ID desc", where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_inspection_op_history Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d ibase_op_history
if err := rdRow.Scan(&d.Username, &d.P_name, &d.Context, &d.Op_time); err == nil {
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_inspection_op_history scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_inspection_op_history recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func do_inspection_op_history(req ibase_op_history) {
req.Op_time = get_now_string()
sqlstr := fmt.Sprintf(`INSERT INTO [inspection_op_history] ([username],[p_name],[context],[op_time]) VALUES ('%s','%s','%s','%s')`, req.Username, req.P_name, req.Context, req.Op_time)
_, err := sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("do_inspection_op_history Exec Error:", err.Error())
}
}
func do_inspection_op_history_g() {
for {
select {
case v := <-g_inspection_op_ch:
do_inspection_op_history(v)
default:
time.Sleep(time.Second * 1)
}
}
}
func get_ibase_op_history(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_ibase_op_history recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_ibase_req
var resp get_ibase_op_history_resp
var sqlstr string
var rdRow *sql.Rows
var err error
var where_sql string
var if_where bool
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.P_name != "" {
where_sql += fmt.Sprintf(`[p_name] = '%s'`, req.P_name)
if_where = true
}
if !if_where {
sqlstr = fmt.Sprintf("select [username],[p_name],[context],[op_time] from [ibase_op_history] order by ID desc")
} else {
sqlstr = fmt.Sprintf("select [username],[p_name],[context],[op_time] from [ibase_op_history] where %s order by ID desc", where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ibase_op_history Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d ibase_op_history
if err := rdRow.Scan(&d.Username, &d.P_name, &d.Context, &d.Op_time); err == nil {
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_ibase_op_history scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_ibase_op_history recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func do_ibase_op_history(req ibase_op_history) {
req.Op_time = get_now_string()
sqlstr := fmt.Sprintf(`INSERT INTO [ibase_op_history] ([username],[p_name],[context],[op_time]) VALUES ('%s','%s','%s','%s')`, req.Username, req.P_name, req.Context, req.Op_time)
_, err := sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("do_ibase_op_history Exec Error:", err.Error())
}
}
func do_ibase_op_history_g() {
for {
select {
case v := <-g_ibase_op_ch:
do_ibase_op_history(v)
default:
time.Sleep(time.Second * 1)
}
}
}
func import_ibase(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("import_ibase recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var sqlstr string
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
var req import_ibase_req
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Data); i++ {
v := req.Data[i]
sqlstr = fmt.Sprintf(`DELETE FROM [ibase] where [p_name_cn] = '%s'`, v.P_name_cn)
sqlConn.Exec(sqlstr)
sqlstr = fmt.Sprintf(`INSERT INTO [ibase] ([p_name_cn],[p_name_en],[p_ibase_cn],[p_ibase_en] ,[p_categories],[p_sub]) VALUES ('%s','%s','%s','%s','%s','%s')`,
v.P_name_cn, v.P_name_en,
v.P_ibase_cn, v.P_ibase_en,
v.P_categories, v.P_sub)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("import_ibase Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
var d ibase_op_history
d.P_name = v.P_name_cn
d.Username = req.OpUser
d.Context = "新增"
g_ibase_op_ch <- d
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("import_ibase recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
//导出
func export_ibase(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("export_ibase recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var res export_file_resp
var csv_data [][]string
var filename string
filename = fmt.Sprintf(`./file/%v.csv`, beginTime)
f, err := os.Create(filename)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
var req get_ibase_req
var resp get_ibase_resp
var sqlstr string
var rdRow *sql.Rows
var where_sql string
var if_where bool
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.P_name != "" {
likeStr := "%" + req.P_name + "%"
where_sql += fmt.Sprintf(`[p_name_cn] like '%s'`, likeStr)
if_where = true
}
if !if_where {
sqlstr = fmt.Sprintf("select [ID],[p_name_cn],[p_name_en],[p_ibase_cn],[p_ibase_en] ,[p_categories],[p_sub] from [ibase] order by ID desc")
} else {
sqlstr = fmt.Sprintf("select [ID],[p_name_cn],[p_name_en],[p_ibase_cn],[p_ibase_en] ,[p_categories],[p_sub] from [ibase] where %s order by ID desc", where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ibase Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d ibase
if err := rdRow.Scan(&d.ID, &d.P_name_cn, &d.P_name_en, &d.P_ibase_cn, &d.P_ibase_en,
&d.P_categories, &d.P_sub); err == nil {
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_ibase scan Error", err.Error())
}
}
csv_data = append(csv_data, []string{"产品型号及名称(中)", "产品型号及名称(英)", "检验依据(中)", "检验依据(英)", "产品大类", "产品小类"})
for i := 0; i < len(resp.Data); i++ {
v := resp.Data[i]
csv_data = append(csv_data, []string{v.P_name_cn, v.P_name_en, v.P_ibase_cn, v.P_ibase_en, v.P_categories, v.P_sub})
}
exit:
f.WriteString("\xEF\xBB\xBF") // 写入一个UTF-8 BOM 防止中文乱码
w := csv.NewWriter(f) //创建一个新的写入文件流
w.WriteAll(csv_data)
w.Flush()
res.FileId = fmt.Sprintf(`%v.csv`, beginTime)
jdata, _ := json.Marshal(res)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("export_ibase recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_ibase(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_ibase recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_ibase_req
var resp get_ibase_resp
var sqlstr string
var rcnt int
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
var where_sql string
var if_where bool
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.P_name != "" {
likeStr := "%" + req.P_name + "%"
where_sql += fmt.Sprintf(`[p_name_cn] like '%s'`, likeStr)
if_where = true
}
if !if_where {
sqlstr = "select count(ID) from [ibase]"
} else {
sqlstr = fmt.Sprintf("select count(ID) from [ibase] where %s", where_sql)
}
fmt.Println(sqlstr)
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ibase query %s err:%v", sqlstr, err.Error()))
goto exit
}
defer cntRow.Close()
for cntRow.Next() {
if err = cntRow.Scan(&rcnt); err != nil {
logs.Error(fmt.Sprintf("get_ibase scan %s err:%v", sqlstr, err.Error()))
goto exit
}
}
resp.Total = rcnt
if !if_where {
sqlstr = fmt.Sprintf("select top %v [ID],[p_name_cn],[p_name_en],[p_ibase_cn],[p_ibase_en] ,[p_categories],[p_sub] from [ibase] where ID not in (select top %v ID from [ibase] order by ID desc) order by ID desc", req.Count, (req.Index-1)*req.Count)
} else {
sqlstr = fmt.Sprintf("select top %v [ID],[p_name_cn],[p_name_en],[p_ibase_cn],[p_ibase_en] ,[p_categories],[p_sub] from [ibase] where %s and ID not in (select top %v ID from [ibase] where %s order by ID desc) order by ID desc", req.Count, where_sql, (req.Index-1)*req.Count, where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ibase Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d ibase
if err := rdRow.Scan(&d.ID, &d.P_name_cn, &d.P_name_en, &d.P_ibase_cn, &d.P_ibase_en,
&d.P_categories, &d.P_sub); err == nil {
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_ibase scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_ibase recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func postibase(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("postibase recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var sqlstr string
var resp CommonResp
var id int
var row *sql.Rows
reqdata, _ := ioutil.ReadAll(request.Body)
var req postibase_req
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
row, err = sqlConn.Query(fmt.Sprintf(`select ID from [ibase] where [p_name_cn] = '%s'`, req.Data.P_name_cn))
if err != nil {
logs.Error(fmt.Sprintf("postibase get user cnt err:%v", err.Error()))
resp.Ret = -1
goto exit
}
for row.Next() {
if err = row.Scan(&id); err == nil {
}
}
row.Close()
if id == 0 { //add
sqlstr = fmt.Sprintf(`INSERT INTO [ibase] ([p_name_cn],[p_name_en],[p_ibase_cn],[p_ibase_en] ,[p_categories],[p_sub]) VALUES ('%s','%s','%s','%s','%s','%s')`,
req.Data.P_name_cn, req.Data.P_name_en,
req.Data.P_ibase_cn, req.Data.P_ibase_en,
req.Data.P_categories, req.Data.P_sub)
} else if id > 0 { //update
sqlstr = fmt.Sprintf(`UPDATE [ibase] SET [p_name_cn] = '%s',[p_name_en] = '%s',[p_ibase_cn] = '%s',[p_ibase_en] = '%s',[p_categories]='%s',[p_sub]='%s' WHERE ID=%d`,
req.Data.P_name_cn, req.Data.P_name_en,
req.Data.P_ibase_cn, req.Data.P_ibase_en,
req.Data.P_categories, req.Data.P_sub,
id)
}
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("postibase Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
resp.Ret = 0
exit:
if resp.Ret == 0 {
var d ibase_op_history
d.P_name = req.Data.P_name_cn
if id == 0 {
d.Username = req.OpUser
d.Context = "新增"
} else {
d.Username = req.OpUser
d.Context = "更新"
}
g_ibase_op_ch <- d
}
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("postibase recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func del_ibase(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("del_ibase recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
var req del_ibase_req
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Ids); i++ {
sqlstr := fmt.Sprintf(`DELETE FROM [ibase] where ID=%d`, req.Ids[i].ID)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("del_ibase Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("del_ibase recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_p_name_options(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_p_name_options recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_p_name_options_req
var resp get_p_name_options_resp
var sqlstr string
var rdRow *sql.Rows
var err error
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
sqlstr = fmt.Sprintf("select [p_name_cn] from [ibase] order by ID desc")
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_p_name_options Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var v string
if err := rdRow.Scan(&v); err == nil {
resp.Data = append(resp.Data, v)
} else {
logs.Error("get_p_name_options scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Println(string(jdata))
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_p_name_options recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func post_inspection(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("post_inspection recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var sqlstr string
var resp CommonResp
// var id int
// var row *sql.Rows
var js_data []byte
reqdata, _ := ioutil.ReadAll(request.Body)
var req post_inspection_req
json.Unmarshal(reqdata, &req)
fmt.Println(req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
sqlstr = fmt.Sprintf(`DELETE FROM [inspection_template] where [p_name] = '%s'`, req.P_name)
sqlConn.Exec(sqlstr)
js_data, _ = json.Marshal(req.Data)
sqlstr = fmt.Sprintf(`INSERT INTO [inspection_template] ([p_name],[data]) VALUES ('%s','%s')`,
req.P_name, string(js_data))
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("post_inspection Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
{
var d ibase_op_history
d.P_name = req.P_name
d.Username = req.OpUser
d.Context = "新增(修改)"
g_inspection_op_ch <- d
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("post_inspection recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_inspection(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_inspection recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_inspection_req
var resp get_inspection_resp
var sqlstr string
var rcnt int
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
var where_sql string
var if_where bool
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.P_name != "" {
likeStr := "%" + req.P_name + "%"
where_sql += fmt.Sprintf(`[p_name_cn] like '%s'`, likeStr)
if_where = true
}
if !if_where {
sqlstr = "select count(ID) from [inspection_template]"
} else {
sqlstr = fmt.Sprintf("select count(ID) from [inspection_template] where %s", where_sql)
}
fmt.Println(sqlstr)
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_inspection query %s err:%v", sqlstr, err.Error()))
goto exit
}
defer cntRow.Close()
for cntRow.Next() {
if err = cntRow.Scan(&rcnt); err != nil {
logs.Error(fmt.Sprintf("get_inspection scan %s err:%v", sqlstr, err.Error()))
goto exit
}
}
resp.Total = rcnt
if !if_where {
sqlstr = fmt.Sprintf("select top %v [ID],[p_name],[data] from [inspection_template] where ID not in (select top %v ID from [inspection_template] order by ID desc) order by ID desc", req.Count, (req.Index-1)*req.Count)
} else {
sqlstr = fmt.Sprintf("select top %v [ID],[p_name],[data] from [inspection_template] where %s and ID not in (select top %v ID from [inspection_template] where %s order by ID desc) order by ID desc", req.Count, where_sql, (req.Index-1)*req.Count, where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_inspection Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d get_inspection_resp_d
var s string
if err := rdRow.Scan(&d.ID, &d.P_name, &s); err == nil {
json.Unmarshal([]byte(s), &d.Data)
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_inspection scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_inspection recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func del_inspection(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("del_inspection recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
var req del_inspection_req
json.Unmarshal(reqdata, &req)
b := checkIsSysUserOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Ids); i++ {
sqlstr := fmt.Sprintf(`DELETE FROM [inspection_template] where ID=%d`, req.Ids[i].ID)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("del_inspection Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("del_inspection recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_basis_from_pname(p_name string) (basis ibase) {
var sqlstr string
var rdRow *sql.Rows
var err error
sqlstr = fmt.Sprintf("select [ID],[p_name_cn],[p_name_en],[p_ibase_cn],[p_ibase_en] from [ibase] where [p_name_cn]='%s'", p_name)
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_basis_from_pname Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d ibase
if err := rdRow.Scan(&d.ID, &d.P_name_cn, &d.P_name_en, &d.P_ibase_cn, &d.P_ibase_en); err == nil {
basis = d
} else {
logs.Error("get_basis_from_pname scan Error", err.Error())
}
}
exit:
return
}
func get_report_multi_template(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_report_multi_template recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_report_multi_template_req
var resp report_multi_template
var sqlstr string
var rdRow *sql.Rows
var err error
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
sqlstr = fmt.Sprintf("select [data] from [inspection_template] where [p_name]='%s'", req.P_name)
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_report_multi_template Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d []Inspection_info
var s string
if err := rdRow.Scan(&s); err == nil {
json.Unmarshal([]byte(s), &d)
resp.Time = time.Now().Format("2006-01-02")
resp.Inspector = req.OpUser
basis := get_basis_from_pname(req.P_name)
resp.P_name_cn = basis.P_name_cn
resp.P_name_en = basis.P_ibase_en
resp.P_ibase_cn = basis.P_ibase_cn
resp.P_ibase_en = basis.P_ibase_en
for i := 0; i < len(d); i++ {
v := d[i]
var tv Inspection_info_ex
tv.Inspection_items_cn = v.Inspection_items_cn
tv.Inspection_items_en = v.Inspection_items_en
tv.Inspection_rs_cn = v.Inspection_rs_cn
tv.Inspection_rs_en = v.Inspection_rs_en
tv.Inspection_scheme_cn = v.Inspection_scheme_cn
tv.Inspection_scheme_en = v.Inspection_scheme_en
tv.Inspection_type = v.Inspection_type
tv.Result_contain = append(tv.Result_contain, v.Result_contain...)
resp.Inspection_data = append(resp.Inspection_data, tv)
}
} else {
logs.Error("get_report_multi_template scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_report_multi_template recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_ledger(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("get_ledger recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var req get_ledger_req
var resp get_ledger_resp
var sqlstr string
var rcnt int
var cntRow *sql.Rows
var rdRow *sql.Rows
var err error
var where_sql string
var if_where bool
reqdata, _ := ioutil.ReadAll(request.Body)
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
goto exit
}
if req.P_name != "" {
likeStr := "%" + req.P_name + "%"
where_sql += fmt.Sprintf(`[p_name] like '%s'`, likeStr)
if_where = true
}
if req.Node != "" {
if if_where {
where_sql += fmt.Sprintf(` and [inspection_node] = '%s'`, req.Node)
} else {
where_sql += fmt.Sprintf(` [inspection_node] = '%s'`, req.Node)
}
if_where = true
}
if !if_where {
sqlstr = "select count(ID) from [inspection_report]"
} else {
sqlstr = fmt.Sprintf("select count(ID) from [inspection_report] where %s", where_sql)
}
fmt.Println(sqlstr)
cntRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ledger query %s err:%v", sqlstr, err.Error()))
goto exit
}
defer cntRow.Close()
for cntRow.Next() {
if err = cntRow.Scan(&rcnt); err != nil {
logs.Error(fmt.Sprintf("get_ledger scan %s err:%v", sqlstr, err.Error()))
goto exit
}
}
resp.Total = rcnt
if !if_where {
sqlstr = fmt.Sprintf("select top %v [ID],[time],[p_name],[inspection_node],[serial],[fin_result],[non_conformity_treatment],[inspector],[auditor],[file],[data],[file_en] from [inspection_report] where ID not in (select top %v ID from [inspection_report] order by ID desc) order by ID desc", req.Count, (req.Index-1)*req.Count)
} else {
sqlstr = fmt.Sprintf("select top %v [ID],[time],[p_name],[inspection_node],[serial],[fin_result],[non_conformity_treatment],[inspector],[auditor],[file],[data],[file_en] from [inspection_report] where %s and ID not in (select top %v ID from [inspection_report] where %s order by ID desc) order by ID desc", req.Count, where_sql, (req.Index-1)*req.Count, where_sql)
}
fmt.Println(sqlstr)
rdRow, err = sqlConn.Query(sqlstr)
if err != nil {
logs.Error(fmt.Sprintf("get_ledger Query err:%v", err.Error()))
goto exit
}
defer rdRow.Close()
for rdRow.Next() {
var d get_ledger_resp_d
if err := rdRow.Scan(&d.ID, &d.Time, &d.P_name_cn, &d.Inspection_node, &d.Serial, &d.Fin_result, &d.Non_conformity_treatment, &d.Inspector, &d.Auditor, &d.File, &d.Data,
&d.File_en); err == nil {
resp.Data = append(resp.Data, d)
} else {
logs.Error("get_ledger scan Error", err.Error())
}
}
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("get_ledger recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func del_ledger(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("del_ledger recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var resp CommonResp
reqdata, _ := ioutil.ReadAll(request.Body)
var req del_ledger_req
json.Unmarshal(reqdata, &req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
for i := 0; i < len(req.Ids); i++ {
sqlstr := fmt.Sprintf(`DELETE FROM [inspection_report] where ID=%d`, req.Ids[i].ID)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("del_ledger Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("del_ledger recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func post_report_m(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("post_report recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var sqlstr string
var resp CommonResp
// var id int
// var row *sql.Rows
var js_data []byte
var data []report_multi_template
var serials []string
reqdata, _ := ioutil.ReadAll(request.Body)
var req post_report_req
json.Unmarshal(reqdata, &req)
fmt.Println(req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
serials = strings.Split(req.Data.Serial_sets, ",")
for i := 0; i < len(serials); i++ {
v := serials[i]
sqlstr = fmt.Sprintf(`DELETE FROM [inspection_report] where [p_name] = '%s' and [serial]='%s'`, req.Data.P_name_cn, v)
sqlConn.Exec(sqlstr)
}
for i := 0; i < len(serials); i++ {
var d report_multi_template = req.Data
d.Inspection_data = []Inspection_info_ex{}
d.Inspection_data = append(d.Inspection_data, req.Data.Inspection_data...)
d.Serial_sets = serials[i]
for j := 0; j < len(req.Data.Inspection_data); j++ {
v := req.Data.Inspection_data[j]
fmt.Println("-", v.Result)
if v.Result != "" {
results := strings.Split(v.Result, ",")
if len(results) > 0 && len(results) != len(serials) {
fmt.Println(results)
resp.Ret = 1
goto exit
} else if len(results) > 0 && len(results) == len(serials) {
d.Inspection_data[j].Result = results[i]
}
}
var if_exist bool
if v.Serial_sets != "" {
non_serials := strings.Split(v.Serial_sets, ",")
for k := 0; k < len(non_serials); k++ {
if d.Serial_sets == non_serials[k] {
if_exist = true
break
}
}
}
if if_exist {
d.Inspection_data[j].If_ok = "×"
} else {
d.Inspection_data[j].If_ok = "√"
}
}
data = append(data, d)
}
for i := 0; i < len(data); i++ {
v := data[i]
js_data, _ = json.Marshal(data[i])
sqlstr = fmt.Sprintf(`INSERT INTO [inspection_report]
([time]
,[p_name]
,[inspection_node]
,[serial]
,[fin_result]
,[non_conformity_treatment]
,[inspector]
,[auditor]
,[data]
)
VALUES
('%s','%s','%s','%s','%s','%s','%s','%s','%s')`,
v.Time, v.P_name_cn, v.Inspection_node, v.Serial_sets, v.Fin_result,
v.Non_conformity_treatment, v.Inspector, v.Auditor, string(js_data))
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("post_report Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
g_report_data <- v
}
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("post_report recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func post_report_s(response http.ResponseWriter, request *http.Request) {
beginTime := time.Now().UnixNano()
fmt.Println("post_report_s recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var err error
var sqlstr string
var resp CommonResp
// var id int
// var row *sql.Rows
var js_data []byte
reqdata, _ := ioutil.ReadAll(request.Body)
var req post_report_req
json.Unmarshal(reqdata, &req)
fmt.Println(req)
b := checkUserIfOnline(req.OpUser, req.OpUserUuid)
if !b {
resp.Ret = -1
goto exit
}
if req.Data.Auditor != "" {
req.Data.Audit_time = time.Now().Format("2006-01-02")
}
sqlstr = fmt.Sprintf(`DELETE FROM [inspection_report] where [p_name] = '%s' and [serial]='%s'`, req.Data.P_name_cn, req.Data.Serial_sets)
sqlConn.Exec(sqlstr)
js_data, _ = json.Marshal(req.Data)
sqlstr = fmt.Sprintf(`INSERT INTO [inspection_report]
([time]
,[p_name]
,[inspection_node]
,[serial]
,[fin_result]
,[non_conformity_treatment]
,[inspector]
,[auditor]
,[data]
)
VALUES
('%s','%s','%s','%s','%s','%s','%s','%s','%s')`,
req.Data.Time, req.Data.P_name_cn, req.Data.Inspection_node, req.Data.Serial_sets, req.Data.Fin_result,
req.Data.Non_conformity_treatment, req.Data.Inspector, req.Data.Auditor, string(js_data))
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("post_report_s Exec Error:", err.Error())
resp.Ret = -1
goto exit
}
resp.Ret = 0
exit:
if resp.Ret == 0 {
g_report_data <- req.Data
}
jdata, _ := json.Marshal(resp)
fmt.Fprintf(response, string(jdata))
endTime := time.Now().UnixNano()
fmt.Println(fmt.Sprintf("post_report_s recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func get_pdf_cn_pagesize(data report_multi_template) (page_cnt int) {
//W: 595, H: 842
page_W := gopdf.PageSizeA4Landscape.W
page_H := gopdf.PageSizeA4Landscape.H
pdf := gopdf.GoPdf{}
pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4Landscape})
pdf.AddPage()
err := pdf.AddTTFFont("simfang", "./simfang.ttf")
if err != nil {
logs.Error(err.Error())
return
}
err = pdf.AddTTFFont("wr", "./微软雅黑.ttf")
if err != nil {
logs.Error(err.Error())
return
}
var margin_top float64 = 2.54 * (page_H / float64(29.7))
var margin_left float64 = 1.91 * (page_W / float64(21))
var span float64 = 20
// var h_span float64 = 150
page_context_H := page_H - margin_top
var one_cm float64 = page_W / float64(21)
page_F_x := page_W/2 - (0.2 * one_cm)
page_F_y := gopdf.PageSizeA4Landscape.H - (margin_top / 2)
pdf.SetFont("simfang", "", 22)
var option gopdf.CellOption
option.Align = gopdf.Center
pdf.SetXY(0, margin_top)
pdf.CellWithOption(&gopdf.Rect{H: 30, W: page_W}, "检验记录报告", option)
//cal total pagenum
var cur_page int = 1
var total_page int = 1
fmt.Println("报告总页码:", total_page)
pdf.SetFont("simfang", "", 14)
var base float64 = margin_top + 45
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`产品型号及名称:%s`, data.P_name_cn))
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`检验依据:%s`, data.P_ibase_cn))
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`检测时间:%s`, data.Time))
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`检验节点:%s`, data.Inspection_node))
if base+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base0 := margin_left
base1 := margin_left + 150
base2 := margin_left + 300
base3 := margin_left + 450
base4 := margin_left + 550
base5 := margin_left + 600
base6 := margin_left + 700
base += span
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base1, base, base1, base+span)
pdf.Line(base2, base, base2, base+span)
pdf.Line(base3, base, base3, base+span)
pdf.Line(base4, base, base4, base+span)
pdf.Line(base5, base, base5, base+span)
pdf.Line(base6, base, base6, base+span)
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Center
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "检验项目", option1)
pdf.SetXY(base1, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base2 - base1}, "检验要求", option1)
pdf.SetXY(base2, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base3 - base2}, "检验方法", option1)
pdf.SetXY(base3, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base4 - base3}, "结果", option1)
pdf.SetXY(base4, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base4}, "判定", option1)
pdf.SetXY(base5, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base6 - base5}, "附件", option1)
base += span
pdf.Line(margin_left, base, base6, base)
cnt := 0
cur_item := ""
for i := 0; i < len(data.Inspection_data); i++ {
v := data.Inspection_data[i]
if v.Inspection_items_cn != cur_item {
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
cnt++
cur_item = v.Inspection_items_cn
//pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base6, base, base6, base+span)
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetFont("wr", "", 13)
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, fmt.Sprintf(`%d.%s`, cnt, v.Inspection_items_cn), option1)
base += span
pdf.Line(margin_left, base, base6, base)
}
pdf.SetFont("simfang", "", 14)
var max_h int = 1
context1, _ := pdf.SplitTextWithWordWrap(v.Inspection_rs_cn, base2-base0)
if len(context1) > int(max_h) {
max_h = len(context1)
}
context2, _ := pdf.SplitTextWithWordWrap(v.Inspection_scheme_cn, base3-base2)
if len(context2) > int(max_h) {
max_h = len(context2)
}
context3, _ := pdf.SplitTextWithWordWrap(v.Attach_file, base6-base5)
fmt.Println(context3, len(context3))
if len(context3) > int(max_h) {
max_h = len(context3)
}
var context1_base float64 = (float64(max_h-len(context1))/2)*span + base
var context2_base float64 = (float64(max_h-len(context2))/2)*span + base
var context3_base float64 = (float64(max_h-len(context3))/2)*span + base
if base+(float64(max_h)*span) > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
//pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+(float64(max_h)*span))
pdf.Line(base2, base, base2, base+(float64(max_h)*span))
pdf.Line(base3, base, base3, base+(float64(max_h)*span))
pdf.Line(base4, base, base4, base+(float64(max_h)*span))
pdf.Line(base5, base, base5, base+(float64(max_h)*span))
pdf.Line(base6, base, base6, base+(float64(max_h)*span))
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Center
for j := 0; j < len(context1); j++ {
pdf.SetXY(base0, context1_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base2 - base0}, context1[j], option1)
}
for j := 0; j < len(context2); j++ {
pdf.SetXY(base2, context2_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base3 - base2}, context2[j], option1)
}
pdf.SetXY(base3, base)
pdf.CellWithOption(&gopdf.Rect{H: float64(max_h) * span, W: base4 - base3}, v.Result, option1)
pdf.SetXY(base4, base)
pdf.CellWithOption(&gopdf.Rect{H: float64(max_h) * span, W: base5 - base4}, v.If_ok, option1)
for j := 0; j < len(context3); j++ {
pdf.SetXY(base5, context3_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base6 - base5}, context3[j], option1)
}
base += (float64(max_h) * span)
pdf.Line(margin_left, base, base6, base)
}
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base5, base, base5, base+span)
pdf.Line(base6, base, base6, base+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base0}, "备注:□为定性判断,合格√,不合格× ⊙为定量判断,记录数据", option1)
base += span
pdf.Line(margin_left, base, base6, base)
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base1, base, base1, base+span)
pdf.Line(base5, base, base5, base+span)
pdf.Line(base6, base, base6, base+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "最终结果(合格/不合格)", option1)
pdf.SetXY(base1, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base1}, data.Fin_result, option1)
base += span
pdf.Line(margin_left, base, base6, base)
//不合格处理方式
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base1, base, base1, base+span)
pdf.Line(base5, base, base5, base+span)
pdf.Line(base6, base, base6, base+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "不合格处理方式", option1)
pdf.SetXY(base1, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base1}, data.Non_conformity_treatment, option1)
base += span
pdf.Line(margin_left, base, base6, base)
//审核人
if base+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span+span)
pdf.Line(base5, base, base5, base+span+span)
pdf.Line(base6, base, base6, base+span+span)
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`检验员:%s`, data.Inspector), option1)
pdf.SetXY(base0+200, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`审核员:%s`, data.Auditor), option1)
pdf.SetXY(base0, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`日 期:%s`, data.Time), option1)
pdf.SetXY(base0+200, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`日 期:%s`, data.Time), option1)
base += span + span
pdf.Line(margin_left, base, base6, base)
for i := 0; i < len(data.Inspection_data); i++ {
v := data.Inspection_data[i]
fmt.Println(v.Attach_file)
index := strings.LastIndex(v.Attach_file, ".")
if index <= 0 {
continue
}
file_type := v.Attach_file[index:]
fmt.Println(file_type)
if file_type == ".txt" {
fileHandle, err := os.OpenFile(fmt.Sprintf(`./upload_report/%s`, v.Attach_file), os.O_RDONLY, 0666)
if err != nil {
continue
}
reader := bufio.NewReader(fileHandle)
var results []string
// 按行处理txt
for {
line, _, err := reader.ReadLine()
if err == io.EOF {
break
}
reader := transform.NewReader(bytes.NewReader(line), simplifiedchinese.GBK.NewDecoder())
d, e := ioutil.ReadAll(reader)
if e != nil {
continue
}
results = append(results, string(d))
}
fileHandle.Close()
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`附件:%s`, v.Attach_file))
for k := 0; k < len(results); k++ {
context_result, _ := pdf.SplitTextWithWordWrap(results[k], page_W-margin_left-margin_left)
for z := 0; z < len(context_result); z++ {
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`%s`, context_result[z]))
}
}
} else if file_type == ".jpeg" || file_type == ".png" || file_type == ".jpg" {
if base+((page_H-span-span)/2) > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Image(fmt.Sprintf(`./upload_report/%s`, v.Attach_file), margin_left, base, &gopdf.Rect{H: (page_H - span - span) / 2, W: page_W / 2})
base += ((page_H - span - span) / 2)
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`附件:%s`, v.Attach_file))
}
}
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
page_cnt = cur_page
return
}
func Utf8ToGbk(s []byte) ([]byte, error) {
reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewEncoder())
d, e := ioutil.ReadAll(reader)
if e != nil {
return nil, e
}
return d, nil
}
func create_pdf_cn(data report_multi_template) {
//W: 595, H: 842
page_W := gopdf.PageSizeA4Landscape.W
page_H := gopdf.PageSizeA4Landscape.H
pdf := gopdf.GoPdf{}
pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4Landscape})
pdf.AddPage()
err := pdf.AddTTFFont("simfang", "./simfang.ttf")
if err != nil {
logs.Error(err.Error())
return
}
err = pdf.AddTTFFont("wr", "./微软雅黑.ttf")
if err != nil {
logs.Error(err.Error())
return
}
var margin_top float64 = 2.54 * (page_H / float64(29.7))
var margin_left float64 = 1.91 * (page_W / float64(21))
var span float64 = 20
// var h_span float64 = 150
page_context_H := page_H - margin_top
var one_cm float64 = page_W / float64(21)
page_F_x := page_W/2 - (0.2 * one_cm)
page_F_y := gopdf.PageSizeA4Landscape.H - (margin_top / 2)
pdf.SetFont("simfang", "", 22)
var option gopdf.CellOption
option.Align = gopdf.Center
pdf.SetXY(0, margin_top)
pdf.CellWithOption(&gopdf.Rect{H: 30, W: page_W}, "检验记录报告", option)
//cal total pagenum
var cur_page int = 1
var total_page int = 1
total_page = get_pdf_cn_pagesize(data)
fmt.Println("报告总页码:", total_page)
pdf.SetFont("simfang", "", 14)
var base float64 = margin_top + 45
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`产品型号及名称:%s`, data.P_name_cn))
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`检验依据:%s`, data.P_ibase_cn))
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`检测时间:%s`, data.Time))
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`检验节点:%s`, data.Inspection_node))
if base+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base0 := margin_left
base1 := margin_left + 150
base2 := margin_left + 300
base3 := margin_left + 450
base4 := margin_left + 550
base5 := margin_left + 600
base6 := margin_left + 700
base += span
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base1, base, base1, base+span)
pdf.Line(base2, base, base2, base+span)
pdf.Line(base3, base, base3, base+span)
pdf.Line(base4, base, base4, base+span)
pdf.Line(base5, base, base5, base+span)
pdf.Line(base6, base, base6, base+span)
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Center
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "检验项目", option1)
pdf.SetXY(base1, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base2 - base1}, "检验要求", option1)
pdf.SetXY(base2, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base3 - base2}, "检验方法", option1)
pdf.SetXY(base3, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base4 - base3}, "结果", option1)
pdf.SetXY(base4, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base4}, "判定", option1)
pdf.SetXY(base5, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base6 - base5}, "附件", option1)
base += span
pdf.Line(margin_left, base, base6, base)
cnt := 0
cur_item := ""
for i := 0; i < len(data.Inspection_data); i++ {
v := data.Inspection_data[i]
if v.Inspection_items_cn != cur_item {
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
cnt++
cur_item = v.Inspection_items_cn
//pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base6, base, base6, base+span)
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetFont("wr", "", 13)
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, fmt.Sprintf(`%d.%s`, cnt, v.Inspection_items_cn), option1)
base += span
pdf.Line(margin_left, base, base6, base)
}
pdf.SetFont("simfang", "", 14)
var max_h int = 1
context1, _ := pdf.SplitTextWithWordWrap(v.Inspection_rs_cn, base2-base0)
if len(context1) > int(max_h) {
max_h = len(context1)
}
context2, _ := pdf.SplitTextWithWordWrap(v.Inspection_scheme_cn, base3-base2)
if len(context2) > int(max_h) {
max_h = len(context2)
}
context3, _ := pdf.SplitTextWithWordWrap(v.Attach_file, base6-base5)
fmt.Println(context3, len(context3))
if len(context3) > int(max_h) {
max_h = len(context3)
}
var context1_base float64 = (float64(max_h-len(context1))/2)*span + base
var context2_base float64 = (float64(max_h-len(context2))/2)*span + base
var context3_base float64 = (float64(max_h-len(context3))/2)*span + base
if base+(float64(max_h)*span) > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
//pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+(float64(max_h)*span))
pdf.Line(base2, base, base2, base+(float64(max_h)*span))
pdf.Line(base3, base, base3, base+(float64(max_h)*span))
pdf.Line(base4, base, base4, base+(float64(max_h)*span))
pdf.Line(base5, base, base5, base+(float64(max_h)*span))
pdf.Line(base6, base, base6, base+(float64(max_h)*span))
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Center
for j := 0; j < len(context1); j++ {
pdf.SetXY(base0, context1_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base2 - base0}, context1[j], option1)
}
for j := 0; j < len(context2); j++ {
pdf.SetXY(base2, context2_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base3 - base2}, context2[j], option1)
}
pdf.SetXY(base3, base)
pdf.CellWithOption(&gopdf.Rect{H: float64(max_h) * span, W: base4 - base3}, v.Result, option1)
pdf.SetXY(base4, base)
pdf.CellWithOption(&gopdf.Rect{H: float64(max_h) * span, W: base5 - base4}, v.If_ok, option1)
for j := 0; j < len(context3); j++ {
pdf.SetXY(base5, context3_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base6 - base5}, context3[j], option1)
}
base += (float64(max_h) * span)
pdf.Line(margin_left, base, base6, base)
}
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base5, base, base5, base+span)
pdf.Line(base6, base, base6, base+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base0}, "备注:□为定性判断,合格√,不合格× ⊙为定量判断,记录数据", option1)
base += span
pdf.Line(margin_left, base, base6, base)
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base1, base, base1, base+span)
pdf.Line(base5, base, base5, base+span)
pdf.Line(base6, base, base6, base+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "最终结果(合格/不合格)", option1)
pdf.SetXY(base1, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base1}, data.Fin_result, option1)
base += span
pdf.Line(margin_left, base, base6, base)
//不合格处理方式
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base1, base, base1, base+span)
pdf.Line(base5, base, base5, base+span)
pdf.Line(base6, base, base6, base+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "不合格处理方式", option1)
pdf.SetXY(base1, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base1}, data.Non_conformity_treatment, option1)
base += span
pdf.Line(margin_left, base, base6, base)
//审核人
if base+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span+span)
pdf.Line(base5, base, base5, base+span+span)
pdf.Line(base6, base, base6, base+span+span)
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`检验员:%s`, data.Inspector), option1)
pdf.SetXY(base0+200, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`审核员:%s`, data.Auditor), option1)
pdf.SetXY(base0, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`日 期:%s`, data.Time), option1)
pdf.SetXY(base0+200, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`日 期:%s`, data.Audit_time), option1)
base += span + span
pdf.Line(margin_left, base, base6, base)
for i := 0; i < len(data.Inspection_data); i++ {
v := data.Inspection_data[i]
fmt.Println(v.Attach_file)
index := strings.LastIndex(v.Attach_file, ".")
if index <= 0 {
continue
}
file_type := v.Attach_file[index:]
fmt.Println(file_type)
if file_type == ".txt" {
fileHandle, err := os.OpenFile(fmt.Sprintf(`./upload_report/%s`, v.Attach_file), os.O_RDONLY, 0666)
if err != nil {
continue
}
reader := bufio.NewReader(fileHandle)
var results []string
// 按行处理txt
for {
line, _, err := reader.ReadLine()
if err == io.EOF {
break
}
reader := transform.NewReader(bytes.NewReader(line), simplifiedchinese.GBK.NewDecoder())
d, e := ioutil.ReadAll(reader)
if e != nil {
continue
}
results = append(results, string(d))
}
fileHandle.Close()
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`附件:%s`, v.Attach_file))
for k := 0; k < len(results); k++ {
context_result, _ := pdf.SplitTextWithWordWrap(results[k], page_W-margin_left-margin_left)
for z := 0; z < len(context_result); z++ {
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`%s`, context_result[z]))
}
}
} else if file_type == ".jpeg" || file_type == ".png" || file_type == ".jpg" {
if base+((page_H-span-span)/2) > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Image(fmt.Sprintf(`./upload_report/%s`, v.Attach_file), margin_left, base, &gopdf.Rect{H: (page_H - span - span) / 2, W: page_W / 2})
base += ((page_H - span - span) / 2)
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`附件:%s`, v.Attach_file))
}
}
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
//save
beginTime := time.Now().UnixNano()
pdf.WritePdf(fmt.Sprintf(`./upload_report_file/%v.pdf`, beginTime))
update_report_file(data, fmt.Sprintf(`%v.pdf`, beginTime), "")
//filename := strconv.FormatInt(beginTime, 10)
return
}
func get_pdf_en_pagesize(data report_multi_template) (page_cnt int) {
//W: 595, H: 842
page_W := gopdf.PageSizeA4Landscape.W
page_H := gopdf.PageSizeA4Landscape.H
pdf := gopdf.GoPdf{}
pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4Landscape})
pdf.AddPage()
err := pdf.AddTTFFont("simfang", "./simfang.ttf")
if err != nil {
logs.Error(err.Error())
return
}
err = pdf.AddTTFFont("wr", "./微软雅黑.ttf")
if err != nil {
logs.Error(err.Error())
return
}
var margin_top float64 = 2.54 * (page_H / float64(29.7))
var margin_left float64 = 1.91 * (page_W / float64(21))
var span float64 = 20
// var h_span float64 = 150
page_context_H := page_H - margin_top
var one_cm float64 = page_W / float64(21)
page_F_x := page_W/2 - (0.2 * one_cm)
page_F_y := gopdf.PageSizeA4Landscape.H - (margin_top / 2)
pdf.SetFont("simfang", "", 22)
var option gopdf.CellOption
option.Align = gopdf.Center
pdf.SetXY(0, margin_top)
pdf.CellWithOption(&gopdf.Rect{H: 30, W: page_W}, "Inspection Record Report", option)
//cal total pagenum
var cur_page int = 1
var total_page int = 1
//total_page = get_pdf_cn_pagesize(data)
fmt.Println("报告总页码:", total_page)
pdf.SetFont("simfang", "", 14)
var base float64 = margin_top + 45
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`Part Number & Part Name%s`, data.P_name_cn))
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`Inspection referred document%s`, data.P_ibase_cn))
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`Inspection time%s`, data.Time))
base += span
pdf.SetXY(margin_left, base)
if data.Inspection_node == "入库" {
pdf.Text(fmt.Sprintf(`Inspection stepIn stock`))
} else if data.Inspection_node == "出库" {
pdf.Text(fmt.Sprintf(`Inspection stepOut of stock`))
} else if data.Inspection_node == "退库" {
pdf.Text(fmt.Sprintf(`Inspection stepReturn to stock`))
} else {
pdf.Text(fmt.Sprintf(`Inspection step`))
}
if base+span+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base0 := margin_left
base1 := margin_left + 150
base2 := margin_left + 300
base3 := margin_left + 450
base4 := margin_left + 580
base5 := margin_left + 660
base6 := margin_left + 760
base += span
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span+span)
pdf.Line(base1, base, base1, base+span+span)
pdf.Line(base2, base, base2, base+span+span)
pdf.Line(base3, base, base3, base+span+span)
pdf.Line(base4, base, base4, base+span+span)
pdf.Line(base5, base, base5, base+span+span)
pdf.Line(base6, base, base6, base+span+span)
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Center
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "Inspection item", option1)
pdf.SetXY(base1, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base2 - base1}, "Inspection/Testing", option1)
pdf.SetXY(base1, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base2 - base1}, "Criteria", option1)
pdf.SetXY(base2, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base3 - base2}, "Inspection method", option1)
pdf.SetXY(base3, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base4 - base3}, "Inspection result", option1)
pdf.SetXY(base4, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base4}, "Judgment", option1)
pdf.SetXY(base5, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base6 - base5}, "Remark", option1)
base += span + span
pdf.Line(margin_left, base, base6, base)
cnt := 0
cur_item := ""
for i := 0; i < len(data.Inspection_data); i++ {
v := data.Inspection_data[i]
if v.Inspection_items_en != cur_item {
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
cnt++
cur_item = v.Inspection_items_en
//pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base6, base, base6, base+span)
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetFont("wr", "", 13)
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, fmt.Sprintf(`%d.%s`, cnt, v.Inspection_items_en), option1)
base += span
pdf.Line(margin_left, base, base6, base)
}
pdf.SetFont("simfang", "", 14)
var max_h int = 1
context1, _ := pdf.SplitTextWithWordWrap(v.Inspection_rs_en, base2-base0)
if len(context1) > int(max_h) {
max_h = len(context1)
}
context2, _ := pdf.SplitTextWithWordWrap(v.Inspection_scheme_en, base3-base2)
if len(context2) > int(max_h) {
max_h = len(context2)
}
context3, _ := pdf.SplitTextWithWordWrap(v.Attach_file, base6-base5)
fmt.Println(context3, len(context3))
if len(context3) > int(max_h) {
max_h = len(context3)
}
var context1_base float64 = (float64(max_h-len(context1))/2)*span + base
var context2_base float64 = (float64(max_h-len(context2))/2)*span + base
var context3_base float64 = (float64(max_h-len(context3))/2)*span + base
if base+(float64(max_h)*span) > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
//pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+(float64(max_h)*span))
pdf.Line(base2, base, base2, base+(float64(max_h)*span))
pdf.Line(base3, base, base3, base+(float64(max_h)*span))
pdf.Line(base4, base, base4, base+(float64(max_h)*span))
pdf.Line(base5, base, base5, base+(float64(max_h)*span))
pdf.Line(base6, base, base6, base+(float64(max_h)*span))
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Center
for j := 0; j < len(context1); j++ {
pdf.SetXY(base0, context1_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base2 - base0}, context1[j], option1)
}
for j := 0; j < len(context2); j++ {
pdf.SetXY(base2, context2_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base3 - base2}, context2[j], option1)
}
pdf.SetXY(base3, base)
pdf.CellWithOption(&gopdf.Rect{H: float64(max_h) * span, W: base4 - base3}, v.Result, option1)
pdf.SetXY(base4, base)
pdf.CellWithOption(&gopdf.Rect{H: float64(max_h) * span, W: base5 - base4}, v.If_ok, option1)
for j := 0; j < len(context3); j++ {
pdf.SetXY(base5, context3_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base6 - base5}, context3[j], option1)
}
base += (float64(max_h) * span)
pdf.Line(margin_left, base, base6, base)
}
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base5, base, base5, base+span)
pdf.Line(base6, base, base6, base+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base0}, "Remark□Attribute judgment, pass √, fail × ⊙ measurement judgment, record data.", option1)
base += span
pdf.Line(margin_left, base, base6, base)
if base+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span+span)
pdf.Line(base1, base, base1, base+span+span)
pdf.Line(base5, base, base5, base+span+span)
pdf.Line(base6, base, base6, base+span+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "Final judgment", option1)
pdf.SetXY(base0, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "(pass/fail)", option1)
pdf.SetXY(base1, base)
if data.Fin_result == "合格" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "pass", option1)
} else if data.Fin_result == "不合格" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "fail", option1)
} else {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "", option1)
}
base += span + span
pdf.Line(margin_left, base, base6, base)
//不合格处理方式
if base+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span+span)
pdf.Line(base1, base, base1, base+span+span)
pdf.Line(base5, base, base5, base+span+span)
pdf.Line(base6, base, base6, base+span+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "Non-conformity", option1)
pdf.SetXY(base0, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "treatment", option1)
pdf.SetXY(base1, base)
if data.Non_conformity_treatment == "退货或换货" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "Return or Exchange", option1)
} else if data.Non_conformity_treatment == "返工返修" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "Rework and repair", option1)
} else if data.Non_conformity_treatment == "报废" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "Scrap", option1)
} else if data.Non_conformity_treatment == "其他" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "Others", option1)
}
base += span + span
pdf.Line(margin_left, base, base6, base)
//审核人
if base+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span+span)
pdf.Line(base5, base, base5, base+span+span)
pdf.Line(base6, base, base6, base+span+span)
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`Inspected by%s`, data.Inspector), option1)
pdf.SetXY(base0+200, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`Checked by%s`, data.Auditor), option1)
pdf.SetXY(base0, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`Date%s`, data.Time), option1)
pdf.SetXY(base0+200, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`Date%s`, data.Time), option1)
base += span + span
pdf.Line(margin_left, base, base6, base)
for i := 0; i < len(data.Inspection_data); i++ {
v := data.Inspection_data[i]
fmt.Println(v.Attach_file)
index := strings.LastIndex(v.Attach_file, ".")
if index <= 0 {
continue
}
file_type := v.Attach_file[index:]
fmt.Println(file_type)
if file_type == ".txt" {
fileHandle, err := os.OpenFile(fmt.Sprintf(`./upload_report/%s`, v.Attach_file), os.O_RDONLY, 0666)
if err != nil {
continue
}
reader := bufio.NewReader(fileHandle)
var results []string
// 按行处理txt
for {
line, _, err := reader.ReadLine()
if err == io.EOF {
break
}
reader := transform.NewReader(bytes.NewReader(line), simplifiedchinese.GBK.NewDecoder())
d, e := ioutil.ReadAll(reader)
if e != nil {
continue
}
results = append(results, string(d))
}
fileHandle.Close()
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`attach file%s`, v.Attach_file))
for k := 0; k < len(results); k++ {
context_result, _ := pdf.SplitTextWithWordWrap(results[k], page_W-margin_left-margin_left)
for z := 0; z < len(context_result); z++ {
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`%s`, context_result[z]))
}
}
} else if file_type == ".jpeg" || file_type == ".png" || file_type == ".jpg" {
base += span
if base > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
if base+((page_H-span-span)/2) > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Image(fmt.Sprintf(`./upload_report/%s`, v.Attach_file), margin_left, base, &gopdf.Rect{H: (page_H - span - span) / 2, W: page_W / 2})
base += ((page_H - span - span) / 2)
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`attach file%s`, v.Attach_file))
}
}
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
page_cnt = cur_page
return
}
func create_pdf_en(data report_multi_template) {
//W: 595, H: 842
page_W := gopdf.PageSizeA4Landscape.W
page_H := gopdf.PageSizeA4Landscape.H
pdf := gopdf.GoPdf{}
pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4Landscape})
pdf.AddPage()
err := pdf.AddTTFFont("simfang", "./simfang.ttf")
if err != nil {
logs.Error(err.Error())
return
}
err = pdf.AddTTFFont("wr", "./微软雅黑.ttf")
if err != nil {
logs.Error(err.Error())
return
}
var margin_top float64 = 2.54 * (page_H / float64(29.7))
var margin_left float64 = 1.91 * (page_W / float64(21))
var span float64 = 20
// var h_span float64 = 150
page_context_H := page_H - margin_top
var one_cm float64 = page_W / float64(21)
page_F_x := page_W/2 - (0.2 * one_cm)
page_F_y := gopdf.PageSizeA4Landscape.H - (margin_top / 2)
pdf.SetFont("simfang", "", 22)
var option gopdf.CellOption
option.Align = gopdf.Center
pdf.SetXY(0, margin_top)
pdf.CellWithOption(&gopdf.Rect{H: 30, W: page_W}, "Inspection Record Report", option)
//cal total pagenum
var cur_page int = 1
var total_page int = 1
total_page = get_pdf_en_pagesize(data)
fmt.Println("报告总页码:", total_page)
pdf.SetFont("simfang", "", 14)
var base float64 = margin_top + 45
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`Part Number & Part Name%s`, data.P_name_en))
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`Inspection referred document%s`, data.P_ibase_en))
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`Inspection time%s`, data.Time))
base += span
pdf.SetXY(margin_left, base)
if data.Inspection_node == "入库" {
pdf.Text(fmt.Sprintf(`Inspection stepIn stock`))
} else if data.Inspection_node == "出库" {
pdf.Text(fmt.Sprintf(`Inspection stepOut of stock`))
} else if data.Inspection_node == "退库" {
pdf.Text(fmt.Sprintf(`Inspection stepReturn to stock`))
} else {
pdf.Text(fmt.Sprintf(`Inspection step`))
}
if base+span+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base0 := margin_left
base1 := margin_left + 150
base2 := margin_left + 300
base3 := margin_left + 450
base4 := margin_left + 580
base5 := margin_left + 660
base6 := margin_left + 760
base += span
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span+span)
pdf.Line(base1, base, base1, base+span+span)
pdf.Line(base2, base, base2, base+span+span)
pdf.Line(base3, base, base3, base+span+span)
pdf.Line(base4, base, base4, base+span+span)
pdf.Line(base5, base, base5, base+span+span)
pdf.Line(base6, base, base6, base+span+span)
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Center
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "Inspection item", option1)
pdf.SetXY(base1, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base2 - base1}, "Inspection/Testing", option1)
pdf.SetXY(base1, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base2 - base1}, "Criteria", option1)
pdf.SetXY(base2, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base3 - base2}, "Inspection method", option1)
pdf.SetXY(base3, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base4 - base3}, "Inspection result", option1)
pdf.SetXY(base4, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base4}, "Judgment", option1)
pdf.SetXY(base5, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base6 - base5}, "Remark", option1)
base += span + span
pdf.Line(margin_left, base, base6, base)
cnt := 0
cur_item := ""
for i := 0; i < len(data.Inspection_data); i++ {
v := data.Inspection_data[i]
if v.Inspection_items_en != cur_item {
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
cnt++
cur_item = v.Inspection_items_en
//pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base6, base, base6, base+span)
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetFont("wr", "", 13)
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, fmt.Sprintf(`%d.%s`, cnt, v.Inspection_items_en), option1)
base += span
pdf.Line(margin_left, base, base6, base)
}
pdf.SetFont("simfang", "", 14)
var max_h int = 1
context1, _ := pdf.SplitTextWithWordWrap(v.Inspection_rs_en, base2-base0)
if len(context1) > int(max_h) {
max_h = len(context1)
}
context2, _ := pdf.SplitTextWithWordWrap(v.Inspection_scheme_en, base3-base2)
if len(context2) > int(max_h) {
max_h = len(context2)
}
context3, _ := pdf.SplitTextWithWordWrap(v.Attach_file, base6-base5)
fmt.Println(context3, len(context3))
if len(context3) > int(max_h) {
max_h = len(context3)
}
var context1_base float64 = (float64(max_h-len(context1))/2)*span + base
var context2_base float64 = (float64(max_h-len(context2))/2)*span + base
var context3_base float64 = (float64(max_h-len(context3))/2)*span + base
if base+(float64(max_h)*span) > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
//pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+(float64(max_h)*span))
pdf.Line(base2, base, base2, base+(float64(max_h)*span))
pdf.Line(base3, base, base3, base+(float64(max_h)*span))
pdf.Line(base4, base, base4, base+(float64(max_h)*span))
pdf.Line(base5, base, base5, base+(float64(max_h)*span))
pdf.Line(base6, base, base6, base+(float64(max_h)*span))
var option1 gopdf.CellOption
option1.Align = gopdf.Middle | gopdf.Center
for j := 0; j < len(context1); j++ {
pdf.SetXY(base0, context1_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base2 - base0}, context1[j], option1)
}
for j := 0; j < len(context2); j++ {
pdf.SetXY(base2, context2_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base3 - base2}, context2[j], option1)
}
pdf.SetXY(base3, base)
var result string
for j := 0; j < len(v.Result_contain); j++ {
if v.Result == v.Result_contain[j].Result_cn {
result = v.Result_contain[j].Result_en
}
}
pdf.CellWithOption(&gopdf.Rect{H: float64(max_h) * span, W: base4 - base3}, result, option1)
pdf.SetXY(base4, base)
pdf.CellWithOption(&gopdf.Rect{H: float64(max_h) * span, W: base5 - base4}, v.If_ok, option1)
for j := 0; j < len(context3); j++ {
pdf.SetXY(base5, context3_base+(float64(j)*span))
pdf.CellWithOption(&gopdf.Rect{H: span, W: base6 - base5}, context3[j], option1)
}
base += (float64(max_h) * span)
pdf.Line(margin_left, base, base6, base)
}
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span)
pdf.Line(base5, base, base5, base+span)
pdf.Line(base6, base, base6, base+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base5 - base0}, "Remark□Attribute judgment, pass √, fail × ⊙ measurement judgment, record data.", option1)
base += span
pdf.Line(margin_left, base, base6, base)
if base+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span+span)
pdf.Line(base1, base, base1, base+span+span)
pdf.Line(base5, base, base5, base+span+span)
pdf.Line(base6, base, base6, base+span+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "Final judgment", option1)
pdf.SetXY(base0, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "(pass/fail)", option1)
pdf.SetXY(base1, base)
if data.Fin_result == "合格" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "pass", option1)
} else if data.Fin_result == "不合格" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "fail", option1)
} else {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "", option1)
}
base += span + span
pdf.Line(margin_left, base, base6, base)
//不合格处理方式
if base+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span+span)
pdf.Line(base1, base, base1, base+span+span)
pdf.Line(base5, base, base5, base+span+span)
pdf.Line(base6, base, base6, base+span+span)
option1.Align = gopdf.Middle | gopdf.Left
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "Non-conformity", option1)
pdf.SetXY(base0, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: base1 - base0}, "treatment", option1)
pdf.SetXY(base1, base)
if data.Non_conformity_treatment == "退货或换货" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "Return or Exchange", option1)
} else if data.Non_conformity_treatment == "返工返修" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "Rework and repair", option1)
} else if data.Non_conformity_treatment == "报废" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "Scrap", option1)
} else if data.Non_conformity_treatment == "其他" {
pdf.CellWithOption(&gopdf.Rect{H: 2 * span, W: base5 - base1}, "Others", option1)
}
base += span + span
pdf.Line(margin_left, base, base6, base)
//审核人
if base+span+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.SetLineWidth(0.1)
pdf.Line(base0, base, base6, base)
pdf.Line(base0, base, base0, base+span+span)
pdf.Line(base5, base, base5, base+span+span)
pdf.Line(base6, base, base6, base+span+span)
pdf.SetXY(base0, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`Inspected by%s`, data.Inspector), option1)
pdf.SetXY(base0+200, base)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`Checked by%s`, data.Auditor), option1)
pdf.SetXY(base0, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`Date%s`, data.Time), option1)
pdf.SetXY(base0+200, base+span)
pdf.CellWithOption(&gopdf.Rect{H: span, W: 200}, fmt.Sprintf(`Date%s`, data.Audit_time), option1)
base += span + span
pdf.Line(margin_left, base, base6, base)
for i := 0; i < len(data.Inspection_data); i++ {
v := data.Inspection_data[i]
fmt.Println(v.Attach_file)
index := strings.LastIndex(v.Attach_file, ".")
if index <= 0 {
continue
}
file_type := v.Attach_file[index:]
fmt.Println(file_type)
if file_type == ".txt" {
fileHandle, err := os.OpenFile(fmt.Sprintf(`./upload_report/%s`, v.Attach_file), os.O_RDONLY, 0666)
if err != nil {
continue
}
reader := bufio.NewReader(fileHandle)
var results []string
// 按行处理txt
for {
line, _, err := reader.ReadLine()
if err == io.EOF {
break
}
reader := transform.NewReader(bytes.NewReader(line), simplifiedchinese.GBK.NewDecoder())
d, e := ioutil.ReadAll(reader)
if e != nil {
continue
}
results = append(results, string(d))
}
fileHandle.Close()
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`attach file%s`, v.Attach_file))
for k := 0; k < len(results); k++ {
context_result, _ := pdf.SplitTextWithWordWrap(results[k], page_W-margin_left-margin_left)
for z := 0; z < len(context_result); z++ {
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`%s`, context_result[z]))
}
}
} else if file_type == ".jpeg" || file_type == ".png" || file_type == ".jpg" {
base += span
if base > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
if base+((page_H-span-span)/2) > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
pdf.Image(fmt.Sprintf(`./upload_report/%s`, v.Attach_file), margin_left, base, &gopdf.Rect{H: (page_H - span - span) / 2, W: page_W / 2})
base += ((page_H - span - span) / 2)
if base+span > page_context_H {
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
cur_page++
pdf.AddPage()
base = margin_top
pdf.SetXY(margin_left*1, base)
} else {
pdf.SetXY(margin_left*1, base)
}
base += span
pdf.SetXY(margin_left, base)
pdf.Text(fmt.Sprintf(`attach file%s`, v.Attach_file))
}
}
pdf.SetXY(page_F_x, page_F_y)
pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page))
//save
beginTime := time.Now().UnixNano()
pdf.WritePdf(fmt.Sprintf(`./upload_report_file/%v.pdf`, beginTime))
update_report_file(data, "", fmt.Sprintf(`%v.pdf`, beginTime))
//filename := strconv.FormatInt(beginTime, 10)
return
}
func create_pdf_g() {
for {
select {
case v := <-g_report_data:
create_pdf_cn(v)
create_pdf_en(v)
default:
time.Sleep(time.Second * 1)
}
}
}
func update_report_file(data report_multi_template, file string, file_en string) {
var err error
if file != "" {
sqlstr := fmt.Sprintf(`UPDATE [inspection_report] SET [file] ='%s' where [p_name] ='%s' and [serial] = '%s'`,
file, data.P_name_cn, data.Serial_sets)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("update_report_file Exec Error:", err.Error())
}
}
if file_en != "" {
sqlstr := fmt.Sprintf(`UPDATE [inspection_report] SET [file_en] ='%s' where [p_name] ='%s' and [serial] = '%s'`,
file_en, data.P_name_cn, data.Serial_sets)
fmt.Println(sqlstr)
_, err = sqlConn.Exec(sqlstr)
if err != nil {
logs.Info("update_report_file Exec Error:", err.Error())
}
}
}
//上传文件
func upload_report_file(w http.ResponseWriter, r *http.Request) {
beginTime := time.Now().UnixNano()
logs.Info("upload_report_file recv req begin", time.Now().Format("2006-01-02 15:04:05"))
var resp upload_reportfile_resp
var f *os.File
var err error
//var rdRow *sql.Rows
//var d plan_file
// var sqlstr string
//配置文件读取
base_file_path := modelePath + "/upload_report/"
r.ParseMultipartForm(32 << 20)
resp.Inspection_items_cn = r.Form.Get("inspection_items_cn")
resp.Inspection_rs_cn = r.Form.Get("inspection_rs_cn")
//读取文件信息
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
resp.Ret = -1
goto exit
}
defer file.Close()
fmt.Println(handler.Filename)
resp.File = handler.Filename
logs.Info(base_file_path + handler.Filename)
if handler.Filename == "" {
resp.Ret = -1
goto exit
}
os.Remove(base_file_path + handler.Filename)
f, err = os.OpenFile(base_file_path+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
goto exit
}
defer f.Close()
io.Copy(f, file)
resp.Ret = 0
exit:
jdata, _ := json.Marshal(resp)
fmt.Fprintln(w, string(jdata))
endTime := time.Now().UnixNano()
logs.Info(fmt.Sprintf("upload_report_file recv req end, use time: %v ms", (endTime-beginTime)/1e6))
}
func download_report_file(rw http.ResponseWriter, r *http.Request) {
//获取请求参数
/*var req download_file_req
reqdata, _ := ioutil.ReadAll(r.Body)
json.Unmarshal(reqdata, &req)
fn := req.Filename*/
filename := r.FormValue("id")
base_file_path := modelePath + "/upload_report_file/"
if filename != "" {
//设置响应头
header := rw.Header()
header.Add("Content-Type", "application/octet-stream")
//header.Add("Content-Disposition", "attachment;filename="+fn)
//使用ioutil包读取文件
filepath := base_file_path + filename
fmt.Println(filepath)
b, _ := ioutil.ReadFile(filepath)
//写入到响应流中
rw.Write(b)
}
}