添加文件: sdk_tb_linkedmall/client.go

This commit is contained in:
renzhiyuan 2026-08-27 16:34:01 +08:00
parent d795cf1aea
commit ef2c57d714
1 changed files with 674 additions and 0 deletions

674
sdk_tb_linkedmall/client.go Normal file
View File

@ -0,0 +1,674 @@
package sdk_tb_linkedmall
import (
"encoding/json"
"fmt"
"strconv"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/alibabacloud-go/tea"
)
// Client 是LinkedMall SDK客户端封装了所有API方法
type Client struct {
openapiClient *openapi.Client
basePath string
}
// NewClient 创建LinkedMall SDK客户端
// - accessKeyId: RAM子账号的AccessKeyId
// - accessKeySecret: RAM子账号的AccessKeySecret
func NewClient(accessKeyId, accessKeySecret string) (*Client, error) {
config := &openapi.Config{
AccessKeyId: tea.String(accessKeyId),
AccessKeySecret: tea.String(accessKeySecret),
RegionId: tea.String("cn-zhangjiakou"),
Endpoint: tea.String("linkedmall.cn-zhangjiakou.aliyuncs.com"),
ReadTimeout: tea.Int(30000),
ConnectTimeout: tea.Int(10000),
}
apiClient, err := openapi.NewClient(config)
if err != nil {
return nil, fmt.Errorf("failed to create openapi client: %w", err)
}
return &Client{
openapiClient: apiClient,
basePath: "/opensaas-s2b/opensaas-s2b-biz-trade/v2",
}, nil
}
// doRequest 执行ROA请求并解析公共响应体
func (c *Client) doRequest(method, path string, query map[string]string, body interface{}) (*CommonResponse, error) {
// 转换query为map[string]*string
teaQuery := make(map[string]*string, len(query))
for k, v := range query {
if v != "" {
teaQuery[k] = tea.String(v)
}
}
fullPath := c.basePath + path
respBytes, err := c.openapiClient.RoaRequest(
tea.String(method),
tea.String(fullPath),
teaQuery,
body,
nil,
)
if err != nil {
return nil, fmt.Errorf("roa request failed: %w", err)
}
var commonResp CommonResponse
if err := json.Unmarshal(respBytes, &commonResp); err != nil {
return nil, fmt.Errorf("failed to parse response: %w", err)
}
return &commonResp, nil
}
// parseData 将CommonResponse的Data字段解析到目标结构体
func parseData(commonResp *CommonResponse, target interface{}) error {
dataBytes, err := json.Marshal(commonResp.Data)
if err != nil {
return fmt.Errorf("failed to marshal data: %w", err)
}
if err := json.Unmarshal(dataBytes, target); err != nil {
return fmt.Errorf("failed to unmarshal data: %w", err)
}
return nil
}
// ============================================================
// 接口1ListPurchaserShops - 分页获取采购方店铺列表
// ============================================================
// ListPurchaserShops 分页获取采购方店铺列表
func (c *Client) ListPurchaserShops(req *ListPurchaserShopsReq) (*CommonResponse, *ListPurchaserShopsRespData, error) {
query := make(map[string]string)
if req.PageNum > 0 {
query["PageNum"] = strconv.Itoa(req.PageNum)
}
if req.PageSize > 0 {
query["PageSize"] = strconv.Itoa(req.PageSize)
}
commonResp, err := c.doRequest("GET", "/purchaser-shops", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListPurchaserShopsRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口2GetPurchaserShop - 获取单个采购店铺详情
// ============================================================
// GetPurchaserShop 获取单个采购店铺详情
func (c *Client) GetPurchaserShop(shopId string) (*CommonResponse, *GetPurchaserShopRespData, error) {
query := make(map[string]string)
commonResp, err := c.doRequest("GET", "/purchaser-shops/"+shopId, query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetPurchaserShopRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口3ListSelectionProducts - 分页查询选品池商品列表
// ============================================================
// ListSelectionProducts 分页查询选品池商品列表
func (c *Client) ListSelectionProducts(req *ListSelectionProductsReq) (*CommonResponse, *ListSelectionProductsRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = req.PurchaserId
if req.PageNum > 0 {
query["PageNum"] = strconv.Itoa(req.PageNum)
}
if req.PageSize > 0 {
query["PageSize"] = strconv.Itoa(req.PageSize)
}
commonResp, err := c.doRequest("GET", "/selection-products", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListSelectionProductsRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口4GetSelectionProduct - 查询选品池商品详情
// ============================================================
// GetSelectionProduct 查询选品池商品详情
// - divisionCode: 可选,五级乡镇区域编码,传入后返回该区域可售状态
func (c *Client) GetSelectionProduct(req *GetSelectionProductReq) (*CommonResponse, *GetSelectionProductRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = req.PurchaserId
if req.DivisionCode != "" {
query["DivisionCode"] = req.DivisionCode
}
commonResp, err := c.doRequest("GET", "/selection-products/"+req.ProductId, query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetSelectionProductRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口5GetSelectionProductSaleInfo - 查询选品池商品销售信息
// ============================================================
// GetSelectionProductSaleInfo 查询选品池商品销售信息
func (c *Client) GetSelectionProductSaleInfo(req *GetSelectionProductSaleInfoReq) (*CommonResponse, *GetSelectionProductSaleInfoRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = req.PurchaserId
if req.DivisionCode != "" {
query["DivisionCode"] = req.DivisionCode
}
commonResp, err := c.doRequest("GET", "/selection-products/"+req.ProductId+"/sale-info", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetSelectionProductSaleInfoRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口6ListSelectionProductSaleInfos - 批量查询商品销售信息
// ============================================================
// ListSelectionProductSaleInfos 批量查询商品销售信息
func (c *Client) ListSelectionProductSaleInfos(req *ListSelectionProductSaleInfosReq) (*CommonResponse, *ListSelectionProductSaleInfosRespData, error) {
commonResp, err := c.doRequest("POST", "/selection-products:batch-sale-info", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListSelectionProductSaleInfosRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口7ListSelectionSkuSaleInfos - 批量SKU销售信息
// ============================================================
// ListSelectionSkuSaleInfos 批量查询SKU销售信息
func (c *Client) ListSelectionSkuSaleInfos(req *ListSelectionSkuSaleInfosReq) (*CommonResponse, *ListSelectionSkuSaleInfosRespData, error) {
commonResp, err := c.doRequest("POST", "/selection-skus:batch-sale-info", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListSelectionSkuSaleInfosRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口8ListCategories - 查询类目列表
// ============================================================
// ListCategories 查询类目列表
// - parentCategoryId: 父类目ID不传时查询一级类目
func (c *Client) ListCategories(req *ListCategoriesReq) (*CommonResponse, *ListCategoriesRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = req.PurchaserId
if req.ParentCategoryId != "" {
query["ParentCategoryId"] = req.ParentCategoryId
}
commonResp, err := c.doRequest("GET", "/categories", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListCategoriesRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口9SearchProducts - 搜索选品池商品
// ============================================================
// SearchProducts 搜索选品池商品
func (c *Client) SearchProducts(req *SearchProductsReq) (*CommonResponse, *SearchProductsRespData, error) {
commonResp, err := c.doRequest("POST", "/selection-products:search", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data SearchProductsRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口10SelectionGroupAddProduct - 选品池商品入库
// ============================================================
// SelectionGroupAddProduct 选品池商品入库
func (c *Client) SelectionGroupAddProduct(req *SelectionGroupAddProductReq) (*CommonResponse, error) {
commonResp, err := c.doRequest("POST", "/selection-group/products:add", nil, req)
if err != nil {
return nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, err
}
return commonResp, nil
}
// ============================================================
// 接口11SelectionGroupRemoveProduct - 选品池商品出库
// ============================================================
// SelectionGroupRemoveProduct 选品池商品出库
func (c *Client) SelectionGroupRemoveProduct(req *SelectionGroupRemoveProductReq) (*CommonResponse, error) {
commonResp, err := c.doRequest("POST", "/selection-group/products:remove", nil, req)
if err != nil {
return nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, err
}
return commonResp, nil
}
// ============================================================
// 接口12RenderPurchaseOrder - 采购单渲染(下单预校验)
// ============================================================
// RenderPurchaseOrder 采购单渲染(下单预校验)
// 下单前必须调用,获取实时价格、校验商品是否可售
func (c *Client) RenderPurchaseOrder(req *RenderPurchaseOrderReq) (*CommonResponse, *RenderPurchaseOrderRespData, error) {
commonResp, err := c.doRequest("POST", "/purchase-orders:render", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data RenderPurchaseOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口13SplitPurchaseOrder - 采购单渲染并拆单
// ============================================================
// SplitPurchaseOrder 采购单渲染并拆单
// 返回拆成多份子单结构,用于前端展示,拆单结果用于创建采购单入参
func (c *Client) SplitPurchaseOrder(req *SplitPurchaseOrderReq) (*CommonResponse, *SplitPurchaseOrderRespData, error) {
commonResp, err := c.doRequest("POST", "/purchase-orders:split-render", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data SplitPurchaseOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口14CreatePurchaseOrder - 创建采购单【异步】
// ============================================================
// CreatePurchaseOrder 创建采购单【异步】
// 重要:接口只返回采购单号,不代表下单成功,必须等待回调通知,再查询订单接口
func (c *Client) CreatePurchaseOrder(req *CreatePurchaseOrderReq) (*CommonResponse, *CreatePurchaseOrderRespData, error) {
commonResp, err := c.doRequest("POST", "/purchase-orders", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data CreatePurchaseOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口15GetPurchaseOrderStatus - 获取采购单状态
// ============================================================
// GetPurchaseOrderStatus 获取采购单状态
// 状态枚举INIT、PROCESS、SUCCESS、FAIL、CLOSED
func (c *Client) GetPurchaseOrderStatus(purchaseOrderId, purchaserId string) (*CommonResponse, *GetPurchaseOrderStatusRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = purchaserId
commonResp, err := c.doRequest("GET", "/purchase-orders/"+purchaseOrderId+"/status", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetPurchaseOrderStatusRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口16GetOrder - 获取订单详情
// ============================================================
// GetOrder 获取订单详情
func (c *Client) GetOrder(orderId, purchaserId string) (*CommonResponse, *GetOrderRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = purchaserId
commonResp, err := c.doRequest("GET", "/orders/"+orderId, query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口17QueryOrders - 查询订单列表
// ============================================================
// QueryOrders 查询订单列表
func (c *Client) QueryOrders(req *QueryOrdersReq) (*CommonResponse, *QueryOrdersRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = req.PurchaserId
if req.PurchaseOrderId != "" {
query["PurchaseOrderId"] = req.PurchaseOrderId
}
if req.PageNum > 0 {
query["PageNum"] = strconv.Itoa(req.PageNum)
}
if req.PageSize > 0 {
query["PageSize"] = strconv.Itoa(req.PageSize)
}
if req.StartTime != "" {
query["StartTime"] = req.StartTime
}
if req.EndTime != "" {
query["EndTime"] = req.EndTime
}
commonResp, err := c.doRequest("GET", "/orders", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data QueryOrdersRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口18ListLogisticsOrders - 查询订单物流信息
// ============================================================
// ListLogisticsOrders 查询订单物流信息
func (c *Client) ListLogisticsOrders(orderId, purchaserId string) (*CommonResponse, *ListLogisticsOrdersRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = purchaserId
commonResp, err := c.doRequest("GET", "/orders/"+orderId+"/logistics", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListLogisticsOrdersRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口19ConfirmDisburse - 确认收货
// ============================================================
// ConfirmDisburse 确认收货
func (c *Client) ConfirmDisburse(orderId, purchaserId string) (*CommonResponse, error) {
body := map[string]string{
"PurchaserId": purchaserId,
}
commonResp, err := c.doRequest("POST", "/orders/"+orderId+":confirm-disburse", nil, body)
if err != nil {
return nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, err
}
return commonResp, nil
}
// ============================================================
// 接口20RenderRefundOrder - 售后渲染预校验
// ============================================================
// RenderRefundOrder 售后渲染预校验
func (c *Client) RenderRefundOrder(req *RenderRefundOrderReq) (*CommonResponse, *RenderRefundOrderRespData, error) {
commonResp, err := c.doRequest("POST", "/refund-orders:render", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data RenderRefundOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口21CreateRefundOrder - 创建售后单
// ============================================================
// CreateRefundOrder 创建售后单
func (c *Client) CreateRefundOrder(req *CreateRefundOrderReq) (*CommonResponse, *CreateRefundOrderRespData, error) {
commonResp, err := c.doRequest("POST", "/refund-orders", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data CreateRefundOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口22CancelRefundOrder - 取消售后单
// ============================================================
// CancelRefundOrder 取消售后单
func (c *Client) CancelRefundOrder(refundOrderId, purchaserId string) (*CommonResponse, error) {
body := map[string]string{
"PurchaserId": purchaserId,
}
commonResp, err := c.doRequest("POST", "/refund-orders/"+refundOrderId+":cancel", nil, body)
if err != nil {
return nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, err
}
return commonResp, nil
}
// ============================================================
// 接口23GetRefundOrder - 获取售后单详情
// ============================================================
// GetRefundOrder 获取售后单详情
func (c *Client) GetRefundOrder(refundOrderId, purchaserId string) (*CommonResponse, *GetRefundOrderRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = purchaserId
commonResp, err := c.doRequest("GET", "/refund-orders/"+refundOrderId, query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetRefundOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口24CreateGoodsShippingNotice - 回填退货物流运单
// ============================================================
// CreateGoodsShippingNotice 回填退货物流运单
func (c *Client) CreateGoodsShippingNotice(refundOrderId, purchaserId, logisticsCompany, trackingNumber string) (*CommonResponse, error) {
body := map[string]string{
"PurchaserId": purchaserId,
"LogisticsCompany": logisticsCompany,
"TrackingNumber": trackingNumber,
}
commonResp, err := c.doRequest("POST", "/refund-orders/"+refundOrderId+":fill-logistics", nil, body)
if err != nil {
return nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, err
}
return commonResp, nil
}
// ============================================================
// 接口25QueryChildDivisionCode - 查询子区域编码
// ============================================================
// QueryChildDivisionCode 查询子区域编码
// 不传返回省级;传入省返回市,传入市返回区,传入区返回乡镇(五级)
func (c *Client) QueryChildDivisionCode(parentDivisionCode string) (*CommonResponse, *QueryChildDivisionCodeRespData, error) {
query := make(map[string]string)
if parentDivisionCode != "" {
query["ParentDivisionCode"] = parentDivisionCode
}
commonResp, err := c.doRequest("GET", "/divisions:children", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data QueryChildDivisionCodeRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}