394 lines
12 KiB
Go
394 lines
12 KiB
Go
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
|
||
}
|