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
}
2024-01-19 14:56:40 +08:00
type ReportInfo struct {
2023-11-29 18:14:55 +08:00
USN string
PartNO string
2023-12-08 10:11:04 +08:00
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
}
2024-02-27 11:29:09 +08:00
func ( e * EWS ) RecordIssue ( cfg cnf . Cfg , logger * log . Logger , host string , addr string , uri string , params map [ string ] string , ui * UutInfo , dbo * sql . DB ) map [ string ] string {
rst := map [ string ] string { "RESULT" : "" }
firstAck := ui . FirstAck
if firstAck == "" {
firstAck = time . Now ( ) . Format ( "2006-01-02 15:04:05" )
}
2024-03-21 18:07:23 +08:00
line := ""
col := 0
row := 0
num := 0
locTime := ""
loc := dbo . QueryRow ( fmt . Sprintf ( ` SELECT line,col,row,num,DATE_FORMAT(update_time,'%%Y-%%m-%%d %%H:%%i:%%s') FROM locinfo WHERE mac='%s'; ` , params [ "MAC" ] ) )
err := loc . Scan ( & line , & col , & row , & num , & locTime )
if locTime == "" {
locTime = "0000-00-00 00:00:00"
}
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
}
2024-02-27 11:29:09 +08:00
stmt , err := dbo . Prepare (
2024-03-21 18:07:23 +08:00
fmt . Sprintf ( ` INSERT INTO % s
( usn , mac , ipaddr , relay , partno , mo , sku , line , stage , item , status , message , first_ack , last_change , locline , loccol , locrow , locnum , loctime )
VALUES ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) ; ` ,
2024-02-27 11:29:09 +08:00
cfg . MySQL . IssuesTable ) ,
)
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 stmt . Close ( )
_ , err = stmt . Exec (
params [ "USN" ] ,
params [ "MAC" ] ,
addr ,
host ,
params [ "PARTNO" ] ,
params [ "MO" ] ,
params [ "SKU" ] ,
params [ "LINE" ] ,
params [ "STAGE" ] ,
params [ "ITEM" ] ,
params [ "STATUS" ] ,
params [ "MESSAGE" ] ,
firstAck ,
time . Now ( ) . Format ( "2006-01-02 15:04:05" ) ,
2024-03-21 18:07:23 +08:00
line ,
col ,
row ,
num ,
locTime ,
2024-02-27 11:29:09 +08:00
)
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
}
rst [ "RESULT" ] = "OK"
return rst
}
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 {
rst := map [ string ] string { "RESULT" : "" }
2024-01-24 10:50:12 +08:00
if params [ "USN" ] == "" {
logger . Printf ( "[ERR] %s; %s; %#v; %s\r\n" , addr , uri , params , "Missing Parameter USN." )
2023-12-19 14:44:37 +08:00
rst [ "RESULT" ] = "NG"
2024-01-24 10:50:12 +08:00
rst [ "ErrMsg" ] = "Missing Parameter USN."
2023-12-19 14:44:37 +08:00
return rst
}
2023-11-25 14:02:30 +08:00
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
}
2024-03-21 18:07:23 +08:00
// fmt.Sprintf(`SELECT t1.usn,t1.mac,t1.ipaddr,t1.relay,t1.item,t1.status,t1.message,t1.partno,t1.mo,t1.sku,t1.line,t1.stage,t1.first_ack,t1.last_ack,t1.last_change,t2.model
// FROM uutinfo t1 LEFT JOIN modelfamily t2 ON t1.partno=t2.modelfamily
// WHERE t1.usn='%s';`, params["USN"]))
2023-11-25 14:02:30 +08:00
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 {
2024-01-24 10:50:12 +08:00
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 ) ; ` ,
2023-11-25 14:02:30 +08:00
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
}
2024-02-27 11:29:09 +08:00
if params [ "STATUS" ] == "NG" {
rst = e . RecordIssue ( cfg , logger , host , addr , uri , params , ui , dbo )
if rst [ "RESULT" ] != "OK" {
return rst
}
}
2023-11-25 14:02:30 +08:00
rst [ "RESULT" ] = "OK"
rst [ "ErrMsg" ] = "Inserted 1 new record."
return rst
}
2024-03-10 12:10:19 +08:00
//如果此USN的记录存在于uutinfo表中, 且此USN的Relay/MAC/Item/Status/Message已变化, 则:
2023-11-25 14:02:30 +08:00
//1. 备份此USN对应记录行到uutinfobkup表
2024-03-10 12:10:19 +08:00
//2. 删除uutinfo表中对应USN的记录行
2023-12-19 13:55:16 +08:00
//3. 新增此USN的最新记录到uutinfo表
2024-03-10 12:10:19 +08:00
isExist := false
2023-11-25 14:02:30 +08:00
chgFlag := false
2024-03-10 12:10:19 +08:00
_ , isExist = params [ "MAC" ]
if isExist && params [ "MAC" ] != ui . MAC {
2023-11-25 14:02:30 +08:00
chgFlag = true
}
2024-03-10 12:10:19 +08:00
_ , isExist = params [ "ITEM" ]
if isExist && params [ "ITEM" ] != ui . Item {
2023-11-25 14:02:30 +08:00
chgFlag = true
}
2024-03-10 12:10:19 +08:00
_ , isExist = params [ "STATUS" ]
if isExist && params [ "STATUS" ] != ui . Status {
2023-11-25 14:02:30 +08:00
chgFlag = true
}
2024-03-10 12:10:19 +08:00
_ , isExist = params [ "MESSAGE" ]
if isExist && params [ "MESSAGE" ] != ui . Message {
chgFlag = true
}
if host != ui . Relay {
2023-11-25 14:02:30 +08:00
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
}
2023-12-19 13:55:16 +08:00
stmt , err = tx . Prepare ( "DELETE FROM uutinfo WHERE usn=?;" )
2023-11-25 14:02:30 +08:00
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 ( )
2023-12-19 13:55:16 +08:00
_ , err = stmt . Exec ( 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
}
2023-12-19 14:44:37 +08:00
mac := params [ "MAC" ]
if mac == "" {
mac = ui . MAC
}
2023-12-19 14:23:55 +08:00
stmt , err = tx . Prepare ( "INSERT INTO uutinfo (usn,mac,ipaddr,relay,item,status,message,partno,mo,sku,line,stage,first_ack,last_ack,last_change) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),NOW());" )
2023-12-19 13:55:16 +08:00
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
}
2023-11-25 14:02:30 +08:00
_ , err = stmt . Exec (
2023-12-19 13:55:16 +08:00
params [ "USN" ] ,
2023-12-19 14:44:37 +08:00
mac ,
2023-11-25 14:02:30 +08:00
addr ,
host ,
params [ "ITEM" ] ,
params [ "STATUS" ] ,
params [ "MESSAGE" ] ,
params [ "PARTNO" ] ,
params [ "MO" ] ,
params [ "SKU" ] ,
params [ "LINE" ] ,
params [ "STAGE" ] ,
2023-12-19 13:55:16 +08:00
ui . FirstAck ,
2023-11-25 14:02:30 +08:00
)
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
}
2024-02-27 11:29:09 +08:00
if params [ "STATUS" ] == "NG" {
rst = e . RecordIssue ( cfg , logger , host , addr , uri , params , ui , dbo )
if rst [ "RESULT" ] != "OK" {
return rst
}
}
2023-11-25 14:02:30 +08:00
rst [ "RESULT" ] = "OK"
rst [ "ErrMsg" ] = "Updated and backed up 1 record."
return rst
}
2024-03-10 12:10:19 +08:00
//如果此USN的记录存在于uutinfo表中, 且Relay/MAC/Item/Status/Message未变化, 则更新uutinfo表中此USN对应的last_ack栏位为当前时间
2024-01-26 14:28:47 +08:00
//dmlUpdate := fmt.Sprintf("UPDATE uutinfo SET ipaddr='%s', relay='%s', line='%s', stage='%s', last_ack=NOW() WHERE usn='%s';",
// addr, host, params["LINE"], params["STAGE"], params["USN"])
//2024-01-26: 使用事务模式先删除再插入此USN的记录, 避免直接使用UPDATE导致自增键seqid不更新
txu , 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 := txu . Prepare ( "DELETE FROM uutinfo WHERE usn=?;" )
2023-11-25 14:02:30 +08:00
if err != nil {
2024-01-26 14:28:47 +08:00
txu . Rollback ( )
2023-11-25 14:02:30 +08:00
logger . Printf ( "[ERR] %s; %s; %#v; %s\r\n" , addr , uri , params , err . Error ( ) )
rst [ "RESULT" ] = "NG"
rst [ "ErrMsg" ] = err . Error ( )
return rst
}
2024-01-26 14:28:47 +08:00
defer stmt . Close ( )
_ , err = stmt . Exec ( ui . USN )
if err != nil {
txu . 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 = txu . Prepare ( "INSERT INTO uutinfo (usn,mac,ipaddr,relay,item,status,message,partno,mo,sku,line,stage,first_ack,last_ack,last_change) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),?);" )
if err != nil {
txu . 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 = stmt . Exec (
ui . USN ,
ui . MAC ,
addr ,
host ,
ui . Item ,
ui . Status ,
ui . Message ,
ui . PartNO ,
ui . MfgMO ,
ui . MfgSKU ,
params [ "LINE" ] ,
params [ "STAGE" ] ,
ui . FirstAck ,
ui . LastChg ,
)
if err != nil {
txu . 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 = txu . Commit ( )
if err != nil {
txu . Rollback ( )
logger . Printf ( "[ERR] %s; %s; %#v; %s\r\n" , addr , uri , params , err . Error ( ) )
rst [ "RESULT" ] = "NG"
rst [ "ErrMsg" ] = err . Error ( )
return rst
}
2023-12-09 16:12:18 +08:00
rst [ "RESULT" ] = "OK"
rst [ "ErrMsg" ] = "Updated 1 record."
2023-11-25 14:02:30 +08:00
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 {
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 )
2024-03-21 18:07:23 +08:00
//model := ""
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
2024-01-17 18:23:52 +08:00
WHERE % s = ' % s '
2023-11-30 10:57:20 +08:00
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
}
2024-02-27 11:29:09 +08:00
if ul . Status == "NG" {
last = last + fmt . Sprintf ( ` < tr >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< / tr > % s ` , ul . USN , ul . MAC , ul . IPAddr , ul . Relay , ul . Item , ul . Status , ul . Message , ul . LastChg , "\r\n" )
} else {
last = last + fmt . Sprintf ( ` < tr >
2023-11-26 14:22:44 +08:00
< 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" )
2024-02-27 11:29:09 +08:00
}
2023-11-30 10:57:20 +08:00
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 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
2024-01-17 18:23:52 +08:00
WHERE % s = ' % s '
2023-11-30 10:57:20 +08:00
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
}
2024-02-27 11:29:09 +08:00
if uh . Status == "NG" {
bkup = bkup + fmt . Sprintf ( ` < tr >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< td style = "color: red; font-weight: bold;" > % s < / td >
< / tr > % s ` ,
uh . USN , uh . MAC , uh . IPAddr , uh . Relay , uh . Item , uh . Status , uh . Message , uh . LastChg , "\r\n" )
} else {
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
}
2024-01-16 11:39:52 +08:00
//Get Location Information
loc , locTime := "" , ""
var locStmp int64 = 0
if ul . MAC != "" {
qry := dbo . QueryRow ( fmt . Sprintf ( ` SELECT CONCAT_WS(' ', line, CONCAT_WS('-',col,row,num)) AS loc, update_time, update_stmp FROM locinfo WHERE mac='%s' ORDER BY seqid DESC; ` , ul . MAC ) )
qry . Scan ( & loc , & locTime , & locStmp )
} else {
qry := dbo . QueryRow ( fmt . Sprintf ( ` SELECT CONCAT_WS(' ', line, CONCAT_WS('-',col,row,num)) AS loc, update_time, update_stmp FROM locinfo WHERE mac='%s' ORDER BY seqid DESC; ` , uh . MAC ) )
qry . Scan ( & loc , & locTime , & locStmp )
}
if loc == "" {
loc = ` <span style="color: red;">Unknown</span> `
} else {
loc = fmt . Sprintf ( ` <span>%s</span> ` , loc )
}
if time . Now ( ) . Unix ( ) - locStmp >= 3600 {
locTime = fmt . Sprintf ( ` <span style="color: red;">%s</span> ` , locTime )
} else {
locTime = fmt . Sprintf ( ` <span>%s</span> ` , locTime )
}
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 )
2023-12-09 16:25:16 +08:00
2023-11-29 18:14:55 +08:00
return rst
}
2024-01-19 14:56:40 +08:00
func ( e * EWS ) GetIssueReport ( 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
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
}
2024-01-19 14:56:40 +08:00
ri := new ( ReportInfo )
2023-11-29 18:14:55 +08:00
defect := ""
2024-01-19 14:56:40 +08:00
rows , err := dbo . Query ( fmt . Sprintf (
2023-12-08 10:11:04 +08:00
` SELECT usn , partno , mo , sku , line , location , item , status , message , first_ack , last_ack , last_change , diffmins
2024-01-19 14:56:40 +08:00
FROM % s
2024-01-24 10:50:12 +08:00
ORDER BY diffmins ASC ; ` , cfg . MySQL . IssuesView ) )
2023-11-29 18:14:55 +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 rows . Close ( )
num := 1
for rows . Next ( ) {
err := rows . Scan (
2024-01-19 14:56:40 +08:00
& ri . USN ,
& ri . PartNO ,
& ri . MfgMO ,
& ri . SKU ,
& ri . Line ,
& ri . Location ,
& ri . Item ,
& ri . Status ,
& ri . Message ,
& ri . FirstAck ,
& ri . LastAck ,
& ri . LastChg ,
& ri . DiffMins ,
2023-11-29 18:14:55 +08:00
)
if err != nil {
break
}
2023-12-08 10:11:04 +08:00
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 ` ,
2024-01-19 14:56:40 +08:00
num , ri . USN , ri . PartNO , ri . MfgMO , ri . SKU , ri . Line , ri . Location , ri . Item , ri . Status , ri . Message , ri . FirstAck , ri . LastAck , ri . LastChg , ri . DiffMins , "\r\n" )
2023-11-29 18:14:55 +08:00
defect = defect + temp
num += 1
}
rst [ "RESULT" ] = "OK"
rst [ "ErrMsg" ] = e . TemplateDefectInfo ( defect )
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
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
}
2024-01-19 14:56:40 +08:00
ri := new ( ReportInfo )
2023-11-29 18:14:55 +08:00
offline := ""
2024-01-19 14:56:40 +08:00
rows , err := dbo . Query ( fmt . Sprintf (
2023-12-08 10:11:04 +08:00
` SELECT usn , partno , mo , sku , line , location , item , status , message , first_ack , last_ack , last_change , diffmins
2024-01-19 14:56:40 +08:00
FROM % s
2024-01-24 10:50:12 +08:00
ORDER BY diffmins DESC ; ` , cfg . MySQL . OfflineView ) )
2023-11-29 18:14:55 +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 rows . Close ( )
num := 1
for rows . Next ( ) {
err := rows . Scan (
2024-01-19 14:56:40 +08:00
& ri . USN ,
& ri . PartNO ,
& ri . MfgMO ,
& ri . SKU ,
& ri . Line ,
& ri . Location ,
& ri . Item ,
& ri . Status ,
& ri . Message ,
& ri . FirstAck ,
& ri . LastAck ,
& ri . LastChg ,
& ri . DiffMins ,
2023-11-29 18:14:55 +08:00
)
if err != nil {
break
}
2023-12-08 10:11:04 +08:00
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 ` ,
2024-01-19 14:56:40 +08:00
num , ri . USN , ri . PartNO , ri . MfgMO , ri . SKU , ri . Line , ri . Location , ri . Item , ri . Status , ri . Message , ri . FirstAck , ri . LastAck , ri . LastChg , ri . 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
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 : 14 px ; } < / 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
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 : 1 px solid rgb ( 81 , 130 , 187 ) ;
border - collapse : separate ;
2023-11-25 14:08:31 +08:00
border - spacing : 1 px ;
2023-11-25 14:02:30 +08:00
position : static ;
}
th {
background - color : rgb ( 81 , 130 , 187 ) ;
color : # fff ;
border : 1 px solid rgb ( 81 , 130 , 187 ) ;
padding : 5 px 10 px ;
2023-11-29 18:14:55 +08:00
font - size : 12 px ;
2023-11-25 14:02:30 +08:00
font - family : Verdana ;
font - weight : bold ;
}
tr {
border : 1 px solid rgb ( 81 , 130 , 187 ) ;
}
td {
color : # 000 ;
padding : 5 px 10 px ;
2023-11-29 18:14:55 +08:00
font - size : 12 px ;
2023-11-25 14:02:30 +08:00
font - family : Consolas ;
}
span {
2023-12-04 09:57:14 +08:00
font - size : 14 px ;
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 >
2023-12-08 10:11:04 +08:00
< 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 : 1 px solid rgb ( 81 , 130 , 187 ) ;
border - collapse : separate ;
border - spacing : 1 px ;
position : static ;
}
th {
background - color : rgb ( 81 , 130 , 187 ) ;
color : # fff ;
border : 1 px solid rgb ( 81 , 130 , 187 ) ;
padding : 5 px 10 px ;
font - size : 12 px ;
font - family : Verdana ;
font - weight : bold ;
}
tr {
border : 1 px solid rgb ( 81 , 130 , 187 ) ;
}
td {
color : # 000 ;
padding : 5 px 10 px ;
font - size : 12 px ;
font - family : Consolas ;
}
span {
font - size : 14 px ;
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 >
2023-12-08 10:11:04 +08:00
< 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
}