Merge branch 'mark' of e.coding.net:rosydev/jx-callback into mark
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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{},
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user