kpi-api/report.go

3559 lines
95 KiB
Go
Raw Normal View History

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)
}
}