- sync.
This commit is contained in:
@@ -3,46 +3,75 @@ package cms
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler/basesch"
|
||||
"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/globals"
|
||||
)
|
||||
|
||||
type VendorSync struct {
|
||||
}
|
||||
|
||||
var (
|
||||
MultiStoresVendorHandlers []partner.IMultipleStoresHandler
|
||||
SingleStoreVendorIDs []int
|
||||
)
|
||||
|
||||
var (
|
||||
ErrHaveNotImplementedYet = errors.New("还没有实现")
|
||||
ErrEntityNotExist = errors.New("找不到相应实体")
|
||||
)
|
||||
|
||||
func Init() {
|
||||
for k, v := range basesch.FixedBaseScheduler.PurchasePlatformHandlers {
|
||||
if multiHandler, ok := v.(partner.IMultipleStoresHandler); ok {
|
||||
MultiStoresVendorHandlers = append(MultiStoresVendorHandlers, multiHandler)
|
||||
} else if _, ok := v.(partner.ISingleStoreHandler); ok {
|
||||
SingleStoreVendorIDs = append(SingleStoreVendorIDs, k)
|
||||
} else {
|
||||
panic("delivery platform type is wrong!")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (v *VendorSync) SyncCategory(db *dao.DaoDB, categoryID int, isForce bool, userName string) (err error) {
|
||||
if db == nil {
|
||||
db = dao.GetDB()
|
||||
}
|
||||
var cats []*model.SkuCategory
|
||||
cond := make(map[string]interface{})
|
||||
if categoryID > 0 {
|
||||
cond[model.FieldID] = categoryID
|
||||
}
|
||||
if err = dao.GetEntities(db, &cats, cond, true); err == nil {
|
||||
for _, cat := range cats {
|
||||
if (cat.JdSyncStatus & model.SyncFlagDeletedMask) != 0 { //删除
|
||||
err = GetPurchaseHandler(model.VendorIDJD).DeleteCategory(cat, userName)
|
||||
} else if (cat.JdSyncStatus&model.SyncFlagNewMask) != 0 || isForce { // 新增
|
||||
err = GetPurchaseHandler(model.VendorIDJD).CreateCategory(cat, userName)
|
||||
} else if (cat.JdSyncStatus & model.SyncFlagModifiedMask) != 0 { // 修改
|
||||
err = GetPurchaseHandler(model.VendorIDJD).UpdateCategory(cat, userName)
|
||||
}
|
||||
if err == nil {
|
||||
cat.JdSyncStatus = 0
|
||||
_, err = dao.UpdateEntity(db, cat, model.FieldJdSyncStatus)
|
||||
}
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
// v.LoopSingleStoreVendors(db, "SyncCategory", userName, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
// storeMap := batchItemList[0].(*model.StoreMap)
|
||||
// handler := GetPurchaseHandler(storeMap.VendorID).(partner.ISingleStoreHandler)
|
||||
// return nil, nil
|
||||
// })
|
||||
|
||||
err = v.LoopMultiStoresVendors(db, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
multiStoresHandler := batchItemList[0].(partner.IMultipleStoresHandler)
|
||||
var cats []*model.SkuCategory
|
||||
cond := make(map[string]interface{})
|
||||
if categoryID > 0 {
|
||||
cond[model.FieldID] = categoryID
|
||||
}
|
||||
}
|
||||
if err = dao.GetEntities(db, &cats, cond, true); err == nil {
|
||||
tasksch.RunTask("", func(batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
cat := batchItemList[0].(*model.SkuCategory)
|
||||
if (cat.JdSyncStatus & model.SyncFlagDeletedMask) != 0 { //删除
|
||||
err = multiStoresHandler.DeleteCategory(cat, userName)
|
||||
} else if (cat.JdSyncStatus&model.SyncFlagNewMask) != 0 || isForce { // 新增
|
||||
err = multiStoresHandler.CreateCategory(cat, userName)
|
||||
} else if (cat.JdSyncStatus & model.SyncFlagModifiedMask) != 0 { // 修改
|
||||
err = multiStoresHandler.UpdateCategory(cat, userName)
|
||||
}
|
||||
if err == nil {
|
||||
cat.JdSyncStatus = 0
|
||||
_, err = dao.UpdateEntity(db, cat, model.FieldJdSyncStatus)
|
||||
}
|
||||
return nil, err
|
||||
}, nil, len(cats), 1, "", cats)
|
||||
}
|
||||
return nil, err
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -50,17 +79,18 @@ func (v *VendorSync) SyncStore(db *dao.DaoDB, vendorID int, store *model.Store,
|
||||
if db == nil {
|
||||
db = dao.GetDB()
|
||||
}
|
||||
storeMapList, err := v.GetStoreMapInfo(db, store.ID)
|
||||
if err == nil {
|
||||
for _, storeMap := range storeMapList {
|
||||
if (vendorID == -1 || vendorID == storeMap.VendorID) && (isForce || storeMap.SyncStatus != 0) { // 对于门店,当前只有修改标记
|
||||
if err = GetPurchaseHandler(storeMap.VendorID).UpdateStore(store.ID); err == nil {
|
||||
err = v.LoopStoreMap(db, store.ID, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
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 {
|
||||
storeMap.SyncStatus = 0
|
||||
dao.UpdateEntity(db, storeMap, model.FieldSyncStatus)
|
||||
_, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil, err
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -68,60 +98,81 @@ func (v *VendorSync) SyncSku(db *dao.DaoDB, nameID, skuID int, isForce bool, use
|
||||
if db == nil {
|
||||
db = dao.GetDB()
|
||||
}
|
||||
var skuList []*model.Sku
|
||||
cond := make(map[string]interface{})
|
||||
if nameID != -1 {
|
||||
cond[model.FieldNameID] = nameID
|
||||
}
|
||||
if skuID != -1 {
|
||||
cond[model.FieldID] = skuID
|
||||
}
|
||||
if err = dao.GetEntities(db, &skuList, cond, true); err == nil {
|
||||
for _, sku := range skuList {
|
||||
if (skuID == -1 || skuID == sku.ID) && (isForce || sku.JdSyncStatus != 0) {
|
||||
updateFields := []string{model.FieldJdSyncStatus}
|
||||
if sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除
|
||||
err = GetPurchaseHandler(model.VendorIDJD).CreateSku(sku, userName)
|
||||
updateFields = append(updateFields, model.FieldJdID)
|
||||
} else if sku.JdSyncStatus&model.SyncFlagNewMask != 0 { // 新增
|
||||
err = GetPurchaseHandler(model.VendorIDJD).DeleteSku(sku, userName)
|
||||
} else if sku.JdSyncStatus&model.SyncFlagModifiedMask != 0 { // 修改
|
||||
err = GetPurchaseHandler(model.VendorIDJD).UpdateSku(sku, userName)
|
||||
}
|
||||
if err == nil {
|
||||
sku.JdSyncStatus = 0
|
||||
dao.UpdateEntity(db, sku, updateFields...)
|
||||
}
|
||||
}
|
||||
// v.LoopSingleStoreVendors(db, "SyncSku", userName, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
// storeMap := batchItemList[0].(*model.StoreMap)
|
||||
// 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{})
|
||||
if nameID != -1 {
|
||||
cond[model.FieldNameID] = nameID
|
||||
}
|
||||
}
|
||||
if skuID != -1 {
|
||||
cond[model.FieldID] = skuID
|
||||
}
|
||||
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 { // 删除
|
||||
err = multiStoresHandler.CreateSku(sku, userName)
|
||||
updateFields = append(updateFields, model.FieldJdID)
|
||||
} else if sku.JdSyncStatus&model.SyncFlagNewMask != 0 { // 新增
|
||||
err = multiStoresHandler.DeleteSku(sku, userName)
|
||||
} else if sku.JdSyncStatus&model.SyncFlagModifiedMask != 0 { // 修改
|
||||
err = multiStoresHandler.UpdateSku(sku, userName)
|
||||
}
|
||||
if err == nil {
|
||||
sku.JdSyncStatus = 0
|
||||
dao.UpdateEntity(db, sku, updateFields...)
|
||||
}
|
||||
}
|
||||
return nil, err
|
||||
}, nil, len(skuList), 1, "", skuList)
|
||||
}
|
||||
return nil, err
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
func (v *VendorSync) SyncStoreSku(db *dao.DaoDB, storeID int, skuIDs []int, isForce bool, userName string) (err error) {
|
||||
storeMapList, err := v.GetStoreMapInfo(db, storeID)
|
||||
var skuNamesInfo *StoreSkuNamesInfo
|
||||
if skuNamesInfo, err = GetStoreSkus(storeID, "", utils.Params2Map("skuID", skuIDs), 0, 10000); err == nil {
|
||||
if skuNamesInfo.TotalCount != len(skuNamesInfo.SkuNames) {
|
||||
panic("too many skus!")
|
||||
}
|
||||
for _, storeMap := range storeMapList {
|
||||
switch storeMap.VendorID {
|
||||
case model.VendorIDJD:
|
||||
err = v.SyncStoreSku2JD(db, skuNamesInfo.SkuNames, isForce, userName)
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (v *VendorSync) LoopStoreMap(db *dao.DaoDB, storeID int, handler tasksch.WorkFunc) (err error) {
|
||||
storeMaps, err := GetStoreVendorMaps(db, storeID, -1)
|
||||
if err == nil {
|
||||
task := tasksch.RunTask("", handler, nil, len(storeMaps), 1, "", storeMaps)
|
||||
_, err = task.GetResult(0)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (v *VendorSync) SyncStoreSku2JD(db *dao.DaoDB, skuInfoList []*StoreSkuNameExt, isForce bool, userName string) (err error) {
|
||||
// for _, skuInfo := range skuInfoList {
|
||||
|
||||
// }
|
||||
func (v *VendorSync) LoopMultiStoresVendors(db *dao.DaoDB, handler tasksch.WorkFunc) (err error) {
|
||||
task := tasksch.RunTask("", handler, nil, len(MultiStoresVendorHandlers), 1, "", MultiStoresVendorHandlers)
|
||||
_, err = task.GetResult(0)
|
||||
return err
|
||||
}
|
||||
|
||||
func (v *VendorSync) GetStoreMapInfo(db *dao.DaoDB, storeID int) (storeMapList []*model.StoreMap, err error) {
|
||||
return storeMapList, dao.GetEntities(db, &storeMapList, utils.Params2Map(model.FieldStoreID, storeID), true)
|
||||
func (v *VendorSync) LoopSingleStoreVendors(db *dao.DaoDB, taskName, userName string, handler tasksch.WorkFunc) (err error) {
|
||||
var storeMaps []*model.StoreMap
|
||||
if err = dao.GetRows(db, &storeMaps, `
|
||||
SELECT *
|
||||
FROM store_map
|
||||
WHERE vendor_id IN (`+dao.GenQuestionMarks(len(SingleStoreVendorIDs))+")", SingleStoreVendorIDs); err == nil {
|
||||
parellelCount := len(storeMaps)
|
||||
if parellelCount > 20 {
|
||||
parellelCount = 20
|
||||
}
|
||||
tasksch.RunManagedTask(taskName, handler, nil, parellelCount, 1, userName, storeMaps)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user