apiserver/ews/ews.go

790 lines
20 KiB
Go
Raw Normal View History

2023-11-25 14:02:30 +08:00
package ews
import (
"APIServer/cnf"
"database/sql"
"fmt"
"log"
2023-12-04 09:48:14 +08:00
"time"
2023-11-25 14:02:30 +08:00
_ "github.com/go-sql-driver/mysql"
)
type EWS struct{}
type UutInfo struct {
USN string
MAC string
IPAddr string
Relay string
Item string
Status string
Message string
PartNO string
MfgMO string
MfgSKU string
MfgLine string
MfgStage string
FirstAck string
LastAck string
LastChg string
}
2023-11-29 18:14:55 +08:00
type DefectInfo struct {
USN string
PartNO string
MfgMO string
2023-11-29 18:14:55 +08:00
SKU string
Line string
Location string
Item string
Status string
Message string
FirstAck string
LastAck string
LastChg string
DiffMins string
}
2023-11-25 14:02:30 +08:00
func (e *EWS) SetUutInfo(cfg cnf.Cfg, logger *log.Logger, host string, addr string, uri string, params map[string]string) map[string]string {
if cfg.Settings.LogRequest {
logger.Printf("[MSG] %s; %s; Request: %#v\r\n", addr, uri, params)
}
rst := map[string]string{"RESULT": ""}
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s",
cfg.MySQL.User,
cfg.MySQL.Password,
cfg.MySQL.Server,
cfg.MySQL.Port,
cfg.MySQL.Database,
)
dbo, err := sql.Open("mysql", dsn)
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = err.Error()
return rst
}
defer dbo.Close()
err = dbo.Ping()
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = err.Error()
return rst
}
rec := dbo.QueryRow(
2023-12-08 15:45:50 +08:00
fmt.Sprintf(`SELECT usn,mac,ipaddr,relay,item,status,message,partno,mo,sku,line,stage,first_ack,last_ack,last_change
2023-11-25 14:02:30 +08:00
FROM uutinfo
WHERE usn='%s';`, params["USN"]))
ui := new(UutInfo)
err = rec.Scan(
&ui.USN,
&ui.MAC,
&ui.IPAddr,
&ui.Relay,
&ui.Item,
&ui.Status,
&ui.Message,
&ui.PartNO,
&ui.MfgMO,
&ui.MfgSKU,
&ui.MfgLine,
&ui.MfgStage,
&ui.FirstAck,
&ui.LastAck,
&ui.LastChg,
)
//如果在uutinfo表中未查找到此USN的记录, 则新增一条此USN的记录
if err == sql.ErrNoRows {
dmlInsert := fmt.Sprintf("INSERT INTO uutinfo (usn,mac,ipaddr,relay,item,status,message,partno,mo,sku,line,stage,first_ack,last_ack,last_change) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',%s,%s,%s);",
params["USN"],
params["MAC"],
addr,
host,
params["ITEM"],
params["STATUS"],
params["MESSAGE"],
params["PARTNO"],
params["MO"],
params["SKU"],
params["LINE"],
params["STAGE"],
"NOW()",
"NOW()",
"NOW()",
)
_, err = dbo.Exec(dmlInsert)
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = err.Error()
return rst
}
if cfg.Settings.LogResponse {
logger.Printf("[MSG] %s; %s; Response: %#v\r\n", addr, uri, rst)
}
rst["RESULT"] = "OK"
rst["ErrMsg"] = "Inserted 1 new record."
return rst
}
//如果此USN的记录存在与uutinfo表中, 且此USN的MAC/Item/Status/Message已变化, 则:
//1. 备份此USN对应记录行到uutinfobkup表
//2. 更新uutinfo表中对应USN记录的MAC/Item/Status/Message/PartNO/MO/SKU/Line/Stage
//3. 更新uutinfo表中此USN记录行的last_ack和last_change栏位为当前时间
extFlag := false
chgFlag := false
_, extFlag = params["MAC"]
if extFlag && params["MAC"] != ui.MAC {
chgFlag = true
}
_, extFlag = params["ITEM"]
if extFlag && params["ITEM"] != ui.Item {
chgFlag = true
}
_, extFlag = params["STATUS"]
if extFlag && params["STATUS"] != ui.Status {
chgFlag = true
}
_, extFlag = params["MESSAGE"]
if extFlag && params["MESSAGE"] != ui.Message {
chgFlag = true
}
if chgFlag {
tx, err := dbo.Begin()
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = err.Error()
return rst
}
stmt, err := tx.Prepare("INSERT INTO uutinfobkup (usn,mac,ipaddr,relay,item,status,message,partno,mo,sku,line,stage,first_ack,last_ack,last_change) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);")
if err != nil {
tx.Rollback()
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = err.Error()
return rst
}
defer stmt.Close()
_, err = stmt.Exec(
ui.USN,
ui.MAC,
addr,
host,
ui.Item,
ui.Status,
ui.Message,
ui.PartNO,
ui.MfgMO,
ui.MfgSKU,
ui.MfgLine,
ui.MfgStage,
ui.FirstAck,
ui.LastAck,
ui.LastChg,
)
if err != nil {
tx.Rollback()
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = err.Error()
return rst
}
stmt, err = tx.Prepare("UPDATE uutinfo SET mac=?, ipaddr=?, relay=?, item=?, status=?, message=?, partno=?, mo=?, sku=?, line=?, stage=?, last_ack=NOW(), last_change=NOW() WHERE usn=?;")
if err != nil {
tx.Rollback()
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = err.Error()
return rst
}
defer stmt.Close()
_, err = stmt.Exec(
params["MAC"],
addr,
host,
params["ITEM"],
params["STATUS"],
params["MESSAGE"],
params["PARTNO"],
params["MO"],
params["SKU"],
params["LINE"],
params["STAGE"],
params["USN"],
)
if err != nil {
tx.Rollback()
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = err.Error()
return rst
}
err = tx.Commit()
if err != nil {
tx.Rollback()
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = err.Error()
return rst
}
if cfg.Settings.LogResponse {
logger.Printf("[MSG] %s; %s; Response: %#v\r\n", addr, uri, rst)
}
rst["RESULT"] = "OK"
rst["ErrMsg"] = "Updated and backed up 1 record."
return rst
}
//如果此USN的记录存在与uutinfo表中, 且MAC/Item/Status/Message未变化, 则更新此USN记录的ipaddr,relay,stage, 并更新last_ack栏位为当前时间
dmlUpdate := fmt.Sprintf("UPDATE uutinfo SET ipaddr='%s', relay='%s', stage='%s', last_ack=NOW() WHERE usn='%s'",
addr, host, params["STAGE"], params["USN"])
_, err = dbo.Exec(dmlUpdate)
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = err.Error()
return rst
}
if cfg.Settings.LogResponse {
logger.Printf("[MSG] %s; %s; Response: %#v\r\n", addr, uri, rst)
}
rst["RESULT"] = "OK"
rst["ErrMsg"] = "Updated 1 record."
return rst
}
func (e *EWS) GetUutInfo(cfg cnf.Cfg, logger *log.Logger, host string, addr string, uri string, params map[string]string) map[string]string {
if cfg.Settings.LogRequest {
logger.Printf("[MSG] %s; %s; Request: %#v\r\n", addr, uri, params)
}
rst := map[string]string{"RESULT": ""}
2023-11-30 10:57:20 +08:00
if params["KEY"] == "" || params["VALUE"] == "" {
2023-11-25 14:02:30 +08:00
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, "Invalid Parameters !")
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", "Invalid Parameters !")
return rst
}
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s",
cfg.MySQL.User,
cfg.MySQL.Password,
cfg.MySQL.Server,
cfg.MySQL.Port,
cfg.MySQL.Database,
)
dbo, err := sql.Open("mysql", dsn)
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", err.Error())
return rst
}
defer dbo.Close()
err = dbo.Ping()
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", err.Error())
return rst
}
2023-11-30 10:57:20 +08:00
ul := new(UutInfo)
2023-11-25 14:02:30 +08:00
partNO := ""
mfgMO := ""
mfgSKU := ""
fstAck := ""
lstAck := ""
//Get Last Record
last := ""
2023-11-30 10:57:20 +08:00
curr, err := dbo.Query(
2023-12-08 15:45:50 +08:00
fmt.Sprintf(`SELECT usn,mac,ipaddr,relay,item,status,message,partno,mo,sku,line,stage,first_ack,last_ack,last_change
2023-11-25 14:02:30 +08:00
FROM uutinfo
2023-11-30 10:57:20 +08:00
WHERE %s='%s'
ORDER BY usn ASC, seqid ASC;`, params["KEY"], params["VALUE"]))
2023-11-25 14:02:30 +08:00
2023-11-30 10:57:20 +08:00
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", err.Error())
return rst
}
defer curr.Close()
for curr.Next() {
err := curr.Scan(
&ul.USN,
&ul.MAC,
&ul.IPAddr,
&ul.Relay,
&ul.Item,
&ul.Status,
&ul.Message,
&ul.PartNO,
&ul.MfgMO,
&ul.MfgSKU,
&ul.MfgLine,
&ul.MfgStage,
&ul.FirstAck,
&ul.LastAck,
&ul.LastChg,
)
if err != nil {
break
}
last = last + fmt.Sprintf(`<tr>
<td style="color: blue;">%s</td>
<td style="color: blue;">%s</td>
<td style="color: blue;">%s</td>
<td style="color: blue;">%s</td>
<td style="color: blue;">%s</td>
<td style="color: blue;">%s</td>
<td style="color: blue;">%s</td>
<td style="color: blue;">%s</td>
2023-11-30 10:57:20 +08:00
</tr>%s`, ul.USN, ul.MAC, ul.IPAddr, ul.Relay, ul.Item, ul.Status, ul.Message, ul.LastChg, "\r\n")
if ul.PartNO != "" {
partNO = ul.PartNO
}
if ul.MfgMO != "" {
mfgMO = ul.MfgMO
}
if ul.MfgSKU != "" {
mfgSKU = ul.MfgSKU
}
if ul.FirstAck != "" {
fstAck = ul.FirstAck
}
if ul.LastAck != "" {
lstAck = ul.LastAck
}
2023-11-25 14:02:30 +08:00
}
//Get Location Information
loc, locTime := "", ""
if last != "" {
2023-11-30 10:57:20 +08:00
qry := dbo.QueryRow(fmt.Sprintf(`SELECT CONCAT_WS('-',line,col,row,num) AS loc, update_time FROM locinfo WHERE mac='%s'`, ul.MAC))
2023-11-25 14:02:30 +08:00
qry.Scan(&loc, &locTime)
}
//Get History Records
2023-11-30 10:57:20 +08:00
uh := new(UutInfo)
2023-11-25 14:02:30 +08:00
bkup := ""
2023-11-30 10:57:20 +08:00
prev, err := dbo.Query(
2023-12-08 15:45:50 +08:00
fmt.Sprintf(`SELECT usn,mac,ipaddr,relay,item,status,message,partno,mo,sku,line,stage,first_ack,last_ack,last_change
2023-11-25 14:02:30 +08:00
FROM uutinfobkup
2023-11-30 10:57:20 +08:00
WHERE %s='%s'
ORDER BY usn ASC, seqid ASC;`, params["KEY"], params["VALUE"]))
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", err.Error())
return rst
}
defer prev.Close()
for prev.Next() {
err := prev.Scan(
&uh.USN,
&uh.MAC,
&uh.IPAddr,
&uh.Relay,
&uh.Item,
&uh.Status,
&uh.Message,
&uh.PartNO,
&uh.MfgMO,
&uh.MfgSKU,
&uh.MfgLine,
&uh.MfgStage,
&uh.FirstAck,
&uh.LastAck,
&uh.LastChg,
)
if err != nil {
break
2023-11-25 14:02:30 +08:00
}
2023-11-30 10:57:20 +08:00
bkup = bkup + fmt.Sprintf(`<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>%s`,
uh.USN, uh.MAC, uh.IPAddr, uh.Relay, uh.Item, uh.Status, uh.Message, uh.LastChg, "\r\n")
2023-11-25 14:02:30 +08:00
}
//Get Misc. Info
if partNO == "" {
2023-11-30 10:57:20 +08:00
partNO = uh.PartNO
2023-11-25 14:02:30 +08:00
}
if mfgMO == "" {
2023-11-30 10:57:20 +08:00
mfgMO = uh.MfgMO
2023-11-25 14:02:30 +08:00
}
if mfgSKU == "" {
2023-11-30 10:57:20 +08:00
mfgSKU = uh.MfgSKU
2023-11-25 14:02:30 +08:00
}
if fstAck == "" {
2023-11-30 10:57:20 +08:00
fstAck = uh.FirstAck
2023-11-25 14:02:30 +08:00
}
if lstAck == "" {
2023-11-30 10:57:20 +08:00
lstAck = uh.LastAck
2023-11-25 14:02:30 +08:00
}
misc := ""
misc = fmt.Sprintf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
partNO, mfgMO, mfgSKU, fstAck, lstAck)
rst["RESULT"] = "OK"
2023-11-29 18:14:55 +08:00
rst["ErrMsg"] = e.TemplateUutInfo(loc, locTime, misc, last, bkup)
if cfg.Settings.LogResponse {
logger.Printf("[MSG] %s; %s; Response: Length=%d\r\n", addr, uri, len(rst["ErrMsg"]))
}
return rst
}
2023-11-30 10:57:20 +08:00
func (e *EWS) GetDefectReport(cfg cnf.Cfg, logger *log.Logger, host string, addr string, uri string, params map[string]string) map[string]string {
2023-11-29 18:14:55 +08:00
if cfg.Settings.LogRequest {
logger.Printf("[MSG] %s; %s; Request: %#v\r\n", addr, uri, params)
}
rst := map[string]string{"RESULT": ""}
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s",
cfg.MySQL.User,
cfg.MySQL.Password,
cfg.MySQL.Server,
cfg.MySQL.Port,
cfg.MySQL.Database,
)
dbo, err := sql.Open("mysql", dsn)
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", err.Error())
return rst
}
defer dbo.Close()
err = dbo.Ping()
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", err.Error())
return rst
}
di := new(DefectInfo)
defect := ""
rows, err := dbo.Query(
`SELECT usn,partno,mo,sku,line,location,item,status,message,first_ack,last_ack,last_change,diffmins
2023-11-29 18:14:55 +08:00
FROM v_ngreport
ORDER BY diffmins ASC;`)
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", err.Error())
return rst
}
defer rows.Close()
num := 1
for rows.Next() {
err := rows.Scan(
&di.USN,
&di.PartNO,
&di.MfgMO,
2023-11-29 18:14:55 +08:00
&di.SKU,
&di.Line,
&di.Location,
&di.Item,
&di.Status,
&di.Message,
&di.FirstAck,
&di.LastAck,
&di.LastChg,
&di.DiffMins,
)
if err != nil {
break
}
temp := fmt.Sprintf(`<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>%s`,
num, di.USN, di.PartNO, di.MfgMO, di.SKU, di.Line, di.Location, di.Item, di.Status, di.Message, di.FirstAck, di.LastAck, di.LastChg, di.DiffMins, "\r\n")
2023-11-29 18:14:55 +08:00
defect = defect + temp
num += 1
}
rst["RESULT"] = "OK"
rst["ErrMsg"] = e.TemplateDefectInfo(defect)
if cfg.Settings.LogResponse {
logger.Printf("[MSG] %s; %s; Response: Length=%d\r\n", addr, uri, len(rst["ErrMsg"]))
}
return rst
}
2023-11-30 10:57:20 +08:00
func (e *EWS) GetOfflineReport(cfg cnf.Cfg, logger *log.Logger, host string, addr string, uri string, params map[string]string) map[string]string {
2023-11-29 18:14:55 +08:00
if cfg.Settings.LogRequest {
logger.Printf("[MSG] %s; %s; Request: %#v\r\n", addr, uri, params)
}
rst := map[string]string{"RESULT": ""}
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s",
cfg.MySQL.User,
cfg.MySQL.Password,
cfg.MySQL.Server,
cfg.MySQL.Port,
cfg.MySQL.Database,
)
dbo, err := sql.Open("mysql", dsn)
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", err.Error())
return rst
}
defer dbo.Close()
err = dbo.Ping()
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", err.Error())
return rst
}
di := new(DefectInfo)
offline := ""
rows, err := dbo.Query(
`SELECT usn,partno,mo,sku,line,location,item,status,message,first_ack,last_ack,last_change,diffmins
2023-11-29 18:14:55 +08:00
FROM v_offline
ORDER BY diffmins DESC;`)
if err != nil {
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, err.Error())
rst["RESULT"] = "NG"
rst["ErrMsg"] = e.SimpleMsgHTML("red", err.Error())
return rst
}
defer rows.Close()
num := 1
for rows.Next() {
err := rows.Scan(
&di.USN,
&di.PartNO,
&di.MfgMO,
2023-11-29 18:14:55 +08:00
&di.SKU,
&di.Line,
&di.Location,
&di.Item,
&di.Status,
&di.Message,
&di.FirstAck,
&di.LastAck,
&di.LastChg,
&di.DiffMins,
)
if err != nil {
break
}
temp := fmt.Sprintf(`<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>%s`,
num, di.USN, di.PartNO, di.MfgMO, di.SKU, di.Line, di.Location, di.Item, di.Status, di.Message, di.FirstAck, di.LastAck, di.LastChg, di.DiffMins, "\r\n")
2023-11-29 18:14:55 +08:00
offline = offline + temp
num += 1
}
rst["RESULT"] = "OK"
rst["ErrMsg"] = e.TemplateDefectInfo(offline)
2023-11-25 14:02:30 +08:00
if cfg.Settings.LogResponse {
2023-11-29 18:14:55 +08:00
logger.Printf("[MSG] %s; %s; Response: Length=%d\r\n", addr, uri, len(rst["ErrMsg"]))
2023-11-25 14:02:30 +08:00
}
return rst
}
func (e *EWS) SimpleMsgHTML(clr, msg string) string {
2023-12-04 09:48:14 +08:00
now := time.Now().Format("2006-01-02 15:04:05")
2023-11-25 14:02:30 +08:00
resp := fmt.Sprintf(`<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<style>pre {word-wrap: break-word;}</style>
2023-12-04 09:48:14 +08:00
<style>body {font-family: Consolas; font-size: 14px;}</style>
2023-11-25 14:02:30 +08:00
</head>
<body>
2023-12-04 09:48:14 +08:00
<br/><span style="color: %s;">[%s] %s</span><br/>
2023-11-25 14:02:30 +08:00
</body>
2023-12-04 09:48:14 +08:00
</html>`, clr, now, msg)
2023-11-25 14:02:30 +08:00
return resp
}
2023-11-29 18:14:55 +08:00
func (e *EWS) TemplateUutInfo(loc, locTime, misc, last, bkup string) string {
2023-12-04 09:48:14 +08:00
now := time.Now().Format("2006-01-02 15:04:05")
2023-11-25 14:02:30 +08:00
if loc == "" {
loc = `<span style="color: red; font-size: 14px; font-family: Consolas;">Unknown</span>`
}
2023-11-30 10:57:20 +08:00
// if misc == "" {
// misc = `<span style="color: red;">NO Records !</span>`
// }
2023-11-25 14:02:30 +08:00
2023-11-30 10:57:20 +08:00
// if bkup == "" {
// bkup = `<span style="color: red;">NO Records !</span>`
// }
2023-11-25 14:02:30 +08:00
resp := fmt.Sprintf(`<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test Records</title>
<style type="text/css">
table {
border: 1px solid rgb(81, 130, 187);
border-collapse: separate;
2023-11-25 14:08:31 +08:00
border-spacing: 1px;
2023-11-25 14:02:30 +08:00
position: static;
}
th {
background-color: rgb(81, 130, 187);
color: #fff;
border: 1px solid rgb(81, 130, 187);
padding: 5px 10px;
2023-11-29 18:14:55 +08:00
font-size: 12px;
2023-11-25 14:02:30 +08:00
font-family: Verdana;
font-weight: bold;
}
tr {
border: 1px solid rgb(81, 130, 187);
}
td {
color: #000;
padding: 5px 10px;
2023-11-29 18:14:55 +08:00
font-size: 12px;
2023-11-25 14:02:30 +08:00
font-family: Consolas;
}
span {
font-size: 14px;
2023-11-25 14:02:30 +08:00
font-family: Consolas;
}
</style>
<body>
2023-12-04 09:48:14 +08:00
<span>Response Time: %s</span><br/><br/>
2023-11-25 14:02:30 +08:00
<span style="font-weight: bold; font-size: 16px;">Location Info</span>
<table>
<tr>
<th>Location</th>
<th>Location Time</th>
</tr>
<tr>
<td>%s</td>
<td>%s</td>
</tr>
</table>
<br/>
<span style="font-weight: bold; font-size: 16px;">Misc. Info</span>
<br/>
<table>
<tr>
<th>PartNO.</th>
2023-11-25 14:02:30 +08:00
<th>MO</th>
<th>SKU</th>
<th>First Ack</th>
<th>Last Ack</th>
</tr>
%s
</table>
<br/>
<span style="font-weight: bold; font-size: 16px;">测试记录</span>
<br/>
<table>
<tr>
<th>USN</th>
<th>MAC</th>
<th>IP Address</th>
<th>Server</th>
<th>Test Item</th>
<th>Status</th>
<th>Message</th>
<th>Last Change</th>
</tr>
%s
%s
</table>
</body>
2023-12-04 09:48:14 +08:00
</html>`, now, loc, locTime, misc, last, bkup)
2023-11-25 14:02:30 +08:00
return resp
}
2023-11-29 18:14:55 +08:00
func (e *EWS) TemplateDefectInfo(src string) string {
2023-12-04 09:48:14 +08:00
now := time.Now().Format("2006-01-02 15:04:05")
2023-11-29 18:14:55 +08:00
if src == "" {
2023-12-04 09:48:14 +08:00
src = fmt.Sprintf(`<span style="color: red;">[%s] NO Records !</span><br/>`, now)
2023-11-29 18:14:55 +08:00
}
resp := fmt.Sprintf(`<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test Records</title>
<style type="text/css">
table {
border: 1px solid rgb(81, 130, 187);
border-collapse: separate;
border-spacing: 1px;
position: static;
}
th {
background-color: rgb(81, 130, 187);
color: #fff;
border: 1px solid rgb(81, 130, 187);
padding: 5px 10px;
font-size: 12px;
font-family: Verdana;
font-weight: bold;
}
tr {
border: 1px solid rgb(81, 130, 187);
}
td {
color: #000;
padding: 5px 10px;
font-size: 12px;
font-family: Consolas;
}
span {
font-size: 14px;
font-family: Consolas;
}
</style>
<body>
2023-12-04 09:48:14 +08:00
<span>Response Time: %s</span><br/>
2023-11-29 18:14:55 +08:00
<table>
<tr>
<th>NO.</th>
<th>USN</th>
<th>PartNO.</th>
<th>MO</th>
2023-11-29 18:14:55 +08:00
<th>SKU</th>
<th>Line</th>
<th>Location</th>
<th>Item</th>
<th>Status</th>
<th>Message</th>
<th>First Ack</th>
<th>Last Ack</th>
<th>Last Change</th>
<th>Differ Time (Min)</th>
</tr>
%s
</table>
</body>
2023-12-04 09:48:14 +08:00
</html>`, now, src)
2023-11-29 18:14:55 +08:00
return resp
}