Files
baseapi/platformapi/trenditapi/trenditapi.go
richboo111 0901cfc573 im
2023-04-25 10:31:54 +08:00

231 lines
6.2 KiB
Go

package trenditapi
import (
"crypto/md5"
"encoding/json"
"fmt"
"git.rosy.net.cn/baseapi/platformapi"
"git.rosy.net.cn/baseapi/utils"
"io/ioutil"
r "math/rand"
"net/http"
"regexp"
"strconv"
"strings"
"sync"
"time"
"unicode"
)
type API struct {
locker sync.RWMutex
accessToken string
appID string
appSecret string
client *http.Client
config *platformapi.APIConfig
}
func New(appID, appSecret string, config ...*platformapi.APIConfig) *API {
curConfig := platformapi.DefAPIConfig
if len(config) > 0 {
curConfig = *config[0]
}
return &API{
appID: appID,
appSecret: appSecret,
client: &http.Client{Timeout: curConfig.ClientTimeout},
config: &curConfig,
}
}
//生成BaseReq
func (a *API) GenBaseReq(bizParams interface{}) *BaseReq {
//生成通用参数
uid := utils.Time2Str(time.Now()) + RandString()
timestamp := utils.Int64ToStr(time.Now().Unix())
return &BaseReq{
AppID: a.appID,
Uid: uid,
STime: timestamp,
Sign: a.sign(uid, timestamp, "bizParams"),
}
}
//生成随机字符串
func RandString() string {
bytes := make([]byte, 16)
for i := 0; i < 16; i++ {
b := r.Intn(26) + 65
bytes[i] = byte(b)
}
return string(bytes)
}
func (a *API) sign(uid, timestamp string, param string) (sign string) {
aa := uid + a.appID + timestamp + a.appSecret + param
return fmt.Sprintf("%x", md5.Sum([]byte(aa)))
}
func (a *API) HttpPostJson(url string, data interface{}) *TIResponse {
//序列化参数
b, err := json.Marshal(&data)
if err != nil {
var msg = fmt.Sprintf("json serialize err:%+v", err)
fmt.Println(msg)
result := TIResponse{
HttpStatusCode: 500,
}
return &result
}
fullUrl := utils.GenerateGetURL(BaseUrl, url, nil)
request, err := http.NewRequest(http.MethodPost, fullUrl, strings.NewReader(string(b)))
client := &http.Client{}
timestamp := utils.Int64ToStr(time.Now().Unix())
uid := timestamp + RandString()
sign := a.sign(uid, timestamp, string(b))
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
request.Header.Set("appid", a.appID)
request.Header.Set("uid", uid)
request.Header.Set("stime", timestamp)
request.Header.Set("sign", sign)
resp, err := client.Do(request)
//resp, err := http.Post(utils.GenerateGetURL(BaseUrl, url, nil), "application/json;charset=UTF-8", bytes.NewBuffer(b))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
var msg = fmt.Sprintf("post json error:%+v", err)
fmt.Println(msg)
}
result := TIResponse{
HttpStatusCode: resp.StatusCode,
}
var content BaseResp
err = json.Unmarshal(body, &content)
if err == nil {
result.BaseRes = &content
} else {
var msg = fmt.Sprintf("unmarshal body failed, error:%+v", err)
fmt.Println(msg)
}
return &result
}
func StrRepeat(str string, repeatTimes int) string {
return strings.Repeat(str, repeatTimes)
}
func CalcAsciiLenForPrint(data string) int {
return len(data)
}
func FormatPrintOrderItemBig(foodName string, quantity int, price float64) string {
orderNameEmpty := StrRepeat(" ", 8)
quantityStr := strconv.Itoa(quantity)
temprice := price / 100
priceStr := fmt.Sprintf("%.2f", temprice)
subtotalStr := fmt.Sprintf("%.2f", utils.Int2Float64(quantity)*temprice)
result := `<font# bolder=1 height=2 width=1>` + foodName + "</font#><BR>"
result += `<font# bolder=1 height=2 width=1>` + orderNameEmpty + "x" + quantityStr + `</font#><font# bolder=0 height=1 width=1> </font#>`
result += `<font# bolder=1 height=2 width=1>` + "¥" + priceStr + `</font#><font# bolder=0 height=1 width=1> </font#>`
result += `<font# bolder=1 height=2 width=1>` + "¥" + subtotalStr + `</font#>`
//result += "<BR>"
return result
}
func FormatPrintOrderItem(foodName string, quantity int, price float64) string {
orderNameEmpty := StrRepeat(" ", 8)
quantityStr := strconv.Itoa(quantity)
temprice := price / 100
priceStr := fmt.Sprintf("%.2f", temprice)
subtotalStr := fmt.Sprintf("%.2f", utils.Int2Float64(quantity)*temprice)
result := foodName + "<BR>"
result += orderNameEmpty + "x" + quantityStr + `<font# bolder=0 height=1 width=1> </font#>`
result += "¥" + priceStr + `<font# bolder=0 height=1 width=1> </font#>`
result += "¥" + subtotalStr
result += "<BR>"
return result
}
const (
ROW_MAX_CHAR_LEN = 34
LAST_ROW_MAX_NAME_CHAR_LEN = 16
MAX_NAME_CHAR_LEN = 16
MaxLineLength = 30
LineLength = 32
NewLineLength = 28
)
//不带单价版本
func FormatPrintOrderItemV2(foodName string, quantity, cnt int) string {
var (
result = ""
restLen int
)
quantityStr := strconv.Itoa(quantity)
foodNameLen := CalWidth(foodName) + 3
if foodNameLen >= MaxLineLength {
if n := foodNameLen / LineLength; n > 0 {
restLen = foodNameLen % LineLength
} else {
restLen = foodNameLen - LineLength
}
result += `<font# bolder=0 height=2 width=1>` + utils.Int2Str(cnt) + `.` + foodName
result += StrRepeat(" ", MaxLineLength-restLen) + `x` + quantityStr + `</font#>`
} else {
result += `<font# bolder=0 height=2 width=1>` + utils.Int2Str(cnt) + `.` + foodName + StrRepeat(" ", MaxLineLength-foodNameLen) + `x` + quantityStr + `</font#>`
}
result += "<BR>"
fmt.Println(result)
return result
}
func FormatPrintOrderItemBigV2(foodName string, quantity, cnt int) string {
var (
result = ""
restLen int
)
quantityStr := strconv.Itoa(quantity)
foodNameLen := CalWidth(foodName) + 3
if foodNameLen >= MaxLineLength {
if n := foodNameLen / LineLength; n > 0 {
restLen = foodNameLen % LineLength
} else {
restLen = foodNameLen - LineLength
}
result += `<font# bolder=1 height=2 width=1>` + utils.Int2Str(cnt) + `.` + foodName
result += StrRepeat(" ", MaxLineLength-restLen) + `x` + quantityStr + `</font#>`
} else {
result += `<font# bolder=1 height=2 width=1>` + utils.Int2Str(cnt) + `.` + foodName + StrRepeat(" ", MaxLineLength-foodNameLen) + `x` + quantityStr + `</font#>`
}
result += "<BR>"
fmt.Println(result)
return result
}
//正则计算宽度
func CalWidth(str string) int {
hzc := 0
for _, v := range str {
if unicode.Is(unicode.Han, v) {
hzc++
}
}
updateStr := regexp.MustCompile("[\u4e00-\u9fa5]{1,}").ReplaceAllString(str, "")
l := len(updateStr)
fmt.Println(hzc)
ans := 2*hzc + l
return ans
}