Files
jx-callback/business/partner/purchase/gomei/store_sku_other.go
邹宗楠 495bfd5683 1
2022-05-16 09:37:40 +08:00

394 lines
12 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package gomei
import (
"encoding/base64"
"fmt"
gomei "git.rosy.net.cn/baseapi/platformapi/gome_live_show"
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/business/partner/putils"
"git.rosy.net.cn/jx-callback/globals"
"regexp"
"strings"
"time"
)
// 删除不在使用商品(下架之后在删除) ok
func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableJdShopWrite && vendorStoreID == model.GoMeiShopMainVendorStoreID {
for _, v := range storeSkuList {
if v.IsDeletedBySku && storeID != 0 { // 如果门店id存在,则将该门店商品下架,所有门店该商品处于下架才可以删除!
_, err = getAPI(v.VendorOrgCode).OnOffLineGoodsOnStore(&gomei.ShelfGoodsForStoreReq{
StoreCode: vendorStoreID,
SkuCode: []string{v.VendorSkuID},
ShelveStatus: gomei.DownOnTheShelf,
})
}
if err == nil {
_, err = getAPI(v.VendorOrgCode).DeleteGoodsOnStore(v.VendorSkuID)
}
if err != nil {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorGoMei], "删除商品")...)
}
}
}
return failedList, err
}
// 获取门店商品列表
func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) {
var (
pageNo = 1
pageSize = 50
)
result, err := getAPI(string(model.VendorGoMei)).QueryGoodsListById(&gomei.QueryGoodsListForStoreReq{
Page: gomei.Page{
PageNumber: pageNo,
PageSize: pageSize,
},
})
if err != nil {
return nil, err
}
for ; pageNo <= result.Data.Total/pageSize+1; pageNo++ {
result2, err := getAPI(string(model.VendorGoMei)).QueryGoodsListById(&gomei.QueryGoodsListForStoreReq{
Page: gomei.Page{
PageNumber: pageNo,
PageSize: pageSize,
},
})
if err != nil {
return nil, err
}
for _, v := range result2.Data.Records {
if skuName := vendorSku2Jx2(v); skuName != nil {
skuNameList = append(skuNameList, skuName)
}
}
}
return skuNameList, err
}
// 修改门店商品状态
func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, status int) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableJdShopWrite {
for _, v := range storeSkuList {
if vendorSkuID, err := getMainStoreVendorSkuID(model.GoMeiShopMainStoreID, v.SkuID); err == nil && vendorSkuID != "" {
storeSku := &gomei.ShelfGoodsForStoreReq{
StoreCode: vendorStoreID,
SkuCode: []string{vendorSkuID},
}
if status == 0 {
storeSku.ShelveStatus = gomei.PutOnTheShelf
} else {
storeSku.ShelveStatus = gomei.DownOnTheShelf
}
_, err = getAPI(v.VendorOrgCode).OnOffLineGoodsOnStore(storeSku)
}
}
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorGoMei], "修改商品库存")
}
}
return failedList, err
}
// 修改门店商品价格维护
func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableJdShopWrite {
for _, v := range storeSkuList {
if vendorSkuID, err := getMainStoreVendorSkuID(model.GoMeiShopMainStoreID, v.SkuID); err == nil && vendorSkuID != "" {
_, err = getAPI(v.VendorOrgCode).UpdateOnGoodsPriceForStore(&gomei.StoreGoodsPriceUpdateReq{
StoreCode: vendorStoreID,
SkuCode: vendorSkuID,
SalePrice: utils.Int64ToFloat64(v.VendorPrice),
})
}
if err != nil {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品价格")...)
}
}
}
return failedList, err
}
// 门店商品库存维护
func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableJdShopWrite {
for _, v := range storeSkuList {
if vendorSkuID, err := getMainStoreVendorSkuID(model.GoMeiShopMainStoreID, v.SkuID); err == nil && vendorSkuID != "" {
_, err = getAPI(v.VendorOrgCode).UpdateStockForStore(&gomei.StoreGoodsStockUpdateReq{
StoreCode: vendorStoreID,
ItemStocks: []*gomei.StoreSkuNum{
{SkuCode: vendorSkuID, StockNum: int64(v.Stock)},
},
})
}
}
if err != nil {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品库存")...)
}
}
return failedList, err
}
// 获取门店所有的分类
func (p *PurchaseHandler) GetStoreAllCategories(ctx *jxcontext.Context, storeID int, vendorStoreID string) (cats []*partner.BareCategoryInfo, err error) {
var (
pageNo = 1
pageSize = 50
)
result, err := getAPI(string(model.VendorGoMei)).QueryStoreCategoryList(&gomei.QueryStoreGoodsCategoryListReq{
Page: gomei.Page{
PageNumber: pageNo,
PageSize: pageSize,
},
StoreCode: vendorStoreID,
})
for ; pageNo <= result.Data.Total/pageSize+1; pageNo++ {
result2, err := getAPI(string(model.VendorGoMei)).QueryStoreCategoryList(&gomei.QueryStoreGoodsCategoryListReq{
Page: gomei.Page{
PageNumber: pageNo,
PageSize: pageSize,
},
StoreCode: vendorStoreID,
})
if err != nil {
return nil, err
}
for _, v := range result2.Data.Records {
var cat = &partner.BareCategoryInfo{
VendorCatID: v.CategoryCode,
Name: v.CategoryName,
}
cat.Level = 1
cats = append(cats, cat)
}
}
return cats, err
}
// 修改或者更新门店分类信息
func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) {
if globals.EnableJdShopWrite {
_, status, err2 := updateOrCreateCategories(storeCat, vendorStoreID, false)
err = err2
if status == -1 {
return fmt.Errorf("京东商城店内分类更新失败!")
}
}
return err
}
func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) {
if globals.EnableJdShopWrite {
allCategoryList, status, err2 := updateOrCreateCategories(storeCat, vendorStoreID, true)
err = err2
if status == -1 {
return fmt.Errorf("国美商城店内分类创建失败!")
}
if err != nil {
return err
}
time.Sleep(time.Second * 2)
for _, v := range allCategoryList {
if v.CategoryName == storeCat.Name {
storeCat.VendorCatID = v.CategoryCode
break
}
}
if storeCat.VendorCatID == "" {
return fmt.Errorf("国美商城店内分类创建可能失败了storeID: %v", storeID)
}
}
return err
}
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) {
if globals.EnableJdShopWrite {
_, err = getAPI(string(model.VendorGoMei)).DeleteStoreGoodsCategory(vendorStoreID, vendorCatID)
}
return err
}
func (p *PurchaseHandler) IsErrSkuExist(err error) (isExist bool) {
return false
}
func (p *PurchaseHandler) IsErrCategoryExist(err error) (isExist bool) {
return false
}
func (p *PurchaseHandler) IsErrCategoryNotExist(err error) (isNotExist bool) {
return false
}
func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
return 1
}
func (p *PurchaseHandler) GetSensitiveWordRegexp() *regexp.Regexp {
return sensitiveWordRegexp
}
func (p *PurchaseHandler) IsErrSkuNotExist(err error) (isNotExist bool) {
if strings.Contains(err.Error(), deleteErr1) || (strings.Contains(err.Error(), deleteErr2) && strings.Contains(err.Error(), deleteErr3)) {
return true
}
return false
}
func GetAllStoreCategories(vendorOrgCode, vendorStoreId string) ([]*gomei.StoreGoodsCategoryListRecord, error) {
var (
pageNo = 1
pageSize = 50
)
result, err := getAPI(vendorOrgCode).QueryStoreCategoryList(&gomei.QueryStoreGoodsCategoryListReq{
Page: gomei.Page{
PageSize: pageSize,
PageNumber: pageNo,
},
StoreCode: vendorStoreId,
})
if err != nil {
return nil, err
}
createShopCategoryParams := make([]*gomei.StoreGoodsCategoryListRecord, 0, 0)
for ; pageNo <= result.Data.Total/pageSize+1; pageNo++ {
result2, err := getAPI(vendorOrgCode).QueryStoreCategoryList(&gomei.QueryStoreGoodsCategoryListReq{
Page: gomei.Page{
PageNumber: pageNo,
PageSize: pageSize,
},
StoreCode: vendorStoreId,
})
if err != nil {
return nil, err
}
for _, v := range result2.Data.Records {
createShopCategoryParams = append(createShopCategoryParams, &gomei.StoreGoodsCategoryListRecord{
CategoryCode: v.CategoryCode,
CategoryName: v.CategoryName,
Rank: v.Rank,
})
}
}
return createShopCategoryParams, nil
}
// 创建或者修改分类
func updateOrCreateCategories(storeCat *dao.SkuStoreCatInfo, vendorStoreId string, isCreate bool) (createShopCategoryParams []*gomei.StoreGoodsCategoryListRecord, status int64, err error) {
createShopCategoryParams, err = GetAllStoreCategories(storeCat.VendorOrgCode, vendorStoreId)
if err != nil {
return nil, -1, err
}
if isCreate { // 创建分类
_, err = getAPI(storeCat.VendorOrgCode).AddStoreCategory(&gomei.StoreAddGoodsCategory{
StoreCode: vendorStoreId,
CategoryName: storeCat.VendorCategoryName, // storeCat.StoreCatName
Rank: 0,
})
if err != nil {
return nil, -1, err
}
} else { // 修改分类,无法新增和修改排序,排序结构需要在国美系统上获取
// 查询当前分类
for _, v := range createShopCategoryParams {
if v.CategoryCode != storeCat.VendorCatID {
continue
}
_, err = getAPI(storeCat.VendorOrgCode).ModifyStoreGoodsCategory(&gomei.StoreModifyGoodsCategory{
StoreCode: vendorStoreId,
CategoryCode: storeCat.VendorCatID, // storeCat.StoreCatName
CategoryName: storeCat.VendorCategoryName, // storeCat.StoreCatName
Rank: v.Rank,
})
if err != nil {
return nil, -1, err
}
}
}
return
}
// 将平台商品信息转化为本地商品信息
func vendorSku2Jx2(result *gomei.QueryGoodsListForStoreRecordRes) (skuName *partner.SkuNameInfo) {
if result == nil {
globals.SugarLogger.Warnf("vendorSku2Jx, strange result:%s", utils.Format4Output(result, true))
return nil
}
skuName = &partner.SkuNameInfo{
Name: result.GoodsName,
SkuList: []*partner.SkuInfo{
&partner.SkuInfo{
StoreSkuInfo: partner.StoreSkuInfo{
VendorSkuID: result.SkuCode,
Stock: result.StockNum,
VendorPrice: jxutils.StandardPrice2Int(result.SalePrice),
},
},
},
}
if result.ShelveStatus == gomei.PutOnTheShelf {
skuName.Status = 1
} else {
skuName.Status = 0
}
return skuName
}
// 获取当前门店第三方商品id
func getMainStoreVendorSkuID(mainStoreID int, skuID int) (vendorSkuID string, err error) {
var (
db = dao.GetDB()
)
storeSkus, err := dao.GetStoresSkusInfo(db, []int{mainStoreID}, []int{skuID})
if len(storeSkus) > 0 {
//vendorSkuID = storeSkus[0].GmID
}
return vendorSkuID, err
}
// 国美上传图片,转bese64字符串在上传,图片要求长宽和大小
func uploadImg(img, name, index, vendorOrgCode string) (imgURL string, err error) {
data, _, err := jxutils.DownloadFileByURL(img)
if err != nil {
return "", err
}
// 获取图片地址
uploadResult, err := getAPI(vendorOrgCode).UploadPicture(base64.StdEncoding.EncodeToString(data), 1, name+string(time.Now().Unix()))
if err != nil {
return "", err
}
return uploadResult.Data.Url, err
}
func filterSensitiveWord(name string) (result string) {
for _, v := range jdshopapi.SensitiveWordMap {
if strings.Contains(name, v) {
return strings.ReplaceAll(name, v, "")
}
}
return name
}