Files
baseapi/platformapi/xpyunapi/xpyunapi.go
richboo111 c3db1d3e37 1
2023-03-20 14:13:17 +08:00

315 lines
9.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package xpyunapi
import (
"errors"
"fmt"
"git.rosy.net.cn/baseapi/platformapi"
"net/http"
"strconv"
"strings"
"sync"
)
const (
baseURL = "https://open.xpyun.net/api/openapi/xprinter/"
signKey = "sign"
timestampKey = "timestamp"
debugTest = 1 //debug=1返回非json格式的数据仅测试时候使用
)
const (
ResponseCodeSuccess = 0 //成功
ResponseMsgSuccess = "ok"
)
var (
exceedLimitCodes = map[string]int{}
canRetryCodes = map[string]int{}
)
type API struct {
locker sync.RWMutex
accessToken string
userName string
userKey string
client *http.Client
config *platformapi.APIConfig
}
//初始化
func New(userName, userKey string, config ...*platformapi.APIConfig) *API {
curConfig := platformapi.DefAPIConfig
if len(config) > 0 {
curConfig = *config[0]
}
return &API{
userName: userName,
userKey: userKey,
client: &http.Client{Timeout: curConfig.ClientTimeout},
config: &curConfig,
}
}
//生成签名
func (a *API) GenerateSign() string {
return Sign(a.userName + a.userKey + strconv.FormatInt(GetMillisecond(), 10))
}
//生成 RestRequest
func (a *API) GenerateRestRequest() RestRequest {
return RestRequest{
User: a.userName,
UserKey: a.userKey,
Timestamp: GetMillisecond(),
Sign: a.GenerateSign(),
}
}
func xpyunPostJson(url string, request interface{}) *XPYunResp {
result := HttpPostJson(url, request)
return result
}
// 1.添加打印机到开发者账户(可批量)
func (a *API) AddPrinters(sn, printerName string) error {
url := baseURL + "addPrinters"
request := &AddPrinterRequest{
RestRequest: a.GenerateRestRequest(),
Items: []*AddPrinterRequestItem{{
Sn: sn,
Name: printerName,
}},
}
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return fmt.Errorf("%v", XpuErrMsg2[resp.Content.Msg])
}
retVal, _ := resp.Content.Data.(map[string]interface{})
failMsg := ""
if len(retVal["failMsg"].([]interface{})) > 0 {
for _, v := range retVal["failMsg"].([]interface{}) {
t := strings.Split(v.(string), ":")
failMsg += t[0] + XpuErrMsg[t[1]]
}
return fmt.Errorf("添加打印机错误:%v", failMsg)
}
return nil
}
//2.设置打印机语音类型
func (a *API) SetVoiceType(sn string, soundSize int) error {
url := baseURL + "setVoiceType"
request := &SetVoiceTypeRequest{
RestRequest: a.GenerateRestRequest(),
Sn: sn,
VoiceType: VoiceTypeOtherPerson,
VolumeLevel: soundSize,
}
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return fmt.Errorf("%v", XpuErrMsg2[resp.Content.Msg])
}
retVal, _ := resp.Content.Data.(map[string]interface{})
failMsg := ""
if retVal != nil && len(retVal["failMsg"].([]interface{})) > 0 {
for _, v := range retVal["failMsg"].([]interface{}) {
t := strings.Split(v.(string), ":")
failMsg += t[0] + XpuErrMsg[t[1]]
}
return fmt.Errorf("设置打印机运营类型错误:%v", failMsg)
}
return nil
}
//3.打印小票订单
func (a *API) Print(request *PrintRequest) (string, error) {
url := baseURL + "print"
request.RestRequest = a.GenerateRestRequest()
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return "0", errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return "0", fmt.Errorf("%v", XpuErrMsg2[resp.Content.Msg])
}
retVal, _ := resp.Content.Data.(string)
if len(retVal) > 0 {
return retVal, nil
} else {
return "0", nil
}
}
// 5.批量删除打印机
func (a *API) DelPrinters(snList []string) error {
url := baseURL + "delPrinters"
request := &DelPrinterRequest{
RestRequest: a.GenerateRestRequest(),
SnList: snList,
}
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return fmt.Errorf("%v", XpuErrMsg2[resp.Content.Msg])
}
retVal, _ := resp.Content.Data.(map[string]interface{})
failMsg := ""
if retVal != nil && len(retVal["failMsg"].([]interface{})) > 0 {
for _, v := range retVal["failMsg"].([]interface{}) {
t := strings.Split(v.(string), ":")
failMsg += t[0] + XpuErrMsg[t[1]]
}
return fmt.Errorf("删除打印机错误:%v", failMsg)
}
return nil
}
//6.修改打印机信息
func (a *API) UpdatePrinter(request *UpdPrinterRequest) error {
url := baseURL + "updPrinter"
request.RestRequest = a.GenerateRestRequest()
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return fmt.Errorf("%v", XpuErrMsg2[resp.Content.Msg])
}
retVal, _ := resp.Content.Data.(map[string]interface{})
failMsg := ""
if retVal != nil && len(retVal["failMsg"].([]interface{})) > 0 {
for _, v := range retVal["failMsg"].([]interface{}) {
t := strings.Split(v.(string), ":")
failMsg += t[0] + XpuErrMsg[t[1]]
}
return fmt.Errorf("修改打印机信息错误:%v", failMsg)
}
return nil
}
//7.清空待打印队列
func (a *API) EmptyPrinterQueue(sn string) error {
url := baseURL + "delPrinterQueue"
request := &EmpPrinterQueueRequest{
RestRequest: a.GenerateRestRequest(),
Sn: sn,
}
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return fmt.Errorf("%v", XpuErrMsg[resp.Content.Msg])
}
retVal, _ := resp.Content.Data.(map[string]interface{})
failMsg := ""
if retVal != nil && len(retVal["failMsg"].([]interface{})) > 0 {
for _, v := range retVal["failMsg"].([]interface{}) {
t := strings.Split(v.(string), ":")
failMsg += t[0] + XpuErrMsg[t[1]]
}
return fmt.Errorf("清空待打印机队列错误:%v", failMsg)
}
return nil
}
//8.查询订单状态
func (a *API) QueryOrderState(request *QueryOrderStateRequest) (bool, error) {
url := baseURL + "queryOrderState"
request.RestRequest = a.GenerateRestRequest()
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return false, errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return false, fmt.Errorf("%v", XpuErrMsg2[resp.Content.Msg])
}
return resp.Content.Data.(bool), nil
}
//9.查询打印机某天的订单统计数
func (a *API) QueryOrderStatis(request *QueryOrderStatisRequest) (printed, waiting float64, err error) {
url := baseURL + "queryOrderStatis"
request.RestRequest = a.GenerateRestRequest()
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return 0, 0, errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return 0, 0, fmt.Errorf("%v", XpuErrMsg2[resp.Content.Msg])
}
retVal, _ := resp.Content.Data.(map[string]interface{})
if retVal != nil {
printed = retVal["printed"].(float64)
waiting = retVal["waiting"].(float64)
return printed, waiting, nil
}
return 0, 0, nil
}
//10.获取指定打印机状态
//* 0、离线 1、在线正常 2、在线不正常
// * 备注异常一般是无纸离线的判断是打印机与服务器失去联系超过30秒
func (a *API) QueryPrinterStatus(sn string) (interface{}, error) {
url := baseURL + "queryPrinterStatus"
request := &QueryPrinterStatusRequest{
RestRequest: a.GenerateRestRequest(),
Sn: sn,
}
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return PrinterStateError, errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return PrinterStateError, fmt.Errorf("%v", XpuErrMsg2[resp.Content.Msg])
}
if resp.Content.Data != nil && resp.Content.Data.(float64) >= 0 {
return resp.Content.Data, nil
}
return PrinterStateError, nil
}
//11.批量获取指定打印机状态
func (a *API) QueryPrintersStatus(request *QueryPrintersStatusRequest) ([]float64, error) {
url := baseURL + "queryPrintersStatus"
request.RestRequest = a.GenerateRestRequest()
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return nil, errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return nil, fmt.Errorf("%v", XpuErrMsg2[resp.Content.Msg])
}
retVal := []float64{}
if resp.Content.Data != nil && resp.Content.Data.(float64) >= 0 {
for _, v := range resp.Content.Data.([]interface{}) {
retVal = append(retVal, v.(float64))
}
}
return nil, nil
}
//12.金额播报
func (a *API) PlayVoice(request *PlayVoiceRequest) error {
url := baseURL + "playVoice"
request.RestRequest = a.GenerateRestRequest()
resp := xpyunPostJson(url, request)
if resp.HttpStatusCode != HttpStatusSuccessCode {
return errors.New("HTTP请求错误请检查重试")
}
if resp.Content.Code != ResponseCodeSuccess {
return fmt.Errorf("%v", XpuErrMsg2[resp.Content.Msg])
}
return nil
}