From 27a28823bba19c4d40e20bde4898840f9a3bb77e Mon Sep 17 00:00:00 2001 From: "97694732@qq.com" Date: Tue, 23 Jun 2026 15:39:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E6=97=BA=E5=BA=97=E9=80=9A?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BE=9B=E5=BA=94=E5=95=86=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E3=80=81=E6=9F=A5=E8=AF=A2=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=E3=80=81=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=B4=A7=E5=93=81=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.yaml | 6 ++ config/config.go | 20 ++-- controllers/wangdian.go | 78 +++++++++++++++ routes/routes.go | 3 + service/wangdian.go | 207 +++++++++++++++++++++++++++++++++++++++- 5 files changed, 303 insertions(+), 11 deletions(-) diff --git a/config.yaml b/config.yaml index 1c7ea10..244c62e 100644 --- a/config.yaml +++ b/config.yaml @@ -63,6 +63,12 @@ external_api: wangdian: url: "https://api.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 sid: "apidevnew2" appkey: "skxz2-test" diff --git a/config/config.go b/config/config.go index 9a576fe..ac5b931 100644 --- a/config/config.go +++ b/config/config.go @@ -76,13 +76,19 @@ type ExternalAPIConfig struct { } type WangdianConfig struct { - URL string `yaml:"url"` - SandboxURL string `yaml:"sandbox_url"` - Sandbox bool `yaml:"sandbox"` - Sid string `yaml:"sid"` - AppKey string `yaml:"appkey"` - AppSecret string `yaml:"appsecret"` - Timeout int `yaml:"timeout"` + URL string `yaml:"url"` + SandboxURL string `yaml:"sandbox_url"` + ProviderQueryURL string `yaml:"provider_query_url"` + ProviderQuerySandbox string `yaml:"provider_query_sandbox"` + WarehouseQueryURL string `yaml:"warehouse_query_url"` + WarehouseQuerySandbox string `yaml:"warehouse_query_sandbox"` + 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 diff --git a/controllers/wangdian.go b/controllers/wangdian.go index 26282ae..495f42e 100644 --- a/controllers/wangdian.go +++ b/controllers/wangdian.go @@ -35,3 +35,81 @@ func (i *WangdianApi) CreatePurchaseOrder(c *gin.Context) { "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, + }) +} diff --git a/routes/routes.go b/routes/routes.go index 34b5ada..e50025e 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -112,6 +112,9 @@ func initRouter() (r *gin.Engine) { authOnly.Use(middleware.JWTAuth()) { 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) // 查询旺店通商品 } // 需要认证的接口 diff --git a/service/wangdian.go b/service/wangdian.go index 2a0a738..903bc0d 100644 --- a/service/wangdian.go +++ b/service/wangdian.go @@ -53,6 +53,208 @@ type WangdianPurchasePushResponse struct { 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) { databaseConn := database.OptionalDB(db...) @@ -157,10 +359,7 @@ func PushPurchaseOrder(purchaseOrderID int64, db ...*gorm.DB) (*WangdianPurchase params["sign"] = utils.WangdianSign(params, cfg.AppSecret) // 9. 提交请求 - url := cfg.URL - if cfg.Sandbox && cfg.SandboxURL != "" { - url = cfg.SandboxURL - } + url := wangdianURL(cfg.SandboxURL, cfg.URL) if url == "" { url = "https://api.wangdian.cn/openapi2/purchase_order_push.php" }