diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 3bf0b2b45..aa30caa06 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -1062,11 +1062,12 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { goodsOrder := batchItemList[0].(*model.GoodsOrder) if handler := partner.GetPurchaseOrderHandlerFromVendorID(goodsOrder.VendorID); handler != nil { - status, err2 := handler.GetOrderStatus(goodsOrder.VendorOrgCode, goodsOrder.VendorOrderID) + order, err2 := handler.GetOrder(goodsOrder.VendorOrgCode, goodsOrder.VendorOrderID) if err = err2; err == nil { - if model.IsOrderFinalStatus(status) { - goodsOrder.Status = status - _, err = dao.UpdateEntity(db, goodsOrder, "Status") + if model.IsOrderFinalStatus(order.Status) { + goodsOrder.Status = order.Status + goodsOrder.OrderFinishedAt = order.OrderFinishedAt + _, err = dao.UpdateEntity(db, goodsOrder, "Status", "OrderFinishedAt") } } } diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 8aa2438ee..b4b704894 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -3027,7 +3027,7 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuBindInfos []*StoreSkuBindInf return retVal, err } if len(skuList) == 0 { - return retVal, fmt.Errorf("未查询到此商品!商品id :[%V]", skuID) + return retVal, fmt.Errorf("未查询到此商品!商品id :[%d]", skuID) } focusList, _ := dao.GetStoreSkuBindByNameID(db, storeID, skuList[0].NameID, model.StoreSkuBindStatusNormal) //有关注过 @@ -3086,15 +3086,15 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuBindInfos []*StoreSkuBindInf func AutoFocusStoreSkusForTopSkus(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { db := dao.GetDB() var ( - result1 []interface{} - cityCodes = []int{ - 530100, //昆明 - 430300, //湘潭市 - 510700, //绵阳市 - 520100, //贵阳市 - } + result1 []interface{} + // cityCodes = []int{ + // 530100, //昆明 + // 430300, //湘潭市 + // 510700, //绵阳市 + // 520100, //贵阳市 + // } ) - storeList, err := dao.GetStoreList(db, nil, cityCodes, nil, nil, "") + storeList, err := dao.GetStoreList(db, nil, nil, nil, nil, "") taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { switch step { case 0: diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 6a98c8088..39a8e4fbb 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -102,10 +102,10 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo } if err == nil { updateFields = append(updateFields, idFieldName) - if vendorID == model.VendorIDMTWM { - storeCatMap.LastOperator = utils.Time2Str(time.Now()) - updateFields = append(updateFields, model.FieldLastOperator) - } + // if vendorID == model.VendorIDMTWM { + // storeCatMap.LastOperator = utils.Time2Str(time.Now()) + // updateFields = append(updateFields, model.FieldLastOperator) + // } } } else if model.IsSyncStatusUpdate(catInfo.CatSyncStatus) { // 修改 err = handler.UpdateStoreCategory(ctx, storeID, vendorStoreID, catInfo) @@ -735,10 +735,10 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v if syncStatus != 0 { skuBind := &model.StoreSkuBind{} skuBind.ID = v.BindID - skuBind.LastOperator = ctx.GetUserName() - skuBind.UpdatedAt = time.Now() + // skuBind.LastOperator = ctx.GetUserName() + // skuBind.UpdatedAt = time.Now() dao.SetStoreSkuBindSyncStatus(skuBind, vendorID, syncStatus|v.SkuSyncStatus) - dao.UpdateEntity(db, skuBind, dao.GetSyncStatusStructField(model.VendorNames[vendorID]), model.FieldLastOperator, model.FieldUpdatedAt) + dao.UpdateEntity(db, skuBind, dao.GetSyncStatusStructField(model.VendorNames[vendorID]) /*, model.FieldLastOperator, model.FieldUpdatedAt*/) } } } @@ -787,10 +787,10 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v if syncStatus != 0 { catBind := &model.StoreSkuCategoryMap{} catBind.ID = v.MapID - catBind.LastOperator = ctx.GetUserName() - catBind.UpdatedAt = time.Now() + // catBind.LastOperator = ctx.GetUserName() + // catBind.UpdatedAt = time.Now() dao.SetStoreCatMapSyncStatus(catBind, vendorID, syncStatus|v.CatSyncStatus) - dao.UpdateEntity(db, catBind, dao.GetSyncStatusStructField(model.VendorNames[vendorID]), model.FieldLastOperator, model.FieldUpdatedAt) + dao.UpdateEntity(db, catBind, dao.GetSyncStatusStructField(model.VendorNames[vendorID]) /*, model.FieldLastOperator, model.FieldUpdatedAt*/) } } } diff --git a/business/jxstore/cms/sync_store_sku_fakejd.go b/business/jxstore/cms/sync_store_sku_fakejd.go new file mode 100644 index 000000000..6114bf67c --- /dev/null +++ b/business/jxstore/cms/sync_store_sku_fakejd.go @@ -0,0 +1,329 @@ +package cms + +import ( + "fmt" + "io" + "time" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "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" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/business/partner/putils" + "git.rosy.net.cn/jx-callback/globals/api/apimanager" + "github.com/360EntSecGroup-Skylar/excelize" +) + +func storeOrSkuMap2List(intStrMap map[int]string) (ids []int) { + for k, v := range intStrMap { + if v != "" { + ids = append(ids, k) + } + } + return ids +} + +func getStoreSkus(db *dao.DaoDB, storeID int, skuIDs []int) (skus []*dao.StoreSkuSyncInfo, err error) { + sql := ` + SELECT + t1.id bind_id, t1.sku_id, t1.price, t1.unit_price, t1.status store_sku_status, + t1.jd_sync_status sku_sync_status, t1.jd_price vendor_price, t1.jd_lock_time lock_time, + t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, + t2.*, + t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end + FROM store_sku_bind t1 + LEFT JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ?/* AND t2.status = ?*/ + LEFT JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ?/* AND t3.status = ?*/ + WHERE 1 = 1 + AND t1.store_id = ? + AND t1.deleted_at = ? + AND t1.sku_id IN ( ` + dao.GenQuestionMarks(len(skuIDs)) + `) + ORDER BY t1.price` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + utils.DefaultTimeValue, + storeID, + utils.DefaultTimeValue, + skuIDs, + } + if err = dao.GetRows(db, &skus, sql, sqlParams...); err != nil { + return nil, err + } + return skus, err +} + +func SyncStoreSku4FakeJD(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, inSkuMap map[int]string, isContinueWhenError bool) (err error) { + vendorID := model.VendorIDJD + db := dao.GetDB() + storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID) + if err != nil { + return err + } + storeDetail.VendorOrgCode = apimanager.FakeJdOrgCode + skuIDs := storeOrSkuMap2List(inSkuMap) + skus, err := getStoreSkus(db, storeID, skuIDs) + if err != nil || len(skus) == 0 { + return err + } + formalizeStoreSkuList(skus) + storeSkuHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler) + + var ( + stockList, onlineList, offlineList, priceList []*partner.StoreSkuInfo + ) + skuMap := make(map[*partner.StoreSkuInfo]*dao.StoreSkuSyncInfo) + now := jxutils.OperationTime2HourMinuteFormat(time.Now()) + var failedList []*partner.StoreSkuInfoWithErr + for _, sku := range skus { + sku.SkuSyncStatus = model.SyncFlagSaleMask | model.SyncFlagPriceMask | model.SyncFlagStockMask + sku.VendorSkuID = inSkuMap[sku.SkuID] + sku.SkuID = int(utils.Str2Int64(sku.VendorSkuID)) // skuID与vendorID一样 + sku.VendorOrgCode = apimanager.FakeJdOrgCode + + sku.VendorPrice = 0 + sku.MergedStatus = MergeSkuSaleStatusWithStoreOpTime(sku, storeDetail, now) + var bareSku *partner.StoreSkuInfo + if isStoreSkuSyncNeedDelete(sku) { + if !dao.IsVendorThingIDEmpty(sku.VendorSkuID) { + bareSku = storeSkuSyncInfo2Bare(sku) + stockList = append(stockList, bareSku) + } else { + // updateItems = append(updateItems, sku2Update(vendorID, sku, model.SyncFlagDeletedMask)) + } + } else if model.IsSyncStatusNew(sku.SkuSyncStatus) { + calVendorPrice4StoreSku(sku, storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage)) + if dao.IsVendorThingIDEmpty(sku.VendorSkuID) { + // todo 多平台商品库没有正常创建,直接跳过 + } else { + sku.SkuSyncStatus |= model.SyncFlagSaleMask | model.SyncFlagPriceMask + bareSku = storeSkuSyncInfo2Bare(sku) + stockList = append(stockList, bareSku) + priceList = append(priceList, bareSku) + if sku.MergedStatus == model.SkuStatusNormal { + onlineList = append(onlineList, bareSku) + } else { + offlineList = append(offlineList, bareSku) + } + } + } else { + if dao.IsVendorThingIDEmpty(sku.VendorSkuID) { + // err = fmt.Errorf("门店:%d,修改没有创建的商品:%d", storeID, sku.SkuID) + err = utils.NewErrorCode(fmt.Sprintf("门店:%d,修改没有创建的商品:%d", storeID, sku.SkuID), "-1", 0) + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeID, vendorID, "异常同步错误") + if parentTask == nil { + return err + } + parentTask.AddBatchErr(err) + parentTask.AddFailedList(failedList) + } else { + isAdded2Update := false + if model.IsSyncStatusPrice(sku.SkuSyncStatus) { + bareSku = storeSkuSyncInfo2Bare(calVendorPrice4StoreSku(sku, storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage))) + priceList = append(priceList, bareSku) + } + if !isAdded2Update { + if model.IsSyncStatusSale(sku.SkuSyncStatus) { + if bareSku == nil { + bareSku = storeSkuSyncInfo2Bare(sku) + } + if sku.MergedStatus == model.SkuStatusNormal { + onlineList = append(onlineList, bareSku) + stockList = append(stockList, bareSku) + } else { + offlineList = append(offlineList, bareSku) + // 因为京东平台以是否有库存表示是否关注,所以不论是否可售,都要设置库存 + stockList = append(stockList, bareSku) + } + } + } + } + } + if bareSku != nil { + skuMap[bareSku] = sku + } + } + bareSku2Sync := func(bareSkuList []*partner.StoreSkuInfo) (skuList []*dao.StoreSkuSyncInfo) { + if len(bareSkuList) > 0 { + skuList = make([]*dao.StoreSkuSyncInfo, len(bareSkuList)) + for k, v := range bareSkuList { + skuList[k] = skuMap[v] + } + } + return skuList + } + isContinueWhenError2 := true + realStoreID := int(utils.Str2Int64(vendorStoreID)) + task := tasksch.NewParallelTask("SyncStoreSku4FakeJD", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + step := batchItemList[0].(int) + // globals.SugarLogger.Debugf("step:%d", step) + switch step { + case 0: + 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 failedList []*partner.StoreSkuInfoWithErr + failedList, err = storeSkuHandler.UpdateStoreSkusStock(ctx, storeDetail.VendorOrgCode, realStoreID, 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) + } + return nil, len(successList), err + }, ctx, task, list, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusStock), isContinueWhenError2) + } + } + case 1, 2: + statusList := onlineList + status := model.SkuStatusNormal + name := "可售门店商品" + if step == 2 { + statusList = offlineList + status = model.SkuStatusDontSale + name = "不可售门店商品" + } + if len(statusList) > 0 { + _, err = putils.FreeBatchStoreSkuInfo(name, func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { + var failedList []*partner.StoreSkuInfoWithErr + failedList, err = storeSkuHandler.UpdateStoreSkusStatus(ctx, storeDetail.VendorOrgCode, realStoreID, 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) + } + return nil, len(successList), err + }, ctx, task, statusList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusStatus), isContinueWhenError2) + } + case 3: + if len(priceList) > 0 { + _, err = putils.FreeBatchStoreSkuInfo("更新门店商品价格", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { + var failedList []*partner.StoreSkuInfoWithErr + failedList, err = storeSkuHandler.UpdateStoreSkusPrice(ctx, storeDetail.VendorOrgCode, realStoreID, 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) + } + return nil, len(successList), err + }, ctx, task, priceList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusPrice), isContinueWhenError2) + } + } + return retVal, err + }, []int{0, 1, 2, 3}) + tasksch.HandleTask(task, parentTask, true).Run() + _, err = task.GetResult(0) + return err +} + +func SyncFakeJdStoreSku(ctx *jxcontext.Context, parentTask tasksch.ITask, storeMap, skuMap map[int]string, isAsync, isContinueWhenError bool) (hint string, err error) { + storeIDs := storeOrSkuMap2List(storeMap) + task := tasksch.NewParallelTask("同步假京东", nil, ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeID := batchItemList[0].(int) + err = SyncStoreSku4FakeJD(ctx, task, storeID, storeMap[storeID], skuMap, isContinueWhenError) + return retVal, err + }, storeIDs) + tasksch.HandleTask(task, parentTask, true).Run() + if isAsync { + hint = task.GetID() + } else { + _, err = task.GetResult(0) + hint = utils.Int2Str(len(storeIDs)) + } + return hint, err +} + +func excel2FakeJdThingMap(ctx *jxcontext.Context, reader io.Reader) (thingMapList []*model.FakeJdThingMap, err error) { + xlsx, err := excelize.OpenReader(reader) + if err != nil { + return nil, err + } + for sheetIndex := 0; sheetIndex < xlsx.SheetCount; sheetIndex++ { + rows, err2 := xlsx.GetRows(xlsx.GetSheetName(sheetIndex + 1)) + if err2 != nil { + return nil, err2 + } + for rowNum, row := range rows { + thingMap := &model.FakeJdThingMap{ + JxID: int(utils.Str2Int64WithDefault(row[0], 0)), + JdID: utils.Str2Int64WithDefault(row[0], 0), + } + if thingMap.JxID == 0 || thingMap.JdID == 0 { + if rowNum == 0 { + continue + } else { + break + } + } + if sheetIndex == 0 { + thingMap.ThingType = model.ThingTypeStore + } else { + thingMap.ThingType = model.ThingTypeSku + } + dao.WrapAddIDCULEntity(thingMap, ctx.GetUserName()) + thingMapList = append(thingMapList, thingMap) + } + } + return thingMapList, err +} + +func getFakeThingMap(ctx *jxcontext.Context, db *dao.DaoDB) (storeMap, skuMap map[int]string, err error) { + var thingMapList []*model.FakeJdThingMap + err = dao.GetRows(db, &thingMapList, "SELECT t1.* FROM fake_jd_thing_map t1") + if err == nil { + storeMap, skuMap = make(map[int]string), make(map[int]string) + for _, v := range thingMapList { + if v.ThingType == model.ThingTypeStore { + storeMap[v.JxID] = utils.Int64ToStr(v.JdID) + } else { + skuMap[v.JxID] = utils.Int64ToStr(v.JdID) + } + } + } + return storeMap, skuMap, err +} + +func UploadFakeJdThingMap(ctx *jxcontext.Context, reader io.Reader, isSyncNow, isAsync, isContinueWhenError bool) (hint string, err error) { + thingMapList, err := excel2FakeJdThingMap(ctx, reader) + if err != nil { + return "", err + } + + db := dao.GetDB() + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + _, err = dao.ExecuteSQL(db, "DELETE t1 FROM fake_jd_thing_map t1") + if err != nil { + dao.Rollback(db) + return "", err + } + err = dao.CreateMultiEntities(db, thingMapList) + if err != nil { + dao.Rollback(db) + return "", err + } + dao.Commit(db) + + if isSyncNow { + if storeMap, skuMap, err2 := getFakeThingMap(ctx, db); err2 == nil { + hint, err = SyncFakeJdStoreSku(ctx, nil, storeMap, skuMap, isAsync, isContinueWhenError) + } + } else { + hint = utils.Int2Str(len(thingMapList)) + } + return hint, err +} diff --git a/business/jxstore/cms/sync_store_sku_fakejd_test.go b/business/jxstore/cms/sync_store_sku_fakejd_test.go new file mode 100644 index 000000000..318f40cf2 --- /dev/null +++ b/business/jxstore/cms/sync_store_sku_fakejd_test.go @@ -0,0 +1,30 @@ +package cms + +import ( + "os" + "testing" + + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" +) + +func TestSyncStoreSku4FakeJD(t *testing.T) { + skuMap := map[int]string{ + 22509: "2029937911", + } + err := SyncStoreSku4FakeJD(jxcontext.AdminCtx, nil, 100118, "11943257", skuMap, true) + if err != nil { + t.Fatal(err) + } +} + +func TestUploadFakeJdThingMap(t *testing.T) { + file, err := os.Open("/Users/xujianhua/Downloads/thingmap.xlsx") + if err != nil { + t.Fatal(err) + } + hint, err := UploadFakeJdThingMap(jxcontext.AdminCtx, file, true, false, true) + if err != nil { + t.Fatal(err) + } + t.Log(hint) +} diff --git a/business/model/fake_jd.go b/business/model/fake_jd.go new file mode 100644 index 000000000..b57482f64 --- /dev/null +++ b/business/model/fake_jd.go @@ -0,0 +1,14 @@ +package model + +type FakeJdThingMap struct { + ModelIDCUL + JxID int `orm:"column(jx_id)" json:"jxID"` + ThingType int `json:"thingType"` + JdID int64 `orm:"column(jd_id);unique" json:"jdID"` +} + +func (*FakeJdThingMap) TableUnique() [][]string { + return [][]string{ + []string{"JxID", "ThingType"}, + } +} diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index 0156e6349..cea080b36 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -212,6 +212,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo OrderSeq: int(utils.ForceInterface2Int64(orderMap["order_index"])), StatusTime: getTimeFromInterface(orderMap["create_time"]), OrderCreatedAt: getTimeFromInterface(orderMap["create_time"]), + OrderFinishedAt: getTimeFromInterface(orderMap["finished_time"]), OriginalData: string(utils.MustMarshal(result)), ActualPayPrice: utils.ForceInterface2Int64(orderMap["user_fee"]), BaseFreightMoney: utils.ForceInterface2Int64(orderMap["send_fee"]), diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index 2f307f2ba..091056b92 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -184,6 +184,7 @@ func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo OrderSeq: int(utils.MustInterface2Int64(result["orderNum"])), StatusTime: utils.Str2Time(result[statusTimeField].(string)), OrderCreatedAt: utils.Str2Time(result[statusTimeField].(string)), + OrderFinishedAt: utils.Str2Time(result["orderStatusTime"].(string)), OriginalData: string(utils.MustMarshal(result)), ActualPayPrice: utils.MustInterface2Int64(result["orderBuyerPayableMoney"]), BaseFreightMoney: utils.Interface2Int64WithDefault(result["orderBaseFreightMoney"], 0), diff --git a/business/partner/purchase/jd/store_sku2.go b/business/partner/purchase/jd/store_sku2.go index 6f9908730..d338ddf55 100644 --- a/business/partner/purchase/jd/store_sku2.go +++ b/business/partner/purchase/jd/store_sku2.go @@ -10,6 +10,7 @@ import ( "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner/putils" "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api/apimanager" ) func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) { @@ -120,7 +121,13 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr }) } if globals.EnableJdStoreWrite { - responseList, err2 := getAPI(vendorOrgCode).BatchUpdateVendibility(ctx.GetTrackInfo(), "", vendorStoreID, skuVendibilityList, ctx.GetUserName()) + var responseList []*jdapi.StoreSkuBatchUpdateResponse + var err2 error + if vendorOrgCode != apimanager.FakeJdOrgCode { + responseList, err2 = getAPI(vendorOrgCode).BatchUpdateVendibility(ctx.GetTrackInfo(), "", vendorStoreID, skuVendibilityList, ctx.GetUserName()) + } else { + responseList, err2 = getAPI(vendorOrgCode).FakeBatchUpdateVendibility(ctx.GetTrackInfo(), "", vendorStoreID, skuVendibilityList, ctx.GetUserName()) + } if err = err2; isErrPartialFailed(err) { failedList = SelectStoreSkuListByResponseList(storeSkuList, responseList, storeID, model.VendorIDJD, "更新商品状态") // successList = putils.UnselectStoreSkuListBySkuIDs(storeSkuList, utils.StringSlice2Int(getStrOutSkuIDs(responseList, false))) @@ -130,7 +137,7 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr } func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { - if len(storeSkuList) == 1 { + if len(storeSkuList) == 1 && vendorOrgCode != apimanager.FakeJdOrgCode { if globals.EnableJdStoreWrite { _, err = getAPI(vendorOrgCode).UpdateStationPrice(ctx.GetTrackInfo(), utils.Str2Int64WithDefault(storeSkuList[0].VendorSkuID, 0), vendorStoreID, int(storeSkuList[0].VendorPrice)) failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorIDJD, "更新商品价格") @@ -144,7 +151,13 @@ func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrg }) } if globals.EnableJdStoreWrite { - responseList, err2 := getAPI(vendorOrgCode).UpdateVendorStationPrice(ctx.GetTrackInfo(), "", vendorStoreID, skuPriceInfoList) + var responseList []*jdapi.StoreSkuBatchUpdateResponse + var err2 error + if vendorOrgCode != apimanager.FakeJdOrgCode { + responseList, err2 = getAPI(vendorOrgCode).UpdateVendorStationPrice(ctx.GetTrackInfo(), "", vendorStoreID, skuPriceInfoList) + } else { + responseList, err2 = getAPI(vendorOrgCode).FakeUpdateVendorStationPrice(ctx.GetTrackInfo(), "", vendorStoreID, skuPriceInfoList) + } if err = err2; isErrPartialFailed(err) { failedList = SelectStoreSkuListByResponseList(storeSkuList, responseList, storeID, model.VendorIDJD, "更新商品价格") } @@ -154,7 +167,7 @@ func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrg } func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { - if len(storeSkuList) == 1 { + if len(storeSkuList) == 1 && vendorOrgCode != apimanager.FakeJdOrgCode { if globals.EnableJdStoreWrite { err = getAPI(vendorOrgCode).UpdateCurrentQty(ctx.GetTrackInfo(), vendorStoreID, utils.Str2Int64WithDefault(storeSkuList[0].VendorSkuID, 0), storeSkuList[0].Stock) failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorIDJD, "更新商品库存") @@ -168,7 +181,13 @@ func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrg }) } if globals.EnableJdStoreWrite { - responseList, err2 := getAPI(vendorOrgCode).BatchUpdateCurrentQtys(ctx.GetTrackInfo(), "", vendorStoreID, skuStockList, ctx.GetUserName()) + var responseList []*jdapi.StoreSkuBatchUpdateResponse + var err2 error + if vendorOrgCode != apimanager.FakeJdOrgCode { + responseList, err2 = getAPI(vendorOrgCode).BatchUpdateCurrentQtys(ctx.GetTrackInfo(), "", vendorStoreID, skuStockList, ctx.GetUserName()) + } else { + responseList, err2 = getAPI(vendorOrgCode).FakeBatchUpdateCurrentQtys(ctx.GetTrackInfo(), "", vendorStoreID, skuStockList, ctx.GetUserName()) + } if err = err2; isErrPartialFailed(err) { failedList = SelectStoreSkuListByResponseList(storeSkuList, responseList, storeID, model.VendorIDJD, "更新商品库存") // successList = putils.UnselectStoreSkuListBySkuIDs(storeSkuList, utils.StringSlice2Int(getStrOutSkuIDs(responseList, false))) diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 2be1bca8a..4359f2753 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -133,6 +133,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo OrderSeq: int(utils.MustInterface2Int64(result["day_seq"])), StatusTime: getTimeFromTimestamp(utils.MustInterface2Int64(result["ctime"])), OrderCreatedAt: getTimeFromTimestamp(utils.MustInterface2Int64(result["ctime"])), + OrderFinishedAt: getTimeFromTimestamp(utils.MustInterface2Int64(result["order_completed_time"])), OriginalData: string(utils.MustMarshal(result)), ActualPayPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(result["total"])), BaseFreightMoney: jxutils.StandardPrice2Int(utils.Interface2Float64WithDefault(result["shipping_fee"], 0)), diff --git a/conf/app.conf b/conf/app.conf index 280d9d507..634f31a02 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -61,6 +61,8 @@ wxBackstageHost = "http://wx.jxc4.com" jdStorePageCookie = "YYJV3NHVBPHLD36FWP6F3EM5PTXJ2XZQS7U4HWRIDPP4IWGUKUIB4XG5N26CZRDLDF7PKOXBPD6BNTUAJLETLZOIWMCVFI3K6MYZIY4QBIXIMXYDJNUKFGJVQTN5356SAD6WPCIHWNQAG7DDMF7L7S3SHD6O37OTAHUCKU6ALXATYTGMHNFLM4XRLVSFUQAJR77M4URSZRKVO55243TDVXLO25PP4UYSPTTPMNRUFXDNP4WPE566Q6V4AH32F7HT" jd2StorePageCookie = "CK5GE5MR2UIOBOZC7BBZLLSI7MVDWPEQ4BRJTJQ2OP3ZFKYDDYTFFV4XOXKLERC2UXFT44TMCUMRFP3C25HD6W3PYONTQCOML6YIZA5Z37P62UXFE655IRGYJ4ZLQIEBYQM32FABIN5RVJYZWPQWSRTZURNRLYV57XJEDWZT5UVZRYUBTN3AT6JJJJ22YHE6ZHCN6LCH27JHSRO55YA6TJH6G54IF72X3UAXCKW5P2G2MT3U6I3527NQFMAFLHXBZKQFFMYUKUHUU4GZWD4O7GO45Y" +fakeJdToken = "ndslkv9asl@djf_n7askdjfk$" +fakeJdBaseURL = "http://test.jxc4.com/qqqq" ebaiStorePageCookieWMUSS = "B0AAFQCAAAGbhkuMCsvcyYBDkkyAxBGIBlgXAQYVwc7VwYZFkx2HDoPSmo5eV1femopWgJRawhgAALG04cg1RUmhUakBbJRdgPS0tNEhnQhNRewwuWwYYBDEFPCQSDXV5YWA6PAVRHUJ9SnVGMThYAjNjLw9pRxIbS04-XFo05AQgBl%7ERLA33vWcR73gEAKZ" ebaiStorePageCookieWMSTOKEN = "gAALgNAAAGfBI5YEBHSQdZY1InIS8CVQU9aBU1f3VLWVQqKHAAAc5LnRLZ1QLLx0S5IuzCSX8ZQ7oUwAAUr-GEm9JpRc9AQAAsLkLHHXzuhh2lZkbyrcAAAWBESKg3ZA" diff --git a/controllers/cms_sync.go b/controllers/cms_sync.go index 96fd368df..39781de8d 100644 --- a/controllers/cms_sync.go +++ b/controllers/cms_sync.go @@ -1,6 +1,9 @@ package controllers import ( + "fmt" + "io" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxstore/cms" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -309,3 +312,43 @@ func (c *SyncController) FullSyncVendorStuff() { return retVal, "", err }) } + +// @Title 上传假京东门店与SKU映射表(并启动同步) +// @Description 上传假京东门店与SKU映射表(并启动同步) +// @Param token header string false "认证token" +// @Param isSyncNow formData bool false "是否马上同步,一般不建议" +// @Param isAsync formData bool false "是否异步,缺省是同步" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /UploadFakeJdThingMap [post,get] +func (c *SyncController) UploadFakeJdThingMap() { + if c.Ctx.Input.IsGet() { + w := c.Ctx.ResponseWriter + // 上传页面 + w.Header().Add("Content-Type", "text/html") + w.WriteHeader(200) + html := ` +
+ ` + io.WriteString(w, html) + } else if c.Ctx.Input.IsPost() { + c.callUploadFakeJdThingMap(func(params *tSyncUploadFakeJdThingMapParams) (retVal interface{}, errCode string, err error) { + r := c.Ctx.Request + files := r.MultipartForm.File["userfiles"] + if len(files) == 0 { + err = fmt.Errorf("没上传文件") + } else { + fileReader, err2 := files[0].Open() + if err = err2; err == nil { + retVal, err = cms.UploadFakeJdThingMap(params.Ctx, fileReader, params.IsSyncNow, params.IsAsync, params.IsContinueWhenError) + fileReader.Close() + } + } + return retVal, "", err + }) + } +} diff --git a/globals/api/api.go b/globals/api/api.go index fedcb38d7..e797f0471 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -36,7 +36,8 @@ var ( JdAPI *jdapi.API JdPageAPI *jdapi.API - Jd2API *jdapi.API + Jd2API *jdapi.API + FakeJdAPI *jdapi.API ElmAPI *elmapi.API EbaiAPI *ebaiapi.API @@ -90,6 +91,11 @@ func Init() { Jd2API = jdapi.New(beego.AppConfig.String("jd2Token"), beego.AppConfig.String("jd2AppKey"), beego.AppConfig.String("jd2Secret")) Jd2API.SetJdCookie(beego.AppConfig.DefaultString("jd2StorePageCookie", "")) } + + fakeJdToken := beego.AppConfig.DefaultString("fakeJdToken", "") + if fakeJdToken != "" { + FakeJdAPI = jdapi.NewFakeJD(fakeJdToken, beego.AppConfig.String("fakeJdBaseURL")) + } } else { JdAPI = nil } diff --git a/globals/api/apimanager/apimanager.go b/globals/api/apimanager/apimanager.go index 9f6c11e87..86ccd7f2b 100644 --- a/globals/api/apimanager/apimanager.go +++ b/globals/api/apimanager/apimanager.go @@ -9,6 +9,10 @@ import ( "git.rosy.net.cn/jx-callback/globals/api" ) +const ( + FakeJdOrgCode = "fakejd" +) + type VendorOrgCodePair struct { VendorID int AppOrgCode string @@ -31,7 +35,9 @@ func (a *APIManager) GetAPI(vendorID int, appOrgCode string) (pfAPI interface{}) switch vendorID { case model.VendorIDJD: pfAPI = api.JdAPI - if appOrgCode != "" && appOrgCode == globals.Jd2OrgCode { + if appOrgCode == FakeJdOrgCode { + pfAPI = api.FakeJdAPI + } else if appOrgCode != "" && appOrgCode == globals.Jd2OrgCode { pfAPI = api.Jd2API } case model.VendorIDMTWM: diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 4ba03b9c0..df1146097 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -72,6 +72,9 @@ func Init() { orm.RegisterModel(&model.UserDeliveryAddress{}) orm.RegisterModel(&model.UserCartItem{}) orm.RegisterModel(&model.OrderPay{}, &model.OrderPayRefund{}) + + orm.RegisterModel(&model.FakeJdThingMap{}) + // create table orm.RunSyncdb("default", false, true) } diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index dd3386fdb..d057e28be 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -2016,6 +2016,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], + beego.ControllerComments{ + Method: "UploadFakeJdThingMap", + Router: `/UploadFakeJdThingMap`, + AllowHTTPMethods: []string{"post","get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"], beego.ControllerComments{ Method: "GetEbaiRTFDetail",