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

This commit is contained in:
gazebo
2020-01-09 18:01:07 +08:00
14 changed files with 671 additions and 213 deletions

View File

@@ -1090,21 +1090,23 @@ func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err
}
}
}()
for vendorID := range partner.PurchasePlatformHandlers {
storeSkuList, err := dao.GetStoreSkus2(db, vendorID, 0, []int{skuID}, false)
if err == nil {
for _, v := range storeSkuList {
v.Price = int64(jxutils.CaculateSkuPrice(int(v.UnitPrice), v.SpecQuality, v.SpecUnit, v.Unit))
storeSku := &model.StoreSkuBind{}
storeSku.ID = v.BindID
if _, err = dao.UpdateEntityLogically(db, storeSku, map[string]interface{}{
"Price": v.Price,
dao.GetSyncStatusStructField(model.VendorNames[vendorID]): v.SkuSyncStatus | model.SyncFlagPriceMask,
}, ctx.GetUserName(), nil); err != nil {
return err
}
}
list, err := dao.GetStoreSkusAndSkuName(db, nil, []int{skuID}, nil)
for _, v := range list {
storeID := v.StoreID
storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDJX)
if err != nil {
return err
}
storeSku := &model.StoreSkuBind{}
storeSku.ID = v.BindID
storeSku.JdSyncStatus = v.JdSyncStatus | model.SyncFlagPriceMask
storeSku.MtwmSyncStatus = v.MtwmSyncStatus | model.SyncFlagPriceMask
storeSku.EbaiSyncStatus = v.EbaiSyncStatus | model.SyncFlagPriceMask
storeSku.Price = jxutils.CaculateSkuPrice(int(v.UnitPrice), v.SpecQuality, v.SpecUnit, v.Unit)
storeSku.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), int(storeSku.Price))
storeSku.LastOperator = ctx.GetUserName()
storeSku.UpdatedAt = time.Now()
dao.UpdateEntity(db, storeSku, "Price", "JdSyncStatus", "MtwmSyncStatus", "EbaiSyncStatus", "JxPrice")
}
dao.Commit(db)
return err

View File

@@ -13,6 +13,8 @@ import (
"time"
"unicode"
"git.rosy.net.cn/jx-callback/business/jxstore/event"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/jx-callback/business/jxutils/excel"
@@ -1035,6 +1037,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
if tmpStatus := getSkuSaleStatus(inSkuBind, skuBindInfo); tmpStatus != model.StoreSkuBindStatusNA {
skuBind.Status = tmpStatus
}
// err = AddEventDetail(model.OperateAdd, v.RealSkuID, model.ThingTypeSku, storeID, ctx.GetTrackInfo(), "", "")
setStoreSkuBindStatus(skuBind, model.SyncFlagNewMask)
dao.WrapAddIDCULDEntity(skuBind, userName)
// globals.SugarLogger.Debug(utils.Format4Output(skuBind, false))
@@ -1059,8 +1062,8 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
}
} else {
skuBind = &v.StoreSkuBind
if skuBindInfo.IsFocus == -1 && isCanChangePrice {
// err = AddEventDetail(model.OperateDelete, skuBind.SkuID, model.ThingTypeSku, storeID, ctx.GetTrackInfo(), "", "")
if num, err = dao.DeleteEntityLogically(db, skuBind, map[string]interface{}{
model.FieldStatus: model.StoreSkuBindStatusDeleted,
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
@@ -1072,7 +1075,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
}
} else {
// 用了SELECT FOR UPDATE后只更新修改字段是没有必要的暂时保留
updateFieldMap := make(map[string]int)
updateFieldMap := make(map[string]interface{})
if skuBindInfo.IsFocus == 1 { // 关注之后再关注不操作
// skuBind.Status = model.StoreSkuBindStatusDontSale // 缺省不可售?
// skuBind.DeletedAt = utils.DefaultTimeValue
@@ -1114,7 +1117,12 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
skuBind.StatusSaleEnd = skuBindInfo.StatusSaleEnd
}
}
// if updateFieldMap != nil {
// afterData := utils.MustMarshal(updateFieldMap)
// mapresult := refutil.FindMapAndStructMixed(updateFieldMap, skuBind)
// beforeData := utils.MustMarshal(mapresult)
// AddEventDetail(model.OperateUpdate, v.RealSkuID, model.ThingTypeSku, storeID, ctx.GetTrackInfo(), string(beforeData), string(afterData))
// }
if len(updateFieldMap) > 0 {
updateFieldMap[model.FieldJdSyncStatus] = 1
updateFieldMap[model.FieldEbaiSyncStatus] = 1
@@ -1166,6 +1174,20 @@ func getSkuSaleStatus(inSkuBind *StoreSkuBindSkuInfo, skuNameBindInfo *StoreSkuB
return model.StoreSkuBindStatusNA
}
func AddEventDetail(operateType, thingID, thingType, storeID int, accessUUID, beforeData, afterData string) (err error) {
operateEventDetail := &model.OperateEventDetail{
OperateType: operateType,
ThingID: thingID,
ThingType: thingType,
StoreID: storeID,
AccessUUID: accessUUID,
BeforeData: beforeData,
AfterData: afterData,
}
err = event.AddOperateEventDetail(operateEventDetail)
return err
}
func formatAutoSaleTime(autoSaleTime time.Time) (outAutoSaleTime time.Time) {
if utils.IsTimeZero(autoSaleTime) {
outAutoSaleTime = utils.DefaultTimeValue
@@ -2924,7 +2946,6 @@ func GetCellForFocusStoreSkus(db *dao.DaoDB, rowNum int, row []string, sheetPara
func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
var (
skuNameMap = make(map[int][]*StoreSkuBindSkuInfo)
storeIDs []int
result1 []interface{}
)
db := dao.GetDB()
@@ -2933,9 +2954,6 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContin
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step {
case 0:
for _, v := range storeList {
storeIDs = append(storeIDs, v.ID)
}
for _, v := range skuList {
skuNameMap[v.NameID] = append(skuNameMap[v.NameID], &StoreSkuBindSkuInfo{
SkuID: v.ID,
@@ -2997,67 +3015,94 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContin
return hint, err
}
func AutoFocusStoreSkusWithoutFocusForTopSkus(ctx *jxcontext.Context) (err error) {
func AutoFocusStoreSkusWithoutFocusForTopSkus(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB()
var skuBindInfoList []*StoreSkuBindInfo
var (
skuBindInfoList []*StoreSkuBindInfo
result1 []interface{}
)
storeList, err := dao.GetStoreList(db, nil, nil, "")
for _, v := range storeList {
var (
skuName []*model.SkuName
skuNameMap = make(map[int]int)
)
sql := `
SELECT DISTINCT a.name_id id
FROM sku a
LEFT JOIN (SELECT DISTINCT b.name_id
FROM store_sku_bind a
JOIN sku b ON a.sku_id = b.id
WHERE a.deleted_at = ?
AND store_id = ?)b ON a.name_id = b.name_id
WHERE a.status = ?
AND a.deleted_at = ?
AND b.name_id IS NULL
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
v.ID,
model.SkuStatusNormal,
utils.DefaultTimeValue,
}
err = dao.GetRows(db, &skuName, sql, sqlParams...)
for _, v := range skuName {
skuNameMap[v.ID] = v.ID
}
skuNameAndPlaceList, err2 := GetTopSkusByCityCode(ctx, v.CityCode, v.ID)
if err2 != nil {
return err2
}
var payPercentage int
if v.PayPercentage < 50 {
payPercentage = 70
} else {
payPercentage = v.PayPercentage
}
if len(skuNameAndPlaceList) > 0 {
for _, vv := range skuNameAndPlaceList {
if skuNameMap[vv.ID] != 0 {
priceReferList, err := dao.GetPriceReferSnapshotNoPage(db, []int{vv.CityCode}, nil, []int{vv.ID}, utils.Time2Date(time.Now().AddDate(0, 0, -1)))
if err == nil && len(priceReferList) > 0 {
storeSkuBindInfo := &StoreSkuBindInfo{
StoreID: v.ID,
NameID: vv.ID,
UnitPrice: priceReferList[0].MidUnitPrice * payPercentage / 100,
IsFocus: 1,
IsSale: 0,
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step {
case 0:
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
v := batchItemList[0].(*model.Store)
var (
skuName []*model.SkuName
skuNameMap = make(map[int]int)
)
sql := `
SELECT DISTINCT a.name_id id
FROM sku a
LEFT JOIN (SELECT DISTINCT b.name_id
FROM store_sku_bind a
JOIN sku b ON a.sku_id = b.id
WHERE a.deleted_at = ?
AND store_id = ?)b ON a.name_id = b.name_id
WHERE a.status = ?
AND a.deleted_at = ?
AND b.name_id IS NULL
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
v.ID,
model.SkuStatusNormal,
utils.DefaultTimeValue,
}
err = dao.GetRows(db, &skuName, sql, sqlParams...)
for _, v := range skuName {
skuNameMap[v.ID] = v.ID
}
skuNameAndPlaceList, err2 := GetTopSkusByCityCode(ctx, v.CityCode, v.ID)
if err2 != nil {
return retVal, err2
}
var payPercentage int
if v.PayPercentage < 50 {
payPercentage = 70
} else {
payPercentage = v.PayPercentage
}
if len(skuNameAndPlaceList) > 0 {
for _, vv := range skuNameAndPlaceList {
if skuNameMap[vv.ID] != 0 {
priceReferList, err := dao.GetPriceReferSnapshotNoPage(db, []int{vv.CityCode}, nil, []int{vv.ID}, utils.Time2Date(time.Now().AddDate(0, 0, -1)))
if err == nil && len(priceReferList) > 0 {
storeSkuBindInfo := &StoreSkuBindInfo{
StoreID: v.ID,
NameID: vv.ID,
UnitPrice: priceReferList[0].MidUnitPrice * payPercentage / 100,
IsFocus: 1,
IsSale: 0,
}
skuBindInfoList = append(skuBindInfoList, storeSkuBindInfo)
}
}
skuBindInfoList = append(skuBindInfoList, storeSkuBindInfo)
}
}
return retVal, err
}
taskParallel := tasksch.NewParallelTask("自动关注畅销品", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, storeList)
tasksch.HandleTask(taskParallel, task, true).Run()
result1, _ = taskParallel.GetResult(0)
case 2:
var skuBindInfos []*StoreSkuBindInfo
for _, v := range result1 {
skuBindInfos = append(skuBindInfos, v.(*StoreSkuBindInfo))
}
UpdateStoresSkusByBind(ctx, skuBindInfos, isAsync, isContinueWhenError)
}
return result, err
}
UpdateStoresSkusByBind(ctx, skuBindInfoList, true, true)
return err
taskSeq := tasksch.NewSeqTask2("自动关注畅销品", ctx, isContinueWhenError, taskSeqFunc, 3)
tasksch.HandleTask(taskSeq, nil, true).Run()
if !isAsync {
_, err = taskSeq.GetResult(0)
hint = "1"
} else {
hint = taskSeq.GetID()
}
return hint, err
}
func AutoFocusStoreSkusWithoutFocus(ctx *jxcontext.Context, skuIDs []int, isSync bool) (err error) {
@@ -3075,8 +3120,8 @@ func AutoFocusStoreSkusWithoutFocus(ctx *jxcontext.Context, skuIDs []int, isSync
})
} else {
skuBindInfo := &StoreSkuBindInfo{
UnitPrice: vv.UnitPrice,
NameID: vv.ID,
UnitPrice: int(vv.UnitPrice),
NameID: vv.NameID,
StoreID: v.ID,
Skus: []*StoreSkuBindSkuInfo{},
}

View File

@@ -548,6 +548,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int,
} else {
filterStoreList := GetFilterStoreList(jxStoreInfoList.Stores, vendorMap, storeIDMap)
diffData.InitData()
//循环门店store
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
jxStoreInfoListValue := batchItemList[0].(*StoreExt)
storeID := jxStoreInfoListValue.ID
@@ -556,22 +557,23 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int,
jxSkuInfoDataSingle := &dao.StoreSkuNamesInfo{}
jxSkuInfoDataMulti := &dao.StoreSkuNamesInfo{}
if jxStoreInfoListValue.StoreMaps != nil {
var multiFlag = false
var singleFlag = false
var filterJxSkuInfoMapSingle map[int]*dao.StoreSkuNameExt
var filterJxSkuInfoMapMulti map[int]*dao.StoreSkuNameExt
for _, vendorListValue := range jxStoreInfoListValue.StoreMaps {
vendorID := vendorListValue.VendorID
var flag = false
if partner.IsMultiStore(vendorID) {
if flag == false {
if multiFlag == false {
jxSkuInfoDataMulti, _ = GetStoreSkus(ctx, storeID, filterJxDepotUnSaleSkuIds, true, "", true, false, map[string]interface{}{}, 0, -1)
filterJxSkuInfoMapMulti = GetFilterJxSkuInfoMap(jxSkuInfoDataMulti.SkuNames) //map[京西商品ID:StoreSkuNameExt]
flag = true
multiFlag = true
}
} else {
if flag == false {
if singleFlag == false {
jxSkuInfoDataSingle, _ = GetStoreSkus(ctx, storeID, []int{}, true, "", true, false, map[string]interface{}{}, 0, -1)
filterJxSkuInfoMapSingle = GetFilterJxSkuInfoMap(jxSkuInfoDataSingle.SkuNames) //map[京西商品ID:StoreSkuNameExt]
flag = true
singleFlag = true
}
}

View File

@@ -3,9 +3,15 @@ package cms
import (
"errors"
"fmt"
"sync"
"time"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
"git.rosy.net.cn/jx-callback/business/jxutils/excel"
"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"
@@ -14,6 +20,23 @@ import (
"git.rosy.net.cn/jx-callback/globals"
)
type SyncErrResult struct {
SkuID int `json:"商品ID"`
CategoryName string `json:"分类名"`
StoreID int `json:"门店ID"`
VendorID int `json:"平台ID"`
VendorSkuID string `json:"平台商品ID"`
NameID int `json:"商品nameID"`
VendorPrice int64 `json:"平台价"`
SyncType string `json:"同步类型"`
ErrMsg string `json:"错误信息"`
}
type SyncErrResultLock struct {
syncErrResult []SyncErrResult
locker sync.RWMutex
}
type LoopStoreMapInfo struct {
VendorID int
StoreMapList []*model.StoreMap
@@ -44,6 +67,18 @@ var (
var (
ErrHaveNotImplementedYet = errors.New("还没有实现")
ErrEntityNotExist = errors.New("找不到相应实体")
SyncErrResultTitle = []string{
"商品ID",
"分类名",
"门店ID",
"平台ID",
"平台商品ID",
"商品nameID",
"平台价",
"同步类型",
"错误信息",
}
syncErrResultLock SyncErrResultLock
)
// func (p *MultiStoreHandlerWrapper) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
@@ -592,9 +627,28 @@ func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, db *dao.DaoDB, taskN
taskName = fmt.Sprintf("%s,处理平台%s", taskName, model.VendorChineseNames[loopInfoList[0].VendorID])
}
task = tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, handler, loopInfoList)
if isAsync {
task.SetFinishHook(func(task tasksch.ITask) {
var noticeMsg string
if len(task.GetFailedList()) > 10 {
downloadURL, _, _ := WirteToExcelBySyncFailed(task)
noticeMsg = fmt.Sprintf("[详情点我]path1=%s\n", downloadURL)
} else {
if err != nil {
noticeMsg = utils.Format4Output(buildErrMsgJson(task), true)
}
}
if authInfo, err := ctx.GetV2AuthInfo(); err == nil {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, authInfo.UserID, "同步错误返回", noticeMsg)
}
})
}
tasksch.HandleTask(task, nil, isManageIt).Run()
if !isAsync {
resultList, err2 := task.GetResult(0)
if err2 != nil {
err2 = buildErrMsg(task)
}
if err = err2; err == nil {
if len(resultList) == 0 {
hint = "1" // todo 暂时这样
@@ -608,6 +662,38 @@ func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, db *dao.DaoDB, taskN
return task, hint, err
}
func buildErrMsg(task tasksch.ITask) (err error) {
err = fmt.Errorf(utils.Format4Output(buildErrMsgJson(task), true))
return makeSyncError(err)
}
func buildErrMsgJson(task tasksch.ITask) (resultL []*SyncErrResult) {
failedList := task.GetFailedList()
for _, v := range failedList {
for _, vv := range v.([]*partner.StoreSkuInfoWithErr) {
result := &SyncErrResult{
SkuID: 0,
StoreID: vv.StoreID,
CategoryName: vv.CategoryName,
VendorID: vv.VendoreID,
VendorSkuID: "",
NameID: 0,
VendorPrice: 0,
SyncType: vv.SyncType,
ErrMsg: vv.ErrMsg,
}
if vv.StoreSkuInfo != nil {
result.SkuID = vv.StoreSkuInfo.SkuID
result.VendorSkuID = vv.StoreSkuInfo.VendorSkuID
result.NameID = vv.StoreSkuInfo.NameID
result.VendorPrice = vv.StoreSkuInfo.VendorPrice
}
resultL = append(resultL, result)
}
}
return resultL
}
func (v *VendorSync) LoopStoresMap(ctx *jxcontext.Context, db *dao.DaoDB, taskName string, isAsync, isManageIt bool, vendorIDs []int, storeIDs []int, handler tasksch.WorkFunc, isContinueWhenError bool) (hint string, err error) {
_, hint, err = v.LoopStoresMap2(ctx, db, taskName, isAsync, isManageIt, vendorIDs, storeIDs, false, handler, isContinueWhenError)
return hint, err
@@ -739,3 +825,36 @@ func GetTimeMixByInt(begin1, end1, begin2, end2 int16) (beginAt, endAt int16) {
}
return beginAt, endAt
}
func WirteToExcelBySyncFailed(task tasksch.ITask) (downloadURL, fileName string, err error) {
var (
sheetList1 []*excel.Obj2ExcelSheetConfig
)
syncErrResultLock.syncErrResult = syncErrResultLock.syncErrResult[0:0]
list := buildErrMsgJson(task)
for _, v := range list {
syncErrResultLock.AppendData(*v)
}
excelConf1 := &excel.Obj2ExcelSheetConfig{
Title: "同步错误",
Data: syncErrResultLock.syncErrResult,
CaptionList: SyncErrResultTitle,
}
sheetList1 = append(sheetList1, excelConf1)
if excelConf1 != nil {
downloadURL, fileName, err = jxutils.UploadExeclAndPushMsg(sheetList1, time.Now().Format("200601021504")+"同步错误返回")
baseapi.SugarLogger.Debug("WriteToExcel: download is [%v]", downloadURL)
} else {
baseapi.SugarLogger.Debug("WriteToExcel: dataSuccess is nil!")
}
if err != nil {
baseapi.SugarLogger.Errorf("WriteToExcel:upload %s , %s failed error:%v", fileName, err)
}
return downloadURL, fileName, err
}
func (d *SyncErrResultLock) AppendData(syncErrResult SyncErrResult) {
d.locker.Lock()
defer d.locker.Unlock()
d.syncErrResult = append(d.syncErrResult, syncErrResult)
}

View File

@@ -69,7 +69,7 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
rootTask := tasksch.NewSeqTask(fmt.Sprintf("%s SyncStoreCategory step1", model.VendorChineseNames[vendorID]), ctx,
func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
level := step + 1
catList, err := dao.GetDirtyStoreCategories(db, vendorID, storeID, level)
catList, err := dao.GetDirtyStoreCategories(db, vendorID, storeID, level, skuIDs)
if len(catList) > 0 {
num += len(catList)
task := tasksch.NewParallelTask(fmt.Sprintf("%s SyncStoreCategory step2, level=%d", model.VendorChineseNames[vendorID], level),
@@ -80,11 +80,14 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
catInfo := batchItemList[0].(*dao.SkuStoreCatInfo)
storeCatMap := &model.StoreSkuCategoryMap{}
storeCatMap.ID = catInfo.MapID
var failedList []*partner.StoreSkuInfoWithErr
if model.IsSyncStatusDelete(catInfo.CatSyncStatus) { // 删除
if model.IsSyncStatusDelete(catInfo.CatSyncStatus) && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) {
err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, catInfo.VendorCatID, level)
if err != nil && handler.IsErrCategoryNotExist(err) {
err = nil
} else if err != nil && !handler.IsErrCategoryNotExist(err) {
failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeID, vendorID, "删除分类")
}
}
} else if model.IsSyncStatusNew(catInfo.CatSyncStatus) { // 新增
@@ -93,6 +96,8 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
if cat, err2 := handler.GetStoreCategory(ctx, storeID, vendorStoreID, catInfo.Name); err2 == nil {
catInfo.VendorCatID = cat.VendorCatID
err = nil
} else if err != nil && !handler.IsErrCategoryExist(err) {
failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeID, vendorID, "新增分类")
}
}
if err == nil {
@@ -103,10 +108,19 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
}
}
} else if model.IsSyncStatusUpdate(catInfo.CatSyncStatus) { // 修改
if err = handler.UpdateStoreCategory(ctx, storeID, vendorStoreID, catInfo); err == nil {
err = handler.UpdateStoreCategory(ctx, storeID, vendorStoreID, catInfo)
if err == nil {
updateFields = append(updateFields, idFieldName)
} else {
failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeID, vendorID, "修改分类")
}
}
if len(failedList) > 0 {
for _, v := range failedList {
v.CategoryName = catInfo.Name
}
task.AddFailedList(failedList)
}
if err == nil {
if vendorID == model.VendorIDMTWM {
refutil.SetObjFieldByName(storeCatMap, idFieldName, catInfo.VendorCatID)
@@ -318,7 +332,6 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
return err
}
vendorStoreID := storeDetail.VendorStoreID
var skus []*dao.StoreSkuSyncInfo
if isFull {
skus, err = dao.GetFullStoreSkus(db, vendorID, storeID)
@@ -477,15 +490,18 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
case 0:
if len(deleteList) > 0 {
_, err = putils.FreeBatchStoreSkuInfo("删除门店商品", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var successList []*partner.StoreSkuInfo
if successList, err = singleStoreHandler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList); singleStoreHandler.IsErrSkuNotExist(err) {
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = singleStoreHandler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList)
if len(failedList) > 0 {
task.AddFailedList(failedList)
}
if singleStoreHandler.IsErrSkuNotExist(err) {
err = nil
}
if err == nil {
successList = batchedStoreSkuList
} else {
if err != nil {
offlineList = append(offlineList, batchedStoreSkuList...)
}
successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
if len(successList) > 0 {
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagDeletedMask)
}
@@ -495,29 +511,33 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
case 1:
if len(createList) > 0 {
_, err = putils.FreeBatchStoreSkuSyncInfo("创建门店商品", func(task tasksch.ITask, batchedStoreSkuList []*dao.StoreSkuSyncInfo) (result interface{}, successCount int, err error) {
var successList []*dao.StoreSkuSyncInfo
if successList, err = singleStoreHandler.CreateStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList); singleStoreHandler.IsErrSkuExist(err) {
if skuNameList, err2 := singleStoreHandler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, []*partner.StoreSkuInfo{
&partner.StoreSkuInfo{
SkuID: batchedStoreSkuList[0].SkuID,
},
}); err2 == nil && len(skuNameList) > 0 {
batchedStoreSkuList[0].VendorNameID = skuNameList[0].VendorNameID
batchedStoreSkuList[0].VendorSkuID = skuNameList[0].SkuList[0].VendorSkuID
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = singleStoreHandler.CreateStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList)
singleStoreHandler.IsErrSkuExist(err)
if skuNameList, err2 := singleStoreHandler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, []*partner.StoreSkuInfo{
&partner.StoreSkuInfo{
SkuID: batchedStoreSkuList[0].SkuID,
},
}); err2 == nil && len(skuNameList) > 0 {
batchedStoreSkuList[0].VendorNameID = skuNameList[0].VendorNameID
batchedStoreSkuList[0].VendorSkuID = skuNameList[0].SkuList[0].VendorSkuID
// 如果创建商品时已经存在,需要更新
updateList = append(updateList, calVendorPrice4StoreSku(batchedStoreSkuList[0], storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage)))
err = nil
}
}
if err == nil {
successList = batchedStoreSkuList
// 如果创建商品时已经存在,需要更新
updateList = append(updateList, calVendorPrice4StoreSku(batchedStoreSkuList[0], storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage)))
err = nil
} else {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(batchedStoreSkuList, err2, storeID, vendorID, "查询是否有该商品")...)
}
if len(failedList) > 0 {
task.AddFailedList(failedList)
}
if err != nil {
//handle error for sensitive words, if find, then insert to table sensitive_words
if sensitiveWord := GetSensitiveWord(singleStoreHandler, err.Error()); sensitiveWord != "" {
dao.InsertSensitiveWord(sensitiveWord, vendorID, ctx.GetUserName())
}
}
successList := putils.UnselectStoreSkuSyncListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
if len(successList) > 0 {
updateStoreSku(dao.GetDB(), vendorID, successList, model.SyncFlagNewMask)
}
@@ -527,10 +547,12 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
case 2:
if len(updateList) > 0 {
_, err = putils.FreeBatchStoreSkuSyncInfo("更新门店商品基础信息", func(task tasksch.ITask, batchedStoreSkuList []*dao.StoreSkuSyncInfo) (result interface{}, successCount int, err error) {
var successList []*dao.StoreSkuSyncInfo
if successList, err = singleStoreHandler.UpdateStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList); err == nil {
successList = batchedStoreSkuList
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = singleStoreHandler.UpdateStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList)
if len(failedList) > 0 {
task.AddFailedList(failedList)
}
successList := putils.UnselectStoreSkuSyncListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
if len(successList) > 0 {
updateStoreSku(dao.GetDB(), vendorID, successList, model.SyncFlagModifiedMask)
}
@@ -541,10 +563,12 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
for k, list := range [][]*partner.StoreSkuInfo{stockList /*, onlineList*/} {
if len(list) > 0 {
_, err = putils.FreeBatchStoreSkuInfo("更新门店商品库存", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var successList []*partner.StoreSkuInfo
if successList, err = storeSkuHandler.UpdateStoreSkusStock(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList); err == nil {
successList = batchedStoreSkuList
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = storeSkuHandler.UpdateStoreSkusStock(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
if len(failedList) > 0 {
task.AddFailedList(failedList)
}
successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
if k == 0 && len(successList) > 0 {
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagStockMask)
}
@@ -563,10 +587,12 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
}
if len(statusList) > 0 {
_, err = putils.FreeBatchStoreSkuInfo(name, func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var successList []*partner.StoreSkuInfo
if successList, err = storeSkuHandler.UpdateStoreSkusStatus(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList, status); err == nil {
successList = batchedStoreSkuList
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = storeSkuHandler.UpdateStoreSkusStatus(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList, status)
if len(failedList) > 0 {
task.AddFailedList(failedList)
}
successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
if len(successList) > 0 {
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagSaleMask)
}
@@ -576,10 +602,12 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo
case 6:
if len(priceList) > 0 {
_, err = putils.FreeBatchStoreSkuInfo("更新门店商品价格", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var successList []*partner.StoreSkuInfo
if successList, err = storeSkuHandler.UpdateStoreSkusPrice(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList); err == nil {
successList = batchedStoreSkuList
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = storeSkuHandler.UpdateStoreSkusPrice(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
if len(failedList) > 0 {
task.AddFailedList(failedList)
}
successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
if len(successList) > 0 {
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagPriceMask)
}
@@ -726,7 +754,7 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v
}
sku2Delete = nil
case 2:
localCatList, err := dao.GetStoreCategories(db, vendorID, storeID, 0, false)
localCatList, err := dao.GetStoreCategories(db, vendorID, storeID, nil, 0, false)
if err != nil {
return nil, err
}
@@ -889,3 +917,13 @@ func MergeSkuSaleStatusWithStoreOpTime(sku *dao.StoreSkuSyncInfo, storeDetail *d
}
return sku.MergedStatus
}
func GetVendorSkuIDList(l []*partner.StoreSkuInfoWithErr) (vendorSkuIDs []string) {
vendorSkuIDs2 := make([]string, len(l))
if len(l) > 0 {
for k, v := range l {
vendorSkuIDs2[k] = v.StoreSkuInfo.VendorSkuID
}
}
return vendorSkuIDs2
}