Files
jx-callback/business/partner/purchase/yb/store_sku.go
2020-03-30 15:45:24 +08:00

434 lines
14 KiB
Go

package yb
import (
"regexp"
"git.rosy.net.cn/baseapi/platformapi/yinbaoapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
"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"
"git.rosy.net.cn/jx-callback/globals/api"
)
var (
sensitiveWordRegexp = regexp.MustCompile(`商品名称中含有敏感词(\[.*\])`)
)
func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableYbStoreWrite {
storeSku := storeSkuList[0]
result, err := api.YinBaoAPI.AddProductInfo(buildProductInfoParam(storeSku))
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDYB], "创建商品")
} else {
storeSku.VendorSkuID = utils.Int64ToStr(result.UID)
updateYbSkuPluCode(vendorStoreID, storeSku.YbBarCode)
}
}
return failedList, err
}
func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
return failedList, err
}
func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableYbStoreWrite {
for _, v := range storeSkuList {
var productInfo = &yinbaoapi.ProductInfo{
UID: utils.Str2Int64(v.VendorSkuID),
Enable: utils.Int2Pointer(yinbaoapi.SkuStatusDeleted),
}
err = api.YinBaoAPI.UpdateProductInfo(productInfo)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDYB], "删除商品")
}
}
}
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) {
if storeSkuList != nil {
if len(storeSkuList) == 1 {
storeSku := storeSkuList[0]
result, err := api.YinBaoAPI.QueryProductByBarcode(utils.Int2Str(storeSku.SkuID))
resultp, err := api.YinBaoAPI.QueryProductImagesByBarcode(utils.Int2Str(storeSku.SkuID))
if err != nil {
return nil, err
}
if skuName := vendorSku2Jx(result, resultp); skuName != nil {
skuNameList = append(skuNameList, skuName)
}
} else {
var barcodes []string
for _, v := range storeSkuList {
barcodes = append(barcodes, utils.Int2Str(v.SkuID))
}
results, err := api.YinBaoAPI.QueryProductByBarcodes(barcodes)
if err != nil {
return nil, err
}
for _, v := range results {
resultp, err := api.YinBaoAPI.QueryProductImagesByBarcode(v.Barcode)
if err != nil {
return nil, err
}
if skuName := vendorSku2Jx(v, resultp); skuName != nil {
skuNameList = append(skuNameList, skuName)
}
}
}
} else {
result, err := api.YinBaoAPI.QueryProductPages(nil)
if err != nil {
return nil, err
}
if result.PostBackParameter.ParameterType == yinbaoapi.PageMaxID {
for _, v := range result.Result {
resultp, err := api.YinBaoAPI.QueryProductImagesByBarcode(v.Barcode)
if err != nil {
return nil, err
}
vv := &yinbaoapi.QueryProductByBarcodeResult{}
err = utils.Map2StructByJson(utils.Struct2MapByJson(v), vv, false)
if skuName := vendorSku2Jx(vv, resultp); skuName != nil {
skuNameList = append(skuNameList, skuName)
}
}
} else {
loopPages(result.PostBackParameter.ParameterType, result.PostBackParameter.ParameterValue, skuNameList)
}
}
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.EnableYbStoreWrite {
for _, v := range storeSkuList {
var productInfo = &yinbaoapi.ProductInfo{
UID: utils.Str2Int64(v.VendorSkuID),
Enable: utils.Int2Pointer(ybSkuStatus2Jx(v.Status)),
}
err = api.YinBaoAPI.UpdateProductInfo(productInfo)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDYB], "更新商品状态")
}
}
}
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.EnableYbStoreWrite {
for _, v := range storeSkuList {
var productInfo = &yinbaoapi.ProductInfo{
UID: utils.Str2Int64(v.VendorSkuID),
SellPrice: utils.Float64ToPointer(jxutils.IntPrice2Standard(v.VendorPrice)),
BuyPrice: utils.Float64ToPointer(jxutils.IntPrice2Standard(v.JxPrice)),
}
err = api.YinBaoAPI.UpdateProductInfo(productInfo)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDYB], "更新商品价格")
}
}
}
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.EnableYbStoreWrite {
for _, v := range storeSkuList {
var productInfo = &yinbaoapi.ProductInfo{
UID: utils.Str2Int64(v.VendorSkuID),
Stock: utils.Float64ToPointer(utils.Str2Float64(utils.Int2Str(v.Stock))),
}
err = api.YinBaoAPI.UpdateProductInfo(productInfo)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDYB], "更新商品库存")
}
}
}
return failedList, err
}
func (p *PurchaseHandler) GetStoreAllCategories(ctx *jxcontext.Context, storeID int, vendorStoreID string) (cats []*partner.BareCategoryInfo, err error) {
remoteCats, err := loadCategorysWithOption(vendorStoreID)
cats = convertVendorCatList(remoteCats)
return cats, err
}
func loadCategorysWithOption(vendorStoreID string) (remoteCats []*yinbaoapi.LoadCategorysWithOptionResult, err error) {
for {
remoteCats, err = api.YinBaoAPI.LoadCategorysWithOption(vendorStoreID)
if err == nil {
break
} else {
if yinbaoapi.IsErrCookie(err) {
err = cms.ChangeYbCookie()
if err != nil {
break
}
remoteCats, err = loadCategorysWithOption(vendorStoreID)
} else {
break
}
}
}
return remoteCats, err
}
func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) {
if globals.EnableYbStoreWrite {
var (
catName = utils.FilterEmoji(storeCat.Name)
parentCatName = utils.FilterEmoji(storeCat.ParentCatName)
)
vendorCatID, err := addNewCategory(vendorStoreID, catName, parentCatName)
if err == nil {
storeCat.VendorCatID = vendorCatID
}
return err
}
return err
}
func addNewCategory(vendorStoreID, catName, parentCatName string) (vendorCatID string, err error) {
for {
vendorCatID, err = api.YinBaoAPI.AddNewCategory(vendorStoreID, catName, parentCatName)
if err == nil {
break
} else {
if yinbaoapi.IsErrCookie(err) {
err = cms.ChangeYbCookie()
if err != nil {
break
}
vendorCatID, err = addNewCategory(vendorStoreID, catName, parentCatName)
} else {
break
}
}
}
return vendorCatID, err
}
func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) {
if globals.EnableYbStoreWrite {
var (
catName = utils.FilterEmoji(storeCat.Name)
parentCatName = utils.FilterEmoji(storeCat.ParentCatName)
)
err = updateCategory(vendorStoreID, storeCat.VendorCatID, catName, parentCatName)
}
return err
}
func updateCategory(vendorStoreID, vendorCatID, catName, parentCatName string) (err error) {
for {
err = api.YinBaoAPI.UpdateCategory(vendorStoreID, vendorCatID, catName, parentCatName)
if err == nil {
break
} else {
if yinbaoapi.IsErrCookie(err) {
err = cms.ChangeYbCookie()
if err != nil {
break
}
err = updateCategory(vendorStoreID, vendorCatID, catName, parentCatName)
} else {
break
}
}
}
return err
}
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) {
if globals.EnableYbStoreWrite {
err = deleteCategory(vendorStoreID, []string{vendorCatID})
}
return err
}
func deleteCategory(vendorStoreID string, vendorCatIDs []string) (err error) {
for {
err = api.YinBaoAPI.DeleteCategory(vendorStoreID, vendorCatIDs)
if err == nil {
break
} else {
if yinbaoapi.IsErrCookie(err) {
err = cms.ChangeYbCookie()
if err != nil {
break
}
err = api.YinBaoAPI.DeleteCategory(vendorStoreID, vendorCatIDs)
} else {
break
}
}
}
return err
}
func (p *PurchaseHandler) IsErrSkuExist(err error) (isExist bool) {
return yinbaoapi.IsErrSkuExist(err)
}
func (p *PurchaseHandler) IsErrCategoryExist(err error) (isExist bool) {
return yinbaoapi.IsErrCategoryExist(err)
}
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) {
return yinbaoapi.IsErrSkuNotExist(err)
}
func ybSkuStatus2Jx(ybStatus int) (jxSkuStatus int) {
if ybStatus == yinbaoapi.SkuStatusEnable {
jxSkuStatus = model.SkuStatusNormal
} else if ybStatus == yinbaoapi.SkuStatusDisabled {
jxSkuStatus = model.SkuStatusDontSale
} else if ybStatus == yinbaoapi.SkuStatusDeleted {
jxSkuStatus = model.SkuStatusDeleted
}
return jxSkuStatus
}
func vendorSku2Jx(result *yinbaoapi.QueryProductByBarcodeResult, resultp []*yinbaoapi.QueryProductImagesByBarcodeResult) (skuName *partner.SkuNameInfo) {
var picList []string
if result == nil {
globals.SugarLogger.Warnf("vendorSku2Jx, strange result:%s", utils.Format4Output(result, true))
return nil
}
if len(resultp) > 0 {
for _, v := range resultp {
picList = append(picList, v.ImageURL)
}
}
prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(result.Name)
skuID := int(utils.Str2Int64WithDefault(result.Barcode, 0))
skuName = &partner.SkuNameInfo{
Prefix: prefix,
Name: name,
Unit: unit,
SkuList: []*partner.SkuInfo{
&partner.SkuInfo{
StoreSkuInfo: partner.StoreSkuInfo{
VendorSkuID: utils.Int64ToStr(result.UID),
SkuID: skuID,
Stock: int(utils.Float64TwoInt64(result.Stock)),
VendorPrice: jxutils.StandardPrice2Int(result.SellPrice),
Status: ybSkuStatus2Jx(result.Enable),
},
SkuName: result.Name,
Comment: comment,
SpecQuality: float64(specQuality),
SpecUnit: specUnit,
Weight: int(utils.Float64TwoInt64(float64(specQuality))),
},
},
PictureList: picList,
}
return skuName
}
func loopPages(parameterType, parameterValue string, skuNameList []*partner.SkuNameInfo) (err error) {
var postBackParameter = &yinbaoapi.PostBackParameter{
ParameterType: parameterType,
ParameterValue: parameterValue,
}
resultPages, err := api.YinBaoAPI.QueryProductPages(postBackParameter)
if err != nil {
return err
}
for _, v := range resultPages.Result {
resultp, err := api.YinBaoAPI.QueryProductImagesByBarcode(v.Barcode)
if err != nil {
return err
}
vv := &yinbaoapi.QueryProductByBarcodeResult{}
err = utils.Map2StructByJson(utils.Struct2MapByJson(v), vv, false)
if skuName := vendorSku2Jx(vv, resultp); skuName != nil {
skuNameList = append(skuNameList, skuName)
}
}
if resultPages.PostBackParameter.ParameterType != yinbaoapi.PageMaxID {
err = loopPages(resultPages.PostBackParameter.ParameterType, resultPages.PostBackParameter.ParameterValue, skuNameList)
}
return err
}
func buildProductInfoParam(storeSku *dao.StoreSkuSyncInfo) (productInfoParam *yinbaoapi.ProductInfoParam) {
var (
buyPrice float64 = utils.Str2Float64(utils.Int64ToStr(storeSku.Price)) / 100
sellPrice float64 = utils.Str2Float64(utils.Int64ToStr(storeSku.VendorPrice)) / 100
_, name, _, _, _, _ = jxutils.SplitSkuName(storeSku.SkuName)
)
productInfoParam = &yinbaoapi.ProductInfoParam{}
productInfo := &yinbaoapi.ProductInfo{
Stock: utils.Float64ToPointer(utils.Str2Float64(utils.Int2Str(model.MaxStoreSkuStockQty))),
Name: name,
Barcode: storeSku.YbBarCode,
BuyPrice: &buyPrice,
SellPrice: &sellPrice,
CategoryUID: utils.Str2Int64(storeSku.VendorCatID),
}
productInfoParam.ProductInfo = productInfo
return productInfoParam
}
func convertVendorCatList(remoteCats []*yinbaoapi.LoadCategorysWithOptionResult) (cats []*partner.BareCategoryInfo) {
for _, rCat := range remoteCats {
cat := &partner.BareCategoryInfo{
VendorCatID: rCat.TxtUID,
Name: rCat.Name,
}
if rCat.TxtParentUID == "" {
cat.Level = 1
} else {
cat.Level = 2
}
cats = append(cats, cat)
}
return cats
}
func updateYbSkuPluCode(vendorStoreID, ybBarCode string) (err error) {
for {
err = api.YinBaoAPI.SaveProduct(vendorStoreID, ybBarCode)
if err == nil {
break
} else {
if yinbaoapi.IsErrCookie(err) {
err = cms.ChangeYbCookie()
if err != nil {
break
}
err = updateYbSkuPluCode(vendorStoreID, ybBarCode)
} else {
break
}
}
}
return err
}