From f2565707e483516e6cc11c36aef6b9ece5e2d5bb Mon Sep 17 00:00:00 2001 From: kanade Date: Thu, 8 Dec 2022 13:45:47 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B8=A0=E9=81=93=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wholesale/channel/channel.go | 6 + wholesale/channel/mq.go | 56 +++++++++ wholesale/channel/sku.go | 237 +++++++++++++++++++++++++++++++++++ wholesale/interface/sku.go | 32 +++++ 4 files changed, 331 insertions(+) create mode 100644 wholesale/channel/channel.go create mode 100644 wholesale/channel/mq.go create mode 100644 wholesale/channel/sku.go create mode 100644 wholesale/interface/sku.go diff --git a/wholesale/channel/channel.go b/wholesale/channel/channel.go new file mode 100644 index 0000000..44d18f4 --- /dev/null +++ b/wholesale/channel/channel.go @@ -0,0 +1,6 @@ +package channel + +type Channel struct { + Sku sku + Mq mq +} diff --git a/wholesale/channel/mq.go b/wholesale/channel/mq.go new file mode 100644 index 0000000..91f8e57 --- /dev/null +++ b/wholesale/channel/mq.go @@ -0,0 +1,56 @@ +package channel + +import ( + "context" + "git.oa00.com/supply-chain/service/client" + "github.com/smallnest/rpcx/share" +) + +const ( + MqSubscribeNameSkuPriceChange = "sku_price_change" // sku价格变动 + MqSubscribeNameSkuChange = "sku_change" // sku信息变动 +) + +type mq struct { +} +type ArgsMqSubscribe struct { + Name string // 队列名称 + AppKey string // 队列名称 +} + +// Subscribe @Title 订阅mq +func (m *mq) Subscribe(ctx context.Context, channelId string, args ArgsMqSubscribe) (key string, err error) { + xClient, err := client.GetClient(m) + if err != nil { + return + } + err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "Subscribe", args, &key) + return +} + +// SubscribeCancel @Title 订阅取消 +func (m *mq) SubscribeCancel(ctx context.Context, channelId string, args ArgsMqSubscribe) (err error) { + reply := 0 + xClient, err := client.GetClient(m) + if err != nil { + return + } + err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "SubscribeCancel", args, &reply) + return +} + +type ArgsMqUser struct { + AppKey string + AppSecret string +} + +// User @Title Mq用户 +func (m *mq) User(ctx context.Context, channelId string, args ArgsMqUser) (err error) { + reply := 0 + xClient, err := client.GetClient(m) + if err != nil { + return + } + err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "User", args, &reply) + return +} diff --git a/wholesale/channel/sku.go b/wholesale/channel/sku.go new file mode 100644 index 0000000..6241268 --- /dev/null +++ b/wholesale/channel/sku.go @@ -0,0 +1,237 @@ +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 { +} + +type SkuSearch struct { + Status uint // 1=上架 2=下架 + SkuName string // 商品名称 +} +type ArgsSkuList struct { + Search SkuSearch + Page bean.Page +} + +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"` + Length decimal.Decimal `json:"length"` // 长 + Width decimal.Decimal `json:"width"` // 宽 + Height decimal.Decimal `json:"height"` // 高 + Weight decimal.Decimal `json:"weight"` // 重 + PackingRate uint `json:"packingRate"` // 装箱率 + StartingBatch uint `json:"startingBatch"` // 起批量 + InitialFreight decimal.Decimal `json:"initialFreight"` // 起批运费 + CreatedAt int64 `json:"createdAt"` + UpdatedAt int64 `json:"updatedAt"` +} + +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{} // 拓展查询 +} +type ArgsSkuListsEs struct { + Search SkuEsSearch + 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"` + Length decimal.Decimal `json:"length"` // 长 + Width decimal.Decimal `json:"width"` // 宽 + Height decimal.Decimal `json:"height"` // 高 + Weight decimal.Decimal `json:"weight"` // 重 + PackingRate uint `json:"packingRate"` // 装箱率 + StartingBatch uint `json:"startingBatch"` // 起批量 + InitialFreight decimal.Decimal `json:"initialFreight"` // 起批运费 +} +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 +} diff --git a/wholesale/interface/sku.go b/wholesale/interface/sku.go new file mode 100644 index 0000000..c003e0f --- /dev/null +++ b/wholesale/interface/sku.go @@ -0,0 +1,32 @@ +package _interface + +import ( + "context" +) + +type skuState uint + +const ( + SkuStateIn = 1 // 有货 + SkuStateOut = 2 // 无货 + SkuStateDone = 3 // 下架商品 +) + +type Sku interface { + // Stock 库存查询 + Stock(ctx context.Context, args ArgsSkuStock, reply *[]ReplySkuStock) error +} + +type ArgsSkuStock struct { + Address string // 地址 + Skus []SkuStockItem // sku信息 +} + +type SkuStockItem struct { + SourceSkuId string // 源skuId + Quantity uint // 数量 +} +type ReplySkuStock struct { + SourceSkuId string `json:"sourceSkuId"` // 源skuId + State uint `json:"state"` // 库存状态 +} From b1cfdf8f34efaa01d1da9c9b4c3a7d817393f514 Mon Sep 17 00:00:00 2001 From: kanade Date: Thu, 8 Dec 2022 13:52:16 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B8=A0=E9=81=93=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wholesale/wholesale.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wholesale/wholesale.go b/wholesale/wholesale.go index b30ccc0..95b0102 100644 --- a/wholesale/wholesale.go +++ b/wholesale/wholesale.go @@ -1,6 +1,9 @@ package wholesale -import "git.oa00.com/supply-chain/service/wholesale/setting" +import ( + "git.oa00.com/supply-chain/service/wholesale/channel" + "git.oa00.com/supply-chain/service/wholesale/setting" +) type Wholesale struct { Brand brand @@ -9,4 +12,5 @@ type Wholesale struct { Sku sku SkuAudit skuAudit Setting setting.Setting + Channel channel.Channel } From 6d22206a89f6835a2bf447fb21d6c2bcbdccde3f Mon Sep 17 00:00:00 2001 From: sian Date: Thu, 8 Dec 2022 14:15:45 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- supplier/afs.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/supplier/afs.go b/supplier/afs.go index 3d16e25..38a7ff5 100644 --- a/supplier/afs.go +++ b/supplier/afs.go @@ -52,6 +52,47 @@ func (a *afs) Lists(ctx context.Context, args ArgsAfsLists) (reply ReplyAfsLists return } +type ReplyAfsDetail struct { + Id uint `json:"id"` + AfsSn string `json:"afsSn"` + Status uint `json:"status"` + ApproveNotes string `json:"approveNotes"` + Result string `json:"result"` + CreatedAt int64 `json:"createdAt"` + UpdatedAt int64 `json:"updatedAt"` + SkuName string `json:"skuName"` + ImgUrl string `json:"imgUrl"` + SkuId uint `json:"skuId"` + Price decimal.Decimal `json:"price"` + Quantity uint `json:"quantity"` + HopeTypeName string `json:"hopeTypeName"` + TypeReasonName string `json:"typeReasonName"` + Imgs []string `json:"imgs"` + LogisticsCompany string `json:"logisticsCompany"` + WaybillCode string `json:"waybillCode"` + SendAt int64 `json:"sendAt"` + PackageSend uint `json:"packageSend"` + AfsPackageSend AfsPackageSend `json:"afsPackageSend"` +} + +type AfsPackageSend struct { + Name string `json:"name"` + Mobile string `json:"mobile"` + LogisticsCompany string `json:"logisticsCompany"` + WaybillCode string `json:"waybillCode"` + SendGoodsDate int64 `json:"sendGoodsDate"` +} + +// Detail @Title 售后详情 +func (a *afs) Detail(ctx context.Context, afsSn uint64) (reply ReplyAfsDetail, err error) { + xClient, err := client.GetClient(a) + if err != nil { + return + } + err = xClient.Call(ctx, "Detail", afsSn, &reply) + return +} + type ArgsAfsReject struct { AfsSn string `json:"afsSn"` Notes string `json:"notes"` From 4ba04f52b4307d81d678bf697153fca4a90d4515 Mon Sep 17 00:00:00 2001 From: sian Date: Thu, 8 Dec 2022 15:28:40 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- supplier/afs.go | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/supplier/afs.go b/supplier/afs.go index 38a7ff5..21538d9 100644 --- a/supplier/afs.go +++ b/supplier/afs.go @@ -53,26 +53,27 @@ func (a *afs) Lists(ctx context.Context, args ArgsAfsLists) (reply ReplyAfsLists } type ReplyAfsDetail struct { - Id uint `json:"id"` - AfsSn string `json:"afsSn"` - Status uint `json:"status"` - ApproveNotes string `json:"approveNotes"` - Result string `json:"result"` - CreatedAt int64 `json:"createdAt"` - UpdatedAt int64 `json:"updatedAt"` - SkuName string `json:"skuName"` - ImgUrl string `json:"imgUrl"` - SkuId uint `json:"skuId"` - Price decimal.Decimal `json:"price"` - Quantity uint `json:"quantity"` - HopeTypeName string `json:"hopeTypeName"` - TypeReasonName string `json:"typeReasonName"` - Imgs []string `json:"imgs"` - LogisticsCompany string `json:"logisticsCompany"` - WaybillCode string `json:"waybillCode"` - SendAt int64 `json:"sendAt"` - PackageSend uint `json:"packageSend"` - AfsPackageSend AfsPackageSend `json:"afsPackageSend"` + Id uint `json:"id"` + AfsSn string `json:"afsSn"` + Status uint `json:"status"` + ApproveNotes string `json:"approveNotes"` + Result string `json:"result"` + CreatedAt int64 `json:"createdAt"` + UpdatedAt int64 `json:"updatedAt"` + SkuName string `json:"skuName"` + ImgUrl string `json:"imgUrl"` + SkuId uint `json:"skuId"` + Price decimal.Decimal `json:"price"` + Quantity uint `json:"quantity"` + HopeTypeName string `json:"hopeTypeName"` + TypeReasonName string `json:"typeReasonName"` + Imgs []string `json:"imgs"` + LogisticsCompany string `json:"logisticsCompany"` + WaybillCode string `json:"waybillCode"` + SendAt int64 `json:"sendAt"` + PackageSend uint `json:"packageSend"` + AfsPackageSend AfsPackageSend `json:"afsPackageSend"` + ReturnAddress []ReturnAddressItem `json:"returnAddress"` } type AfsPackageSend struct {