Merge branch 'jdshop' of https://e.coding.net/rosydev/jx-callback into jdshop

This commit is contained in:
richboo111
2023-02-21 11:24:23 +08:00
7 changed files with 137 additions and 69 deletions

View File

@@ -435,10 +435,8 @@ func updateStoreSku(db *dao.DaoDB, vendorID int, storeSkuList []*dao.StoreSkuSyn
} else {
updateItemList := make([]*dao.KVUpdateItem, len(storeSkuList))
for k, v := range storeSkuList {
//globals.SugarLogger.Debugf("======skusyncStatus %s", utils.Format4Output(v, false))
updateItemList[k] = sku2Update(vendorID, v, syncStatus)
}
//globals.SugarLogger.Debugf("========updateItemList=== %s", utils.Format4Output(updateItemList, false))
num, err = dao.BatchUpdateEntityByKV(db, updateItemList)
if vendorID == model.VendorIDYB {
err = updateYbOhterSku(db, storeSkuList)

View File

@@ -171,6 +171,12 @@ func UpdateSkuNameTiktokAttr(db *DaoDB, id int64, attr string) {
sql := ` UPDATE sku_name SET tiktok_attribute = ? WHERE id = ? `
ExecuteSQL(db, sql, []interface{}{attr, id}...)
}
func UpdateSkuNameTiktokBrandName(db *DaoDB, upc, brandName, brandId string) {
sql := ` UPDATE sku_name SET upc_brand_name = ?,upc_tiktok_brand_id = ? WHERE upc = ? `
ExecuteSQL(db, sql, []interface{}{brandName, brandId, upc}...)
}
func GetSkuNames(db *DaoDB, nameIDs []int, upcs []string, name string, isExd bool) (skuNameList []*model.SkuName, err error) {
sql := `
SELECT t1.*

View File

@@ -96,19 +96,21 @@ type StoreSkuSyncInfo struct {
ExPrefixEnd *time.Time
// NameID int `orm:"column(name_id)"`
VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用
Name string
Unit string
Upc string
IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部全国可见如果否的话可见性由SkuPlace决定
NameStatus int
SellCities []string
NameCategoryID int `orm:"column(name_category_id)"`
TiktokAttribute string `orm:"column(tiktok_attribute)"`
YbNameSuffix string //银豹的商品条码后缀
YbBarCode string //银豹的商品条码
JdsStockSwitch int
PreparationTime int
VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用
Name string
Unit string
Upc string
UpcBrandName string `orm:"column(upc_brand_name)" json:"upcBrandName"` // upc商品时使用(品牌名称)
UpcTiktokBrandId string `orm:"column(upc_tiktok_brand_id)" json:"upcTiktokBrandId"` // upc商品时使用(抖音品牌id)
IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部全国可见如果否的话可见性由SkuPlace决定
NameStatus int
SellCities []string
NameCategoryID int `orm:"column(name_category_id)"`
TiktokAttribute string `orm:"column(tiktok_attribute)"`
YbNameSuffix string //银豹的商品条码后缀
YbBarCode string //银豹的商品条码
JdsStockSwitch int
PreparationTime int
// 平台相关的图片信息
Img string
@@ -571,7 +573,7 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id, t1.stock, t1.mt_ladder_box_price,
t2.*,
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.category_id name_category_id, t3.yb_name_suffix,t3.tiktok_attribute,
t3.jds_stock_switch, t3.preparation_time, t3.img_watermark, t3.ex_vendor_id, t3.img img_origin,
t3.jds_stock_switch, t3.preparation_time, t3.img_watermark, t3.ex_vendor_id, t3.img img_origin,t3.upc_brand_name,t3.upc_tiktok_brand_id,
IF(t11.%s <> '', t11.%s, t3.img) img,
IF(t12.%s <> '', t12.%s, t3.img2) img2,
IF(t15.%s <> '', t15.%s, t3.img3) img3,
@@ -708,7 +710,7 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf
t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time,
t1.store_id, t1.deleted_at bind_deleted_at, t1.stock,
t2.*, t2.id sku_id, t2m.vendor_thing_id vendor_sku_id,
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, t3.category_id name_category_id,t3.tiktok_attribute,
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, t3.category_id name_category_id,t3.tiktok_attribute,t3.upc_brand_name,t3.upc_tiktok_brand_id,
IF(t11.%s <> '', t11.%s, t3.img) img,
IF(t12.%s <> '', t12.%s, t3.img2) img2,
IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img,

View File

@@ -159,54 +159,40 @@ func (*SkuCategory) TableUnique() [][]string {
type SkuName struct {
ModelIDCULD
Prefix string `orm:"size(255)" json:"prefix"`
Name string `orm:"size(255)" json:"name"`
ExPrefix string `orm:"size(255)" json:"exPrefix"`
ExPrefixBegin *time.Time `orm:"null" json:"exPrefixBegin"`
ExPrefixEnd *time.Time `orm:"null" json:"exPrefixEnd"`
ExVendorID int `orm:"column(ex_vendor_id)" json:"exVendorID"`
BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` // todo此属性暂时没有使用且有问题应该是不同平台都有一个brandid
CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别
JdCategoryID int64 `orm:"column(jd_category_id)" json:"jdCategoryID"` // 这个是指对应的京东商品类别
IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部全国可见如果否的话可见性由SkuPlace决定
Unit string `orm:"size(8)" json:"unit"`
SpecQuality float32 `json:"-"` // 为份必然为500这个主要作用只是用于确保SkuName的唯一性
SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克这个主要作用只是用于确保SkuName的唯一性
Price int `json:"price"` // 单位为分标准价不为份的就为实际标准价为份的为每市斤价实际还要乘质量。todo 为份的确定必须有质量
Img string `orm:"size(512)" json:"img"`
Img2 string `orm:"size(512)" json:"img2"` // 第二张图片
Img3 string `orm:"size(512)" json:"img3"` //第三张图片
Img4 string `orm:"size(512)" json:"img4"` //第三张图片
Img5 string `orm:"size(512)" json:"img5"` //第三张图片
ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印
ImgMix string `orm:"size(512)" json:"imgMix"` //图片混合水印的图片
// ImgEbai string `orm:"size(255)" json:"imgEbai"` // 饿百图片地址
// ImgHashCode string `orm:"size(255);index" json:"img_hash_code"`
DescImg string `orm:"size(255)" json:"descImg"` // 商品详情图片描述
// DescImgEbai string `orm:"size(255)" json:"descImgEbai"` // 饿百的商品详情图片描述RTF
Upc *string `orm:"size(20)"`
Status int `orm:"default(1)" json:"status"` // skuname状态取值同sku.Status
IsSpu int8 `orm:"column(is_spu)" json:"isSpu"` // 用于指明是否SKUNAME当成SPU
// JdID int64 `orm:"column(jd_id);null;index" json:"jdID"`
// JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
// LinkID int `orm:"column(link_id);null;index" json:"linkID"`
YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀
JdsStockSwitch int8 `orm:"default(1)" json:"jdsStockSwitch"` //京东商城总库存
PreparationTime int `orm:"default(1)" json:"preparationTime"` //商品准备时长
BestSeller int `json:"bestSeller"` //畅销品 0不是 1是
Video string `json:"video"` //商品视频地址
VideoID string `orm:"column(video_id)" json:"videoID"` //商品视频美团ID
TiktokAttribute string `orm:"column(tiktok_attribute);size(1024)" json:"tiktokAttribute"` //抖音分类属性的存储
Prefix string `orm:"size(255)" json:"prefix"`
Name string `orm:"size(255)" json:"name"`
ExPrefix string `orm:"size(255)" json:"exPrefix"`
ExPrefixBegin *time.Time `orm:"null" json:"exPrefixBegin"`
ExPrefixEnd *time.Time `orm:"null" json:"exPrefixEnd"`
ExVendorID int `orm:"column(ex_vendor_id)" json:"exVendorID"`
BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` // todo此属性暂时没有使用且有问题应该是不同平台都有一个brandid
CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别
JdCategoryID int64 `orm:"column(jd_category_id)" json:"jdCategoryID"` // 这个是指对应的京东商品类别
IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部全国可见如果否的话可见性由SkuPlace决定
Unit string `orm:"size(8)" json:"unit"`
SpecQuality float32 `json:"-"` // 为份必然为500这个主要作用只是用于确保SkuName的唯一性
SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克这个主要作用只是用于确保SkuName的唯一性
Price int `json:"price"` // 单位为分标准价不为份的就为实际标准价为份的为每市斤价实际还要乘质量。todo 为份的确定必须有质量
Img string `orm:"size(512)" json:"img"`
Img2 string `orm:"size(512)" json:"img2"` // 第二张图片
Img3 string `orm:"size(512)" json:"img3"` //第三张图片
Img4 string `orm:"size(512)" json:"img4"` //第三张图片
Img5 string `orm:"size(512)" json:"img5"` //第三张图片
ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印
ImgMix string `orm:"size(512)" json:"imgMix"` //图片混合水印的图片
DescImg string `orm:"size(255)" json:"descImg"` // 商品详情图片描述
Upc *string `orm:"size(20)"` // 标品upc码
UpcBrandName string `orm:"column(upc_brand_name);size(16)" json:"upcBrandName"` // upc标品的品牌名称
UpcTiktokBrandId string `orm:"column(upc_tiktok_brand_id);size(16)" json:"upcTiktokBrandId"` // 根据upc码获取到的抖音品牌id
Status int `orm:"default(1)" json:"status"` // skuname状态取值同sku.Status
IsSpu int8 `orm:"column(is_spu)" json:"isSpu"` // 用于指明是否SKUNAME当成SPU
YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀
JdsStockSwitch int8 `orm:"default(1)" json:"jdsStockSwitch"` //京东商城总库存
PreparationTime int `orm:"default(1)" json:"preparationTime"` //商品准备时长
BestSeller int `json:"bestSeller"` //畅销品 0不是 1是
Video string `json:"video"` //商品视频地址
VideoID string `orm:"column(video_id)" json:"videoID"` //商品视频美团ID
TiktokAttribute string `orm:"column(tiktok_attribute);size(1024)" json:"tiktokAttribute"` //抖音分类属性的存储
}
func (*SkuName) TableUnique() [][]string {

View File

@@ -157,11 +157,35 @@ func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID in
SecondaryCategoryName: subCatName,
Sequence: storeCat.Seq,
}
err = getAPI(storeCat.VendorOrgCode, storeID, vendorStoreID).RetailCatUpdate(vendorStoreID, catName, param4Update)
api := getAPI(storeCat.VendorOrgCode, storeID, vendorStoreID)
err = api.RetailCatUpdate(vendorStoreID, catName, param4Update)
if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 && p.IsErrCategoryNotExist(err) && originName != "" { // 修改分类名,但分类不存在
storeCat.CatSyncStatus |= model.SyncFlagNewMask
err = p.CreateStoreCategory(ctx, storeID, vendorStoreID, storeCat)
}
if err != nil && strings.Contains(err.Error(), "门店内存在重复的分类:") {
globals.SugarLogger.Debugf("==========err %s", err.Error())
storeCategoryList, err2 := api.RetailCatList(vendorStoreID)
globals.SugarLogger.Debugf("==========err2 %v", err2)
globals.SugarLogger.Debugf("==========err %s", utils.Format4Output(storeCategoryList, false))
if err2 != nil {
err = err2
} else {
for _, v := range storeCategoryList {
globals.SugarLogger.Debugf("storeCategoryList==========err %s", err.Error())
if len(v.Children) > 0 {
for _, c := range v.Children {
if strings.Contains(c.Name, err.Error()) {
api.RetailCatDelete(vendorStoreID, "", c.Name)
}
}
}
if strings.Contains(v.Name, err.Error()) {
api.RetailCatDelete(vendorStoreID, "", v.Name)
}
}
}
}
}
if err == nil {
// storeCat.VendorCatID = utils.FilterEmoji(storeCat.Name)

View File

@@ -311,7 +311,7 @@ func (c *PurchaseHandler) onOrderMsg(msgId, orderId string, msg interface{}) (re
if err := partner.CurOrderManager.OnOrderNew(order, status); err != nil {
return tiktokShop.Err2CallbackResponse(err, "")
}
orderMap, err := c.getOrderMap("", orderId, "")
orderMap, err := c.getOrderMap(utils.Int64ToStr(appOrgCode), orderId, "")
utils.CallFuncAsync(func() {
switch msgId {
case tiktokShop.CallbackPayOrderMsgTagId:

View File

@@ -4,6 +4,7 @@ import (
"encoding/json"
"errors"
"fmt"
"git.rosy.net.cn/baseapi/platformapi/jdapi"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
freightTemplate_create_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/freightTemplate_create/request"
product_addV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_addV2/request"
@@ -26,6 +27,7 @@ import (
"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/apimanager"
"math/rand"
"strings"
"time"
@@ -247,7 +249,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
updateParam.Pic = param.Pic
updateParam.Description = param.Description
updateParam.WeightUnit = tiktokShop.WeightUint_G
updateParam.StandardBrandId = param.StandardBrandId // 默认品牌京西菜市
updateParam.StandardBrandId, err = getTiktokBrandId(api, db, storeSku.Upc, storeSku.UpcBrandName, storeSku.UpcTiktokBrandId, updateParam.CategoryLeafId)
updateParam.ProductId = mainOrderDetail.ProductId
updateParam.MainProductId = mainProductId
updateParam.SpecPrices = param.SpecPrices
@@ -462,7 +465,13 @@ func makeMainProductSku(db *dao.DaoDB, api *tiktokShop.API, storeSku *dao.StoreS
return
}
}
param.StandardBrandId = 596120136 // 默认品牌京西菜市 596120136
param.StandardBrandId, err = getTiktokBrandId(api, db, storeSku.Upc, storeSku.UpcBrandName, storeSku.UpcTiktokBrandId, param.CategoryLeafId)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
return
}
param.FreightId, param.SaleLimitId, err = getFreightIdAndSaleLimitId(api, db, storeDetail, vendorStoreID)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
@@ -471,6 +480,49 @@ func makeMainProductSku(db *dao.DaoDB, api *tiktokShop.API, storeSku *dao.StoreS
return
}
func getTiktokBrandId(api *tiktokShop.API, db *dao.DaoDB, upc, upcBrandName, upcTiktokBrandId string, categoryLeafId int64) (int64, error) {
if upc == "" { // 默认品牌京西菜市 596120136
return 596120136, nil
} else if upc != "" && upcBrandName != "" && upcTiktokBrandId != "" {
return utils.Str2Int64(upcTiktokBrandId), nil
} else if upc != "" && upcBrandName != "" && upcTiktokBrandId == "" {
standardBrandId, err := api.GetSkuBrand(categoryLeafId, upcBrandName)
if err != nil {
return 0, err
}
dao.UpdateSkuNameTiktokBrandName(db, upc, upcBrandName, utils.Int64ToStr(standardBrandId))
return standardBrandId, nil
} else if upc != "" && upcBrandName == "" && upcTiktokBrandId == "" {
brandName, err := getBrandByBrandName(upc)
if err != nil {
return 0, err
}
standardBrandId, err := api.GetSkuBrand(categoryLeafId, brandName)
if err != nil {
return 0, err
}
dao.UpdateSkuNameTiktokBrandName(db, upc, brandName, utils.Int64ToStr(standardBrandId))
return standardBrandId, nil
}
return 0, errors.New("getTiktokBrandId 获取抖音品牌id异常")
}
func getBrandByBrandName(upcCode string) (string, error) {
apijd := apimanager.CurAPIManager.GetAPI(model.VendorIDJD, "320406").(*jdapi.API)
result, err := apijd.GetJdUpcCodeByName("", upcCode, 1, 5)
if err != nil {
return "", err
}
if len(result) != model.YES {
return "", fmt.Errorf("upc码[%s],获取商品不唯一", upcCode)
}
if result[0].BrandName != "" {
return result[0].BrandName, nil
}
return strings.Split(result[0].OriginalName, " ")[0], nil
}
func loadMainProductId(api *tiktokShop.API, storeSku *dao.StoreSkuSyncInfo, mainProductId string) *product_detail_response.ProductDetailData {
// 这有可能获取的值主商品也有可能是子商品,我们需要的是主商品id和状态
mainOrderDetailProductId, err := api.GetSkuDetail(mainProductId, "")