Files
baseapi/platformapi/showapi/barcode.go
2025-11-21 09:09:09 +08:00

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
}