99 lines
3.2 KiB
Go
99 lines
3.2 KiB
Go
package showapi
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"git.rosy.net.cn/baseapi/utils"
|
|
)
|
|
|
|
const (
|
|
RetCodeFailed = -1
|
|
RetCodeSuccess = 0
|
|
)
|
|
|
|
type ProductInfo struct {
|
|
OriginalName string `json:"originalName"`
|
|
OriginalSpec string `json:"originalSpec"`
|
|
Name string `json:"name"`
|
|
Img string `json:"img"`
|
|
SpecQuality int `json:"specQuality"`
|
|
SpecUnit string `json:"specUnit"`
|
|
Unit string `json:"unit"`
|
|
Weight float32 `json:"weight"`
|
|
Price int `json:"price"`
|
|
Categories []string `json:"categories"`
|
|
ManName string `json:"manName"` // 生产商
|
|
BrandName string `json:"brandName"`
|
|
}
|
|
|
|
var (
|
|
specPat *regexp.Regexp
|
|
specUnitMap = map[string]string{
|
|
"克": "g",
|
|
"千克": "kg",
|
|
"升": "L",
|
|
"毫升": "ml",
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
specPat = regexp.MustCompile(`(\d+)([^\/]+)(?:\/(.+))?`)
|
|
}
|
|
|
|
func SplitProductSpec(spec string) (specQuality int, specUnit, Unit string) {
|
|
searchResult := specPat.FindStringSubmatch(spec)
|
|
// baseapi.SugarLogger.Debug(utils.Format4Output(searchResult, false))
|
|
if len(searchResult) == 4 {
|
|
return int(utils.Str2Int64WithDefault(searchResult[1], 0)), searchResult[2], searchResult[3]
|
|
}
|
|
return 0, "", ""
|
|
}
|
|
|
|
func CalculateWeight(specQuality int, specUnit string) (weight float32) {
|
|
weight = float32(specQuality)
|
|
if specUnit == "g" || specUnit == "ml" {
|
|
weight /= 1000
|
|
}
|
|
return weight
|
|
}
|
|
|
|
func (a *API) GetProductInfoByBarCode(barCode string) (product *ProductInfo, err error) {
|
|
res := ShowapiRequest("http://route.showapi.com/66-22", a.appID, a.appSecret)
|
|
res.AddTextPara("code", barCode)
|
|
result, err := res.Post()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var jsonResult map[string]interface{}
|
|
if err = utils.UnmarshalUseNumber([]byte(result), &jsonResult); err != nil {
|
|
return nil, err
|
|
}
|
|
showApiResCode := int(utils.MustInterface2Int64(jsonResult["showapi_res_code"]))
|
|
if showApiResCode != 0 {
|
|
return nil, utils.NewErrorIntCode(utils.Interface2String(jsonResult["showapi_res_error"]), showApiResCode)
|
|
}
|
|
// baseapi.SugarLogger.Debug(utils.Format4Output(jsonResult, false))
|
|
|
|
showapiResBody := jsonResult["showapi_res_body"].(map[string]interface{})
|
|
retCode := int(utils.ForceInterface2Int64(showapiResBody["ret_code"]))
|
|
if retCode != RetCodeSuccess {
|
|
return nil, utils.NewErrorIntCode(utils.Interface2String(showapiResBody["remark"]), retCode)
|
|
}
|
|
product = &ProductInfo{
|
|
OriginalName: showapiResBody["goodsName"].(string),
|
|
OriginalSpec: showapiResBody["spec"].(string),
|
|
Img: utils.Interface2String(showapiResBody["img"]),
|
|
Price: int(math.Round(utils.Str2Float64WithDefault(utils.Interface2String(showapiResBody["price"]), 0))),
|
|
Categories: strings.Split(utils.Interface2String(showapiResBody["goodsType"]), ">>"),
|
|
ManName: showapiResBody["manuName"].(string),
|
|
BrandName: showapiResBody["trademark"].(string),
|
|
}
|
|
product.SpecQuality, product.SpecUnit, product.Unit = SplitProductSpec(product.OriginalSpec)
|
|
product.Name = utils.TrimBlankChar(strings.Replace(product.OriginalName, fmt.Sprintf("%d%s", product.SpecQuality, product.SpecUnit), "", -1))
|
|
product.Weight = CalculateWeight(product.SpecQuality, product.SpecUnit)
|
|
return product, err
|
|
}
|