|
|
|
|
package channel
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"git.oa00.com/supply-chain/service/client"
|
|
|
|
|
"git.oa00.com/supply-chain/service/lib/bean"
|
|
|
|
|
"github.com/shopspring/decimal"
|
|
|
|
|
"github.com/smallnest/rpcx/share"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type sku struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
SkuOrderTypePrice = 1 // 价格排序
|
|
|
|
|
SkuOrderTypeDiscount = 2 // 价格折扣
|
|
|
|
|
|
|
|
|
|
SkuOrderSortUp = 1 // 升序
|
|
|
|
|
SkuOrderSortDown = 2 // 降序
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type SkuSearch struct {
|
|
|
|
|
Status uint // 1=上架 2=下架
|
|
|
|
|
SkuName string // 商品名称
|
|
|
|
|
}
|
|
|
|
|
type ArgsSkuList struct {
|
|
|
|
|
Search SkuSearch
|
|
|
|
|
Page bean.Page
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SkuItemHighlight struct {
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
}
|
|
|
|
|
type SkuItem struct {
|
|
|
|
|
Id uint `json:"id"`
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
BrandId uint `json:"brandId"`
|
|
|
|
|
BrandName string `json:"brandName"`
|
|
|
|
|
FirstCategoryId uint `json:"firstCategoryId"`
|
|
|
|
|
FirstCategoryName string `json:"firstCategoryName"`
|
|
|
|
|
SecondCategoryId uint `json:"secondCategoryId"`
|
|
|
|
|
SecondCategoryName string `json:"secondCategoryName"`
|
|
|
|
|
ThirdCategoryId uint `json:"thirdCategoryId"`
|
|
|
|
|
ThirdCategoryName string `json:"thirdCategoryName"`
|
|
|
|
|
Price decimal.Decimal `json:"price"`
|
|
|
|
|
Discount decimal.Decimal `json:"discount"`
|
|
|
|
|
GuidePrice decimal.Decimal `json:"guidePrice"`
|
|
|
|
|
ImgUrl string `json:"imgUrl"`
|
|
|
|
|
Profit decimal.Decimal `json:"profit"`
|
|
|
|
|
Size string `json:"size"`
|
|
|
|
|
Color string `json:"color"`
|
|
|
|
|
Tax string `json:"tax"`
|
|
|
|
|
Unit string `json:"unit"`
|
|
|
|
|
UpcCode string `json:"upcCode"`
|
|
|
|
|
TaxName string `json:"taxName"`
|
|
|
|
|
TaxCode string `json:"taxCode"`
|
|
|
|
|
Status uint `json:"status"`
|
|
|
|
|
CreatedAt int64 `json:"createdAt"`
|
|
|
|
|
UpdatedAt int64 `json:"updatedAt"`
|
|
|
|
|
Highlight SkuItemHighlight `json:"highlight"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ReplySkuList struct {
|
|
|
|
|
Lists []SkuItem `json:"lists"`
|
|
|
|
|
Total int64 `json:"total"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Lists @Title 商品列表
|
|
|
|
|
func (s *sku) Lists(ctx context.Context, channelId string, args ArgsSkuList) (reply ReplySkuList, err error) {
|
|
|
|
|
xClient, err := client.GetClient(s)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "Lists", args, &reply)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SkuEsSearch struct {
|
|
|
|
|
SkuIds []uint // 商品SkuIds
|
|
|
|
|
Status uint // 1=上架 2=下架
|
|
|
|
|
SkuName string // 商品名称
|
|
|
|
|
BrandId uint // 品牌id
|
|
|
|
|
BrandName string // 品牌名称 全词匹配
|
|
|
|
|
FirstCategoryId uint // 一级分类id
|
|
|
|
|
FirstCategoryName string // 一级分类名称 全词匹配
|
|
|
|
|
SecondCategoryId uint // 二级分类id
|
|
|
|
|
SecondCategoryName string // 二级分类名称 全词匹配
|
|
|
|
|
ThirdCategoryId uint // 三级分类id
|
|
|
|
|
ThirdCategoryName string // 三级分类名称 全词匹配
|
|
|
|
|
MaxPrice decimal.Decimal // 最高金额
|
|
|
|
|
MinPrice decimal.Decimal // 最低金额
|
|
|
|
|
MinDiscount decimal.Decimal // 最低折扣
|
|
|
|
|
MaxDiscount decimal.Decimal // 最高折扣
|
|
|
|
|
Expand []map[string]interface{} // 拓展查询
|
|
|
|
|
CustomerSearch string // 客户系统搜索参数
|
|
|
|
|
MinGuidePrice decimal.Decimal // 市场参考价
|
|
|
|
|
MaxGuidePrice decimal.Decimal // 市场参考价
|
|
|
|
|
Source uint // 所属供应商
|
|
|
|
|
ThirdCategoryIds []uint // 三级分类Ids
|
|
|
|
|
TagIds []uint // 标签Ids
|
|
|
|
|
|
|
|
|
|
OrderType uint // 排序类型
|
|
|
|
|
OrderSort uint // 排序顺序
|
|
|
|
|
}
|
|
|
|
|
type SkuEsConfig struct {
|
|
|
|
|
Highlight bool
|
|
|
|
|
}
|
|
|
|
|
type ArgsSkuListsEs struct {
|
|
|
|
|
Search SkuEsSearch
|
|
|
|
|
Config SkuEsConfig
|
|
|
|
|
Page bean.Page
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ListsEs @Title es商品列表 目前最大10000条数据,超出不显示
|
|
|
|
|
func (s *sku) ListsEs(ctx context.Context, channelId string, args ArgsSkuListsEs) (reply ReplySkuList, err error) {
|
|
|
|
|
xClient, err := client.GetClient(s)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "ListsEs", args, &reply)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ArgsSkuDetails struct {
|
|
|
|
|
SkuIds []uint // sku数组
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SkuDetailItem struct {
|
|
|
|
|
Id uint `json:"id"`
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
BrandId uint `json:"brandId"`
|
|
|
|
|
BrandName string `json:"brandName"`
|
|
|
|
|
FirstCategoryId uint `json:"firstCategoryId"`
|
|
|
|
|
FirstCategoryName string `json:"firstCategoryName"`
|
|
|
|
|
SecondCategoryId uint `json:"secondCategoryId"`
|
|
|
|
|
SecondCategoryName string `json:"secondCategoryName"`
|
|
|
|
|
ThirdCategoryId uint `json:"thirdCategoryId"`
|
|
|
|
|
ThirdCategoryName string `json:"thirdCategoryName"`
|
|
|
|
|
Price decimal.Decimal `json:"price"`
|
|
|
|
|
GuidePrice decimal.Decimal `json:"guidePrice"`
|
|
|
|
|
ImgUrl string `json:"imgUrl"`
|
|
|
|
|
Profit decimal.Decimal `json:"profit"`
|
|
|
|
|
Size string `json:"size"`
|
|
|
|
|
Color string `json:"color"`
|
|
|
|
|
Tax string `json:"tax"`
|
|
|
|
|
Unit string `json:"unit"`
|
|
|
|
|
UpcCode string `json:"upcCode"`
|
|
|
|
|
TaxName string `json:"taxName"`
|
|
|
|
|
TaxCode string `json:"taxCode"`
|
|
|
|
|
Status uint `json:"status"`
|
|
|
|
|
CreatedAt int64 `json:"createdAt"`
|
|
|
|
|
UpdatedAt int64 `json:"updatedAt"`
|
|
|
|
|
Content string `json:"content"`
|
|
|
|
|
Imgs []SkuImg `json:"imgs"`
|
|
|
|
|
Specifications []SkuSpecification `json:"specifications"`
|
|
|
|
|
GroupSkuIds []uint `json:"groupSkuIds"`
|
|
|
|
|
}
|
|
|
|
|
type SkuImg struct {
|
|
|
|
|
Path string `json:"path"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SkuSpecification struct {
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
Attributes []SkuAttribute `json:"attributes"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SkuAttribute struct {
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
Value []string `json:"value"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Details @Title 获取sku详情
|
|
|
|
|
func (s *sku) Details(ctx context.Context, channelId string, args ArgsSkuDetails) (reply []SkuDetailItem, err error) {
|
|
|
|
|
xClient, err := client.GetClient(s)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "Details", args, &reply)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ArgsSkuPrices struct {
|
|
|
|
|
SkuIds []uint // sku数组
|
|
|
|
|
}
|
|
|
|
|
type SkuPrice struct {
|
|
|
|
|
Id uint `json:"id"`
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
Price decimal.Decimal `json:"price"`
|
|
|
|
|
GuidePrice decimal.Decimal `json:"guidePrice"`
|
|
|
|
|
Profit decimal.Decimal `json:"profit"`
|
|
|
|
|
Status uint `json:"status"`
|
|
|
|
|
CreatedAt int64 `json:"createdAt"`
|
|
|
|
|
UpdatedAt int64 `json:"updatedAt"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Prices @Title 获取sku价格
|
|
|
|
|
func (s *sku) Prices(ctx context.Context, channelId string, args ArgsSkuPrices) (reply []SkuPrice, err error) {
|
|
|
|
|
xClient, err := client.GetClient(s)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "Prices", args, &reply)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ArgsSkuGroups struct {
|
|
|
|
|
SkuIds []uint // sku数组
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SkuGroup struct {
|
|
|
|
|
SkuId uint `json:"skuId"`
|
|
|
|
|
GroupSkuIds []uint `json:"groupSkuIds"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Groups @Title 获取sku分组信息
|
|
|
|
|
func (s *sku) Groups(ctx context.Context, channelId string, args ArgsSkuGroups) (reply []SkuGroup, err error) {
|
|
|
|
|
xClient, err := client.GetClient(s)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "Groups", args, &reply)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ArgsSkuStock struct {
|
|
|
|
|
Address string // 地址
|
|
|
|
|
Skus []SkuStockItem // sku信息
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SkuStockItem struct {
|
|
|
|
|
SkuId uint // skuId
|
|
|
|
|
Quantity uint // 数量
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ReplySkuStock struct {
|
|
|
|
|
SkuId uint `json:"skuId"` // skuId
|
|
|
|
|
State uint `json:"state"` // 库存状态
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Stock @Title 库存查询
|
|
|
|
|
func (s *sku) Stock(ctx context.Context, channelId string, args ArgsSkuStock) (reply []ReplySkuStock, err error) {
|
|
|
|
|
xClient, err := client.GetClient(s)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "Stock", args, &reply)
|
|
|
|
|
return
|
|
|
|
|
}
|