diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index e7568f063..16907e81e 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -24,8 +24,8 @@ const ( maxLastHours = 7 * 24 // 最多只能查询7天内的订单数据 defLastHours = 2 * 24 // 缺省是两天内的订单 - orderMixTimeImmediatelyArrive = 8 - orderMixTimeDelayArrive = 5 + orderSubTimeImmediatelyArrive = 8 + orderSubTimeDelayArrive = 5 ) type tWaybillExt struct { @@ -939,6 +939,7 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in } if len(dateVendorList) > 0 { var missingOrderList []*tOrderVendorPair + var updateOrderStatusList []*tOrderVendorPair db := dao.GetDB() vendorStoreIDMap := make(map[int]string) if storeID > 0 { @@ -995,12 +996,12 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in } else { if goodsOrder.Status != model.OrderStatusFinished && goodsOrder.Status != model.OrderStatusCanceled { if goodsOrder.BusinessType == model.BusinessTypeImmediate { - if time.Now().Sub(goodsOrder.CreatedAt).Hours() >= orderMixTimeImmediatelyArrive { - missingOrderList = append(missingOrderList, pair) + if time.Now().Sub(goodsOrder.CreatedAt).Hours() >= orderSubTimeImmediatelyArrive { + updateOrderStatusList = append(updateOrderStatusList, pair) } } else { - if time.Now().Sub(goodsOrder.ExpectedDeliveredTime).Hours() >= orderMixTimeDelayArrive { - missingOrderList = append(missingOrderList, pair) + if time.Now().Sub(goodsOrder.ExpectedDeliveredTime).Hours() >= orderSubTimeDelayArrive { + updateOrderStatusList = append(updateOrderStatusList, pair) } } } @@ -1013,9 +1014,6 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in if handler := partner.GetPurchaseOrderHandlerFromVendorID(pair.VendorID); handler != nil { order, err2 := handler.GetOrder(pair.VendorOrgCode, pair.VendorOrderID) if err = err2; err == nil { - if order.Status == model.OrderStatusCanceled || order.Status == model.OrderStatusFinished { - err = c.UpdateOrderFields(order, []string{"Status"}) - } isDuplicated, err2 := c.SaveOrder(order, false, dao.GetDB()) if err2 == nil && !isDuplicated { retVal = []int{1} @@ -1026,9 +1024,25 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in }, missingOrderList) tasksch.HandleTask(task2, task, true).Run() result, err = task2.GetResult(0) + case 2: + task3 := tasksch.NewParallelTask("AmendMissingOrders UpdateOrders", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + pair := batchItemList[0].(*tOrderVendorPair) + if handler := partner.GetPurchaseOrderHandlerFromVendorID(pair.VendorID); handler != nil { + order, err2 := handler.GetOrder(pair.VendorOrgCode, pair.VendorOrderID) + if err = err2; err == nil { + if order.Status == model.OrderStatusCanceled || order.Status == model.OrderStatusFinished { + err = c.UpdateOrderFields(order, []string{"Status"}) + } + } + } + return retVal, err + }, updateOrderStatusList) + tasksch.HandleTask(task3, task, true).Run() + _, err = task3.GetResult(0) } return result, err - }, 2) + }, 3) tasksch.HandleTask(task, nil, true).Run() if !isAsync { result, err2 := task.GetResult(0) diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 7aa862aac..2bcea66ae 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -871,10 +871,10 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf return 0, err } - if err = OnUpdateThing(ctx, db, nil, int64(v.ID), model.ThingTypeSku); err != nil { - dao.Rollback(db) - return 0, err - } + // if err = OnUpdateThing(ctx, db, nil, int64(v.ID), model.ThingTypeSku); err != nil { + // dao.Rollback(db) + // return 0, err + // } } } skuIDs, err2 := dao.GetSkuIDByNames(db, []int{nameID}) @@ -1355,23 +1355,28 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro task := tasksch.NewParallelTask("批量设置商品前缀", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { step := batchItemList[0].(int) + now := utils.Time2Date(time.Now()) switch step { case 0: task := tasksch.NewParallelTask("批量设置商品前缀", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { nameID := batchItemList[0].(int) - if (time.Now().Before(toTimeP) && time.Now().After(fromTimeP)) || (time.Now().After(fromTimeP) && time.Now().After(toTimeP)) { - payload := map[string]interface{}{ - "exPrefix": exPrefix, - "exPrefixBegin": fromTimeP, - "exPrefixEnd": toTimeP, - } + payload := map[string]interface{}{ + "exPrefix": exPrefix, + "exPrefixBegin": fromTimeP, + "exPrefixEnd": toTimeP, + } + if now.Sub(toTimeP) <= 0 && now.Sub(fromTimeP) >= 0 { + _, err = UpdateSkuName(ctx, nameID, payload) + } else if now.Sub(fromTimeP) > 0 && now.Sub(toTimeP) > 0 { + payload["exPrefixBegin"] = nil + payload["exPrefixEnd"] = nil _, err = UpdateSkuName(ctx, nameID, payload) } else { skuName := &model.SkuName{ ExPrefix: exPrefix, - ExPrefixBegin: fromTimeP, - ExPrefixEnd: toTimeP, + ExPrefixBegin: &fromTimeP, + ExPrefixEnd: &toTimeP, } skuName.ID = nameID skuName.LastOperator = ctx.GetLoginID() @@ -1391,7 +1396,7 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro tasksch.HandleTask(task, nil, true).Run() _, err = task.GetResult(0) case 1: - if (time.Now().Before(toTimeP) && time.Now().After(fromTimeP)) || (time.Now().After(fromTimeP) && time.Now().After(toTimeP)) { + if (now.Sub(toTimeP) <= 0 && now.Sub(fromTimeP) >= 0) || (now.Sub(fromTimeP) > 0 && now.Sub(toTimeP) > 0) { var skuIDs []int skuList, err2 := dao.GetSkus(db, nil, nameIDs, nil, nil) if err = err2; err == nil { @@ -1399,7 +1404,7 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro for _, v := range skuList { skuIDs = append(skuIDs, v.ID) } - CurVendorSync.SyncStoresSkus2(ctx, db, []int{model.VendorIDEBAI, model.VendorIDMTWM}, nil, false, skuIDs, nil, 0, true, true) + CurVendorSync.SyncStoresSkus2(ctx, db, partner.GetSingleStoreVendorIDs(), nil, false, skuIDs, nil, 0, true, true) } } } @@ -1416,12 +1421,17 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro return hint, err } -func SetSingleStoreSkuSyncModifyStauts(db *dao.DaoDB, vendorIDs []int) (err error) { +func SetSingleStoreSkuSyncModifyStatus(db *dao.DaoDB, vendorIDs []int) (err error) { _, err = dao.UpdateStoreSkuBindSyncStatusForExPrefix(db, vendorIDs) return err } -func SetMultiStoreSkuSyncModifyStauts(db *dao.DaoDB, vendorIDs []int) (err error) { +func SetMultiStoreSkuSyncModifyStatus(db *dao.DaoDB, vendorIDs []int) (err error) { _, err = dao.UpdateSkuSyncStatusForExPrefix(db, vendorIDs) return err } + +func DeleteSkuNameExPrefixOverdue(db *dao.DaoDB) (err error) { + _, err = dao.DeleteSkuNameExPrefixOverdue(db) + return err +} diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index b8c193368..6183b47ad 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -18,6 +18,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/excel" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/partner/purchase/jd" + "git.rosy.net.cn/jx-callback/globals/api/apimanager" "git.rosy.net.cn/jx-callback/business/partner" @@ -42,6 +43,13 @@ const ( CopyStoreSkuModeUpdatePrice = "updatePrice" // 增量复制价格 ) +//通用写入Excel +type ExcelParam struct { + DataList interface{} + SheetName string + TitleList []string +} + // UpdateStoreSku用,API调用时 type StoreSkuBindSkuInfo struct { SkuID int `json:"skuID"` @@ -117,6 +125,15 @@ type SheetParam struct { SkuRow int } +type DataVendorStoreSkuPrice struct { + StoreID int `json:"门店ID"` + StoreName string `json:"门店名"` + SkuID int `json:"商品ID"` + SkuNameID int `json:"商品NameID"` + SkuName string `json:"商品名"` + VendorPrice int64 `json:"平台价"` +} + type DataSuccess struct { NameID int `json:"商品NameID"` Name string `json:"商品名称"` @@ -151,7 +168,15 @@ var ( "18180948107": 1, // 徐 // "13684045763": 1, // 周 } - dataLock DataLock + dataLock DataLock + titleListVendorStoreSkuPrice = []string{ + "门店ID", + "门店名", + "商品ID", + "商品NameID", + "商品名", + "平台价", + } titleListSuccess = []string{ "商品NameID", "商品名称", @@ -2484,3 +2509,129 @@ func IsChineseChar(str string) bool { func GetStoreCategories(ctx *jxcontext.Context, storeID, parentID int) (catList []*model.SkuCategory, err error) { return dao.GetStoreSkuCategories(dao.GetDB(), storeID, parentID) } + +func GetVendorStoreSkuPrice(ctx *jxcontext.Context, vendorIDs []int, skuID int, isAsync, isContinueWhenError bool) (hint string, err error) { + var ( + storeSkuListJD []DataVendorStoreSkuPrice + storeSkuListMT []DataVendorStoreSkuPrice + storeSkuListEB []DataVendorStoreSkuPrice + excelParamList []ExcelParam + ) + taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: + for _, v := range vendorIDs { + vendorID := v + handler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler) + handlerStore := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IStoreHandler) + for _, v := range apimanager.CurAPIManager.GetAppOrgCodeList(vendorID) { + vendorStoreIDs, err2 := handlerStore.GetAllStoresVendorID(ctx, v) + err = err2 + task := tasksch.NewParallelTask("获取各平台所有门店某商品价格", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + vendorStoreID := batchItemList[0].(string) + var inStoreSkuList []*partner.StoreSkuInfo + var storeDetail *dao.StoreDetail + inStoreSku := &partner.StoreSkuInfo{ + SkuID: skuID, + } + inStoreSkuList = append(inStoreSkuList, inStoreSku) + db := dao.GetDB() + storeDetail, err = dao.GetStoreDetailByVendorStoreID(db, vendorStoreID, vendorID) + if err != nil { + return retVal, err + } + outStoreSkuList, err := handler.GetStoreSkusBareInfo(ctx, v, task, 0, vendorStoreID, inStoreSkuList) + if err != nil { + return retVal, err + } + if len(outStoreSkuList) > 0 { + if storeDetail != nil { + skuNameList, err := dao.GetSkus(db, []int{outStoreSkuList[0].SkuID}, nil, nil, nil) + if err != nil { + return retVal, err + } + if len(skuNameList) > 0 { + data := DataVendorStoreSkuPrice{ + StoreID: storeDetail.ID, + StoreName: storeDetail.Name, + SkuID: outStoreSkuList[0].SkuID, + SkuNameID: outStoreSkuList[0].NameID, + SkuName: skuNameList[0].Name, + VendorPrice: outStoreSkuList[0].VendorPrice, + } + retVal = []DataVendorStoreSkuPrice{data} + } + } + } + return retVal, err + }, vendorStoreIDs) + tasksch.HandleTask(task, nil, true).Run() + storeSkuList, _ := task.GetResult(0) + for _, v := range storeSkuList { + if vendorID == model.VendorIDJD { + storeSkuListJD = append(storeSkuListJD, v.(DataVendorStoreSkuPrice)) + } + if vendorID == model.VendorIDEBAI { + storeSkuListEB = append(storeSkuListEB, v.(DataVendorStoreSkuPrice)) + } + if vendorID == model.VendorIDMTWM { + storeSkuListMT = append(storeSkuListMT, v.(DataVendorStoreSkuPrice)) + } + } + } + } + excelParam1 := ExcelParam{ + DataList: storeSkuListJD, + TitleList: titleListVendorStoreSkuPrice, + SheetName: "京东平台", + } + excelParam2 := ExcelParam{ + DataList: storeSkuListEB, + TitleList: titleListVendorStoreSkuPrice, + SheetName: "饿百平台", + } + excelParam3 := ExcelParam{ + DataList: storeSkuListMT, + TitleList: titleListVendorStoreSkuPrice, + SheetName: "美团平台", + } + excelParamList = append(excelParamList, excelParam1, excelParam2, excelParam3) + case 1: + WriteToExcelNormal(task, "各平台"+utils.Int2Str(skuID)+"商品所有门店价格", excelParamList) + } + return result, err + } + taskSeq := tasksch.NewSeqTask2("获取各平台所有门店某商品价格-序列任务", ctx, isContinueWhenError, taskSeqFunc, 2) + tasksch.HandleTask(taskSeq, nil, true).Run() + if !isAsync { + _, err = taskSeq.GetResult(0) + hint = "1" + } else { + hint = taskSeq.GetID() + } + return hint, err +} + +func WriteToExcelNormal(task *tasksch.SeqTask, fileName string, excelParam []ExcelParam) (err error) { + var sheetList []*excel.Obj2ExcelSheetConfig + for _, v := range excelParam { + if v.DataList != nil { + excelConf := &excel.Obj2ExcelSheetConfig{ + Title: v.SheetName, + Data: v.DataList, + CaptionList: v.TitleList, + } + sheetList = append(sheetList, excelConf) + } + } + downloadURL, fileNameResult, err := jxutils.UploadExeclAndPushMsg(sheetList, fileName) + if err != nil { + baseapi.SugarLogger.Errorf("WriteToExcel:upload %s failed error:%v", fileNameResult, err) + } else { + noticeMsg := fmt.Sprintf("[详情点我]path=%s \n", downloadURL) + task.SetNoticeMsg(noticeMsg) + baseapi.SugarLogger.Debugf("WriteToExcel:upload %s success, downloadURL:%s", fileNameResult, downloadURL) + } + return err +} diff --git a/business/jxstore/cms/store_sku_check.go b/business/jxstore/cms/store_sku_check.go index edf400ef9..a8c0e8efe 100644 --- a/business/jxstore/cms/store_sku_check.go +++ b/business/jxstore/cms/store_sku_check.go @@ -340,10 +340,10 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin //多规格商品不用比较数量单位 if jxSkuInfo.IsSpu == 0 { //jxSkuDetailName : 前缀 ([荐]) + 分类名(xxx水饺) + 数量单位(约..g/份) + 注释 (补充..) - jxSkuDetailName = jxutils.ComposeSkuName(jxSkuInfo.SkuName.Prefix, jxSkuInfo.SkuName.Name, jxSkuInfo.Skus[0].Comment, jxSkuInfo.SkuName.Unit, jxSkuInfo.Skus[0].SkuSpecQuality, jxSkuInfo.Skus[0].SkuSpecUnit, 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue) + jxSkuDetailName = jxutils.ComposeSkuName(jxSkuInfo.SkuName.Prefix, jxSkuInfo.SkuName.Name, jxSkuInfo.Skus[0].Comment, jxSkuInfo.SkuName.Unit, jxSkuInfo.Skus[0].SkuSpecQuality, jxSkuInfo.Skus[0].SkuSpecUnit, 0, "", nil, nil) } else { //jxSkuDetailName : 前缀 ([荐]) + 分类名(xxx水饺) + 数量单位(约..g/份) + 注释 (补充..) - jxSkuDetailName = jxutils.ComposeSkuName(jxSkuInfo.SkuName.Prefix, jxSkuInfo.SkuName.Name, jxSkuInfo.Skus[0].Comment, "", jxSkuInfo.Skus[0].SkuSpecQuality, "", 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue) + jxSkuDetailName = jxutils.ComposeSkuName(jxSkuInfo.SkuName.Prefix, jxSkuInfo.SkuName.Name, jxSkuInfo.Skus[0].Comment, "", jxSkuInfo.Skus[0].SkuSpecQuality, "", 0, "", nil, nil) } //jxSkuSaleStatus : 商品状态 ,skustatus 优先级高于 StoreSkuStatus @@ -462,9 +462,9 @@ func CompareJxAndMultiVenderDepot(ctx *jxcontext.Context, vendorMap map[int]bool var jxSkuDetailName string //多规格商品不用比较数量单位 if jxSkuInfo.IsSpu == 0 { - jxSkuDetailName = jxutils.ComposeSkuName(jxSkuInfo.Prefix, jxSkuInfo.Name, jxSkuInfo.Comment, jxSkuInfo.Unit, jxSkuInfo.SpecQuality, jxSkuInfo.SpecUnit, 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue) + jxSkuDetailName = jxutils.ComposeSkuName(jxSkuInfo.Prefix, jxSkuInfo.Name, jxSkuInfo.Comment, jxSkuInfo.Unit, jxSkuInfo.SpecQuality, jxSkuInfo.SpecUnit, 0, "", nil, nil) } else { - jxSkuDetailName = jxutils.ComposeSkuName(jxSkuInfo.Prefix, jxSkuInfo.Name, jxSkuInfo.Comment, "", jxSkuInfo.SpecQuality, "", 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue) + jxSkuDetailName = jxutils.ComposeSkuName(jxSkuInfo.Prefix, jxSkuInfo.Name, jxSkuInfo.Comment, "", jxSkuInfo.SpecQuality, "", 0, "", nil, nil) } vendorSkuInfoMap := filterVendorSkuInfoMap[skuid] diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index fa1f911ff..e94a43141 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -384,7 +384,6 @@ func (v *VendorSync) SyncStoresCategory(ctx *jxcontext.Context, db *dao.DaoDB, v func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs []int, syncDisabled bool, skuIDs, excludeSkuIDs []int, setSyncStatus int, isAsync, isContinueWhenError bool) (hint string, err error) { globals.SugarLogger.Debug("SyncStoresSkus2") isManageIt := len(storeIDs) != 1 || len(skuIDs) == 0 || len(skuIDs) > 8 - SetSingleStoreSkuSyncModifyStauts(db, []int{model.VendorIDEBAI, model.VendorIDMTWM}) task, hint, err := v.LoopStoresMap2(ctx, db, fmt.Sprintf("同步门店商品信息:%v", storeIDs), isAsync, isManageIt, vendorIDs, storeIDs, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { loopMapInfo := batchItemList[0].(*LoopStoreMapInfo) diff --git a/business/jxstore/cms/sync2.go b/business/jxstore/cms/sync2.go index 0d1bab9d1..e18979671 100644 --- a/business/jxstore/cms/sync2.go +++ b/business/jxstore/cms/sync2.go @@ -131,7 +131,6 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, appOrgCodes []string, nameIDs, skuIDs []int, isAsync bool) (hint string, err error) { globals.SugarLogger.Debugf("SyncSkus vendorIDs:%v, appOrgCodes:%v, nameIDs:%v, skuIDs:%v", vendorIDs, appOrgCodes, nameIDs, skuIDs) db := dao.GetDB() - SetMultiStoreSkuSyncModifyStauts(db, vendorIDs) skuList, err := dao.GetSkusWithVendor(db, vendorIDs, appOrgCodes, nameIDs, skuIDs, true) if err == nil && len(skuList) > 0 { // todo 按vendorID orgCode合并操作 diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 6fa55f25e..9f599670c 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -165,13 +165,20 @@ func syncStoreSku() { if (time.Now().Unix()/24*3600)%10 == 0 { syncFlag |= model.SyncFlagSaleMask } + db := dao.GetDB() task := tasksch.NewParallelTask("同步京西与平台数据", nil, jxcontext.AdminCtx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { step := batchItemList[0].(int) errList := errlist.New() switch step { case 0: - _, err = cms.CurVendorSync.LoopMultiStoresVendors(jxcontext.AdminCtx, dao.GetDB(), "同步多门店平台商品库", false, true, + //清除skuname中额外前缀过期的时间 + err = cms.DeleteSkuNameExPrefixOverdue(db) + //为sku和storeSkuBind打上要更新商品额外前缀的标记 + err = cms.SetMultiStoreSkuSyncModifyStatus(db, partner.GetMultiStoreVendorIDs()) + err = cms.SetSingleStoreSkuSyncModifyStatus(db, partner.GetSingleStoreVendorIDs()) + case 1: + _, err = cms.CurVendorSync.LoopMultiStoresVendors(jxcontext.AdminCtx, db, "同步多门店平台商品库", false, true, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { vendorInfo := batchItemList[0].(*cms.MultiStoreVendorInfo) _, err = cms.FullSyncVendorStuff(jxcontext.AdminCtx, task, vendorInfo.VendorID, vendorInfo.OrgCode, false, true) @@ -180,20 +187,20 @@ func syncStoreSku() { errList.AddErr(err) // cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, dao.GetDB(), partner.GetMultiStoreVendorIDs(), nil, false, nil, []int{27379}, syncFlag, true, true) - _, err = cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, dao.GetDB(), partner.GetMultiStoreVendorIDs(), nil, false, []int{27379}, true, true) + _, err = cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, db, partner.GetMultiStoreVendorIDs(), nil, false, []int{27379}, true, true) errList.AddErr(err) - case 1: + case 2: _, err = cms.CurVendorSync.AmendAndPruneStoreStuff(jxcontext.AdminCtx, partner.GetSingleStoreVendorIDs(), nil, false, true, cms.AmendPruneAll, false) errList.AddErr(err) SaveImportantTaskID(TaskNameSyncStoreSku, SpecialTaskID) - taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, dao.GetDB(), partner.GetSingleStoreVendorIDs(), nil, false, nil, nil, syncFlag, true, true) + taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, db, partner.GetSingleStoreVendorIDs(), nil, false, nil, nil, syncFlag, true, true) errList.AddErr(err2) SaveImportantTaskID(TaskNameSyncStoreSku, taskID) } err = errList.GetErrListAsOne() return retVal, err - }, []int{0, 1}) + }, []int{0, 1, 2}) tasksch.HandleTask(task, nil, true).Run() } diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index d8829b563..fbe15296e 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -1451,7 +1451,7 @@ func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, i } price := sku.LinkID sku.LinkID = 0 - skuName := jxutils.ComposeSkuName(skuNameExt.Prefix, skuNameExt.Name, sku.Comment, skuNameExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount,"",utils.ZeroTimeValue,utils.ZeroTimeValue) + skuName := jxutils.ComposeSkuName(skuNameExt.Prefix, skuNameExt.Name, sku.Comment, skuNameExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount, "", nil, nil) fixedStatus := 1 if sku.Status != model.SkuStatusNormal { fixedStatus = 2 diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 0fb77f2f0..6e31cd7d3 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -327,9 +327,9 @@ func FloatWeight2Int(weight float32) int { return int(math.Round(float64(weight * 1000))) } -func ComposeSkuName(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd time.Time) (skuName string) { - if exPrefix != "" && !utils.IsTimeZero(exPrefixBegin) && !utils.IsTimeZero(exPrefixEnd) { - if time.Now().After(exPrefixBegin) && time.Now().Before(exPrefixEnd) { +func ComposeSkuName(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time) (skuName string) { + if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil { + if time.Now().After(*exPrefixBegin) && time.Now().Before(*exPrefixEnd) { skuName = exPrefix } } @@ -353,12 +353,12 @@ func ComposeSkuName(prefix, name, comment, unit string, spec_quality float32, sp return skuName } -func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd time.Time) (skuName string) { - if exPrefix != "" && !utils.IsTimeZero(exPrefixBegin) && !utils.IsTimeZero(exPrefixEnd) { - if time.Now().Add(6*time.Hour).After(exPrefixBegin) && time.Now().Before(exPrefixEnd) { +func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time) (skuName string) { + if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil { + if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) < 0 { skuName = exPrefix } - if time.Now().Add(6 * time.Hour).After(exPrefixEnd) { + if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) >= 0 { skuName = "" } } diff --git a/business/model/act.go b/business/model/act.go index fe20554e4..5ea7c0125 100644 --- a/business/model/act.go +++ b/business/model/act.go @@ -201,8 +201,8 @@ type ActStoreSku2 struct { Prefix string `json:"-"` ExPrefix string - ExPrefixBegin time.Time - ExPrefixEnd time.Time + ExPrefixBegin *time.Time + ExPrefixEnd *time.Time SkuNameName string `orm:"column(sku_name_name)" json:"-"` Unit string `orm:"size(8)" json:"-"` SpecQuality float32 `json:"-"` diff --git a/business/model/dao/report.go b/business/model/dao/report.go index 96edf6a1e..81432d287 100644 --- a/business/model/dao/report.go +++ b/business/model/dao/report.go @@ -278,7 +278,7 @@ func GetPriceReferSnapshot(db *DaoDB, cityCodes, skuIDs []int, snapDate time.Tim err = err2 if len(skuList) > 0 { skuAndName := skuList[0] - jxSkuDetailName := jxutils.ComposeSkuName(skuAndName.Prefix, skuAndName.Name, skuAndName.Comment, skuAndName.Unit, skuAndName.SpecQuality, skuAndName.SpecUnit, 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue) + jxSkuDetailName := jxutils.ComposeSkuName(skuAndName.Prefix, skuAndName.Name, skuAndName.Comment, skuAndName.Unit, skuAndName.SpecQuality, skuAndName.SpecUnit, 0, "", nil, nil) v.SkuName = jxSkuDetailName } } diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index c1b1b299b..142a91368 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -58,8 +58,8 @@ type StoreSkuSyncInfo struct { // sku_name Prefix string ExPrefix string - ExPrefixBegin time.Time - ExPrefixEnd time.Time + ExPrefixBegin *time.Time + ExPrefixEnd *time.Time // NameID int `orm:"column(name_id)"` VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用 Name string @@ -918,7 +918,7 @@ func UpdateStoreSkuBindSyncStatusForExPrefix(db *DaoDB, vendorIDs []int) (num in if len(vendorIDs) > 0 { for _, v := range vendorIDs { fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[v]) - sql += ` %s_sync_status = ?,` + sql += ` %s_sync_status = %s_sync_status | ?,` fmtParams = append(fmtParams, fieldPrefix) sqlParams = append(sqlParams, model.SyncFlagModifiedMask) } @@ -927,13 +927,12 @@ func UpdateStoreSkuBindSyncStatusForExPrefix(db *DaoDB, vendorIDs []int) (num in } sql = sql[0:strings.LastIndex(sql, ",")] sql = fmt.Sprintf(sql, fmtParams...) - sql += ` WHERE a.status = ? - AND a.deleted_at = ? + sql += ` WHERE a.deleted_at = ? AND c.ex_prefix != "" - AND (DATE_FORMAT(c.ex_prefix_begin,'%Y-%m-%d') = DATE_FORMAT(DATE_ADD(NOW(),INTERVAL '6' HOUR),'%Y-%m-%d') - OR DATE_FORMAT(c.ex_prefix_end,'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d')) + AND (c.ex_prefix_begin = DATE_FORMAT(DATE_ADD(NOW(),INTERVAL '6' HOUR),'%Y-%m-%d 00:00:00') + OR c.ex_prefix_end = DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00')) ` - sqlParams = append(sqlParams, model.StoreSkuBindStatusNormal, utils.DefaultTimeValue) + sqlParams = append(sqlParams, utils.DefaultTimeValue) return ExecuteSQL(db, sql, sqlParams...) } @@ -950,7 +949,7 @@ func UpdateSkuSyncStatusForExPrefix(db *DaoDB, vendorIDs []int) (num int64, err if len(vendorIDs) > 0 { for _, v := range vendorIDs { fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[v]) - sql += ` b.%s_sync_status = ?,` + sql += ` b.%s_sync_status = b.%s_sync_status | ?,` fmtParams = append(fmtParams, fieldPrefix) sqlParams = append(sqlParams, model.SyncFlagModifiedMask) } @@ -961,13 +960,24 @@ func UpdateSkuSyncStatusForExPrefix(db *DaoDB, vendorIDs []int) (num int64, err sql = fmt.Sprintf(sql, fmtParams...) sql += ` WHERE b.deleted_at = ? AND c.ex_prefix != "" - AND (DATE_FORMAT(c.ex_prefix_begin,'%Y-%m-%d') = DATE_FORMAT(DATE_ADD(NOW(),INTERVAL '6' HOUR),'%Y-%m-%d') - OR DATE_FORMAT(c.ex_prefix_end,'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d')) + AND (c.ex_prefix_begin = DATE_FORMAT(DATE_ADD(NOW(),INTERVAL '6' HOUR),'%Y-%m-%d 00:00:00') + OR c.ex_prefix_end = DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00')) ` sqlParams = append(sqlParams, utils.DefaultTimeValue) return ExecuteSQL(db, sql, sqlParams...) } +func DeleteSkuNameExPrefixOverdue(db *DaoDB) (num int64, err error) { + sql := ` + UPDATE sku_name + SET ex_prefix_begin = null,ex_prefix_end = null + WHERE deleted_at = ? + AND DATE_FORMAT(DATE_ADD(NOW(),INTERVAL '6' HOUR),'%Y-%m-%d 00:00:00') >= ex_prefix_end + ` + sqlParams := []interface{}{utils.DefaultTimeValue} + return ExecuteSQL(db, sql, sqlParams...) +} + func GetStoreSkusByNameIDs(db *DaoDB, storeIDs []int, nameID int) (skuList []*StoreSkuSyncInfo, err error) { sql := ` SELECT a.*,c.unit,c.name diff --git a/business/model/sku.go b/business/model/sku.go index 80bc10a82..dd99174e2 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -170,10 +170,10 @@ type SkuName struct { Prefix string `orm:"size(255)" json:"prefix"` Name string `orm:"size(255);index" json:"name"` - ExPrefix string `orm:"size(255)" json:"exPrefix"` + ExPrefix string `orm:"size(255);index" json:"exPrefix"` - ExPrefixBegin time.Time `orm:"type(datetime);null" json:"exPrefixBegin"` - ExPrefixEnd time.Time `orm:"type(datetime);null" json:"exPrefixEnd"` + ExPrefixBegin *time.Time `orm:"null" json:"exPrefixBegin"` + ExPrefixEnd *time.Time `orm:"null" json:"exPrefixEnd"` BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` // todo,此属性暂时没有使用,且有问题,应该是不同平台都有一个brandid CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别 @@ -209,6 +209,12 @@ func (*SkuName) TableUnique() [][]string { } } +func (*SkuName) TableIndex() [][]string { + return [][]string{ + []string{"ExPrefix", "ExPrefixBegin", "ExPrefixEnd"}, + } +} + type Sku struct { ModelIDCULD @@ -234,8 +240,8 @@ type SkuAndName struct { Prefix string IsSpu int ExPrefix string - ExPrefixBegin time.Time - ExPrefixEnd time.Time + ExPrefixBegin *time.Time + ExPrefixEnd *time.Time } func (*Sku) TableUnique() [][]string { diff --git a/business/userstore/food_recipe.go b/business/userstore/food_recipe.go index c6f1fd335..018cc06e6 100644 --- a/business/userstore/food_recipe.go +++ b/business/userstore/food_recipe.go @@ -246,7 +246,7 @@ func GetRecipeDetail(ctx *jxcontext.Context, recipeID int) (recipeDetail *FoodRe } choiceMap := make(map[int8][]*dao.FoodRecipeItemChoiceExt) for _, v := range itemChoiceList { - v.SkuName = jxutils.ComposeSkuName(v.Prefix, v.SkuNameName, v.Comment, v.Unit, v.SpecQuality, v.SpecUnit, 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue) + v.SkuName = jxutils.ComposeSkuName(v.Prefix, v.SkuNameName, v.Comment, v.Unit, v.SpecQuality, v.SpecUnit, 0, "", nil, nil) choiceMap[v.Index] = append(choiceMap[v.Index], v) } diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index c345591aa..b2d5990fe 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -399,8 +399,8 @@ func (c *SkuController) GetJdUpcCodeByName() { // @Param token header string true "认证token" // @Param nameIDs formData string true "商品nameIDs" // @Param exPrefix formData string true "商品额外前缀" -// @Param fromTime formData string true "生效开始时间,格式 2006-01-01 00:00:00" -// @Param toTime formData string true "生效结束时间,格式 2006-01-01 00:00:00" +// @Param fromDate formData string true "生效开始时间,格式 2006-01-01 " +// @Param toDate formData string true "生效结束时间,格式 2006-01-01 " // @Param isAsync formData bool false "是否异步" // @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" // @Success 200 {object} controllers.CallResult diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 71fe04087..f99bdacd7 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -537,3 +537,23 @@ func (c *StoreSkuController) GetStoreCategories() { return retVal, "", err }) } + +// @Title 获取各平台所有门店某商品的价格 +// @Description 获取各平台所有门店某商品的价格 +// @Param token header string false "认证token" +// @Param skuID formData int true "商品ID" +// @Param vendorIDs formData string true "厂商ID列表" +// @Param isAsync formData bool true "是否异步,缺省是同步" +// @Param isContinueWhenError formData bool true "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetVendorStoreSkuPrice [post] +func (c *StoreSkuController) GetVendorStoreSkuPrice() { + var vendorIDList []int + c.callGetVendorStoreSkuPrice(func(params *tStoreSkuGetVendorStoreSkuPriceParams) (retVal interface{}, errCode string, err error) { + if jxutils.Strings2Objs(params.VendorIDs, &vendorIDList); err == nil { + retVal, err = cms.GetVendorStoreSkuPrice(params.Ctx, vendorIDList, params.SkuID, params.IsAsync, params.IsContinueWhenError) + } + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 23c9bd731..3561948ae 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1665,6 +1665,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], + beego.ControllerComments{ + Method: "GetVendorStoreSkuPrice", + Router: `/GetVendorStoreSkuPrice`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], beego.ControllerComments{ Method: "GetVendorStoreSkusInfo",