232 lines
7.4 KiB
Go
232 lines
7.4 KiB
Go
package jxprintapi
|
||
|
||
import (
|
||
"crypto/md5"
|
||
"encoding/json"
|
||
"fmt"
|
||
"git.rosy.net.cn/baseapi/platformapi"
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"net/http"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
const (
|
||
prodURL = "http://api.jxc4.com/openapi/CallOpenAPI" // 老版本的URL
|
||
prodURLNew = "http://print.jxcs.net/v2/openapi/CallOpenAPI" // 新版本的URL
|
||
signKey = "sign"
|
||
)
|
||
const (
|
||
// ResponseCodeSuccess 操作成功
|
||
ResponseCodeSuccess = 0
|
||
)
|
||
|
||
const (
|
||
PrinterStatusStrOffline = "离线。"
|
||
PrinterStatusStrOnlineOK = "在线,工作状态正常。"
|
||
PrinterStatusStrOnlineAbnormal = "在线,工作状态不正常。"
|
||
|
||
PrinterStatusUnknown = 0
|
||
PrinterStatusOffline = -1
|
||
PrinterStatusOnlineOK = 1
|
||
PrinterStatusOnlineAbnormal = 2
|
||
)
|
||
|
||
var (
|
||
printStatusMap = map[string]int{
|
||
PrinterStatusStrOffline: PrinterStatusOffline,
|
||
PrinterStatusStrOnlineOK: PrinterStatusOnlineOK,
|
||
PrinterStatusStrOnlineAbnormal: PrinterStatusOnlineAbnormal,
|
||
}
|
||
)
|
||
|
||
type API struct {
|
||
platformapi.APICookie
|
||
|
||
appID string
|
||
appKey string
|
||
client *http.Client
|
||
config *platformapi.APIConfig
|
||
}
|
||
|
||
func New(appID, appKey string, config ...*platformapi.APIConfig) *API {
|
||
curConfig := platformapi.DefAPIConfig
|
||
if len(config) > 0 {
|
||
curConfig = *config[0]
|
||
}
|
||
return &API{
|
||
appID: appID,
|
||
appKey: appKey,
|
||
client: &http.Client{Timeout: curConfig.ClientTimeout},
|
||
config: &curConfig,
|
||
}
|
||
}
|
||
|
||
func (a *API) signParams(apiParams map[string]interface{}) string {
|
||
return fmt.Sprintf("%x", md5.Sum([]byte(a.appID+a.appKey+apiParams["timestamp"].(string))))
|
||
}
|
||
|
||
func (a *API) AccessAPI(apiName string, apiParams map[string]interface{}) (retVal map[string]interface{}, err error) {
|
||
params := utils.MergeMaps(map[string]interface{}{
|
||
"app_id": a.appID,
|
||
"method": apiName,
|
||
}, apiParams)
|
||
|
||
err = platformapi.AccessPlatformAPIWithRetry(a.client,
|
||
func() *http.Request {
|
||
params["timestamp"] = utils.Int64ToStr(time.Now().Unix())
|
||
sign := a.signParams(params)
|
||
params[signKey] = sign
|
||
fullURL := prodURLNew
|
||
request, _ := http.NewRequest(http.MethodPost, fullURL, strings.NewReader(utils.Map2URLValues(params).Encode()))
|
||
request.Header.Set("charset", "UTF-8")
|
||
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||
return request
|
||
},
|
||
a.config,
|
||
func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
|
||
if jsonResult1 == nil {
|
||
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
|
||
}
|
||
code := int(utils.Interface2Int64WithDefault(jsonResult1["code"], ResponseCodeSuccess))
|
||
if code == ResponseCodeSuccess {
|
||
retVal = jsonResult1
|
||
return platformapi.ErrLevelSuccess, nil
|
||
}
|
||
newErr := utils.NewErrorIntCode(jsonResult1["desc"].(string), code)
|
||
return platformapi.ErrLevelCodeIsNotOK, newErr
|
||
})
|
||
return retVal, err
|
||
}
|
||
|
||
type AddPrinterParam struct {
|
||
PrintNo string `json:"print_no"` //打印机编号
|
||
Name string `json:"name"` //打印机备注名
|
||
SIM string `json:"sim"` //sim卡号-电话号码,接受验证的电话
|
||
StoreId int64 `json:"store_id"` // 门店id
|
||
}
|
||
|
||
func (a *API) AddPrinter(addPrinterParams []*AddPrinterParam) (err error) {
|
||
data, _ := json.Marshal(addPrinterParams)
|
||
_, err = a.AccessAPI("AddPrinter", map[string]interface{}{
|
||
"prints": string(data),
|
||
})
|
||
return err
|
||
}
|
||
|
||
func (a *API) DelPrinter(printNos []string, storeId string) (err error) {
|
||
data, _ := json.Marshal(printNos)
|
||
_, err = a.AccessAPI("DelPrinter", map[string]interface{}{
|
||
"print_nos": string(data),
|
||
"storeId": storeId,
|
||
})
|
||
return err
|
||
}
|
||
|
||
type UpdatePrinterParam struct {
|
||
PrintNo string `json:"print_no"` //打印机编号
|
||
Name string `json:"name,omitempty"` //打印机备注名
|
||
//SIM string `json:"sim,omitempty"` //sim卡号
|
||
Sound string `json:"sound,omitempty"`
|
||
Volume int `json:"volume,omitempty"`
|
||
}
|
||
|
||
func (a *API) UpdatePrinter(updatePrinterParam *UpdatePrinterParam) (err error) {
|
||
_, err = a.AccessAPI("UpdatePrinter", utils.Struct2FlatMap(updatePrinterParam))
|
||
return err
|
||
}
|
||
|
||
func (a *API) DelPrinterSeq(printNo string) (err error) {
|
||
_, err = a.AccessAPI("DelPrinterSeq", map[string]interface{}{
|
||
"print_no": printNo,
|
||
})
|
||
return err
|
||
}
|
||
|
||
type GetPrintMsgResult struct {
|
||
MsgID string `json:"msg_id"`
|
||
PrintNo string `json:"print_no"`
|
||
OrderNo int `json:"order_no"`
|
||
Content string `json:"content"`
|
||
Status int `json:"status"`
|
||
Comment string `json:"comment"`
|
||
}
|
||
|
||
func (a *API) GetPrintMsg(msgID string) (getPrintMsgResult *GetPrintMsgResult, err error) {
|
||
result, err := a.AccessAPI("GetPrintMsg", map[string]interface{}{
|
||
"msg_id": msgID,
|
||
})
|
||
if err == nil {
|
||
utils.Map2StructByJson(result["data"].(map[string]interface{}), &getPrintMsgResult, false)
|
||
}
|
||
return getPrintMsgResult, err
|
||
}
|
||
|
||
func (a *API) GetPrinterStatus(printNo string) (status int64, err error) {
|
||
result, err := a.AccessAPI("GetPrinterStatus", map[string]interface{}{
|
||
"print_no": printNo,
|
||
})
|
||
if err == nil {
|
||
status = utils.Interface2Int64WithDefault(result["data"], 0)
|
||
}
|
||
return status, err
|
||
}
|
||
|
||
func (a *API) DoPrint(printNo, content string, orderNo int) (msgID string, err error) {
|
||
content = utils.FilterMb4(content)
|
||
result, err := a.AccessAPI("DoPrint", map[string]interface{}{
|
||
"print_no": printNo,
|
||
"content": content,
|
||
"order_no": orderNo,
|
||
})
|
||
if err == nil {
|
||
msgID = result["data"].(string)
|
||
}
|
||
return msgID, err
|
||
}
|
||
|
||
func (a *API) GetPrintList(printNo, printKey string, status, isOnline int, page, size int) ([]*PrintList, int64, error) {
|
||
result, err := a.AccessAPI("QueryPrintList", map[string]interface{}{
|
||
"print_no": printNo,
|
||
"print_key": printKey,
|
||
"status": status,
|
||
"is_online": isOnline,
|
||
"page": page,
|
||
"size": size,
|
||
})
|
||
if err != nil {
|
||
return nil, 0, err
|
||
}
|
||
list := result["data"].(map[string]interface{})
|
||
printList := make([]*PrintList, 0, 0)
|
||
byteDate, err := json.Marshal(list["printList"].([]interface{}))
|
||
if err != nil {
|
||
return nil, 0, err
|
||
}
|
||
if err = json.Unmarshal(byteDate, &printList); err != nil {
|
||
return nil, 0, err
|
||
}
|
||
|
||
return printList, utils.MustInterface2Int64(list["count"]), nil
|
||
}
|
||
|
||
type PrintList struct {
|
||
ID int `orm:"column(id)" json:"id"`
|
||
CreatedAt string `orm:"auto_now_add;type(datetime)" json:"createdAt"`
|
||
UpdatedAt string `orm:"auto_now;type(datetime)" json:"updatedAt"`
|
||
DeletedAt string `orm:"type(datetime);null" json:"deletedAt"`
|
||
LastOperator string `orm:"size(32)" json:"lastOperator"` // 最后操作员
|
||
AppID int `orm:"column(app_id)" json:"app_id" db:"app_id"` //应用编号
|
||
PrintNo string `json:"print_no" db:"print_no"` //打印机编号
|
||
PrintKey string `json:"print_key" db:"print_key"` //打印机识别码
|
||
Name string `json:"name" db:"name"` //打印机备注名
|
||
Status int `json:"status" db:"status"` //打印机状态
|
||
IsOnline int `json:"is_online" db:"is_online"` //1在线,0离线
|
||
IccID string `orm:"column(icc_id)" json:"iccid" db:"icc_id"` //sim卡号
|
||
Sound string `json:"sound" db:"sound"` //声音类型 sounda ,b,c,d,e,f,g
|
||
Volume int `json:"volume" db:"volume"` //音量,1-5 ,对应打印机2-10
|
||
FlowFlag int `json:"flowFlag" db:"flow_flag"` //是否超流量了,1表示超了
|
||
OfflineCount int `json:"offlineCount" db:"offline_count"` //掉线次数
|
||
UserId string `json:"user_id" db:"user_id"` //打印机所属用户
|
||
}
|