- refactor jxcontent and tasksch (remove dependency from jxcontent to tasksch)
- send dingding msg to user when async task finished
This commit is contained in:
@@ -24,47 +24,48 @@ const (
|
||||
)
|
||||
|
||||
func (p *PurchaseHandler) SyncStoreCategory(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, isAsync bool) (hint string, err error) {
|
||||
userName := ctx.GetUserName()
|
||||
strStoreID := utils.Int2Str(storeID)
|
||||
num := 0
|
||||
db := dao.GetDB()
|
||||
rootTask := tasksch.NewSeqTask("微盟微商城SyncStoreCategory step1", userName, func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
level := step + 1
|
||||
catList, err := dao.GetStoreCategories(db, model.VendorIDWSC, storeID, level)
|
||||
// globals.SugarLogger.Debug(utils.Format4Output(catList, false))
|
||||
if len(catList) > 0 {
|
||||
num += len(catList)
|
||||
task := tasksch.NewParallelTask(fmt.Sprintf("微盟微商城SyncStoreCategory step2, level=%d", level), nil, userName, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[model.VendorIDWSC])}
|
||||
catInfo := batchItemList[0].(*dao.StoreCatSyncInfo)
|
||||
if globals.EnableStoreWrite && globals.EnableWscStoreWrite {
|
||||
if catInfo.WscSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除
|
||||
globals.SugarLogger.Debugf("UpdateClassify strStoreID:%s, WscID:%d", strStoreID, catInfo.WscID)
|
||||
err = api.WeimobAPI.UpdateClassify(catInfo.WscID, composeFakeDelName(catInfo.CatName), "")
|
||||
} else if catInfo.WscSyncStatus&(model.SyncFlagNewMask|model.SyncFlagModifiedMask) != 0 { // 新增
|
||||
catImg := ""
|
||||
if level == 2 {
|
||||
catImg = DefCatImg
|
||||
rootTask := tasksch.NewSeqTask("微盟微商城SyncStoreCategory step1", ctx,
|
||||
func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
level := step + 1
|
||||
catList, err := dao.GetStoreCategories(db, model.VendorIDWSC, storeID, level)
|
||||
// globals.SugarLogger.Debug(utils.Format4Output(catList, false))
|
||||
if len(catList) > 0 {
|
||||
num += len(catList)
|
||||
task := tasksch.NewParallelTask(fmt.Sprintf("微盟微商城SyncStoreCategory step2, level=%d", level), nil, ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[model.VendorIDWSC])}
|
||||
catInfo := batchItemList[0].(*dao.StoreCatSyncInfo)
|
||||
if globals.EnableStoreWrite && globals.EnableWscStoreWrite {
|
||||
if catInfo.WscSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除
|
||||
globals.SugarLogger.Debugf("UpdateClassify strStoreID:%s, WscID:%d", strStoreID, catInfo.WscID)
|
||||
err = api.WeimobAPI.UpdateClassify(catInfo.WscID, composeFakeDelName(catInfo.CatName), "")
|
||||
} else if catInfo.WscSyncStatus&(model.SyncFlagNewMask|model.SyncFlagModifiedMask) != 0 { // 新增
|
||||
catImg := ""
|
||||
if level == 2 {
|
||||
catImg = DefCatImg
|
||||
}
|
||||
if catInfo.WscID, err = api.WeimobAPI.AddClassify(catInfo.CatName, utils.Str2Int64WithDefault(catInfo.ParentVendorCatID, 0), catImg); err == nil {
|
||||
updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[model.VendorIDWSC]))
|
||||
}
|
||||
} else if catInfo.WscSyncStatus&(model.SyncFlagModifiedMask|model.SyncFlagModifiedMask) != 0 { // 修改
|
||||
err = api.WeimobAPI.UpdateClassify(catInfo.WscID, catInfo.CatName, "")
|
||||
}
|
||||
}
|
||||
if catInfo.WscID, err = api.WeimobAPI.AddClassify(catInfo.CatName, utils.Str2Int64WithDefault(catInfo.ParentVendorCatID, 0), catImg); err == nil {
|
||||
updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[model.VendorIDWSC]))
|
||||
if err == nil {
|
||||
db2 := dao.GetDB()
|
||||
catInfo.WscSyncStatus = 0
|
||||
_, err = dao.UpdateEntity(db2, &catInfo.StoreSkuCategoryMap, updateFields...)
|
||||
}
|
||||
} else if catInfo.WscSyncStatus&(model.SyncFlagModifiedMask|model.SyncFlagModifiedMask) != 0 { // 修改
|
||||
err = api.WeimobAPI.UpdateClassify(catInfo.WscID, catInfo.CatName, "")
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
db2 := dao.GetDB()
|
||||
catInfo.WscSyncStatus = 0
|
||||
_, err = dao.UpdateEntity(db2, &catInfo.StoreSkuCategoryMap, updateFields...)
|
||||
}
|
||||
return nil, err
|
||||
}, catList)
|
||||
rootTask.AddChild(task).Run()
|
||||
_, err = task.GetResult(0)
|
||||
}
|
||||
return nil, err
|
||||
}, 2)
|
||||
return nil, err
|
||||
}, catList)
|
||||
rootTask.AddChild(task).Run()
|
||||
_, err = task.GetResult(0)
|
||||
}
|
||||
return nil, err
|
||||
}, 2)
|
||||
tasksch.AddChild(parentTask, rootTask).Run()
|
||||
if !isAsync {
|
||||
hint = utils.Int2Str(num)
|
||||
@@ -170,80 +171,81 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks
|
||||
return "", err
|
||||
}
|
||||
globals.SugarLogger.Debug(utils.Format4Output(skus, false))
|
||||
rootTask := tasksch.NewParallelTask("微盟微商城SyncStoreSkus", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx.GetUserName(), func(rootTask *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
v := batchItemList[0]
|
||||
skuItem := v.(*dao.StoreSkuSyncInfo)
|
||||
updateFields := []string{model.FieldWscSyncStatus}
|
||||
storeSkuBind := &model.StoreSkuBind{}
|
||||
storeSkuBind.ID = skuItem.BindID
|
||||
if skuItem.SkuSyncStatus&model.SyncFlagDeletedMask != 0 {
|
||||
goodsID := utils.Str2Int64WithDefault(skuItem.VendorNameID, 0)
|
||||
if err = api.WeimobAPI.UpdateGoodsShelfStatus([]int64{goodsID}, false); err == nil {
|
||||
err = api.WeimobAPI.UpdateGoodsTitle(goodsID, composeFakeDelName(skuItem.Name))
|
||||
}
|
||||
} else if skuItem.SkuSyncStatus&(model.SyncFlagModifiedMask|model.SyncFlagNewMask) != 0 {
|
||||
outerGoodsCode := utils.Int2Str(skuItem.NameID)
|
||||
title := jxutils.ComposeSkuName(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 30)
|
||||
isPutAway := jxutils.MergeSkuStatus(skuItem.Status, skuItem.StoreSkuStatus) == model.SkuStatusNormal
|
||||
categoryId := skuItem.VendorVendorCatID
|
||||
if categoryId == 0 {
|
||||
categoryId = DefVendorCategoryId
|
||||
}
|
||||
classifyIdList := []int64{utils.Str2Int64WithDefault(skuItem.VendorCatID, 0)}
|
||||
if skuItem.SkuVendorCatID != "" {
|
||||
if int64Value := utils.Str2Int64WithDefault(skuItem.SkuVendorCatID, 0); int64Value > 0 {
|
||||
classifyIdList = append(classifyIdList, int64Value)
|
||||
rootTask := tasksch.NewParallelTask("微盟微商城SyncStoreSkus", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(rootTask *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
v := batchItemList[0]
|
||||
skuItem := v.(*dao.StoreSkuSyncInfo)
|
||||
updateFields := []string{model.FieldWscSyncStatus}
|
||||
storeSkuBind := &model.StoreSkuBind{}
|
||||
storeSkuBind.ID = skuItem.BindID
|
||||
if skuItem.SkuSyncStatus&model.SyncFlagDeletedMask != 0 {
|
||||
goodsID := utils.Str2Int64WithDefault(skuItem.VendorNameID, 0)
|
||||
if err = api.WeimobAPI.UpdateGoodsShelfStatus([]int64{goodsID}, false); err == nil {
|
||||
err = api.WeimobAPI.UpdateGoodsTitle(goodsID, composeFakeDelName(skuItem.Name))
|
||||
}
|
||||
}
|
||||
b2cGoods := &weimobapi.PendingSaveB2CGoodsVo{
|
||||
FreightTemplateId: DefFreightTemplateId,
|
||||
DeliveryTypeIdList: []int64{DefDeliveryTypeId},
|
||||
B2cGoodsType: weimobapi.GoodsTypeNormal,
|
||||
}
|
||||
salePrice := int64(jxutils.CaculateSkuVendorPrice(int(skuItem.Price), int(storeDetail.PricePercentage)))
|
||||
skuList := []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
weimobapi.KeyOuterSkuCode: utils.Int2Str(skuItem.ID),
|
||||
weimobapi.KeyImageURL: skuItem.Img,
|
||||
weimobapi.KeySalePrice: jxutils.IntPrice2Standard(salePrice),
|
||||
weimobapi.KeyCostPrice: jxutils.IntPrice2Standard(salePrice * 8 / 10),
|
||||
weimobapi.KeyOriginalPrice: jxutils.IntPrice2Standard(salePrice * 10 / (6 + rand.Int63n(4))),
|
||||
weimobapi.KeyEditStockNum: model.MaxStoreSkuStockQty,
|
||||
weimobapi.KeyB2cSku: &weimobapi.PendingSaveB2CSkuVo{
|
||||
Weight: jxutils.IntWeight2Float(skuItem.Weight),
|
||||
} else if skuItem.SkuSyncStatus&(model.SyncFlagModifiedMask|model.SyncFlagNewMask) != 0 {
|
||||
outerGoodsCode := utils.Int2Str(skuItem.NameID)
|
||||
title := jxutils.ComposeSkuName(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 30)
|
||||
isPutAway := jxutils.MergeSkuStatus(skuItem.Status, skuItem.StoreSkuStatus) == model.SkuStatusNormal
|
||||
categoryId := skuItem.VendorVendorCatID
|
||||
if categoryId == 0 {
|
||||
categoryId = DefVendorCategoryId
|
||||
}
|
||||
classifyIdList := []int64{utils.Str2Int64WithDefault(skuItem.VendorCatID, 0)}
|
||||
if skuItem.SkuVendorCatID != "" {
|
||||
if int64Value := utils.Str2Int64WithDefault(skuItem.SkuVendorCatID, 0); int64Value > 0 {
|
||||
classifyIdList = append(classifyIdList, int64Value)
|
||||
}
|
||||
}
|
||||
b2cGoods := &weimobapi.PendingSaveB2CGoodsVo{
|
||||
FreightTemplateId: DefFreightTemplateId,
|
||||
DeliveryTypeIdList: []int64{DefDeliveryTypeId},
|
||||
B2cGoodsType: weimobapi.GoodsTypeNormal,
|
||||
}
|
||||
salePrice := int64(jxutils.CaculateSkuVendorPrice(int(skuItem.Price), int(storeDetail.PricePercentage)))
|
||||
skuList := []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
weimobapi.KeyOuterSkuCode: utils.Int2Str(skuItem.ID),
|
||||
weimobapi.KeyImageURL: skuItem.Img,
|
||||
weimobapi.KeySalePrice: jxutils.IntPrice2Standard(salePrice),
|
||||
weimobapi.KeyCostPrice: jxutils.IntPrice2Standard(salePrice * 8 / 10),
|
||||
weimobapi.KeyOriginalPrice: jxutils.IntPrice2Standard(salePrice * 10 / (6 + rand.Int63n(4))),
|
||||
weimobapi.KeyEditStockNum: model.MaxStoreSkuStockQty,
|
||||
weimobapi.KeyB2cSku: &weimobapi.PendingSaveB2CSkuVo{
|
||||
Weight: jxutils.IntWeight2Float(skuItem.Weight),
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
if globals.EnableStoreWrite && globals.EnableWscStoreWrite {
|
||||
if skuItem.SkuSyncStatus&model.SyncFlagNewMask != 0 {
|
||||
goodsID, skuMap, err2 := api.WeimobAPI.AddGoods(outerGoodsCode, title, false, []string{skuItem.Img}, skuItem.Comment, isPutAway, 0, categoryId, classifyIdList, b2cGoods, skuList, nil)
|
||||
if err = err2; err == nil {
|
||||
storeSkuBind.WscID = skuMap[utils.Int2Str(skuItem.ID)]
|
||||
storeSkuBind.WscID2 = goodsID
|
||||
updateFields = append(updateFields, model.FieldWscID, model.FieldWscID2)
|
||||
}
|
||||
} else {
|
||||
goodsID := utils.Str2Int64WithDefault(skuItem.VendorNameID, 0)
|
||||
|
||||
goodsInfo, err2 := api.WeimobAPI.QueryGoodsDetail(goodsID)
|
||||
if err = err2; err == nil {
|
||||
// http://open.weimob.com/docapi/article?tag=Af
|
||||
// sku id,如果为空,则新增sku; 如果更新之前的skuId与入参skuId对应,则更新sku; 如果更新之前的skuId没有和入参的skuId对应,删除更新之前的sku
|
||||
skuList[0][weimobapi.KeySkuID] = utils.Str2Int64WithDefault(skuItem.VendorSkuID, 0)
|
||||
remoteSkuList := goodsInfo[weimobapi.KeySkuList].([]interface{})
|
||||
if len(remoteSkuList) > 0 {
|
||||
skuList[0][weimobapi.KeyEditStockNum] = model.MaxStoreSkuStockQty - int(utils.MustInterface2Int64(remoteSkuList[0].(map[string]interface{})[weimobapi.KeyAvailableStockNum]))
|
||||
}
|
||||
if globals.EnableStoreWrite && globals.EnableWscStoreWrite {
|
||||
if skuItem.SkuSyncStatus&model.SyncFlagNewMask != 0 {
|
||||
goodsID, skuMap, err2 := api.WeimobAPI.AddGoods(outerGoodsCode, title, false, []string{skuItem.Img}, skuItem.Comment, isPutAway, 0, categoryId, classifyIdList, b2cGoods, skuList, nil)
|
||||
if err = err2; err == nil {
|
||||
storeSkuBind.WscID = skuMap[utils.Int2Str(skuItem.ID)]
|
||||
storeSkuBind.WscID2 = goodsID
|
||||
updateFields = append(updateFields, model.FieldWscID, model.FieldWscID2)
|
||||
}
|
||||
} else {
|
||||
goodsID := utils.Str2Int64WithDefault(skuItem.VendorNameID, 0)
|
||||
|
||||
goodsInfo, err2 := api.WeimobAPI.QueryGoodsDetail(goodsID)
|
||||
if err = err2; err == nil {
|
||||
// http://open.weimob.com/docapi/article?tag=Af
|
||||
// sku id,如果为空,则新增sku; 如果更新之前的skuId与入参skuId对应,则更新sku; 如果更新之前的skuId没有和入参的skuId对应,删除更新之前的sku
|
||||
skuList[0][weimobapi.KeySkuID] = utils.Str2Int64WithDefault(skuItem.VendorSkuID, 0)
|
||||
remoteSkuList := goodsInfo[weimobapi.KeySkuList].([]interface{})
|
||||
if len(remoteSkuList) > 0 {
|
||||
skuList[0][weimobapi.KeyEditStockNum] = model.MaxStoreSkuStockQty - int(utils.MustInterface2Int64(remoteSkuList[0].(map[string]interface{})[weimobapi.KeyAvailableStockNum]))
|
||||
}
|
||||
_, _, err = api.WeimobAPI.UpdateGoods(goodsID, title, false, []string{skuItem.Img}, skuItem.Comment, isPutAway, 0, categoryId, classifyIdList, b2cGoods, skuList, nil)
|
||||
}
|
||||
_, _, err = api.WeimobAPI.UpdateGoods(goodsID, title, false, []string{skuItem.Img}, skuItem.Comment, isPutAway, 0, categoryId, classifyIdList, b2cGoods, skuList, nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
_, err = dao.UpdateEntity(nil, storeSkuBind, updateFields...)
|
||||
}
|
||||
return nil, err
|
||||
}, skus)
|
||||
if err == nil {
|
||||
_, err = dao.UpdateEntity(nil, storeSkuBind, updateFields...)
|
||||
}
|
||||
return nil, err
|
||||
}, skus)
|
||||
if parentTask != nil {
|
||||
parentTask.AddChild(rootTask)
|
||||
}
|
||||
@@ -266,21 +268,22 @@ func (p *PurchaseHandler) FullSyncStoreSkus(ctx *jxcontext.Context, parentTask t
|
||||
globals.SugarLogger.Debugf("wsc FullSyncStoreSkus storeID:%d, isContinueWhenError:%t, userName:%s", storeID, isContinueWhenError, userName)
|
||||
|
||||
db := dao.GetDB()
|
||||
rootTask := tasksch.NewSeqTask("微盟微商城FullSyncStoreSkus", userName, func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
switch step {
|
||||
case 0:
|
||||
_, err = dao.SetStoreCategorySyncStatus(db, model.VendorIDWSC, storeID, nil, model.SyncFlagNewMask)
|
||||
case 1:
|
||||
_, err = dao.SetStoreSkuSyncStatus(db, model.VendorIDWSC, storeID, nil, model.SyncFlagNewMask)
|
||||
case 2:
|
||||
_, err = p.SyncLocalStoreCategory(ctx, db, storeID, false)
|
||||
case 3:
|
||||
_, err = p.SyncStoreCategory(ctx, rootTask, storeID, false)
|
||||
case 4:
|
||||
_, err = p.SyncStoreSkus(ctx, rootTask, storeID, nil, true, isContinueWhenError)
|
||||
}
|
||||
return nil, err
|
||||
}, 5)
|
||||
rootTask := tasksch.NewSeqTask("微盟微商城FullSyncStoreSkus", ctx,
|
||||
func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
switch step {
|
||||
case 0:
|
||||
_, err = dao.SetStoreCategorySyncStatus(db, model.VendorIDWSC, storeID, nil, model.SyncFlagNewMask)
|
||||
case 1:
|
||||
_, err = dao.SetStoreSkuSyncStatus(db, model.VendorIDWSC, storeID, nil, model.SyncFlagNewMask)
|
||||
case 2:
|
||||
_, err = p.SyncLocalStoreCategory(ctx, db, storeID, false)
|
||||
case 3:
|
||||
_, err = p.SyncStoreCategory(ctx, rootTask, storeID, false)
|
||||
case 4:
|
||||
_, err = p.SyncStoreSkus(ctx, rootTask, storeID, nil, true, isContinueWhenError)
|
||||
}
|
||||
return nil, err
|
||||
}, 5)
|
||||
tasksch.AddChild(parentTask, rootTask).Run()
|
||||
if !isAsync {
|
||||
_, err = rootTask.GetResult(0)
|
||||
|
||||
Reference in New Issue
Block a user