对接旺店通查询供应商列表接口、查询仓库列表接口、查询货品列表接口
This commit is contained in:
parent
aa22953f2f
commit
27a28823bb
@ -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"
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@ -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) // 查询旺店通商品
|
||||||
}
|
}
|
||||||
|
|
||||||
// 需要认证的接口
|
// 需要认证的接口
|
||||||
|
|||||||
@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user