diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 334b9bfde..8b03dd1e3 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -227,13 +227,16 @@ func UpdateStoreSku(storeID int, skuBinds []*StoreSkuBindInfo, userName string) if ok { if v.IsFocus == -1 { _, err = dao.DeleteEntityLogically(db, skuBind, nil, userName, map[string]interface{}{ + model.FieldStatus: model.StoreSkuBindStatusDeleted, model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldElmSyncStatus: model.SyncFlagDeletedMask, model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, }) } else { // todo 如果修改ebai与elm ID怎么处理呢? - skuBind.DeletedAt = utils.DefaultTimeValue + if v.IsFocus == 1 { + skuBind.DeletedAt = utils.DefaultTimeValue + } skuBind.JdSyncStatus |= model.SyncFlagModifiedMask skuBind.ElmSyncStatus |= model.SyncFlagModifiedMask skuBind.EbaiSyncStatus |= model.SyncFlagModifiedMask diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index c991ffea3..5c677241d 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -83,7 +83,7 @@ func (v *VendorSync) SyncStore(db *dao.DaoDB, vendorID int, store *model.Store, storeMap := batchItemList[0].(*model.StoreMap) if (vendorID == -1 || vendorID == storeMap.VendorID) && (isForce || storeMap.SyncStatus != 0) { if handler := GetPurchaseHandler(storeMap.VendorID); handler != nil { - if err = handler.UpdateStore(store.ID); err == nil { + if err = handler.UpdateStore(store.ID, userName); err == nil { storeMap.SyncStatus = 0 _, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus) } @@ -103,9 +103,7 @@ func (v *VendorSync) SyncSku(db *dao.DaoDB, nameID, skuID int, isForce bool, use // handler := GetPurchaseHandler(storeMap.VendorID).(partner.ISingleStoreHandler) // return nil, nil // }) - globals.SugarLogger.Debug("SyncSku1") err = v.LoopMultiStoresVendors(db, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) { - globals.SugarLogger.Debug("SyncSku2") multiStoresHandler := batchItemList[0].(partner.IMultipleStoresHandler) var skuList []*model.Sku cond := make(map[string]interface{}) @@ -118,7 +116,6 @@ func (v *VendorSync) SyncSku(db *dao.DaoDB, nameID, skuID int, isForce bool, use if err = dao.GetEntities(db, &skuList, cond, true); err == nil { tasksch.RunTask("", func(batchItemList []interface{}, params ...interface{}) (interface{}, error) { sku := batchItemList[0].(*model.Sku) - globals.SugarLogger.Debug("fuck:", sku) if (skuID == -1 || skuID == sku.ID) && (isForce || sku.JdSyncStatus != 0) { updateFields := []string{model.FieldJdSyncStatus} if sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除 @@ -142,8 +139,19 @@ func (v *VendorSync) SyncSku(db *dao.DaoDB, nameID, skuID int, isForce bool, use return err } +// func (v *VendorSync) SyncStoreSku(db *dao.DaoDB, storeID int, skuIDs []int, isForce bool, userName string) (err error) { - + globals.SugarLogger.Debug("SyncStoreSku") + if db == nil { + db = dao.GetDB() + } + err = v.LoopStoreMap(db, storeID, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) { + storeMap := batchItemList[0].(*model.StoreMap) + if handler := GetPurchaseHandler(storeMap.VendorID); handler != nil { + err = handler.SyncStoreSku(storeID, skuIDs, isForce, userName) + } + return nil, err + }) return err } diff --git a/business/model/model.go b/business/model/model.go index e5add03d8..6a2aee5fd 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -46,6 +46,7 @@ const ( SyncFlagModifiedMask = 1 SyncFlagNewMask = 2 SyncFlagDeletedMask = 4 + SyncFlagChangedMask = SyncFlagModifiedMask | SyncFlagNewMask | SyncFlagDeletedMask SyncFlagSaleMask = 5 SyncFlagPriceMask = 6 diff --git a/business/partner/partner.go b/business/partner/partner.go index a9251ed97..fd858cd53 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -63,12 +63,12 @@ type IPurchasePlatformHandler interface { //////// // Store ReadStore(vendorStoreID string) (store *model.Store, err error) - UpdateStore(storeID int) error + UpdateStore(storeID int, userName string) error // EnableAutoAcceptOrder(vendorStoreID string, isEnabled bool) error // OpenStore(vendorStoreID string, userName string) error // CloseStore(vendorStoreID, closeNotice, userName string) error - SyncStoreSku(storeID int, skuIDs []int) (err error) + SyncStoreSku(storeID int, skuIDs []int, isForce bool, userName string) (err error) } type IMultipleStoresHandler interface { diff --git a/business/partner/purchase/elm/store.go b/business/partner/purchase/elm/store.go index e25579695..12681439f 100644 --- a/business/partner/purchase/elm/store.go +++ b/business/partner/purchase/elm/store.go @@ -6,7 +6,7 @@ func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) return nil, nil } -func (p *PurchaseHandler) UpdateStore(storeID int) error { +func (p *PurchaseHandler) UpdateStore(storeID int, userName string) error { return nil } diff --git a/business/partner/purchase/elm/store_sku.go b/business/partner/purchase/elm/store_sku.go index 983193a62..0e22e5b81 100644 --- a/business/partner/purchase/elm/store_sku.go +++ b/business/partner/purchase/elm/store_sku.go @@ -2,9 +2,6 @@ package elm import "git.rosy.net.cn/jx-callback/business/model" -func (p *PurchaseHandler) SyncStoreSku(storeID int, skuIDs []int) (err error) { - return nil -} func (p *PurchaseHandler) SyncCategories(catIDs []int) (err error) { return nil } @@ -18,3 +15,7 @@ func (p *PurchaseHandler) SyncSkus(skuIDs []int) (err error) { func (p *PurchaseHandler) ReadStoreSku(storeID, skuID int) (skuNameExt *model.SkuNameExt, err error) { return nil, nil } + +func (p *PurchaseHandler) SyncStoreSku(storeID int, skuIDs []int, isForce bool, userName string) (err error) { + return nil +} diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index df2fbf6e5..8994a9d28 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -72,7 +72,7 @@ func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) } // stoerIDs为nil表示所有 -func (p *PurchaseHandler) UpdateStore(storeID int) (err error) { +func (p *PurchaseHandler) UpdateStore(storeID int, userName string) (err error) { db := dao.GetDB() var store tJdStoreInfo sql := ` diff --git a/business/partner/purchase/jd/store_sku.go b/business/partner/purchase/jd/store_sku.go index 6e0ff4098..be2194cbe 100644 --- a/business/partner/purchase/jd/store_sku.go +++ b/business/partner/purchase/jd/store_sku.go @@ -1,5 +1,94 @@ package jd -func (p *PurchaseHandler) SyncStoreSku(storeID int, skuIDs []int) (err error) { - return nil +import ( + "git.rosy.net.cn/baseapi/platformapi/jdapi" + "git.rosy.net.cn/baseapi/utils" + "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/globals" + "git.rosy.net.cn/jx-callback/globals/api" +) + +// 京东到家,以有库存表示关注(认领) +func (p *PurchaseHandler) SyncStoreSku(storeID int, skuIDs []int, isForce bool, userName string) (err error) { + db := dao.GetDB() + var storeSkus []*model.StoreSkuBind + sqlParams := []interface{}{ + storeID, + } + sql := ` + SELECT * + FROM store_sku_bind + WHERE store_id = ? + ` + if skuIDs != nil { + sql += " AND sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + globals.SugarLogger.Debug(sql) + if err = dao.GetRows(db, &storeSkus, sql, sqlParams); err == nil { + outStationNo := utils.Int2Str(storeID) + task := tasksch.RunTask("", func(batchItemList []interface{}, params ...interface{}) (interface{}, error) { + var skuPriceInfoList []*jdapi.SkuPriceInfo + var skuVendibilityList []*jdapi.StockVendibility + var skuStockList []*jdapi.SkuStock + + for _, v := range batchItemList { + storeSku := v.(*model.StoreSkuBind) + if storeSku.JdSyncStatus&model.SyncFlagChangedMask != 0 { + if storeSku.JdSyncStatus&model.SyncFlagPriceMask != 0 || isForce { + skuPriceInfoList = append(skuPriceInfoList, &jdapi.SkuPriceInfo{ + OutSkuId: utils.Int2Str(storeSku.SkuID), + Price: storeSku.Price, + }) + } + if storeSku.JdSyncStatus&model.SyncFlagSaleMask != 0 || isForce { + vendibility := &jdapi.StockVendibility{ + OutSkuId: utils.Int2Str(storeSku.SkuID), + DoSale: true, + } + if storeSku.Status != model.StoreSkuBindStatusNormal { + vendibility.DoSale = false + } + skuVendibilityList = append(skuVendibilityList, vendibility) + } + if storeSku.JdSyncStatus&(model.SyncFlagDeletedMask|model.SyncFlagNewMask) != 0 || isForce { // 关注或取消关注 + stock := &jdapi.SkuStock{ + OutSkuId: utils.Int2Str(storeSku.SkuID), + StockQty: 9999, + } + if storeSku.Status == model.StoreSkuBindStatusDeleted { + stock.StockQty = 0 + } + } + } + } + if globals.EnableStoreWrite { + // todo 以下可以优化为并行操作 + if len(skuVendibilityList) > 0 { + _, err = api.JdAPI.BatchUpdateVendibility(outStationNo, "", skuVendibilityList, userName) + } + if err == nil && len(skuPriceInfoList) > 0 { + _, err = api.JdAPI.UpdateVendorStationPrice(outStationNo, "", skuPriceInfoList) + } + if err == nil && len(skuStockList) > 0 { + _, err = api.JdAPI.BatchUpdateCurrentQtys(outStationNo, "", skuStockList, userName) + } + } + return nil, err + }, nil, 10, 50, userName, storeSkus) + if _, err = task.GetResult(0); err == nil { + sql := ` + UPDATE store_sku_bind + SET jd_sync_status = 0 + WHERE store_id = ? + ` + if skuIDs != nil { + sql += " AND sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" + } + _, err = dao.ExecuteSQL(db, sql, sqlParams) + } + } + return err }