From c83dbfbf26a1da7d2bea516425fae5d06f56af99 Mon Sep 17 00:00:00 2001 From: renzhiyuan <465386466@qq.com> Date: Thu, 27 Aug 2026 16:34:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=87=E4=BB=B6:=20sdk=5Ft?= =?UTF-8?q?b=5Flinkedmall/generate.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sdk_tb_linkedmall/generate.md | 1302 +++++++++++++++++++++++++++++++++ 1 file changed, 1302 insertions(+) create mode 100644 sdk_tb_linkedmall/generate.md diff --git a/sdk_tb_linkedmall/generate.md b/sdk_tb_linkedmall/generate.md new file mode 100644 index 0000000..ce60b9f --- /dev/null +++ b/sdk_tb_linkedmall/generate.md @@ -0,0 +1,1302 @@ +好的,根据文档,ROA签名由阿里云OpenAPI客户端自动处理,无需额外加密算法。我将直接生成所有6个文件。 + +// File: sdk_tb_linkedmall/go.mod +``` +module sdk_tb_linkedmall + +go 1.21 + +require ( + github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10 + github.com/alibabacloud-go/tea/v2 v2.2.8 +) +``` + +// File: sdk_tb_linkedmall/types.go +```go +package sdk_tb_linkedmall + +// ============================================================ +// 公共响应结构体 +// ============================================================ + +// CommonResponse 是所有API的统一外层响应结构 +type CommonResponse struct { + RequestId string `json:"RequestId"` + Success bool `json:"Success"` + Code string `json:"Code"` + Message string `json:"Message"` + SubCode string `json:"SubCode"` + SubMessage string `json:"SubMessage"` + Data interface{} `json:"Data"` +} + +// ============================================================ +// 接口1:ListPurchaserShops - 获取采购方店铺列表 +// ============================================================ + +// ListPurchaserShopsReq 查询采购方店铺列表请求参数 +type ListPurchaserShopsReq struct { + PageNum int `json:"PageNum,omitempty"` + PageSize int `json:"PageSize,omitempty"` +} + +// ListPurchaserShopsRespData 查询采购方店铺列表响应数据 +type ListPurchaserShopsRespData struct { + Total int64 `json:"Total"` + PageNum int `json:"PageNum"` + PageSize int `json:"PageSize"` + ShopList []PurchaserShopItem `json:"ShopList"` +} + +// PurchaserShopItem 采购方店铺条目 +type PurchaserShopItem struct { + ShopId string `json:"ShopId"` + PurchaserId string `json:"PurchaserId"` + ShopName string `json:"ShopName"` + ShopStatus string `json:"ShopStatus"` +} + +// ============================================================ +// 接口2:GetPurchaserShop - 获取单个采购店铺详情 +// ============================================================ + +// GetPurchaserShopReq 获取采购店铺详情请求参数 +type GetPurchaserShopReq struct { + ShopId string `json:"-"` // Path参数 + PurchaserId string `json:"PurchaserId,omitempty"` // Query参数 +} + +// GetPurchaserShopRespData 获取采购店铺详情响应数据 +type GetPurchaserShopRespData struct { + ShopId string `json:"ShopId"` + PurchaserId string `json:"PurchaserId"` + ShopName string `json:"ShopName"` + ShopStatus string `json:"ShopStatus"` + ContactInfo string `json:"ContactInfo"` +} + +// ============================================================ +// 接口3:ListSelectionProducts - 查询选品池商品列表 +// ============================================================ + +// ListSelectionProductsReq 查询选品池商品列表请求参数 +type ListSelectionProductsReq struct { + PurchaserId string `json:"PurchaserId"` + PageNum int `json:"PageNum,omitempty"` + PageSize int `json:"PageSize,omitempty"` +} + +// ListSelectionProductsRespData 查询选品池商品列表响应数据 +type ListSelectionProductsRespData struct { + Total int64 `json:"Total"` + PageNum int `json:"PageNum"` + PageSize int `json:"PageSize"` + ProductList []SelectionProductItem `json:"ProductList"` +} + +// SelectionProductItem 选品池商品条目 +type SelectionProductItem struct { + ProductId string `json:"ProductId"` + Title string `json:"Title"` + MainImage string `json:"MainImage"` + BrandName string `json:"BrandName"` + CategoryId string `json:"CategoryId"` +} + +// ============================================================ +// 接口4:GetSelectionProduct - 查询选品池商品详情 +// ============================================================ + +// GetSelectionProductReq 查询选品池商品详情请求参数 +type GetSelectionProductReq struct { + ProductId string `json:"-"` // Path参数 + PurchaserId string `json:"PurchaserId"` + DivisionCode string `json:"DivisionCode,omitempty"` +} + +// GetSelectionProductRespData 查询选品池商品详情响应数据 +type GetSelectionProductRespData struct { + ProductId string `json:"ProductId"` + Title string `json:"Title"` + MainImage string `json:"MainImage"` + Images []string `json:"Images"` + BrandName string `json:"BrandName"` + CategoryId string `json:"CategoryId"` + Desc string `json:"Desc"` + SkuList []SelectionSkuItem `json:"SkuList"` + CanSale bool `json:"CanSale"` + StockQuantity int64 `json:"StockQuantity"` +} + +// SelectionSkuItem SKU条目 +type SelectionSkuItem struct { + SkuId string `json:"SkuId"` + SkuSpec string `json:"SkuSpec"` + SalePrice int64 `json:"SalePrice"` // 单位分 + MarketPrice int64 `json:"MarketPrice"` // 单位分 + StockQuantity int64 `json:"StockQuantity"` +} + +// ============================================================ +// 接口5:GetSelectionProductSaleInfo - 查询选品池商品销售信息 +// ============================================================ + +// GetSelectionProductSaleInfoReq 查询选品池商品销售信息请求参数 +type GetSelectionProductSaleInfoReq struct { + ProductId string `json:"-"` // Path参数 + PurchaserId string `json:"PurchaserId"` + DivisionCode string `json:"DivisionCode,omitempty"` +} + +// GetSelectionProductSaleInfoRespData 选品池商品销售信息 +type GetSelectionProductSaleInfoRespData struct { + ProductId string `json:"ProductId"` + CanSale bool `json:"CanSale"` + SalePrice int64 `json:"SalePrice"` + MarketPrice int64 `json:"MarketPrice"` + StockQuantity int64 `json:"StockQuantity"` +} + +// ============================================================ +// 接口6:ListSelectionProductSaleInfos - 批量查询商品销售信息 +// ============================================================ + +// ListSelectionProductSaleInfosReq 批量查询商品销售信息请求参数 +type ListSelectionProductSaleInfosReq struct { + PurchaserId string `json:"PurchaserId"` + ProductIdList []string `json:"ProductIdList"` + DivisionCode string `json:"DivisionCode,omitempty"` +} + +// ListSelectionProductSaleInfosRespData 批量查询商品销售信息响应数据 +type ListSelectionProductSaleInfosRespData struct { + ProductSaleInfoList []GetSelectionProductSaleInfoRespData `json:"ProductSaleInfoList"` +} + +// ============================================================ +// 接口7:ListSelectionSkuSaleInfos - 批量SKU销售信息 +// ============================================================ + +// ListSelectionSkuSaleInfosReq 批量SKU销售信息请求参数 +type ListSelectionSkuSaleInfosReq struct { + PurchaserId string `json:"PurchaserId"` + SkuIdList []string `json:"SkuIdList"` + DivisionCode string `json:"DivisionCode,omitempty"` +} + +// ListSelectionSkuSaleInfosRespData 批量SKU销售信息响应数据 +type ListSelectionSkuSaleInfosRespData struct { + SkuSaleInfoList []SelectionSkuItem `json:"SkuSaleInfoList"` +} + +// ============================================================ +// 接口8:ListCategories - 查询类目列表 +// ============================================================ + +// ListCategoriesReq 查询类目列表请求参数 +type ListCategoriesReq struct { + PurchaserId string `json:"PurchaserId"` + ParentCategoryId string `json:"ParentCategoryId,omitempty"` +} + +// ListCategoriesRespData 类目列表响应数据 +type ListCategoriesRespData struct { + CategoryList []CategoryItem `json:"CategoryList"` +} + +// CategoryItem 类目条目 +type CategoryItem struct { + CategoryId string `json:"CategoryId"` + CategoryName string `json:"CategoryName"` + ParentId string `json:"ParentId"` + Level int `json:"Level"` +} + +// ============================================================ +// 接口9:SearchProducts - 搜索选品池商品 +// ============================================================ + +// SearchProductsReq 搜索选品池商品请求参数 +type SearchProductsReq struct { + Keyword string `json:"Keyword,omitempty"` + CategoryId string `json:"CategoryId,omitempty"` + PageNum int `json:"PageNum,omitempty"` + PageSize int `json:"PageSize,omitempty"` + PurchaserId string `json:"PurchaserId"` +} + +// SearchProductsRespData 搜索选品池商品响应数据 +type SearchProductsRespData struct { + Total int64 `json:"Total"` + PageNum int `json:"PageNum"` + PageSize int `json:"PageSize"` + ProductList []SelectionProductItem `json:"ProductList"` +} + +// ============================================================ +// 接口10:SelectionGroupAddProduct - 选品池商品入库 +// ============================================================ + +// SelectionGroupAddProductReq 选品池商品入库请求参数 +type SelectionGroupAddProductReq struct { + PurchaserId string `json:"PurchaserId"` + ShopId string `json:"ShopId"` + ProductIdList []string `json:"ProductIdList"` +} + +// ============================================================ +// 接口11:SelectionGroupRemoveProduct - 选品池商品出库 +// ============================================================ + +// SelectionGroupRemoveProductReq 选品池商品出库请求参数 +type SelectionGroupRemoveProductReq struct { + PurchaserId string `json:"PurchaserId"` + ShopId string `json:"ShopId"` + ProductIdList []string `json:"ProductIdList"` +} + +// ============================================================ +// 接口12:RenderPurchaseOrder - 采购单渲染(下单预校验) +// ============================================================ + +// RenderPurchaseOrderReq 采购单渲染请求参数 +type RenderPurchaseOrderReq struct { + PurchaserId string `json:"PurchaserId"` + ShopId string `json:"ShopId"` + DivisionCode string `json:"DivisionCode"` + ItemList []RenderOrderItem `json:"ItemList"` + ReceiverInfo ReceiverInfo `json:"ReceiverInfo"` +} + +// RenderOrderItem 渲染商品条目 +type RenderOrderItem struct { + SkuId string `json:"SkuId"` + Quantity int64 `json:"Quantity"` +} + +// ReceiverInfo 收货人信息 +type ReceiverInfo struct { + ReceiverName string `json:"ReceiverName"` + ReceiverPhone string `json:"ReceiverPhone"` + ProvinceCode string `json:"ProvinceCode"` + CityCode string `json:"CityCode"` + DistrictCode string `json:"DistrictCode"` + TownCode string `json:"TownCode"` + DetailAddress string `json:"DetailAddress"` +} + +// RenderPurchaseOrderRespData 采购单渲染响应数据 +type RenderPurchaseOrderRespData struct { + TotalFee int64 `json:"TotalFee"` // 总金额,单位分 + TotalFreightFee int64 `json:"TotalFreightFee"` // 总运费,单位分 + ItemList []RenderResultItem `json:"ItemList"` + UnavailableList []UnavailableItem `json:"UnavailableList"` // 不可售商品列表 +} + +// RenderResultItem 渲染结果商品条目 +type RenderResultItem struct { + SkuId string `json:"SkuId"` + ProductId string `json:"ProductId"` + Title string `json:"Title"` + Quantity int64 `json:"Quantity"` + SalePrice int64 `json:"SalePrice"` // 实时单价,单位分 + TotalFee int64 `json:"TotalFee"` // 小计金额,单位分 + FreightFee int64 `json:"FreightFee"` // 运费,单位分 + CanSale bool `json:"CanSale"` + UnavailableReason string `json:"UnavailableReason,omitempty"` +} + +// UnavailableItem 不可售商品 +type UnavailableItem struct { + SkuId string `json:"SkuId"` + ProductId string `json:"ProductId"` + Reason string `json:"Reason"` +} + +// ============================================================ +// 接口13:SplitPurchaseOrder - 采购单渲染并拆单 +// ============================================================ + +// SplitPurchaseOrderReq 采购单渲染并拆单请求参数(与RenderPurchaseOrderReq相同) +type SplitPurchaseOrderReq = RenderPurchaseOrderReq + +// SplitPurchaseOrderRespData 采购单渲染并拆单响应数据 +type SplitPurchaseOrderRespData struct { + SubOrderList []SubOrderRenderResult `json:"SubOrderList"` +} + +// SubOrderRenderResult 子单渲染结果 +type SubOrderRenderResult struct { + ShopId string `json:"ShopId"` + ShopName string `json:"ShopName"` + TotalFee int64 `json:"TotalFee"` + FreightFee int64 `json:"FreightFee"` + ItemList []RenderResultItem `json:"ItemList"` +} + +// ============================================================ +// 接口14:CreatePurchaseOrder - 创建采购单【异步】 +// ============================================================ + +// CreatePurchaseOrderReq 创建采购单请求参数 +type CreatePurchaseOrderReq struct { + PurchaserId string `json:"PurchaserId"` + ShopId string `json:"ShopId"` + OuterPurchaseOrderId string `json:"OuterPurchaseOrderId"` // 外部业务唯一单号,幂等 + DivisionCode string `json:"DivisionCode"` + ReceiverInfo ReceiverInfo `json:"ReceiverInfo"` + SubOrderList []CreateSubOrderItem `json:"SubOrderList"` +} + +// CreateSubOrderItem 创建采购单子单条目 +type CreateSubOrderItem struct { + SkuId string `json:"SkuId"` + Quantity int64 `json:"Quantity"` +} + +// CreatePurchaseOrderRespData 创建采购单响应数据 +type CreatePurchaseOrderRespData struct { + PurchaseOrderId string `json:"PurchaseOrderId"` // 阿里云采购单号 +} + +// ============================================================ +// 接口15:GetPurchaseOrderStatus - 获取采购单状态 +// ============================================================ + +// GetPurchaseOrderStatusReq 获取采购单状态请求参数 +type GetPurchaseOrderStatusReq struct { + PurchaseOrderId string `json:"-"` // Path参数 + PurchaserId string `json:"PurchaserId"` +} + +// GetPurchaseOrderStatusRespData 获取采购单状态响应数据 +type GetPurchaseOrderStatusRespData struct { + PurchaseOrderId string `json:"PurchaseOrderId"` + Status string `json:"Status"` // INIT、PROCESS、SUCCESS、FAIL、CLOSED +} + +// 采购单状态常量 +const ( + PurchaseOrderStatusInit = "INIT" + PurchaseOrderStatusProcess = "PROCESS" + PurchaseOrderStatusSuccess = "SUCCESS" + PurchaseOrderStatusFail = "FAIL" + PurchaseOrderStatusClosed = "CLOSED" +) + +// ============================================================ +// 接口16:GetOrder - 获取订单详情 +// ============================================================ + +// GetOrderReq 获取订单详情请求参数 +type GetOrderReq struct { + OrderId string `json:"-"` // Path参数 + PurchaserId string `json:"PurchaserId"` +} + +// GetOrderRespData 获取订单详情响应数据 +type GetOrderRespData struct { + OrderId string `json:"OrderId"` + PurchaseOrderId string `json:"PurchaseOrderId"` + PurchaserId string `json:"PurchaserId"` + ShopId string `json:"ShopId"` + OrderStatus string `json:"OrderStatus"` + TotalFee int64 `json:"TotalFee"` // 实付金额,单位分 + FreightFee int64 `json:"FreightFee"` // 运费,单位分 + ReceiverInfo ReceiverInfo `json:"ReceiverInfo"` + OrderItemList []OrderItem `json:"OrderItemList"` + CreateTime string `json:"CreateTime"` + PayTime string `json:"PayTime,omitempty"` + DeliveryTime string `json:"DeliveryTime,omitempty"` + ConfirmReceiveTime string `json:"ConfirmReceiveTime,omitempty"` +} + +// OrderItem 订单商品明细 +type OrderItem struct { + OrderItemId string `json:"OrderItemId"` + SkuId string `json:"SkuId"` + ProductId string `json:"ProductId"` + Title string `json:"Title"` + Quantity int64 `json:"Quantity"` + SalePrice int64 `json:"SalePrice"` + TotalFee int64 `json:"TotalFee"` + ItemStatus string `json:"ItemStatus"` +} + +// ============================================================ +// 接口17:QueryOrders - 查询订单列表 +// ============================================================ + +// QueryOrdersReq 查询订单列表请求参数 +type QueryOrdersReq struct { + PurchaserId string `json:"PurchaserId"` + PurchaseOrderId string `json:"PurchaseOrderId,omitempty"` + PageNum int `json:"PageNum,omitempty"` + PageSize int `json:"PageSize,omitempty"` + StartTime string `json:"StartTime,omitempty"` + EndTime string `json:"EndTime,omitempty"` +} + +// QueryOrdersRespData 查询订单列表响应数据 +type QueryOrdersRespData struct { + Total int64 `json:"Total"` + PageNum int `json:"PageNum"` + PageSize int `json:"PageSize"` + OrderList []GetOrderRespData `json:"OrderList"` +} + +// ============================================================ +// 接口18:ListLogisticsOrders - 查询订单物流信息 +// ============================================================ + +// ListLogisticsOrdersReq 查询订单物流信息请求参数 +type ListLogisticsOrdersReq struct { + OrderId string `json:"-"` // Path参数 + PurchaserId string `json:"PurchaserId"` +} + +// ListLogisticsOrdersRespData 查询订单物流信息响应数据 +type ListLogisticsOrdersRespData struct { + LogisticsList []LogisticsInfo `json:"LogisticsList"` +} + +// LogisticsInfo 物流信息 +type LogisticsInfo struct { + LogisticsCompany string `json:"LogisticsCompany"` + TrackingNumber string `json:"TrackingNumber"` + TrajectoryList []LogisticsTrace `json:"TrajectoryList"` +} + +// LogisticsTrace 物流轨迹 +type LogisticsTrace struct { + Time string `json:"Time"` + Content string `json:"Content"` + Location string `json:"Location,omitempty"` +} + +// ============================================================ +// 接口19:ConfirmDisburse - 确认收货 +// ============================================================ + +// ConfirmDisburseReq 确认收货请求参数 +type ConfirmDisburseReq struct { + OrderId string `json:"-"` // Path参数 + PurchaserId string `json:"PurchaserId"` +} + +// ============================================================ +// 接口20:RenderRefundOrder - 售后渲染预校验 +// ============================================================ + +// RenderRefundOrderReq 售后渲染预校验请求参数 +type RenderRefundOrderReq struct { + PurchaserId string `json:"PurchaserId"` + OrderId string `json:"OrderId"` + OrderItemId string `json:"OrderItemId"` + RefundQuantity int64 `json:"RefundQuantity"` + RefundType string `json:"RefundType"` // 仅退款/退货退款 +} + +// RenderRefundOrderRespData 售后渲染预校验响应数据 +type RenderRefundOrderRespData struct { + CanRefund bool `json:"CanRefund"` + RefundAmount int64 `json:"RefundAmount"` // 可退金额,单位分 + RefundQuantity int64 `json:"RefundQuantity"` // 可退数量 + RefundType string `json:"RefundType"` + Reason string `json:"Reason,omitempty"` +} + +// ============================================================ +// 接口21:CreateRefundOrder - 创建售后单 +// ============================================================ + +// CreateRefundOrderReq 创建售后单请求参数 +type CreateRefundOrderReq struct { + PurchaserId string `json:"PurchaserId"` + OrderId string `json:"OrderId"` + OrderItemId string `json:"OrderItemId"` + RefundQuantity int64 `json:"RefundQuantity"` + RefundAmount int64 `json:"RefundAmount"` // 单位分 + RefundType string `json:"RefundType"` + RefundReason string `json:"RefundReason"` + OuterRefundNo string `json:"OuterRefundNo"` // 外部售后单号,幂等 +} + +// CreateRefundOrderRespData 创建售后单响应数据 +type CreateRefundOrderRespData struct { + RefundOrderId string `json:"RefundOrderId"` +} + +// ============================================================ +// 接口22:CancelRefundOrder - 取消售后单 +// ============================================================ + +// CancelRefundOrderReq 取消售后单请求参数 +type CancelRefundOrderReq struct { + RefundOrderId string `json:"-"` // Path参数 + PurchaserId string `json:"PurchaserId"` +} + +// ============================================================ +// 接口23:GetRefundOrder - 获取售后单详情 +// ============================================================ + +// GetRefundOrderReq 获取售后单详情请求参数 +type GetRefundOrderReq struct { + RefundOrderId string `json:"-"` // Path参数 + PurchaserId string `json:"PurchaserId"` +} + +// GetRefundOrderRespData 获取售后单详情响应数据 +type GetRefundOrderRespData struct { + RefundOrderId string `json:"RefundOrderId"` + OrderId string `json:"OrderId"` + OrderItemId string `json:"OrderItemId"` + PurchaserId string `json:"PurchaserId"` + RefundAmount int64 `json:"RefundAmount"` + RefundQuantity int64 `json:"RefundQuantity"` + RefundType string `json:"RefundType"` + RefundReason string `json:"RefundReason"` + RefundStatus string `json:"RefundStatus"` + OuterRefundNo string `json:"OuterRefundNo"` + CreateTime string `json:"CreateTime"` +} + +// ============================================================ +// 接口24:CreateGoodsShippingNotice - 回填退货物流运单 +// ============================================================ + +// CreateGoodsShippingNoticeReq 回填退货物流运单请求参数 +type CreateGoodsShippingNoticeReq struct { + RefundOrderId string `json:"-"` // Path参数 + PurchaserId string `json:"PurchaserId"` + LogisticsCompany string `json:"LogisticsCompany"` + TrackingNumber string `json:"TrackingNumber"` +} + +// ============================================================ +// 接口25:QueryChildDivisionCode - 查询子区域编码 +// ============================================================ + +// QueryChildDivisionCodeReq 查询子区域编码请求参数 +type QueryChildDivisionCodeReq struct { + ParentDivisionCode string `json:"ParentDivisionCode,omitempty"` +} + +// QueryChildDivisionCodeRespData 查询子区域编码响应数据 +type QueryChildDivisionCodeRespData struct { + DivisionList []DivisionInfo `json:"DivisionList"` +} + +// DivisionInfo 区域信息 +type DivisionInfo struct { + DivisionCode string `json:"DivisionCode"` + DivisionName string `json:"DivisionName"` + Level int `json:"Level"` + ParentCode string `json:"ParentCode,omitempty"` +} + +// ============================================================ +// 回调通知结构体 +// ============================================================ + +// CallbackMessage 回调通知消息体 +type CallbackMessage struct { + EventCode string `json:"EventCode"` + PurchaseOrderId string `json:"PurchaseOrderId"` + OrderIdList []string `json:"OrderIdList"` + Status string `json:"Status"` + RequestId string `json:"RequestId"` +} + +// 事件码常量 +const ( + EventCodePurchaseOrderChange = "PURCHASE_ORDER_CHANGE" + EventCodeOrderStatusChange = "ORDER_STATUS_CHANGE" + EventCodeRefundOrderChange = "REFUND_ORDER_CHANGE" +) + +// CallbackResponse 回调响应,告知阿里云消费成功 +type CallbackResponse struct { + Success bool `json:"success"` +} +``` + +// File: sdk_tb_linkedmall/errors.go +```go +package sdk_tb_linkedmall + +import "fmt" + +// APIError 表示API调用返回的业务错误 +type APIError struct { + Code string // 错误码 + Message string // 错误信息 + SubCode string // 子错误码 + SubMessage string // 子错误信息 + RequestId string // 请求ID +} + +func (e *APIError) Error() string { + return fmt.Sprintf("linkedmall api error: code=%s, message=%s, subCode=%s, subMessage=%s, requestId=%s", + e.Code, e.Message, e.SubCode, e.SubMessage, e.RequestId) +} + +// NewAPIError 创建API错误 +func NewAPIError(code, message, subCode, subMessage, requestId string) *APIError { + return &APIError{ + Code: code, + Message: message, + SubCode: subCode, + SubMessage: subMessage, + RequestId: requestId, + } +} + +// IsBusinessSuccess 判断业务是否成功(需要HTTP 200 + Success=true) +func IsBusinessSuccess(resp *CommonResponse) bool { + return resp != nil && resp.Success +} + +// CheckResponse 检查响应是否成功,失败返回error +func CheckResponse(resp *CommonResponse) error { + if resp == nil { + return fmt.Errorf("linkedmall: response is nil") + } + if !resp.Success { + return NewAPIError(resp.Code, resp.Message, resp.SubCode, resp.SubMessage, resp.RequestId) + } + return nil +} + +// 预定义错误码常量 +const ( + ErrCodeShopTypeInvalid = "ShopTypeInvalid" + ErrCodeSkuPriceNotUnique = "SkuPriceUnique" + ErrCodePurchaseOrderNotFound = "PurchaseOrderNotFound" + ErrCodeRefundNumberMustLessThanOrder = "RefundNumberMustLessThanOrder" + ErrCodeRefundAmountMustLessThanOrder = "RefundAmountMustLessThanOrder" + ErrCodeHasNoPrivilege = "HasNoPrivilege" + ErrCodeOrderNotFound = "OrderNotFound" + ErrCodeShopNotFind = "ShopNotFind" + ErrCodeSavePurchaseOrderError = "SavePurchaseOrderError" + ErrCodeOuterPurchaseOrderIdExist = "OuterPurchaseOrderIdExist" +) +``` + +// File: sdk_tb_linkedmall/crypto.go +```go +package sdk_tb_linkedmall + +// 本SDK使用阿里云OpenAPI客户端(darabonba-openapi/v2)进行ROA签名认证, +// 签名过程由SDK内部自动处理,业务无需自行实现签名算法。 +// 因此本文件为占位文件,不包含自定义加密实现。 +``` + +// File: sdk_tb_linkedmall/client.go +```go +package sdk_tb_linkedmall + +import ( + "encoding/json" + "fmt" + "strconv" + + openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" + "github.com/alibabacloud-go/tea/v2" +) + +// 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 +} + +// ============================================================ +// 接口1:ListPurchaserShops - 分页获取采购方店铺列表 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口2:GetPurchaserShop - 获取单个采购店铺详情 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口3:ListSelectionProducts - 分页查询选品池商品列表 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口4:GetSelectionProduct - 查询选品池商品详情 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口5:GetSelectionProductSaleInfo - 查询选品池商品销售信息 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口6:ListSelectionProductSaleInfos - 批量查询商品销售信息 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口7:ListSelectionSkuSaleInfos - 批量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 +} + +// ============================================================ +// 接口8:ListCategories - 查询类目列表 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口9:SearchProducts - 搜索选品池商品 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口10:SelectionGroupAddProduct - 选品池商品入库 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口11:SelectionGroupRemoveProduct - 选品池商品出库 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口12:RenderPurchaseOrder - 采购单渲染(下单预校验) +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口13:SplitPurchaseOrder - 采购单渲染并拆单 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口14:CreatePurchaseOrder - 创建采购单【异步】 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口15:GetPurchaseOrderStatus - 获取采购单状态 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口16:GetOrder - 获取订单详情 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口17:QueryOrders - 查询订单列表 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口18:ListLogisticsOrders - 查询订单物流信息 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口19:ConfirmDisburse - 确认收货 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口20:RenderRefundOrder - 售后渲染预校验 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口21:CreateRefundOrder - 创建售后单 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口22:CancelRefundOrder - 取消售后单 +// ============================================================ + +// 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 +} + +// ============================================================ +// 接口23:GetRefundOrder - \ No newline at end of file