对接旺店通查询供应商列表接口、查询仓库列表接口、查询货品列表接口

This commit is contained in:
97694732@qq.com 2026-06-23 15:39:13 +08:00
parent aa22953f2f
commit 27a28823bb
5 changed files with 303 additions and 11 deletions

View File

@ -63,6 +63,12 @@ external_api:
wangdian: wangdian:
url: "https://api.wangdian.cn/openapi2/purchase_order_push.php" url: "https://api.wangdian.cn/openapi2/purchase_order_push.php"
sandbox_url: "https://sandbox.wangdian.cn/openapi2/purchase_order_push.php" sandbox_url: "https://sandbox.wangdian.cn/openapi2/purchase_order_push.php"
provider_query_url: "https://api.wangdian.cn/openapi2/purchase_provider_query.php"
provider_query_sandbox: "https://sandbox.wangdian.cn/openapi2/purchase_provider_query.php"
warehouse_query_url: "https://api.wangdian.cn/openapi2/warehouse_query.php"
warehouse_query_sandbox: "https://sandbox.wangdian.cn/openapi2/warehouse_query.php"
goods_query_url: "https://api.wangdian.cn/openapi2/goods_query.php"
goods_query_sandbox: "https://sandbox.wangdian.cn/openapi2/goods_query.php"
sandbox: true sandbox: true
sid: "apidevnew2" sid: "apidevnew2"
appkey: "skxz2-test" appkey: "skxz2-test"

View File

@ -76,13 +76,19 @@ type ExternalAPIConfig struct {
} }
type WangdianConfig struct { type WangdianConfig struct {
URL string `yaml:"url"` URL string `yaml:"url"`
SandboxURL string `yaml:"sandbox_url"` SandboxURL string `yaml:"sandbox_url"`
Sandbox bool `yaml:"sandbox"` ProviderQueryURL string `yaml:"provider_query_url"`
Sid string `yaml:"sid"` ProviderQuerySandbox string `yaml:"provider_query_sandbox"`
AppKey string `yaml:"appkey"` WarehouseQueryURL string `yaml:"warehouse_query_url"`
AppSecret string `yaml:"appsecret"` WarehouseQuerySandbox string `yaml:"warehouse_query_sandbox"`
Timeout int `yaml:"timeout"` GoodsQueryURL string `yaml:"goods_query_url"`
GoodsQuerySandbox string `yaml:"goods_query_sandbox"`
Sandbox bool `yaml:"sandbox"`
Sid string `yaml:"sid"`
AppKey string `yaml:"appkey"`
AppSecret string `yaml:"appsecret"`
Timeout int `yaml:"timeout"`
} }
var AppConfig *Config var AppConfig *Config

View File

@ -35,3 +35,81 @@ func (i *WangdianApi) CreatePurchaseOrder(c *gin.Context) {
"message": resp.Message, "message": resp.Message,
}) })
} }
func (i *WangdianApi) QueryProvider(c *gin.Context) {
column := c.Query("column")
providerNo := c.Query("provider_no")
providerName := c.Query("provider_name")
pageSizeStr := c.Query("page_size")
pageNoStr := c.Query("page_no")
pageSize, _ := strconv.Atoi(pageSizeStr)
pageNo, _ := strconv.Atoi(pageNoStr)
resp, err := service.QueryProvider(column, providerNo, providerName, pageSize, pageNo)
if err != nil {
utils.FailWithRequestLog(constant.LoggerChannelWork, "查询旺店通供应商失败: "+err.Error(), err, c, nil)
return
}
c.JSON(http.StatusOK, gin.H{
"code": resp.Code,
"message": resp.Message,
"total_count": resp.TotalCount,
"provider_list": resp.ProviderList,
})
}
func (i *WangdianApi) QueryWarehouse(c *gin.Context) {
warehouseNo := c.Query("warehouse_no")
pageSizeStr := c.Query("page_size")
pageNoStr := c.Query("page_no")
isDisabled := c.Query("is_disabled")
pageSize, _ := strconv.Atoi(pageSizeStr)
pageNo, _ := strconv.Atoi(pageNoStr)
resp, err := service.QueryWarehouse(warehouseNo, 0, 0, pageSize, pageNo, isDisabled)
if err != nil {
utils.FailWithRequestLog(constant.LoggerChannelWork, "查询旺店通仓库失败: "+err.Error(), err, c, nil)
return
}
c.JSON(http.StatusOK, gin.H{
"code": resp.Code,
"message": resp.Message,
"total_count": resp.TotalCount,
"warehouses": resp.Warehouses,
})
}
func (i *WangdianApi) QueryGoods(c *gin.Context) {
specNo := c.Query("spec_no")
goodsNo := c.Query("goods_no")
brandNo := c.Query("brand_no")
className := c.Query("class_name")
barcode := c.Query("barcode")
startTime := c.Query("start_time")
endTime := c.Query("end_time")
pageSizeStr := c.Query("page_size")
pageNoStr := c.Query("page_no")
pageSize, _ := strconv.Atoi(pageSizeStr)
if pageSize <= 0 {
pageSize = 40
}
pageNo, _ := strconv.Atoi(pageNoStr)
resp, err := service.QueryGoods(specNo, goodsNo, brandNo, className, barcode, startTime, endTime, 0, pageSize, pageNo)
if err != nil {
utils.FailWithRequestLog(constant.LoggerChannelWork, "查询旺店通商品失败: "+err.Error(), err, c, nil)
return
}
c.JSON(http.StatusOK, gin.H{
"code": resp.Code,
"message": resp.Message,
"total_count": resp.TotalCount,
"goods_list": resp.GoodsList,
})
}

View File

@ -112,6 +112,9 @@ func initRouter() (r *gin.Engine) {
authOnly.Use(middleware.JWTAuth()) authOnly.Use(middleware.JWTAuth())
{ {
authOnly.POST("/wangdian/purchase-order-push", wangdianApi.CreatePurchaseOrder) // 推送采购单到旺店通 authOnly.POST("/wangdian/purchase-order-push", wangdianApi.CreatePurchaseOrder) // 推送采购单到旺店通
authOnly.GET("/wangdian/query-provider", wangdianApi.QueryProvider) // 查询旺店通供应商
authOnly.GET("/wangdian/query-warehouse", wangdianApi.QueryWarehouse) // 查询旺店通仓库
authOnly.GET("/wangdian/query-goods", wangdianApi.QueryGoods) // 查询旺店通商品
} }
// 需要认证的接口 // 需要认证的接口

View File

@ -53,6 +53,208 @@ type WangdianPurchasePushResponse struct {
Message string `json:"message"` Message string `json:"message"`
} }
type WangdianProviderQueryResponse struct {
Code int `json:"code"`
Message string `json:"message"`
TotalCount int `json:"total_count"`
ProviderList []map[string]interface{} `json:"provider_list"`
}
type WangdianWarehouseQueryResponse struct {
Code int `json:"code"`
Message string `json:"message"`
TotalCount int `json:"total_count"`
Warehouses []map[string]interface{} `json:"warehouses"`
}
func wangdianURL(sandboxURL, productionURL string) string {
cfg := config.AppConfig.Wangdian
if cfg.Sandbox && sandboxURL != "" {
return sandboxURL
}
if productionURL != "" {
return productionURL
}
return productionURL
}
// QueryProvider 查询旺店通供应商
func QueryProvider(column, providerNo, providerName string, pageSize, pageNo int) (*WangdianProviderQueryResponse, error) {
cfg := config.AppConfig.Wangdian
if cfg.Sid == "" || cfg.AppKey == "" || cfg.AppSecret == "" {
return nil, fmt.Errorf("旺店通接口配置不完整(sid/appkey/appsecret)")
}
params := map[string]string{
"sid": cfg.Sid,
"appkey": cfg.AppKey,
"timestamp": strconv.FormatInt(time.Now().Unix(), 10),
}
if column != "" {
params["column"] = column
}
if providerNo != "" {
params["provider_no"] = providerNo
}
if providerName != "" {
params["provider_name"] = providerName
}
if pageSize > 0 {
params["page_size"] = strconv.Itoa(pageSize)
}
if pageNo > 0 {
params["page_no"] = strconv.Itoa(pageNo)
}
params["sign"] = utils.WangdianSign(params, cfg.AppSecret)
url := wangdianURL(cfg.ProviderQuerySandbox, cfg.ProviderQueryURL)
if url == "" {
url = "https://api.wangdian.cn/openapi2/purchase_provider_query.php"
}
timeout := cfg.Timeout
if timeout <= 0 {
timeout = 30
}
log.Printf("[旺店通供应商查询] 请求URL: %s (sandbox=%v), 参数: sid=%s appkey=%s timestamp=%s sign=%s", url, cfg.Sandbox, cfg.Sid, cfg.AppKey, params["timestamp"], params["sign"])
respBody, err := utils.SubmitFormDataWithTimeout(url, params, timeout)
if err != nil {
return nil, fmt.Errorf("查询请求失败: %v", err)
}
log.Printf("[旺店通供应商查询] 返回信息: %s", string(respBody))
var resp WangdianProviderQueryResponse
if err := json.Unmarshal([]byte(respBody), &resp); err != nil {
return nil, fmt.Errorf("解析响应失败(raw=%s): %v", respBody, err)
}
return &resp, nil
}
// QueryWarehouse 查询旺店通仓库
func QueryWarehouse(warehouseNo string, warehouseType int, subType int, pageSize, pageNo int, isDisabled string) (*WangdianWarehouseQueryResponse, error) {
cfg := config.AppConfig.Wangdian
if cfg.Sid == "" || cfg.AppKey == "" || cfg.AppSecret == "" {
return nil, fmt.Errorf("旺店通接口配置不完整(sid/appkey/appsecret)")
}
params := map[string]string{
"sid": cfg.Sid,
"appkey": cfg.AppKey,
"timestamp": strconv.FormatInt(time.Now().Unix(), 10),
}
if warehouseNo != "" {
params["warehouse_no"] = warehouseNo
}
if pageSize > 0 {
params["page_size"] = strconv.Itoa(pageSize)
}
if pageNo > 0 {
params["page_no"] = strconv.Itoa(pageNo)
}
if isDisabled != "" {
params["is_disabled"] = isDisabled
}
params["sign"] = utils.WangdianSign(params, cfg.AppSecret)
url := wangdianURL(cfg.WarehouseQuerySandbox, cfg.WarehouseQueryURL)
if url == "" {
url = "https://api.wangdian.cn/openapi2/warehouse_query.php"
}
timeout := cfg.Timeout
if timeout <= 0 {
timeout = 30
}
log.Printf("[旺店通仓库查询] 请求URL: %s (sandbox=%v), 参数: sid=%s appkey=%s timestamp=%s sign=%s", url, cfg.Sandbox, cfg.Sid, cfg.AppKey, params["timestamp"], params["sign"])
respBody, err := utils.SubmitFormDataWithTimeout(url, params, timeout)
if err != nil {
return nil, fmt.Errorf("查询请求失败: %v", err)
}
log.Printf("[旺店通仓库查询] 返回信息: %s", string(respBody))
var resp WangdianWarehouseQueryResponse
if err := json.Unmarshal([]byte(respBody), &resp); err != nil {
return nil, fmt.Errorf("解析响应失败(raw=%s): %v", respBody, err)
}
return &resp, nil
}
type WangdianGoodsQueryResponse struct {
Code int `json:"code"`
Message string `json:"message"`
TotalCount int `json:"total_count"`
GoodsList []map[string]interface{} `json:"goods_list"`
}
// QueryGoods 查询旺店通商品
func QueryGoods(specNo, goodsNo, brandNo, className, barcode, startTime, endTime string, deleted int, pageSize, pageNo int) (*WangdianGoodsQueryResponse, error) {
cfg := config.AppConfig.Wangdian
if cfg.Sid == "" || cfg.AppKey == "" || cfg.AppSecret == "" {
return nil, fmt.Errorf("旺店通接口配置不完整(sid/appkey/appsecret)")
}
params := map[string]string{
"sid": cfg.Sid,
"appkey": cfg.AppKey,
"timestamp": strconv.FormatInt(time.Now().Unix(), 10),
}
if specNo != "" {
params["spec_no"] = specNo
}
if goodsNo != "" {
params["goods_no"] = goodsNo
}
if brandNo != "" {
params["brand_no"] = brandNo
}
if className != "" {
params["class_name"] = className
}
if barcode != "" {
params["barcode"] = barcode
}
if startTime != "" {
params["start_time"] = startTime
}
if endTime != "" {
params["end_time"] = endTime
}
params["page_size"] = strconv.Itoa(pageSize)
params["page_no"] = strconv.Itoa(pageNo)
params["sign"] = utils.WangdianSign(params, cfg.AppSecret)
url := wangdianURL(cfg.GoodsQuerySandbox, cfg.GoodsQueryURL)
if url == "" {
url = "https://api.wangdian.cn/openapi2/goods_query.php"
}
timeout := cfg.Timeout
if timeout <= 0 {
timeout = 30
}
log.Printf("[旺店通商品查询] 请求URL: %s (sandbox=%v), 参数: sid=%s appkey=%s timestamp=%s sign=%s", url, cfg.Sandbox, cfg.Sid, cfg.AppKey, params["timestamp"], params["sign"])
respBody, err := utils.SubmitFormDataWithTimeout(url, params, timeout)
if err != nil {
return nil, fmt.Errorf("查询请求失败: %v", err)
}
log.Printf("[旺店通商品查询] 返回信息: %s", string(respBody))
var resp WangdianGoodsQueryResponse
if err := json.Unmarshal([]byte(respBody), &resp); err != nil {
return nil, fmt.Errorf("解析响应失败(raw=%s): %v", respBody, err)
}
return &resp, nil
}
func PushPurchaseOrder(purchaseOrderID int64, db ...*gorm.DB) (*WangdianPurchasePushResponse, error) { func PushPurchaseOrder(purchaseOrderID int64, db ...*gorm.DB) (*WangdianPurchasePushResponse, error) {
databaseConn := database.OptionalDB(db...) databaseConn := database.OptionalDB(db...)
@ -157,10 +359,7 @@ func PushPurchaseOrder(purchaseOrderID int64, db ...*gorm.DB) (*WangdianPurchase
params["sign"] = utils.WangdianSign(params, cfg.AppSecret) params["sign"] = utils.WangdianSign(params, cfg.AppSecret)
// 9. 提交请求 // 9. 提交请求
url := cfg.URL url := wangdianURL(cfg.SandboxURL, cfg.URL)
if cfg.Sandbox && cfg.SandboxURL != "" {
url = cfg.SandboxURL
}
if url == "" { if url == "" {
url = "https://api.wangdian.cn/openapi2/purchase_order_push.php" url = "https://api.wangdian.cn/openapi2/purchase_order_push.php"
} }