获取某个商品平台价,商品名前缀
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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合并操作
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:"-"`
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user