sdk_tb_linkedmall-202608271.../sdk_tb_linkedmall/valid.md

47 KiB
Raw Permalink Blame History

// 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 v1.2.2
)

// File: sdk_tb_linkedmall/types.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"`
}

// ============================================================
// 接口1ListPurchaserShops - 获取采购方店铺列表
// ============================================================

// 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"`
}

// ============================================================
// 接口2GetPurchaserShop - 获取单个采购店铺详情
// ============================================================

// 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"`
}

// ============================================================
// 接口3ListSelectionProducts - 查询选品池商品列表
// ============================================================

// 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"`
}

// ============================================================
// 接口4GetSelectionProduct - 查询选品池商品详情
// ============================================================

// 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"`
}

// ============================================================
// 接口5GetSelectionProductSaleInfo - 查询选品池商品销售信息
// ============================================================

// 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"`
}

// ============================================================
// 接口6ListSelectionProductSaleInfos - 批量查询商品销售信息
// ============================================================

// 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"`
}

// ============================================================
// 接口7ListSelectionSkuSaleInfos - 批量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"`
}

// ============================================================
// 接口8ListCategories - 查询类目列表
// ============================================================

// 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"`
}

// ============================================================
// 接口9SearchProducts - 搜索选品池商品
// ============================================================

// 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"`
}

// ============================================================
// 接口10SelectionGroupAddProduct - 选品池商品入库
// ============================================================

// SelectionGroupAddProductReq 选品池商品入库请求参数
type SelectionGroupAddProductReq struct {
	PurchaserId   string   `json:"PurchaserId"`
	ShopId        string   `json:"ShopId"`
	ProductIdList []string `json:"ProductIdList"`
}

// ============================================================
// 接口11SelectionGroupRemoveProduct - 选品池商品出库
// ============================================================

// SelectionGroupRemoveProductReq 选品池商品出库请求参数
type SelectionGroupRemoveProductReq struct {
	PurchaserId   string   `json:"PurchaserId"`
	ShopId        string   `json:"ShopId"`
	ProductIdList []string `json:"ProductIdList"`
}

// ============================================================
// 接口12RenderPurchaseOrder - 采购单渲染(下单预校验)
// ============================================================

// 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"`
}

// ============================================================
// 接口13SplitPurchaseOrder - 采购单渲染并拆单
// ============================================================

// 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"`
}

// ============================================================
// 接口14CreatePurchaseOrder - 创建采购单【异步】
// ============================================================

// 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"` // 阿里云采购单号
}

// ============================================================
// 接口15GetPurchaseOrderStatus - 获取采购单状态
// ============================================================

// 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"
)

// ============================================================
// 接口16GetOrder - 获取订单详情
// ============================================================

// 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"`
}

// ============================================================
// 接口17QueryOrders - 查询订单列表
// ============================================================

// 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"`
}

// ============================================================
// 接口18ListLogisticsOrders - 查询订单物流信息
// ============================================================

// 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"`
}

// ============================================================
// 接口19ConfirmDisburse - 确认收货
// ============================================================

// ConfirmDisburseReq 确认收货请求参数
type ConfirmDisburseReq struct {
	OrderId     string `json:"-"` // Path参数
	PurchaserId string `json:"PurchaserId"`
}

// ============================================================
// 接口20RenderRefundOrder - 售后渲染预校验
// ============================================================

// 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"`
}

// ============================================================
// 接口21CreateRefundOrder - 创建售后单
// ============================================================

// 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"`
}

// ============================================================
// 接口22CancelRefundOrder - 取消售后单
// ============================================================

// CancelRefundOrderReq 取消售后单请求参数
type CancelRefundOrderReq struct {
	RefundOrderId string `json:"-"` // Path参数
	PurchaserId   string `json:"PurchaserId"`
}

// ============================================================
// 接口23GetRefundOrder - 获取售后单详情
// ============================================================

// 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"`
}

// ============================================================
// 接口24CreateGoodsShippingNotice - 回填退货物流运单
// ============================================================

// CreateGoodsShippingNoticeReq 回填退货物流运单请求参数
type CreateGoodsShippingNoticeReq struct {
	RefundOrderId    string `json:"-"` // Path参数
	PurchaserId      string `json:"PurchaserId"`
	LogisticsCompany string `json:"LogisticsCompany"`
	TrackingNumber   string `json:"TrackingNumber"`
}

// ============================================================
// 接口25QueryChildDivisionCode - 查询子区域编码
// ============================================================

// 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

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

package sdk_tb_linkedmall

// 本SDK使用阿里云OpenAPI客户端darabonba-openapi/v2进行ROA签名认证
// 签名过程由SDK内部自动处理业务无需自行实现签名算法。
// 因此本文件为占位文件,不包含自定义加密实现。

// File: sdk_tb_linkedmall/client.go

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
}